xdvik-ja-22.84.16-j1.40/0000775000175000017500000000000011742727727014103 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/texk/0000775000175000017500000000000011730167606015045 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/texk/xdvik/0000775000175000017500000000000011742735216016173 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/texk/xdvik/version.h0000664000175000017500000000063711204324552020025 0ustar uwabamiuwabami/* Version info that is displayed at -h, -v and in GUI elements */ #ifndef VERSION_H_ #define VERSION_H_ #define XDVI_VERSION "22.84.16" #ifdef MOTIF #define XDVI_GUI "(Motif toolkit)" #else #define XDVI_GUI "(Xaw toolkit)" #endif #define XDVIK_PROGNAME "xdvik" #define XDVI_PROGNAME "xdvi" #define XDVI_VERSION_INFO XDVI_VERSION" "XDVI_GUI #define XDVI_TERSE_VERSION_INFO XDVI_VERSION #endif /* VERSION_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/exit-handlers.c0000664000175000017500000000436611032450154021102 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* Exit handlers: Procedures taking a void * that can be registered via register_exit_handler() and will be called fromx xdvi_exit(). */ #include "xdvi-config.h" #include "xdvi.h" #include "exit-handlers.h" #include "util.h" static struct exit_list { exit_procedure proc; void *arg; } *exit_procs = NULL; static size_t exit_procs_size = 0; void register_exit_handler(exit_procedure proc, void *arg) { size_t idx = exit_procs_size; exit_procs_size++; exit_procs = xrealloc(exit_procs, sizeof *exit_procs * exit_procs_size); exit_procs[idx].proc = proc; exit_procs[idx].arg = arg; } void unregister_exit_handler(exit_procedure proc) { size_t i; for (i = 0; i < exit_procs_size; i++) { if (exit_procs[i].proc == proc) { fprintf(stderr, "unregistering %p!\n", (void *)proc); exit_procs[i].proc = NULL; exit_procs[i].arg = NULL; } } } void call_exit_handlers(void) { size_t i; for (i = 0; i < exit_procs_size; i++) { if (exit_procs[i].proc) exit_procs[i].proc(exit_procs[i].arg); /* fprintf(stderr, "calling exit proc %lu\n", (unsigned long)i); */ } free(exit_procs); } xdvik-ja-22.84.16-j1.40/texk/xdvik/dvisel.h0000664000175000017500000000315611032450154017622 0ustar uwabamiuwabami/* * select pages from a DVI file. * * The original version is: * Copyright (c) 1999 * WATANABE Takeshi watanabe@komadori.planet.sci.kobe-u.ac.jp * * Heavily changed for xdvik: * Copyright (c) 2002-2004 the xdvik development team * * 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 ANY AUTHO OF THIS SOFTWARE 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. */ #ifndef DVISEL_H_ #define DVISEL_H_ #include "dvi-init.h" #include "print-internal.h" /* callbacks */ Boolean check_pagerange(struct save_or_print_info *info, int pageno); Boolean check_marked(struct save_or_print_info *info, int pageno); void select_pages(struct save_or_print_info *info); #endif /* DVISEL_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/squeeze/0000775000175000017500000000000011742735216017654 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/texk/xdvik/squeeze/configure0000775000175000017500000041571611742727320021576 0ustar uwabamiuwabami#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for xdvik squeeze 22.84.15. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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. as_myself= 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" 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. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $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 tex-k@tug.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: 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 STATUS 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=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&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'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/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='xdvik squeeze' PACKAGE_TARNAME='xdvik-squeeze' PACKAGE_VERSION='22.84.15' PACKAGE_STRING='xdvik squeeze 22.84.15' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' ac_unique_file="squeeze.c" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS WARNING_CFLAGS am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE 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_maintainer_mode enable_dependency_tracking enable_compiler_warnings ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS' # 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= ;; *) 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 xdvik squeeze 22.84.15 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/xdvik-squeeze] --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 xdvik squeeze 22.84.15:";; 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] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-compiler-warnings=[no|min|yes|max|all] Turn on compiler warnings [default: yes if maintainer-mode, min otherwise] Some influential environment variables: CC C compiler command CFLAGS 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 (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory 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 xdvik squeeze configure 22.84.15 generated by GNU Autoconf 2.68 Copyright (C) 2010 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_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; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile 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 xdvik squeeze $as_me 22.84.15, which was generated by GNU Autoconf 2.68. 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 $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" 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 $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" 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 $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" 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 $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" 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 # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac 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 /dev/null != "$ac_site_file" && 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" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } 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. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && 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 # 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 ac_aux_dir= for ac_dir in ../../../build-aux "$srcdir"/../../../build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../../build-aux \"$srcdir\"/../../../build-aux" "$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. am__api_version='1.11' # 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 ${ac_cv_path_install+:} false; 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 ${ac_cv_prog_STRIP+:} false; 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 ${ac_cv_prog_ac_ct_STRIP+:} false; 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 ${ac_cv_path_mkdir+:} false; 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 test -d ./--version && rmdir ./--version 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. 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 ${ac_cv_prog_AWK+:} false; 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 eval \${ac_cv_prog_make_${ac_make}_set+:} false; 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='xdvik-squeeze' VERSION='22.84.15' 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. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE 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 ${ac_cv_prog_CC+:} false; 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 ${ac_cv_prog_ac_ct_CC+:} false; 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 ${ac_cv_prog_CC+:} false; 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 ${ac_cv_prog_CC+:} false; 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 ${ac_cv_prog_CC+:} false; 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 ${ac_cv_prog_ac_ct_CC+:} false; 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 fi rm -f conftest.er1 conftest.err $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. */ int main () { ; 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" # 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 whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&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 if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $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 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $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; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $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 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 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="$ac_clean_files conftest.out" # 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; } if test "$cross_compiling" != yes; then { { 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; } if { ac_try='./conftest$ac_cv_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 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: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; 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 ${ac_cv_c_compiler_gnu+:} false; 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 ${ac_cv_prog_cc_g+:} false; 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 ${ac_cv_prog_cc_c89+:} false; 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 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='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi 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 ${am_cv_CC_dependencies_compiler_type+:} false; 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'. rm -rf conftest.dir 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 ;; msvc7 | msvc7msys | 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 # Check whether --enable-compiler-warnings was given. if test "${enable_compiler_warnings+set}" = set; then : enableval=$enable_compiler_warnings; fi case $enable_compiler_warnings in #( no | min | yes | max | all) : ;; #( *) : if test "x$enable_maintainer_mode" = xyes; then : enable_compiler_warnings=yes else enable_compiler_warnings=min fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking what warning flags to pass to the C compiler" >&5 $as_echo_n "checking what warning flags to pass to the C compiler... " >&6; } if ${kpse_cv_warning_cflags+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$GCC" = xyes; then kpse_cv_warning_cflags= if test "x$enable_compiler_warnings" != xno; then kpse_cv_warning_cflags="-Wimplicit -Wreturn-type" case `$CC -dumpversion` in #( 3.4.* | 4.*) : kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wdeclaration-after-statement" ;; #( *) : ;; esac case `$CC -dumpversion` in #( 3.[234].* | 4.*) : kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wno-unknown-pragmas" ;; #( *) : ;; esac if test "x$enable_compiler_warnings" != xmin; then kpse_cv_warning_cflags="-Wall -Wunused $kpse_cv_warning_cflags" kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wmissing-prototypes -Wmissing-declarations" if test "x$enable_compiler_warnings" != xyes; then kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith" kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wcast-qual -Wcast-align -Wwrite-strings" case `$CC -dumpversion` in #( 3.4.* | 4.*) : kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wold-style-definition" ;; #( *) : ;; esac if test "x$enable_compiler_warnings" != xmax; then kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wshadow" fi fi fi fi elif test "x$enable_compiler_warnings" = xno; then kpse_cv_warning_cflags= else kpse_cv_warning_cflags= # FIXME: warning flags for non-GNU C compilers fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_warning_cflags" >&5 $as_echo "$kpse_cv_warning_cflags" >&6; } WARNING_CFLAGS=$kpse_cv_warning_cflags ac_config_files="$ac_config_files 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 if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} 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}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= 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 "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 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__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. as_myself= 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 STATUS 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=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&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 xdvik squeeze $as_me 22.84.15, which was generated by GNU Autoconf 2.68. 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 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" 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 --config print configuration, 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 Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ xdvik squeeze config.status 22.84.15 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 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=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= 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 ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; 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"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --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" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES 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_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= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # 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 {' >"$ac_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 >>"\$ac_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 >>"\$ac_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 < "$ac_tmp/subs1.awk" > "$ac_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 sole $(srcdir), # ${srcdir} and @srcdir@ entries 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[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :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="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "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 >"$ac_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 "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :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 1 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 xdvik-ja-22.84.16-j1.40/texk/xdvik/squeeze/configure.ac0000664000175000017500000000117411276240141022133 0ustar uwabamiuwabamidnl Process this file with autoconf to produce a configure script. dnl dnl Copyright (C) 2009 Peter Breitenlohner dnl dnl This file is free software; the copyright holder dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl AC_INIT([xdvik squeeze], [22.84.15], [tex-k@tug.org]) AC_PREREQ([2.63]) AC_CONFIG_SRCDIR([squeeze.c]) AC_CONFIG_AUX_DIR([../../../build-aux]) AC_CONFIG_MACRO_DIR([../../../m4]) AM_INIT_AUTOMAKE([foreign]) AM_MAINTAINER_MODE AC_PROG_CC KPSE_COMPILER_WARNINGS AC_CONFIG_FILES([Makefile]) AC_OUTPUT xdvik-ja-22.84.16-j1.40/texk/xdvik/squeeze/Makefile.am0000664000175000017500000000062011215462362021700 0ustar uwabamiuwabami## Makefile.am for the TeX Live subdirectory texk/xdvik/squeeze/ ## ## Copyright (C) 2009 Peter Breitenlohner ## You may freely use, modify and/or distribute this file. ## ACLOCAL_AMFLAGS = -I ../../../m4 AM_CFLAGS = $(WARNING_CFLAGS) noinst_PROGRAMS = squeeze nodist_noinst_DATA = stamp-squeeze stamp-squeeze: squeeze$(EXEEXT) echo timestamp >$@ CLEANFILES = stamp-squeeze xdvik-ja-22.84.16-j1.40/texk/xdvik/squeeze/squeeze.c0000664000175000017500000001140411176062556021502 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1994-2004 Paul Vojta 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. NOTE: This routine is adapted from the squeeze.c that comes with dvips; it bears the message: This software is Copyright 1988 by Radical Eye Software. Used with permission. \*========================================================================*/ /* * This routine squeezes a PostScript file down to its * minimum. We parse and then output it. * Adapted for xdvi 1/94. Writes a C program that contains the PS file * as a constant string. */ #include #include #include #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 #endif #ifndef EXIT_FAILURE #define EXIT_FAILURE 1 #endif #define LINELENGTH (72) #define BUFLENGTH (1000) #undef putchar #define putchar(a) (void)putc(a, out) ; FILE *in, *out; static int linepos = 0; static int lastspecial = 1; static int stringlen = 0; /* * This next routine writes out a `special' character. In this case, * we simply put it out, since any special character terminates the * preceding token. */ static void specialout(char c) { if (linepos + 1 > LINELENGTH) { (void)fputs("\\n\\\n", out); stringlen += linepos + 1; linepos = 0; } putchar(c); linepos++; lastspecial = 1; } static void strout(char *s) { if (linepos + strlen(s) > LINELENGTH) { (void)fputs("\\n\\\n", out); stringlen += linepos + 1; linepos = 0; } linepos += strlen(s); while (*s != 0) putchar(*s++); lastspecial = 1; } static void cmdout(char *s) { int l; l = strlen(s); if (linepos + l + 1 > LINELENGTH) { (void)fputs("\\n\\\n", out); stringlen += linepos + 1; linepos = 0; lastspecial = 1; } if (!lastspecial) { putchar(' '); linepos++; } while (*s != 0) { putchar(*s++); } linepos += l; lastspecial = 0; } char buf[BUFLENGTH]; #ifndef VMS int #endif main(int argc, char *argv[]) { int c; char *b; char seeking; extern void exit(); if (argc > 3 || (in = (argc < 2 ? stdin : fopen(argv[1], "r"))) == NULL || (out = (argc < 3 ? stdout : fopen(argv[2], "w"))) == NULL) { (void)fprintf(stderr, "Usage: squeeze [infile [outfile]]\n"); exit(EXIT_FAILURE); } (void)fputs("/*\n" " * DO NOT EDIT THIS FILE!\n" " * It was created by squeeze.c from another file (see the Makefile).\n" " */\n\n" "const char psheader[] = \"\\\n", out); while (1) { c = getc(in); if (c == EOF) break; if (c == '%') { while ((c = getc(in)) != '\n'); } if (c <= ' ') continue; switch (c) { case '{': case '}': case '[': case ']': specialout(c); break; case '<': case '(': if (c == '(') seeking = ')'; else seeking = '>'; b = buf; *b++ = c; do { c = getc(in); if (b > buf + BUFLENGTH - 2) { (void)fprintf(stderr, "Overran buffer seeking %c", seeking); exit(EXIT_FAILURE); } *b++ = c; if (c == '\\') *b++ = getc(in); } while (c != seeking); *b++ = 0; strout(buf); break; default: b = buf; while ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c == '/') || (c == '@') || (c == '!') || (c == '"') || (c == '&') || (c == '*') || (c == ':') || (c == ',') || (c == ';') || (c == '?') || (c == '^') || (c == '~') || (c == '-') || (c == '.') || (c == '#') || (c == '|') || (c == '_') || (c == '=') || (c == '$') || (c == '+')) { *b++ = c; c = getc(in); } if (b == buf) { (void)fprintf(stderr, "Oops! Missed a case: %c.\n", c); exit(EXIT_FAILURE); } *b++ = 0; (void)ungetc(c, in); cmdout(buf); } } (void)fprintf(out, "\\n\";\n\n int\tpsheaderlen\t= %d;\n", stringlen + linepos + 1); return 0; } xdvik-ja-22.84.16-j1.40/texk/xdvik/dvisel.c0000664000175000017500000005131311032450154017613 0ustar uwabamiuwabami/* * select pages from a DVI file. * * Copyright (c) 1999 * WATANABE Takeshi watanabe@komadori.planet.sci.kobe-u.ac.jp * Copyright (c) 2002-2004 the xdvik development team * * 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 ANY AUTHO OF THIS SOFTWARE BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include #include #include "dvi.h" #include "pagesel.h" #include "dvisel.h" #include "util.h" #include "dvi-init.h" #include "events.h" #include "dvi-draw.h" #include "message-window.h" #include "statusline.h" #include "print-dialog.h" /* stack for HTEX / Color stack */ typedef enum { IS_A_HREF, IS_A_COLOR } stackElemT; /* * Length of BOP command, without p[4] (previous BOP pointer): * bop c_0[4] ... c_9[4] */ static const int BOP_PART_LEN = 1 + 10 * 4; /* * Like above but with p[4]: */ static const int BOP_LEN = 1 + 10 * 4 + 4; /* * Lenght of postamble: * post p[4] num[4] den[4] mag[4] l[4] u[4] s[2] t[2] */ static const int POSTAMBLE_LEN = 1 + 4 * 6 + 2 + 2; /* * Postamble without p[4] (final bop offset) and t[2] (total page number): * num[4] den[4] mag[4] l[4] u[4] s[2] */ static const int POSTAMBLE_PART_LEN = 4 * 5 + 2; static char *dvips_papersize_special = NULL; /* * Struct to save specials that need to be copied verbatim into the output file * (things like `draftcopy'; see dvips manual, `Literal headers') */ struct literal_headers { size_t size; char **headers; }; static struct literal_headers literal_headers = { 0, NULL }; static struct specials_stack color_stack = { 0, NULL}; static struct specials_stack href_stack = { 0, NULL}; /* stacks saved from the previous page (i.e. active at the beginning of the page) */ static struct specials_stack color_save_stack = { 0, NULL }; static struct specials_stack href_save_stack = { 0, NULL }; static void push_stack(struct specials_stack *stack, const char *content) { stack->items = xrealloc(stack->items, (stack->stack_len + 1) * sizeof *(stack->items)); stack->items[stack->stack_len].content = xstrdup(content); stack->stack_len++; } static Boolean stack_contains_item(struct specials_stack *stack, const char *str) { size_t i; for (i = 0; i < stack->stack_len; i++) { if (strcmp(str, stack->items[i].content) == 0) { return True; } } return False; } static void pop_stack(struct specials_stack *stack) { ASSERT(stack->stack_len >= 1, "Attempt to pop empty stack"); free(stack->items[stack->stack_len - 1].content); stack->stack_len--; } static void empty_stack(struct specials_stack *stack) { while(stack->stack_len > 0) { pop_stack(stack); } } /* This is used instead of struct tn, and struct font* from dvi-init.h, since it appears that we don't need all the information from there. */ static struct fontinfo { long TeXnumber; unsigned char info[14]; char *fontname; struct fontinfo *next; Boolean used; } *fontinfo_head; #define PutFour(num, fp) { \ putc(((num) >> 24) & 0xff, (fp)); \ putc(((num) >> 16) & 0xff, (fp)); \ putc(((num) >> 8) & 0xff, (fp)); \ putc( (num) & 0xff, (fp)); \ } #define CopyNum(fin, fout, num) { \ int m = num; \ while (--m >= 0) putc(getc(fin), fout); \ } static void FontWrite(FILE *fout, struct fontinfo *fontp, long *fout_pos) { if (fontp->TeXnumber > 0xff) { if (fontp->TeXnumber > 0xffff) { if (fontp->TeXnumber > 0xffffff) { putc(FNTDEF4, fout); putc((fontp->TeXnumber >> 24) & 0xff, fout); (*fout_pos)++; } else { putc(FNTDEF3, fout); } putc((fontp->TeXnumber >> 16) & 0xff, fout); (*fout_pos)++; } else { putc(FNTDEF2, fout); } putc((fontp->TeXnumber >> 8) & 0xff, fout); (*fout_pos)++; } else { putc(FNTDEF1, fout); } putc(fontp->TeXnumber & 0xff, fout); (void)fwrite(fontp->info, sizeof(char), 14, fout); (void)fwrite(fontp->fontname, sizeof(char), fontp->info[12] + fontp->info[13], fout); (*fout_pos) += 2 + 14 + fontp->info[12] + fontp->info[13]; } /* Invoked by spcl_scan; saves file names referenced by special commands into the `warn_files' field of `info'. */ static Boolean scan_for_included_files(char *special, int str_len, void *my_info) { struct select_pages_info *info = (struct select_pages_info *)my_info; UNUSED(str_len); if (info->warn_files.items == NULL) /* no info needed, e.g. when printing */ return True; while (*special == ' ' || *special == '\t') ++special; if (memicmp(special, "psfile=", strlen("psfile=")) == 0) { char *b_ptr = special + strlen("psfile="); char *e_ptr; while (*b_ptr == '"') b_ptr++; if ((e_ptr = strchr(b_ptr, '"')) != NULL) { size_t len = e_ptr - b_ptr; char *tmp = xmalloc(len + 1); memcpy(tmp, b_ptr, len); tmp[len] = '\0'; if (!stack_contains_item(&(info->warn_files), tmp)) { push_stack(&(info->warn_files), tmp); } free(tmp); } } return True; /* dummy */ } /* Invoked by spcl_scan; saves hyperref and color commands into the global stacks `color_stack' and `hyperref_stack'. FIXME: In reality char *special is treated as const, but the declaration of spcl_scan doesn't allow for this. */ static Boolean stack_save(char *special, int str_len, void *data) { char *ptr; size_t len; UNUSED(data); UNUSED(str_len); while (isspace((int)*special)) ++special; ptr = special; if (memicmp(special, "color ", len = strlen("color ")) == 0) { special += len; while (*special == ' ' || *special == '\t') ++special; if (memicmp(special, "push ", 5) == 0) { push_stack(&color_stack, ptr); } else if (memicmp(special, "pop", 3) == 0) { pop_stack(&color_stack); } } else if (memicmp(special, "html:", len = strlen("html:")) == 0) { /* fprintf(stderr, "++++ special: %s; fd: %ld\n", special + 5, ftell(globals.dvi_file.bak_fp)); */ special += len; if (memicmp(special, "", 4) == 0) { pop_stack(&href_stack); } } else if (memicmp(special, "papersize", len = strlen("papersize")) == 0) { free(dvips_papersize_special); dvips_papersize_special = xstrdup(special); } else if (*special == '!' || memcmp(special, "header", strlen("header")) == 0) { size_t idx = literal_headers.size++; if (globals.debug & DBG_GUI) fprintf(stderr, "(literal) header %lu: |%s|\n", (unsigned long)idx, special); literal_headers.headers = xrealloc(literal_headers.headers, literal_headers.size * sizeof *(literal_headers.headers)); literal_headers.headers[idx] = xstrdup(special); } return True; /* dummy */ } /* write a special to the FILE *fp, updating offset as appropriate. */ static void write_special(const char *str, FILE *fp, long *offset) { unsigned int len = strlen(str); if (len < 256) { unsigned char c = len; putc(XXX1, fp); putc(c, fp); *offset += 2; } else { /* how about xxx2, xxx3? It seems that TeX doesn't use them either? */ putc(XXX4, fp); PutFour(len, fp); *offset += 5; } fputs(str, fp); *offset += len; } /* * Dump the headers in the global list `literal_headers', * and free up resources */ static void dump_literal_headers(FILE *fp, long *pos) { size_t i; for (i = 0; i < literal_headers.size; i++) { write_special(literal_headers.headers[i], fp, pos); free(literal_headers.headers[i]); } free(literal_headers.headers); literal_headers.headers = NULL; literal_headers.size = 0; } static void scan_page_for_specials(FILE *fp, int page, Boolean save_stack, Boolean (*special_proc)(char *str, int str_len, void *data), struct select_pages_info *info) { off_t pos_save; static ubyte my_scan_buffer[DVI_BUFFER_LEN]; struct drawinf currinf_save; ubyte maxchar_save; size_t i; TRACE_GUI((stderr, "parsing page: %d", page)); if (save_stack) { /* first, copy the current stacks (which reflect the state on the preceding page) to color_save_stack and href_save_stack: */ empty_stack(&color_save_stack); empty_stack(&href_save_stack); for (i = 0; i < color_stack.stack_len; i++) { TRACE_GUI((stderr, "saving stack: |%s|", color_stack.items[i].content)); push_stack(&color_save_stack, color_stack.items[i].content); } for (i = 0; i < href_stack.stack_len; i++) { TRACE_GUI((stderr, "saving stack: |%s|", href_stack.items[i].content)); push_stack(&href_save_stack, href_stack.items[i].content); } } /* (void)fseek(fp, pageinfo_get_offset(page), SEEK_SET); */ /* The datastructures in dvi-draw are rather weird in requiring us to provide a buffer, and point the global currinf.pos and end pointers to that buffer, for spcl_scan to be able to scan the file. First save the contents of the exising currinf, pointing to the main file: */ pos_save = save_file_status(fp, &currinf_save, &maxchar_save); lseek(fileno(fp), pageinfo_get_offset(page), SEEK_SET); memset((char *)&currinf.data, 0, sizeof currinf.data); currinf.tn_table_len = TNTABLELEN; currinf.tn_table = tn_table; currinf.tn_head = tn_head; /* then point currinf to our own buffer: */ G_dvi_buf_ptr = my_scan_buffer; currinf.pos = currinf.end = G_dvi_buf_ptr; lseek(fileno(fp), pageinfo_get_offset(page), SEEK_SET); /* finally we may invoke spcl_scan(). I hope we can do without the (!setjmp(some_env)) black magic since there shouldn't be any interruptions ... */ #if 1 spcl_scan(special_proc, info, False, fp); #else /* this is an attempt at using setjmp(), but it's just too ugly ... */ for (;;) { int page_bak; if (read_events(EV_NOWAIT) & EV_GE_NEWPAGE) break; page_bak = page; if (!setjmp(globals.ev.canit)) { fprintf(stderr, "current position: %lu; seeking to: %lu\n", (unsigned long)pos_save, (unsigned long)pageinfo_get_offset(page)); (void) fprintf(stderr, "seeking to offset %ld, page %d of file %d\n", pageinfo_get_offset(page), page, fileno(globals.dvi_file.bak_fp)); fseek(fp, pageinfo_get_offset(page), SEEK_SET); spcl_scan(special_proc, info, False); } else { /* if interrupted */ fprintf(stderr, "========= interrupted!\n"); if (page >= page_bak) page = page_bak; break; } if (page >= current_page) break; page++; } #endif /* now we restore those pesky globals, hoping that nobody has stamped upon them in the meantime. */ restore_file_status(fp, currinf_save, maxchar_save, pos_save); /* reposition file pointer */ (void)fseek(fp, pageinfo_get_offset(page), SEEK_SET); } /* dump the `open' commands on the current stack to the FILE *fp */ static void stack_dump_open_commands(FILE *fp, long *pos) { size_t i; TRACE_GUI((stderr, "length of stacks: %lu, %lu", (unsigned long)color_save_stack.stack_len, (unsigned long)href_save_stack.stack_len)); for (i = 0; i < color_save_stack.stack_len; i++) { TRACE_GUI((stderr, "dumping: |%s|", color_save_stack.items[i].content)); write_special(color_save_stack.items[i].content, fp, pos); } for (i = 0; i < href_save_stack.stack_len; i++) { TRACE_GUI((stderr, "dumping: |%s|", href_save_stack.items[i].content)); write_special(href_save_stack.items[i].content, fp, pos); } if (dvips_papersize_special != NULL) write_special(dvips_papersize_special, fp, pos); TRACE_GUI((stderr, "end of dumping open\n")); } /* dump `close' commands for all the `open' commands on the current stack (not the saved one, but the one active at the end of the page) to the FILE *fp (closing tags for hyperref anchors, `pop' commands for color specials). */ static void stack_dump_close_commands(FILE *fp, long *pos) { size_t i; for (i = color_stack.stack_len; i > 0; i--) { TRACE_GUI((stderr, "===== color pop")); write_special("color pop", fp, pos); } for (i = href_stack.stack_len; i > 0; i--) { TRACE_GUI((stderr, "===== html:")); write_special("html:", fp, pos); } } static void WriteDVI(FILE *fin, FILE *fout, long *fout_pos, int c) { int i, n; struct fontinfo *fontp; if (c >= FNTNUM0 && c <= FNT4) { if (c >= FNT1) n = get_bytes(fin, c - FNT1 + 1); else n = c - FNTNUM0; for (fontp = fontinfo_head; fontp; fontp = fontp->next) if (n == fontp->TeXnumber) break; if (fontp && fontp->used == False) { fontp->used = True; FontWrite(fout, fontp, fout_pos); } putc(c, fout); (*fout_pos)++; switch (c) { case FNT4: putc((n >> 24) & 0xff, fout); (*fout_pos)++; case FNT3: putc((n >> 16) & 0xff, fout); (*fout_pos)++; case FNT2: putc((n >> 8) & 0xff, fout); (*fout_pos)++; case FNT1: putc(n & 0xff, fout); (*fout_pos)++; default: break; } } else if (c >= FNTDEF1 && c <= FNTDEF4) { n = get_bytes(fin, c - FNTDEF1 + 1); for (fontp = fontinfo_head; fontp; fontp = fontp->next) if (n == fontp->TeXnumber) break; if (fontp && fontp->used == False) { fontp->used = True; FontWrite(fout, fontp, fout_pos); } (void) get_bytes(fin, 12); (void) get_bytes(fin, (int)(get_byte(fin) + get_byte(fin))); } else { putc(c, fout); (*fout_pos)++; n = 0; if (c <= XXX4) { for (i = 0; i < c - XXX1 + 1; i++) { int x = get_byte(fin); putc(x, fout); (*fout_pos)++; n = (n << 8) | x; } } switch (c) { case SETRULE: case PUTRULE: n += 4; /* fall through */ case RIGHT4: case W4: case X4: case DOWN4: case Y4: case Z4: n++; /* fall through */ case RIGHT3: case W3: case X3: case DOWN3: case Y3: case Z3: n++; /* fall through */ case SET2: case PUT2: if (!resource.omega) { dvi_fmt_error("%s:%d: WriteDVI: op-code %d only works with the \"-omega\" option", __FILE__, __LINE__, c); } case RIGHT2: case W2: case X2: case DOWN2: case Y2: case Z2: n++; /* fall through */ case SET1: case PUT1: case RIGHT1: case W1: case X1: case DOWN1: case Y1: case Z1: #ifdef PTEX case TDIR: #endif n++; /* fall through */ case XXX1: case XXX2: case XXX3: case XXX4: CopyNum(fin, fout, n); (*fout_pos) += n; /* fall through */ default: break; } } } /* public functions */ /* callback functions for selecting pages */ Boolean check_pagerange(struct save_or_print_info *info, int page) { return (page >= info->pinfo->from && page <= info->pinfo->to); } Boolean check_marked(struct save_or_print_info *info, int page) { UNUSED(info); return pageinfo_is_marked(page); } void select_pages(struct save_or_print_info *info) { struct select_pages_info *pinfo = info->pinfo; int c, n, page, pagecnt; long fout_pos = 0L; unsigned long curr_page_offset = 0xffffffff; /* pattern to be overwritten later */ unsigned long post_cmd_offset = 0xffffffff; /* pattern to be overwritten later */ struct fontinfo *fontp; FILE *in_fp = info->finfo->in_fp; FILE *out_fp = info->finfo->tmp_dvi_fp; Boolean headers_dumped = False; free(dvips_papersize_special); /* re-initialize */ dvips_papersize_special = NULL; ASSERT(in_fp != NULL, "input file mustn't be NULL in select_pages()!"); ASSERT(out_fp != NULL, "output file mustn't be NULL in select_pages()!"); pinfo->errflag = NO_ERROR; /* reset errflag, in case we're recovering from a previous error */ /* get font list from postamble; in_fp already has been positioned at correct position (start of postamble) in caller. */ (void)fseek(in_fp, ftell(in_fp), SEEK_SET); /* paranoia */ (void)get_bytes(in_fp, POSTAMBLE_LEN); fontinfo_head = NULL; for (;;) { if ((c = get_byte(in_fp)) < FNTDEF1 || c > FNTDEF4) /* maybe POSTPOST */ break; fontp = (struct fontinfo *) xmalloc(sizeof(struct fontinfo)); fontp->TeXnumber = get_bytes(in_fp, c - FNTDEF1 + 1); (void)fread(fontp->info, sizeof(char), 14, in_fp); n = fontp->info[12] + fontp->info[13]; fontp->fontname = xmalloc(n); (void)fread(fontp->fontname, sizeof(char), n, in_fp); fontp->next = fontinfo_head; fontinfo_head = fontp; fontp->used = False; } /* preamble */ fseek(in_fp, 0L, SEEK_SET); fout_pos = pageinfo_get_offset(0); CopyNum(in_fp, out_fp, fout_pos); /* each page */ pagecnt = 0; for (page = 0; page < total_pages; page++) { scan_page_for_specials(in_fp, page, True, stack_save, NULL); /* should the current page be selected? */ if (pinfo->callback == NULL || pinfo->callback(info, page)) { scan_page_for_specials(in_fp, page, False, scan_for_included_files, pinfo); /* read BOP except for p[4] */ CopyNum(in_fp, out_fp, BOP_PART_LEN); /* read p[4] (previous bop pointer */ (void)get_bytes(in_fp, 4); /* write actual value of p[4] */ PutFour(curr_page_offset, out_fp); /* remember offset of current page, for postamble */ curr_page_offset = fout_pos; /* update fout_pos to current position */ fout_pos += BOP_LEN; if (!headers_dumped) { headers_dumped = True; dump_literal_headers(out_fp, &fout_pos); } /* if (!written_pre_cmds) { */ stack_dump_open_commands(out_fp, &fout_pos); /* written_pre_cmds = True; */ /* } */ while ((c = getc(in_fp)) != EOF) { if ((c & 0x80) == 0) { /* ordinary character */ putc(c, out_fp); fout_pos++; } else if (c == EOP) { /* End Of Page */ /* fprintf(stderr, "EOP at %ld\n", ftell(fin)); */ /* if (page == to) { */ /* print close stack for last page */ stack_dump_close_commands(out_fp, &fout_pos); /* } */ putc(c, out_fp); fout_pos++; break; } else { /* fprintf(stderr, "WRITE_DVI before: %ld, in_fp before: %ld\n", fout_pos, ftell(in_fp)); */ WriteDVI(in_fp, out_fp, &fout_pos, c); /* fprintf(stderr, "WRITE_DVI after: %ld; in_fp after: %ld\n", fout_pos, ftell(in_fp)); */ } /* HACK alert: force synchronization - why is this neccessary? Seems to have something do with the fact that two FILE *'s on the same file are open. POSIX.1, `Interaction of File Descriptors and Standard I/O Streams' seems to say the seek()s on one of them also affect the other, but I'm not sure about this. */ fseek(in_fp, 0L, SEEK_CUR); } pagecnt++; } } /* postamble */ if (!find_postamble(in_fp, &(pinfo->errflag))) { return; } /* read/write POST command */ putc(get_byte(in_fp), out_fp); /* read over last page offset */ get_bytes(in_fp, 4); /* write last page offset */ PutFour(curr_page_offset, out_fp); /* remember start of POST */ post_cmd_offset = fout_pos; /* copy part of postamble */ CopyNum(in_fp, out_fp, POSTAMBLE_PART_LEN); /* read t[2], total number of pages */ get_bytes(in_fp, 2); /* write t[2] (two calls) */ putc((pagecnt >> 8) & 0xff, out_fp); putc(pagecnt & 0xff, out_fp); /* update fout_pos to current pos */ fout_pos += POSTAMBLE_LEN; /* output font list */ for (;;) { if ((c = get_byte(in_fp)) < FNTDEF1 || c > FNTDEF4) /* maybe POSTPOST */ break; n = get_bytes(in_fp, c - FNTDEF1 + 1); for (fontp = fontinfo_head; fontp; fontp = fontp->next) if (n == fontp->TeXnumber) break; if (fontp && fontp->used == True) FontWrite(out_fp, fontp, &fout_pos); (void) get_bytes(in_fp, 12); (void) get_bytes(in_fp, (int)(get_byte(in_fp) + get_byte(in_fp))); } /* free list */ for (fontp = fontinfo_head; fontp;) { struct fontinfo *nextp; free(fontp->fontname); nextp = fontp->next; free(fontp); fontp = nextp; } /* POSTPOST */ putc(c, out_fp); get_bytes(in_fp, 4); PutFour(post_cmd_offset, out_fp); CopyNum(in_fp, out_fp, 1 + 4); for (fout_pos += 1 + 4 + 1 + 4; fout_pos & 3; fout_pos++) { putc(TRAILER, out_fp); } /* fclose(in_fp); */ fflush(out_fp); } xdvik-ja-22.84.16-j1.40/texk/xdvik/special.c0000664000175000017500000021226311032450154017750 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1990-2004 Paul Vojta 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. NOTE: This module is based on prior work as noted below. \*========================================================================*/ /* * Support drawing routines for TeXsun and TeX * * Copyright, (C) 1987, 1988 Tim Morgan, UC Irvine * Adapted for xdvi by Jeffrey Lee, U. of Toronto * * At the time these routines are called, the values of hh and vv should * have been updated to the upper left corner of the graph (the position * the \special appears at in the dvi file). Then the coordinates in the * graphics commands are in terms of a virtual page with axes oriented the * same as the Imagen and the SUN normally have: * * 0,0 * +-----------> +x * | * | * | * \ / * +y * * Angles are measured in the conventional way, from +x towards +y. * Unfortunately, that reverses the meaning of "counterclockwise" * from what it's normally thought of. * * A lot of floating point arithmetic has been converted to integer * arithmetic for speed. In some places, this is kind-of kludgy, but * it's worth it. */ #include #include "xdvi-config.h" #include "xdvi.h" #include #include "kpathsea/c-fopen.h" #include "kpathsea/c-stat.h" #include "kpathsea/line.h" #include "kpathsea/tex-file.h" #include "special.h" #include "hypertex.h" #include "dvi.h" #include "message-window.h" #include "events.h" #include "dvi-init.h" #include "dvi-draw.h" #include "statusline.h" #include "util.h" #include "image-magick.h" #include "pagesel.h" #include "my-snprintf.h" #include "string-utils.h" #if PS # ifdef PS_DPS # include "psdps.h" # endif # ifdef PS_NEWS # include "psnews.h" # endif # ifdef PS_GS # include "psgs.h" # endif /* Code inside BUG_888087_FIXED improve the appearance of pic specials at magstep 1, but _decreases_ it at other magnifications (bug #888087; see http://sourceforge.net/tracker/index.php?func=detail&aid=888087&group_id=23164&atid=377580) Disabled until this is fixed. */ #define BUG_888087_FIXED 0 /* Flag whether this page contains raw PS material; used to warn user about this: */ Boolean have_raw_postscript = False; # if PS_GS && GS_PIXMAP_CLEARING_HACK /* Flag whether this page contains PS material; used to flush the GS buffer */ Boolean had_ps_specials = False; # endif /* PS_GS && GS_PIXMAP_CLEARING_HACK */ #endif #if COLOR /* * Color stack used when scanning. These records stay around, to ease * the burden on xmalloc(). The first entry is a dummy entry, giving * the default foreground color (as modified). */ struct colorframe { struct colorframe *next, *prev; struct rgb color; }; static Boolean m_have_papersize_special = False; void reset_papersize_special(void) { m_have_papersize_special = False; } Boolean have_papersize_special(void) { return m_have_papersize_special; } static struct colorframe scanstack_head; static int scanstack_len; static struct colorframe *scanstack_current; /* * Page stack when displaying. Again, the records stay around once * allocated. Bottom entries in the stack (inherited from previous * pages) are stored in an array instead (see comments in xdvi.h). */ static struct colorframe *rcs_head; static Boolean parse_color (const char *cp0, const char *cp, struct rgb *rgbp, Boolean generic_ps_flag); #endif /* COLOR */ #ifndef S_IRUSR # define S_IRUSR 0400 #endif #ifndef S_IWUSR # define S_IWUSR 0200 #endif # if HAVE_SYS_WAIT_H # include # endif # ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) # endif # ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) # endif #define MAXPOINTS 300 /* Max points in a path */ #define MAX_PEN_SIZE 7 /* Max pixels of pen width */ #define TWOPI (3.14159265359 * 2.0) extern double floor(double); #define rint(x) floor((x) + 0.5) static int xx[MAXPOINTS], yy[MAXPOINTS]; /* Path in milli-inches */ static int path_len = 0; /* # points in current path */ static int pen_size = 1; /* Pixel width of lines drawn */ static Boolean whiten = False; static Boolean shade = False; static Boolean blacken = False; Boolean psfig_begun = False; #define CMD(x, y) ((x) << 8 | (y)) /* * X drawing routines */ #define toint(x) ((int) ((x) + 0.5)) #define xconv(x) (toint(tpic_conv*(x))/currwin.shrinkfactor + PXL_H) #define yconv(y) (toint(tpic_conv*(y))/currwin.shrinkfactor + PXL_V) /* * Draw a line from (fx,fy) to (tx,ty). */ static void line_btw(int fx, int fy, int tx, int ty) { int fcx = xconv(fx); int tcx = xconv(tx); int fcy = yconv(fy); int tcy = yconv(ty); if ((fcx < globals.win_expose.max_x || tcx < globals.win_expose.max_x) && (fcx >= globals.win_expose.min_x || tcx >= globals.win_expose.min_x) && (fcy < globals.win_expose.max_y || tcy < globals.win_expose.max_y) && (fcy >= globals.win_expose.min_y || tcy >= globals.win_expose.min_y)) { #if COLOR if (fg_active != fg_current) do_color_change(); #endif XDrawLine(DISP, currwin.win, globals.gc.rule, fcx - currwin.base_x, fcy - currwin.base_y, tcx - currwin.base_x, tcy - currwin.base_y); } } /* * Draw a dot at (x,y) */ static void dot_at(int x, int y) { int cx = xconv(x); int cy = yconv(y); if (cx < globals.win_expose.max_x && cx >= globals.win_expose.min_x && cy < globals.win_expose.max_y && cy >= globals.win_expose.min_y){ #if COLOR if (fg_active != fg_current) do_color_change(); #endif XDrawPoint(DISP, currwin.win, globals.gc.rule, cx - currwin.base_x, cy - currwin.base_y); } } /* * Apply the requested attributes to the last path (box) drawn. * Attributes are reset. * (Not currently implemented.) */ static void do_attribute_path(int last_min_x, int last_max_x, int last_min_y, int last_max_y) { UNUSED(last_min_x); UNUSED(last_max_x); UNUSED(last_min_y); UNUSED(last_max_y); } /* * Set the size of the virtual pen used to draw in milli-inches */ static void set_pen_size(char *cp) { int ps; if (sscanf(cp, " %d ", &ps) != 1) { XDVI_WARNING((stderr, "invalid .ps command format: %s", cp)); return; } pen_size = (2 * ps * resource.pixels_per_inch / currwin.shrinkfactor + 1000) / 2000; if (pen_size < 1) pen_size = 1; else if (pen_size > MAX_PEN_SIZE) pen_size = MAX_PEN_SIZE; #if BUG_888087_FIXED if (globals.gc.rule) { XGCValues values; values.line_width = pen_size; XChangeGC(DISP, globals.gc.rule, GCLineWidth, &values); } #endif } /* * Print the line defined by previous path commands */ static void flush_path(void) { int i; int last_min_x, last_max_x, last_min_y, last_max_y; last_min_x = 30000; last_min_y = 30000; last_max_x = -30000; last_max_y = -30000; for (i = 1; i < path_len; i++) { if (xx[i] > last_max_x) last_max_x = xx[i]; if (xx[i] < last_min_x) last_min_x = xx[i]; if (yy[i] > last_max_y) last_max_y = yy[i]; if (yy[i] < last_min_y) last_min_y = yy[i]; line_btw(xx[i], yy[i], xx[i + 1], yy[i + 1]); } if (xx[path_len] > last_max_x) last_max_x = xx[path_len]; if (xx[path_len] < last_min_x) last_min_x = xx[path_len]; if (yy[path_len] > last_max_y) last_max_y = yy[path_len]; if (yy[path_len] < last_min_y) last_min_y = yy[path_len]; path_len = 0; do_attribute_path(last_min_x, last_max_x, last_min_y, last_max_y); } /* * Print a dashed line along the previously defined path, with * the dashes/inch defined. */ static void flush_dashed(char *cp, Boolean dotted) { int i; int numdots; int lx0, ly0, lx1, ly1; int cx0, cy0, cx1, cy1; float inchesperdash; double d, spacesize, a, b = 0.0, dx, dy, milliperdash; if (sscanf(cp, " %f ", &inchesperdash) != 1) { XDVI_WARNING((stderr, "invalid format for dotted/dashed line: %s", cp)); return; } if (path_len <= 1 || inchesperdash <= 0.0) { XDVI_WARNING((stderr, "invalid conditions for dotted/dashed line")); return; } milliperdash = inchesperdash * 1000.0; lx0 = xx[1]; ly0 = yy[1]; lx1 = xx[2]; ly1 = yy[2]; dx = lx1 - lx0; dy = ly1 - ly0; if (dotted) { numdots = sqrt(dx * dx + dy * dy) / milliperdash + 0.5; if (numdots == 0) numdots = 1; for (i = 0; i <= numdots; i++) { a = (float)i / (float)numdots; cx0 = lx0 + a * dx + 0.5; cy0 = ly0 + a * dy + 0.5; dot_at(cx0, cy0); } } else { d = sqrt(dx * dx + dy * dy); numdots = d / (2.0 * milliperdash) + 1.0; if (numdots <= 1) line_btw(lx0, ly0, lx1, ly1); else { spacesize = (d - numdots * milliperdash) / (numdots - 1); for (i = 0; i < numdots - 1; i++) { a = i * (milliperdash + spacesize) / d; b = a + milliperdash / d; cx0 = lx0 + a * dx + 0.5; cy0 = ly0 + a * dy + 0.5; cx1 = lx0 + b * dx + 0.5; cy1 = ly0 + b * dy + 0.5; line_btw(cx0, cy0, cx1, cy1); b += spacesize / d; } cx0 = lx0 + b * dx + 0.5; cy0 = ly0 + b * dy + 0.5; line_btw(cx0, cy0, lx1, ly1); } } path_len = 0; } /* * Add a point to the current path */ static void add_path(char *cp) { int pathx, pathy; if (++path_len >= MAXPOINTS) XDVI_FATAL((stderr, "Too many points")); if (sscanf(cp, " %d %d ", &pathx, &pathy) != 2) XDVI_FATAL((stderr, "Malformed path command")); xx[path_len] = pathx; yy[path_len] = pathy; } /* * Draw to a floating point position */ static void im_fdraw(double x, double y) { if (++path_len >= MAXPOINTS) XDVI_FATAL((stderr, "Too many arc points")); xx[path_len] = x + 0.5; yy[path_len] = y + 0.5; } /* * Draw an ellipse with the indicated center and radices. */ static void draw_ellipse(int xc, int yc, int xr, int yr) { double angle, theta; int n; int px0, py0, px1, py1; angle = (xr + yr) / 2.0; theta = sqrt(1.0 / angle); n = TWOPI / theta + 0.5; if (n < 12) n = 12; else if (n > 80) n = 80; n /= 2; theta = TWOPI / n; angle = 0.0; px0 = xc + xr; /* cos(0) = 1 */ py0 = yc; /* sin(0) = 0 */ while ((angle += theta) <= TWOPI) { px1 = xc + xr * cos(angle) + 0.5; py1 = yc + yr * sin(angle) + 0.5; line_btw(px0, py0, px1, py1); px0 = px1; py0 = py1; } line_btw(px0, py0, xc + xr, yc); } /* * Draw an arc */ static void arc(char *cp, Boolean invis) { int xc, yc, xrad, yrad, n; float start_angle, end_angle, angle, theta, r; double xradius, yradius, xcenter, ycenter; n = sscanf(cp, " %d %d %d %d %f %f ", &xc, &yc, &xrad, &yrad, &start_angle, &end_angle); if (n != 6) { XDVI_WARNING((stderr, "invalid arc specification: %s", cp)); return; } if (invis) return; /* We have a specialized fast way to draw closed circles/ellipses */ if (start_angle <= 0.0 && end_angle >= 6.282) { draw_ellipse(xc, yc, xrad, yrad); return; } xcenter = xc; ycenter = yc; xradius = xrad; yradius = yrad; r = (xradius + yradius) / 2.0; theta = sqrt(1.0 / r); #if BUG_888087_FIXED n = (pen_size * TWOPI) / (theta * currwin.shrinkfactor) + 0.5; #else n = 0.3 * TWOPI / theta + 0.5; #endif if (n < 12) n = 12; else if (n > 80) n = 80; n /= 2; theta = TWOPI / n; flush_path(); im_fdraw(xcenter + xradius * cos(start_angle), ycenter + yradius * sin(start_angle)); angle = start_angle + theta; if (end_angle < start_angle) end_angle += TWOPI; while (angle < end_angle) { im_fdraw(xcenter + xradius * cos(angle), ycenter + yradius * sin(angle)); angle += theta; } im_fdraw(xcenter + xradius * cos(end_angle), ycenter + yradius * sin(end_angle)); flush_path(); } /* * APPROXIMATE integer distance between two points */ #define dist(x0, y0, x1, y1) (abs(x0 - x1) + abs(y0 - y1)) /* * Draw a spline along the previously defined path */ static void flush_spline(void) { int xp, yp; int N; int lastx = -1, lasty = -1; Boolean lastvalid = False; int t1, t2, t3; int steps; int j; int i, w; N = path_len + 1; xx[0] = xx[1]; yy[0] = yy[1]; xx[N] = xx[N - 1]; yy[N] = yy[N - 1]; for (i = 0; i < N - 1; i++) { /* interval */ steps = (dist(xx[i], yy[i], xx[i + 1], yy[i + 1]) + dist(xx[i + 1], yy[i + 1], xx[i + 2], yy[i + 2])) / 80; for (j = 0; j < steps; j++) { /* points within */ w = (j * 1000 + 500) / steps; t1 = w * w / 20; w -= 500; t2 = (750000 - w * w) / 10; w -= 500; t3 = w * w / 20; xp = (t1 * xx[i + 2] + t2 * xx[i + 1] + t3 * xx[i] + 50000) / 100000; yp = (t1 * yy[i + 2] + t2 * yy[i + 1] + t3 * yy[i] + 50000) / 100000; if (lastvalid) line_btw(lastx, lasty, xp, yp); lastx = xp; lasty = yp; lastvalid = True; } } path_len = 0; } /* * Shade the last box, circle, or ellipse */ static void shade_last(void) { blacken = whiten = False; shade = True; } /* * Make the last box, circle, or ellipse, white inside (shade with white) */ static void whiten_last(void) { whiten = True; blacken = shade = False; } /* * Make last box, etc, black inside */ static void blacken_last(void) { blacken = True; whiten = shade = False; } /* * Code for PostScript specials begins here. */ #if PS /* * Information on how to search for PS header and figure files. */ static void ps_startup(int, int, const char *); static void ps_startup2(void); /* dummy procedures */ static void NullProc(void) { } static void NullProcInt(int flag) { UNUSED(flag); } static void NullProcStr(const char *cp) { UNUSED(cp); } struct psprocs psp = { /* used for lazy startup of the ps machinery */ /* toggle */ NullProcInt, /* destroy */ NullProc, /* interrupt */ NullProc, /* endpage */ NullProc, /* drawbegin */ ps_startup, /* drawraw */ NullProcStr, /* drawfile */ NULL, /* drawend */ NullProcStr, /* beginheader */ ps_startup2, /* endheader */ NullProc, /* newdoc */ NullProc }; struct psprocs no_ps_procs = { /* used if postscript is unavailable */ /* toggle */ NullProcInt, /* destroy */ NullProc, /* interrupt */ NullProc, /* endpage */ NullProc, /* drawbegin */ drawbegin_none, /* drawraw */ NullProcStr, /* drawfile */ NULL, /* drawend */ NullProcStr, /* beginheader */ NullProc, /* endheader */ NullProc, /* newdoc */ NullProc }; #endif /* PS */ #ifdef MAGICK int bbox_angle; Boolean bbox_valid; unsigned int bbox_width; unsigned int bbox_height; int bbox_voffset; #else static int bbox_angle; static Boolean bbox_valid; static unsigned int bbox_width; static unsigned int bbox_height; static int bbox_voffset; #endif /* info on bboxes on this page */ struct bbox_info { int x; int y; int w; int h; int angle; }; static struct bbox_info *g_bbox_info = NULL; static size_t g_bbox_info_size = 0; static size_t g_bbox_info_max_size = 0; /* Append the current coordinates to g_bbox_info, unless it already contains these coordinates. */ static void append_bbox_info(int x, int y, int w, int h, int angle) { Boolean found = False; size_t i; const size_t SIZE_STEP = 16; /* is this box already present? */ for (i = 0; i < g_bbox_info_size; i++) { if (g_bbox_info[i].x == x && g_bbox_info[i].y == y && g_bbox_info[i].w == w && g_bbox_info[i].h == h && g_bbox_info[i].angle == angle) { found = True; break; } } if (!found) { g_bbox_info_size++; while (g_bbox_info_size >= g_bbox_info_max_size) { g_bbox_info_max_size += SIZE_STEP; } g_bbox_info = xrealloc(g_bbox_info, g_bbox_info_max_size * sizeof *g_bbox_info); g_bbox_info[g_bbox_info_size - 1].x = x; g_bbox_info[g_bbox_info_size - 1].y = y; g_bbox_info[g_bbox_info_size - 1].w = w; g_bbox_info[g_bbox_info_size - 1].h = h; g_bbox_info[g_bbox_info_size - 1].angle = angle; } } static void draw_bbox0(int xcorner, int ycorner) { if (bbox_valid) { #if COLOR if (fg_active != fg_current) do_color_change(); #endif if (bbox_angle == 0) { ycorner -= bbox_voffset; XDrawRectangle(DISP, currwin.win, globals.gc.high, xcorner, ycorner, bbox_width, bbox_height); if (resource.postscript == 0) { if (htex_inside_href) { htex_set_anchorsize(xcorner, ycorner, xcorner + bbox_width, ycorner + bbox_height); htex_set_objecttype(HTEX_IMG); } } } else { float sin_a = sin(bbox_angle * (TWOPI / 360)); float cos_a = cos(bbox_angle * (TWOPI / 360)); float a, b, c, d; a = cos_a * bbox_width; b = -sin_a * bbox_width; c = -sin_a * bbox_height; d = -cos_a * bbox_height; XDrawLine(DISP, currwin.win, globals.gc.high, xcorner, ycorner, xcorner + (int)rint(a), ycorner + (int)rint(b)); XDrawLine(DISP, currwin.win, globals.gc.high, xcorner + (int)rint(a), ycorner + (int)rint(b), xcorner + (int)rint(a + c), ycorner + (int)rint(b + d)); XDrawLine(DISP, currwin.win, globals.gc.high, xcorner + (int)rint(a + c), ycorner + (int)rint(b + d), xcorner + (int)rint(c), ycorner + (int)rint(d)); XDrawLine(DISP, currwin.win, globals.gc.high, xcorner + (int)rint(c), ycorner + (int)rint(d), xcorner, ycorner); } bbox_valid = False; } } /* Display the items in bbox_info. Invoked from draw_page() in dvi-draw.c. */ void display_bboxes(void) { size_t i; for (i = 0; i < g_bbox_info_size; i++) { if (globals.debug & DBG_PS) { fprintf(stderr, "drawing bbox %lu at %d %d, %d x %d, angle %d\n", (unsigned long)i, g_bbox_info[i].x, g_bbox_info[i].y, g_bbox_info[i].w, g_bbox_info[i].h, g_bbox_info[i].angle); } #if 0 XDrawRectangle(DISP, currwin.win, globals.gc.high, g_bbox_info[i].x, g_bbox_info[i].y, g_bbox_info[i].w, g_bbox_info[i].h); #else bbox_valid = True; bbox_width = g_bbox_info[i].w; bbox_height = bbox_voffset = g_bbox_info[i].h; bbox_angle = g_bbox_info[i].angle; draw_bbox0(g_bbox_info[i].x, g_bbox_info[i].y + bbox_height); #endif } bbox_angle = 0; bbox_valid = False; } void clear_bboxes(void) { free(g_bbox_info); g_bbox_info = NULL; g_bbox_info_size = 0; g_bbox_info_max_size = 0; } void save_bbox(void) { int xcorner, ycorner; if (bbox_valid) { xcorner = PXL_H - currwin.base_x; ycorner = PXL_V - currwin.base_y; ycorner -= bbox_voffset; append_bbox_info(xcorner, ycorner, bbox_width, bbox_height, bbox_angle); /* register boundaries of this box as anchor boundaries */ if (htex_inside_href) { htex_set_anchorsize(xcorner, ycorner, xcorner + bbox_width, ycorner + bbox_height); htex_set_objecttype(HTEX_IMG); } } } void draw_bbox(void) { draw_bbox0(PXL_H - currwin.base_x, PXL_V - currwin.base_y); } #if PS static XIOErrorHandler oldhandler; static int XDviIOErrorHandler(Display * disp) { ps_destroy(); return oldhandler(disp); } static void actual_startup(int flag) { UNUSED(flag); oldhandler = XSetIOErrorHandler(XDviIOErrorHandler); /* * Figure out what we want to use to display postscript figures * and set at most one of the following to True: * resource.useGS, resource.useDPS, resource.useNeWS * * Choose DPS then NEWS then Ghostscript if they are available */ if (!( #ifdef PS_DPS (resource.useDPS && initDPS()) #if defined(PS_NEWS) || defined(PS_GS) || #endif #endif /* PS_DPS */ #ifdef PS_NEWS (resource.useNeWS && initNeWS()) #ifdef PS_GS || #endif #endif /* PS_NEWS */ #ifdef PS_GS (resource.useGS && initGS()) #endif )) psp = no_ps_procs; } static void ps_startup(int xul, int yul, const char *cp) { if (resource.postscript == 0) { draw_bbox(); return; } actual_startup(0); psp.drawbegin(xul, yul, cp); } static void ps_startup2(void) { actual_startup(0); psp.beginheader(); } /* * dumb parsing of PostScript - search for rotation H. Zeller 1/97 * Returns true if we find a potentially non-supported command that * we want to warn users about. */ static Boolean ps_parseraw(const char *PostScript_cmd) { const char *p; bbox_angle = 0; p = strstr(PostScript_cmd, "rotate"); if (p != NULL) { while (*p != '\0' && !isdigit((int)*p)) --p; while (*p != '\0' && isdigit((int)*p)) --p; if (*p != '+' && *p != '-') ++p; sscanf(p, "%d neg rotate", &bbox_angle); return True; } if (strstr(PostScript_cmd, " scale ") != NULL) return True; return False; } void drawbegin_none(int xul, int yul, const char *cp) { UNUSED(xul); UNUSED(yul); UNUSED(cp); draw_bbox(); } struct tickrec { struct tickrec *next; int pageno; char *command; char *tempname; }; static struct tickrec *tickhead = NULL; /* head of linked list of */ /* cached information */ static int nticks = 0; /* number of records total */ #ifndef TICKCACHESIZE #define TICKCACHESIZE 3 #endif #ifndef TICKTMP #define TICKTMP "/tmp" #endif /* * cachetick() - returns: * NULL error; * fp == NULL string was not in cache, fd = file * fp != NULL string was in cache, fp = cached file */ static struct tickrec * cachetick(const char *filename, kpse_file_format_type pathinfo, FILE **fp, int *fdp) { struct tickrec **linkp; struct tickrec *tikp; struct tickrec **freerecp; linkp = &tickhead; freerecp = NULL; for (;;) { /* see if we have it already */ tikp = *linkp; if (tikp == NULL) { /* if end of list */ int fd; if (nticks >= TICKCACHESIZE && freerecp != NULL) { tikp = *freerecp; *freerecp = tikp->next; free(tikp->command); unlink(tikp->tempname); /* reuse tikp and tikp->tempname */ } else { tikp = xmalloc(sizeof(struct tickrec)); tikp->tempname = NULL; ++nticks; } fd = xdvi_temp_fd(&tikp->tempname); if (fd == -1) { perror("Cannot create temporary file"); free(tikp->tempname); free(tikp); return NULL; } tikp->command = xstrdup(filename); *fp = NULL; *fdp = fd; break; } if (strcmp(filename, tikp->command) == 0) { /* found it */ *linkp = tikp->next; /* unlink it */ *fp = XFOPEN(tikp->tempname, OPEN_MODE); if (*fp == NULL) { perror(tikp->tempname); free(tikp->tempname); free(tikp->command); free(tikp); return NULL; } break; } if (tikp->pageno != current_page) freerecp = linkp; linkp = &tikp->next; } tikp->next = tickhead; /* link it in */ tickhead = tikp; tikp->pageno = pathinfo != kpse_tex_ps_header_format ? current_page : -1; return tikp; } void ps_clear_cache(void) { struct tickrec *tikp; while (tickhead != NULL) { tikp = tickhead; tickhead = tickhead->next; free(tikp->command); unlink(tikp->tempname); free((char *)tikp->tempname); free(tikp); } nticks = 0; } #ifndef UNCOMPRESS #define UNCOMPRESS "uncompress" #endif #ifndef GUNZIP #define GUNZIP "gunzip" #endif #ifndef BUNZIP2 #define BUNZIP2 "bunzip2" #endif static void send_ps_file(const char *filename, kpse_file_format_type pathinfo); static void enable_specials_send_ps_file(XtPointer data) { const char *filename = (const char *)data; resource.allow_shell = True; redraw_page(); /* to erase the bounding box */ statusline_info(STATUS_MEDIUM, "Shell specials enabled for this session.", filename); send_ps_file(filename, kpse_pict_format); } static void try_open_tempname(int status, struct xchild *this) { if (WIFEXITED(status)) { /* child exited normally */ if (WEXITSTATUS(status) != 0) { /* default error procedure */ handle_child_exit(status, this); } else { struct tickrec *tikp = (struct tickrec *)this->data; FILE *f = XFOPEN(tikp->tempname, OPEN_MODE); fprintf(stderr, "FILE: %s\n", tikp->tempname); if (f == NULL) { perror(tikp->tempname); } else { fprintf(stderr, "sending file: %s, %p\n", tikp->tempname, (void *)f); /* There's no point in invoking psp.drawfile(tikp->tempname, f); here, since usually it will be already too late (draw_part() which had called us via applicationDoSpecial() will already have terminated). So instead, we just close the file and force a redraw of the entire page. */ fclose(f); globals.ev.flags |= EV_NEWPAGE; } } } else if (WIFSIGNALED(status)) { popup_message(globals.widgets.top_level, MSG_WARN, NULL, "Process `%s' terminated abnormally with signal %d.", this->name, WTERMSIG(status)); } else if (WIFSTOPPED(status)) { popup_message(globals.widgets.top_level, MSG_WARN, NULL, "Process `%s' stopped by signal %d.", this->name, WSTOPSIG(status)); } else { popup_message(globals.widgets.top_level, MSG_WARN, NULL, "Process `%s' terminated with unknown status.", this->name); } } static void send_ps_file(const char *filename, kpse_file_format_type pathinfo) { FILE *f; int fd; static const char *argv[] = { NULL, "-c", NULL, NULL }; char *bufp = NULL; struct tickrec *volatile tikp; size_t len; char magic1, magic2, magic3; static Boolean warned_about_shellescape = False; static size_t ffline_len = 0; static char *ffline = NULL; const size_t FFLINE_STEP = 128; if (psp.drawfile == NULL || resource.postscript == 0) { return; } if (filename[0] == '`') { if (!resource.allow_shell) { if (!warned_about_shellescape) { choice_dialog_sized(globals.widgets.top_level, MSG_INFO, SIZE_MEDIUM, /* helptext */ "To enable shell specials, use the \"-allowshell\" command " "line option.\n\n" "WARNING: You should NOT use shell specials like\n" "`gunzip -c file.eps.gz\n" "(e.g. via \\DeclareGraphicsRule{...}) " "to uncompress .eps.gz files, even though some obsolete " "LaTeX documentation might suggest it. Current versions " "of xdvi and dvips will handle .eps.gz files just fine without this trick.\n", #ifndef MOTIF NULL, #endif NULL, NULL, /* no pre_callbacks */ /* Cancel label/callback */ "Cancel", NULL, (XtPointer)NULL, /* Enable label/callback */ "Enable", enable_specials_send_ps_file, (XtPointer)filename, /* msg */ "This page contains a shell special \"%s\", but execution of shell specials " "is disabled.\n\nYou can now click " "\"Enable\" to enable shell specials for this session only, " "\"Cancel\" to leave the specials disabled, or \"Help\" for more help " "on this topic.\n\n" "Please note that shell specials are a security risk, since they " "allow execution of arbitrary shell commands from the TeX file. " "You should enable them only for DVI files that you created yourself.", filename); warned_about_shellescape = True; } else { statusline_error(STATUS_MEDIUM, "Info: Shell special \"%s\" disabled.", filename); } draw_bbox(); return; } tikp = cachetick(filename, pathinfo, &f, &fd); if (tikp == NULL) /* if error */ return; if (f == NULL) { char *argv[4]; /* if not cached, need to create. Fork so that we can collect the process' error messages. */ /* FIXME: Insecure - this is a /tmp race; shouldn't close(fd), just re-use it */ close(fd); len = strlen(filename) + strlen(tikp->tempname) + (4 - 1); if (len > ffline_len) { ffline_len += FFLINE_STEP; ffline = xrealloc(ffline, ffline_len); } sprintf(ffline, "%s > %s", filename + 1, tikp->tempname); argv[0] = "/bin/sh"; argv[1] = "-c"; argv[2] = ffline; argv[3] = NULL; fork_process("/bin/sh", False, globals.dvi_file.dirname, try_open_tempname, tikp, argv); } else { bufp = tikp->tempname; psp.drawfile(bufp, f); } } else { char *expanded_filename = NULL; struct stat statbuf; expanded_filename = find_file(filename, &statbuf, pathinfo); if (expanded_filename == NULL && (pathinfo == kpse_enc_format || pathinfo == kpse_type1_format)) { /* in this case, we also kpathsea-search in the `old' place for backwards compatibility: kpse_tex_ps_header_format (see comment for load_vector(), dvi-draw.c for details) */ expanded_filename = kpse_find_file(filename, kpse_tex_ps_header_format, True); } if (expanded_filename == NULL) { expanded_filename = kpse_find_file(filename, kpse_program_text_format, True); } if (expanded_filename == NULL) { /* still no success, complain */ /* FIXME: this warning may be overwritten by warning about raw PS specials, so additinally dump to stderr. TODO: make statusline printing respect more important messages. */ XDVI_WARNING((stderr, "Could not find graphics file \"%s\"", filename)); statusline_info(STATUS_MEDIUM, "Warning: Could not find graphics file \"%s\"", filename); draw_bbox(); return; } if (globals.debug & DBG_OPEN) printf("%s:%d: |%s| expanded to |%s|\n", __FILE__, __LINE__, filename, expanded_filename); /* may need to adjust ffline_len, ffline */ while (strlen(expanded_filename) + 1 > ffline_len) { ffline_len += FFLINE_STEP; ffline = xrealloc(ffline, ffline_len); } strcpy(ffline, expanded_filename); bufp = ffline; f = XFOPEN(expanded_filename, OPEN_MODE); if (f == NULL) { XDVI_WARNING((stderr, "Could not open graphics file \"%s\": %s", expanded_filename, strerror(errno))); statusline_info(STATUS_MEDIUM, "Warning: Could not open graphics file \"%s\": %s", expanded_filename, strerror(errno)); free(expanded_filename); draw_bbox(); return; } free(expanded_filename); /* check for compressed files */ len = strlen(filename); magic1 = '\037'; magic3 = '\0'; if ((len > 2 && strcmp(filename + len - 2, ".Z") == 0 && (argv[0] = UNCOMPRESS, magic2 = '\235', True)) || (len > 3 && strcmp(filename + len - 3, ".gz") == 0 && (argv[0] = GUNZIP, magic2 = '\213', True)) || (len > 4 && strcmp(filename + len - 4, ".bz2") == 0 && (argv[0] = BUNZIP2, magic1 = 'B', magic2 = 'Z', magic3 = 'h', True))) { if (getc(f) != magic1 || (char)getc(f) != magic2 || (magic3 != '\0' && getc(f) != magic3)) { rewind(f); } else { fclose(f); tikp = cachetick(filename, pathinfo, &f, &fd); if (tikp == NULL) /* if error */ return; if (f == NULL) { /* if not cached, need to create */ pid_t pid; int status; argv[2] = bufp; fflush(stderr); /* avoid double flushing */ pid = vfork(); if (pid == 0) { /* if child */ (void)dup2(fd, 1); (void)execvp(argv[0], (char **)argv); XDVI_ERROR((stderr, "Execvp of %s failed: %s", argv[0], strerror(errno))); _exit(EXIT_FAILURE); } (void)close(fd); for (;;) { #if HAVE_WAITPID if (waitpid(pid, &status, 0) != -1) break; #else # if HAVE_WAIT4 if (wait4(pid, &status, 0, (struct rusage *)NULL) != -1) break; # else int retval; retval = wait(&status); if (retval == pid) break; if (retval != -1) continue; # endif /* HAVE_WAIT4 */ #endif /* HAVE_WAITPID */ if (errno == EINTR) continue; perror("[xdvik] waitpid"); return; } f = XFOPEN(tikp->tempname, OPEN_MODE); if (f == NULL) { perror(tikp->tempname); return; } } bufp = tikp->tempname; } } /* Success! */ psp.drawfile(bufp, f); /* this is supposed to close the file */ } } void ps_destroy(void) { struct tickrec *tikp; /* Note: old NeXT systems (at least) lack atexit/on_exit. */ psp.destroy(); for (tikp = tickhead; tikp != NULL; tikp = tikp->next) if (unlink(tikp->tempname) < 0) perror(tikp->tempname); } #endif /* PS */ void init_prescan(void) { #if PS struct tickrec *tikp; #endif scanned_page = scanned_page_reset = resource.prescan ? -1 : total_pages + 1; #if PS scanned_page_ps = scanned_page_ps_bak = scanned_page; #if COLOR scanned_page_color = scanned_page; #endif /* COLOR */ #endif /* PS */ TRACE_FILES((stderr, "init_prescan: scanned_page = %d", scanned_page)); #if PS if (resource.postscript == 0) scanned_page_ps = total_pages + 1; for (tikp = tickhead; tikp != NULL; tikp = tikp->next) tikp->pageno = -1; psp.newdoc(); #endif #if COLOR if (!resource.use_color) scanned_page_color = total_pages + 1; #endif if (ignore_papersize_specials) { #if PS && COLOR scanned_page = scanned_page_ps < scanned_page_color ? scanned_page_ps : scanned_page_color; #elif PS scanned_page = scanned_page_ps; #elif COLOR scanned_page = scanned_page_color; #else scanned_page = total_pages + 1; #endif } } static void psfig_special(char *cp) { char *filename; int raww, rawh; if (strncmp(cp, ":[begin]", 8) == 0) { cp += 8; bbox_valid = False; bbox_angle = 0; if (sscanf(cp, "%d %d\n", &raww, &rawh) >= 2) { bbox_valid = True; bbox_width = pixel_conv(spell_conv(raww)); bbox_height = pixel_conv(spell_conv(rawh)); bbox_voffset = 0; } if (INSIDE_MANE_WIN) { #if PS psp.drawbegin(PXL_H - currwin.base_x, PXL_V - currwin.base_y, cp); #else draw_bbox(); #endif } psfig_begun = True; } else if (strncmp(cp, " plotfile ", 10) == 0) { cp += 10; while (isspace((int)*cp)) cp++; /* handle "`zcat file". Borrowed from dvipsk... */ if (*cp == '"') { cp++; for (filename = cp; *cp && (*cp != '"'); ++cp); } else { for (filename = cp; *cp && !isspace((int)*cp); ++cp); } *cp = '\0'; #if PS if (INSIDE_MANE_WIN) send_ps_file(filename, kpse_pict_format); #endif } else if (strncmp(cp, ":[end]", 6) == 0) { cp += 6; #if PS if (INSIDE_MANE_WIN) { psp.drawend(cp); } #endif bbox_valid = False; psfig_begun = False; } else if (*cp == ':') { /* I am going to send some raw postscript stuff */ ++cp; /* skip the colon */ #if PS if (ps_parseraw(cp)) have_raw_postscript = True; if (INSIDE_MANE_WIN) psp.drawraw(cp); #endif } else { /* attempt to parse pstricks color specials */ #if COLOR struct rgb color; if (parse_color(cp, cp, &color, True)) { /* clear stack */ if (rcs_head == NULL) { rcs_head = xmalloc(sizeof *rcs_head); rcs_head->prev = rcs_head->next = NULL; } rcs_top = rcs_head; color_bot_size = 0; /* Change top of stack */ rcs_top->color = color; set_fg_color(&color); } #endif /* also raw PostScript, but no extra colon to skip */ #if PS if (INSIDE_MANE_WIN) { if (ps_parseraw(cp)) have_raw_postscript = True; if (psfig_begun) psp.drawraw(cp); else { psp.drawbegin(PXL_H - currwin.base_x, PXL_V - currwin.base_y, cp); psp.drawend(""); } } #endif } } /* Keys for epsf specials */ static const char *keytab[] = { "clip", "llx", "lly", "urx", "ury", "rwi", "rhi", "hsize", "vsize", "hoffset", "voffset", "hscale", "vscale", "angle" }; #define KEY_LLX keyval[0] #define KEY_LLY keyval[1] #define KEY_URX keyval[2] #define KEY_URY keyval[3] #define KEY_RWI keyval[4] #define KEY_RHI keyval[5] #define NKEYS (sizeof keytab /sizeof *keytab) #define N_ARGLESS_KEYS 1 static void epsf_special(char *cp) { char *filename; static char *buffer; static unsigned int buflen = 0; unsigned int len; char *q; int flags = 0; double keyval[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; filename = cp; if (*cp == '\'' || *cp == '"') { do ++cp; while (*cp != '\0' && *cp != *filename); ++filename; } else while (*cp != '\0' && !isspace((int)*cp)) ++cp; if (*cp != '\0') *cp++ = '\0'; while (isspace((int)*cp)) ++cp; len = strlen(cp) + NKEYS + 30; if (buflen < len) { if (buflen != 0) free(buffer); buflen = len; buffer = xmalloc(buflen); } strcpy(buffer, "@beginspecial"); q = buffer + strlen(buffer); while (*cp != '\0') { char *p1 = cp; size_t keyno; while (*p1 != '=' && !isspace((int)*p1) && *p1 != '\0') ++p1; for (keyno = 0;; ++keyno) { if (keyno >= NKEYS) { if (globals.warn_spec_now) XDVI_WARNING((stderr, "Ignoring unknown keyword (%.*s) in \\special", (int)(p1 - cp), cp)); break; } if (memcmp(cp, keytab[keyno], p1 - cp) == 0) { if (keyno >= N_ARGLESS_KEYS) { while (isspace((int)*p1)) ++p1; if (*p1 == '=') { ++p1; while (isspace((int)*p1)) ++p1; } if (keyno < N_ARGLESS_KEYS + 6) { keyval[keyno - N_ARGLESS_KEYS] = atof(p1); flags |= (1 << (keyno - N_ARGLESS_KEYS)); } *q++ = ' '; while (!isspace((int)*p1) && *p1 != '\0') *q++ = *p1++; } *q++ = ' '; *q++ = '@'; strcpy(q, keytab[keyno]); q += strlen(q); break; } } cp = p1; while (!isspace((int)*cp) && *cp != '\0') ++cp; while (isspace((int)*cp)) ++cp; } strcpy(q, " @setspecial\n"); bbox_valid = False; /* Validate the case where both rwi and rhi are undefined * (and llx, lly, urx, ury are properly defined) */ if (!(flags & 0x30) && (flags & 0xf) == 0xf) { KEY_RWI = (KEY_URX - KEY_LLX) * 10; flags |= 0x10; } if ((flags & 0x30) == 0x30 || ((flags & 0x30) && (flags & 0xf) == 0xf)) { bbox_valid = True; bbox_width = 0.1 * ((flags & 0x10) ? KEY_RWI : KEY_RHI * (KEY_URX - KEY_LLX) / (KEY_URY - KEY_LLY)) * dimconv / currwin.shrinkfactor + 0.5; bbox_voffset = bbox_height = 0.1 * ((flags & 0x20) ? KEY_RHI : KEY_RWI * (KEY_URY - KEY_LLY) / (KEY_URX - KEY_LLX)) * dimconv / currwin.shrinkfactor + 0.5; } if (INSIDE_MANE_WIN) { #if PS psp.drawbegin(PXL_H - currwin.base_x, PXL_V - currwin.base_y, buffer); /* talk directly with the DPSHandler here */ send_ps_file(filename, kpse_pict_format); psp.drawend(" @endspecial"); #else draw_bbox(); #endif } bbox_valid = False; } static void quote_special(char *cp) { bbox_valid = False; #if PS if (currwin.win == mane.win) { psp.drawbegin(PXL_H - currwin.base_x, PXL_V - currwin.base_y, "@beginspecial @setspecial "); /* talk directly with the DPSHandler here */ psp.drawraw(cp + 1); psp.drawend(" @endspecial"); } #endif /* nothing else to do--there's no bbox here */ } #if PS static void scan_header(char *cp) { char *filename; /* default for .pro files: */ kpse_file_format_type our_format; #if PS_GS if (gs_postpone_prescan) return; #endif filename = cp; if (*cp == '\'' || *cp == '"') { do ++cp; while (*cp != '\0' && *cp != *filename); *cp = '\0'; ++filename; } psp.beginheader(); /* check for suffixes other than `.pro' (default PS headers), case-insensitive */ if (str_is_suffix(".pfa", filename, False) || str_is_suffix(".pfb", filename, False)) our_format = kpse_type1_format; else if (str_is_suffix(".enc", filename, False)) our_format = kpse_enc_format; else our_format = kpse_tex_ps_header_format; send_ps_file(filename, our_format); } static void scan_bang(char *cp) { psp.beginheader(); psp.drawraw(cp + 1); } #endif /* PS */ #if COLOR /* * Table of dvips color names. Produced by passing the table in * dvipsk/color.lpro through the following perl script, and then * through sort. * * #! /usr/bin/perl -w * * sub cvpart { * return $_[0] < 1.0 ? 1.0 - $_[0] : 0.0; * } * * $pat = "^\\/(\\w+)\\s*\\{\\s*([0-9.]+)\\s*([0-9.]+)\\s*([0-9.]+)" * . "\\s*([0-9.]+)\\s*setcmykcolor\\s*\\}\\s*DC\\s*\$"; * while () { * chop; * if (/^%%/) {next;} * if (/$pat/o) { * printf "\t\tDVIPSCOLORDESC(%2d, \"%s\", %g, %g, %g),\n", * length($1), $1, * cvpart($2 + $5), cvpart($3 + $5), cvpart($4 + $5); * } * else { * print "Bad line: ", $_, "\n"; * } * } */ struct dvipscolor { const char *name; struct rgb color; }; static Boolean parse_color(const char *cp0, const char *cp, struct rgb *rgbp, Boolean generic_ps_flag) { double r, g, b; double k; double hue, sat, bri; char dummy[8]; #define CVPART(x) ((int)((x) * 65535 + 0.5)) #define COLOR_DESC(name, r, g, b) \ {name, {CVPART(r), CVPART(g), CVPART(b)}} /* hash table to speed up lookup in following list of color names */ static hashTableT colornames_hash; /* Use a prime close to sizof colornames / sizeof colornames[0]. You might want to update this when extending the colornames array, and to check the filling factor and average chain length by uncommenting the hash_print(colornames_hash, True); below. I usually go for filling > 50% and avg. chain len < 2. The 68-elem array below results in: 79 buckets, 43 nonempty (54%); 68 entries, average chain 1.6. */ static const size_t colornames_hash_size = 79; static struct dvipscolor colornames[] = { COLOR_DESC("Red", 1, 0, 0), COLOR_DESC("Tan", 0.86, 0.58, 0.44), COLOR_DESC("Blue", 0, 0, 1), COLOR_DESC("Cyan", 0, 1, 1), COLOR_DESC("Gray", 0.5, 0.5, 0.5), COLOR_DESC("Plum", 0.5, 0, 1), COLOR_DESC("Black", 0, 0, 0), COLOR_DESC("Brown", 0.4, 0, 0), COLOR_DESC("Green", 0, 1, 0), COLOR_DESC("Melon", 1, 0.54, 0.5), COLOR_DESC("Peach", 1, 0.5, 0.3), COLOR_DESC("Sepia", 0.3, 0, 0), COLOR_DESC("White", 1, 1, 1), COLOR_DESC("Maroon", 0.68, 0, 0), COLOR_DESC("Orange", 1, 0.39, 0.13), COLOR_DESC("Orchid", 0.68, 0.36, 1), COLOR_DESC("Purple", 0.55, 0.14, 1), COLOR_DESC("Salmon", 1, 0.47, 0.62), COLOR_DESC("Violet", 0.21, 0.12, 1), COLOR_DESC("Yellow", 1, 1, 0), COLOR_DESC("Apricot", 1, 0.68, 0.48), COLOR_DESC("Emerald", 0, 1, 0.5), COLOR_DESC("Fuchsia", 0.45, 0.01, 0.92), COLOR_DESC("Magenta", 1, 0, 1), COLOR_DESC("SkyBlue", 0.38, 1, 0.88), COLOR_DESC("Thistle", 0.88, 0.41, 1), COLOR_DESC("BrickRed", 0.72, 0, 0), COLOR_DESC("Cerulean", 0.06, 0.89, 1), COLOR_DESC("Lavender", 1, 0.52, 1), COLOR_DESC("Mahogany", 0.65, 0, 0), COLOR_DESC("Mulberry", 0.64, 0.08, 0.98), COLOR_DESC("NavyBlue", 0.06, 0.46, 1), COLOR_DESC("SeaGreen", 0.31, 1, 0.5), COLOR_DESC("TealBlue", 0.12, 0.98, 0.64), COLOR_DESC("BlueGreen", 0.15, 1, 0.67), COLOR_DESC("CadetBlue", 0.38, 0.43, 0.77), COLOR_DESC("Dandelion", 1, 0.71, 0.16), COLOR_DESC("Goldenrod", 1, 0.9, 0.16), COLOR_DESC("LimeGreen", 0.5, 1, 0), COLOR_DESC("OrangeRed", 1, 0, 0.5), COLOR_DESC("PineGreen", 0, 0.75, 0.16), COLOR_DESC("RawSienna", 0.55, 0, 0), COLOR_DESC("RedOrange", 1, 0.23, 0.13), COLOR_DESC("RedViolet", 0.59, 0, 0.66), COLOR_DESC("Rhodamine", 1, 0.18, 1), COLOR_DESC("RoyalBlue", 0, 0.5, 1), COLOR_DESC("RubineRed", 1, 0, 0.87), COLOR_DESC("Turquoise", 0.15, 1, 0.8), COLOR_DESC("VioletRed", 1, 0.19, 1), COLOR_DESC("Aquamarine", 0.18, 1, 0.7), COLOR_DESC("BlueViolet", 0.1, 0.05, 0.96), COLOR_DESC("DarkOrchid", 0.6, 0.2, 0.8), COLOR_DESC("OliveGreen", 0, 0.6, 0), COLOR_DESC("Periwinkle", 0.43, 0.45, 1), COLOR_DESC("Bittersweet", 0.76, 0.01, 0), COLOR_DESC("BurntOrange", 1, 0.49, 0), COLOR_DESC("ForestGreen", 0, 0.88, 0), COLOR_DESC("GreenYellow", 0.85, 1, 0.31), COLOR_DESC("JungleGreen", 0.01, 1, 0.48), COLOR_DESC("ProcessBlue", 0.04, 1, 1), COLOR_DESC("RoyalPurple", 0.25, 0.1, 1), COLOR_DESC("SpringGreen", 0.74, 1, 0.24), COLOR_DESC("YellowGreen", 0.56, 1, 0.26), COLOR_DESC("MidnightBlue", 0, 0.44, 0.57), COLOR_DESC("YellowOrange", 1, 0.58, 0), COLOR_DESC("CarnationPink", 1, 0.37, 1), COLOR_DESC("CornflowerBlue", 0.35, 0.87, 1), COLOR_DESC("WildStrawberry", 1, 0.04, 0.61), }; #undef CVPART #undef COLOR_DESC UNUSED(cp0); while (*cp == ' ') ++cp; if (generic_ps_flag) { /* check for pstricks color specials. The dummy buffer is to ensure that there are no other (general PS) commands following (we wouldn't know how to deal with these). */ if (sscanf(cp, "%lf %lf %lf setrgbcolor %7s", &r, &g, &b, dummy) == 3 && r >= 0 && r <= 1 && g >= 0 && g <= 1 && b >= 0 && b <= 1) { rgbp->r = r * 65535 + 0.5; rgbp->g = g * 65535 + 0.5; rgbp->b = b * 65535 + 0.5; return True; } else if (sscanf(cp, "%lf %lf %lf %lf setcmykcolor %7s", &r, &g, &b, &k, dummy) == 4 && r >= 0 && r <= 1 && g >= 0 && g <= 1 && b >= 0 && b <= 1 && k >= 0 && k <= 1) { r = 1.0 - r - k; /* cyan --> red */ rgbp->r = (r < 0 ? 0 : r * 65535 + 0.5); g = 1.0 - g - k; /* magenta --> green */ rgbp->g = (g < 0 ? 0 : g * 65535 + 0.5); b = 1.0 - b - k; /* yellow --> blue */ rgbp->b = (b < 0 ? 0 : b * 65535 + 0.5); return True; } else if (sscanf(cp, "%lf %lf %lf sethsbcolor %7s", &hue, &sat, &bri, dummy) == 3 && hue >= 0 && hue <= 1 && sat >= 0 && sat <= 1 && bri >= 0 && bri <= 1) { int h = (int) (6 * hue); double p = bri * (1 - sat); double q = bri * (1 - sat * (6 * hue - h)); double t = p - q + bri; switch (h) { case 0: r = bri; g = t; b = p; break; /* Red - Yel */ case 1: r = q; g = bri; b = p; break; /* Yel - Grn */ case 2: r = p; g = bri; b = t; break; /* Grn - Cyn */ case 3: r = p; g = q; b = bri; break; /* Cyn - Blu */ case 4: r = t; g = p; b = bri; break; /* Blu - Mag */ case 5: r = bri; g = p; b = q; break; /* Mag - Red */ case 6: r = bri; g = b = p; break; /* Red */ } rgbp->r = r * 65535 + 0.5; rgbp->g = g * 65535 + 0.5; rgbp->b = b * 65535 + 0.5; return True; } else if (sscanf(cp, "%lf setgray %7s", &r, dummy) == 1 && r >= 0 && r <= 1) { rgbp->r = rgbp->g = rgbp->b = r * 65535 + 0.5; return True; } else return False; } /* no generic PS command; must be a dvips color special */ if (memicmp(cp, "rgb ", 4) == 0) { if (sscanf(cp + 3, "%lf %lf %lf", &r, &g, &b) == 3 && r >= 0 && r <= 1 && g >= 0 && g <= 1 && b >= 0 && b <= 1) { rgbp->r = r * 65535 + 0.5; rgbp->g = g * 65535 + 0.5; rgbp->b = b * 65535 + 0.5; return True; } } else if (memicmp(cp, "gray ", 5) == 0) { if (sscanf(cp + 4, "%lf", &r) == 1 && r >= 0 && r <= 1) { rgbp->r = rgbp->g = rgbp->b = r * 65535 + 0.5; return True; } } else if (memicmp(cp, "cmyk ", 5) == 0) { if (sscanf(cp + 4, "%lf %lf %lf %lf", &r, &g, &b, &k) == 4 && r >= 0 && r <= 1 && g >= 0 && g <= 1 && b >= 0 && b <= 1 && k >= 0 && k <= 1) { r = 1.0 - r - k; /* cyan --> red */ rgbp->r = (r < 0 ? 0 : r * 65535 + 0.5); g = 1.0 - g - k; /* magenta --> green */ rgbp->g = (g < 0 ? 0 : g * 65535 + 0.5); b = 1.0 - b - k; /* yellow --> blue */ rgbp->b = (b < 0 ? 0 : b * 65535 + 0.5); return True; } } else if (memicmp(cp, "hsb ", 4) == 0) { if (sscanf(cp + 3, "%lf %lf %lf", &hue, &sat, &bri) == 3 && hue >= 0 && hue <= 1 && sat >= 0 && sat <= 1 && bri >= 0 && bri <= 1) { int h = (int) (6 * hue); double p = bri * (1 - sat); double q = bri * (1 - sat * (6 * hue - h)); double t = p - q + bri; switch (h) { case 0: r = bri; g = t; b = p; break; /* Red - Yel */ case 1: r = q; g = bri; b = p; break; /* Yel - Grn */ case 2: r = p; g = bri; b = t; break; /* Grn - Cyn */ case 3: r = p; g = q; b = bri; break; /* Cyn - Blu */ case 4: r = t; g = p; b = bri; break; /* Blu - Mag */ case 5: r = bri; g = p; b = q; break; /* Mag - Red */ case 6: r = bri; g = b = p; break; /* Red */ } rgbp->r = r * 65535 + 0.5; rgbp->g = g * 65535 + 0.5; rgbp->b = b * 65535 + 0.5; return True; } } else { /* is it a dvips color name? */ size_t idx; size_t len = 0; static char *testname = NULL; static size_t testname_len = 0; size_t testname_step = 16; if (colornames_hash.size == 0) { /* initialize hash table */ size_t i; colornames_hash = hash_create(colornames_hash_size); /* insert color names and array indexes */ for (i = 0; i < (sizeof colornames / sizeof colornames[0]); i++) { put_str_int_hash(&colornames_hash, colornames[i].name, i); } } /* uncomment the following to get statistics on hashing: */ /* hash_print(colornames_hash, True); */ /* need to copy to a null-terminated string for hash lookup ... */ while (isalpha((int)cp[len])) { ++len; /* get length of color name */ } while (len >= testname_len) { testname_len += testname_step; testname = xrealloc(testname, testname_len); } memcpy(testname, cp, len); testname[len] = '\0'; if (find_str_int_hash(&colornames_hash, testname, &idx)) { *rgbp = colornames[idx].color; return True; } } /* not found */ XDVI_WARNING((stderr, "Ignoring invalid color name in special `%s'", cp0 == NULL ? "" : cp0)); return False; } void init_page_colors(struct rgb *foreground, struct rgb *background) { int i; page_colors.size = total_pages; page_colors.stack = xmalloc(page_colors.size * sizeof *page_colors.stack); for (i = 0; i <= scanned_page + 1; ++i) { page_colors.stack[i].bg = *background; page_colors.stack[i].colorstack = foreground; page_colors.stack[i].stacksize = 1; } for (; i < total_pages; i++) { page_colors.stack[i].colorstack = NULL; } scanstack_head.color = *foreground; scanstack_len = 1; /* nothing yet */ scanstack_current = &scanstack_head; /* stack position */ } static void scan_bg_color(const char *cp) { if (!resource.use_color) return; if (page_colors.stack == NULL) init_page_colors(&fg_initial, &bg_initial); ASSERT(scanned_page < (int)page_colors.size, "page_colors.size too small"); (void) parse_color(cp, cp + 11, &(page_colors.stack[scanned_page + 1].bg), False); } void scan_color(const char *cp) { const char *cp1 = cp + 6; if (!resource.use_color) return; while (*cp1 == ' ') ++cp1; if (page_colors.stack == NULL) init_page_colors(&fg_initial, &bg_initial); if (memicmp(cp1, "push ", 5) == 0) { if (scanstack_current->next == NULL) { /* if at end */ scanstack_current->next = xmalloc(sizeof *scanstack_current); scanstack_current->next->prev = scanstack_current; scanstack_current->next->next = NULL; } scanstack_current = scanstack_current->next; ++scanstack_len; if (!parse_color(cp, cp1 + 5, &scanstack_current->color, False)) scanstack_current->color = scanstack_current->prev->color; } else if (memicmp(cp1, "pop", 3) == 0) { if (scanstack_len <= 1) { XDVI_WARNING((stderr, "Color pop occurred with empty color stack.")); } else { scanstack_current = scanstack_current->prev; --scanstack_len; } } else { (void) parse_color(cp, cp1, &scanstack_head.color, False); if (scanstack_len > 1) { struct colorframe *cfp; XDVI_WARNING((stderr, "Global color change occurred with non-empty color stack!\n" "Trying to recover by setting all stack entries to that color.")); for (cfp = scanstack_head.next;; cfp = cfp->next) { cfp->color = scanstack_head.color; if (cfp == scanstack_current) break; } } } } void scan_color_eop(void) { int i; struct rgb *prev, *p1, *rgbp; struct colorframe *cf; if (page_colors.stack == NULL) return; /* set background color for next page */ if (scanned_page + 1 < total_pages) { ASSERT(scanned_page + 1 < (int)page_colors.size, "page_colors.size too small"); page_colors.stack[scanned_page + 1].bg = page_colors.stack[scanned_page].bg; } ASSERT(scanned_page < (int)page_colors.size, "page_colors.size too small"); /* save the stack contents */ page_colors.stack[scanned_page].stacksize = scanstack_len; prev = &fg_initial; i = 1; if (scanned_page > 0) { prev = page_colors.stack[scanned_page - 1].colorstack; i = page_colors.stack[scanned_page - 1].stacksize; } if (scanstack_len <= i) { /* try to reuse the previous array */ p1 = prev; cf = &scanstack_head; for (i = 0;;) { if (p1->r != cf->color.r || p1->g != cf->color.g || p1->b != cf->color.b) break; if (++i >= scanstack_len) { /* end loop; reuse memory */ page_colors.stack[scanned_page].colorstack = prev; return; /* done */ } ++p1; cf = cf->next; } } page_colors.stack[scanned_page].colorstack = rgbp = xmalloc(scanstack_len * sizeof *rgbp); cf = &scanstack_head; for (i = 0; i < scanstack_len; ++i) { *rgbp++ = cf->color; cf = cf->next; } } /* * We don't actually do any X calls yet to change colors; that can wait * until a character or rule needs to be drawn. */ void set_fg_color(const struct rgb *color) { struct fgrec **fgpp; if (fg_current != NULL && color->r == fg_current->color.r && color->g == fg_current->color.g && color->b == fg_current->color.b) { return; } ASSERT(bg_current != NULL, "Background color not initialized"); for (fgpp = &bg_current->fg_head;;) { fg_current = *fgpp; if (fg_current == NULL) { /* if color is not in list */ fg_current = *fgpp = xmalloc(sizeof *fg_current); fg_current->next = NULL; fg_current->color = *color; fg_current->pixel_good = False; #if GREY fg_current->palette_good = False; #endif break; } if (fg_current->color.r == color->r && fg_current->color.g == color->g && fg_current->color.b == color->b) break; fgpp = &fg_current->next; } if (globals.debug & DBG_DVI) printf("Changing fg color to %5d %5d %5d\n", color->r, color->g, color->b); } #if 0 static void show_stack(void) { struct colorframe *ptr; int i; fprintf(stderr, "FG: %d,%d,%d\n", fg_current->color.r, fg_current->color.b, fg_current->color.g); for (i = 0, ptr = rcs_top; ptr != NULL; ptr = ptr->prev, i++) { fprintf(stderr, "stack %d: %d,%d,%d\n", i, ptr->color.r, ptr->color.b, ptr->color.g); } } #endif void color_special(const char *cp) { while (*cp == ' ') ++cp; if (memicmp(cp, "push ", 5) == 0) { if (rcs_top == NULL) { if (rcs_head == NULL) { rcs_head = xmalloc(sizeof *rcs_head); rcs_head->prev = rcs_head->next = NULL; } rcs_top = rcs_head; } else { struct colorframe *rcs_next; rcs_next = rcs_top->next; if (rcs_next == NULL) { rcs_next = rcs_top->next = xmalloc(sizeof *rcs_next); rcs_next->prev = rcs_top; rcs_next->next = NULL; } rcs_top = rcs_next; } if (!parse_color(NULL, cp + 5, &rcs_top->color, False)) { if (rcs_top->prev != NULL) rcs_top->color = rcs_top->prev->color; else rcs_top->color = color_bottom[color_bot_size - 1]; } set_fg_color(&rcs_top->color); } else if (memicmp(cp, "pop", 3) == 0) { /* Pop stack */ if (rcs_top != NULL) { if (color_bot_size > 0) rcs_top = rcs_top->prev; else return; } else if (color_bot_size > 1) --color_bot_size; else { if (scanned_page_reset >= 0) { /* turn on scanning and redraw the page */ scanned_page = scanned_page_color = scanned_page_reset = -1; #if PS scanned_page_ps = scanned_page; #endif /* fprintf(stderr, "forcing redraw!!!\n"); */ globals.ev.flags |= EV_NEWPAGE; /* force a redraw */ longjmp(globals.ev.canit, 1); } return; } /* fprintf(stderr, "bot_size: %d\n", color_bot_size); */ set_fg_color(rcs_top != NULL ? &rcs_top->color : &color_bottom[color_bot_size - 1]); } else { struct rgb color; if (!parse_color(NULL, cp, &color, False)) return; /* clear stack */ if (rcs_head == NULL) { rcs_head = xmalloc(sizeof *rcs_head); rcs_head->prev = rcs_head->next = NULL; } rcs_top = rcs_head; color_bot_size = 0; /* Change top of stack */ rcs_top->color = color; set_fg_color(&color); } } #endif /* COLOR */ static unsigned int myatopix(const char **pp) { #define SCR_LEN 16 unsigned int value; const char *cp = *pp; char scr[16]; const char *p0, *p1; p0 = cp; while ((*cp >= '0' && *cp <= '9') || *cp == '.') ++cp; p1 = cp; while (isspace((int)*cp)) ++cp; if (*cp >= 'a' && *cp <= 'z' && cp[1] >= 'a' && cp[1] <= 'z') { /* if units are present */ if (p1 - p0 <= SCR_LEN - 3) { sprintf(scr, "%.*s%c%c", (int)(p1 - p0), p0, *cp, cp[1]); value = atopix(scr, False); } else value = 0; cp += 2; } else value = atopix(p0, False); *pp = cp; return value; #undef SCR_LEN } static void scan_papersize(const char *cp0) { const char *cp = cp0; unsigned int w, h; double mag = 1.0; if (ignore_papersize_specials) return; if (*cp == '*') { do ++cp; while (isspace((int)*cp)); mag = magnification * .001; } w = myatopix(&cp) * mag + 0.5; while (isspace((int)*cp)) ++cp; if (*cp == ',') do ++cp; while (isspace((int)*cp)); h = myatopix(&cp) * mag + 0.5; if (w == 0 || h == 0) XDVI_WARNING((stderr, "Invalid papersize special `%s'", cp0)); else { /* we have a paper size special; disable xdvirc_geometry: fprintf(stderr, "---------- scanned papersize: %dx%d\n", w, h); resource.xdvirc_geometry = NULL; */ pageinfo_set_page_width(scanned_page + 1, w); pageinfo_set_window_width(scanned_page + 1, w); pageinfo_set_page_height(scanned_page + 1, h); pageinfo_set_window_height(scanned_page + 1, h); } } /* * The following copyright message applies to the rest of this file. --PV */ /* * This program is Copyright (C) 1987 by the Board of Trustees of the * University of Illinois, and by the author Dirk Grunwald. * * This program may be freely copied, as long as this copyright * message remaines affixed. It may not be sold, although it may * be distributed with other software which is sold. If the * software is distributed, the source code must be made available. * * No warranty, expressed or implied, is given with this software. * It is presented in the hope that it will prove useful. * * Hacked in ignorance and desperation by jonah@db.toronto.edu */ /* * The code to handle the \specials generated by tpic was modified * by Dirk Grunwald using the code Tim Morgan at Univ. of Calif, Irvine * wrote for TeXsun. */ static char * endofcommand(char *cp) { while (isspace((int)*cp)) ++cp; if (*cp != '=') return NULL; do ++cp; while (isspace((int)*cp)); return cp; } #define CMD(x, y) ((x) << 8 | (y)) void applicationDoSpecial(char *cp, size_t len) { char *p; if (globals.debug & DBG_DVI) printf(" `%s'\n", cp); while (isspace((int)*cp)) ++cp; /* Ignore initial "xdvi:" */ if (memcmp(cp, "xdvi:", 5) == 0) { cp += 5; while (isspace((int)*cp)) ++cp; } /* PostScript specials */ #ifdef MAGICK if (resource.useMAGICK) { if (Magick_parse_special(cp)) return; } #endif if (*cp == '"') { quote_special(cp); return; } if (memicmp(cp, "ps:", 3) == 0) { cp += 3; psfig_special(cp); /* check for hdvips hyperlinks */ if (memicmp(cp, "sdict begin ", strlen("sdict begin ")) == 0) { static Boolean warned_hypertex_too_old = False; char *match = NULL; if (warned_hypertex_too_old) /* don't continue evaluating links in this case */ return; cp += strlen("sdict begin "); if (memcmp(cp, "H.S", 3) == 0 || memcmp(cp, "H.R", 3) == 0 || memcmp(cp, "H.B", 3) == 0 /* following 2 conditions could be more restrictive: between `begin' and H.A/H.L, there should be a single number (baselineskip in pt) */ || (match = strstr(cp, "H.A")) != NULL || (match = strstr(cp, "H.L")) != NULL || (match = strstr(cp, "/Action")) != NULL || (match = strstr(cp, "/Link")) != NULL || (match = strstr(cp, "/View")) != NULL) { if (match != NULL) htex_do_special(match, len - 3 - (match - cp) - strlen("sdict begin ")); else htex_do_special(cp, len - strlen("sdict begin ")); } else if (!warned_hypertex_too_old && strstr(cp, "HyperStart") != NULL) { popup_message(globals.widgets.top_level, MSG_WARN, NULL, "This DVI was created with a too old version of the `dvips' hyperref driver - " "disabling hyperlinks.\n" "To fix this, you should either upgrade to a current version of hyperref " "(see http://www.tug.org/applications/hyperref/), " "or use the `hypertex' package option, like this:\n\\usepackage[hypertex]{hyperref}\n" "(Be aware though that this option won't work for PS->PDF conversion!)"); warned_hypertex_too_old = True; } } else { /* When not ignoring SDict entries, the distiller and pagecolor code in lshort.dvi from CTAN:info/lshort/russian/lshrtdvi.zip causes a failed assertion for 'color_bot_size > 0' in dvi-draw.c; there's something wrong with the parsing order/event handling here (see bug #856547). But we also don't want those entries to trigger erasepage_gs(), so it's correct to ignore them here. */ #if PS_GS && GS_PIXMAP_CLEARING_HACK had_ps_specials = True; #endif } return; } if (memicmp(cp, "psfile", 6) == 0 && (p = endofcommand(cp + 6)) != NULL) { epsf_special(p); #if PS_GS && GS_PIXMAP_CLEARING_HACK had_ps_specials = True; #endif return; } if (memicmp(cp, "html:", 5) == 0) { htex_do_special(cp + 5, len - 5); return; } #if COLOR if (memicmp(cp, "color ", 6) == 0) { /* fprintf(stderr, "------------- color special\n"); */ if (resource.use_color) color_special(cp + 6); return; } #endif /* these should have been scanned */ if (*cp == '!' || (memicmp(cp, "header", 6) == 0 && endofcommand(cp + 6) != NULL)) { #ifdef PS if (resource.postscript != 0 && scanned_page_reset >= 0) { /* turn on scanning and redraw the page */ scanned_page = scanned_page_ps = scanned_page_reset = -1; # if COLOR scanned_page_color = scanned_page; # endif globals.ev.flags |= EV_NEWPAGE; /* force a redraw */ longjmp(globals.ev.canit, 1); } #endif /* PS */ return; } if (memicmp(cp, "background ", 11) == 0) { #if COLOR if (resource.use_color && scanned_page_reset >= 0) { /* turn on scanning and redraw the page */ scanned_page = scanned_page_color = scanned_page_reset = -1; # if PS scanned_page_ps = scanned_page; # endif /* fprintf(stderr, "forcing redraw!\n"); */ globals.ev.flags |= EV_NEWPAGE; /* force a redraw */ longjmp(globals.ev.canit, 1); } #endif /* COLOR */ return; } if (memcmp(cp, "papersize", 9) == 0 && endofcommand(cp + 9) != NULL) { m_have_papersize_special = True; if (scanned_page_reset >= 0) { /* turn on scanning and redraw the page */ scanned_page = scanned_page_reset = -1; #if PS scanned_page_ps = scanned_page; #endif #if COLOR scanned_page_color = scanned_page; #endif globals.ev.flags |= EV_NEWPAGE; /* force a redraw */ longjmp(globals.ev.canit, 1); } return; } /* tpic specials */ if (*cp >= 'a' && *cp <= 'z' && cp[1] >= 'a' && cp[1] <= 'z' && (isspace((int)cp[2]) || cp[2] == '\0')) { switch (CMD(*cp, cp[1])) { case CMD('p', 'n'): set_pen_size(cp + 2); return; case CMD('f', 'p'): flush_path(); return; case CMD('d', 'a'): flush_dashed(cp + 2, False); return; case CMD('d', 't'): flush_dashed(cp + 2, True); return; case CMD('p', 'a'): add_path(cp + 2); return; case CMD('a', 'r'): arc(cp + 2, False); return; case CMD('i', 'a'): arc(cp + 2, True); return; case CMD('s', 'p'): flush_spline(); return; case CMD('s', 'h'): shade_last(); return; case CMD('w', 'h'): whiten_last(); return; case CMD('b', 'k'): blacken_last(); return; case CMD('i', 'p'): /* throw away the path -- jansteen */ path_len = 0; return; } } if (memcmp(cp, "src:", 4) == 0) { have_src_specials = True; } else if (globals.warn_spec_now) XDVI_WARNING((stderr, "Special \"%s\" not implemented.", cp)); } #undef CMD Boolean scan_special(char *cp, int cp_len, void *data) { char *p; Boolean dummy_ret = True; /* currently unused; FIXME: use return value to avoid redundant calls (instead of longjmp()) */ UNUSED(cp_len); /* TODO: could probably utilize this in call to htex_prescan_special() */ ASSERT(data != NULL, "Must pass a data pointer when using HTEX"); if (globals.debug & DBG_PS) printf("Scanning special `%s'.\n", cp); while (isspace((int)*cp)) ++cp; /* Ignore initial "xdvi:" */ if (memcmp(cp, "xdvi:", 5) == 0) { cp += 5; while (isspace((int)*cp)) ++cp; } if (memicmp(cp, "ps:", 3) == 0) { Boolean found; cp += 3; /* check for hdvips hyperlinks */ if (memicmp(cp, "sdict begin ", strlen("sdict begin ")) == 0) { static Boolean hypertex_too_old = False; char *match = NULL; cp += strlen("sdict begin "); if (strstr(cp, "HyperStart") != NULL) hypertex_too_old = True; if (hypertex_too_old) return False; if (memcmp(cp, "H.S", 3) == 0 || memcmp(cp, "H.R", 3) == 0 || memcmp(cp, "H.B", 3) == 0 /* following 2 conditions could be more restrictive: between `begin' and H.A/H.L, there should be a single number (baselineskip in pt) */ || (match = strstr(cp, "H.A")) != NULL || (match = strstr(cp, "H.L")) != NULL || (match = strstr(cp, "/Action")) != NULL || (match = strstr(cp, "/Link")) != NULL || (match = strstr(cp, "/View")) != NULL) { if (match != NULL) found = htex_prescan_special(match, cp_len, data); else found = htex_prescan_special(cp, cp_len, data); } } } else if (memicmp(cp, "html:", strlen("html:")) == 0) { Boolean found; size_t offset = strlen("html:"); found = htex_prescan_special(cp + offset, cp_len - offset, data); /* if searching for a specific string, return as soon as it's found - not yet implemented */ #if 0 if (my_data != NULL && my_data->scan_type == HTEX_ANCHOR_STRING && found) { return True; } #endif } /* do the following only if not searching for an anchor string */ if (((struct htex_prescan_data *)data)->scan_type != HTEX_ANCHOR_STRING) { #if PS # if COLOR if (scanned_page_ps <= scanned_page) # endif { if (*cp == '!') { scan_bang(cp); return dummy_ret; } else if (memicmp(cp, "header", 6) == 0 && (p = endofcommand(cp + 6)) != NULL) { scan_header(p); return dummy_ret; } } #endif /* PS */ #if COLOR # if PS if (scanned_page_color <= scanned_page) # endif { if (memicmp(cp, "background ", 11) == 0) { scan_bg_color(cp); return dummy_ret; } else if (memicmp(cp, "color ", 6) == 0) { scan_color(cp); return dummy_ret; } } #endif /* COLOR */ if (memcmp(cp, "papersize", 9) == 0 && (p = endofcommand(cp + 9)) != NULL) { m_have_papersize_special = True; scan_papersize(p); return dummy_ret; } } return dummy_ret; } /* #define xspell_conv(n) spell_conv0(n, current_dimconv) */ #define xpixel_conv(x) ((int) ((x) >> 16)) #define G_PXL_H xpixel_conv(currinf.data.dvi_h) /* cp is not const, because of endofcommand(). */ void geom_do_special(struct scan_info *info, char *cp, double current_dimconv) { const char *p; struct geom_info *g_info = (struct geom_info *)info->data; UNUSED(current_dimconv); while (isspace((int)*cp)) ++cp; /* Ignore initial "xdvi:" */ if (memcmp(cp, "xdvi:", 5) == 0) { cp += 5; while (isspace((int)*cp)) ++cp; } if (memicmp(cp, "psfile", 6) == 0 && (p = endofcommand(cp + 6)) != NULL) { /* compute epsf bounding box */ char c; int flags = 0; double keyval[6]; c = *p; if (c == '\'' || c == '"') { do ++p; while (*p != '\0' && *p != c); } else while (*p != '\0' && !isspace((int)*p)) ++p; while (isspace((int)*p)) ++p; while (*p != '\0') { const char *p1 = p; size_t keyno; while (*p1 != '=' && !isspace((int)*p1) && *p1 != '\0') ++p1; for (keyno = 0; keyno < NKEYS; ++keyno) { if (memcmp(p, keytab[keyno], p1 - p) == 0) { if (keyno >= N_ARGLESS_KEYS) { while (isspace((int)*p1)) ++p1; if (*p1 == '=') { ++p1; while (isspace((int)*p1)) ++p1; } if (keyno < N_ARGLESS_KEYS + 6) { keyval[keyno - N_ARGLESS_KEYS] = atof(p1); flags |= (1 << (keyno - N_ARGLESS_KEYS)); } while (!isspace((int)*p1) && *p1 != '\0') ++p1; } break; } } p = p1; while (!isspace((int)*p) && *p != '\0') ++p; while (isspace((int)*p)) ++p; } if ((flags & 0x30) == 0x30 || ((flags & 0x30) && (flags & 0xf) == 0xf)) { long x = G_PXL_H; long y = PXL_V; long bbox_w; long bbox_h; bbox_w = 0.1 * ((flags & 0x10) ? KEY_RWI : KEY_RHI * (KEY_URX - KEY_LLX) / (KEY_URY - KEY_LLY)) * dimconv + 0.5; bbox_h = 0.1 * ((flags & 0x20) ? KEY_RHI : KEY_RWI * (KEY_URY - KEY_LLY) / (KEY_URX - KEY_LLX)) * dimconv + 0.5; g_info->geom_box(info, x, y - bbox_h, x + bbox_w, y); } } else if (memicmp(cp, "ps::[begin]", 11) == 0) { /* compute psfig bounding box */ long bbox_w, bbox_h; if (sscanf(cp + 11, "%ld %ld\n", &bbox_w, &bbox_h) >= 2) { long x = G_PXL_H; long y = PXL_V; bbox_w = xpixel_conv(spell_conv(bbox_w)); bbox_h = xpixel_conv(spell_conv(bbox_h)); g_info->geom_box(info, x, y, x + bbox_w, y + bbox_h); } } } xdvik-ja-22.84.16-j1.40/texk/xdvik/t1mapper0000775000175000017500000002473710363262237017663 0ustar uwabamiuwabami#!/usr/bin/perl -w # # This program maps full PS font names to abreviated TeX style names # and puts font files or links to font files in a file hierarchy # suitable for texk. # # Mapping example: Times-Roman.{gsf,pfa,pfb} becomes ptmr.{pfa,pfb} # use File::Path; # These are the fontname map files to read # This is for the fontname distribution in teTeX 0.4: # @fonts=qw(adobe apple bitstrea dtc linotype monotype skey1250 skey1555 # softkey urw); # This is for fontname 2.2, get it from ftp.tug.org:/tex/fontname-2.2 # The linotype map in teTeX 1.0 is terebly corrupted. Removed from the list. @fonts=qw(adobe apple bitstrea dtc monotype softkey-1250 softkey-1555 urw wolfram yandy); $logname="t1mapper.log"; # How much to read from font files to figure out the font name $fontdatalen=1024*10; # use $TMPDIR if set by user if (defined($ENV{TMPDIR})) { $tempdir=$ENV{TMPDIR}; } else { $tempdir="/tmp"; } # HERE BE DRAGONS usage() if $#ARGV==0; # By default copy files $method=1; while ($_=shift(@ARGV)) { /^-cp$/ && do { $method=1; next; }; /^-ln$/ && do { $method=2; next; }; /^-lns$/ && do { $method=3; next; }; /^-lnlns$/ && do { $method=4; next; }; /^-lncp$/ && do { $method=5; next; }; /^-gs$/ && do { $gsmap = shift(@ARGV) or usage(); $gsdir = shift(@ARGV) or usage(); next; }; unshift(@ARGV,$_); last; } $texdir = shift(@ARGV) or usage(); if (! -d $texdir) { print "Making directory $texdir\n"; mkpath($texdir) or die "Could not make directory: $texdir: $!\n"; } if (!open(LOG,">$logname")) { $logname="$tempdir/$logname"; open(LOG,">$logname") || die "Could not open file $logname for writing: $!\n"; } # What major mode of operation? # Establish fonts based on ghostscript map? if ($gsmap) { process_gsfonts(); print "Log in $logname\n"; exit 0; } # Ok, loop examine fonts to figure out the font name and copy/link to $texdir process_fontname_maps(); process_fonts(); print "Log in $logname\n"; exit 0; # ############################### MOVE_FONT ################################ sub move_font { # Move font to destination directory, according to specified $method my($from)=shift; my($to)=shift; my($relok)=shift; my($other); # Same font, other format my($type); # Other type die "I need absolute paths please\n" if !$relok && substr($from,0,1) ne '/'; logmsg("$from -> $to\n"); # Remove the old font to replace with this unlink($to) if -f $to; # Also remove the old font in the other format: $other=$to; $type='.pfb' if substr($to,-4) eq '.pfa'; $type='.pfa' if !$type && substr($to,-4) eq '.pfb'; substr($other,-4)=$type; unlink($other) if -f $other; if ($method==1) { # cp system "cp $from $to 2>/dev/null" and # Shell exit value warn "Copying $from to $to failed\n"; } elsif ($method==2) { # ln link($from,$to) or die "Linking of $to to $from failed: $!\n"; } elsif ($method==3) { # lns symlink($from,$to) or die "Symlinking $to to $from failed: $!\n"; } elsif ($method==4) { # lnlns link($from,$to) || symlink($from,$to) || die "Both linking and symlinking $to to $from failed: $!\n"; } elsif ($method==5) { # lncp. Let cp give the error-message link($from,$to) || system "cp $from $to"; } else { die "Internal error: Unknown font copy/link method\n"; } } # ############################# PROCESS_FONTS ############################## sub process_fonts { # Loop over ARGV, examine each (font?) file to see if it is a # type1 font, binary or text format, and figure out it's name my($type,$font); foreach $filename (@ARGV) { ($type,$font)=examine_font($filename); next if !defined($font); if (!exists($file{$font})) { logmsg("TeX name of $font ($filename) unknown\n"); next; } $file=$file{$font}; move_font($filename,"$texdir/$file$type",0); } } # ############################## EXAMINE_FONT ############################## sub examine_font { # Examine font to determine name and type # # The method for finding the font name is based on an awk script # written years ago by Kjetil T. Homme and me (mostly him). # my($filename)=shift; my($type); my($size)=-s $filename; if ($size==0) { logmsg("Zero size file skipped: $filename\n"); return (undef,undef); } if (!open(FONT,"< $filename")) { logmsg("Unable to open $filename for reading: $!\n"); return (undef,undef); } sysread FONT, $fontdata, $fontdatalen, 0; # Determine type based on magic number $type='.pfa' if substr($fontdata,0,16) eq '%!PS-AdobeFont-1'; $type='.pfa' if !$type && substr($fontdata,0,13) eq '%!FontType1-1'; $type='.pfb' if !$type && substr($fontdata,6,16) eq '%!PS-AdobeFont-1'; if (!$type) { # This is where we end up if the file does not match the magic # numbers. The file is most probably not a type1 file. if ((index($fontdata,'%!PS-AdobeFont-1')==-1) && (index($fontdata,'%!FontType1-1')==-1)) { # If the string '%!PS-AdobeFont-1.0' or '%!FontType1-1.0' # does not appear at all this is NOT a type1 font of any # kind. logmsg("$filename is not a type1 file\n"); return (undef,undef); } logmsg("Odd magic in $filename\n"); # Try to determine type based on filename extention $type='.pfa' if substr($filename,-4) eq '.pfa'; $type='.pfb' if !$type && substr($filename,-4) eq '.pfb'; if (!$type) { # No extention? Fall back to perls -T (text) test operator. $type='.pfb'; $type='.pfa' if -T $filename; } } # The font type has now been determined. I wonder what the font's # name is. # What we look for is lines like this: # # %!PS-AdobeFont-1.0: URWGothicL-Demi 001.005 # # or this: # # /FontName /URWGothicL-Demi def $fontname=''; if ($fontdata =~ m~/FontName /([\S]+) def~) { # The /FontName line is the most reliable source $fontname = $1; } elsif ($fontdata =~ m/%\!PS-AdobeFont-1.0: ([\S]+)/) { # The magic line is not always fully formed and can only be # used as fallback --- in case the /FontName entry is not in # the file. True, this would be a rather dubious font. $fontname = $1; } elsif ($fontdata =~ m/%\!FontType1-1.0: ([\S]+)/) { # The magic line is not always fully (or correctly) formed and # can only be used as fallback --- in case the /FontName entry # is not in the file. True, this would be a rather dubious # font (actually, a lot of type1 versions of tex fonts fall # into this category). $fontname = $1; } return ($type,$fontname); } # ######################### PROCESS_FONTNAME_MAPS ########################## sub process_fontname_maps { # Read the fontname maps while ($foundry=shift(@fonts)) { $map=findfile($foundry.".map"); next unless $map; print "Reading (fontname/$foundry) $map\n"; open(FILE,"<$map") || die "Could not open $map: $!\n"; while () { chomp; s/@.*//; next if $_ eq ''; ($file,$font,undef)=split(/\s+/,$_,3); # Remove known encoding codes: $file =~ s/(8a|8r|8t)$//; # 8a = StandardEncoding 8a.enc # 8r = TeXBase1Encoding 8r.enc # 8t = CorkEncoding cork.enc # Any filenames with numbers left are 'unknown encodings' if ($file =~ /\d/) { # print "Unknown encoding: $file - $font\n"; next; } $file{$font}=$file; } close(FILE); } } # ########################### PROCESS_GSFONTS ############################# sub read_gsmap { # Read gs map file to obtain Font-Name -> filename mappings, and # aliases so we can use GS' Times-Roman replacement as Times-Roman # ourselves. Not everyone has oodles of type1 fonts on disk. my($gsmap)=shift; open(FILE,"<$gsmap") or die "Could not open $gsmap: $!\n"; print "Reading (gsmap) $gsmap\n"; %gsalias=(); %gsfile=(); while () { chomp; s/%.*//; s/\s+$//; next if $_ eq ''; ($font,$file,undef)=split(/\s+/,$_,3); $font =~ s~^/~~; if (!exists($file{$font})) { logmsg("TeX name of $font unknown\n"); next; } if ($file =~ m~\((.*)\)~) { $file = $1; $gsfile{$font}=$file; } else { $file =~ s~^/~~; # The aliases(sp?) cannot be resolved until the whole file is # read $gsalias{$font}=$file; } } close(FILE); } sub process_gsfonts { # Do the Work based on a ghostscript map file. process_fontname_maps(); read_gsmap($gsmap); chdir($gsdir) or die "Could not chdir to $gsdir: $!\n"; print "Moving fonts\n"; foreach $font (keys %gsfile) { $gsfile=$gsfile{$font}; # GSF files are not propper t1 fonts I understand, so ignore them next if $gsfile =~ /\.gsf$/; $file=$file{$font}; $type=''; if (-f $gsfile) { # Crude font type guessing. First based on existing extention: $type='pfa' if substr($gsfile,-4) eq '.pfa'; $type='pfb' if !$type && substr($gsfile,-4) eq '.pfb'; # If existing extention fails use perls -T (text) test if (!$type) { # print "Fallback typing: $gsfile\n"; $type='pfb'; $type='pfa' if -T $gsfile; } # Use for alias resolving $texname{$font}="$file.$type"; if (substr($gsfile,0,1) eq '/') { move_font("$gsfile","$texdir/".$texname{$font},0); } else { move_font("$gsdir/$gsfile","$texdir/".$texname{$font},0); } } else { logmsg("$file not found\n"); } } chdir($texdir) or die "Could not chdir to $texdir\n"; foreach $font (keys %gsalias) { $alias = $gsalias{$font}; $falias = $texname{$alias}; next unless $falias; $type='pfa' if substr($gsfile,-4) eq '.pfa'; $type='pfb' if !$type && substr($gsfile,-4) eq '.pfb'; $file=$file{$font}; # Symlink the aliases logmsg("$falias -> $file.$type\n"); $method=3; move_font($falias,"$file.$type",1); } } # ############################ JUNK PROCEDURES ########################### sub findfile { # Find file, use kpsewhich to access texmf database and search rules my($file)=shift; $fileloc=`kpsewhich $file`; # Check errors return undef if ($? != 0); chomp($fileloc); return undef if $fileloc eq ''; # It worked return $fileloc; } sub usage { # Abuse the user print "Usage: t1mapper [-cp|-ln|-lns|-lnlns|-lncp] \\ -gs /path/to/gs/Fontmap /path/to/gs/fonts \\ /path/to/target/tex/directory t1mapper [-cp|-ln|-lns|-lnlns|-lncp] \\ /path/to/target/tex/directory \\ See t1mapper(1) for more documentation "; exit 1; } sub logmsg { my($string)=shift; print STDERR "$string"; print LOG "$string"; } xdvik-ja-22.84.16-j1.40/texk/xdvik/special.h0000664000175000017500000000512010363262237017756 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef SPECIAL_H_ #define SPECIAL_H_ #include "xdvi-config.h" #include "xdvi.h" #include "events.h" extern Boolean scan_special(char *str, int str_len, void *data); #if PS struct psprocs { void (*toggle) (int flag); void (*destroy) (void); void (*interrupt) (void); void (*endpage) (void); void (*drawbegin) (int, int, const char *); void (*drawraw) (const char *); void (*drawfile) (const char *, FILE *); void (*drawend) (const char *); void (*beginheader) (void); void (*endheader) (void); void (*newdoc) (void); }; extern void ps_clear_cache(void); extern void ps_destroy(void); extern void drawbegin_none(int, int, const char *); extern void draw_bbox(void); extern void display_bboxes(void); extern void clear_bboxes(void); extern void save_bbox(void); #endif extern void applicationDoSpecial(char *str, size_t len); extern void geom_do_special(struct scan_info *, char *, double); extern void color_special(const char *colorspec); extern void init_prescan(void); /* info on whether this DVI file contains papersize specials, and a resetting method. */ extern void reset_papersize_special(void); extern Boolean have_papersize_special(void); #if COLOR extern void init_page_colors(struct rgb *foreground, struct rgb *background); extern void scan_color_eop(void); extern void scan_color(const char *color); struct rgb; /* forward declaration */ extern void set_fg_color(const struct rgb *); #endif #endif /* SPECIAL_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/xdvizilla0000775000175000017500000001141511032450154020114 0ustar uwabamiuwabami#! /bin/sh # # This is a kludge to fix helper apps in mozilla. See mozilla bugs #57420 # and also #78919. # # It's also useful for tar files with Netscape 4.x # # Copyright (c) 2002-2004 Paul Vojta # # 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 PAUL VOJTA OR ANY OTHER AUTHOR OF OR CONTRIBUTOR TO # THIS SOFTWARE 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. # Some changes suggested by Thomas Esser included by # . IN_FILE= NO_RM= TMP_DIR= progname=xdvizilla do_cleanup() { exit 0 exitval=$? if [ -z "$NO_RM" -a -n "$IN_FILE" ] ; then rm -f "$IN_FILE" fi test -n "$TMP_DIR" && rm -rf "$TMP_DIR" exit $exitval } do_abort() { xmessage -nearmouse "$progname: $1" do_cleanup exit 1 } usage() { xmessage -nearmouse "Usage: $progname [-no-rm] " do_cleanup exit 1 } # Solaris' file command fails to identify DVI files (bug #1508963), # so add an extra check for these; otherwise, output result of 'file' command. get_filetype() { f="$1" have_solaris=`uname -a | grep -i sunos` if [ "$have_solaris"xxx = "xxx" ] then ret=`file "$f"` else # we're on solaris, get first 2 bytes of file magic=`od -N 2 -x "$f" | cut -d ' ' -f 2 | sed 1q | tr 'ABCDEF' 'abcdef'` case "$magic" in "f702" | "02f7") ret="TeX DVI file" ;; *) ret=`file "$f"` ;; esac fi echo "$ret" } trap 'do_cleanup' 1 2 3 7 13 15 ### create a temporary directory only read/writable by user ### try mktemp if it's available TMP_DIR=${TMPDIR-${TEMP-${TMP-/tmp}}}/${progname}.XXXXXX TMP_DIR=`mktemp -d "$TMP_DIR" 2> /dev/null` if [ $? -ne 0 ]; then ### fall back to unsafe creation TMP_DIR=${TMPDIR-${TEMP-${TMP-/tmp}}}/${progname}.$$ (umask 077; mkdir "$TMP_DIR") || do_abort "Could not create directory \`$TMP_DIR'" fi ### we hard-wire the magic for DVI files here since some "file" implementations ### (e.g. on Solaris 9) don't recognize DVI files (bug #1508963) TMP_MAGIC_FILE="$TMP_DIR"/tmp-magic ### Note: 3 tabs in the following line! echo '0 string \367\002 TeX DVI file' > "$TMP_MAGIC_FILE" if [ $# -gt 1 -a "x$1" = "x-no-rm" ]; then NO_RM=y shift fi if [ $# -ne 1 ]; then usage fi DIR=`dirname "$0"` if [ "$DIR" = . ]; then DIR= elif [ -f "$DIR"/xdvi -a -x "$DIR"/xdvi ]; then DIR="$DIR"/ else DIR= fi # set -x # need to preserve IN_FILE for eventual deletion IN_FILE="$1" TMP_FILE="$IN_FILE" while [ 1 ]; do [ -f "$TMP_FILE" ] || do_abort "$TMP_FILE: File not found." #FILETYPE=`file -m "$TMP_MAGIC_FILE" "$TMP_FILE"` FILETYPE=`get_filetype "$TMP_FILE"` case "$FILETYPE" in *"gzip compressed data"*) out="$TMP_DIR"/tmp-gz gunzip -c "$TMP_FILE" > "$out" TMP_FILE="$out" ;; *"compressed data"* | *"compress'd data"*) out="$TMP_DIR"/tmp-compress uncompress -c "$TMP_FILE" > "$out" TMP_FILE="$out" ;; "$TMP_FILE: empty") do_abort "$TMP_FILE is an empty file (probably a bug in Mozilla?)" ;; *" tar archive") ### do sanity checks on the tar archive, to avoid overwriting user files: dangerous=`tar tf "$TMP_FILE" | egrep '^(/|.*\.\./)'` [ -z "$dangerous" ] || do_abort "Tar file contains files with absolute paths or \`../' components, which may overwrite user files. Not unpacking it." ### also check for gzipped DVI files inside the archive ... out="$TMP_DIR"/`tar tf "$TMP_FILE" | egrep '\.(dvi|dvi.gz|dvi.Z)$' | head -1` if [ -z "$out" ]; then do_abort "Tar file does not contain a dvi file." else cat "$TMP_FILE" | (cd "$TMP_DIR"; tar xf -) TMP_FILE="$out" fi ;; *"DVI file"*) "$DIR"xdvi -safer "$TMP_FILE" break ;; *) do_abort "$TMP_FILE: Unrecognized file format!" ;; esac done do_cleanup exit 0 xdvik-ja-22.84.16-j1.40/texk/xdvik/x_util.c0000664000175000017500000010006511164427731017643 0ustar uwabamiuwabami#include "xdvi-config.h" #include #include #include #include #if !MOTIF # include #endif #include "x_util.h" #include "string-utils.h" #include "util.h" #include "statusline.h" #include "message-window.h" #include "events.h" /* for set_bar_value() */ #define DEBUG_SCROLL_IF_NEEDED 0 Boolean do_autoscroll = False; /* Center window wa over window wb */ void center_window(Widget wa, Widget wb) { Position x, y; Dimension w1, h1, w2, h2; if (!XtIsRealized(wa) || !XtIsRealized(wb)) return; XtVaGetValues(wa, XtNwidth, &w1, XtNheight, &h1, NULL); XtVaGetValues(wb, XtNwidth, &w2, XtNheight, &h2, XtNx, &x, XtNy, &y, NULL); XtVaSetValues(wa, XtNx, x + (w2 - w1) / 2, XtNy, y + (h2 - h1) / 2, NULL); } /* Position window w at coordinates x, y */ void position_window(Widget w, Position x, Position y) { if (!XtIsRealized(w)) return; TRACE_GUI((stderr, "positioning %ld at %d, %d", (unsigned long)w, x, y)); XtVaSetValues(w, XtNx, x, XtNy, y, NULL); } /* Used for the hyperref and forward search markers: scroll the page to make the marker visible. */ void scroll_page_if_needed(int x_min, int x_max, int y_min, int y_max) { Position drawing_x, drawing_y, drawing_h, clip_x, clip_y, clip_h, clip_w; int test_scroll, need_v_scroll = 0, need_h_scroll = 0; if (!do_autoscroll) return; XtVaGetValues(globals.widgets.clip_widget, XtNx, &clip_x, XtNy, &clip_y, XtNheight, &clip_h, XtNwidth, &clip_w, NULL); XtVaGetValues(globals.widgets.draw_widget, XtNx, &drawing_x, XtNy, &drawing_y, XtNheight, &drawing_h, NULL); #if DEBUG_SCROLL_IF_NEEDED fprintf(stderr, "y: %d, drawing_y: %d, clip_h: %d\n", y, drawing_y, clip_h); #endif /* check if we need to scroll vertically; first, down for y_min */ test_scroll = y_min + drawing_y - clip_h; if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0) test_scroll += get_statusline_height(); TRACE_SRC((stderr, "test_scroll vertically: %d", test_scroll)); #if DEBUG_SCROLL_IF_NEEDED fprintf(stderr, "%d + %d > %d?\n", drawing_y, y_min, clip_h); #endif if (test_scroll > 0) { /* need to scroll down? */ need_v_scroll = test_scroll; TRACE_SRC((stderr, "need_v_scroll down: %d", need_v_scroll)); } else if (abs(drawing_y) + 2 > y_max) { /* need to scroll up? */ need_v_scroll = -((abs(drawing_y) - y_max) + 1); TRACE_SRC((stderr, "need_v_scroll up: %d (%d > %d; %d)", need_v_scroll, abs(drawing_y), y_max, clip_y)); } /* check if we need to scroll horizontally; x_min < 0 blocks this (e.g. for hyperref, where we don't want it) */ if (x_min >= 0) { test_scroll = x_min + drawing_x - clip_w + 1; TRACE_SRC((stderr, "test_scroll horizontally: %d", test_scroll)); if (test_scroll > 0) { /* need to scroll to right (i.e. make stuff on right-hand side visible)? */ need_h_scroll = test_scroll; TRACE_SRC((stderr, "need_h_scroll right: %d", need_h_scroll)); } else if (abs(drawing_x) > x_max) { /* need to scroll to left (i.e. make stuff on left-hand side visible)? */ need_h_scroll = -(abs(drawing_x) - x_max); TRACE_SRC((stderr, "need_h_scroll left: %d", need_h_scroll)); } } /* FIXME: should we not scroll if keep_flag is active? */ if (need_v_scroll != 0 && globals.widgets.y_bar != NULL) { #ifdef MOTIF /* need to add new value to current one */ XtVaGetValues(globals.widgets.y_bar, XmNvalue, &test_scroll, NULL); (void)set_bar_value(globals.widgets.y_bar, test_scroll + need_v_scroll, (int)(globals.page.h - mane.height)); #else XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(need_v_scroll)); #endif } if (need_h_scroll != 0 && globals.widgets.x_bar != NULL) { #ifdef MOTIF /* need to add new value to current one */ XtVaGetValues(globals.widgets.x_bar, XmNvalue, &test_scroll, NULL); (void)set_bar_value(globals.widgets.x_bar, test_scroll + need_h_scroll, (int)(globals.page.w - mane.width)); #else XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(need_h_scroll)); #endif } do_autoscroll = False; } void adjust_width(Widget a, Widget b) { Dimension w1, w2; XtVaGetValues(a, XtNwidth, &w1, NULL); XtVaGetValues(b, XtNwidth, &w2, NULL); if (w1 < w2) XtVaSetValues(a, XtNwidth, w2, NULL); else if (w2 > w1) XtVaSetValues(b, XtNwidth, w1, NULL); } /* change a GC and return it, or create one if it doesn't exist yet */ GC set_or_make_gc(GC gc, int function, Pixel fg, Pixel bg) { XGCValues values; values.function = function; values.foreground = fg; values.background = bg; /* Since print is in round dots we make drawings as "smooth" as possible. */ values.cap_style = CapRound; values.join_style = JoinRound; if (gc != NULL) XChangeGC(DISP, gc, GCFunction | GCForeground | GCBackground | GCCapStyle | GCJoinStyle, &values); else gc = XCreateGC(DISP, XtWindow(globals.widgets.top_level), GCFunction | GCForeground | GCBackground | GCCapStyle | GCJoinStyle, &values); return gc; } /* * Atom handling. */ static char *atom_names[] = { "XDVI_WINDOWS", "DVI_NAME", "SRC_GOTO", "RELOAD", "NEWDOC", "NEWPAGE", "RAISE", "FIND_STRING", "REREAD_PREFS" }; static Atom atoms[XtNumber(atom_names)]; Window get_window_id(char *window_p) { Window w; unsigned char *tmp; tmp = (unsigned char *)window_p; #if !(defined(WORD64) || defined(LONG64)) w = (*((xuint32 *) window_p)); #else # if WORDS_BIGENDIAN w = ((unsigned long)tmp[0] << 24) | ((unsigned long)tmp[1] << 16) | ((unsigned long)tmp[2] << 8) | (unsigned long)tmp[3]; # else w = ((unsigned long)tmp[3] << 24) | ((unsigned long)tmp[2] << 16) | ((unsigned long)tmp[1] << 8) | (unsigned long)tmp[0]; # endif #endif return w; } size_t property_get_data(Window w, Atom a, char **ret_buf, int (*x_get_property)(Display *, Window, Atom, long, long, Bool, Atom, Atom *, int *, unsigned long *, unsigned long *, unsigned char **)) { /* all of these are in 8-bit units */ unsigned long byte_offset = 0; Atom type_ret; int format_ret; unsigned long nitems_ret; unsigned long bytes_after_ret = 0; unsigned char *prop_ret = NULL; /* * buffer for collecting returned data; this is static to * avoid expensive malloc()s at every call (which is often!) */ static unsigned char *buffer = NULL; static size_t buffer_len = 0; while (x_get_property(DISP, w, a, byte_offset / 4, (bytes_after_ret + 3) / 4, False, a, &type_ret, &format_ret, &nitems_ret, &bytes_after_ret, &prop_ret) == Success) { if (type_ret != a || format_ret == 0) break; nitems_ret *= (format_ret / 8); /* convert to bytes */ while ((byte_offset + nitems_ret) >= buffer_len) { buffer_len += 256; buffer = xrealloc(buffer, buffer_len); } /* the +1 captures the extra '\0' that Xlib puts after the end. */ memcpy(buffer + byte_offset, prop_ret, nitems_ret + 1); byte_offset += nitems_ret; XFree(prop_ret); prop_ret = NULL; if (bytes_after_ret == 0) /* got all data */ break; } if (prop_ret != NULL) XFree(prop_ret); *ret_buf = (char *)buffer; return byte_offset; } size_t property_get_window_list(char **window_list) { size_t len = property_get_data(DefaultRootWindow(DISP), atom_xdvi_windows(), window_list, XGetWindowProperty); if (len == 0) { TRACE_CLIENT((stderr, "No \"xdvi windows\" property found")); return 0; } if (len % 4 != 0) { TRACE_CLIENT((stderr, "\"XDVI_WINDOWS\" property had incorrect size; deleting it.")); XDeleteProperty(DISP, DefaultRootWindow(DISP), atom_xdvi_windows()); return 0; } return len; } void set_window_id(Window w, unsigned char *data) { #if WORDS_BIGENDIAN data[0] = (unsigned int)w >> 24; data[1] = (unsigned int)w >> 16; data[2] = (unsigned int)w >> 8; data[3] = (unsigned int)w; #else data[0] = (unsigned int)w; data[1] = (unsigned int)w >> 8; data[2] = (unsigned int)w >> 16; data[3] = (unsigned int)w >> 24; #endif } /** ** set_dvi_property sets the appropriate property for the main ** window (used in source special handoff). **/ void set_dvi_property(void) { XChangeProperty(DISP, XtWindow(globals.widgets.top_level), atom_dvi_file(), atom_dvi_file(), 8, PropModeReplace, (unsigned char *)dvi_property, dvi_property_length); } /* * Delete all occurences of window w from the window list property. Then, * if `prepend' is true, prepend the window ID to the existing list. */ void update_window_property(Window w, Boolean prepend) { char *wlist; size_t wlist_len; char *wlist_end; char *wp; #if 0 int i; #endif /* 0 */ /* this allocates wlist */ if ((wlist_len = property_get_window_list(&wlist)) == 0) return; /* Loop over list of windows. */ wlist_end = wlist + wlist_len; #if 0 for (i = 0, wp = wlist; wp < wlist_end; wp += 4, i++) { fprintf(stderr, "WIN %d: %08lx; len: %d\n", i, get_window_id(wp), wlist_len); } #endif /* 0 */ for (wp = wlist; wp < wlist_end; wp += 4) { if (get_window_id(wp) == w) { /* match, remove our ID */ wlist_len -= 4; wlist_end -= 4; memmove(wp, wp + 4, wlist_end - wp); wp -= 4; /* new item is now at wp; don't skip it in next iteration */ } } if (prepend) { /* add our ID again to front */ #if (defined(WORD64) || defined(LONG64)) unsigned char data[4]; set_window_id(w, data); #else xuint32 data = w; #endif /* Note: no need to realloc wlist, since the original length was sufficient for all elements. */ memmove(wlist + 4, wlist, wlist_len); wlist_len += 4; memcpy(wlist, &data, 4); } if (wlist_len == 0) XDeleteProperty(DISP, DefaultRootWindow(DISP), atom_xdvi_windows()); else XChangeProperty(DISP, DefaultRootWindow(DISP), atom_xdvi_windows(), atom_xdvi_windows(), 32, PropModeReplace, (unsigned char *)wlist, wlist_len / 4); XFlush(DISP); } void property_initialize(void) { size_t i; #if XlibSpecificationRelease >= 6 if (!XInternAtoms(DISP, atom_names, XtNumber(atom_names), False, atoms)) XDVI_FATAL((stderr, "XtInternAtoms failed.")); #else for (i = 0; i < XtNumber(atom_names); i++) { if ((atoms[i] = XInternAtom(DISP, atom_names[i], False)) == None) XDVI_FATAL((stderr, "XtInternAtoms failed.")); } #endif if (globals.debug & DBG_CLIENT) { for (i = 0; i < XtNumber(atom_names); i++) TRACE_CLIENT((stderr, "Atom(%s) = %lu", atom_names[i], atoms[i])); } } Atom atom_xdvi_windows(void) { return atoms[0]; } Atom atom_dvi_file(void) { return atoms[1]; } Atom atom_src_goto(void) { return atoms[2]; } Atom atom_reload(void) { return atoms[3]; } Atom atom_newdoc(void) { return atoms[4]; } Atom atom_newpage(void) { return atoms[5]; } Atom atom_raise(void) { return atoms[6]; } Atom atom_find_string(void) { return atoms[7]; } Atom atom_reread_prefs(void) { return atoms[8]; } /* * Syntesize a mouse-1 down event for the Widget w passed as second argument. * This can be, e.g. a dialog button, or some other window. */ void synthesize_event(XEvent *ev, Widget w) { memset(ev, 0, sizeof(XButtonPressedEvent)); ev->type = ButtonPress; ev->xbutton.serial = 1; ev->xbutton.send_event = True; ev->xbutton.button = 1; ev->xbutton.display = XtDisplayOfObject(w); ev->xbutton.window = XtWindowOfObject(w); } #ifdef MOTIF int xm_get_height(Widget w) { int ret_h = 0; static Dimension h0, h1, h2; static Arg args[] = { {XmNheight, (XtArgVal) &h0}, {XmNmarginHeight, (XtArgVal) &h1}, {XmNshadowThickness, (XtArgVal) &h2}, }; ASSERT(w != NULL, "widget in xm_get_width mustn't be NULL!"); XtGetValues(w, args, XtNumber(args)); ret_h = h0 + 2 * h1 + 2 * h2; TRACE_GUI((stderr, "xm_get_height: %d", ret_h)); return ret_h; } int xm_get_width(Widget w) { int ret_w = 0; static Arg args = { XtNwidth, (XtArgVal)0 }; ASSERT(w != NULL, "widget in xm_get_width mustn't be NULL!"); args.value = (XtArgVal)&ret_w; XtGetValues(w, &args, 1); TRACE_GUI((stderr, "xm_get_width: %d", ret_w)); return ret_w; } /* * Get pixel from color `colorname'. We try to keep this as * high-level as possible, with simple black as fallback. */ void str_to_pixel(Widget w, const char *colorname, Pixel *ret) { XrmValue from, to; from.addr = (char *)colorname; from.size = strlen(from.addr) + 1; to.addr = (XtPointer)ret; to.size = sizeof(Pixel); if (!XtConvertAndStore(w, XtRString, &from, XtRPixel, &to)) { fprintf(stderr, "String to pixel conversion failed for %s!\n", colorname); from.addr = (char *)"black"; from.size = strlen(from.addr) + 1; to.addr = (XtPointer)ret; to.size = sizeof(Pixel); XtConvertAndStore(w, XtRString, &from, XtRPixel, &to); } } /* * Convert pixel value `pix' to color name passed as str, * of length len, or `black' if conversion failed. * -- FIXME: This is broken!!! */ void pixel_to_str(Widget w, Pixel pix, char *str, size_t len) { XrmValue from, to; from.addr = (XtPointer)&pix; from.size = sizeof(Pixel); to.addr = str; to.size = len; if (!XtConvertAndStore(w, XtRString, &from, XtRPixel, &to)) { fprintf(stderr, "Pixel to String conversion failed for %ld!\n", pix); sprintf(str, "white"); } } /* Free color, and initialize it anew with pixel value `pix' */ void pixel_to_color(Pixel pix, XColor *color, Display *display, Colormap colormap) { XColor test; test.pixel = pix; XQueryColor(display, colormap, &test); color->red = test.red; color->green = test.green; color->blue = test.blue; if (!XAllocColor(display, colormap, color)) { fprintf(stderr, "Fatal: Couldn't XAllocColor!"); exit(1); } } #endif /* MOTIF */ /* helper routine for get_matching_parent() */ static Widget matches_parent(Widget w, const char *name) { for (; w != NULL; w = XtParent(w)) { char *ptr; ptr = XtName(w); TRACE_GUI((stderr, "parent: %s", ptr == NULL ? "" : ptr)); if (ptr != NULL && strcmp(ptr, name) == 0) { /* found */ TRACE_GUI((stderr, "match!")); break; } } TRACE_GUI((stderr, "returning: %p (0x%lx)", (void *)w, w ? XtWindow(w) : 0)); return w; } /* Traverse widget hieararchy upwards until a widget matches a name in the (NULL-terminated) list fmt, or Widget d (`default') if none is found. */ Widget get_matching_parent(Widget w, Widget d, const char *fmt, ...) { Widget parent = d; const char *str = fmt; va_list argp; va_start(argp, fmt); TRACE_GUI((stderr, "get_matching_parent of %p (0x%lx)", (void *)w, XtWindow(w))); while (str != NULL) { Widget p; if ((p = matches_parent(w, str)) != NULL) { parent = p; break; } str = va_arg(argp, char *); } va_end(argp); return parent; } void adjust_width_to_max(Widget w, ...) { Dimension max = 0; Widget w1 = w; va_list argp; va_start(argp, w); /* get maximum width */ while (w1 != NULL) { Dimension curr; XtVaGetValues(w1, XtNwidth, &curr, NULL); if (curr > max) max = curr; w1 = va_arg(argp, Widget); } va_end(argp); /* set maximum width */ va_start(argp, w); w1 = w; while (w1 != NULL) { XtVaSetValues(w1, XtNwidth, max, NULL); w1 = va_arg(argp, Widget); } va_end(argp); } /* Return True if p is a parent of widget w, stopping (and returning FALSE) if s is reached (which should be the toplevel window of the hierarchy). */ Boolean widget_is_parent(Widget w, Widget p, Widget s) { Widget curr = XtParent(w); while (curr != NULL && curr != s) { fprintf(stderr, "Comparing: %p - %p\n", (void *)curr, (void *)p); if (curr == p) return True; curr = XtParent(curr); } return False; } /* Adjust height in a NULL-terminated list of widgets. For Motif, this works better than the following adjust_vertically(). */ void adjust_heights(Widget w, ...) { va_list ap; Widget curr; Dimension h, max; ASSERT(w != NULL, "Must have at least one element in va_list for adjust_heights!"); #if MOTIF #define HEIGHT XmNheight #else #define HEIGHT XtNheight #endif /* initialize maximum */ XtVaGetValues(w, HEIGHT, &max, NULL); /* get maximum height */ va_start(ap, w); while ((curr = va_arg(ap, Widget)) != NULL) { XtVaGetValues(curr, HEIGHT, &h, NULL); if (h > max) max = h; } va_end(ap); /* set maximum height for all widgets */ XtVaSetValues(w, HEIGHT, max, NULL); va_start(ap, w); while ((curr = va_arg(ap, Widget)) != NULL) XtVaSetValues(curr, HEIGHT, max, NULL); va_end(ap); #undef HEIGHT } /* Adjust height in a NULL-terminated list of widgets. For Motif, this works better than the following adjust_vertically(). */ void adjust_heights_min(Widget w, ...) { va_list ap; Widget curr; Dimension h, min; ASSERT(w != NULL, "Must have at least one element in va_list for adjust_heights!"); #if MOTIF #define HEIGHT XmNheight #else #define HEIGHT XtNheight #endif /* initialize minimum */ XtVaGetValues(w, HEIGHT, &min, NULL); /* get minimum height */ va_start(ap, w); while ((curr = va_arg(ap, Widget)) != NULL) { XtVaGetValues(curr, HEIGHT, &h, NULL); if (h < min) min = h; } va_end(ap); /* set maximum height for all widgets */ XtVaSetValues(w, HEIGHT, min, NULL); va_start(ap, w); while ((curr = va_arg(ap, Widget)) != NULL) XtVaSetValues(curr, HEIGHT, min, NULL); va_end(ap); #undef HEIGHT } /* adjust two widgets vertically */ void adjust_vertically(Widget w1, Widget w2, int default_dist) { Dimension h1, h2; #if MOTIF XtVaGetValues(w1, XmNheight, &h1, NULL); XtVaGetValues(w2, XmNheight, &h2, NULL); XtVaSetValues(w1, XmNtopOffset, default_dist + (h2 - h1) / 2, NULL); /* XtVaSetValues(w2, XmNtopOffset, default_dist + (h2 - h1) / 2, NULL); */ #else XtVaGetValues(w1, XtNheight, &h1, NULL); XtVaGetValues(w2, XtNheight, &h2, NULL); XtVaSetValues(w1, XtNvertDistance, default_dist + (h2 - h1) / 2, NULL); XtVaSetValues(w2, XtNvertDistance, default_dist + (h2 - h1) / 2, NULL); #endif /* MOTIF */ } /* * This is a hack to block further processing of some events on widgets: * Add as an event handler for all mouse/key events for a specific widget. */ void block_event_callback(Widget w, XtPointer client_data, XEvent *ev, Boolean *cont) { UNUSED(w); UNUSED(client_data); UNUSED(ev); /* Don't propagate this event further down... */ *cont = False; return; } /* Get a widget with `name' somewhere in the widget hierarchy below `parent' (matching is done against `*name') and return it in `ret'. If `report_error' is True, a warning message is popped up if the widget isn't found. */ Boolean get_widget_by_name(Widget *ret, Widget parent, const char *name, Boolean report_error) { char buf[1024]; Widget test; /* if (parent == 0 || !XtIsManaged(parent)) { */ /* fprintf(stderr, "Widget %p not managed!\n", parent); */ /* return False; */ /* } */ if (strlen(name) > 1023) { popup_message(globals.widgets.top_level, MSG_ERR, REPORT_XDVI_BUG_TEMPLATE, "Widget name `%s' too long, couldn't get parent", name); return False; } buf[0] = '*'; /* add wildcard to also match paths */ strcpy(buf + 1, name); if ((test = XtNameToWidget(parent, buf)) != NULL) { *ret = test; return True; } else { if (report_error) popup_message(globals.widgets.top_level, MSG_ERR, REPORT_XDVI_BUG_TEMPLATE, "XtNameToWidget failed for `%s', parent `%s'", name, XtName(parent)); return False; } } void unexpected_widget_in_callback(Widget w, const char *callback) { ASSERT(w != NULL, "Widget mustn't be NULL!"); popup_message(globals.widgets.top_level, MSG_ERR, REPORT_XDVI_BUG_TEMPLATE, "Unexpected widget `%s' in callback `%s'", XtName(w), callback); } static XrmDatabase m_user_db = NULL; /* * Merge the resource `name' with a value specified by `fmt' into * the database `db' (if db == NULL, use m_user_db). */ void store_preference(XrmDatabase *db, const char *name, const char *fmt, ...) { size_t offset = strlen("xdvi."); size_t name_len = strlen(name); char *name_buf = xmalloc(name_len + offset + 1); char *buf = NULL; XrmDatabase tmp_db = NULL; if (db == NULL) db = &m_user_db; XDVI_GET_STRING_ARGP(buf, fmt); memcpy(name_buf, "xdvi.", offset); strcpy(name_buf + offset, name); TRACE_GUI((stderr, "storing resource: `%s: %s'", name_buf, buf)); XrmPutStringResource(&tmp_db, name_buf, buf); XrmMergeDatabases(tmp_db, db); free(buf); free(name_buf); } void merge_into_user_db(XrmDatabase db) { XrmMergeDatabases(db, &m_user_db); } const char *const xdvirc_filename = ".xdvirc"; const char *const xdvirc_signature_line = "!!! ~/.xdvirc, used by xdvi(1) to save user preferences.\n"; const char *const xdvirc_header = "" "!!!\n" "!!! Do not edit this file, it will be overwritten by xdvi.\n" "!!! This file contains resources that have been set via the\n" "!!! menus/dialogs. The contents of this file will override\n" "!!! the entries in your ~/.Xdefaults file (but not the command\n" "!!! line arguments passed to xdvi). Remove this file\n" "!!! if you want to get rid of all these customizations,\n" "!!! or start xdvi with the `-q' option to ignore this file.\n" "!!!\n"; static char * get_xdvirc_path(const char *basename) { const char *homedir; size_t len; char *str; if (basename == NULL) return NULL; homedir = getenv("HOME"); len = strlen(homedir) + strlen(basename) + 2; /* 1 more for '/' */ str = xmalloc(len); sprintf(str, "%s/%s", homedir, basename); return str; } static void save_geometry(void) { int x_off, y_off; Dimension w, h; Window dummy; /* char *geom_str; */ (void)XTranslateCoordinates(DISP, XtWindow(globals.widgets.top_level), RootWindowOfScreen(SCRN), 0, 0, &x_off, &y_off, &dummy); XtVaGetValues(globals.widgets.top_level, XtNwidth, &w, XtNheight, &h, #ifdef MOTIF /* XmNgeometry, &geom_str, */ #endif NULL); TRACE_GUI((stderr, "geometry: %dx%d+%d+%d", w, h, x_off, y_off)); store_preference(NULL, "windowSize", "%dx%d", w, h); } /* Save user preferences to ~/.xdvirc. If `backup_only' is True, it only writes to ~/.xdvirc.tmp and does not remove this temporary file (this is used for synchronization between several xdvi instances). */ Boolean save_user_preferences(Boolean full_save) { char testbuf[1024]; char *xdvirc_name; char *tmpname; FILE *from_fp, *to_fp; int fd; if (resource.no_init_file || m_user_db == NULL) /* nothing to do */ return True; if (resource.remember_windowsize) save_geometry(); xdvirc_name = get_xdvirc_path(xdvirc_filename); if ((to_fp = fopen(xdvirc_name, "r")) != NULL) { TRACE_GUI((stderr, "~/.xdvirc exists, checking file contents ...")); if (fgets(testbuf, 1024, to_fp) != NULL && memcmp(testbuf, xdvirc_signature_line, strlen(xdvirc_signature_line)) != 0) { popup_message(globals.widgets.top_level, MSG_WARN, "Xdvi uses the file ~/.xdvirc to save the preferences set via " "the menu bar or the preferences dialog (in the Motif version only). " "To avoid overwriting files created by the user, the first line of the " "file is compared with a special signature line. If that signature line " "is not found, the preferences won't be written. Your file doesn't seem " "to contain that signature line. You should move the file to a safe location, " "and then try to quit xdvi again.", /* message */ "The file `%s' was apparently not written by xdvi(k). " "Please move or delete this file first, then try to exit xdvi again. ", xdvirc_name); return False; } fclose(to_fp); } /* don't use xdvi_temp_fd here, since XrmPutFileDatabase() closes the FILE*, creating a temp race */ tmpname = xstrdup(xdvirc_name); tmpname = xstrcat(tmpname, ".tmp"); /* since XrmPutFileDatabase doesn't give a useful error message if it fails, check that creating the file works beforehand. The file is created with 0600 permissions. */ if ((fd = try_open_mode(tmpname, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) < 0) { XDVI_ERROR((stderr, "Could not save preferences!\nOpening %s for writing failed: %s", tmpname, strerror(errno))); return True; } close(fd); XrmPutFileDatabase(m_user_db, tmpname); if (full_save) { if ((from_fp = try_fopen(tmpname, "r")) == NULL) { XDVI_ERROR((stderr, "Could not save preferences!\nOpening %s for reading failed: %s", tmpname, strerror(errno))); return True; } /* again, create the file with 600 permissions */ if ((fd = try_open_mode(xdvirc_name, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) < 0) { XDVI_ERROR((stderr, "Could not save preferences!\nOpening %s for writing failed: %s", xdvirc_name, strerror(errno))); return True; } if ((to_fp = fdopen(fd, "w")) == NULL) { XDVI_ERROR((stderr, "Could not save preferences!\nfdopen for %s for writing failed: %s", xdvirc_name, strerror(errno))); return True; } if (fputs(xdvirc_signature_line, to_fp) == EOF || fputs(xdvirc_header, to_fp) == EOF || !copy_fp(from_fp, to_fp)) { XDVI_ERROR((stderr, "Could not save preferences!\nError writing to %s: %s", xdvirc_name, strerror(errno))); } fclose(from_fp); fclose(to_fp); } free(xdvirc_name); if (full_save) unlink(tmpname); free(tmpname); return True; } /* * Read the user preferences from xdvirc_filename and merge them into the * current resource database *and* into m_user_db so that all of them are * saved again when xdvi exits. */ void read_user_preferences(Widget toplevel, const char *filename) { char *fullpath; XrmDatabase db; #if XtSpecificationRelease == 4 XrmDatabase file_db; #endif fullpath = get_xdvirc_path(filename); TRACE_GUI((stderr, "Reading resources from `%s'", fullpath)); db = XtDatabase(XtDisplay(toplevel)); #if XtSpecificationRelease == 4 file_db = XrmGetFileDatabase(fullpath); XrmMergeDatabases(file_db, &db); XrmMergeDatabases(file_db, &m_user_db); #else /* Xt >= X11R5 */ XrmCombineFileDatabase(fullpath, &db, True); XrmCombineFileDatabase(fullpath, &m_user_db, True); #endif free(fullpath); } /* * Routines for running as source-special client. */ static unsigned long xdvi_next_request = 0; static int xerrno; static int (*XdviOldErrorHandler)(Display *, XErrorEvent *); static int XdviErrorHandler(Display *d, XErrorEvent *event) { if (event->serial != xdvi_next_request || event->error_code != BadWindow) return XdviOldErrorHandler(d, event); xerrno = 1; return 0; } static int XdviGetWindowProperty(Display *display, Window w, Atom property, long long_offset, long long_length, Bool delete, Atom req_type, Atom *actual_type_return, int *actual_format_return, unsigned long *nitems_return, unsigned long *bytes_after_return, unsigned char **prop_return) { int retval; xdvi_next_request = NextRequest(display); xerrno = 0; retval = XGetWindowProperty(display, w, property, long_offset, long_length, delete, req_type, actual_type_return, actual_format_return, nitems_return, bytes_after_return, prop_return); return (xerrno != 0 ? BadWindow : retval); } /* helper function to set a string property of type `prop' for window `win' */ void set_string_property(const char *str, Atom prop, Window win) { XChangeProperty(DISP, win, prop, prop, 8, PropModeReplace, (const unsigned char *)str, strlen(str)); XFlush(DISP); /* necessary to get the property set */ } /* * Check for another running copy of xdvi. If same_file is true, return * the window ID of that other instance only if it has currently loaded the * same file; else, return 0. * If same_file is false, return the first valid xdvi window ID. */ Window get_xdvi_window_id(Boolean same_file, property_cbT callback) { char *window_list; size_t window_list_len; char *window_list_end; char *wp; char *p; Boolean need_rewrite = False; Window ret_window = 0; /* * Get window list. Copy it over (we'll be calling property_get_data() again). */ if ((window_list_len = property_get_window_list(&p)) == 0) return 0; window_list = xmalloc(window_list_len); memcpy(window_list, p, window_list_len); XdviOldErrorHandler = XSetErrorHandler(XdviErrorHandler); /* Loop over list of windows. */ window_list_end = window_list + window_list_len; TRACE_CLIENT((stderr, "My property: `%s'", dvi_property)); for (wp = window_list; wp < window_list_end; wp += 4) { Window w; char *buf_ret; size_t len; w = get_window_id(wp); TRACE_CLIENT((stderr, "Checking window %08lx", w)); len = property_get_data(w, atom_dvi_file(), &buf_ret, XdviGetWindowProperty); if (len == 0) { /* not getting back info for a window usually indicates that the application the window had belonged to had been killed with signal 9 */ TRACE_CLIENT((stderr, "Window %08lx: doesn't exist any more, deleting", w)); window_list_len -= 4; window_list_end -= 4; memmove(wp, wp + 4, window_list_end - wp); wp -= 4; /* new item is now at wp; don't skip it in next iteration */ need_rewrite = True; continue; } else { /* window still alive */ if (globals.debug & DBG_CLIENT) { #if 0 unsigned long ino; int i; ino = 0; for (i = 7; i >= 0; --i) ino = (ino << 8) | (unsigned char)(buf_ret[i]); #endif TRACE_CLIENT((stderr, "Window %08lx: property: `%s'", w, buf_ret)); } /* invoke callback if given */ if (callback != NULL) { callback(w); } if (!same_file && ret_window == 0) { ret_window = w; if (callback == 0) /* can return early */ break; } else if (strcmp(buf_ret, dvi_property) == 0 && ret_window == 0) { /* match */ ret_window = w; if (callback == 0) /* can return early */ break; } } } XSetErrorHandler(XdviOldErrorHandler); if (need_rewrite) XChangeProperty(DISP, DefaultRootWindow(DISP), atom_xdvi_windows(), atom_xdvi_windows(), 32, PropModeReplace, (unsigned char *)window_list, window_list_len / 4); return ret_window; } Boolean clip_region(int *x, int *y, int *w, int *h) { #if 0 fprintf(stderr, "globals.win_expose.min_x: %d, globals.win_expose.max_x: %d, " "globals.win_expose.min_y: %d, globals.win_expose.max_y: %d\n", globals.win_expose.min_x, globals.win_expose.max_x, globals.win_expose.min_y, globals.win_expose.max_y); #endif /* check for <= so that we also return false if *w or *h == 0 */ if (*x + *w <= globals.win_expose.min_x || *x >= globals.win_expose.max_x || *y + *h <= globals.win_expose.min_y || *y >= globals.win_expose.max_y /* extra protection agains *w or *h == 0; don't know if this can actually happen ... */ || globals.win_expose.max_y == globals.win_expose.min_y || globals.win_expose.max_x == globals.win_expose.min_x) { return False; } if (*x < globals.win_expose.min_x) { *w -= globals.win_expose.min_x - *x; *x = globals.win_expose.min_x; } if (*x + *w > globals.win_expose.max_x) { *w = globals.win_expose.max_x - *x; } if (*y < globals.win_expose.min_y) { *h -= globals.win_expose.min_y - *y; *y = globals.win_expose.min_y; } if (*y + *h > globals.win_expose.max_y) { *h = globals.win_expose.max_y - *y; } return True; } Boolean clip_region_to_rect(XRectangle *rect) { int x = rect->x; int y = rect->y; int w = rect->width; int h = rect->height; Boolean ret = clip_region(&x, &y, &w, &h); if (ret) { rect->x = x; rect->y = y; rect->width = w; rect->height = h; } return ret; } Boolean window_is_mapped(Window w, Display *dpy) { XWindowAttributes xwa; return XGetWindowAttributes(dpy, w, &xwa) && xwa.map_state == IsViewable; } XtPointer cast_int_to_XtPointer(int i) { return (XtPointer)(ptrdiff_t)i; } xdvik-ja-22.84.16-j1.40/texk/xdvik/filehist.c0000664000175000017500000002642611032450154020143 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ /* List of recently visited files, initialized from X resource fileHistory and displayed in `File -> Open Recent' menu. */ #include #include "xdvi-config.h" #include "xdvi.h" #include "util.h" #include "dl_list.h" #include "my-snprintf.h" #include "string-utils.h" #include "dvi-init.h" #include "events.h" #include "message-window.h" #include "xm_menu.h" #include "xaw_menu.h" #include "filehist.h" /**************************************************************************** * * File-scope globals * ****************************************************************************/ /* list of files */ static struct dl_list *m_file_history = NULL; /* current size of the list */ static int m_file_history_length = 0; /* /\* current position in the list *\/ */ /* static int m_file_history_currpos = 0; */ /* item in above list */ struct file_history { char *filename; int pageno; }; #define DEBUG 1 /**************************************************************************** * * Private functions * ****************************************************************************/ static void file_history_show(struct dl_list *list) { if (globals.debug & DBG_FILES) { int n; fprintf(stderr, "======= File history:\n"); for (n = 0; list != NULL; list = list->next, n++) { struct file_history *item = (struct file_history *)(list->item); if (item == NULL) { fprintf(stderr, "item %d is NULL!\n", n); continue; } fprintf(stderr, "item %d: %d:%s\n", n, item->pageno, item->filename); } } } /**************************************************************************** * * Exported functions * ****************************************************************************/ void file_history_init(void) { char **fileinfo; size_t i; struct dl_list *head = NULL; m_file_history_length = 0; if (resource.file_history == NULL) return; fileinfo = get_separated_list(resource.file_history, "\n", False); for (i = 0; fileinfo[i] != NULL && i < (size_t)resource.file_history_size; i++) { struct file_history *item = xmalloc(sizeof *item); char *ptr; int pageno = strtol(fileinfo[i], &ptr, 10); TRACE_FILES((stderr, "FILEINFO: %s", fileinfo[i])); if (ptr == fileinfo[i]) { XDVI_WARNING((stderr, "Missing page number in resource line `%s'!\n", fileinfo[i])); pageno = 0; } else { while (isspace((int)*ptr)) ptr++; } item->pageno = pageno; item->filename = xstrdup(ptr); TRACE_FILES((stderr, "FILE: %d:%s", item->pageno, item->filename)); m_file_history = dl_list_insert(m_file_history, item); if (head == NULL) /* remember head position */ head = m_file_history; TRACE_FILES((stderr, "NEW ELEM: %p", (void *)m_file_history)); m_file_history_length++; free(fileinfo[i]); } free(fileinfo); m_file_history = head; file_history_show(m_file_history); } static Boolean equals_filename(const void *it, const void *fname) { const struct file_history *item = (const struct file_history *)it; const char *filename = (const char *)fname; return strcmp(item->filename, filename) == 0; } /* put new elem for filename `filename' and page number `page' at the front of the list. Return True if the addition caused the history to grow, else False (in case the item was only moved to the front). */ Boolean file_history_push(const char *filename) { int i; struct file_history *item = NULL; void *removed_data = NULL; struct file_history *removed_item = NULL; int len_bak = m_file_history_length; int count = 0; TRACE_FILES((stderr, "Pushing: |%s|", filename)); /* if list already contains an item with same filename, remove it */ m_file_history = dl_list_remove(m_file_history, filename, &count, &removed_data, equals_filename); if (count == 0) m_file_history_length++; removed_item = (struct file_history *)removed_data; file_history_show(m_file_history); TRACE_FILES((stderr, "current length: %d, max: %d", m_file_history_length, resource.file_history_size)); /* truncate list if it has reached its max length */ if (m_file_history_length > resource.file_history_size) { struct dl_list *listpos = m_file_history; struct dl_list *last_pos = listpos; for (i = 0; listpos != NULL && i < m_file_history_length; i++) { last_pos = listpos; listpos = listpos->next; } item = last_pos->item; /* reuse item */ TRACE_FILES((stderr, "Re-using item: |%s| -> |%s|", item->filename, filename)); item->filename = xrealloc(item->filename, strlen(filename) + 1); strcpy(item->filename, filename); (void)dl_list_remove_item(&last_pos); m_file_history_length--; } else if (removed_item != NULL) { TRACE_FILES((stderr, "Re-using item: |%s|\n", removed_item->filename)); item = removed_item; /* reuse item */ } else { item = xmalloc(sizeof *item); TRACE_FILES((stderr, "NEW item: |%s|\n", filename)); item->filename = xstrdup(filename); item->pageno = 0; } /* add new element at front of list */ m_file_history = dl_list_push_front(m_file_history, item); file_history_show(m_file_history); TRACE_FILES((stderr, "returning: %d < %d", len_bak, m_file_history_length)); return len_bak < m_file_history_length; } size_t file_history_size(void) { return m_file_history_length; } void file_history_set_page(int pageno) { struct dl_list *head; TRACE_FILES((stderr, "SETTING HEAD to %d", pageno)); file_history_show(m_file_history); head = dl_list_head(m_file_history); if (head != NULL) { struct file_history *item = (struct file_history *)head->item; TRACE_FILES((stderr, "Setting page of |%s| to %d", item->filename, pageno)); item->pageno = pageno; } } void file_history_set_page_at(int idx, int pageno) { int i; struct dl_list *listpos = dl_list_head(m_file_history); struct file_history *item; for (i = 0; listpos != NULL && i < idx; i++) { listpos = listpos->next; } if (listpos == NULL) { TRACE_FILES((stderr, "Asked for file at position %d, but only %d elements in list", idx, i - 1)); return; } item = (struct file_history *)listpos->item; TRACE_FILES((stderr, "set_page_at index %d: Setting page of |%s| to %d", idx, item->filename, pageno)); item->pageno = pageno; } int file_history_get_page(void) { struct dl_list *head = dl_list_head(m_file_history); if (head != NULL) { struct file_history *item = (struct file_history *)head->item; TRACE_FILES((stderr, "Getting page of |%s|: %d", item->filename, item->pageno)); return item->pageno; } return 0; } /* * Invoke `callback' for each elem of file history, passing * the current index, filename, page number, and data passed to * this function. */ void file_history_enumerate(filehistCallbackT callback, void *data) { int i; struct dl_list *listpos = dl_list_head(m_file_history); for (i = 0; listpos != NULL; i++) { struct file_history *item = (struct file_history *)listpos->item; callback(i, item->filename, item->pageno, data); listpos = listpos->next; } } char * file_history_get_elem(int idx, int *ret_page) { int i; struct dl_list *listpos = dl_list_head(m_file_history); struct file_history *item; for (i = 0; listpos != NULL && i < idx; i++) { listpos = listpos->next; } if (listpos == NULL) { XDVI_WARNING((stderr, "Asked for file at position %d, but only %d elements in list", idx, i - 1)); return NULL; } item = (struct file_history *)listpos->item; *ret_page = item->pageno; file_history_show(m_file_history); return item->filename; } char * file_history_get_list(void) { char buf[LENGTH_OF_INT]; char *ret = xstrdup(""); struct dl_list *listpos; for (listpos = dl_list_head(m_file_history); listpos != NULL; listpos = listpos->next) { struct file_history *item = (struct file_history *)listpos->item; SNPRINTF(buf, LENGTH_OF_INT, "%d ", item->pageno); ret = xstrcat(ret, buf); ret = xstrcat(ret, item->filename); ret = xstrcat(ret, "\n"); } ret[strlen(ret) - 1] = '\0'; /* chop off excess \n at end */ return ret; } void file_history_open(const char *fname) { Boolean tried_dvi_ext = True; char *new_dvi_name = NULL; int dummy_cnt = 0; void *dummy_data = NULL; file_history_set_page(current_page); if ((new_dvi_name = open_dvi_file_wrapper(fname, True, /* pretend file is from commandline, otherwise xdvi will try to fork for non-existing files, leading to confusing popup error messages */ False, &tried_dvi_ext, True /* don't exit on error */)) == NULL) { /* remove this item from the file history */ m_file_history = dl_list_remove(m_file_history, fname, &dummy_cnt, &dummy_data, equals_filename); m_file_history_length--; file_history_show(m_file_history); filehist_menu_refresh(); return; } else { dviErrFlagT errflag; if (load_dvi_file( #if !DELAYED_MKTEXPK True, #endif &errflag)) { /* page_history_insert(pageno); */ set_dvi_name(new_dvi_name); globals.ev.flags |= EV_NEWDOC; globals.ev.flags |= EV_FILEHIST_GOTO_PAGE; } else { /* re-open old file */ popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Could not open `%s': %s.\n" /* "Removing this file from the history." */, globals.dvi_name, get_dvi_error(errflag)); /* remove this item from the file history */ m_file_history = dl_list_remove(m_file_history, globals.dvi_name, &dummy_cnt, &dummy_data, equals_filename); m_file_history_length--; filehist_menu_refresh(); if (!internal_open_dvi(globals.dvi_name, &errflag, True #if DELAYED_MKTEXPK , True #endif )) { popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Couldn't reopen `%s': %s.\n" /* "Removing this file from the history." */, globals.dvi_name, get_dvi_error(errflag)); /* remove this item from the file history */ m_file_history = dl_list_remove(m_file_history, globals.dvi_name, &dummy_cnt, &dummy_data, equals_filename); m_file_history_length--; filehist_menu_refresh(); } else { globals.ev.flags |= EV_NEWPAGE; } } } } xdvik-ja-22.84.16-j1.40/texk/xdvik/tfmload.c0000664000175000017500000000654011032450154017755 0ustar uwabamiuwabami/* This code was stolen from dvips for xdvi use. The file itself did * not carry any licensing info. According to other filed the code * either public domain, or, in the worst case, GPL. * * Loads a tfm file. It marks the characters as undefined. * * Modified for use by xdvi/t1 by Nicolai Langfeldt */ #include #include "xdvi-config.h" #include "xdvi.h" #include "util.h" #include "tfmload.h" #ifdef T1LIB #include "kpathsea/tex-file.h" int fallbacktfm = 0; Boolean tfmload(const char *name, long *design, long *widths, long *fontdimen2) { int i; int li; int nw, hd; int bc, ec; int f_param_off, f_param_num; long wtab[256]; unsigned short chardat[256]; char *filename; FILE *curfnt; fallbacktfm = 0; filename = kpse_find_tfm(name); if (filename == NULL) { filename = kpse_find_tfm("cmr10.tfm"); if (fallbacktfm == 0) fallbacktfm = 1; } if (filename == NULL) return False; curfnt = XFOPEN(filename, "r"); if (curfnt == NULL) return False; /* Next, we read the font data from the tfm file, and store it in * our own array. */ /* Lengths section, 16 bit unsigned quanities */ li = get_bytes(curfnt, 2); /* lf = length of file, in words(4 bytes) */ hd = get_bytes(curfnt, 2); /* lh = length of header data, in words */ bc = get_bytes(curfnt, 2); /* bc = lowest charcode */ ec = get_bytes(curfnt, 2); /* ec = largest charcode */ nw = get_bytes(curfnt, 2); /* nw = number of width words */ f_param_off = get_bytes(curfnt, 2); /* nh = number of height words */ f_param_off += get_bytes(curfnt, 2); /* nd = number of depth words */ f_param_off += get_bytes(curfnt, 2); /* ni = number of italic words */ f_param_off += get_bytes(curfnt, 2); /* nl = number of words in lig/kern table */ f_param_off += get_bytes(curfnt, 2); /* nk = number of words in the kern table */ f_param_off += get_bytes(curfnt, 2); /* ne = number of words in the extensible char tab */ f_param_num = get_bytes(curfnt, 2); /* np = number of font parameter words */ /* Header, 32 bit signed quantities */ (void)get_bytes(curfnt, 4); /* header[0]: checksum */ *design = get_bytes(curfnt, 4); /* header[1]: design size */ /* Skip the rest: header[2..(hd-1)] */ for (i = 2; i < hd; i++) li = get_bytes(curfnt, 4); /* Initialize to undef value */ for (i = 0; i < 256; i++) { chardat[i] = 256; widths[i] = 0; } /* The charinfo array: */ for (i = bc; i <= ec; i++) { chardat[i] = get_byte(curfnt); /* 8 bits of width index */ (void)get_byte(curfnt); /* skip */ (void)get_bytes(curfnt, 2); /* skip, jump */ } /* The (compressed!) width table */ for (i = 0; i < nw; i++) wtab[i] = get_bytes(curfnt, 4); /* skip to font parameter words */ for (i = 0; i < f_param_off; i++) (void)get_bytes(curfnt, 4); /* read fontdimen2 (width of space) */ for (i = 0; i < f_param_num; i++) { long l = get_bytes(curfnt, 4); if (i == 1) { *fontdimen2 = l; if (globals.debug & DBG_T1) fprintf(stderr, "fontdimen2 of %s: %ld\n", filename, *fontdimen2); } } (void)fclose(curfnt); /* Now we have the table and the indexes. Expand into a directly mapped width array */ for (i = bc; i <= ec; i++) if (chardat[i] != 256) widths[i] = wtab[chardat[i]]; return True; } #endif /* T1LIB */ xdvik-ja-22.84.16-j1.40/texk/xdvik/xserver-info.h0000664000175000017500000000024510363262237020770 0ustar uwabamiuwabami#ifndef XSERVER_INFO_H_ #define XSERVER_INFO_H_ #ifdef XSERVER_INFO extern void print_xserver_info(void); #endif /* XSERVER_INFO */ #endif /* XSERVER_INFO_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/xdvi-sh.in0000664000175000017500000000350711730166030020077 0ustar uwabamiuwabami#!/bin/sh # This is the xdvi wrapper script for teTeX, version 0.2. # Copyright Thomas Esser, 1998. Permission to distribute under the terms # of the GNU general public license version 2 or later. # This script sets some environment variables to make sure that xdvi's # resource file in $XDVIINPUTS/xdvi is read by xdvi.bin. test -f /bin/sh5 && test -z "$RUNNING_SH5" \ && test x"`(uname -s) 2>&1`" = xULTRIX \ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; } RUNNING_SH5= test -f /bin/bsh && test -z "$RUNNING_BSH" \ && test x"`(uname -s) 2>&1`" = xAIX \ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; } RUNNING_BSH= # -help and -version only used to work if they were the only options, # so the "-name xdvi" parameter wasn't used in that case. With current # xdvik, it should work in any case, but we keep this logic for compatibility # with older xdvik and plain xdvi versions. have_basename=`basename foo/bar 2>&1 | grep -i 'not found'` if [ "$have_basename"xxx = "xxx" ]; then BASE_NAME=`basename $0` else BASE_NAME=`echo $0 | sed 's!.*/!!'` fi case "$#:$1" in 1:-help|1:-version) NAMEOPT=;; *) NAMEOPT="-name $BASE_NAME";; esac xdviappfile=`kpsewhich -progname=xdvi --format='other text files' XDvi` if test -n "$xdviappfile"; then xdviappdir=`dirname "$xdviappfile"` xdviapppath="${xdviappdir}/%l_%t/%N:${xdviappdir}/%N" # For R3, we have to set XAPPLRESDIR. ### SU: removed, xdvik won't work with R3 anyway, and XAPPLRESDIR is ### for user customizations in current X ### XAPPLRESDIR="$xdviappdir"; export XAPPLRESDIR # For R4 or later, we have to set XFILESEARCHPATH, since XAPPLRESDIR might # be ignored (if XUSERFILESEARCHPATH is set) XFILESEARCHPATH="$xdviapppath:${XFILESEARCHPATH-%D}"; export XFILESEARCHPATH fi exec xdvi.bin $NAMEOPT ${1+"$@"} xdvik-ja-22.84.16-j1.40/texk/xdvik/c-auto.in0000664000175000017500000002745211742727337017732 0ustar uwabamiuwabami/* c-auto.in. Generated from configure.ac by autoheader. */ /* Define to use A4 as the default paper size. */ #undef A4 /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Define to the length (in bytes) of type BMTYPE. */ #undef BMBYTES /* Define to determine the integer type to be used in bitmaps. The type used will be "unsigned BMTYPE". */ #undef BMTYPE /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID /* Define to enable support for color specials. */ #undef COLOR /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to point to the default command to use for printing (optional). */ #undef DEFAULT_DVIPS_PATH /* Define to point to the default command to use for printing (optional). */ #undef DEFAULT_PS2PDF_PATH /* Define if you are using Linux 2.1.xxx -- 2.2.8, or if you find it necessary. */ #undef FLAKY_SIGPOLL /* Define to enable greyscale anti-aliasing for shrunken bitmaps. */ #undef GREY /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ #undef HAVE_ASSERT_H /* Define to 1 if you have the `bcmp' function. */ #undef HAVE_BCMP /* Define to 1 if you have the `bcopy' function. */ #undef HAVE_BCOPY /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* 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_DLFCN_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the `fchdir' function. */ #undef HAVE_FCHDIR /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ #undef HAVE_FSEEKO /* Define to 1 if you have the `ftruncate' function. */ #undef HAVE_FTRUNCATE /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if you have the `getpwnam' function. */ #undef HAVE_GETPWNAM /* Define to 1 if you have the `getpwuid' function. */ #undef HAVE_GETPWUID /* Define to 1 if you have the `getuid' function. */ #undef HAVE_GETUID /* Define to 1 if you have the `getwd' function. */ #undef HAVE_GETWD /* Define if your system allows setsid() within vfork(). */ #undef HAVE_GOOD_SETSID_VFORK /* Define if the vsnprintf function works. */ #undef HAVE_GOOD_VSNPRINTF /* Define to 1 if you have the `iconv' function. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_ICONV_H /* Define to 1 if you have the header file. */ #undef HAVE_IEEEFP_H /* Define to 1 if you have the `index' function. */ #undef HAVE_INDEX /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `isinf' function. */ #undef HAVE_ISINF /* Define to 1 if you have the header file. */ #undef HAVE_LANGINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the `lstat' function. */ #undef HAVE_LSTAT /* Define to 1 if you have the `memcmp' function. */ #undef HAVE_MEMCMP /* Define to 1 if you have the `memcpy' function. */ #undef HAVE_MEMCPY /* Define if the memicmp() function is in */ #undef HAVE_MEMICMP /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mkstemp' function. */ #undef HAVE_MKSTEMP /* Define to 1 if you have the `mktemp' function. */ #undef HAVE_MKTEMP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the `nl_langinfo' function. */ #undef HAVE_NL_LANGINFO /* Define if you have an old version of the Xaw library */ #undef HAVE_OLD_XAW /* Define if your system has and poll(). */ #undef HAVE_POLL /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if you have the header file. */ #undef HAVE_PWD_H /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH /* Define to 1 if you have the header file. */ #undef HAVE_REGEX_H /* Define to 1 if you have the `rindex' function. */ #undef HAVE_RINDEX /* Define to 1 if you have the header file. */ #undef HAVE_SELECT_H /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if you have the `sigaction' function. */ #undef HAVE_SIGACTION /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* 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 `strchr' function. */ #undef HAVE_STRCHR /* Define if your system has STREAMS (and if X uses it). */ #undef HAVE_STREAMS /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if cpp supports the ANSI # stringizing operator. */ #undef HAVE_STRINGIZE /* 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 you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if `st_mtim' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_MTIM /* Define to 1 if you have the header file. */ #undef HAVE_SYS_BSDTYPES_H /* 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_FCNTL_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_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the `ulltostr' function. */ #undef HAVE_ULLTOSTR /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF /* Define to 1 if you have the `waitpid' function. */ #undef HAVE_WAITPID /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define if the CODESET argument to nl_langinfo works. */ #undef HAVE_WORKING_NL_LANGINFO_CODESET /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_X11_INTRINSIC_H /* Define to 1 if you have the header file. */ #undef HAVE_X11_XMU_EDITRES_H /* Define to 1 if you have the header file. */ #undef HAVE_X11_XMU_XMU_H /* Define to 1 if you have the header file. */ #undef HAVE_X11_XOSDEFS_H /* Define if you have the header file. */ #undef HAVE_X11_XPM_H /* Define to 1 if you have the header file. */ #undef HAVE_XM_XPMP_H /* Define if you have the header file (not in X11, e.g. Solaris 5.8). */ #undef HAVE_XPM_H /* Define the type of the iconv input string (char ** or const char **) */ #undef ICONV_CHAR_PPTR_TYPE /* Define if your system allows multiple definitions of functions. */ #undef LD_ALLOWS_MULTIPLE_DEFINITIONS /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to use ImageMagick */ #undef MAGICK /* Define to use the Motif toolkit. */ #undef MOTIF /* 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 as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* The size of `unsigned char', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_CHAR /* The size of `unsigned int', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_INT /* The size of `unsigned long', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_LONG /* The size of `unsigned short', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_SHORT /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to compile in t1lib. */ #undef T1LIB /* Define to use Xaw panner. */ #undef USE_XAW_PANNER /* Define if you want to use the Xpm library */ #undef USE_XPM /* Version number of package */ #undef VERSION /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Define to use the Xaw toolkit. */ #undef XAW /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ #undef _LARGEFILE_SOURCE /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* 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 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 `int' if does not define. */ #undef pid_t /* Define to `long' if does not define. */ #undef ptrdiff_t /* Define to `unsigned int' if does not define. */ #undef size_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 as `fork' if `vfork' does not work. */ #undef vfork xdvik-ja-22.84.16-j1.40/texk/xdvik/xserver-info.c0000664000175000017500000002220211276240141020752 0ustar uwabamiuwabami/* Xserver debugging functions, lifted from X11 R6.6's xdpyinfo.c. Original copyright follows: */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. 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 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. * * Author: Jim Fulton, MIT X Consortium */ #include "xdvi.h" #include "xserver-info.h" #ifdef XSERVER_INFO static void print_display_info (Display *dpy) { char dummybuf[40]; char *cp; int minkeycode, maxkeycode; int i, n; /* long req_size; */ XPixmapFormatValues *pmf; Window focuswin; int focusrevert; printf("name of display: %s\n", DisplayString (dpy)); printf("version number: %d.%d\n", ProtocolVersion (dpy), ProtocolRevision (dpy)); printf("vendor string: %s\n", ServerVendor (dpy)); printf("vendor release number: %d\n", VendorRelease (dpy)); /* apparently AIX 3 does not have XExtendedMaxRequestSize. We don't really need it either. */ /* req_size = XExtendedMaxRequestSize (dpy); */ /* if (!req_size) req_size = XMaxRequestSize (dpy); */ /* printf("maximum request size: %ld bytes\n", req_size * 4); */ /* printf("motion buffer size: %lu\n", XDisplayMotionBufferSize (dpy)); */ switch (BitmapBitOrder (dpy)) { case LSBFirst: cp = "LSBFirst"; break; case MSBFirst: cp = "MSBFirst"; break; default: sprintf(dummybuf, "unknown order %d", BitmapBitOrder (dpy)); cp = dummybuf; break; } printf("bitmap unit: %d, bit order: %d (%s), padding: %d\n", BitmapUnit (dpy), BitmapBitOrder(dpy), cp, BitmapPad (dpy)); switch (ImageByteOrder (dpy)) { case LSBFirst: cp = "LSBFirst"; break; case MSBFirst: cp = "MSBFirst"; break; default: sprintf(dummybuf, "unknown order %d", ImageByteOrder (dpy)); cp = dummybuf; break; } printf("image byte order: %d (%s)\n", ImageByteOrder(dpy), cp); pmf = XListPixmapFormats (dpy, &n); printf("number of supported pixmap formats: %d\n", n); if (pmf) { printf("supported pixmap formats:\n"); for (i = 0; i < n; i++) { printf(" depth %d, bits_per_pixel %d, scanline_pad %d\n", pmf[i].depth, pmf[i].bits_per_pixel, pmf[i].scanline_pad); } XFree ((char *) pmf); } /* * when we get interfaces to the PixmapFormat stuff, insert code here */ XDisplayKeycodes (dpy, &minkeycode, &maxkeycode); printf("keycode range: minimum %d, maximum %d\n", minkeycode, maxkeycode); XGetInputFocus (dpy, &focuswin, &focusrevert); printf("focus: "); switch (focuswin) { case PointerRoot: printf("PointerRoot\n"); break; case None: printf("None\n"); break; default: printf("window 0x%lx, revert to ", focuswin); switch (focusrevert) { case RevertToParent: printf("Parent\n"); break; case RevertToNone: printf("None\n"); break; case RevertToPointerRoot: printf("PointerRoot\n"); break; default: /* should not happen */ printf("%d\n", focusrevert); break; } break; } /* print_extension_info (dpy); */ printf("default screen number: %d\n", DefaultScreen (dpy)); printf("number of screens: %d\n", ScreenCount (dpy)); } static void print_visual_info (XVisualInfo *vip) { char errorbuf[40]; /* for sprintfing into */ char *class = NULL; /* for printing */ switch (vip->class) { case StaticGray: class = "StaticGray"; break; case GrayScale: class = "GrayScale"; break; case StaticColor: class = "StaticColor"; break; case PseudoColor: class = "PseudoColor"; break; case TrueColor: class = "TrueColor"; break; case DirectColor: class = "DirectColor"; break; default: sprintf(errorbuf, "unknown class %d", vip->class); class = errorbuf; break; } printf(" visual:\n"); printf(" visual id: 0x%lx\n", vip->visualid); printf(" class: %s\n", class); printf(" depth: %d plane%s\n", vip->depth, vip->depth == 1 ? "" : "s"); if (vip->class == TrueColor || vip->class == DirectColor) printf(" available colormap entries: %d per subfield\n", vip->colormap_size); else printf(" available colormap entries: %d\n", vip->colormap_size); printf(" red, green, blue masks: 0x%lx, 0x%lx, 0x%lx\n", vip->red_mask, vip->green_mask, vip->blue_mask); printf(" significant bits in color specification: %d bits\n", vip->bits_per_rgb); } static void print_screen_info (Display *dpy, int scr) { Screen *s = ScreenOfDisplay (dpy, scr); /* opaque structure */ XVisualInfo viproto; /* fill in for getting info */ XVisualInfo *vip; /* retured info */ int nvi; /* number of elements returned */ int i; /* temp variable: iterator */ /* char eventbuf[80]; */ /* want 79 chars per line + nul */ static char *yes = "YES", *no = "NO", *when = "WHEN MAPPED"; double xres, yres; int ndepths = 0, *depths = NULL; unsigned int width, height; /* * there are 2.54 centimeters to an inch; so there are 25.4 millimeters. * * dpi = N pixels / (M millimeters / (25.4 millimeters / 1 inch)) * = N pixels / (M inch / 25.4) * = N * 25.4 pixels / M inch */ xres = ((((double) DisplayWidth(dpy,scr)) * 25.4) / ((double) DisplayWidthMM(dpy,scr))); yres = ((((double) DisplayHeight(dpy,scr)) * 25.4) / ((double) DisplayHeightMM(dpy,scr))); printf("\n"); printf("screen #%d:\n", scr); printf(" dimensions: %dx%d pixels (%dx%d millimeters)\n", DisplayWidth (dpy, scr), DisplayHeight (dpy, scr), DisplayWidthMM(dpy, scr), DisplayHeightMM (dpy, scr)); printf(" resolution: %dx%d dots per inch\n", (int) (xres + 0.5), (int) (yres + 0.5)); depths = XListDepths (dpy, scr, &ndepths); if (!depths) ndepths = 0; printf(" depths (%d): ", ndepths); for (i = 0; i < ndepths; i++) { printf("%d", depths[i]); if (i < ndepths - 1) { putchar (','); putchar (' '); } } putchar ('\n'); if (depths) XFree ((char *) depths); printf(" root window id: 0x%lx\n", RootWindow (dpy, scr)); printf(" depth of root window: %d plane%s\n", DisplayPlanes (dpy, scr), DisplayPlanes (dpy, scr) == 1 ? "" : "s"); printf(" number of colormaps: minimum %d, maximum %d\n", MinCmapsOfScreen(s), MaxCmapsOfScreen(s)); printf(" default colormap: 0x%lx\n", DefaultColormap (dpy, scr)); printf(" default number of colormap cells: %d\n", DisplayCells (dpy, scr)); printf(" preallocated pixels: black %lu, white %lu\n", BlackPixel (dpy, scr), WhitePixel (dpy, scr)); printf(" options: backing-store %s, save-unders %s\n", (DoesBackingStore (s) == NotUseful) ? no : ((DoesBackingStore (s) == Always) ? yes : when), DoesSaveUnders (s) ? yes : no); XQueryBestSize (dpy, CursorShape, RootWindow (dpy, scr), 65535, 65535, &width, &height); if (width == 65535 && height == 65535) printf(" largest cursor: unlimited\n"); else printf(" largest cursor: %dx%d\n", width, height); printf(" current input event mask: 0x%lx\n", EventMaskOfScreen (s)); /* (void) print_event_mask (eventbuf, 79, 4, EventMaskOfScreen (s)); */ nvi = 0; viproto.screen = scr; vip = XGetVisualInfo (dpy, VisualScreenMask, &viproto, &nvi); printf(" number of visuals: %d\n", nvi); printf(" default visual id: 0x%lx\n", XVisualIDFromVisual (DefaultVisual (dpy, scr))); for (i = 0; i < nvi; i++) { print_visual_info (vip+i); } if (vip) XFree ((char *) vip); } /* public function: when DBG_ALL is enabled, dump info on Xserver to stdout. */ void print_xserver_info(void) { int i; if (globals.debug & DBG_PK) { puts("========== Xserver properties info begin ==========\n"); print_display_info(DISP); for (i = 0; i < ScreenCount(DISP); i++) { print_screen_info(DISP, i); } puts("========== Xserver properties info end ==========\n"); } } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* XSERVER_INFO */ xdvik-ja-22.84.16-j1.40/texk/xdvik/string_list.c0000664000175000017500000000577011032450154020674 0ustar uwabamiuwabami#include #include #include #include "xdvi-config.h" #include "xdvi.h" #include "util.h" #include "string_list.h" /* * Helper functions for string lists */ char * string_list_to_str(char **list, const char *sep) { char *result = xstrdup(""); int i; for (i = 0; list[i] != NULL; i++) { result = xstrcat(result, list[i]); result = xstrcat(result, sep); } return result; } void string_list_print(char **list) { int i; for (i = 0; list != NULL && list[i] != NULL; i++) { fprintf(stderr, "List %d: |%s|\n", i, list[i]); } } /* * Reorder the list so that str (which is supposed to occur in the list somewhere) * is the first element. */ char ** string_list_reorder(char **list, char *str) { size_t i; char *tmp; Boolean found = False; for (i = 0; list[i] != NULL; i++) { if (strcmp(list[i], str) == 0) { found = True; break; } } if (!found) { XDVI_ERROR((stderr, "Item `%s' not found in list!\n", str)); return list; } tmp = list[0]; list[0] = str; list[i] = tmp; return list; } /* * Move the item at position idx to the start of the list, * by iteratively swapping it with its predecessor. */ char ** string_list_move_to_start(char **list, size_t idx) { size_t i; #if 0 for (i = 0; list[i] != NULL; i++) { fprintf(stderr, "list before: %d: |%s|\n", i, list[i]); } #endif for (i = idx; i > 0; i--) { char *tmp = list[i]; list[i] = list[i - 1]; list[i - 1] = tmp; } #if 0 for (i = 0; list[i] != NULL; i++) { fprintf(stderr, "list after: %d: |%s|\n", i, list[i]); } #endif return list; } /* * Rotate the list so that the first element is shifted to the end, * and all next elements are moved down by 1; e.g.: * before rotate: a b c d e f * after rotate: b c d e f a */ char ** string_list_rotate_down(char **list) { size_t i; char *tmp; tmp = list[0]; if (tmp == NULL) { return list; } for (i = 1; list[i] != NULL; i++) { list[i - 1] = list[i]; } list[i - 1] = tmp; return list; } /* * Rotate the list so that the last element is shifted to the beginning, * and all next elements are moved up by 1; e.g.: * before rotate: a b c d e f * after rotate: f a b c d e */ char ** string_list_rotate_up(char **list) { size_t i; char *tmp = NULL; if (list[0] == NULL) { return list; } /* go to end */ for (i = 0; list[i] != NULL; i++) { ; } i--; /* get last index */ tmp = list[i]; for (; i > 0; i--) { list[i] = list[i - 1]; } list[0] = tmp; return list; } char ** string_list_prepend(char **list, const char *str) { int i, k; /* reallocate with larger capacity */ for (i = 0; list[i] != NULL; i++) { ; } i++; list = xrealloc(list, (i + 1) * sizeof *list); /* shift old contents down */ for (k = i; k > 0; k--) { list[k] = list[k - 1]; } /* add new element at beginning */ list[0] = xstrdup(str); return list; } xdvik-ja-22.84.16-j1.40/texk/xdvik/events.h0000664000175000017500000002535511032450154017645 0ustar uwabamiuwabami/* * Copyright (c) 1990-2004 Paul Vojta and the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef EVENTS_H_ #define EVENTS_H_ /* * Flag values and masks for event_flags */ #define EV_IDLE (1<<0) /* 1 - non-event */ #define EV_CURSOR (1<<1) /* 2 - cursor needs to revert back to ready */ #define EV_EXPOSE (1<<2) /* 4 - expose occurred somewhere */ #define EV_MAG_MOVE (1<<3) /* 8 - magnifier moved */ #define EV_MAG_GONE (1<<4) /* 16 - magnifier gone while being drawn */ #define EV_ACK (1<<5) /* 32 - used internally */ #define EV_SRC (1<<6) /* 64 - source special operation is pending */ #define EV_ANCHOR (1<<7) /* 128 - anchor search is pending - should maybe move this up? */ #define EV_FIND (1<<8) /* 256 - string search */ #define EV_FIND_CANCEL (1<<9) /* 512 - string search cancelled */ #define EV_FILEHIST_GOTO_PAGE (1<<10) /* 1024 - get page from file history */ #define EV_PAGEHIST_INSERT (1<<11) /* 2048 - get page from file history */ #define EV_PAGEHIST_GOTO_PAGE (1<<12) /* 4096 - go to page from file history */ #define EV_NEWPAGE (1<<13) /* 8192 - new page requested */ #define EV_PS_TOGGLE (1<<14) /* 16384 - PostScript toggled on or off */ #define EV_RELOAD (1<<15) /* 32768 - reload dvi file */ #define EV_NEWDOC (1<<16) /* 65536 - new dvi file requested */ #define EV_TERM (1<<17) /* 131072 - quit */ #define EV_MAXPLUS1 (1<<18) /* 262144 - marker for highest element */ #define EV_GE_IDLE (EV_MAXPLUS1 - EV_IDLE) #define EV_GT_IDLE (EV_MAXPLUS1 - EV_CURSOR) #define EV_GE_CURSOR (EV_MAXPLUS1 - EV_CURSOR) #define EV_GE_EXPOSE (EV_MAXPLUS1 - EV_EXPOSE) #define EV_GE_MAG_MOVE (EV_MAXPLUS1 - EV_MAG_MOVE) #define EV_GE_MAG_GONE (EV_MAXPLUS1 - EV_MAG_GONE) #define EV_GE_ACK (EV_MAXPLUS1 - EV_ACK) #define EV_GE_FIND (EV_MAXPLUS1 - EV_FIND) #define EV_GE_FIND_CANCEL (EV_MAXPLUS1 - EV_FIND_CANCEL) #define EV_GE_NEWPAGE (EV_MAXPLUS1 - EV_NEWPAGE) #define EV_GE_PS_TOGGLE (EV_MAXPLUS1 - EV_PS_TOGGLE) #define EV_GE_NEWDOC (EV_MAXPLUS1 - EV_NEWDOC) #define EV_GE_RELOAD (EV_MAXPLUS1 - EV_RELOAD) #define EV_GE_TERM (EV_MAXPLUS1 - EV_TERM) #define EV_NOWAIT EV_GE_IDLE struct xio { struct xio *next; /* link to next in list */ int fd; /* file descriptor */ int xio_events; /* same as in struct pollfd (can't call it events because poll.h on AIX defines events to something else) */ #if HAVE_POLL struct pollfd *pfd; #endif char *(*read_proc) (int, void *); /* call to read from fd, or NULL */ void (*write_proc) (int, void *); /* call to write to fd, or NULL */ void *data; /* data passed as second argument to read_proc()/write_proc() */ }; struct xchild; /* forward declaration */ typedef void (*childProcT)(int exitval, struct xchild *this); struct xchild { struct xchild *next; /* link to next in list */ pid_t pid; /* pid of process, or 0 */ Boolean killable; /* if can be killed with SIGKILL */ char *name; /* name of process, for printing error message */ struct xio *io; /* pointer to i/o structure for reading error msg. */ void *data; /* arbitrary data passed to proc */ /* proc is a pointer to a function to call when the child exits; it will be * called with 2 arguments: * - The return status of the child * - A pointer to the current struct (so that the procedure can free() * (elements of) the struct when needed, or have access to the data field). */ childProcT proc; }; typedef enum xtimerT_ { XTM_DEFAULT = 0, XTM_STATUSLINE, XTM_HREF } xtimerT; struct xtimer { struct xtimer *next; /* link to next in chain */ struct timeval when; /* when to call the routine */ xtimerT type; /* timer type */ void (*proc) (struct xtimer *this, void *data); /* procedure to call */ void *data; #if XDVI_XT_TIMER_HACK XtTimerCallbackProc xt_proc; /* additional data for Xt callbacks */ XtPointer closure; #endif }; extern void set_timer(struct xtimer *tp, int ms); extern void cancel_timer(struct xtimer *tp); extern int get_num_actions(void); extern XtActionsRec *get_actions(void); extern int atopix(const char *, Boolean); extern int check_goto_page(int pageno, Boolean insert_into_pagehist); extern Boolean get_int_arg(String * param, Cardinal *num_params, int *res); extern Boolean toggle_arg(int arg, String * param, Cardinal *num_params); extern void clearexpose(struct WindowRec *windowrec, int x, int y, unsigned w, unsigned h); extern void expose(struct WindowRec *windowrec, int x, int y, unsigned int w, unsigned int h); extern void home(wide_bool); extern int set_bar_value(Widget bar, int value, int max); extern void reconfig(void); extern void redraw(struct WindowRec *windowrec); extern void handle_resize(Widget, XtPointer, XEvent *, Boolean *); extern void handle_expose(Widget, XtPointer, XEvent *, Boolean *); extern void handle_property_change(Widget, XtPointer, XEvent *, Boolean *); extern void handle_command(Widget widget, XtPointer client_data, XtPointer call_data); extern void showmessage(const char *); extern void set_chld(struct xchild *); extern void clear_chld(struct xchild *); extern void set_io(struct xio *); extern void clear_io(struct xio *); extern unsigned int read_events(unsigned int); typedef void (*home_proc) (wide_bool); extern void goto_page(int page, home_proc proc, Boolean force); extern void setup_sigalarm(void); extern void setup_signal_handlers(Boolean early); extern int shrink_to_fit(void); extern void do_pages(void); extern void do_set_density(double newgamma, Boolean force, Boolean update_resource); extern void do_toggle_color(Boolean update_resource); extern void Act_mouse_modes(Widget w, XEvent *event, String *params, Cardinal *num_params); #ifdef PS extern void Act_set_ps(Widget w, XEvent *event, String *params, Cardinal *num_params); #endif #ifdef PS_GS extern void Act_set_gs_alpha(Widget w, XEvent *event, String *params, Cardinal *num_params); #endif extern void Act_recent_files(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_htex_back(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_htex_forward(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_set_keep_flag(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_back_page(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_forward_page(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void do_set_shrinkfactor(int arg, Boolean set_resource); extern void Act_set_shrink_factor(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_shrink_to_dpi(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_set_expert_mode(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_use_tex_pages(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_ruler_mode(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_set_expert_mode(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_switch_mode(Widget w, XEvent *event, String *params, Cardinal *num_params); #if defined(NEW_MENU_CREATION) || defined(MOTIF) extern void Act_set_papersize(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_set_paper_landscape(Widget w, XEvent *event, String *params, Cardinal *num_params); #endif /* NEW_MENU_CREATION */ extern void Act_pagehistory_clear(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_pagehistory_back(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_pagehistory_forward(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_pagehistory_delete_backward(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_pagehistory_delete_forward(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_magnifier(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_ruler(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_text_selection(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_switch_magnifier_units(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_href(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void Act_href_newwindow(Widget w, XEvent *event, String *params, Cardinal *num_params); extern void null_mouse(XEvent *ignored); extern void text_motion(XEvent *event); typedef enum { TEXT_SEL_MOVE, TEXT_SEL_CLEAR, TEXT_SEL_REDRAW, TEXT_SEL_ERASE } textSelectionT; extern void text_change_region(textSelectionT mode, XEvent *event); extern void text_selection_start(XEvent *event); #if COLOR extern void update_expert_mode(void); extern Boolean check_resource_expert(void *val, const char *param); extern Boolean check_paper_landscape(void *val, const char *param); extern Boolean check_papersize(void *val, const char *param); extern Boolean check_toggle(void *val, const char *param); extern Boolean check_int(void *val, const char *param); #endif /* COLOR */ struct xdvi_action { XtActionProc proc; Cardinal num_params; String command; String param; struct xdvi_action *next; }; extern struct xdvi_action *compile_action(const char *str); extern void watch_file_cb(XtPointer client_data, XtIntervalId * id); extern void redraw_page(void); #ifdef USE_PANNER extern void handle_x_scroll(Widget w, XtPointer closure, XEvent *ev, Boolean *cont); extern void handle_y_scroll(Widget w, XtPointer closure, XEvent *ev, Boolean *cont); #endif extern void xdvi_exit_callback(Widget w, XtPointer client_data, XtPointer call_data); #endif /* EVENTS_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/xdvi.icon0000664000175000017500000000354110363262237020016 0ustar uwabamiuwabami#define xdvi_width 48 #define xdvi_height 48 static const unsigned char xdvi_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x01, 0x00, 0x00, 0xa2, 0xe0, 0x44, 0x38, 0x95, 0x13, 0x9e, 0x17, 0x45, 0x45, 0x55, 0xf4, 0x82, 0xf0, 0x28, 0x3d, 0xd5, 0x13, 0x82, 0x10, 0x28, 0x05, 0x55, 0x10, 0x82, 0xe0, 0x10, 0x39, 0x8a, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x79, 0x18, 0x18, 0x13, 0x16, 0x00, 0x69, 0x10, 0x18, 0x0e, 0x16, 0x00, 0xcf, 0x20, 0x1c, 0x0e, 0xd6, 0x00, 0xe9, 0xc3, 0x7b, 0x84, 0x3f, 0x01, 0x09, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08, 0x00, 0x00, 0x00, 0x70, 0xcc, 0x08, 0x00, 0x00, 0x00, 0x30, 0x52, 0x0a, 0x00, 0x00, 0x00, 0x30, 0x52, 0x0a, 0xc0, 0xff, 0x03, 0x30, 0x4c, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0a, 0xc0, 0xff, 0x03, 0x10, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0xf0, 0x17, 0x0b, 0x0c, 0x3c, 0xc0, 0x93, 0x20, 0x0c, 0x0e, 0x43, 0x20, 0x96, 0x40, 0x0c, 0x8e, 0x81, 0x10, 0x96, 0xbe, 0x0a, 0x8d, 0x81, 0x19, 0x90, 0x82, 0x8a, 0x8c, 0x81, 0x0d, 0x90, 0x42, 0x48, 0x8c, 0x81, 0xed, 0x91, 0x3e, 0x6a, 0x0c, 0xc3, 0x1d, 0x96, 0x12, 0x38, 0x0c, 0xbc, 0x0d, 0x1c, 0x02, 0xf8, 0x3f, 0x80, 0x0d, 0x1c, 0x3e, 0x0b, 0x0c, 0x80, 0x0c, 0x1c, 0x00, 0x0b, 0x0c, 0xc3, 0x18, 0x1c, 0x00, 0x0a, 0x0c, 0x63, 0x10, 0x16, 0x00, 0x89, 0x3f, 0x1e, 0xe0, 0x11, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xae, 0x0f, 0x00, 0x80, 0x84, 0x0a, 0xae, 0x87, 0x64, 0x86, 0x84, 0x08, 0x42, 0x42, 0x45, 0xe2, 0x1c, 0x07, 0x42}; xdvik-ja-22.84.16-j1.40/texk/xdvik/print-internal.h0000664000175000017500000000745711032450154021312 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 Paul Vojta and the xdvik development team * * 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 ANY AUTHO OF THIS SOFTWARE 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. */ #ifndef PRINT_INTERNAL_H_ #define PRINT_INTERNAL_H_ #include "dvi-init.h" typedef enum { FMT_PS, FMT_PS2PDF, FMT_DVI, FMT_ISO_8859_1, FMT_UTF8, FMT_NONE } outputFormatT; /* collection of all file IOs used in printing/saving */ struct file_info { char *tmp_dvi_file; /* temporary DVI file */ FILE *tmp_dvi_fp; /* FILE * for temporary DVI file */ char *tmp_ps_file; /* temporary PS file */ char *out_file; /* final output file */ /* FILE *out_fp; */ /* FILE * for final output file */ FILE *in_fp; /* FILE * for input file */ }; /* stacks for communication with selection routines */ struct specials_stack_elem { char *content; /* string content */ }; struct specials_stack { size_t stack_len; struct specials_stack_elem *items; }; typedef enum printRadioT_ { NO_PRINT_VAL = -1, TO_PRINTER = 1, TO_FILE } printRadioT; typedef enum pageRadioT_ { NO_PAGE_VAL = -1, PAGE_ALL = 1, PAGE_MARKED, PAGE_RANGE } pageRadioT; struct save_or_print_info; /* forward declaration */ /* wrapper struct which stores information about values the user has selected in the dialog. */ struct select_pages_info { int from; /* lower bound of page range to be selected */ int to; /* upper bound of page range to be selected */ /* struct file_info *finfo; \/\* additional file info pointer \*\/ */ /* callback function that says whether a page should be selected or not; will be passed a pointer to the current struct save_or_print_info, and the current page */ Boolean (*callback)(struct save_or_print_info *info, int page); struct specials_stack warn_files; /* collect warnings about included files */ dviErrFlagT errflag; /* collect all kinds of errors that can happen while copying */ }; typedef enum { FILE_PRINT = 0, FILE_SAVE = 1 } printOrSaveActionT; struct callback_info { XtCallbackProc cb_close; XtCallbackProc cb_cancel; XtCallbackProc cb_destroy; XtCallbackProc cb_keep; }; struct save_or_print_info { printOrSaveActionT act; /* whether we're printing or saving */ outputFormatT fmt; /* DVI/PS/... */ printRadioT print_target; /* to printer or to file */ pageRadioT page_selection; /* which pages: all/marked/range */ char *printer_options; /* printer name + options from text field */ char *dvips_options; /* dvips options from text field */ Widget shell; Widget message_popup; Widget printlog; struct select_pages_info *pinfo; struct callback_info *callbacks; struct file_info *finfo; }; extern void internal_print(struct save_or_print_info *info); extern void internal_save(struct save_or_print_info *info); #endif /* PRINT_INTERNAL_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/browser.c0000664000175000017500000001747611032450154020024 0ustar uwabamiuwabami/* routines for launching a browser to retrieve remote documents. * Copyright(C) 2002-2004 the xdvik development team. */ /* * 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "xdvi-config.h" #include "xdvi.h" #include #include "kpathsea/c-fopen.h" #include "kpathsea/c-stat.h" #include #include /* for waitpid(), WEXITSTATUS */ #include "util.h" #include "message-window.h" #include "events.h" #include "browser.h" #include "string-utils.h" #include "statusline.h" static const char *const default_browser_cmd = "xdg-open %s" ":htmlview %s" ":firefox -remote \"openURL(%s,new-window)\"" ":mozilla -remote \"openURL(%s,new-window)\"" ":netscape -remote \"openURL(%s,new-window)\"" ":xterm -e w3m %s" ":xterm -e lynx %s" ":xterm -e wget %s"; static Boolean do_fork_browser(char *argv[]) { pid_t pid; switch(pid = vfork()) { case -1: /* forking error */ perror("fork"); return False; case 0: /* child */ execvp(argv[0], argv); /* arrive here only if execvp failed */ XDVI_ERROR((stderr, "Execution of %s failed: %s", argv[0], strerror(errno))); _exit(EXIT_FAILURE); return False; /* notreached - make compiler happy */ default: /* parent */ { int timeout; for (timeout = 0; timeout < 15; timeout++) { int status; if (waitpid(pid, &status, WNOHANG)) { TRACE_HTEX((stderr, "waiting for %d: %d", (int)pid, status)); if (WIFEXITED(status)) { if (WEXITSTATUS(status) != 0) { fprintf(stderr, "Command `%s' exited with error status %d\n", argv[0], WEXITSTATUS(status)); return False; } else { TRACE_HTEX((stderr, "Child exited OK.")); return True; } } else { /* when do we arrive here?? */ sleep(1); } } else { /* waiting for child to finish */ sleep(1); } } return True; /* child not finished in time */ } } } static Boolean fork_browser(const char *browser, const char *url) { char *cmd, *orig_cmd, *last_arg; char **argv = NULL; int argv_len = 0; int i = 0, j = 0; int match = 0; int retval; cmd = xmalloc(strlen(browser) + strlen(url) + 1); orig_cmd = cmd; /* for freeing it later */ last_arg = cmd; /* skip over leading space */ while (isspace((int)browser[i])) i++; while (browser[i] != '\0') { while (j >= argv_len) { argv_len += 10; argv = xrealloc(argv, argv_len * sizeof *argv); } /* chop into separate arguments at spaces */ if (isspace((int)browser[i])) { *cmd++ = '\0'; argv[j++] = format_arg(last_arg, url, &match); last_arg = cmd; /* skip over multiple spaces */ while (isspace((int)browser[i])) i++; } /* remove quotes around arguments containing spaces */ else if (browser[i] == '\'' || browser[i] == '"') { int len = 0; /* normalize %% and replace %s by URL */ argv[j++] = unquote_arg(browser+i, url, &match, &len); if (len == 0) { /* excess quote at end of arg; try to recover: */ j--; break; } i += len + 1; } else { *cmd++ = browser[i++]; } } *cmd = browser[i]; /* null-teminate */ /* append last, unless it contained only skipped spaces */ if (strlen(last_arg) > 0) { argv[j++] = format_arg(last_arg, url, &match); } if (match == 0) argv[j++] = xstrdup(url); argv[j++] = NULL; for (i = 0; argv[i] != NULL; i++) { TRACE_HTEX((stderr, "arg[%d]: |%s|", i, argv[i])); } /* This will wait for child exits: */ retval = do_fork_browser(argv); for (i = 0; argv[i] != NULL; i++) free(argv[i]); free(orig_cmd); free(argv); return retval; } void launch_browser(const char *filename) { const char *browser; int pid; struct xchild *my_child; struct xio *my_io; int err_pipe[2]; /* try to set it from possible resources: First command-line argument or X resource, then environment variables, then default_browser_cmd */ for (;;) { if ((browser = resource.browser) != NULL) break; if ((browser = getenv("BROWSER")) != NULL) break; if ((browser = getenv("WWWBROWSER")) != NULL) break; XDVI_INFO((stderr, "Browser not set (xdvi.wwwBrowser, -browser or $BROWSER environment variable).")); XDVI_INFO((stderr, "Using built-in default: `%s'", default_browser_cmd)); browser = default_browser_cmd; break; } /* fork first time so that we can wait for children, without freezing the GUI. FIXME: this copies stuff from fork_process for the inter-process communication stuff - it would be better to have this in one function. */ my_child = xmalloc(sizeof *my_child); my_io = xmalloc(sizeof *my_io); statusline_info(STATUS_MEDIUM, "Trying to launch browser ..."); /* flush output buffers to avoid double buffering (i.e. data waiting in the output buffer being written twice, by the parent and the child) */ fflush(stdout); fflush(stderr); if (pipe(err_pipe) < 0) { perror("pipe"); _exit(-1); } switch (pid = fork()) { case -1: /* forking error */ perror("fork"); close(err_pipe[0]); close(err_pipe[1]); return; case 0: /* child */ { char *tmp_browser = xstrdup(browser); close(err_pipe[0]); /* no reading from stderr */ /* make stderr of child go to err_pipe[1] */ if (dup2(err_pipe[1], STDERR_FILENO) != STDERR_FILENO) { perror("dup2 for stderr"); _exit(EXIT_FAILURE); return; /* make compiler happy */ } /* BROWSER is a colon-separated list of commands, in decreasing preference; use the first that can be forked successfully. Note that the return value of the command isn't used at all (with GUI programs, xdvi shouldn't hang until they terminate!) */ while (tmp_browser != NULL) { char *next = strchr(tmp_browser, ':'); if (next != NULL) { *next++ = '\0'; } TRACE_HTEX((stderr, "trying browser |%s|", tmp_browser)); /* fork a second time to start the browser */ if (fork_browser(tmp_browser, filename)) { /* foking worked */ _exit(EXIT_SUCCESS); } tmp_browser = next; } /* child arrives here only if none of the commands worked */ XDVI_WARNING((stderr, "None of the browser commands in the `browser' resource (%s) worked\n", browser)); free(tmp_browser); _exit(EXIT_FAILURE); } default: /* parent */ close(err_pipe[1]); /* no writing to stderr */ my_io->next = NULL; my_io->fd = err_pipe[0]; my_io->xio_events = XIO_IN; #if HAVE_POLL my_io->pfd = NULL; #endif my_io->read_proc = read_child_error; my_io->write_proc = NULL; my_io->data = NULL; my_child->next = NULL; my_child->pid = pid; my_child->name = NULL; my_child->proc = handle_child_exit; my_child->data = NULL; my_child->io = my_io; set_chld(my_child); statusline_info(STATUS_MEDIUM, "Trying to launch browser ... done."); } } xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/0000775000175000017500000000000011730170101016736 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs_scroll.c0000664000175000017500000003771511276240141022327 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Panel 5 (Scrolling behaviour) for xdvik preferences dialog. */ #include "xdvi-config.h" #include "xdvi.h" #include "x_util.h" #include "xm_colorsel.h" #include "topic-window.h" #include "util.h" #include "events.h" #include "dvi-init.h" #include "statusline.h" #include "xm_prefsP.h" #include "xm_prefs_scroll.h" #include "my-snprintf.h" #ifdef MOTIF /* entire file */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* * Handy defaults */ static Arg one_of_many = { XmNindicatorType, XmONE_OF_MANY }; static void select_unit_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); Widget pulldown = XtParent(w); Widget form = XtParent(XtParent(pulldown)); Widget text_x, text_y; const char *w_name = XtName(w); UNUSED(call_data); fprintf(stderr, "setting name: %s\n", w_name); XtVaSetValues(pulldown, XmNuserData, (XtPointer)w_name, NULL); if (get_widget_by_name(&text_x, form, Xdvi_HOME_POSITION_X_OFF_TEXT, True) && get_widget_by_name(&text_y, form, Xdvi_HOME_POSITION_Y_OFF_TEXT, True)) { const char *buf_x = XmTextFieldGetString(text_x); const char *buf_y = XmTextFieldGetString(text_y); int val_x = strtol(buf_x, (char **)NULL, 10); int val_y = strtol(buf_y, (char **)NULL, 10); static char x_off[LENGTH_OF_INT + 16]; static char y_off[LENGTH_OF_INT + 16]; SNPRINTF(x_off, LENGTH_OF_INT + 16, "%s%s", buf_x, w_name); SNPRINTF(y_off, LENGTH_OF_INT + 16, "%s%s", buf_y, w_name); resource.sidemargin = x_off; resource.topmargin = y_off; resource.sidemargin_int = val_x; resource.topmargin_int = val_y; store_preference(&(prefs->db), "sideMargin", "%s", x_off); store_preference(&(prefs->db), "topMargin", "%s", y_off); globals.ev.flags |= EV_NEWPAGE; XFlush(DISP); XtFree((char *)buf_x); XtFree((char *)buf_y); } } static void set_offset_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); Widget form = XtParent(w); Widget pulldown; UNUSED(call_data); if (get_widget_by_name(&pulldown, form, Xdvi_HOME_POSITION_UNITS_PULLDOWN, True)) { char *ptr = NULL; const char *w_name = XtName(w); XtVaGetValues(pulldown, XmNuserData, &ptr, NULL); if (ptr == NULL) { XDVI_WARNING((stderr, "XmNuserData for %s is NULL in set_offset_cb()\n", Xdvi_HOME_POSITION_UNITS_PULLDOWN)); return; } fprintf(stderr, "UNIT: |%s|\n", ptr); if (strcmp(w_name, Xdvi_HOME_POSITION_X_OFF_TEXT) == 0) { static char x_off[LENGTH_OF_INT + 16]; const char *buf = XmTextFieldGetString(w); int val = strtol(buf, (char **)NULL, 10); SNPRINTF(x_off, LENGTH_OF_INT + 16, "%s%s", buf, ptr); XtFree((char *)buf); resource.sidemargin = x_off; resource.sidemargin_int = val; store_preference(&(prefs->db), "sideMargin", "%s", x_off); goto_page(current_page, resource.keep_flag ? NULL : home, True); } else if (strcmp(w_name, Xdvi_HOME_POSITION_Y_OFF_TEXT) == 0) { static char y_off[LENGTH_OF_INT + 16]; const char *buf = XmTextFieldGetString(w); int val = strtol(buf, (char **)NULL, 10); SNPRINTF(y_off, LENGTH_OF_INT + 16, "%s%s", buf, ptr); XtFree((char *)buf); resource.topmargin = y_off; resource.topmargin_int = val; store_preference(&(prefs->db), "topMargin", "%s", y_off); goto_page(current_page, resource.keep_flag ? NULL : home, True); } else { XDVI_WARNING((stderr, "unexpected widget name `%s' in set_offset_cb()", w_name)); } } } static void home_position_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); Widget parent = XtParent(XtParent(w)); Widget toggle_home, toggle_curr, label_x, label_y, text_x, text_y, units_menu; UNUSED(call_data); resource.use_current_offset = !resource.use_current_offset; if (get_widget_by_name(&toggle_home, parent, Xdvi_HOME_POSITION_STR, True) && get_widget_by_name(&toggle_curr, parent, Xdvi_SCROLL_CURRENT_STR, True) && get_widget_by_name(&label_x, parent, Xdvi_HOME_POSITION_X_STR, True) && get_widget_by_name(&label_y, parent, Xdvi_HOME_POSITION_Y_STR, True) && get_widget_by_name(&text_x, parent, Xdvi_HOME_POSITION_X_OFF_TEXT, True) && get_widget_by_name(&text_y, parent, Xdvi_HOME_POSITION_Y_OFF_TEXT, True) && get_widget_by_name(&units_menu, parent, Xdvi_HOME_POSITION_UNITS_MENU, True)) { XmToggleButtonGadgetSetState(toggle_home, !resource.use_current_offset, False); XmToggleButtonGadgetSetState(toggle_curr, resource.use_current_offset, False); XtSetSensitive(label_x, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(label_y, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(text_x, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(text_y, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(units_menu, !resource.keep_flag && !resource.use_current_offset); } store_preference(&(prefs->db), "useCurrentOffset", "%s", resource.use_current_offset ? "True" : "False"); } static void keep_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); Widget parent, keep, unkeep, toggle_home, toggle_curr, label_x, label_y, text_x, text_y, units_menu; UNUSED(call_data); resource.keep_flag = !resource.keep_flag; parent = XtParent(w); if (get_widget_by_name(&keep, parent, Xdvi_SCROLL_KEEP_STR, True) && get_widget_by_name(&unkeep, parent, Xdvi_SCROLL_UNKEEP_STR, True) && get_widget_by_name(&toggle_home, parent, Xdvi_HOME_POSITION_STR, True) && get_widget_by_name(&toggle_curr, parent, Xdvi_SCROLL_CURRENT_STR, True) && get_widget_by_name(&label_x, parent, Xdvi_HOME_POSITION_X_STR, True) && get_widget_by_name(&label_y, parent, Xdvi_HOME_POSITION_Y_STR, True) && get_widget_by_name(&text_x, parent, Xdvi_HOME_POSITION_X_OFF_TEXT, True) && get_widget_by_name(&text_y, parent, Xdvi_HOME_POSITION_Y_OFF_TEXT, True) && get_widget_by_name(&units_menu, parent, Xdvi_HOME_POSITION_UNITS_MENU, True)) { XmToggleButtonGadgetSetState(keep, resource.keep_flag, False); XmToggleButtonGadgetSetState(unkeep, !resource.keep_flag, False); XtSetSensitive(label_x, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(label_y, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(text_x, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(text_y, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(units_menu, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(toggle_home, !resource.keep_flag); XtSetSensitive(toggle_curr, !resource.keep_flag); } store_preference(&(prefs->db), "keepPosition", "%s", resource.keep_flag ? "True" : "False"); } static Widget h_create_scrolling(Widget parent, struct topic_info *info) { Widget form, form1, form2, size_option, curr_option; Widget x_off_label, x_off_text; Widget y_off_label, y_off_text; Widget off_units_menu, cascade, entry1, entry2, entry3; Widget scroll_keep, scroll_unkeep; char x_buf[LENGTH_OF_INT + 16]; char y_buf[LENGTH_OF_INT + 16]; int n; Arg args[8]; fprintf(stderr, "sidemargin: %s, topmargin: %s\n", resource.sidemargin, resource.topmargin); if (resource.sidemargin != NULL) { char *ptr; strcpy(x_buf, resource.sidemargin); ptr = x_buf; if (*ptr == '-') ptr++; while (isdigit((int)*ptr)) ptr++; *ptr = '\0'; } else strcpy(x_buf, "0"); if (resource.topmargin != NULL) { char *ptr; strcpy(y_buf, resource.topmargin); ptr = y_buf; if (*ptr == '-') ptr++; while (isdigit((int)*ptr)) ptr++; *ptr = '\0'; } else strcpy(y_buf, "0"); form = XmCreateForm(parent, "offsets_form", NULL, 0); scroll_keep = XmCreateToggleButtonGadget(form, Xdvi_SCROLL_KEEP_STR, &one_of_many, 1); XtVaSetValues(scroll_keep, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL); scroll_unkeep = XmCreateToggleButtonGadget(form, Xdvi_SCROLL_UNKEEP_STR, &one_of_many, 1); XtVaSetValues(scroll_unkeep, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, scroll_keep, XmNleftAttachment, XmATTACH_FORM, NULL); XmToggleButtonGadgetSetState(scroll_keep, resource.keep_flag, False); XmToggleButtonGadgetSetState(scroll_unkeep, !resource.keep_flag, False); XtAddCallback(scroll_keep, XmNvalueChangedCallback, keep_cb, (XtPointer)info); XtAddCallback(scroll_unkeep, XmNvalueChangedCallback, keep_cb, (XtPointer)info); XtManageChild(scroll_keep); XtManageChild(scroll_unkeep); form1 = XmCreateForm(form, "offsets_form1", NULL, 0); XtVaSetValues(form1, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, scroll_unkeep, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20, NULL); size_option = XmCreateToggleButtonGadget(form1, Xdvi_HOME_POSITION_STR, &one_of_many, 1); XtVaSetValues(size_option, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); x_off_label = XmCreateLabelGadget(form1, Xdvi_HOME_POSITION_X_STR, NULL, 0); XtVaSetValues(x_off_label, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, size_option, XmNbottomAttachment, XmATTACH_FORM, NULL); x_off_text = XtVaCreateManagedWidget(Xdvi_HOME_POSITION_X_OFF_TEXT, xmTextFieldWidgetClass, form1, XmNcolumns, 4, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, x_off_label, XmNbottomAttachment, XmATTACH_FORM, XmNvalue, x_buf, /* XmNvalue, buf, */ NULL); y_off_label = XmCreateLabelGadget(form1, Xdvi_HOME_POSITION_Y_STR, NULL, 0); XtVaSetValues(y_off_label, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, x_off_text, XmNleftOffset, 10, XmNbottomAttachment, XmATTACH_FORM, NULL); y_off_text = XtVaCreateManagedWidget(Xdvi_HOME_POSITION_Y_OFF_TEXT, xmTextFieldWidgetClass, form1, XmNcolumns, 4, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, y_off_label, XmNbottomAttachment, XmATTACH_FORM, XmNvalue, y_buf, NULL); n = 0; XtSetArg(args[n], XmNuserData, (XtPointer)"in"); n++; off_units_menu = XmCreatePulldownMenu(form1, Xdvi_HOME_POSITION_UNITS_PULLDOWN, args, n); n = 0; XtSetArg(args[n], XmNsubMenuId, off_units_menu); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftWidget, y_off_text); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; cascade = XmCreateOptionMenu(form1, Xdvi_HOME_POSITION_UNITS_MENU, args, n); entry1 = XtVaCreateManagedWidget("in", xmPushButtonGadgetClass, off_units_menu, NULL); XtAddCallback(entry1, XmNactivateCallback, select_unit_cb, info); entry2 = XtVaCreateManagedWidget("cm", xmPushButtonGadgetClass, off_units_menu, NULL); XtAddCallback(entry2, XmNactivateCallback, select_unit_cb, info); entry3 = XtVaCreateManagedWidget("Pixel", xmPushButtonGadgetClass, off_units_menu, NULL); XtAddCallback(entry3, XmNactivateCallback, select_unit_cb, info); XtAddCallback(x_off_text, XmNvalueChangedCallback, set_offset_cb, (XtPointer)info); XtAddCallback(y_off_text, XmNvalueChangedCallback, set_offset_cb, (XtPointer)info); XtManageChild(size_option); XtManageChild(x_off_label); XtManageChild(x_off_text); XtManageChild(y_off_label); XtManageChild(y_off_text); XtManageChild(cascade); form2 = XmCreateForm(form, "offsets_form2", NULL, 0); XtVaSetValues(form2, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, form1, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20, NULL); curr_option = XmCreateToggleButtonGadget(form2, Xdvi_SCROLL_CURRENT_STR, &one_of_many, 1); XtVaSetValues(curr_option, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); XtManageChild(curr_option); XtSetSensitive(x_off_label, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(x_off_text, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(y_off_label, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(y_off_text, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(cascade, !resource.keep_flag && !resource.use_current_offset); XtSetSensitive(size_option, !resource.keep_flag); XtSetSensitive(curr_option, !resource.keep_flag); XmToggleButtonGadgetSetState(size_option, !resource.use_current_offset, False); XmToggleButtonGadgetSetState(curr_option, resource.use_current_offset, False); XtAddCallback(size_option, XmNvalueChangedCallback, home_position_cb, (XtPointer)info); XtAddCallback(curr_option, XmNvalueChangedCallback, home_position_cb, (XtPointer)info); XtManageChild(form1); XtManageChild(form2); return form; } Widget prefs_scrolling(struct topic_info *info) { Widget form; Widget scrolling_form, scrolling_frame; form = XtVaCreateWidget("form", xmFormWidgetClass, info->right_form, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); scrolling_frame = XmCreateFrame(form, "scrolling_frame", NULL, 0); h_attach_below(scrolling_frame, NULL); scrolling_form = h_create_scrolling(scrolling_frame, info); XtVaSetValues(scrolling_form, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, scrolling_frame, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); XtManageChild(scrolling_form); XtManageChild(scrolling_frame); return form; } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/pagesel.c0000664000175000017500000013017511032450154020535 0ustar uwabamiuwabami/* * Page selector for xdvi * * Copyright (c) 2001-2004 xdvik development team * * This code is derived from the page selector in xdvik-j, and * parts of it are Copyright (c) 1993, 1995 * MATSUURA Syun syun@fuka.info.waseda.ac.jp * HIRAHARA Atsushi hirahara@fuka.info.waseda.ac.jp * ONO Kouichi onono@fuka.info.waseda.ac.jp * All rights reserved. * * * (SU: I was unsure how to interpret the `All rights reserved' in the * previous line, so emailed Ono Kouichi about this. Here's a * verbatim quote of the relevant part of his answer (which was CC'ed * to Hirahara Atsushi - all three of them had left Waseda university * around '95): * * You can modify, embed, copy and distribute a part of or the * entire of our source code when you specify our copyright in your * xdvik version. * * IANAL, but I think this is compatible with the X consortium * license, which follows.) * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* BUGS: - with Xaw, the highlighting for the selected page (XawListHighlight) vanishes when mouse is dragged outside the widget and then released (but the respective page is selected, which is IMHO the desired behaviour). - with Xaw, scrolling the list with PgUp/PgDown until the current page gets `out of focus' should un-highlight the current page number - The ASCII-based marks are *ugly*. Pixmaps (for the marked state) would be better. The viewer gv has one (but it's Xaw only). Some file directory widgets like e.g. http://ftp.xfree86.org/pub/X.Org/contrib/widgets/ListTree-3.0b3.tar.gz also have facilities for that, but most suffer from other inadequacies (e.g. no such ting as browseSelection) and all kinds of bitrot ... Another alternative would be using XmContainer (see e.g. the `filemanager' example in demos/programs/filemanagers in the openmotif distribution), but that's available for Motif >= 2.1 only. */ #include "xdvi-config.h" #include "xdvi.h" #include #include #include #include #include #include #include "xm_toolbar.h" #include "xm_menu.h" #include "xaw_menu.h" #include "x_util.h" #ifdef MOTIF # include # include # include /* for XmScrollBarGetValues */ #else /* MOTIF */ # include # include # include # include # include #endif /* MOTIF */ #include "message-window.h" #include "pagesel.h" #include "util.h" #include "string-utils.h" #include "dvi-init.h" #include "statusline.h" #include "events.h" #include "print-dialog.h" #include "search-internal.h" #include "pagehist.h" #define PAGENUMLEN 128 #define SCROLL_LIST_SCROLLBAR 0 #ifndef MAX_PAGE # define MAX_PAGE (1024) #endif /* MAX_PAGE */ #define LONGESTPAGENUM 55 /* for saving the GC of the pagelist widget (when un-highlighting items in highlight_page_callback, and drawing the `current' marker) */ static struct page_gc { GC fore; GC back; } m_page_gc; #define MOTIF_IDX_OFFSET 1 /* motif index starts at 1, not 0 */ #if !defined(LESSTIF_VERSION) static Boolean my_list_pos_to_bounds(Widget widget, int idx, Position *x, Position *y, Dimension *w, Dimension *h); static void refresh_highlight_marker(Widget widget, GC gc, Position x, Position y, Dimension w, Dimension h); #endif /* !defined(LESSTIF_VERSION) */ #ifdef MOTIF /* make button2 mark instead of drag&drop */ static void xm_list_set_mark(Widget widget, XEvent *event, String *params, Cardinal *num_params); static void xm_list_drag_mark(Widget widget, XEvent *event, String *params, Cardinal *num_params); static XtActionsRec CustomListActions[] = { { "ListSetMark", xm_list_set_mark }, { "ListDragMark", xm_list_drag_mark }, }; static char *motif_custom_translations = "#override \n" "s : ListDragMark(ListButtonMotion)\n" ": ListSetMark(ListButtonMotion)\n" ": ListSetMark(ListButtonMotion)\n" ": ListSetMark(ListButtonMotion)\n" /* /\* "s ~m ~a : ListMyProcessBtn2(ListBeginExtend)\n" *\/ */ /* /\* "s ~m ~a : ListMyProcessBtn2(ListEndExtend)\n" *\/ */ /* /\* "~c ~s ~m ~a : ListMyProcessBtn2(ListBeginSelect)\n" *\/ */ /* /\* "~c ~s ~m ~a : ListMyProcessBtn2(ListEndSelect)\n" *\/ */ /* /\* "c ~s ~m ~a : ListMyProcessBtn2(ListBeginToggle)\n" *\/ */ /* /\* "c ~s ~m ~a : ListMyProcessBtn2(ListEndToggle)\n" *\/ */ /* /\* "c ~s ~m a : ListProcessDrag()\n" *\/ */ /* /\* "~c s ~m a : ListProcessDrag()\n" *\/ */ ; #define LIST_WIDGET page_list /* motif pagenumber is a string */ static const char* const pageno_format = "%c %s "; #else /* MOTIF */ static int view_y; extern Widget panel_widget; static Widget list_widget = NULL; static Widget viewport = NULL; #define LIST_WIDGET list_widget /* Xaw pagenumber is an integer, and we need to left-pad it */ static const char* const pageno_format = "%c %*d "; static int xaw_maybe_scroll_pagelist(int new_page, Boolean force_recenter, int old); #define REDRAW_CURRENT_MARKER_HACK 1 /* The following hack tries to address the following 2 bugs with the self-made page highlighting marker: - the marker overlaps with the ordinary XawListHighlight marker; when un-highlighting a page, 1 pixel (vertically) at the edge of the ordinary marker is overdrawn. - When the XawListHighlight crosses the self-drawn rectangle, the vertical bars remain visible, but the horizontal bars are erased. The hack just redraws the appropriate items whenever one of the above can happen, i.e. when the two markers are 2 or less pages apart from each other. */ #if REDRAW_CURRENT_MARKER_HACK /* Store index of currently marked (with our own marker) list item, or -1 if none is marked. */ static int g_current_highlighted = -1; /* redraw the default Xaw list highlight (XawListHighlight()) */ static void xaw_maybe_redraw_highlight(int idx) { XawListReturnStruct *ret; int high; if (LIST_WIDGET == NULL) return; ret = XawListShowCurrent(LIST_WIDGET); high = ret->list_index; if (high != XAW_LIST_NONE && abs(idx - (high + MOTIF_IDX_OFFSET)) <= 2) { /* re-highlight it */ XawListHighlight(LIST_WIDGET, high); } g_current_highlighted = -1; } /* redraw our own rectangle highlight marker: */ static void xaw_maybe_redraw_current_marker(int idx) { Position x, y; Dimension w, h; /* fprintf(stderr, "idx: %d, high: %d; diff: %d\n", idx + MOTIF_IDX_OFFSET, g_current_highlighted, */ /* abs(idx + MOTIF_IDX_OFFSET - g_current_highlighted)); */ if (abs((idx + MOTIF_IDX_OFFSET) - g_current_highlighted) <= 2 && my_list_pos_to_bounds(LIST_WIDGET, g_current_highlighted, &x, &y, &w, &h)) { refresh_highlight_marker(LIST_WIDGET, m_page_gc.fore, x, y, w, h); } } #endif /* REDRAW_CURRENT_MARKER_HACK */ #endif /* MOTIF */ /* * Table of page offsets in DVI file, indexed by page number - 1, * marked pages, and page sizes. * Initialized in prepare_pages(). */ struct page_index { long offset; int number; Boolean marked; unsigned int pw, ph; /* page size */ unsigned int ww, wh; /* window size */ }; struct page_index_info { struct page_index *index; /* above struct */ size_t index_size; /* size of currently allocated index */ char **page_labels; /* label strings */ }; static struct page_index_info page_info; /* access functions used by dvi-draw.c and dvi-init.c */ long pageinfo_get_offset(int page) { ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range"); /* fprintf(stderr, "offset for page %d is %ld\n", page, page_info.index[page].offset); */ return page_info.index[page].offset; } /* access functions used by dvi-draw.c and dvi-init.c */ unsigned int pageinfo_get_page_width(int page) { ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range"); return page_info.index[page].pw; } unsigned int pageinfo_get_page_height(int page) { ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range"); return page_info.index[page].ph; } unsigned int pageinfo_get_window_width(int page) { ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range"); return page_info.index[page].ww; } unsigned int pageinfo_get_window_height(int page) { ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range"); return page_info.index[page].wh; } void pageinfo_set_page_width(int page, unsigned int width) { ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range"); page_info.index[page].pw = width; } void pageinfo_set_page_height(int page, unsigned int height) { ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range"); page_info.index[page].ph = height; } void pageinfo_set_window_width(int page, unsigned int width) { ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range"); page_info.index[page].ww = width; } void pageinfo_set_window_height(int page, unsigned int height) { ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range"); page_info.index[page].wh = height; } int pageinfo_get_number(int page) { ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range"); return page_info.index[page].number; } /* search for page with TeX number `number', and return its index, or -1 if it's not found. */ int pageinfo_get_index_of_number(int number) { size_t i; for (i = 0; i < page_info.index_size - 1; i++) { if (number == page_info.index[i].number) return i; } return -1; } void pageinfo_set_offset(int index, long offset) { ASSERT(index >= 0 && index < (int)page_info.index_size, ""); page_info.index[index].offset = offset; } void pageinfo_set_number(int index, int number) { ASSERT(index >= 0 && index < (int)page_info.index_size, ""); page_info.index[index].number = number; } void pageinfo_allocate(int total_pages) { int i; page_info.index = xmalloc(total_pages * sizeof *(page_info.index)); for (i = 0; i < total_pages; i++) { page_info.index[i].marked = False; } /* following initializations are handled by the respective Motif/Xaw functions */ page_info.page_labels = NULL; page_info.index_size = total_pages; } /* Deallocate page_info. NOTE: We mustn't free the page_labels here, since the page list might survive quite some time (e.g. while fonts for the new file are being generated) and needs the labels. */ void pageinfo_deallocate(void) { free(page_info.index); page_info.index_size = 0; page_info.index = NULL; } #ifdef MOTIF void toggle_pagelist(void) { Dimension curr_w, curr_x; XtVaGetValues(globals.widgets.main_window, XmNwidth, &curr_w, XmNx, &curr_x, NULL); if ((resource.expert_mode & XPRT_SHOW_PAGELIST) != 0) { XtManageChild(XtParent(page_list)); XtManageChild(page_list); curr_x += resource.pagelist_width; curr_w -= resource.pagelist_width; XtVaSetValues(globals.widgets.main_window, XtNwidth, curr_w, XtNx, curr_x, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, XtParent(page_list), NULL); } else { XtUnmanageChild(XtParent(page_list)); XtUnmanageChild(page_list); curr_x -= resource.pagelist_width; curr_w += resource.pagelist_width; XtVaSetValues(globals.widgets.main_window, XmNwidth, curr_w, XmNx, curr_x, XmNleftAttachment, XmATTACH_FORM, NULL); } set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert); } #endif Boolean pageinfo_have_marked_pages(void) { int i; for (i = 0; i < total_pages; i++) { if (page_info.index[i].marked) { return True; } } return False; } /* return True if page i is marked, False else */ Boolean pageinfo_is_marked(int i) { ASSERT(i <= (int)page_info.index_size, ""); return page_info.index[i].marked; } typedef enum { SCROLL_UP, SCROLL_DOWN, CLICK } saveCmdT; static void internal_process_button2(Widget widget, XEvent *event); static int get_item_index(Widget w, int mouse_y); static int get_page_size(void) { int offset = 0; int min_page = 0; int max_page = 0; int min_pageno_len = 0; int max_pageno_len = 0; int i; if (globals.dvi_file.bak_fp == NULL) return 0; for (i = 0; i < total_pages; i++) { max_page = MAX(page_info.index[i].number, max_page); min_page = MIN(page_info.index[i].number, min_page); } if (min_page >= 0) { offset = 0; /* plus symbol is hidden */ } else { offset = 1; /* offset for minus symbol */ min_page = -min_page; } for (min_pageno_len = offset; min_page > 0; min_page /= 10, min_pageno_len++); if (max_page >= 0) { offset = 0; /* plus symbol is hidden */ } else { offset = 1; /* offset for minus symbol */ max_page = -max_page; } for (max_pageno_len = offset; max_page > 0; max_page /= 10, max_pageno_len++); return MAX(min_pageno_len, max_pageno_len); /* Plus 1 for minus symbol */ } #if !defined(LESSTIF_VERSION) /* draw or erase highlight marker at position x, y with widht w an height h, using suitable offsets (for sake of consistency of the latter, and because of the differences Xaw/Motif, this is a separate function). */ static void refresh_highlight_marker(Widget widget, GC gc, Position x, Position y, Dimension w, Dimension h) { XDrawRectangle(XtDisplay(widget), XtWindow(widget), gc, #ifdef MOTIF x + 1, y + 1, w - 3, h - 3 #else x + 2, y, w - 1, h - 1 #endif ); } #endif /* !defined(LESSTIF_VERSION) */ #ifndef MOTIF /* update (redisplay) the list, saving the currently highlighted item. * This is invoked whenever marking the page, and the re-construction of the * entire list causes considerable flicker; but I guess that's unavoidable * with the current simplistic labelling scheme (with changing the list items * themselves). Gv does this considerably better (using custom widgets). */ static void xaw_update_list(void) { static int pagelist_width = -1; static int total_pages_bak = -1; XawListReturnStruct *ret; int idx, button_width; if (pagelist_width == -1 || total_pages != total_pages_bak) { pagelist_width = xaw_get_pagelist_size(); total_pages_bak = total_pages; } /* save selected item */ ret = XawListShowCurrent(LIST_WIDGET); idx = ret->list_index; button_width = get_panel_width() - 2 * (resource.btn_side_spacing + resource.btn_border_width); /* delete and re-create list */ ASSERT(total_pages <= (int)page_info.index_size, ""); XawListChange(LIST_WIDGET, page_info.page_labels, 0, MAX(button_width, pagelist_width), False); /* restore selected item */ if (idx != XAW_LIST_NONE) { XawListHighlight(LIST_WIDGET, idx); } } /* return height of a row in the list widget, and the initial offset of XtNinternalHeight in parameters row_height and internal_h */ static void xaw_get_row_height(Widget w, Dimension *row_height, Dimension *internal_h) { Dimension row_space; XFontStruct *font; Arg arglist[5]; int i = 0; if (w == NULL || !XtIsRealized(w)) return; XtSetArg(arglist[i], XtNfont, &font); ++i; XtSetArg(arglist[i], XtNrowSpacing, &row_space); ++i; XtSetArg(arglist[i], XtNinternalHeight, internal_h); i++; XtGetValues(w, arglist, i); *row_height = font->max_bounds.ascent + font->max_bounds.descent + row_space; } /* * Get pagelist width. */ int xaw_get_pagelist_size(void) { Widget w; XFontStruct *font; w = XtVaCreateWidget("list", listWidgetClass, globals.widgets.top_level, NULL); XtVaGetValues(w, XtNfont, &font, NULL); XtDestroyWidget(w); /* have space for max. pageno + space + current-marker, plus a few pixels for right margin */ return (get_page_size() + 2) * get_avg_font_width(font) + 6; } /* auto-scroll pagelist when mouse-1 is down and moved above top or below bottom of page list. */ static void xaw_drag_page_callback(Widget widget, XtPointer data, XEvent *event, Boolean *cont) { int y, idx, actual_idx = 0; UNUSED(data); UNUSED(cont); if (event->xany.type == ButtonPress || ((event->xbutton.state & Button1Mask) == 0)) return; if (event->xany.type == MotionNotify) y = (int)event->xmotion.y; else y = (int)event->xbutton.y; idx = get_item_index(widget, y); if (idx <= 0) { idx = 1; } else if (idx > total_pages) { idx = total_pages; } actual_idx = xaw_maybe_scroll_pagelist(idx, False, actual_idx); XawListHighlight(LIST_WIDGET, idx - MOTIF_IDX_OFFSET); /* if (event->xany.type == ButtonRelease) { */ /* fprintf(stderr, "1\n"); */ /* page_history_insert(idx - MOTIF_IDX_OFFSET); */ /* goto_page(idx - MOTIF_IDX_OFFSET, resource.keep_flag ? NULL : home); */ /* search_signal_page_changed(); */ /* } */ } static void xaw_SendReportProc(Widget w, XtPointer closure, XtPointer call_data) { XawPannerReport *rep = (XawPannerReport *) call_data; UNUSED(w); UNUSED(closure); view_y = rep->slider_y; } #endif /* not MOTIF */ /* returns the index of the current item in `Motif'-style, i.e. first item has index 1, not 0 */ static int get_item_index(Widget w, int mouse_y) { #ifdef MOTIF return XmListYToPos(w, mouse_y); #else Dimension row_height, internal_height; xaw_get_row_height(w, &row_height, &internal_height); return (mouse_y - internal_height) / row_height + MOTIF_IDX_OFFSET; #endif } #if !defined(LESSTIF_VERSION) /* idx is Motif-style index, i.e. 1 for 1st item, not 0 */ static Boolean my_list_pos_to_bounds(Widget widget, int idx, Position *x, Position *y, Dimension *w, Dimension *h) { #ifdef MOTIF Position x1, y1; Dimension w1, h1; if (XmListPosToBounds(widget, idx, &x1, &y1, &w1, &h1)) { *x = x1; *y = y1; *w = w1; *h = h1; return True; } return False; #else Dimension row_height, internal_height; /* FIXME: Remove this hard-coded offset! */ const int X_OFFSET = 9; const int RULE_OFFSET = 2; if (idx <= 0 || idx > total_pages) { return False; } if (viewport != NULL && XtIsRealized(viewport)) XtVaGetValues(viewport, XtNx, x, NULL); xaw_get_row_height(widget, &row_height, &internal_height); XtVaGetValues(widget, XtNwidth, w, NULL); *x -= X_OFFSET; *y = row_height * idx + internal_height - row_height - 1; *w -= RULE_OFFSET; *h = row_height + RULE_OFFSET; return True; #endif } #endif /* !defined(LESSTIF_VERSION) */ /* it seems that in order to support scrolling of the page list with wheel mice, we need to program this explicitly. */ static void wheel_scroll_list_callback(Widget widget, XtPointer data, XEvent *event, Boolean *cont) { int button = event->xbutton.button; UNUSED(widget); UNUSED(data); UNUSED(cont); if (event->xany.type == ButtonPress && (button == 4 || button == 5)) { #if SCROLL_LIST_SCROLLBAR Widget vert = XtNameToWidget(viewport, "vertical"); static Dimension row_height = 0, dummy = 0; int diff_y = 0; if (row_height == 0) xaw_get_row_height(LIST_WIDGET, &row_height, &dummy); if (vert == NULL) { XDVI_WARNING((stderr, "Couldn't get name of pagelist viewport widget!")); return; } if (button == 5) { diff_y = row_height; } else { diff_y = -row_height; } XtCallCallbacks(vert, XtNscrollProc, (XtPointer)diff_y); #else int pageno = current_page; if (button == 5) { if (current_page >= total_pages - 1) { XBell(DISP, 0); /* statusline_info(STATUS_SHORT, "Last page of DVI file"); */ return; } pageno++; } else { if (current_page == 0) { XBell(DISP, 0); /* statusline_info(STATUS_SHORT, "First page of DVI file"); */ return; } pageno--; } goto_page(check_goto_page(pageno, True), resource.keep_flag ? NULL : home, False); search_signal_page_changed(); #endif } statusline_erase("Page history:"); } #if !defined(LESSTIF_VERSION) /* draw a hightlight rectangle around the page the mouse is currently over, to make e.g. marking easier. */ static void highlight_page_callback(Widget widget, XtPointer data, XEvent *event, Boolean *cont) { int curr_idx = get_item_index(widget, event->xmotion.y); Position x, y; Dimension w, h; static int idx_bak = -1; UNUSED(data); UNUSED(cont); switch(event->xany.type) { case ButtonPress: case ButtonRelease: case MotionNotify: /* might need to un-highlight previous one */ if (idx_bak >= 0 && idx_bak != curr_idx && my_list_pos_to_bounds(widget, idx_bak, &x, &y, &w, &h)) { /* fprintf(stderr, "index: %d, %d, h: %d, w: %d\n", x, y, h, w); */ refresh_highlight_marker(widget, m_page_gc.back, x, y, w, h); #if REDRAW_CURRENT_MARKER_HACK xaw_maybe_redraw_highlight(curr_idx); #endif } idx_bak = curr_idx; /* redraw unless out of bounds (when pagelist is shorter than view area) */ if (my_list_pos_to_bounds(widget, curr_idx, &x, &y, &w, &h)) { refresh_highlight_marker(widget, m_page_gc.fore, x, y, w, h); #if REDRAW_CURRENT_MARKER_HACK g_current_highlighted = curr_idx; #endif } break; case LeaveNotify: /* this might look overly complicated, but is neccessary to cover all cases of 1-pixel movement up/down before leaving the list, or no movement at all before leaving it. */ if ((idx_bak >= 0 && idx_bak != curr_idx && my_list_pos_to_bounds(widget, idx_bak, &x, &y, &w, &h)) || my_list_pos_to_bounds(widget, curr_idx, &x, &y, &w, &h)) { refresh_highlight_marker(widget, m_page_gc.back, x, y, w, h); #if REDRAW_CURRENT_MARKER_HACK xaw_maybe_redraw_highlight(curr_idx); #endif } break; default: break; } } #endif /* !defined(LESSTIF_VERSION) */ /* * invoked on Button-1 Down. */ static void select_page_callback(Widget w, XtPointer closure, XtPointer call_data) { #ifdef MOTIF XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data; int new = cbs->item_position; UNUSED(w); UNUSED(closure); maybe_scroll_pagelist(new - MOTIF_IDX_OFFSET, False); page_history_insert(new - MOTIF_IDX_OFFSET); goto_page(new - MOTIF_IDX_OFFSET, resource.keep_flag ? NULL : home, False); #else XawListReturnStruct *item = (XawListReturnStruct *) call_data; int new = item->list_index; UNUSED(w); UNUSED(closure); if (globals.debug & DBG_EVENT) fprintf(stderr, "got: button-1 for `%d'\n", new); #if 0 fprintf(stderr, "select page: %d\n", new); #endif maybe_scroll_pagelist(new, False); page_history_insert(new); goto_page(new, resource.keep_flag ? NULL : home, False); statusline_erase("Page history:"); #endif search_signal_page_changed(); } static void init_pagelabels(int start, int end) { int i; char s[PAGENUMLEN]; #if 0 fprintf(stderr, "===== init_pagelabels from %d to %d\n", start, end); #endif ASSERT(end < (int)page_info.index_size, ""); page_info.page_labels = xrealloc(page_info.page_labels, sizeof *(page_info.page_labels) * (end + 2)); for (i = start; i < end; i++) { if (page_info.index[i].marked) sprintf(s, "* %*d ", get_page_size(), resource.use_tex_pages ? page_info.index[i].number : i + 1); else sprintf(s, " %*d ", get_page_size(), resource.use_tex_pages ? page_info.index[i].number : i + 1); page_info.page_labels[i] = xstrdup(s); } page_info.page_labels[i] = NULL; /* terminate - important for creating the widget. */ } #ifdef MOTIF static int xm_get_top_visible(int start) { int top = start; while (top < total_pages && !XmListPosToBounds(LIST_WIDGET, top, NULL, NULL, NULL, NULL)) top++; return top; } static int xm_get_bottom_visible(int start) { int bot = start; while (bot < total_pages && XmListPosToBounds(LIST_WIDGET, bot, NULL, NULL, NULL, NULL)) bot++; bot--; return bot; } /* Scroll pagelist down or up if needed, and update top_visible and bot_visible. List is always scrolled so that 1 element is still visible below or above pointer, to make it possible to flip through document by repeatedly clicking on first/last. */ static void xm_maybe_scroll_pagelist(int current, saveCmdT curr_cmd, int *top_visible, int *bot_visible) { #if 0 fprintf(stderr, "topmost visible: %d, bottom: %d, current: %d, total: %d\n", top_visible, bottom_visible, current, total_pages); #endif if (current < *top_visible && curr_cmd != SCROLL_DOWN) { XmListSetPos(LIST_WIDGET, current < 1 ? 1 : current); (*top_visible)--; (*bot_visible)--; } else if (current + MOTIF_IDX_OFFSET >= *bot_visible && curr_cmd != SCROLL_UP) { XmListSetBottomPos(LIST_WIDGET, current + MOTIF_IDX_OFFSET >= total_pages ? current + MOTIF_IDX_OFFSET : current + MOTIF_IDX_OFFSET + 1); (*top_visible)++; (*bot_visible)++; } } static void xm_set_page_labels(void) { int i; char buf[PAGENUMLEN]; XmString *motif_page_labels = xmalloc((total_pages + 2) * sizeof *motif_page_labels); for (i = 0; i < total_pages; ++i) { sprintf(buf, pageno_format, ' ', page_info.page_labels[i]); motif_page_labels[i] = XmStringCreateLocalized(buf); } XmListDeleteAllItems(LIST_WIDGET); XmListAddItems(LIST_WIDGET, motif_page_labels, total_pages, 0); XmListSelectPos(LIST_WIDGET, current_page + MOTIF_IDX_OFFSET, False); for (i = 0; i < total_pages; ++i) { XmStringFree(motif_page_labels[i]); } free(motif_page_labels); } static void xm_toggle_label(Widget widget, int idx, Boolean update) { /* TODO: use `update' to update all labels at once when toggling multiple */ XmString str; char *mark_font, buf[128]; if (widget == NULL) return; UNUSED(update); /* ensure_labelinfo_size(idx); */ ASSERT(idx < (int)page_info.index_size, ""); if (!page_info.index[idx].marked) { sprintf(buf, pageno_format, '*', page_info.page_labels[idx]); mark_font = "MARKED"; page_info.index[idx].marked = True; } else { sprintf(buf, pageno_format, ' ', page_info.page_labels[idx]); mark_font = "UNMARKED"; page_info.index[idx].marked = False; } /* str = XmStringCreateLocalized(buf); */ str = XmStringCreateLtoR(buf, mark_font); XmListReplaceItemsPos(widget, &str, 1, idx + MOTIF_IDX_OFFSET); XmStringFree(str); } #else /* MOTIF */ static void mark_page_callback(Widget w, XtPointer data, XEvent *event, Boolean *cont) { UNUSED(data); UNUSED(cont); /* moving button2 generates MotionNotify events for button0 */ if (event->type == MotionNotify || event->xbutton.button == Button2) internal_process_button2(w, event); if (event->type != ButtonPress) notify_print_dialog_have_marked(); } void xaw_create_pagelist_widgets(Dimension height, Dimension width, Position y, Widget parent) { viewport = XtVaCreateWidget("viewport", viewportWidgetClass, parent, XtNallowVert, True, /* this is not related to the scroll bar: */ /* XtNforceBars, True, */ XtNx, resource.btn_side_spacing, XtNy, y, XtNheight, height, XtNwidth, width, NULL); LIST_WIDGET = XtVaCreateWidget("list", listWidgetClass, viewport, XtNlist, page_info.page_labels, XtNdefaultColumns, 1, XtNforceColumns, True, XtNx, 10, XtNy, 10, XtNheight, height, XtNwidth, width - 10, XtNlongest, LONGESTPAGENUM, XtNverticalList, True, NULL); XtManageChild(LIST_WIDGET); XtManageChild(viewport); XtAddCallback(LIST_WIDGET, XtNcallback, select_page_callback, (XtPointer) NULL); /* for scrolling the list */ XtAddCallback(viewport, XtNreportCallback, xaw_SendReportProc, (XtPointer) NULL); XtAddEventHandler(LIST_WIDGET, ButtonPressMask | ButtonReleaseMask | Button2MotionMask, False, mark_page_callback, (XtPointer)NULL); if (resource.pagelist_highlight_current) XtAddEventHandler(LIST_WIDGET, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | LeaveWindowMask, False, highlight_page_callback, (XtPointer)NULL); XtAddEventHandler(LIST_WIDGET, ButtonPressMask | ButtonReleaseMask, False, wheel_scroll_list_callback, (XtPointer)NULL); XtAddEventHandler(LIST_WIDGET, /* FIXME: We should add PointerMotionMask here, but handling PointerMotionMask currently doesn't work with the Xaw list widget: the auto-scrolling code doesn't realize when the mouse direction of the pointer movement changes, and continues to scroll into the same direction. This will be rather annoying for users, so we disabled PointerMotionMask for the time being. */ ButtonReleaseMask /* | PointerMotionMask */ | Button1MotionMask, False, xaw_drag_page_callback, (XtPointer)NULL); } static void xaw_toggle_label(Widget w, int idx, Boolean update) { if (w == NULL) return; /* ensure_labelinfo_size(idx); */ ASSERT(idx < (int)page_info.index_size, ""); if (!page_info.index[idx].marked) { /* sprintf(toc[idx], "* %*d ", get_page_size(), page_index[idx].number); */ sprintf(page_info.page_labels[idx], pageno_format, '*', get_page_size(), resource.use_tex_pages ? page_info.index[idx].number : idx + 1); page_info.index[idx].marked = True; } else { sprintf(page_info.page_labels[idx], pageno_format, ' ', get_page_size(), resource.use_tex_pages ? page_info.index[idx].number : idx + 1); /* sprintf(toc[idx], " %*d ", get_page_size(), page_index[idx].number); */ page_info.index[idx].marked = False; } if (update) xaw_update_list(); } static int xaw_maybe_scroll_pagelist(int new_page, Boolean force_recenter, int idx_bak) { Position x; Position y, new_y, bot_y; Dimension view_height, row_height, internal_height; /* Dimension clip_height; */ /* static Widget list_clip = 0; */ if (LIST_WIDGET == NULL || (resource.expert_mode & XPRT_SHOW_BUTTONS) == 0) return idx_bak; /* if (list_clip == 0) { */ /* list_clip = XtNameToWidget(viewport, "clip"); */ /* } */ /* if (XtIsRealized(list_clip)) */ /* XtVaGetValues(list_clip, XtNheight, &clip_height, XtNx, &cx, XtNy, &y1, NULL); */ if (viewport != NULL && XtIsRealized(viewport)) XtVaGetValues(viewport, XtNheight, &view_height, XtNx, &x, NULL); /* fprintf(stderr, "diff: %d, %d, %d, %d, %d\n", cx - x, clip_height, view_height, y1, (int)y2); */ xaw_get_row_height(LIST_WIDGET, &row_height, &internal_height); y = row_height * new_page; #if DEBUG fprintf(stderr, "###### xaw_maybe_scroll_pagelist: y %d, view_y %d, view_height %d, row_height %d, internal_height %d; actual %d\n", y, view_y, view_height, row_height, internal_height, idx_bak); #endif /*FIXME: when page list is destroyed, view_y will be 0 until user scrolls page list */ bot_y = view_y + view_height; if (force_recenter || ((y >= bot_y - row_height))) { #if DEBUG fprintf(stderr, "scrolled below bottom; incrementing %d to %d\n", view_y, view_y + row_height); #endif y += row_height; XawViewportSetCoordinates(viewport, x, y - view_height > 0 ? y - view_height : 0); return new_page + 1; } else if (force_recenter || ((y <= view_y + row_height + internal_height))) { #if DEBUG fprintf(stderr, "scrolled over top; new_y: %d\n", y - row_height); #endif new_y = y - 2 * row_height; XawViewportSetCoordinates(viewport, x, new_y); return new_page - 1; } /* not scrolled */ return -2; } #endif /* MOTIF */ /* idx is C-style index (0-based), not Motif one (1-based) */ static void toggle_label(Widget widget, int idx, Boolean update) { if (idx >= total_pages) return; ASSERT(idx < total_pages, ""); ASSERT(idx >= 0, ""); #ifdef MOTIF xm_toggle_label(widget, idx, update); #else xaw_toggle_label(widget, idx, update); #endif } void list_toggle_marks(int arg) { int i; if (arg < 0) { /* mark all */ for (i = 0; i < total_pages; i++) { ASSERT(i < (int)page_info.index_size, ""); /* ensure_labelinfo_size(i); */ if (!page_info.index[i].marked) { toggle_label(LIST_WIDGET, i, False); } } } else if (arg == 0) { /* unmark all */ for (i = 0; i < total_pages; i++) { ASSERT(i < (int)page_info.index_size, ""); /* ensure_labelinfo_size(i); */ if (page_info.index[i].marked) { toggle_label(LIST_WIDGET, i, False); } } } else { /* toggle odd/even */ if (arg == 2) /* toggle even */ arg = 0; for (i = 0; i < total_pages; i++) { if ((i + 1) % 2 == arg) { toggle_label(LIST_WIDGET, i, False); } } } /* TODO: update widget once for Motif as well! */ #ifndef MOTIF xaw_update_list(); #endif notify_print_dialog_have_marked(); } static Boolean PagelistInitialized = False; #ifndef MOTIF void handle_pagelist_resize(void) { /* TODO: the following will mess up the geometry of the list (doesn't increase height, and incrementally decreases width): if (list_widget) { Dimension height; --- without the (un)manage, I get an X Error: XtMakeGeometryRequest - parent has no geometry manager --- XtUnmanageChild(viewport); XtUnmanageChild(LIST_WIDGET); XtVaGetValues(globals.widgets.clip_widget, XtNheight, &height, NULL); height -= resource.btn_top_spacing + resource.btn_border_width + global_y_pos; XtVaSetValues(viewport, XtNheight, height, NULL); XtManageChild(LIST_WIDGET); XtManageChild(viewport); } ... so we use brute force instead: */ handle_destroy_pagelist(LIST_WIDGET, NULL, NULL); create_pagelist(); } void handle_destroy_pagelist(Widget w, XtPointer client_data, XtPointer call_data) { UNUSED(w); UNUSED(client_data); UNUSED(call_data); if (viewport != NULL) { XtDestroyWidget(viewport); viewport = NULL; LIST_WIDGET = NULL; } PagelistInitialized = False; } #endif /* MOTIF */ void create_pagelist(void) { Pixel background, foreground; #ifdef MOTIF /* items = xrealloc(items, sizeof *items * (total_pages + 2)); */ init_pagelabels(0, total_pages); xm_set_page_labels(); if (!PagelistInitialized) { XtAppContext app; XtVaGetValues(LIST_WIDGET, XmNforeground, &foreground, XmNbackground, &background, NULL); m_page_gc.back = set_or_make_gc(NULL, GXcopy, background, foreground); m_page_gc.fore = set_or_make_gc(NULL, GXcopy, foreground, background); XtManageChild(LIST_WIDGET); XtAddCallback(LIST_WIDGET, XmNbrowseSelectionCallback, select_page_callback, NULL); #if !defined(LESSTIF_VERSION) /* Don't use the highlighting hack with LessTif, since its XmListPosToBounds() is too broken to be usable (as of 0.93.36): - it returns generally too low values, apparently it doesn't take XmNlistSpacing into account; - it doesn't take scrollbar position into account. */ if (resource.pagelist_highlight_current) XtAddEventHandler(LIST_WIDGET, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | LeaveWindowMask, False, highlight_page_callback, (XtPointer)NULL); #endif /* !defined(LESSTIF_VERSION) */ XtAddEventHandler(LIST_WIDGET, ButtonPressMask | ButtonReleaseMask, False, wheel_scroll_list_callback, (XtPointer)NULL); app = XtWidgetToApplicationContext(globals.widgets.top_level); XtAppAddActions(app, CustomListActions, XtNumber(CustomListActions)); XtOverrideTranslations(LIST_WIDGET, XtParseTranslationTable(motif_custom_translations)); PagelistInitialized = True; } #else /* MOTIF */ if ((resource.expert_mode & XPRT_SHOW_BUTTONS) == 0) { PagelistInitialized = False; /* might need to re-create widgets in this case */ return; } if (globals.debug & DBG_GUI) fprintf(stderr, "allocating list with %d pages\n", total_pages); init_pagelabels(0, total_pages); if (!PagelistInitialized) { xaw_create_pagelist(); XtVaGetValues(LIST_WIDGET, XtNforeground, &foreground, XtNbackground, &background, NULL); m_page_gc.back = set_or_make_gc(NULL, GXcopy, background, foreground); m_page_gc.fore = set_or_make_gc(NULL, GXcopy, foreground, background); PagelistInitialized = True; } #endif /* MOTIF */ /* scroll to the current page if needed */ maybe_scroll_pagelist(current_page, False); } #ifndef MOTIF static void free_pagelabels(void) { int i; for (i = 0; page_info.page_labels != NULL && page_info.page_labels[i] != NULL; i++) { free(page_info.page_labels[i]); } free(page_info.page_labels); page_info.page_labels = NULL; } #endif /* not MOTIF */ void refresh_pagelist(int newsize, int newpage) { if ( #ifndef MOTIF (resource.expert_mode & XPRT_SHOW_BUTTONS) == 0 || #endif !XtIsRealized(globals.widgets.top_level)) return; #ifdef DEBUG fprintf(stderr, "=== refresh_pagelist: newsize %d, newpage %d\n", newsize, newpage); #endif #ifdef MOTIF /* items = xrealloc(items, sizeof *items * (newsize + 2)); */ init_pagelabels(0, newsize); xm_set_page_labels(); #else /* MOTIF */ if ((resource.expert_mode & XPRT_SHOW_BUTTONS) == 0) return; /* FIXME - is this really neccessary?? The alternative: XawListChange(LIST_WIDGET, page_info.page_labels, newsize, 0, True); has problems when freeing the page labels afterwards. */ handle_destroy_pagelist(LIST_WIDGET, NULL, NULL); free_pagelabels(); init_pagelabels(0, newsize); xaw_create_pagelist(); #endif /* MOTIF */ /* `True' since the pagelist is newly created */ maybe_scroll_pagelist(newpage, True); } void maybe_scroll_pagelist(int newpage, Boolean force_recenter) { #ifdef MOTIF int top_visible, bot_visible; UNUSED(force_recenter); #endif if ( #ifndef MOTIF (resource.expert_mode & XPRT_SHOW_BUTTONS) == 0 || #endif !XtIsRealized(globals.widgets.top_level)) return; #ifdef MOTIF XmListSelectPos(LIST_WIDGET, newpage + MOTIF_IDX_OFFSET, False); top_visible = xm_get_top_visible(1); bot_visible = xm_get_bottom_visible(top_visible); xm_maybe_scroll_pagelist(newpage, CLICK, &top_visible, &bot_visible); #if HAVE_XPM tb_check_navigation_sensitivity(current_page); #endif #else if (LIST_WIDGET == NULL) return; (void)xaw_maybe_scroll_pagelist(newpage + 1, force_recenter, 0); XawListHighlight(LIST_WIDGET, newpage); #if REDRAW_CURRENT_MARKER_HACK /* if the XawListHighlight happens adjacent to the page that was last highlighted with our home-made `current selected' rectangle, it might overdraw that rectangle. In this case, restore it: */ xaw_maybe_redraw_current_marker(newpage); #endif #endif } #ifdef MOTIF static void set_all_marks(int from, int to) { int i; for (i = from; i < to; i++) { /* ensure_labelinfo_size(i); */ page_info.index[i].marked = True; toggle_label(LIST_WIDGET, i, False); } } static void internal_process_button2_drag(Widget widget, XEvent *event) { int i, idx, min = total_pages, max = 0; idx = get_item_index(widget, event->xbutton.y); for (i = 0; i < total_pages; i++) { /* ensure_labelinfo_size(i); */ if (page_info.index[i].marked && i > max) max = i; } for (i = total_pages; i > 0; i--) { /* ensure_labelinfo_size(i); */ if (page_info.index[i].marked && i < min) min = i; } if (min == total_pages) min = 0; if (max == 0) max = total_pages; if (idx < min) { set_all_marks(idx, min); } else if (idx > max) { set_all_marks(max + 1, idx); } else { set_all_marks(0, idx); } } #endif /* MOTIF */ static void internal_process_button2(Widget widget, XEvent *event) { int curr_idx; static int prev_idx = 0; #ifndef MOTIF static int actual_idx = -2; #endif static int top_visible = 0, bot_visible = 0; static int prev_y = 0, curr_y = 0; static saveCmdT prev_cmd = 0; /* previous command (CLICK/SCROLL_UP/SCROLL_DOWN) */ static saveCmdT curr_cmd = 0; /* current command (CLICK/SCROLL_UP/SCROLL_DOWN) */ static saveCmdT bak_cmd = 0; /* last command that started inside the pagelist (CLICK/SCROLL_UP/SCROLL_DOWN) */ static Boolean change_scroll_direction = False; switch(event->xany.type) { case ButtonPress: prev_y = event->xbutton.y; prev_idx = curr_idx = get_item_index(widget, prev_y); #ifdef MOTIF top_visible = xm_get_top_visible(1); bot_visible = xm_get_bottom_visible(top_visible); #endif toggle_label(widget, curr_idx - 1, True); prev_cmd = CLICK; #ifdef MOTIF xm_maybe_scroll_pagelist(curr_idx - 1, CLICK, &top_visible, &bot_visible); #else actual_idx = xaw_maybe_scroll_pagelist(curr_idx, False, actual_idx); #endif break; case ButtonRelease: prev_cmd = CLICK; break; case MotionNotify: curr_y = (int)event->xmotion.y; curr_idx = get_item_index(widget, event->xmotion.y); #ifndef MOTIF if (actual_idx > 0) { curr_idx = actual_idx; } #endif if (curr_y < prev_y) curr_cmd = SCROLL_UP; else if (curr_y > prev_y) curr_cmd = SCROLL_DOWN; prev_y = curr_y; if (prev_cmd != CLICK && curr_cmd != prev_cmd) change_scroll_direction = True; if ((curr_idx != prev_idx && !change_scroll_direction) || (change_scroll_direction /* last or first visible are always spared, unless they are really the first or last page; this way, always 1 more page is visible than is currently marked/selected */ && !(curr_idx == top_visible) && !(curr_idx == bot_visible))) { if (curr_idx <= 0) { /* When user has scrolled off, mark this by setting curr_idx to 1 more or less than the pagelist has so that the last/first page don't oscillate between marked/unmarked state when user continues to scroll. Also, we continue scrolling as long as user drags in the same direction as the last `real' scrolling event (saved as bak_cmd). */ if (curr_cmd == SCROLL_DOWN && bak_cmd == SCROLL_DOWN && prev_idx <= total_pages) { curr_idx = prev_idx + 1; } else if (curr_cmd == SCROLL_UP && bak_cmd == SCROLL_UP && prev_idx > 0) { curr_idx = prev_idx - 1; } } if (curr_idx > 0 && curr_idx <= total_pages) { toggle_label(widget, curr_idx - 1, True); #ifdef MOTIF xm_maybe_scroll_pagelist(curr_idx - 1, curr_cmd, &top_visible, &bot_visible); #else actual_idx = xaw_maybe_scroll_pagelist(curr_idx, False, actual_idx); #endif prev_idx = curr_idx; bak_cmd = curr_cmd; change_scroll_direction = False; } else { #ifndef MOTIF if (curr_idx > total_pages) actual_idx = -2; else actual_idx = xaw_maybe_scroll_pagelist(curr_idx, False, actual_idx); #endif } prev_cmd = curr_cmd; } break; default: break; } } void list_toggle_current(int arg) { toggle_label(LIST_WIDGET, arg, True); notify_print_dialog_have_marked(); } #ifdef MOTIF static void xm_list_set_mark(Widget widget, XEvent *event, String *params, Cardinal *num_params) { UNUSED(params); if ((*num_params != 1) || !XmIsList(widget)) return; internal_process_button2(widget, event); if (event->type != ButtonPress) notify_print_dialog_have_marked(); } static void xm_list_drag_mark(Widget widget, XEvent *event, String *params, Cardinal *num_params) { UNUSED(params); if ((*num_params != 1) || !XmIsList(widget)) return; internal_process_button2_drag(widget, event); if (event->type != ButtonPress) notify_print_dialog_have_marked(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/selection.c0000664000175000017500000001654011032450154021101 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ #include "xdvi-config.h" #include "xdvi.h" #include #include #include #if HAVE_X11_XMU_XMU_H #include #include #endif #include "events.h" #include "util.h" #include "encodings.h" #include "message-window.h" #include "selection.h" #include "statusline.h" /* * Set the current X selection (i.e. the primary selection AKA XA_PRIMARY). * Most of this is copied from Asente/Converse/Swick: X Window System Toolkit Manual */ /* This is file scope since deliver_selection_cb() needs access to it. * I guess we could also store it in an Atom, but why bother ... */ static char *m_selection_text = NULL; static char *m_cvt_selection_text = NULL; static size_t m_selection_size = 0; /* helper routine */ static Atom fetch_atom(Widget w, const char *name) { Atom a; XrmValue source, dest; source.size = strlen(name) + 1; source.addr = (char *)name; dest.size = sizeof a; dest.addr = (caddr_t)&a; (void)XtConvertAndStore(w, XtRString, &source, XtRAtom, &dest); return a; } /* Lose the selection */ static void lose_selection_cb(Widget w, Atom *selection) { UNUSED(w); UNUSED(selection); text_change_region(TEXT_SEL_CLEAR, NULL); } static char * utf8_to_native_encoding(const char *utf8) { static const char *text_encoding = NULL; /* convert to user encoding, similar to search-internal.c */ if (text_encoding == NULL) { text_encoding = get_text_encoding(); } if (memicmp(text_encoding, "iso-8859-1", strlen("iso-8859-1")) == 0 || memicmp(text_encoding, "iso8859-1", strlen("iso8859-1")) == 0) { return str_utf8_to_iso_8859_1(utf8); } else if (memicmp(text_encoding, "utf-8", strlen("utf-8")) != 0 && memicmp(text_encoding, "utf8", strlen("utf8")) != 0) { /* some other encoding */ return iconv_convert_string("utf-8", text_encoding, utf8); } /* fallback */ return xstrdup(utf8); } /* Deliver the selection. Only supports XA_STRING. */ static Boolean deliver_selection_cb(Widget w, Atom *selection, Atom *target, Atom *type, XtPointer *value, unsigned long *length, int *format) { Atom targets = fetch_atom(w, "TARGETS"); Atom utf8_string = fetch_atom(w, "UTF8_STRING"); TRACE_GUI((stderr, "selection target = %lu (%s)", *target, XGetAtomName(DISP, *target))); if (m_selection_text == NULL) /* paranoia */ return False; #if HAVE_X11_XMU_XMU_H if (*target == targets) { /* TARGETS handling copied from xclipboard.c */ Atom* targetP; XPointer std_targets; /* was: Atom* */ unsigned long std_length; XSelectionRequestEvent* req = XtGetSelectionRequest(w, *selection, (XtRequestId)NULL); TRACE_GUI((stderr, "Selection type: targets")); XmuConvertStandardSelection(w, req->time, selection, target, type, &std_targets, &std_length, format); *value = XtMalloc(sizeof(Atom)*(std_length + 2)); targetP = *(Atom**)value; *length = std_length + 2; *targetP++ = XA_COMPOUND_TEXT(DISP); *targetP++ = XA_STRING; memcpy((char*)targetP, (char*)std_targets, sizeof(Atom)*std_length); XtFree((char*)std_targets); *type = XA_ATOM; *format = sizeof(Atom) * 8; return True; } else #endif { if (*target == utf8_string) { TRACE_GUI((stderr, "Selection type: UTF8_STRING")); *type = *target; *value = (XtPointer)XtNewString(m_selection_text); /* *value = (XtPointer)m_selection_text; */ *length = strlen(m_selection_text); *format = 8; return True; } else if (*target == XA_STRING) { char *ptr = utf8_to_native_encoding(m_selection_text); TRACE_GUI((stderr, "Selection type: XA_STRING")); strncpy(m_cvt_selection_text, ptr, m_selection_size); m_cvt_selection_text[m_selection_size - 1] = '\0'; /* ensure termination */ free(ptr); *type = *target; *value = (XtPointer)XtNewString(m_cvt_selection_text); /* *value = (XtPointer)m_selection_text; */ *length = strlen(m_cvt_selection_text); *format = 8; return True; } #if HAVE_X11_XMU_XMU_H else if (*target == XA_COMPOUND_TEXT(DISP) || *target == XA_TEXT(DISP)) { const char *cl[1]; char *ptr; int retval; XTextProperty ct; XICCEncodingStyle style = XStdICCTextStyle; TRACE_GUI((stderr, "Selection type: XA_COMPOUND_TEXT")); ptr = utf8_to_native_encoding(m_selection_text); strncpy(m_cvt_selection_text, ptr, m_selection_size); m_cvt_selection_text[m_selection_size - 1] = '\0'; /* ensure termination */ cl[0] = m_cvt_selection_text; *type = *target; retval = XmbTextListToTextProperty(DISP, (char **)cl, 1, style, &ct); if (retval == XNoMemory || retval == XLocaleNotSupported || retval == XConverterNotFound) { statusline_info(STATUS_MEDIUM, "XmbTextListToTextProperty failed: %d", retval); return False; } *value = ct.value; *length = ct.nitems; *format = 8; return True; } #endif else { #if HAVE_X11_XMU_XMU_H TRACE_GUI((stderr, "Selection type: standard selection")); if (XmuConvertStandardSelection(w, CurrentTime, selection, target, type, (XPointer *)value, length, format)) return True; else { #endif TRACE_GUI((stderr, "Selection type unsupported: %lu (%s)", (unsigned long)*target, XGetAtomName(DISP, *target))); statusline_error(STATUS_MEDIUM, "X client asked for an unsupported selection target type: %lu (%s)", (unsigned long)*target, XGetAtomName(DISP, *target)); return False ; #if HAVE_X11_XMU_XMU_H } #endif } } } /* do it */ Boolean set_selection(const char *text, Widget w) { /* caller should make sure that text is never longer than 4 * XMaxRequestSize(DISP) - 32 */ if (m_selection_text == NULL) { m_selection_size = 4 * XMaxRequestSize(DISP); m_selection_text = xmalloc(m_selection_size); m_cvt_selection_text = xmalloc(m_selection_size); } strncpy(m_selection_text, text, m_selection_size); m_selection_text[m_selection_size - 1] = '\0'; /* ensure termination */ return XtOwnSelection(w, XA_PRIMARY, XtLastTimestampProcessed(XtDisplay(w)), deliver_selection_cb, lose_selection_cb, (XtSelectionDoneProc)NULL); } void unset_selection(Widget w) { XtDisownSelection(w, XA_PRIMARY, XtLastTimestampProcessed(XtDisplay(w))); } xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/menu.c0000664000175000017500000002726211032450154020063 0ustar uwabamiuwabami/* * Copyright (c) 2003-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Common code for Xaw and Motif menu bar creation. */ #include "xdvi-config.h" #include "xdvi.h" #include "events.h" #include "menu.h" #include "util.h" #ifdef MOTIF # include # include #else # include # include # include # include #endif /* translate string argument into corresponding buttonTypeT */ static buttonTypeT get_type(const char *str) { if (strcmp(str, "PUSH") == 0) return BT_PUSH; else if (strcmp(str, "RADIO") == 0) return BT_RADIO; else if (strcmp(str, "CHECK") == 0) return BT_CHECK; else if (strcmp(str, "SEP") == 0) return BT_SEP; else return BT_INVALID; } static struct button_info *m_button_info = NULL; /* toplevel node of pulldown menu structure */ static void set_menu_info(void *val, XtActionProc proc, Boolean (*cmp)(), struct button_info *item) { size_t i; ASSERT(item != NULL, "item in set_menu_info musn't be NULL!"); for (i = 0; i < item->size; i++) { if ((item->elems[i].type == BT_RADIO || item->elems[i].type == BT_CHECK) && item->elems[i].action != NULL && item->elems[i].action->proc != NULL && item->elems[i].action->proc == proc && item->elems[i].action->param != NULL) { Boolean state; ASSERT(cmp != NULL, "comparison function musn't be NULL!"); state = cmp(val, item->elems[i].action->param); #ifdef MOTIF ASSERT(item->elems[i].widget != 0, "Widget musn't be NULL!"); XmToggleButtonSetState(item->elems[i].widget, state, False); #else if (item->elems[i].widget == 0) { XDVI_WARNING((stderr, "Widget for menu `%s' is null!", item->elems[i].title)); continue; } xaw_set_button_state(item->elems + i, state); #endif } if (item->elems[i].submenu != NULL) { /* invoke it recursively */ set_menu_info(val, proc, cmp, item->elems[i].submenu); } } } /* set a menu according to val and the compare function cmp */ void set_menu(void *val, XtActionProc proc, Boolean (*cmp)()) { /* removed following since cast from function pointer to void pointer is not supported by ANSI C */ /* TRACE_GUI((stderr, "set_menu_info: %d, %p, %p", *(int *)val, (void *)proc, (void *)cmp)); */ set_menu_info(val, proc, cmp, m_button_info); } static void initialize_menus(void) { int use_gs; int shrinkval; /* initialize tickmarks for all possible actions */ use_gs = resource.postscript; #ifdef PS_GS if (!resource.useGS) use_gs = 0; #endif set_menu(&use_gs, Act_set_ps, check_int); #ifdef PS_GS set_menu(&resource.gs_alpha, Act_set_gs_alpha, check_toggle); #endif set_menu(&resource.keep_flag, Act_set_keep_flag, check_toggle); shrinkval = resource.pixels_per_inch / mane.shrinkfactor; set_menu(&shrinkval, Act_shrink_to_dpi, check_int); set_menu(&mane.shrinkfactor, Act_set_shrink_factor, check_int); set_menu(&resource.use_tex_pages, Act_use_tex_pages, check_toggle); #if 0 set_menu((char *)resource.paper, Act_set_paper_landscape, check_paper_landscape); set_menu((char *)resource.paper, Act_set_papersize, check_papersize); #endif /* 0 */ set_menu(&resource.mouse_mode, Act_switch_mode, check_int); set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert); } static void free_items(char **items, size_t len) { size_t curr = 0; while(curr < len) { free(items[curr++]); } free(items); } #if 0 static void show_items(char *descr, char **items, size_t len) { size_t i; for (i = 0; i < len; i++) { fprintf(stderr, "%s %d: |%s|\n", descr, i, items[i]); } } #endif static void add_info(struct button_info **info, buttonTypeT bt_type, char mnemonic, const char *title, const char *accelerator, struct xdvi_action *action) { size_t idx = (*info)->size++; (*info)->elems = xrealloc((*info)->elems, (*info)->size * sizeof *((*info)->elems)); (*info)->elems[idx].title = xstrdup(title); (*info)->elems[idx].type = bt_type; if (accelerator == NULL || accelerator[0] == '\0') (*info)->elems[idx].accelerator = NULL; else (*info)->elems[idx].accelerator = xstrdup(accelerator); (*info)->elems[idx].mnemonic = mnemonic; (*info)->elems[idx].action = action; (*info)->elems[idx].widget = 0; (*info)->elems[idx].submenu = NULL; } static void insert_items(struct button_info **info, char **items, size_t num_items, const char *button_type, const char *accelerator, const char *action) { const char ENTRY_SEP = '|'; size_t i = 0; size_t entry_len; size_t entry_count = 0; char **entry_items = NULL; size_t idx; Boolean found = False; Boolean have_error = False; if (*items == NULL) { /* should be a separator, which is treated as a special case since there's no menu title: */ if (strcmp (button_type, "SEP") == 0) add_info(info, BT_SEP, '\0', "SEP", NULL, NULL); else XDVI_WARNING((stderr, "Shouldn't happen: items == NULL!")); return; } entry_len = strlen(items[0]); entry_items = split_line(items[0], ENTRY_SEP, 0, entry_len, &entry_count); if (entry_count < 2) { XDVI_WARNING((stderr, "Missing Mnemonic in button info `%s'", items[0])); entry_count++; entry_items = xrealloc(entry_items, entry_count * sizeof *entry_items); entry_items[1] = xstrdup(""); entry_items[2] = NULL; } for (i = 0; i < (*info)->size; i++) { if (strcmp(entry_items[0], (*info)->elems[i].title) == 0) { found = true; break; } } idx = i; if (!found) { /* new item, resize info and add this item */ struct xdvi_action *my_action = NULL; buttonTypeT my_type = BT_NONE; /* if it's a `leaf' in the menu hierarchy, compile the action and set the button type */ if (num_items == 1) { char *fmt = strchr(entry_items[0], '$'); if (fmt != NULL && (fmt == entry_items[0] || (fmt > entry_items[0] && *(fmt - 1) != '\\')) && (fmt[1] == '#' || fmt[1] == '%' ||fmt[1] == '_')) { XDVI_WARNING((stderr, "Xdvik doesn't support format characters in button labels; " "skipping button \"%s\"", items[0])); have_error = True; } if (strlen(action) == 0 || (my_action = compile_action(action)) == NULL) { XDVI_WARNING((stderr, "Invalid action \"%s\" for button \"%s\" (skipping this line).", action, items[0])); have_error = True; } if ((my_type = get_type(button_type)) == BT_INVALID) { XDVI_WARNING((stderr, "Invalid type \"%s\" for button \"%s\" (skipping this line).", button_type, items[0])); have_error = True; } } if (!have_error) { add_info(info, my_type, entry_items[1][0], entry_items[0], accelerator, my_action); } } free_items(entry_items, entry_count); if (num_items > 1 || (num_items == 1 && strcmp(button_type, "SEP") == 0)) { /* not a leaf, invoke recursivly for next level */ if ((*info)->elems[idx].submenu == NULL) { /* submenu didn't exist yet, create it */ struct button_info *new_submenu = xmalloc(sizeof *new_submenu); new_submenu->elems = NULL; new_submenu->size = 0; (*info)->elems[idx].submenu = new_submenu; } insert_items(&((*info)->elems[idx].submenu), items + 1, num_items - 1, button_type, accelerator, action); } } static void show_button_info(int depth, struct button_info *info) { size_t i; for (i = 0; i < info->size; i++) { TRACE_GUI((stderr, "%*c-->%s; type=%d; mnemonic=%c; accel=%s; submenu=%p; w=%lu; action: %p", depth, ' ', info->elems[i].title, info->elems[i].type, info->elems[i].mnemonic, info->elems[i].accelerator ? info->elems[i].accelerator : "", (void *)info->elems[i].submenu, (unsigned long)info->elems[i].widget, (void *)info->elems[i].action)); if (info->elems[i].submenu != NULL) { show_button_info(depth + 3, info->elems[i].submenu); } } } static void parse_button_translations(struct button_info **info) { const char *curr_p, *end_p; const char LINE_SEP = ':'; const char MENU_SEP = '>'; for (curr_p = resource.menu_translations; curr_p != NULL && *curr_p != '\0'; curr_p = end_p + 1) { end_p = strchr(curr_p, '\n'); if (end_p != NULL) { size_t line_len = end_p - curr_p; size_t line_count = 0; char **line_items; line_items = split_line(curr_p, LINE_SEP, 0, line_len, &line_count); /* fprintf(stderr, "length of line: %d; %d items\n", line_len, line_count); */ /* show_items("LINE", line_items, line_count); */ if (line_count != 4) { /* error */ XDVI_WARNING((stderr, "Wrong number of items (%lu) in translations line:\n\"%.*s\" " "(skipping this line).\n", (unsigned long)line_count, (int)line_len, curr_p)); free_items(line_items, line_count); continue; } else { /* split first elem into menu description */ size_t menu_len = strlen(line_items[0]); size_t menu_count = 0; char **menu_items; if (menu_len == 0) { /* error */ XDVI_WARNING((stderr, "Menu description (first item) mustn't be empty:\n\"%.*s\" " "(skipping this line).\n", (int)line_len, curr_p)); free_items(line_items, line_count); continue; } menu_items = split_line(line_items[0], MENU_SEP, 0, menu_len, &menu_count); /* show_items(" MENU", menu_items, menu_count); */ insert_items(info, menu_items, menu_count, line_items[1], line_items[2], line_items[3]); free_items(menu_items, menu_count); } free_items(line_items, line_count); } } show_button_info(0, *info); } /* Top-level routine: creates the pulldown menu buttons for Motif and Xaw. For Motif, sets `*menu_bar' to the address of the new widget created, for Xaw, sets *width to the width of the button panel created. */ void create_menu_buttons(Widget parent, #ifdef MOTIF Widget *menu_bar #else int *width #endif ) { #ifdef MOTIF Widget menu = 0; size_t i; #else /* MOTIF */ Widget panel = 0; #endif m_button_info = xmalloc(sizeof *m_button_info); m_button_info->elems = NULL; m_button_info->size = 0; #ifdef MOTIF *menu_bar = XmCreateMenuBar(parent, "menuBar", NULL, 0); parse_button_translations(&m_button_info); for (i = 0; i < m_button_info->size; i++) { menu = xm_create_menu(*menu_bar, m_button_info->elems[i].title, m_button_info->elems[i].mnemonic, m_button_info->elems[i].submenu); } if (menu != 0) { XtVaSetValues(*menu_bar, XmNmenuHelpWidget, menu, NULL); } #else /* MOTIF */ xaw_initialize_menu_bitmaps(); panel = xaw_create_menu_widgets(parent); parse_button_translations(&m_button_info); xaw_create_menu(m_button_info, panel, width); #endif /* MOTIF */ initialize_menus(); } xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefsP.h0000664000175000017500000001200411032450154021053 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * `Private' common header for preferences dialogs. */ #ifndef XM_PREFS_P_H_ #define XM_PREFS_P_H_ #include "xdvi.h" #include "xdvi-config.h" #ifdef MOTIF /* * For consistency when also using the names for XtNameToWidget() in callbacks */ /* widget names */ #define Xdvi_PREFS_DIALOG_NAME "preferences_window" #define Xdvi_COLOR_DIALOG_NAME "color_dialog" #define Xdvi_COLOR_DIALOG_OLD_SAMPLE_NAME "old_sample" #define Xdvi_BROWSER_MENU_NAME "browser_menu" #define Xdvi_BROWSER_COMBO_NAME "browser_combo" #define Xdvi_EDITOR_MENU_NAME "editor_menu" #define Xdvi_EDITOR_COMBO_NAME "editor_combo" #define Xdvi_EDITOR_POPUP_NAME "editor_prompt" #define Xdvi_EDITOR_POPUP "editor_prompt_popup" #define Xdvi_BROWSER_POPUP_NAME "browser_prompt" #define Xdvi_BROWSER_POPUP "browser_prompt_popup" #define Xdvi_TIPS_STATUSLINE "tips_statusline" #define Xdvi_TIPS_POPUPS "tips_popups" #define Xdvi_TIPS_DELAY_TEXT "tips_delay_text" #define Xdvi_TIPS_DELAY_LABEL1 "tips_delay_label1" #define Xdvi_TIPS_DELAY_LABEL2 "tips_delay_label2" #define Xdvi_HOME_POSITION_X_OFF_TEXT "x_off_text" #define Xdvi_HOME_POSITION_Y_OFF_TEXT "y_off_text" #define Xdvi_HOME_POSITION_UNITS_MENU "units_menu" #define Xdvi_HOME_POSITION_UNITS_PULLDOWN "units_pulldown" #define Xdvi_DARKNESS_SPINBOX "darkness_spinbox" #define Xdvi_DARKNESS_TEXT "darkness_text" #define Xdvi_SHRINK_SPINBOX "shrink_spinbox" #define Xdvi_SHRINK_TEXT "shrink_text" #define Xdvi_PAPER_CASCADE "papersize_option" #define Xdvi_PAPER_MENU "papersize_menu" /* widget labels that are also used as widget names */ #define Xdvi_TB_BUTTONS_FLAT_STR "Flat" #define Xdvi_TB_BUTTONS_RAISED_STR "Raised" #define Xdvi_GUI_STATUSLINE_STR "Show Statusline" #define Xdvi_GUI_TOOLBAR_STR "Show Toolbar" #define Xdvi_GUI_PAGELIST_STR "Show Pagelist" #define Xdvi_GUI_SCROLLBARS_STR "Show Scrollbars" #define Xdvi_MATCH_INVERTED_STR "Inverted" #define Xdvi_MATCH_BOXED_STR "Boxed with Highlight Color" #define Xdvi_FG_COLOR_STR "Text:" #define Xdvi_FG_COLOR_BTN "fg_button" #define Xdvi_BG_COLOR_STR "Background:" #define Xdvi_BG_COLOR_BTN "bg_button" #define Xdvi_HL_COLOR_BTN "hl_button" #define Xdvi_VISITED_LINKS_STR "Visited Links:" #define Xdvi_VISITED_LINKS_BTN "visited_links_button" #define Xdvi_UNVISITED_LINKS_STR "Unvisited Links:" #define Xdvi_UNVISITED_LINKS_BTN "unvisited_links_button" #define Xdvi_DOCUMENT_COLORS_STR "Use Document Colors" #define Xdvi_LINKS_UNDERLINED_STR "Underlined" #define Xdvi_ADD_COMMAND_STR "Other ..." #define Xdvi_SCROLL_KEEP_STR "Keep current position" #define Xdvi_SCROLL_UNKEEP_STR "Scroll back to home position of page" #define Xdvi_HOME_POSITION_STR "Home position at:" #define Xdvi_HOME_POSITION_X_STR "x" #define Xdvi_HOME_POSITION_Y_STR "y" #define Xdvi_SCROLL_CURRENT_STR "Use current position as home position" #define Xdvi_REMEMBER_WINDOWSIZE_STR "Remember current window size" #define Xdvi_PAPER_PORTRAIT_STR "Portrait" #define Xdvi_PAPER_LANDSCAPE_STR "Landscape" #define Xdvi_APPLY_STR "Apply" #define Xdvi_PREFS_BROWSER_DEFAULTS \ "xdg-open %s\n" \ "htmlview %s\n" \ "firefox -remote \"openURL(%s,new-window)\"\n" \ "mozilla -remote \"openURL(%s,new-window)\"\n" \ "netscape -raise -remote \"openURL(%s,new-window)\"\n" \ "xterm -e w3m %s\n" \ "xterm -e lynx %s\n" \ "xterm -e wget %s\n" \ Xdvi_ADD_COMMAND_STR #define Xdvi_PREFS_EDITOR_DEFAULTS \ "gnuclient -q +%l %f\n" \ "emacsclient --no-wait +%l %f\n" \ "gvim --servername xdvi --remote +%l %f\n" \ "nc -noask +%l %f\n" \ "xterm -e vi +%l %f\n" \ Xdvi_ADD_COMMAND_STR struct prefs_choice { XrmDatabase db; /* struct x_resources *orig; */ /* struct x_resources *changed; */ Widget *depwin; size_t depwin_cnt; }; extern void h_attach_below(Widget x, Widget y); extern void h_update_hyperlinks(Widget w, Pixel pix); /* implemented in xm_prefs_fonts.c */ #endif /* MOTIF */ #endif /* XM_PREFS_P_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/Panner.h0000664000175000017500000000763210363262237020357 0ustar uwabamiuwabami/* * $XConsortium: Panner.h,v 1.22 94/04/17 20:12:32 rws Exp $ * Copyright (c) 1989 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 CONNECTION 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 dealings in this Software without prior written authorization from the X Consortium. * * Author: Jim Fulton, MIT X Consortium */ #ifndef _XawPanner_h #define _XawPanner_H #include /***************************************************************************** * * Panner Widget (subclass of Simple) * * This widget is used to represent navigation in a 2d coordinate system. * * Parameters: * * Name Class Type Default * ---- ----- ---- ------- * * allowOff AllowOff Boolean FALSE * background Background Pixel XtDefaultBackground * backgroundStipple BackgroundStipple String NULL * canvasWidth CanvasWidth Dimension 0 * canvasHeight CanvasHeight Dimension 0 * defaultScale DefaultScale Dimension 8 percent * foreground Foreground Pixel XtDefaultBackground * internalSpace InternalSpace Dimension 4 * lineWidth LineWidth Dimension 0 * reportCallback ReportCallback XtCallbackList NULL * resize Resize Boolean TRUE * rubberBand RubberBand Boolean FALSE * shadowColor ShadowColor Pixel XtDefaultForeground * shadowThickness ShadowThickness Dimension 2 * sliderX SliderX Position 0 * sliderY SliderY Position 0 * sliderWidth SliderWidth Dimension 0 * sliderHeight SliderHeight Dimension 0 * *****************************************************************************/ /* new instance and class names */ #ifndef _XtStringDefs_h_ #define XtNresize "resize" #define XtCResize "Resize" #endif #define XtNallowOff "allowOff" #define XtCAllowOff "AllowOff" #define XtNbackgroundStipple "backgroundStipple" #define XtCBackgroundStipple "BackgroundStipple" #define XtNdefaultScale "defaultScale" #define XtCDefaultScale "DefaultScale" #define XtNcanvasWidth "canvasWidth" #define XtCCanvasWidth "CanvasWidth" #define XtNcanvasHeight "canvasHeight" #define XtCCanvasHeight "CanvasHeight" #define XtNinternalSpace "internalSpace" #define XtCInternalSpace "InternalSpace" #define XtNlineWidth "lineWidth" #define XtCLineWidth "LineWidth" #define XtNrubberBand "rubberBand" #define XtCRubberBand "RubberBand" #define XtNshadowThickness "shadowThickness" #define XtCShadowThickness "ShadowThickness" #define XtNshadowColor "shadowColor" #define XtCShadowColor "ShadowColor" #define XtNsliderX "sliderX" #define XtCSliderX "SliderX" #define XtNsliderY "sliderY" #define XtCSliderY "SliderY" #define XtNsliderWidth "sliderWidth" #define XtCSliderWidth "SliderWidth" #define XtNsliderHeight "sliderHeight" #define XtCSliderHeight "SliderHeight" /* external declarations */ extern WidgetClass pannerWidgetClass; typedef struct _PannerClassRec *PannerWidgetClass; typedef struct _PannerRec *PannerWidget; #endif /* _XawPanner_h */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/print-log.h0000664000175000017500000000401111032450154021022 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 Paul Vojta and the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef PRINT_LOG_H_ #define PRINT_LOG_H_ struct save_or_print_info *info; /* forward declaration */ /* printlog access functions */ extern void printlog_create(struct save_or_print_info *info, const char *title, const char *close_label); extern Boolean printlog_raise_active(struct save_or_print_info *info); extern void printlog_popup(struct save_or_print_info *info); extern void printlog_reset(struct save_or_print_info *info); extern void printlog_append(struct save_or_print_info *info, const char *str, size_t len); extern void printlog_append_str(struct save_or_print_info *info, const char *str); extern void printlog_enable_closebutton(struct save_or_print_info *info); extern void printlog_enable_cancelbutton(struct save_or_print_info *info); extern void printlog_popdown(struct save_or_print_info *info, Boolean override_timer); #endif /* PRINT_LOG_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xlwradio.h0000664000175000017500000000653010363262237020761 0ustar uwabamiuwabami/* adapted from xlwradio.c in the XEmacs distribution. Changes are Copyright (C) 2002-2004 the xdvik development team Original copyright follows: */ /* Radio Widget for XEmacs. Copyright (C) 1999 Edward A. Falk This file is part of XEmacs. XEmacs is free software; you can 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. XEmacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with XEmacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Synched up with: Radio.h 1.1 */ /* * Radio.h - Radio button widget * * Author: Edward A. Falk * falk@falconer.vip.best.com * * Date: June 30, 1997 */ #ifndef _XawRadio_h #define _XawRadio_h #include "xdvi-config.h" #ifndef MOTIF /* entire file */ /*********************************************************************** * * Radio Widget * * The Radio widget is identical to the Toggle widget in behavior but * not in appearance. The Radio widget looks like a small diamond * shaped button to the left of the label. * (SU: changed this to use a bitmap instead.) * ***********************************************************************/ #include #include #include #include #include #include #include #include /* Resources: Name Class RepType Default Value ---- ----- ------- ------------- radioGroup RadioGroup Widget NULL radioData RadioData Pointer (XPointer) Widget isRadio IsRadio Booelan True state State Boolean Off background Background Pixel XtDefaultBackground bitmap Pixmap Pixmap None border BorderColor Pixel XtDefaultForeground borderWidth BorderWidth Dimension 1 callback Callback Pointer NULL cursor Cursor Cursor None destroyCallback Callback Pointer NULL font Font XFontStructx* XtDefaultFont foreground Foreground Pixel XtDefaultForeground height Height Dimension text height highlightThickness Thickness Dimension 2 insensitiveBorder sensitive Pixmap Gray internalHeight Height Dimension 2 internalWidth Width Dimension 4 justify Justify XtJustify XtJustifyCenter label Label String NULL mappedWhenManaged MappedWhenManaged Boolean True resize Resize Boolean True sensitive Sensitive Boolean True width Width Dimension text width x Position Position 0 y Position Position 0 */ /* * These should be in StringDefs.h but aren't so we will define * them here if they are needed. */ extern WidgetClass radioWidgetClass; typedef struct _RadioClassRec *RadioWidgetClass; typedef struct _RadioRec *RadioWidget; #define XtNisRadio "isRadio" #define XtCIsRadio "IsRadio" /************************************************************ * * Public Functions * ************************************************************/ #endif /* MOTIF */ #endif /* _XawRadio_h */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/message-window.c0000664000175000017500000010560311217712530022050 0ustar uwabamiuwabami/*------------------------------------------------------------ message-window.c: message popups for xdvi. 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. ------------------------------------------------------------*/ /* ============================================ Suggested Policy for using the GUI messages: ============================================ - Use the statusline for shorter messages, a message window for more important messages or such where you'd like to give further help info (see the `helptext' argument of popup_message()). When in doubt, prefer the statusline (excessive use of popup windows is a nuisance for the user). - Don't use any of the GUI messages to report internal workings of the program; for important internal information, there should be a debugging setting to print it to stderr. Use the GUI messages only in situations such as the following: - to give the user feedback on actions that (s)he initiated - to indicate that an internal action causes a delay perceptible by the user (as a rough guide: a delay of more than half a second) - to report situations that might require new actions by the user. */ #include #include "xdvi-config.h" #include "xdvi.h" #include "string-utils.h" /* Xaw specific stuff */ #include #include #ifdef MOTIF # include # include # include # include # include # include # include # include #else # include # include # include # include # include # include # include # include #endif #include #include "xdvi.h" #include "util.h" #include "string-utils.h" #include "x_util.h" #include "message-window.h" /* have no more than MAX_POPUPS open simultaneously */ #define MAX_POPUPS 10 /* offset for cascading popups */ #define POPUP_OFFSET ((my_popup_num * 20)) #ifdef MOTIF /* wrap messages after MSG_WRAP_LEN characters at whitespace */ #define MSG_WRAP_LEN 60 #endif /* array of active popups: */ static int g_popup_array[MAX_POPUPS]; static Atom WM_DELETE_WINDOW; /* arrays for saving the widgets of multiple popups; * same index as in g_popup_array: */ #ifdef MOTIF static Widget popup_window[MAX_POPUPS], dialog[MAX_POPUPS]; #else static Widget popup_window[MAX_POPUPS], message_box[MAX_POPUPS], message_text[MAX_POPUPS], message_paned[MAX_POPUPS], message_ok[MAX_POPUPS], message_help[MAX_POPUPS], message_not_ok[MAX_POPUPS]; #endif /* map popupMessageT's to strings/motif dialog elements */ static struct message_map { char *window_title; #ifdef MOTIF int motif_msg_type; #endif } my_msg_map[] = { { "Xdvi Question" #ifdef MOTIF , XmDIALOG_QUESTION #endif }, { "Xdvi Help" #ifdef MOTIF , XmDIALOG_INFORMATION #endif }, { "Xdvi Info" #ifdef MOTIF , XmDIALOG_INFORMATION #endif }, { "Xdvi Warning" #ifdef MOTIF , XmDIALOG_WARNING #endif }, { "Xdvi Error" #ifdef MOTIF , XmDIALOG_ERROR #endif }, }; struct ok_or_cancel_cb { message_cbT callback; /* callback function */ XtPointer arg; /* arg for callback function */ }; struct pre_ok_or_cancel_cb { pre_message_cbT callback; /* callback function */ XtPointer arg; /* arg for callback function */ }; static struct ok_or_cancel_cb yes_callbacks[MAX_POPUPS]; static struct ok_or_cancel_cb no_callbacks[MAX_POPUPS]; static struct ok_or_cancel_cb cancel_callbacks[MAX_POPUPS]; static struct pre_ok_or_cancel_cb pre_callbacks[MAX_POPUPS]; static void popdown_cancel(Widget w, XEvent *event, String *params, Cardinal *num_params) { size_t idx; UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); ASSERT(*num_params == 1, "Wrong number of parameters in callback"); idx = strtoul(*params, (char **)NULL, 10); /* First call pre_message_cb with window widget ID * as additional parameter. */ if (pre_callbacks[idx].callback != NULL) { pre_callbacks[idx].callback(popup_window[idx], pre_callbacks[idx].arg); } /* Then pop down window and mark its position as free, then * invoke the OK callback. The reason for this is that the callback * may need to wait for open windows. */ XtPopdown(popup_window[idx]); XtDestroyWidget(popup_window[idx]); g_popup_array[idx] = 0; XSync(DISP, True); /* invoke the callback if present */ if (cancel_callbacks[idx].callback != NULL) { cancel_callbacks[idx].callback(cancel_callbacks[idx].arg); } } #ifndef MOTIF static void xaw_popdown(Widget w, XEvent *event, String *params, Cardinal *num_params) { size_t idx; UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); ASSERT(*num_params == 1, "Wrong number of parameters in callback"); idx = strtoul(*params, (char **)NULL, 10); /* NOTE: first pop down window and mark its position as free, then invoke the callback. The reason for this is that the callback may need to wait for open windows. */ XtPopdown(popup_window[idx]); XtDestroyWidget(popup_window[idx]); g_popup_array[idx] = 0; XSync(DISP, True); } #endif static XtActionsRec popdown_actions[] = { {"close-popup-cancel", popdown_cancel }, #if !MOTIF {"WM_popdown", popdown_cancel }, {"close-popup", xaw_popdown }, #endif }; static void ok_action(Widget w, XtPointer client_data, XtPointer call_data) { XtPointer p; ptrdiff_t idx = -1; UNUSED(call_data); #if MOTIF UNUSED(client_data); XtVaGetValues(w, XmNuserData, &p, NULL); idx = (ptrdiff_t)p; ASSERT(idx >= 0, "Couldn't get idx from XmNuserData!"); #else UNUSED(p); UNUSED(w); idx = (ptrdiff_t)client_data; #endif #if DEBUG fprintf(stderr, "ok_action called for popup %ld\n", idx); #endif ASSERT(idx >= 0 && idx < MAX_POPUPS, "Invalid widget index in ok_action()"); /* First call pre_message_cb with window widget ID * as additional parameter. */ if (pre_callbacks[idx].callback != NULL) { pre_callbacks[idx].callback(popup_window[idx], pre_callbacks[idx].arg); } /* Then pop down window and mark its position as free, then * invoke the OK callback. The reason for this is that the callback * may need to wait for open windows. */ XtPopdown(popup_window[idx]); XtDestroyWidget(popup_window[idx]); g_popup_array[idx] = 0; XSync(DISP, True); if (yes_callbacks[idx].callback != NULL) { yes_callbacks[idx].callback(yes_callbacks[idx].arg); } } /*------------------------------------------------------------ * help_action * * Arguments: * Widget w, XtPointer call_data * - (ignored) * XtPointer client_data * - the help string * * Returns: * void * * Purpose: * Callback for the `Help' button; opens another window * containing the help text. The new window won't have * another `Help' button. *------------------------------------------------------------*/ static void help_action(Widget w, XtPointer client_data, XtPointer call_data) { UNUSED(call_data); /* open another window with the help text */ popup_message(get_matching_parent(w, globals.widgets.top_level, "message_popup", NULL), MSG_HELP, NULL, client_data); } /* * Callback for cancel button in choice_dialog. */ static void cancel_action(Widget w, XtPointer client_data, XtPointer call_data) { XtPointer p; ptrdiff_t idx = -1; UNUSED(call_data); #if MOTIF /* for motif, the index is in XmNuserData */ UNUSED(client_data); if (strcmp(XtName(w), Xdvi_MESSAGE_SHELL_NAME) == 0) { /* invoked by the WM, get the messagebox child */ Widget child; if (get_widget_by_name(&child, w, Xdvi_MESSAGE_DIALOG_NAME, True)) { XtVaGetValues(child, XmNuserData, &p, NULL); idx = (ptrdiff_t)p; } } else { XtVaGetValues(w, XmNuserData, &p, NULL); idx = (ptrdiff_t)p; } ASSERT(idx >= 0, "Couldn't get idx from XmNuserData!"); #else UNUSED(p); UNUSED(w); idx = (ptrdiff_t)client_data; #endif ASSERT(idx >= 0 && idx < MAX_POPUPS, "Invalid widget index in cancel_action()"); /* First call pre_message_cb with window widget ID * as additional parameter. */ if (pre_callbacks[idx].callback != NULL) { pre_callbacks[idx].callback(popup_window[idx], pre_callbacks[idx].arg); } /* Then pop down window and mark its position as free, then * invoke the OK callback. The reason for this is that the callback * may need to wait for open windows. */ XtPopdown(popup_window[idx]); XtDestroyWidget(popup_window[idx]); g_popup_array[idx] = 0; XSync(DISP, True); /* invoke the callback if present */ if (cancel_callbacks[idx].callback != NULL) { cancel_callbacks[idx].callback(cancel_callbacks[idx].arg); } } #if MOTIF static void not_ok_action(Widget w, XtPointer client_data, XtPointer call_data) { /* Note: unmanages the parent of the button */ XtPointer p; ptrdiff_t idx = -1; UNUSED(client_data); UNUSED(call_data); XtVaGetValues(w, XmNuserData, &p, NULL); idx = (ptrdiff_t)p; ASSERT(idx >= 0, "Couldn't get idx from XmNuserData!"); ASSERT(idx >= 0 && idx < MAX_POPUPS, "Invalid widget index in ok_action()"); /* First call pre_message_cb with window widget ID * as additional parameter. */ if (pre_callbacks[idx].callback != NULL) { pre_callbacks[idx].callback(popup_window[idx], pre_callbacks[idx].arg); } /* Then pop down window and mark its position as free, then * invoke the OK callback. The reason for this is that the callback * may need to wait for open windows. */ XtPopdown(popup_window[idx]); XtDestroyWidget(popup_window[idx]); g_popup_array[idx] = 0; XSync(DISP, True); if (no_callbacks[idx].callback != NULL) { no_callbacks[idx].callback(no_callbacks[idx].arg); } } #endif /* MOTIF */ /*------------------------------------------------------------ * create_dialogs * * Arguments: * Widget toplevel - parent for the dialog window * * helptext - if not-NULL, create an additional * `help' button * * cnt - number of current popup dialog * * Returns: * void * * Purpose: * Create message dialog widgets *------------------------------------------------------------*/ static Widget create_dialogs(popupMessageSizeHintT size, Widget parent, int cnt, const char *helptext, pre_message_cbT pre_cb, XtPointer arg, const char *yes_button, message_cbT yes_cb, XtPointer yes_arg, const char *no_button, message_cbT no_cb, XtPointer no_arg, const char *cancel_button, message_cbT cancel_cb, XtPointer cancel_arg) { Widget new_popup_window; char *translations_str = NULL; #ifdef MOTIF Widget new_dialog; UNUSED(size); #else char *key_translations_str = NULL; int msg_w = 400, msg_h = 100; Widget new_message_paned, new_message_text, new_message_box, new_message_ok, new_message_help = 0, new_message_not_ok; XtTranslations wm_translations, key_translations; #endif /* save callbacks to global arrays */ pre_callbacks[cnt].callback = pre_cb; pre_callbacks[cnt].arg = arg; yes_callbacks[cnt].callback = yes_cb; yes_callbacks[cnt].arg = yes_arg; no_callbacks[cnt].callback = no_cb; no_callbacks[cnt].arg = no_arg; cancel_callbacks[cnt].callback = cancel_cb; cancel_callbacks[cnt].arg = cancel_arg; XtAddActions(popdown_actions, XtNumber(popdown_actions)); #ifndef MOTIF /* get index into WM_popdown arg */ translations_str = get_string_va("WM_PROTOCOLS: WM_popdown(%d)", cnt); wm_translations = XtParseTranslationTable(translations_str); free(translations_str); #endif if (!XtIsRealized(globals.widgets.top_level)) { /* If toplevel window hasn't been realized yet, create a new toplevel shell (otherwise, setting visual/color map wouldn't work); use same application names so that resource settings will also apply to this window. */ new_popup_window = XtVaAppCreateShell("xdvi", "Xdvi", transientShellWidgetClass, DISP, NULL); } else { new_popup_window = XtVaCreatePopupShell(Xdvi_MESSAGE_SHELL_NAME, #ifdef MOTIF xmDialogShellWidgetClass, parent, XmNdeleteResponse, XmDO_NOTHING, /* we'll take care of that ourselves */ #else transientShellWidgetClass, parent, XtNx, 60, XtNy, 80, XtNtranslations, wm_translations, XtNaccelerators, G_accels_cr, #endif XtNtransientFor, parent, XtNmappedWhenManaged, False, NULL); } #ifdef MOTIF WM_DELETE_WINDOW = XmInternAtom(XtDisplay(new_popup_window), "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(new_popup_window, WM_DELETE_WINDOW, cancel_action, NULL); /* We also need to override the default ESC binding to use our internal housekeeping functions */ translations_str = get_string_va("#override\nosfCancel:close-popup-cancel(%d)", cnt); /* { */ /* XtTranslations xlats; */ /* char *translation_str = get_string_va("osfCancel:close-popup-cancel(%d)", cnt); */ /* xlats = XtParseTranslationTable(translation_str); */ /* free(translation_str); */ /* XtOverrideTranslations(new_dialog, xlats); */ /* } */ new_dialog = XtVaCreateWidget(Xdvi_MESSAGE_DIALOG_NAME, xmMessageBoxWidgetClass, new_popup_window, XmNdialogType, XmDIALOG_WARNING, /* default */ XmNtraversalOn, True, XmNhighlightOnEnter, True, XmNuserData, cast_int_to_XtPointer(cnt), XmNtranslations, XtParseTranslationTable(translations_str), NULL); free(translations_str); XtAddCallback(new_dialog, XmNokCallback, ok_action, NULL); if (no_button != NULL) { Arg args[4]; Widget b; XmString b_str = XmStringCreateLocalized((char *)no_button); XtSetArg(args[0], XmNlabelString, b_str); b = XmCreatePushButton(new_dialog, "no_button", args, 1); XtAddCallback(b, XmNactivateCallback, not_ok_action, NULL); XtManageChild(b); } if (cancel_button != NULL) { XmString cancel_label = XmStringCreateLtoR((char *)cancel_button, G_charset); XtVaSetValues(XmMessageBoxGetChild(new_dialog, XmDIALOG_CANCEL_BUTTON), XmNlabelString, cancel_label, NULL); XmStringFree(cancel_label); XtAddCallback(new_dialog, XmNcancelCallback, cancel_action, NULL); } else { XtUnmanageChild(XmMessageBoxGetChild(new_dialog, XmDIALOG_CANCEL_BUTTON)); } XtInstallAllAccelerators(new_dialog, XmMessageBoxGetChild(new_dialog, XmDIALOG_OK_BUTTON)); if (helptext != NULL) { XtAddCallback(new_dialog, XmNhelpCallback, help_action, (XtPointer)helptext); } else { XtUnmanageChild(XmMessageBoxGetChild(new_dialog, XmDIALOG_HELP_BUTTON)); } if (yes_button != NULL) { /* change `OK' button label */ XmString yes_label; yes_label = XmStringCreateLtoR((char *)yes_button, G_charset); XtVaSetValues(XmMessageBoxGetChild(new_dialog, XmDIALOG_OK_BUTTON), XmNlabelString, yes_label, NULL); XmStringFree(yes_label); } /* insert the new widgets into the global arrays */ dialog[cnt] = new_dialog; #else /* MOTIF */ switch (size) { case SIZE_SMALL: msg_w = 300; msg_h = 100; break; case SIZE_MEDIUM: msg_w = 430; msg_h = 160; break; case SIZE_LARGE: msg_w = 450; msg_h = 180; break; } WM_DELETE_WINDOW = XInternAtom(XtDisplay(new_popup_window), "WM_DELETE_WINDOW", False); new_message_paned = XtVaCreateManagedWidget("message_paned", panedWidgetClass, new_popup_window, XtNaccelerators, G_accels_cr, NULL); new_message_text = XtVaCreateManagedWidget("message_text", asciiTextWidgetClass, new_message_paned, /* XtNheight, 100, */ /* XtNwidth, 400, */ XtNwidth, msg_w, XtNheight, msg_h, /* wrap horizontally instead of scrolling * TODO: this won't work for the first widget instance? */ XtNwrap, XawtextWrapWord, XtNscrollVertical, XAW_SCROLL_ALWAYS, XtNeditType, XawtextRead, XtNinput, True, XtNdisplayCaret, False, XtNleftMargin, 5, XtNaccelerators, G_accels_cr, NULL); /* box for the OK/Cancel button */ new_message_box = XtVaCreateManagedWidget("message_box", formWidgetClass, new_message_paned, /* resizing by user isn't needed */ XtNshowGrip, False, XtNdefaultDistance, 6, /* some padding */ /* resizing the window shouldn't influence this box, * but only the text widget */ XtNskipAdjust, True, XtNaccelerators, G_accels_cr, NULL); new_message_ok = XtVaCreateManagedWidget(yes_button == NULL ? "OK" : yes_button, commandWidgetClass, new_message_box, XtNtop, XtChainTop, XtNbottom, XtChainBottom, XtNleft, XtChainLeft, XtNright, XtChainLeft, XtNaccelerators, G_accels_cr, NULL); /* add quit_action callback for the "OK" button */ /* FIXME: how to make accelerators be accepted by new_popup_window as well? */ key_translations_str = get_string_va("q:close-popup-cancel(%d)\n" "Return:close-popup-cancel(%d)\n" "Escape:close-popup-cancel(%d)\n", cnt, cnt, cnt); key_translations = XtParseTranslationTable(key_translations_str); free(key_translations_str); XtOverrideTranslations(new_popup_window, key_translations); XtOverrideTranslations(new_message_paned, key_translations); XtOverrideTranslations(new_message_text, key_translations); XtInstallAllAccelerators(new_message_box, new_message_ok); XtAddCallback(new_message_ok, XtNcallback, ok_action, cast_int_to_XtPointer(cnt)); /* we create additional buttons in any case, to make the sizing more consistent */ new_message_help = XtVaCreateManagedWidget("Help", commandWidgetClass, new_message_box, XtNtop, XtChainTop, XtNfromHoriz, new_message_ok, XtNbottom, XtChainBottom, XtNleft, XtChainRight, XtNright, XtChainRight, XtNaccelerators, G_accels_cr, NULL); message_help[cnt] = new_message_help; /* add cancel button */ new_message_not_ok = XtVaCreateManagedWidget(cancel_button == NULL ? "Cancel" : cancel_button, commandWidgetClass, new_message_box, XtNtop, XtChainTop, XtNfromHoriz, new_message_ok, XtNbottom, XtChainBottom, XtNleft, helptext == NULL ? XtChainRight : XtChainLeft, XtNright, helptext == NULL ? XtChainRight : XtChainLeft, XtNaccelerators, G_accels_cr, NULL); message_not_ok[cnt] = new_message_not_ok; if (no_button != NULL) { ASSERT(0, "third button not yet implemented in Xaw!!!"); } adjust_width_to_max(new_message_ok, new_message_help, new_message_not_ok, NULL); /* if helptext argument is not-NULL, add help_action callback, else unmanage help button */ if (helptext != NULL) { XtAddCallback(new_message_help, XtNcallback, help_action, (XtPointer)helptext); } else { XtUnmanageChild(new_message_help); } if (cancel_button != NULL) { XtAddCallback(new_message_not_ok, XtNcallback, cancel_action, cast_int_to_XtPointer(cnt)); } else { XtUnmanageChild(new_message_not_ok); } /* insert the new widgets into the global arrays */ message_box[cnt] = new_message_box; message_paned[cnt] = new_message_paned; message_text[cnt] = new_message_text; message_ok[cnt] = new_message_ok; #endif /* MOTIF */ popup_window[cnt] = new_popup_window; return new_popup_window; } /* * Popup a window with wrapped text in it. * For Motif, the text is explicitly wrapped inside this method. */ static Widget internal_popup_window(Widget parent, popupMessageSizeHintT size, popupMessageT type, int x_coord, int y_coord, const char *helptext, char *msg_buf, #ifndef MOTIF const char *xaw_ret_action_str, #endif pre_message_cbT pre_cb, XtPointer arg, const char *yes_button, message_cbT yes_cb, XtPointer yes_arg, const char *no_button, message_cbT no_cb, XtPointer no_arg, const char *cancel_button, message_cbT cancel_cb, XtPointer cancel_arg) { char win_title[64]; int my_popup_num = 0; #ifdef MOTIF XmString str; #endif Widget ret; ASSERT(type < (sizeof my_msg_map / sizeof my_msg_map[0]), "too few elements in my_msg_map"); sprintf(win_title, my_msg_map[type].window_title); #if DEBUG fprintf(stderr, "internal_popup_window called with prompt: \"%s\"\n", msg_buf); #endif if (globals.widgets.top_level == 0) { /* If toplevel window hasn't been create yet, dump messages to STDERR and return. All text must be passed as arguments to fprintf (NOT puts), since they are supposed to be printf-format strings (i.e. with doubled `%' to escape them) */ fprintf(stderr, "\n%s:\n", my_msg_map[type].window_title); fprintf(stderr, msg_buf); fprintf(stderr, "\n"); if (helptext) { fprintf(stderr, "---------- helptext ----------\n"); fprintf(stderr, helptext); fprintf(stderr, "\n---------- end of helptext ----------\n"); } return NULL; } /* search for first free position in g_popup_array */ while (my_popup_num < MAX_POPUPS && (g_popup_array[my_popup_num] == 1)) { my_popup_num++; } if (my_popup_num == MAX_POPUPS) { /* already enough popups on screen, just dump it to stderr */ fprintf(stderr, "%s: ", win_title); fprintf(stderr, msg_buf); fputc('\n', stderr); /* Note: If a mad function continues to open popups, this will * stop after MAX_POPUPS, but open a new window for each * window the user pops down. Maybe we ought to do something * about this. */ return NULL; } else { /* mark it as non-free */ g_popup_array[my_popup_num] = 1; } #if DEBUG fprintf(stderr, "first free position in g_popup_array: %d\n", my_popup_num); #endif /* just to make sure ... */ if (parent == NULL) parent = globals.widgets.top_level; /* create a new set of widgets for the additional popup. */ ret = create_dialogs(size, parent, my_popup_num, helptext, pre_cb, arg, yes_button, yes_cb, yes_arg, no_button, no_cb, no_arg, cancel_button, cancel_cb, cancel_arg); #ifdef MOTIF XtVaSetValues(popup_window[my_popup_num], XmNtitle, win_title, NULL); XtVaSetValues(dialog[my_popup_num], XmNdialogType, my_msg_map[type].motif_msg_type, NULL); { /* wrap message at space before MSG_WRAP_LEN */ char *testwrap = msg_buf; int ctr; for (ctr = 0; *testwrap++; ctr++) { if (*testwrap == '\n') { ctr = 0; } else if (ctr > MSG_WRAP_LEN) { size_t before_len = 0, after_len = 0; char *before_ptr, *after_ptr; before_ptr = after_ptr = testwrap; /* try to find shortest sequence before or after point to wrap at; this seems to give the most pleasing results. */ while (before_ptr > msg_buf && !isspace((int)*--before_ptr)) { before_len++; } while (*after_ptr != '\0' && !isspace((int)*++after_ptr)) { after_len++; } if (before_len < after_len && isspace((int)*before_ptr)) { /* use last in sequence of multiple spaces */ while (isspace((int)*++before_ptr)) { ; } /* back up, and wrap */ *--before_ptr = '\n'; ctr = 0; } else if (isspace((int)*after_ptr)) { /* use last in sequence of multiple spaces */ while (isspace((int)*++after_ptr)) { ; } /* back up, and wrap */ *--after_ptr = '\n'; ctr = 0; } } } } str = XmStringCreateLtoR((char *)msg_buf, G_charset); XtVaSetValues(dialog[my_popup_num], XmNmessageString, str, XmNtraversalOn, True, XmNhighlightOnEnter, True, NULL); XmStringFree(str); XtManageChild(dialog[my_popup_num]); if (x_coord > 0 && y_coord > 0) { position_window(XtParent(dialog[my_popup_num]), (Position)x_coord, (Position)y_coord); } XtPopup(XtParent(dialog[my_popup_num]), XtGrabNone); /* XtPopup(XtParent(dialog[my_popup_num]), XtGrabExclusive); */ #else /* MOTIF */ /* add a binding of xaw_ret_action_str to to relevant widgets. The callbacks (xaw_ret_action_str) are responsible for parsing the passed arguments (pointers, or empty arguments). */ if (xaw_ret_action_str != NULL) { XtTranslations xlats; char *translation_str; if (yes_arg != NULL) translation_str = get_string_va("Return:close-popup(%d)%s(%p)", my_popup_num, xaw_ret_action_str, yes_arg); else translation_str = get_string_va("Return:close-popup(%d)%s()", my_popup_num, xaw_ret_action_str); xlats = XtParseTranslationTable(translation_str); free(translation_str); XtOverrideTranslations(popup_window[my_popup_num], xlats); XtOverrideTranslations(message_paned[my_popup_num], xlats); XtOverrideTranslations(message_text[my_popup_num], xlats); } XtVaSetValues(popup_window[my_popup_num], XtNtitle, win_title, NULL); XtVaSetValues(message_text[my_popup_num], XtNstring, msg_buf, NULL); XtRealizeWidget(popup_window[my_popup_num]); XSetWMProtocols(XtDisplay(popup_window[my_popup_num]), XtWindow(popup_window[my_popup_num]), &WM_DELETE_WINDOW, 1); if (x_coord <= 0 || y_coord <= 0) center_window(popup_window[my_popup_num], parent); else position_window(popup_window[my_popup_num], (Position)x_coord, (Position)y_coord); if (my_popup_num > 0) { /* some window managers position new windows exactly above the existing one; to prevent this, move it with some offset from the previous one: */ Position x = 0, y = 0; XtVaGetValues(popup_window[my_popup_num-1], XtNx, &x, XtNy, &y, NULL); XtVaSetValues(popup_window[my_popup_num], XtNx, x + POPUP_OFFSET, XtNy, y + POPUP_OFFSET, NULL); } XtPopup(popup_window[my_popup_num], XtGrabNone); /* XtPopup(XtParent(popup_window[my_popup_num]), XtGrabExclusive); */ if (XtIsManaged(message_not_ok[my_popup_num]) && XtIsManaged(message_help[my_popup_num])) { /* center the help button. This is something of a sham, since it won't survive resizing; but in general most users won't resize dialogs ;-) */ Position x1, x2, bw; int w, dist; XtVaGetValues(message_ok[my_popup_num], XtNx, &x1, XtNwidth, &w, XtNborderWidth, &bw, NULL); XtVaGetValues(message_help[my_popup_num], XtNx, &x2, NULL); /* following formula is measured, not calculated - I have no idea why it's e.g. 2 * w, not 1.5 * w ... */ dist = (x2 - x1 - 2 * w) / 2 - 2 * bw; XtVaSetValues(message_not_ok[my_popup_num], XtNhorizDistance, dist, NULL); } #endif /* MOTIF */ return ret; } /*------------------------------------------------------------ * popup_message * * Arguments: * popupMessageT - info, warning, error etc; see message-window.h for details * * char *helptext * - if not-null, this will add a `Help' * button to the message widget that pops * up another message widget containing * . * * * char *msg, ... * - format string followed by a variable * number of arguments to be formatted. * * Returns: * void * * Purpose: * Pop up a message window containing . * If there are already n popups open, will open * a new one unless n >= MAX_POPUPS. *------------------------------------------------------------*/ Widget popup_message(Widget parent, popupMessageT type, const char *helptext, const char *format, ...) { char *msg_buf = NULL; Widget w; XDVI_GET_STRING_ARGP(msg_buf, format); w = internal_popup_window(parent, SIZE_SMALL, type, -1, -1, /* just center it */ helptext, msg_buf, #ifndef MOTIF NULL, #endif /* no special callbacks here */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); free(msg_buf); return w; } Widget popup_message_sized(Widget parent, popupMessageT type, popupMessageSizeHintT sizehint, const char *helptext, const char *format, ...) { char *msg_buf = NULL; Widget w; XDVI_GET_STRING_ARGP(msg_buf, format); w = internal_popup_window(parent, sizehint, type, -1, -1, /* just center it */ helptext, msg_buf, #ifndef MOTIF NULL, #endif /* empty callbacks */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); free(msg_buf); return w; } Widget positioned_popup_message(Widget parent, popupMessageT type, int x, int y, const char *helptext, const char *format, ...) { char *msg_buf = NULL; Widget w; XDVI_GET_STRING_ARGP(msg_buf, format); w = internal_popup_window(parent, SIZE_SMALL, type, x, y, /* position at these coordinates */ helptext, msg_buf, #ifndef MOTIF NULL, #endif /* empty callbacks */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); free(msg_buf); return w; } Widget choice_dialog(Widget parent, popupMessageT type, const char *helptext, #ifndef MOTIF const char *xaw_ret_action_str, #endif pre_message_cbT pre_cb, XtPointer arg, const char *ok_label, message_cbT ok_cb, XtPointer ok_arg, const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_arg, const char *format, ...) { char *msg_buf = NULL; Widget w; XDVI_GET_STRING_ARGP(msg_buf, format); w = internal_popup_window(parent, SIZE_SMALL, type, -1, -1, /* just center it */ helptext, msg_buf, #ifndef MOTIF xaw_ret_action_str, #endif pre_cb, arg, ok_label, ok_cb, ok_arg, NULL, NULL, NULL, cancel_label, cancel_cb, cancel_arg); free(msg_buf); return w; } #if MOTIF Widget choice3_dialog(Widget parent, popupMessageT type, const char *helptext, pre_message_cbT pre_cb, XtPointer arg, const char *yes_label, message_cbT yes_cb, XtPointer yes_arg, const char *no_label, message_cbT no_cb, XtPointer no_arg, const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_arg, const char *format, ...) { char *msg_buf = NULL; Widget w; XDVI_GET_STRING_ARGP(msg_buf, format); w = internal_popup_window(parent, SIZE_SMALL, type, -1, -1, /* just center it */ helptext, msg_buf, pre_cb, arg, yes_label, yes_cb, yes_arg, no_label, no_cb, no_arg, cancel_label, cancel_cb, cancel_arg); free(msg_buf); return w; } #endif Widget choice_dialog_sized(Widget parent, popupMessageT type, popupMessageSizeHintT sizehint, const char *helptext, #ifndef MOTIF const char *xaw_ret_action_str, #endif pre_message_cbT pre_cb, XtPointer arg, const char *ok_label, message_cbT ok_cb, XtPointer ok_arg, const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_arg, const char *format, ...) { char *msg_buf = NULL; Widget w; XDVI_GET_STRING_ARGP(msg_buf, format); w = internal_popup_window(parent, sizehint, type, -1, -1, /* just center it */ helptext, msg_buf, #ifndef MOTIF xaw_ret_action_str, #endif pre_cb, arg, ok_label, ok_cb, ok_arg, NULL, NULL, NULL, cancel_label, cancel_cb, cancel_arg); free(msg_buf); return w; } Widget positioned_choice_dialog(Widget parent, popupMessageT type, int x_pos, int y_pos, const char *helptext, #ifndef MOTIF const char *xaw_ret_action_str, #endif pre_message_cbT pre_cb, XtPointer arg, const char *ok_label, message_cbT ok_cb, XtPointer ok_arg, const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_arg, const char *format, ...) { char *msg_buf = NULL; Widget w; XDVI_GET_STRING_ARGP(msg_buf, format); w = internal_popup_window(parent, SIZE_SMALL, type, x_pos, y_pos, helptext, msg_buf, #ifndef MOTIF xaw_ret_action_str, #endif pre_cb, arg, ok_label, ok_cb, ok_arg, NULL, NULL, NULL, cancel_label, cancel_cb, cancel_arg); free(msg_buf); return w; } void warn_overstrike(void) { static Boolean warned_overstrike = False; if (!warned_overstrike) { popup_message(globals.widgets.top_level, MSG_WARN, /* helptext */ "Greyscaling is running in copy mode; this will cause overstrike characters to " "appear incorrectly, and may result in poor display quality. " "Possible fixes are:\n" "- Use the ``-thorough'' command-line option.\n" "- Quit some other color-hungry applications (e.g. Netscape).\n" "- Use the ``-install'' command-line option.\n" "See the section ``GREYSCALING AND COLORMAPS'' in the " "xdvi manual page for more details.", /* text */ "Couldn't allocate enough colors - expect low display quality."); warned_overstrike = True; } } Boolean is_message_window(Widget w) { int i; for (i = 0; i < MAX_POPUPS; i++) { if (w == popup_window[i]) return True; } return False; } Boolean kill_message_window(Widget w) { int i; for (i = 0; i < MAX_POPUPS; i++) { if (g_popup_array[i] != 0 && XtIsRealized(popup_window[i]) && w == popup_window[i]) { g_popup_array[i] = 0; XtPopdown(popup_window[i]); XtDestroyWidget(popup_window[i]); XSync(DISP, True); return True; } } return False; } /* Raise any popups that currently exist; return True iff such popups exist, else False. */ Boolean raise_message_windows(void) { int i; Boolean have_popups = False; for (i = 0; i < MAX_POPUPS; i++) { if (g_popup_array[i] != 0 && XtIsRealized(popup_window[i])) { XRaiseWindow(DISP, XtWindow(popup_window[i])); have_popups = True; } } return have_popups; } xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs_fonts.c0000664000175000017500000005242111276240141022151 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Panel 2 (Fonts and colors) for xdvik preferences dialog. */ #include "xdvi-config.h" #include "xdvi.h" #include "x_util.h" #include "xm_colorsel.h" #include "topic-window.h" #include "util.h" #include "events.h" #include "hypertex.h" #include "my-snprintf.h" #include "xm_prefsP.h" #include "xm_prefs_fonts.h" #ifdef MOTIF /* entire file */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if USE_SPINBOX #include #endif /* * Handy defaults */ static Arg v_off = { XmNtopOffset, 10 }; static Arg n_of_many = { XmNindicatorType, XmN_OF_MANY }; static Arg frame_title = { XmNchildType, XmFRAME_TITLE_CHILD }; static void underline_toggle_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *tinfo = (struct topic_info *)client_data; struct prefs_choice *prefs; Boolean is_set; UNUSED(call_data); ASSERT(tinfo != NULL, "struct topic_info * in underline_toggle_cb mustn't be NULL!"); prefs = (struct prefs_choice *)tinfo->data; XtVaGetValues(w, XmNset, &is_set, NULL); if (is_set) resource.link_style |= 1; else resource.link_style &= ~1; store_preference(&(prefs->db), "linkStyle", "%d", resource.link_style); /* update display */ globals.ev.flags |= EV_NEWPAGE; XFlush(DISP); } static void colorspecial_toggle_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *tinfo = (struct topic_info *)client_data; struct prefs_choice *prefs; UNUSED(w); /* UNUSED(client_data); */ UNUSED(call_data); ASSERT(tinfo != NULL, "struct topic_info * in colorspecial_toggle_cb mustn't be NULL!"); prefs = (struct prefs_choice *)tinfo->data; do_toggle_color(False); store_preference(&(prefs->db), "color", "%s", resource.use_color ? "True" : "False"); } static void darkness_text_cb(Widget w, XtPointer client_data, XtPointer call_data) { char *text; int val; struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); #if USE_SPINBOX /* synchronize internal spinbox value. Apparently this loses the insertion position, so we need to save it and set it again. */ XmTextPosition pos = XmTextFieldGetInsertionPosition(w); UNUSED(call_data); text = XmTextFieldGetString(w); val = strtol(text, (char **)NULL, 10); if (val != 0) { XtVaSetValues(w, XmNposition, val, NULL); XmTextFieldSetInsertionPosition(w, pos); } #else Widget text_field; UNUSED(call_data); XtVaGetValues(w, XmNuserData, &text_field, NULL); XtVaGetValues(text_field, XmNvalue, &text, NULL); val = strtol(text, (char **)NULL, 10); #endif if (XtIsRealized(w)) { do_set_density(val / 100.0, True, False); store_preference(&(prefs->db), "gamma", "%f", val / 100.0); } XtFree(text); } #if 0 /* currently unused */ static void darkness_spinbox_cb(Widget w, XtPointer client_data, XtPointer call_data) { int val; struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); UNUSED(client_data); UNUSED(call_data); XtVaGetValues(w, XmNposition, &val, NULL); if (XtIsRealized(w)) { do_set_density(val / 100.0, True, False); /* fprintf(stderr, "storing pref: %d\n", val); */ store_preference(&(prefs->db), "gamma", "%f", val / 100.0); } } #endif /* currently unused */ void h_update_hyperlinks(Widget w, Pixel pix) { const char *name = XtName(w); int type = 0; if (strcmp(name, Xdvi_UNVISITED_LINKS_BTN) == 0) { type = 1; } else if (strcmp(name, Xdvi_VISITED_LINKS_BTN) == 0) { type = 2; } /* fprintf(stderr, "WIDGET: |%s|; type: %d\n", name, type); */ if (type != 0) { GC new_gc = set_or_make_gc(NULL, GXcopy, pix, resource.back_Pixel); GC old_gc; double r, g, b; double factor = 65535.0; XColor color; pixel_to_color(pix, &color, DISP, G_colormap); r = color.red / factor; g = color.green / factor; b = color.blue / factor; if (type == 1) { old_gc = globals.gc.linkcolor; sprintf(g_link_color_rgb, "push rgb %.2f %.2f %.2f", r, g, b); } else { old_gc = globals.gc.visited_linkcolor; sprintf(g_visited_link_color_rgb, "push rgb %.2f %.2f %.2f", r, g, b); } if (type == 1) { globals.gc.linkcolor = new_gc; XFreeGC(XtDisplay(w), old_gc); } else { globals.gc.visited_linkcolor = new_gc; XFreeGC(XtDisplay(w), old_gc); } /* update display */ globals.ev.flags |= EV_NEWPAGE; XFlush(DISP); } } static void redraw_or_push_cb(Widget w, XtPointer client_data, XtPointer call_data) { XmDrawnButtonCallbackStruct *cbs = (XmDrawnButtonCallbackStruct *)call_data; static GC border_gc = 0; struct color_button_info *cinfo; Pixel pix = (Pixel)client_data; if (cbs == NULL) { XDVI_WARNING((stderr, "cinfo mustn't be NULL in redraw_or_push_cb!\n")); return; } /* this can also be called via XtCallCallbacks, without call_data */ if (cbs->reason == XmCR_EXPOSE) { /* redraw button label */ Dimension high_thick, st, wd, ht; Dimension inner_w, inner_h, off_x, off_y; GC label_gc; XGCValues values; XtVaGetValues(w, XmNhighlightThickness, &high_thick, XmNshadowThickness, &st, XmNwidth, &wd, XmNheight, &ht, XmNuserData, &cinfo, NULL); values.function = GXcopy; if (border_gc == 0) { /* create the static GC for drawing the border - Note: never free'd! */ values.foreground = BlackPixelOfScreen(XtScreen(w)); /* values.line_width = 2; */ /* note: never free'd! */ border_gc = XCreateGC(XtDisplay(w), XtWindow(w), GCFunction | GCForeground /* | GCLineWidth */, &values); } values.foreground = cinfo->pixel; label_gc = XCreateGC(XtDisplay(w), XtWindow(w), GCFunction | GCForeground, &values); off_x = high_thick + st + 4; inner_w = wd - 2 * off_x; off_y = high_thick + st + 4; inner_h = ht - 2 * off_y; #if 0 fprintf(stderr, "shadow: %d, high: %d\n", st, high_thick); fprintf(stderr, "width: %d, height: %d\n", wd, ht); fprintf(stderr, "inner w: %d, inner h: %d\n", inner_w, inner_h); #endif XFillRectangle(XtDisplay(w), XtWindow(w), label_gc, off_x, off_y, inner_w, inner_h); XDrawRectangle(XtDisplay(w), XtWindow(w), border_gc, off_x - 1, off_y - 1, inner_w + 1, inner_h + 1); XFreeGC(XtDisplay(w), label_gc); if (pix != cinfo->pixel) { h_update_hyperlinks(w, cinfo->pixel); } } else if (cbs->reason == XmCR_ACTIVATE) { /* pushed, open color dialog */ XtVaGetValues(w, XmNuserData, &cinfo, NULL); if (cinfo != NULL) { cinfo->w = w; popup_color_dialog(globals.widgets.top_level, cinfo); } else { XDVI_WARNING((stderr, "cinfo mustn't be NULL in redraw_or_push_cb!\n")); return; } } /* else, XmCR_RESIZE - nothing to do */ } static Widget h_create_colorsample(Widget parent, Widget left, const char *name, const char *resource_name, Pixel pix, struct topic_info *info) { struct color_button_info *cinfo = xmalloc(sizeof *cinfo); /* note: never free()d */ Widget button; UNUSED(left); cinfo->pixel = pix; cinfo->tinfo = info; cinfo->resource_name = xstrdup(resource_name); /* note: never free()d */ button = XtVaCreateManagedWidget(name, xmDrawnButtonWidgetClass, parent, XtNwidth, 42, XtNheight, 28, XmNuserData, cinfo, /* we want the normal button look here to make it obvious that users can press it */ XmNshadowType, XmSHADOW_OUT, XmNpushButtonEnabled, True, NULL); XtAddCallback(button, XmNactivateCallback, redraw_or_push_cb, (XtPointer)pix); XtAddCallback(button, XmNexposeCallback, redraw_or_push_cb, (XtPointer)pix); XtAddCallback(button, XmNresizeCallback, redraw_or_push_cb, (XtPointer)pix); return button; } static Widget h_create_fonts_frame(Widget top, struct topic_info *info) { Widget darkness_form, darkness_label; UNUSED(info); darkness_form = XmCreateForm(top, "darkness_form", NULL, 0); XtVaSetValues(darkness_form, XmNverticalSpacing, 10, XmNhorizontalSpacing, 10, NULL); darkness_label = XmCreateLabelGadget(darkness_form, "Font Darkness: ", NULL, 0); XtVaSetValues(darkness_label, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); XtManageChild(darkness_label); { Widget darkness_text; #if USE_SPINBOX Widget darkness_spinbox = XmCreateSpinBox(darkness_form, Xdvi_DARKNESS_SPINBOX, NULL, 0); darkness_text = XmCreateTextField(darkness_spinbox, Xdvi_DARKNESS_TEXT, NULL, 0); XtVaSetValues(darkness_spinbox, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, darkness_label, XmNinitialDelay, 200, XmNrepeatDelay, 50, NULL); XtVaSetValues(darkness_text, XmNspinBoxChildType, XmNUMERIC, XmNminimumValue, 0, XmNmaximumValue, 1000, XmNeditable, True, XmNcolumns, 4, XmNincrementValue, 1, XmNwrap, False, /* too confusing */ XmNposition, (int)(resource.gamma * 100.0 + 0.5), NULL); XtAddCallback(darkness_text, XmNactivateCallback, darkness_text_cb, (XtPointer)info); XtAddCallback(darkness_text, XmNvalueChangedCallback, darkness_text_cb, (XtPointer)info); adjust_heights(darkness_spinbox, darkness_text, darkness_label, NULL); XtManageChild(darkness_text); XtManageChild(darkness_spinbox); #else char buf[LENGTH_OF_INT]; Widget darkness_button; darkness_text = XmCreateTextField(darkness_form, Xdvi_DARKNESS_TEXT, NULL, 0); SNPRINTF(buf, LENGTH_OF_INT, "%d", (int)(resource.gamma * 100.0 + 0.5)); XtVaSetValues(darkness_text, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, darkness_label, XmNcolumns, 4, XmNvalue, buf, XmNuserData, darkness_text, NULL); XtOverrideTranslations(darkness_text, XtParseTranslationTable("Return:activate()")); XtAddCallback(darkness_text, XmNactivateCallback, darkness_text_cb, (XtPointer)info); darkness_button = XmCreatePushButton(darkness_form, Xdvi_APPLY_STR, NULL, 0); XtVaSetValues(darkness_button, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, darkness_text, XmNuserData, darkness_text, NULL); XtAddCallback(darkness_button, XmNactivateCallback, darkness_text_cb, (XtPointer)info); adjust_heights(darkness_label, darkness_text, darkness_button, NULL); XtManageChild(darkness_text); XtManageChild(darkness_button); #endif } /* XtManageChild(darkness_form); */ return darkness_form; } static Widget h_create_colors_form(Widget top, struct topic_info *info) { Widget text_bg_frame, text_bg_label, text_bg_form; Widget links_frame, links_label, links_form; Widget fg_label, fg_button; Widget bg_label, bg_button; Widget unvisited_label, unvisited_button; Widget visited_label, visited_button; Widget underline_toggle; Widget colorspecials_toggle; Widget form = XmCreateForm(top, "colors_form", NULL, 0); Pixel visited_link_pix, link_pix; str_to_pixel(top, resource.visited_link_color, &visited_link_pix); str_to_pixel(top, resource.link_color, &link_pix); text_bg_frame = XmCreateFrame(form, "text_bg_frame", NULL, 0); XtVaSetValues(text_bg_frame, XmNmarginWidth, 10, XmNmarginHeight, 10, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 50, XmNrightOffset, 10, XmNbottomAttachment, XmATTACH_FORM, NULL); text_bg_label = XmCreateLabelGadget(text_bg_frame, "Text Color", &frame_title, 1); XtManageChild(text_bg_label); text_bg_form = XmCreateForm(text_bg_frame, "fg_form", NULL, 0); XtVaSetValues(text_bg_form, XmNverticalSpacing, 2, NULL); fg_label = XmCreateLabelGadget(text_bg_form, Xdvi_FG_COLOR_STR, NULL, 0); fg_button = h_create_colorsample(text_bg_form, fg_label, Xdvi_FG_COLOR_BTN, "foreground", resource.fore_Pixel, info); XtVaSetValues(fg_label, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_FORM, NULL); XtVaSetValues(fg_button, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_NONE, NULL); adjust_heights(fg_label, fg_button, NULL); XtManageChild(fg_label); XtManageChild(fg_button); bg_label = XmCreateLabelGadget(text_bg_form, Xdvi_BG_COLOR_STR, NULL, 0); bg_button = h_create_colorsample(text_bg_form, bg_label, Xdvi_BG_COLOR_BTN, "background", resource.back_Pixel, info); XtVaSetValues(bg_label, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, fg_label, NULL); XtVaSetValues(bg_button, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_NONE, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, fg_label, NULL); adjust_heights(bg_label, bg_button, NULL); XtManageChild(bg_label); XtManageChild(bg_button); colorspecials_toggle = XmCreateToggleButtonGadget(text_bg_form, Xdvi_DOCUMENT_COLORS_STR, &n_of_many, 1); XtVaSetValues(colorspecials_toggle, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, bg_label, NULL); XtManageChild(colorspecials_toggle); XmToggleButtonGadgetSetState(colorspecials_toggle, resource.use_color, False); XtAddCallback(colorspecials_toggle, XmNvalueChangedCallback, colorspecial_toggle_cb, (XtPointer)info); links_frame = XmCreateFrame(form, "links_frame", NULL, 0); XtVaSetValues(links_frame, XmNmarginWidth, 10, XmNmarginHeight, 10, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, text_bg_frame, XmNleftOffset, 10, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); links_label = XmCreateLabelGadget(links_frame, "Hyperlinks", &frame_title, 1); XtManageChild(links_label); links_form = XmCreateForm(links_frame, "links_form", NULL, 0); XtVaSetValues(links_form, XmNverticalSpacing, 2, NULL); unvisited_label = XmCreateLabelGadget(links_form, Xdvi_UNVISITED_LINKS_STR, NULL, 0); unvisited_button = h_create_colorsample(links_form, unvisited_label, Xdvi_UNVISITED_LINKS_BTN, "linkColor", link_pix, info); XtVaSetValues(unvisited_label, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_FORM, NULL); XtVaSetValues(unvisited_button, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_NONE, XmNtopAttachment, XmATTACH_FORM, NULL); adjust_heights(unvisited_label, unvisited_button, NULL); XtManageChild(unvisited_label); XtManageChild(unvisited_button); visited_label = XmCreateLabelGadget(links_form, Xdvi_VISITED_LINKS_STR, NULL, 0); visited_button = h_create_colorsample(links_form, visited_label, Xdvi_VISITED_LINKS_BTN, "visitedLinkColor", visited_link_pix, info); XtVaSetValues(visited_label, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, unvisited_label, NULL); XtVaSetValues(visited_button, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_NONE, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, unvisited_label, NULL); adjust_heights(visited_label, visited_button, NULL); XtManageChild(visited_label); XtManageChild(visited_button); underline_toggle = XmCreateToggleButtonGadget(links_form, Xdvi_LINKS_UNDERLINED_STR, &n_of_many, 1); XtVaSetValues(underline_toggle, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, visited_label, NULL); XtManageChild(underline_toggle); /* if (res->link_style & 1) */ if (resource.link_style & 1) XmToggleButtonGadgetSetState(underline_toggle, True, False); else XmToggleButtonGadgetSetState(underline_toggle, False, False); XtAddCallback(underline_toggle, XmNvalueChangedCallback, underline_toggle_cb, (XtPointer)info); XtManageChild(links_frame); XtManageChild(text_bg_frame); XtManageChild(text_bg_form); XtManageChild(links_form); return form; } void update_preferences_color(void) { Widget shell, button; /* it's not an error if the prefs dialog doesn't exist yet */ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False) && get_widget_by_name(&button, shell, Xdvi_DOCUMENT_COLORS_STR, True)) { XmToggleButtonGadgetSetState(button, resource.use_color, False); } } void update_preferences_hyperlinks(void) { Widget shell, button; /* it's not an error if the prefs dialog doesn't exist yet */ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False) && get_widget_by_name(&button, shell, Xdvi_LINKS_UNDERLINED_STR, True)) { XmToggleButtonGadgetSetState(button, resource.link_style & 1 ? True : False, False); } } void update_preferences_darkness(void) { Widget shell, text; if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False) && get_widget_by_name(&text, shell, Xdvi_DARKNESS_TEXT, True)) { char buf[LENGTH_OF_INT]; SNPRINTF(buf, LENGTH_OF_INT, "%d", (int)(resource.gamma * 100.0 + 0.5)); #if USE_SPINBOX XmTextFieldSetString(text, buf); XtVaSetValues(text, XmNposition, (int)(resource.gamma * 100.0 + 0.5), NULL); #else XtVaSetValues(text, XmNvalue, buf, NULL); #endif } } Widget prefs_fonts_and_colors(struct topic_info *info) { Widget form; Widget colors_form; Widget other_colors_frame, fonts_frame; form = XmCreateForm(info->right_form, "fonts_colors_form", NULL, 0); h_attach_below(form, NULL); colors_form = h_create_colors_form(form, info); h_attach_below(colors_form, NULL); XtManageChild(colors_form); { /* other colors - currently only highlight color */ Widget other_colors_form, other_colors_label; Widget hl_color_text, hl_color_button; other_colors_frame = XmCreateFrame(form, "other_colors_frame", &v_off, 1); XtVaSetValues(other_colors_frame, XmNmarginWidth, 10, NULL); h_attach_below(other_colors_frame, colors_form); other_colors_label = XmCreateLabelGadget(other_colors_frame, "Highlight Color", &frame_title, 1); other_colors_form = XmCreateForm(other_colors_frame, "other_colors_form", NULL, 0); XtVaSetValues(other_colors_form, XmNverticalSpacing, 2, NULL); hl_color_text = XmCreateLabelGadget(other_colors_form, #if defined(LESSTIF_VERSION) /* stupid LessTif doesn't wrap Labels at '\n' */ "Color of page border, rulers and bounding boxes.", #else "Color used for page border, rulers in `ruler mode', and\n" "bounding boxes for forward search and EPS images.", #endif NULL, 0); hl_color_button = h_create_colorsample(other_colors_form, hl_color_text, Xdvi_HL_COLOR_BTN, "highlight", resource.hl_Pixel, info); XtVaSetValues(hl_color_text, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 10, XmNalignment, XmALIGNMENT_BEGINNING, NULL); XtVaSetValues(hl_color_button, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(hl_color_text); XtManageChild(hl_color_button); XtManageChild(other_colors_form); XtManageChild(other_colors_label); XtManageChild(other_colors_frame); } fonts_frame = h_create_fonts_frame(form, info); h_attach_below(fonts_frame, other_colors_frame); XtManageChild(fonts_frame); XtManageChild(form); return form; } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/help-window.c0000664000175000017500000011503311222000416021337 0ustar uwabamiuwabami/* * Copyright (c) 2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Help window for xdvik, using the `topics' window framework. */ #include "xdvi-config.h" #include "xdvi.h" #include "version.h" #include #include #include #if MOTIF # include # include # include # include # include #else /* MOTIF */ # include # include # include #endif /* MOTIF */ #include #include #include #include "message-window.h" #include "util.h" #include "x_util.h" #include "string-utils.h" #include "topic-window.h" #include "help-window.h" /* missing features that will be listed in the help window */ #if !XDVI_XT_TIMER_HACK #define HAVE_MISSING_FEATURES 1 #endif #if !HAVE_REGEX_H #define HAVE_MISSING_FEATURES 1 #endif /* * The number of help topics - must larger or equal to actual number of items, * also keep in sync with elements resource.help_* !!! */ #define NUM_HELP_TOPICS 16 /* * helper routines */ static Widget create_help_text(Widget parent, const char *name, const char *value) { Widget text; #if MOTIF Arg args[20]; int n = 0; XtSetArg(args[n], XmNeditable, False); n++; XtSetArg(args[n], XmNcursorPositionVisible, False); n++; XtSetArg(args[n], XmNvalue, value); n++; XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; XtSetArg(args[n], XmNwordWrap, True); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; /* XtSetArg(args[n], XmNtopWidget, top_widget); n++; */ /* XtSetArg(args[n], XmNtopOffset, 10); n++; */ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC); n++; XtSetArg(args[n], XmNscrollBarDisplayPolicy, XmAS_NEEDED); n++; text = XmCreateScrolledText(parent, (char *)name, args, n); XtManageChild(text); #else /* MOTIF */ text = XtVaCreateManagedWidget(name, asciiTextWidgetClass, parent, /* XtNfromVert, top_widget, */ /* XtNvertDistance, 10, */ XtNstring, value, XtNheight, 400, XtNwidth, 500, /* resizing of pane by user isn't needed */ XtNshowGrip, False, XtNscrollVertical, XawtextScrollAlways, XtNscrollHorizontal, XawtextScrollNever, XtNeditType, XawtextRead, XtNleftMargin, 5, NULL); XawTextDisplayCaret(text, False); #endif /* MOTIF */ return text; } static void get_title_and_summary(const char *str, int len, char **title, char **summary) { char *tmp = xmalloc(len + 1); char *ptr; memcpy(tmp, str, len); tmp[len] = '\0'; if ((ptr = strchr(tmp, '\t')) == NULL) { XDVI_WARNING((stderr, "Help resource label `%s' doesn't contain a tab character - ignoring it.", tmp)); *title = tmp; *summary = NULL; } else { *ptr++ = '\0'; *title = tmp; *summary = ptr; } TRACE_GUI((stderr, "Title, Summary: |%s|%s|", *title, *summary)); } static void init_item(const char *resource, const char **resource_default, struct topic_info *info, size_t idx, Dimension *width) { const char *ptr = NULL; char *widget_text = NULL; Widget help_form; Widget text; struct topic_item *item = &(info->items[idx]); char *translation_str = get_string_va("#override \n" "q:close-topic-window(%p)\n" #ifdef MOTIF "osfCancel:close-topic-window(%p)\n" #else "Escape:close-topic-window(%p)\n" #endif "Return:close-topic-window(%p)", info, info, info); if (resource != NULL) { if ((ptr = strchr(resource, '\n')) == NULL) { XDVI_WARNING((stderr, "Help resource text `%s' doesn't contain a newline character.", resource)); ptr = resource; } else ptr++; get_title_and_summary(resource, ptr - resource - 1, &(item->topic), &(item->title)); } else { /* resource not set; copy resource_default into malloc()ed widget_text: */ size_t size = 0, alloc_len = 0, offset; const size_t alloc_step = 1024; int i; for (i = 0; resource_default[i] != NULL; i++) { if (i == 0) { /* special case */ get_title_and_summary(resource_default[i], strlen(resource_default[i]) - 1, &(item->topic), &(item->title)); } else { offset = size; size += strlen(resource_default[i]); /* * allocate chunks of `alloc_step' to avoid frequent calls to malloc. * `alloc_len' is always 1 more than `size', for the terminating NULL character. */ while (size + 1 > alloc_len) { alloc_len += alloc_step; widget_text = xrealloc(widget_text, alloc_len); } memcpy(widget_text + offset, resource_default[i], size - offset); } } /* null-terminate string */ widget_text[size] = '\0'; } help_form = XtVaCreateManagedWidget("help_form", #if MOTIF xmFormWidgetClass, info->right_form, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, #else formWidgetClass, info->right_form, XtNborderWidth, 0, XtNdefaultDistance, 0, #endif NULL); item->widget = help_form; if (ptr != NULL) { text = create_help_text(help_form, "help_text", ptr); } else { text = create_help_text(help_form, "help_text", widget_text); free(widget_text); } XtOverrideTranslations(text, XtParseTranslationTable(translation_str)); free(translation_str); #if !MOTIF { Dimension w; XtVaGetValues(text, XtNwidth, &w, NULL); if (w > *width) *width = w; } #else UNUSED(width); #endif } static void initialize_items(struct topic_info *info) { size_t k; Dimension width; /* * Define fallbacks: default_xyz is used as fallback text if * X resource xyz isn't specified. * * We use arrays of strings rather than simple strings because of C's * limitations on maximum string length; but since the resource needs to * be a simple `char *', these have to be copied into larger buffers * later on (which is a bit wasteful to space). OTOH, splitting the * strings into smaller pieces would make them hard to deal with as * X resources. They are defined as static so that they are initialized * only once. * * Last elem of each array is NULL for ease of looping through it. * * Advantages of this method vs. putting the help texts into a file: * - couldn't use #ifdef's as easily * - would need to invent our own file format * - file searching is more error-prone (needs to be installed etc.) */ static const char *default_help_general[] = { "Introduction\tAbout this version of xdvi\n", "This is xdvik, version ", XDVI_TERSE_VERSION_INFO ".\nThe program's homepage is located at:\n", "http://sourceforge.net/projects/xdvi\n", "where you can find updates, report bugs and submit feature requests.\n", "\n", "\n", "Xdvi has many command-line options, too numerous to be listed here;\n", "see the man page for a full description.\n", "\n", "The most important key bindings are listed in the help sections shown\n", "in the left window.\n", "\n", "Note: Unless a key binding also has an uppercase version,\n", "all bindings are case-insensitive.\n\n", "\n", "The major parts of Xdvik are licensed under the X Consortium license.\n", "Parts (encoding.c) are licensed under the GNU General Public License.\n", "Xdvik uses the following libraries:\n", "- The kpathsea library, licensed in part under the GNU General Public\n", " License, in part under the GNU Library General Public License.\n", "- t1lib, licensed in parts under the GNU Library General Public License,\n", " in parts under the X Consortium license.\n", "There is NO WARRANTY of anything.\n", "\n", "Built using these configure options:\n", #if MOTIF "- Motif toolkit (", XmVERSION_STRING, ")\n", #else "- Athena toolkit\n", #endif #ifdef A4 "- paper: a4, units cm\n", #else "- paper: letter, units inches\n", #endif #ifdef GREY "- anti-aliasing (grey) enabled\n", #endif #ifdef T1LIB "- T1lib (direct rendering of PS fonts) enabled\n", #endif #if HAVE_ICONV_H "- Iconv support compiled in\n", #if USE_LANGINFO "- Langinfo support compiled in\n", #else "- Langinfo support not compiled in\n", #endif #else "- Iconv/langinfo support not compiled in\n", #endif #ifdef TEXXET "- left-to-right typesetting (TeXXeT) support enabled\n", #endif #ifdef USE_GF "- gf file support enabled\n", #endif #if HAVE_MISSING_FEATURES "\n", "Features not available on this platform:\n", #if !XDVI_XT_TIMER_HACK "- Could not redefine XtAppAddTimeOut(); some widgets may\n", " not be updated until the mouse is moved.\n", #endif #if !HAVE_REGEX_H "- regex.h header not available, regular expression support\n", " in string search is disabled.\n", #endif #endif /* HAVE_MISSING_FEATURES */ NULL }; static const char *default_help_hypertex[] = { "Hyperlinks\tNavigating links\n", "Whenever the mouse is positioned on a link, the cursor changes\n", "to a `hand' shape and the target of the link is displayed\n", "in the statusline at the bottom of the window.\n", "\n", "The following keybindings are pre-configured:\n", "\n", "Mouse-1\n", " Follow the link at the cursor position.\n", " If the link target is not a DVI file, try to launch\n", " an application to view the file.\n", "Mouse-2\n", " Open a new xdvi window displaying the link\n", " at the cursor position if the link is a DVI file;\n", " else, try to launch an application to view the file.\n", "B\n", " Go back to the previous hyperlink in the history.\n", "F\n", " Go forward to the next hyperlink in the history.\n", "\n", "By default, the hyperlinks are displayed in the colors \n", "`linkColor' and `visitedLinkColor' (for visited links) and \n", "underlined in the same colors. This can be customized \n", "by setting the resource or command-line option `linkstyle' \n", "to a value between 0 and 3, which have the following meaning:\n", " 0: no highlighting of links,\n", " 1: underline links,\n", " 2: color links,\n", " 3: color and underline links.\n\n", NULL }; static const char *default_help_othercommands[] = { "Other Commands\tMiscellaneous other commands\n", "Ctrl-f", #if MOTIF ", toolbar button 12\n", #else "\n", #endif " Opens a dialog window to search for a text string\n", " in the DVI file.\n", "\n", "Ctrl-g\n", " Search for the next string match.\n", "\n", "Ctrl-l\n", " Toggles fullscreen mode (which may not work with your\n", " window manager/desktop).\n", "\n", "Ctrl-o", #if MOTIF ", toolbar button 1\n", #else "\n", #endif " Opens a popup window to select another DVI file.\n", " With a prefix argument `n', the `n'th file from the file history\n", " is opened instead.\n", "\n", "Ctrl-p", #if MOTIF ", toolbar button 11\n", #else "\n", #endif " Opens a popup window for printing the DVI file, or parts of it.\n", "\n", "Ctrl-r or Clear\n", " Redisplays the current page.\n", "\n", "Ctrl-s\n", " Opens a popup window for saving the DVI file, or parts of it.\n", "\n", "G\n", " Toggles the use of greyscale anti-aliasing for\n", " displaying shrunken bitmaps. In addition, the key\n", " sequences `0G' and `1G' clear and set this flag,\n", " respectively. See also the -nogrey option.\n", "\n", "k\n", " Normally when xdvi switches pages, it moves to the home\n", " position as well. The `k' keystroke toggles a `keep-\n", " position' flag which, when set, will keep the same\n", " position when moving between pages. Also `0k' and `1k'\n", " clear and set this flag, respectively. See also the\n", " -keep option.\n", "\n", "M\n", " Sets the margins so that the point currently under the\n", " cursor is the upper left-hand corner of the text in the\n", " page. Note that this command itself does not move the\n", " image at all. For details on how the margins are used,\n", " see the -margins option.\n", "\n", "P\n", " ``This is page number n.'' This can be used to make\n", " the `g' keystroke refer to a different page number.\n", " (See also `Options->Use TeX Page Numbers' and the\n", " `T' keystroke).\n", "\n", "R", #if MOTIF ", toolbar button 2\n", #else "\n", #endif " Forces the DVI file to be reread.\n", "\n", "s\n", " Changes the shrink factor to the given number.\n", " If no number is given, the smallest factor that makes the\n", " entire page fit in the window will be used. (Margins\n", " are ignored in this computation.)\n", "\n", "S\n", " Sets the density factor to be used when shrinking\n", " bitmaps. This should be a number between 0 and 100;\n", " higher numbers produce lighter characters.\n", "\n", "t\n", " Switches to the next unit in a sorted list of TeX dimension\n", " units for the popup magnifier ruler and `Ruler mode' (see the\n", " section `Modes').\n" "\n", "V\n", " Toggles Ghostscript anti-aliasing. Also `0V' and `1V' clear\n", " and enables this mode, respectively. See also the the\n", " -gsalpha option.\n", "\n", "\n", "v\n", " Toggles between several modes of displaying postscript specials:\n", " Display specials, display specials with their bounding box\n", " (if available), and display bounding boxes only (if available).\n", " The prefix arguments 1, 2 and 0 also allow you to select one of\n" " these states directly.\n", "\n", "x\n", " Toggles expert mode (in which ", #if MOTIF "the menu bar, the toolbar\n", #else "the menu buttons,\n", #endif " the page list and the statusline do not appear).\n", " `1x' toggles the display of the statusline at the bottom of the window.\n", " `2x' toggles the scrollbars,\n", #if MOTIF " `3x' toggles the page list,\n", " `4x' toggles the toolbar,\n", " `5x' toggles the menu bar.\n", #else " `3x' toggles the page list and menu buttons.\n", #endif "\n", "Ctrl-+", #if MOTIF ", toolbar button 9\n", #else "\n", #endif " Makes the display of the page larger (zooms in).\n", "\n", "Ctrl--", #if MOTIF ", toolbar button 10\n", #else "\n", #endif " Makes the display of the page smaller (zooms out).\n", "\n", "Alt-Ctrl-+", #if MOTIF ", toolbar button 17\n", #else "\n", #endif " Makes the fonts darker (by adding to the gamma value).\n", "\n", "Alt-Ctrl--", #if MOTIF ", toolbar button 18\n", #else "\n", #endif " Makes the fonts lighter (by subtracting from the gamma\n", " value).\n", "\n", NULL }; static const char *default_help_marking[] = { "Printing and Saving\tMarking, printing and saving pages\n", "The `Save' and `Print' dialogs allow you to save or print all,\n", "pages, a range of pages, or all marked pages from a DVI file.\n", "\n", "Note that the page numbers for the `From ... to ...' range\n", "refer to physical pages, not TeX pages (compare the option\n", "`Use TeX Page Numbers' and the `T' keystroke).\n", "\n", "To mark a page or a range of pages, use one of the folllowing\n", "methods:\n", "- Click on the page in the page list with Mouse Button 2 to mark\n", " a single page, or drag the mouse while holding down Button 2\n", " to mark a range of pages.\n", "- Use one of the following key combinations:\n", " m: toggle the mark of the current page,\n", " 1m toggle the marks of all odd pages,\n", " 2m toggle the marks of all even pages,\n", " 0m: unmark all pages,\n", " Ctrl-n: toggle mark of current page, then move one page forward,\n", " Ctrl-u: move one page back, then toggle mark of that page.\n", #if MOTIF "- Use the toobar buttons 13 to 16 to toggle the marks\n", " of odd pages, toggle the marks of even pages, toggle the mark\n", " of the current page, or unmark all pages, respectively.\n", #endif "\n", "If the X resource or command line option `paper' has been used,\n", "its value is inserted into the `Dvips Options' field of the printing\n", "dialog so that the appropriate options can be passed to dvips.\n", "This doesn't happen if the paper size has been specified explicitly\n", "in the DVI file (e.g. by using the LaTeX `geometry' package).\n", "Note that not all of the paper options used by xdvi\n", "may be understood by dvips; dvips will ignore the option\n", "in that case, and will use its default paper setting.\n", NULL }; static const char *default_help_pagemotion[] = { "Page Motion\tMoving around in the document\n", "\n", "[", #if MOTIF ", toolbar button 7\n", #else "\n", #endif " Moves back one item in the page history. With a prefix\n", " argument n, move back n history items.\n" "\n", "]", #if MOTIF ", toolbar button 8\n", #else "\n", #endif " Moves forward one item in the page history. With a prefix\n", " argument n, move forward n history items.\n" "\n", "Ctr-[\n", " Deletes current item in the page history and move\n", " to the history item before the deleted one. With a prefix\n", " argument n, delete n previous history items.\n", "\n", "Ctr-]\n", " Deletes current item in the page history and move\n", " to the history item after the deleted one. With a prefix\n", " argument n, delete n next history items.\n", "\n", "n or f or Return or LineFeed or PgDn", #if MOTIF ", toolbar button 5\n", #else "\n", #endif " Moves to the next page (or to the nth next page if a\n", " number is given).\n", "\n", "Space key\n", " Moves down or to the next page.", "\n", "p or b or Ctrl-h or BackSpace or PgUp", #if MOTIF ", toolbar button 4\n", #else "\n", #endif " Moves to the previous page (or back n pages).\n", "\n", "Del key\n", " Moves up on the page or to the previous page.", "\n", "Up-arrow\n", " Scrolls page up.\n", "\n", "Down-arrow\n", " Scrolls page down.\n", "u\n", " Moves page up two thirds of a window-full.\n", "\n", "d\n", " Moves page down two thirds of a window-full.\n", "\n", "Left-arrow\n", " Scrolls page left.\n", "\n", "Right-arrow\n", " Scrolls page right.\n", "\n", "l\n", " Moves page left two thirds of a window-full.\n", "\n", "r\n", " Moves page right two thirds of a window-full.\n", "\n", "T\n", " Toggle the use of TeX page numbers instead of physical\n", " pages for the page list and the `g' command.\n", " (See also the `Options -> Use TeX Pages' menu.)\n", "\n", "g\n", " Moves to the page with the given number. Initially,\n", " the first page is assumed to be page number 1, but this\n", " can be changed with the `P' keystroke, described in the\n", " section `Other Commands'. If no page number is given,\n", " it moves to the last page.\n", "\n", "<, Ctrl-Home", #if MOTIF ", toolbar button 3\n", #else "\n", #endif " Moves to first page in the document.\n", "\n", ">, Ctrl-End", #if MOTIF ", toolbar button 6\n", #else "\n", #endif " Moves to last page in the document.\n", "\n", "^\n", " Move to the ``home'' position of the page. This is\n", " normally the upper left-hand corner of the page,\n", " depending on the margins set via the -margins option.\n", "\n", "Home\n", " Move to the ``home'' position of the page (the upper\n", " left-hand corner), or to the top of the page if the `keep'\n", " flag is set.\n", "\n", "End\n", " Move to the end position of the page (the lower\n", " right-hand corner), or to the bottom of the page if the\n", " `keep' flag is set.\n", "\n", "c\n", " Moves the page so that the point currently beneath the\n", " cursor is moved to the middle of the window. It also\n", " warps the cursor to the same place.\n", "\n", NULL }; static const char *default_help_mousebuttons[] = { "Mouse Buttons\tActions bound to the mouse buttons\n", "The mouse buttons can be customized just like the keys;\n", "however the bindings cannot be intermixed (since\n", "a mouse event always requires the cursor location\n", "to be present, which a key event doesn't).\n", "The default bindings are as follows:\n" "\n", "Buttons 1-3\n", " Pops up magnifier windows of different sizes.\n", " When the mouse is over a hyperlink, the link overrides\n", " the magnifier. In that case, Button 1 jumps to the link\n", " in the current xdvi window, Button 2 opens the link target\n", " in a new instance of xdvi.\n", " In `Ruler Mode', Button1 shows/drags the ruler instead;\n", " in `Text Selection Mode', Button1 can be used to select\n", " a rectangular region of text from the DVI file.\n", "\n", "Shift-Button1 to Shift-Button3\n", " Drag the page in each direction (Button 1), vertically\n", " only (Button 2) or horizontally only (Button 3).\n", "\n", "Ctrl-Button1\n", " Invoke a reverse search for the text on the cursor\n", " location (see the section SOURCE SPECIALS for more\n", " information on this).\n", "\n", "The buttons 4 and 5 (wheel up and down for wheel mice)\n", "scroll the page up and down respectively, or jump to the\n", "next/previous page when the mouse is over the page list.", "\n", "In the page list, Button 2 toggles the mark a page (see\n", "section `Marking Pages'); moving the mouse while holding\n", "Button 2 lets you toggle a range of pages.\n", "\n", NULL }; static const char *default_help_sourcespecials[] = { "Source Specials\tNavigating between the TeX and the DVI file\n", "Some TeX implementations have an option to automatically\n", "include so-called `source specials' into a DVI file. These\n", "contain the line number and the filename of the TeX source\n", "and make it possible to go from a DVI file to the\n", "(roughly) corresponding place in the TeX source and back\n", "(this is also called `reverse search' and `forward search').\n", "\n", "On the TeX side, you need a TeX version that supports the `-src'\n", "option (e.g. teTeX >= 2.0) or a macro package like srcltx.sty\n", "to insert the specials into the DVI file.\n", "\n", "Source special mode can be customized for various editors\n", "by using the command line option \"-editor\" or one of the\n", "environment variables \"XEDITOR\", \"VISUAL\" or \"EDITOR\".\n", "See the xdvi man page on the \"-editor\" option for details\n", "and examples.\n", "\n", "Forward search can be performed by a program (i.e. your editor)\n", "invoking xdvi with the \"-sourceposition\" option like this:\n", "xdvi -sourceposition \" \"
\n", "If there is already an instance of xdvi running that displays\n", "
, it will try to open the page specified by\n", " and an highlight this location on the page.\n", "Else, a new instance of xdvi will be started that will try to\n", "do the same.\n", "\n", "The following keybindings are pre-configured:\n", "\n", "Ctrl-Mouse1\n", " [source-special()] Invoke the editor (the value\n", " of the \"editor\" resource ) to display the line in the\n", " TeX file corresponding to special at cursor position.\n", "\n", "Ctrl-v\n", " [show-source-specials()] Show bounding boxes for every\n", " source special on the current page, and print the strings\n", " contained in these specials to stderr. With prefix 1,\n", " show every bounding box on the page (for debugging purposes).\n", "\n", "Ctrl-x\n", " [source-what-special()] Display information about the\n", " source special next to the cursor, similar to\n", " \"source-special()\", but without actually invoking\n", " the editor (for debugging purposes).\n", "\n", NULL }; static const char *default_help_modes[] = { "Mouse Modes\tMagnifier Mode, Ruler Mode and Text Selection Mode\n", "The keystroke Ctrl-m [switch-mode()] switches between\n", "three different bindings for Mouse-1, which can also be\n", "activated via the Modes menu (in Motif, this is a submenu\n", "of the Options menu). The default mode at startup can be\n", "customized via the X resource `mouseMode' or the command-line\n", "option `-mousemode'. The default startup mode is Magnifier Mode.\n", "\n", "Note: The modes are activated by changing the magnifier()\n", "action. Switching the mode will not work if Mouse-1 has\n", "been customized to an action sequence that does not contain\n", "the magnifier() action.\n", "\n", "Magnifier Mode\n", "\n", " In this mode, the mouse buttons 1 to 5 will pop up a\n", " ``magnifying glass'' that shows an unshrunken image of\n", " the page (i.e. an image at the resolution determined by\n", " the option/X resource pixels or mfmode) at varying sizes.\n", " When the magnifier is moved, small ruler-like tick marks\n", " are displayed at the edges of the magnifier (unless\n", " the X resource delayRulers is set to false, in which case\n", " the tick marks are always displayed).\n", "\n", " The unit of the marks is determined by the X resource\n", " `tickUnits' (mm by default). This unit can be changed at\n", " runtime via the action `switch-magnifier-units()', by\n", " default bound to the keystroke `t' (see the description\n", " of that key, and of `switch-magnifier-units()' for more\n", " details on the units available). The length of the tick\n", " marks can be changed via the X resource `tickLength'\n", " (4 by default). A zero or negative value suppresses the\n", " tick marks.\n", "\n", "\n", "Text Selection Mode\n", "\n", " This mode allows you to select a rectangular region of\n", " text in the DVI file by holding down Mouse-1 and moving\n", " the mouse. The text is put into the X primary selection\n", " so that it can be pasted into other X applications with\n", " Mouse-2.\n", "\n", " If xdvi has been compiled with locale, nl_langinfo() and\n", " iconv support, the selected text is converted into the\n", " character set of the current locale (see the output of\n", " `locale -a' for a list of locale settings available on\n", " your system). If nl_langinfo() is not available, but\n", " iconv is, you can specify the input encoding for iconv\n", " via the X resource `textEncoding' (see the output of\n", " `iconv -l' for a list of valid encodings). If iconv support\n", " is not available, only the encodings ISO-8859-1 and UTF-8\n", " are supported (these names are case-insensitive).\n", "\n", " Note that UTF-8 is the only encoding that can render all\n", " characters (e.g. mathematical symbols). If ISO-8859-1 is\n", " active, characters that cannot be displayed are replaced\n", " by `\' followed by the hexadecimal character code. If a\n", " character is not recognized at all, it is replaced by\n", " `?'. For other encodings, such characters may trigger\n", " iconv error messages.\n", "\n", " If you want to extract larger portions of text, you\n", " can also save selected pages or the entire file in\n", " text format from the `File > Save as ...' menu.\n", "\n", "\n", "Ruler Mode\n", "\n", " This mode provides a simple way of measuring distances\n", " on the page. When this mode is activated, the mouse\n", " cursor changes into a thin cross, and a larger, cross-\n", " shaped ruler is drawn in the highlight color at the\n", " mouse location. The ruler doesn't have units attached\n", " to it; instead, the current distance between the ruler\n", " and the mouse cursor is continously printed to the\n", " statusline.\n", "\n", " When activating Ruler Mode, the ruler is at first\n", " attached to the mouse and can be moved around. It can\n", " then be positioned at a fixed place by clicking Mouse-1.\n", " After that, the mouse cursor can be moved to measure the\n", " horizontal (dx), vertical (dy) and direct (shortest)\n", " (dr) distance between the ruler center point and the\n", " mouse.\n", "\n", " Clicking Mouse-1 again will move the ruler to the\n", " current mouse position, and holding down Mouse-1 will\n", " drag the ruler around.\n", "\n", " In Ruler Mode, the following special keybindings extend\n", " or replace the default bindings:\n", "\n", " o [ruler-snap-origin()] Snap the ruler back to\n", " the origin coordinate (0,0).\n", "\n", " t [overrides switch-magnifier-units()] Toggle\n", " between various ruler units, which can be\n", " specified by the X resource tickUnits (`mm'\n", " by default).\n", "\n", " P [overrides declare-page-number()] Print the\n", " distances shown in the statusline to standard\n", " output.\n", NULL }; static const char *default_help_search[] = { "String Search\tSearching for strings in the DVI file\n", "The keystroke Ctrl-f or the menu entry File->Find ...\n", "opens a dialog window to search for a text string or a\n", "regular expression in the DVI file. The keystroke Ctrl-g\n", "jumps to the next match.\n", #ifdef MOTIF "(With Motif, you can also click on the `Binoculars' symbol\n", "in the toolbar.)\n", #endif "\n", #if HAVE_ICONV_H #if USE_LANGINFO "The search term is converted from the character set specified\n", "by the current locale into UTF-8. (See the output of `locale -a'\n", "for a list of locale settings available on your system).\n", #else /* USE_LANGINFO */ "Since langinfo() support is not available on this platform,\n", "the character set of the search string should be specified\n", "via the X resource/command-line option textEncoding if the\n", "encoding is different from iso_8859-1.\n", #endif /* USE_LANGINFO */ #else /* HAVE_ICONV_H */ "Since iconv() support is not available on this platform,\n", "the search term should be a string in the encoding specified\n", "by the X resource/command-line option textEncoding;\n", "currently, only the values iso_8859-1 and utf-8 are suported.\n", #endif "Internally, the text in the DVI file is represented in\n", "UTF-8 encoding (you can view the text by saving the DVI\n", "file to a text file in UTF-8 encoding via the `File -> Save As ...'\n", "dialog).\n", "\n", "Ideographic characters from CJKV fonts are treated specially:\n", "All white space (spaces and newlines) before and after such\n", "characters is ignored in the search string and in the DVI file.\n", "\n", "To match a newline character, use `\\n' in the search string;\n", "to match the string `\\n', use `\\\\n'.\n", "\n", "If the checkbox Regular Expression is activated, the\n", "string is teated as a regular expression in extended POSIX\n", "format, with the following properties:\n", "\n", " a? matches a zero or one times\n", "\n", " a* matches a zero or more times\n", "\n", " a+ matches a one or more times. Note that * and + are\n", " greedy, i.e. they match the longest possible\n", " sub string.\n", "\n", " a{n} matches a exactly n times\n", "\n", " a{n,m} matches a at least n and no more than m times\n", "\n", " a|b matches a or b. Brackets can be used for grouping,\n", " e.g.: (a|b)|c.\n", "\n", " The string matched by the nth group can be referenced\n", " by \\n, e.g. \\1 refers to the first match.\n", "\n", " The characters ^ and $ match the beginning and the end\n", " of a line, respectively.\n", "\n", " [abc] matches any of the letters a, b, c, and [a-z]\n", " matches all characters from a to z.\n", "\n", " The patterns . and [...] without an explicit newline\n", " don't match a newline character.\n", "\n", " Each item in a regular expression can also be one of\n", " the following POSIX character classes:\n", " [[:alnum:]] [[:alpha:]] [[:blank:]] [[:cntrl:]] [[:digit:]]\n", " [[:graph:]] [[:lower:]] [[:print:]] [[:space:]] [[:upper:]]\n", "\n", " These can be negated by inserting a ^ symbol after the\n", " first bracket: [^[:alpha:]]\n", "\n", " For more details on POSIX regular expressions, see\n", " e.g. the IEEE Std 1003.1 available online from:\n", "\n", " http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap09.html\n", "\n", " As a non-standard extension, the following Perl-like\n", " abbreviations can be used instead of the POSIX classes:\n", "\n", "\n", " Symbol Meaning POSIX Class\n", "\n", " \\w an alphanumeric character [[:alnum:]]\n", " \\W a non-alphanumeric character [^[:alnum:]]\n", " \\d a digit character [[:digit:]]\n", " \\D a non-digit character [^[:digit:]]\n", " \\s a whitespace character [[:space:]]\n", " \\S a non-whitespace character [^[:space:]]\n", "\n", " The following characters are special symbols; they\n", " need to be escaped with \\ in order to match them\n", " literally: ( ) [ ] . * ? + ^ $ \\.\n", "\n", "The dialog also provides checkboxes to search backwards,\n", "to match in a case-sensitive manner (the default is to\n", "ignore case, i.e. a search string Test will match both\n", "the strings test and TEST in the DVI file) and to ignore\n", "newlines and hyphens in the DVI file.\n", "\n", NULL }; k = width = 0; init_item(resource.help_general, default_help_general, info, k++, &width); init_item(resource.help_pagemotion, default_help_pagemotion, info, k++, &width); init_item(resource.help_othercommands, default_help_othercommands, info, k++, &width); init_item(resource.help_hypertex, default_help_hypertex, info, k++, &width); init_item(resource.help_mousebuttons, default_help_mousebuttons, info, k++, &width); init_item(resource.help_modes, default_help_modes, info, k++, &width); init_item(resource.help_search, default_help_search, info, k++, &width); init_item(resource.help_pagemotion, default_help_marking, info, k++, &width); init_item(resource.help_sourcespecials, default_help_sourcespecials, info, k++, &width); ASSERT(k < NUM_HELP_TOPICS, "Too many elements in help topics!"); /* NULL-terminate items info */ info->items[k].widget = 0; info->items[k].topic = info->items[k].title = NULL; /* adjust width of topics label to longest text */ #if !MOTIF XtVaSetValues(info->topic_label, XtNwidth, width, NULL); #endif } /* * Pops up the help window. If topic != NULL, also selects the topic. */ void show_help(Widget toplevel, const char *topic) { size_t i; static Widget help_shell = 0; static struct topic_info info; static struct topic_item items[NUM_HELP_TOPICS]; static Boolean first_time = True; if (help_shell == 0) { /* called 1st time; create widget */ /* no special callbacks for OK/Cancel buttons */ info.ok_callback = NULL; info.cancel_callback = NULL; info.items = items; /* info.items_size = NUM_HELP_TOPICS; */ help_shell = create_topic_window(toplevel, "xdvik: Help", "help_window", &info, initialize_items, "Close", /* no Cancel button needed */ NULL); info.shell = help_shell; center_window(help_shell, globals.widgets.top_level); } #if MOTIF { /* check if resources are set properly */ Dimension w, h; XtVaGetValues(help_shell, XtNwidth, &w, XtNheight, &h, NULL); if (h < 200 || w < 400) { XDVI_WARNING((stderr, "Initial help window size too small (%dx%d); overriding size.\n" "Please check/update your application defaults file, and set both of\n" "`XDvi*help_text.rows' and `XDvi*help_text.columns' to a realistic value.", h, w)); XtVaSetValues(help_shell, XtNwidth, 620, XtNheight, 520, NULL); } } #endif XtPopup(help_shell, XtGrabNone); if (topic != NULL) { Boolean matched = False; for (i = 0; info.items[i].topic != NULL; i++) { if (strcmp(info.items[i].topic, topic) == 0) { /* match */ select_topic(&info, i); matched = True; } } if (!matched) { XBell(DISP, 0); popup_message(help_shell, MSG_WARN, NULL, "Shouldn't happen: Could not find topic `%s' in help list!\n" REPORT_XDVI_BUG_TEMPLATE, topic); } } else if (first_time) { first_time = False; select_topic(&info, 0); } } xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xaw_bitmaps.h0000664000175000017500000000122410363262237021441 0ustar uwabamiuwabami#define BUTTON_BITMAP_H 16 #define BUTTON_BITMAP_W 16 extern unsigned char button_check_on_bits[]; extern unsigned char button_check_off_bits[]; extern unsigned char button_radio_on_bits[]; extern unsigned char button_radio_off_bits[]; #define MENU_BITMAP_H 11 #define MENU_BITMAP_W 11 extern unsigned char menu_check_on_bits[]; extern unsigned char menu_check_off_bits[]; extern unsigned char menu_radio_on_bits[]; extern unsigned char menu_radio_off_bits[]; #define MENU_ARROW_H 11 #define MENU_ARROW_W 11 extern unsigned char menu_arrow_bits[]; #define MENU_DOUBLE_ARROW_H 16 #define MENU_DOUBLE_ARROW_W 11 extern unsigned char menu_double_arrow_bits[]; xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs_appearance.c0000664000175000017500000004552311276240141023124 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Panel 1 (Apperance) for xdvik preferences dialog. */ #include "xdvi-config.h" #include "xdvi.h" #include "x_util.h" #include "my-snprintf.h" #include "xm_colorsel.h" #include "topic-window.h" #include "message-window.h" #include "util.h" #include "events.h" #include "xm_toolbar.h" #include "xm_menu.h" #include "statusline.h" #include "pagesel.h" #include "xm_prefsP.h" #include "xm_prefs_appearance.h" #ifdef MOTIF /* entire file */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* * Handy defaults */ static Arg one_of_many = { XmNindicatorType, XmONE_OF_MANY }; static Arg n_of_many = { XmNindicatorType, XmN_OF_MANY }; static Arg frame_title = { XmNchildType, XmFRAME_TITLE_CHILD }; static Arg two_cols[] = { { XmNpacking, XmPACK_TIGHT }, { XmNnumColumns, 2 }, { XmNorientation, XmHORIZONTAL } }; static Arg two_cols_fixed[] = { { XmNpacking, XmPACK_COLUMN }, { XmNnumColumns, 2 } }; static void match_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); Widget inverted, boxed; UNUSED(w); UNUSED(call_data); resource.match_highlight_inverted = !resource.match_highlight_inverted; /* force a redraw so that a current match is updated if there was one */ globals.ev.flags |= EV_NEWPAGE; store_preference(&(prefs->db), "matchInverted", "%s", resource.match_highlight_inverted ? "True" : "False"); if (get_widget_by_name(&inverted, info->shell, Xdvi_MATCH_INVERTED_STR, True) && get_widget_by_name(&boxed, info->shell, Xdvi_MATCH_BOXED_STR, True)) { XmToggleButtonGadgetSetState(inverted, resource.match_highlight_inverted, False); XmToggleButtonGadgetSetState(boxed, !resource.match_highlight_inverted, False); } } static void tooltips_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); const char *w_name = XtName(w); UNUSED(call_data); if (strcmp(w_name, Xdvi_TIPS_STATUSLINE) == 0) { resource.tooltips_in_statusline = !resource.tooltips_in_statusline; store_preference(&(prefs->db), "tooltipsInStatusline", "%s", resource.tooltips_in_statusline ? "True" : "False"); } else if (strcmp(w_name, Xdvi_TIPS_POPUPS) == 0) { Widget label1, text, label2; resource.show_tooltips = !resource.show_tooltips; if (!resource.show_tooltips && resource.tooltips_wait_period >= 0) { if (resource.tooltips_wait_period == 0) resource.tooltips_wait_period = -1; else resource.tooltips_wait_period = -resource.tooltips_wait_period; } else if (resource.show_tooltips && resource.tooltips_wait_period < 0) { resource.tooltips_wait_period = -resource.tooltips_wait_period; } store_preference(&(prefs->db), "showTooltips", "%s", resource.show_tooltips ? "True" : "False"); if (get_widget_by_name(&label1, info->shell, Xdvi_TIPS_DELAY_LABEL1, True) && get_widget_by_name(&text, info->shell, Xdvi_TIPS_DELAY_TEXT, True) && get_widget_by_name(&label2, info->shell, Xdvi_TIPS_DELAY_LABEL2, True)) { XtSetSensitive(label1, resource.show_tooltips); XtSetSensitive(text, resource.show_tooltips); XtSetSensitive(label2, resource.show_tooltips); } } else if (strcmp(w_name, Xdvi_TIPS_DELAY_TEXT) == 0) { char *buf = XmTextFieldGetString(w); int val = strtol(buf, (char **)NULL, 10); XtFree((char *)buf); TRACE_GUI((stderr, "tooltips_cb wait period2: %d\n", val)); resource.tooltips_wait_period = val; store_preference(&(prefs->db), "tipShell.waitPeriod", "%d", val); } else { XDVI_WARNING((stderr, "unexpected widget name `%s' in tooltips_cb", XtName(w))); } } #if 0 static void toolbar_buttons_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; struct x_resources *res = (struct x_resources *)(info->data); Boolean is_flat = False, is_raised = False; Widget flat_b, raised_b; UNUSED(call_data); if (!get_widget_by_name(&flat_b, XtParent(w), TB_BUTTONS_FLAT_STR, True) || !get_widget_by_name(&raised_b, XtParent(w), TB_BUTTONS_RAISED_STR, True)) return; if (w == flat_b) { is_flat = True; } else if (w == raised_b) { is_raised = True; } else { unexpected_widget_in_callback(w, "toolbar_buttons_cb()"); return; } res->toolbar_buttons_raised = is_raised ? True : False; XmToggleButtonGadgetSetState(raised_b, is_raised, False); XmToggleButtonGadgetSetState(flat_b, is_flat, False); } #endif /* 0 */ void update_preferences_expert(void) { Widget shell; Widget statusline_b, toolbar_b, pagelist_b, scrollbars_b; /* it's not an error if the prefs dialog doesn't exist yet */ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False) && get_widget_by_name(&statusline_b, shell, Xdvi_GUI_STATUSLINE_STR, True) && get_widget_by_name(&toolbar_b, shell, Xdvi_GUI_TOOLBAR_STR, True) && get_widget_by_name(&pagelist_b, shell, Xdvi_GUI_PAGELIST_STR, True) && get_widget_by_name(&scrollbars_b, shell, Xdvi_GUI_SCROLLBARS_STR, True)) { XmToggleButtonGadgetSetState(statusline_b, resource.expert_mode & XPRT_SHOW_STATUSLINE ? True : False, False); XmToggleButtonGadgetSetState(toolbar_b, resource.expert_mode & XPRT_SHOW_TOOLBAR ? True : False, False); XmToggleButtonGadgetSetState(pagelist_b, resource.expert_mode & XPRT_SHOW_PAGELIST ? True : False, False); XmToggleButtonGadgetSetState(scrollbars_b, resource.expert_mode & XPRT_SHOW_SCROLLBARS ? True : False, False); } } void update_preferences_tooltips(void) { Widget shell; Widget statusline_b, popup_b, label1, text, label2; if (resource.toolbar_unusable) return; if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, True) && get_widget_by_name(&statusline_b, shell, Xdvi_TIPS_STATUSLINE, True) && get_widget_by_name(&popup_b, shell, Xdvi_TIPS_POPUPS, True) && get_widget_by_name(&label1, shell, Xdvi_TIPS_DELAY_LABEL1, True) && get_widget_by_name(&text, shell, Xdvi_TIPS_DELAY_TEXT, True) && get_widget_by_name(&label2, shell, Xdvi_TIPS_DELAY_LABEL2, True)) { char buf[LENGTH_OF_INT]; SNPRINTF(buf, LENGTH_OF_INT, "%d", ABS(resource.tooltips_wait_period)); XtVaSetValues(text, XmNvalue, buf, NULL); XmToggleButtonGadgetSetState(statusline_b, resource.tooltips_in_statusline, False); XmToggleButtonGadgetSetState(popup_b, resource.show_tooltips, False); XtSetSensitive(label1, resource.show_tooltips); XtSetSensitive(text, resource.show_tooltips); XtSetSensitive(label2, resource.show_tooltips); } } void update_preferences_search(void) { Widget shell; Widget inverted, boxed; if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, True) && get_widget_by_name(&inverted, shell, Xdvi_MATCH_INVERTED_STR, True) && get_widget_by_name(&boxed, shell, Xdvi_MATCH_BOXED_STR, True)) { XmToggleButtonGadgetSetState(inverted, resource.match_highlight_inverted, False); XmToggleButtonGadgetSetState(boxed, !resource.match_highlight_inverted, False); } } static void gui_buttons_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); char *name = XtName(w); UNUSED(call_data); if (strcmp(name, Xdvi_GUI_STATUSLINE_STR) == 0) { resource.expert_mode ^= XPRT_SHOW_STATUSLINE; toggle_statusline(); update_expert_mode(); } else if (strcmp(name, Xdvi_GUI_TOOLBAR_STR) == 0) { resource.expert_mode ^= XPRT_SHOW_TOOLBAR; toggle_toolbar(); update_expert_mode(); } else if (strcmp(name, Xdvi_GUI_PAGELIST_STR) == 0) { resource.expert_mode ^= XPRT_SHOW_PAGELIST; toggle_pagelist(); update_expert_mode(); } else if (strcmp(name, Xdvi_GUI_SCROLLBARS_STR) == 0) { #if defined(LESSTIF_VERSION) static Boolean warned_about_lesstif = False; #endif resource.expert_mode ^= XPRT_SHOW_SCROLLBARS; toggle_scrollbars(); update_expert_mode(); #if defined(LESSTIF_VERSION) if (!warned_about_lesstif) { warned_about_lesstif = True; popup_message(globals.widgets.top_level, MSG_INFO, NULL, "This version has been compiled with LessTif; " "toggling the scrollbars won't work with LessTif."); } #endif } else { popup_message(globals.widgets.top_level, MSG_ERR, REPORT_XDVI_BUG_TEMPLATE, "Unexpected label in gui buttons: |%s|!\n", name); } store_preference(&(prefs->db), "expertMode", "%d", resource.expert_mode); } #if 0 static void toolbar_buttons_init(struct topic_info *info, Widget raised, Widget flat) { Boolean is_flat = False, is_raised = False; struct x_resources *res = (struct x_resources *)(info->data); if (res->toolbar_buttons_raised) is_raised = True; XmToggleButtonGadgetSetState(raised, is_raised, False); XmToggleButtonGadgetSetState(flat, is_flat, False); XtAddCallback(flat, XmNvalueChangedCallback, toolbar_buttons_cb, (XtPointer)info); XtAddCallback(raised, XmNvalueChangedCallback, toolbar_buttons_cb, (XtPointer)info); } #endif /* 0 */ Widget prefs_appearance(struct topic_info *info) { Widget form; Widget gui_frame, gui_label, gui_rowcol, gui_statusline, gui_toolbar, gui_pagelist, gui_scrollbars; Widget tips_frame, tips_label, tips_form, tips_statusline; Widget tips_popups, tips_delay_text, tips_delay_label1, tips_delay_label2; Widget match_frame, match_label, match_rowcol, match_inverted, match_boxed; #if 0 Widget tb_buttons_frame, tb_buttons_label, tb_buttons_rowcol, tb_buttons_flat, tb_buttons_raised; #endif XmString str; char buf[LENGTH_OF_INT]; Arg args[10]; int n; form = XmCreateForm(info->right_form, "appearance_form", NULL, 0); h_attach_below(form, NULL); n = 0; XtSetArg(args[n], XmNmarginWidth, 8); n++; XtSetArg(args[n], XmNmarginHeight, 4); n++; gui_frame = XmCreateFrame(form, "gui_frame", args, n); h_attach_below(gui_frame, NULL); gui_label = XmCreateLabelGadget(gui_frame, "Window Configuration", &frame_title, 1); XtManageChild(gui_label); gui_rowcol = XmCreateRowColumn(gui_frame, "gui_rowcol", two_cols_fixed, XtNumber(two_cols_fixed)); XtManageChild(gui_rowcol); gui_statusline = XmCreateToggleButtonGadget(gui_rowcol, Xdvi_GUI_STATUSLINE_STR, &n_of_many, 1); XmToggleButtonGadgetSetState(gui_statusline, resource.expert_mode & XPRT_SHOW_STATUSLINE ? True : False, False); XtManageChild(gui_statusline); gui_toolbar = XmCreateToggleButtonGadget(gui_rowcol, Xdvi_GUI_TOOLBAR_STR, &n_of_many, 1); XmToggleButtonGadgetSetState(gui_toolbar, resource.expert_mode & XPRT_SHOW_TOOLBAR ? True : False, False); XtManageChild(gui_toolbar); gui_pagelist = XmCreateToggleButtonGadget(gui_rowcol, Xdvi_GUI_PAGELIST_STR, &n_of_many, 1); XmToggleButtonGadgetSetState(gui_pagelist, resource.expert_mode & XPRT_SHOW_PAGELIST ? True : False, False); XtManageChild(gui_pagelist); gui_scrollbars = XmCreateToggleButtonGadget(gui_rowcol, Xdvi_GUI_SCROLLBARS_STR, &n_of_many, 1); XmToggleButtonGadgetSetState(gui_scrollbars, resource.expert_mode & XPRT_SHOW_SCROLLBARS ? True : False, False); XtManageChild(gui_scrollbars); XtAddCallback(gui_statusline, XmNvalueChangedCallback, gui_buttons_cb, (XtPointer)info); XtAddCallback(gui_toolbar, XmNvalueChangedCallback, gui_buttons_cb, (XtPointer)info); XtAddCallback(gui_pagelist, XmNvalueChangedCallback, gui_buttons_cb, (XtPointer)info); XtAddCallback(gui_scrollbars, XmNvalueChangedCallback, gui_buttons_cb, (XtPointer)info); n = 0; XtSetArg(args[n], XmNmarginWidth, 8); n++; XtSetArg(args[n], XmNmarginHeight, 4); n++; XtSetArg(args[n], XmNtopOffset, 10); n++; tips_frame = XmCreateFrame(form, "tips_frame", args, n); h_attach_below(tips_frame, gui_frame); tips_label = XmCreateLabelGadget(tips_frame, "Show Tooltips", &frame_title, 1); XtManageChild(tips_label); tips_form = XmCreateForm(tips_frame, "tips_form", NULL, 0); str = XmStringCreateLocalized("As Text in Statusline"); tips_statusline = XtVaCreateManagedWidget(Xdvi_TIPS_STATUSLINE, xmToggleButtonGadgetClass, tips_form, XmNlabelString, str, XmNindicatorType, XmN_OF_MANY, XmNset, True, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL); XmStringFree(str); str = XmStringCreateLocalized("As Popups"); tips_popups = XtVaCreateManagedWidget(Xdvi_TIPS_POPUPS, xmToggleButtonGadgetClass, tips_form, XmNlabelString, str, XmNindicatorType, XmN_OF_MANY, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, tips_statusline, XmNleftAttachment, XmATTACH_FORM, NULL); XmStringFree(str); str = XmStringCreateLocalized("with"); tips_delay_label1 = XtVaCreateManagedWidget(Xdvi_TIPS_DELAY_LABEL1, xmLabelGadgetClass, tips_form, XmNlabelString, tips_form, XmNlabelString, str, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, tips_statusline, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, tips_popups, XmNleftOffset, 0, /* no spacing to prev text */ NULL); XmStringFree(str); SNPRINTF(buf, LENGTH_OF_INT, "%d", ABS(resource.tooltips_wait_period)); tips_delay_text = XtVaCreateManagedWidget(Xdvi_TIPS_DELAY_TEXT, xmTextFieldWidgetClass, tips_form, XmNcolumns, 4, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, tips_statusline, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, tips_delay_label1, XmNvalue, buf, NULL); str = XmStringCreateLocalized("milliseconds delay"); tips_delay_label2 = XtVaCreateManagedWidget(Xdvi_TIPS_DELAY_LABEL2, xmLabelGadgetClass, tips_form, XmNlabelString, str, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, tips_statusline, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, tips_delay_text, NULL); adjust_heights(tips_popups, tips_delay_label1, tips_delay_text, tips_delay_label2, NULL); XmToggleButtonGadgetSetState(tips_statusline, resource.tooltips_in_statusline, False); XmToggleButtonGadgetSetState(tips_popups, resource.show_tooltips, False); if (resource.toolbar_unusable) { XtSetSensitive(tips_frame, False); } else { XtSetSensitive(tips_delay_label1, resource.show_tooltips); XtSetSensitive(tips_delay_text, resource.show_tooltips); XtSetSensitive(tips_delay_label2, resource.show_tooltips); XtAddCallback(tips_statusline, XmNvalueChangedCallback, tooltips_cb, (XtPointer)info); XtAddCallback(tips_popups, XmNvalueChangedCallback, tooltips_cb, (XtPointer)info); XtAddCallback(tips_delay_text, XmNvalueChangedCallback, tooltips_cb, (XtPointer)info); } #if 0 tb_buttons_frame = XmCreateFrame(form, "tb_buttons_frame", &v_off, 1); h_attach_below(tb_buttons_frame, tips_frame); tb_buttons_label = XmCreateLabelGadget(tb_buttons_frame, "Toolbar Buttons:", &frame_title, 1); XtManageChild(tb_buttons_label); tb_buttons_rowcol = XmCreateRowColumn(tb_buttons_frame, "tb_buttons_rowcol", two_cols, XtNumber(two_cols)); XtManageChild(tb_buttons_rowcol); tb_buttons_raised = XmCreateToggleButtonGadget(tb_buttons_rowcol, "Raised", &one_of_many, 1); XtManageChild(tb_buttons_raised); tb_buttons_flat = XmCreateToggleButtonGadget(tb_buttons_rowcol, "Flat", &one_of_many, 1); XtManageChild(tb_buttons_flat); toolbar_buttons_init((XtPointer)info, tb_buttons_raised, tb_buttons_flat); #endif /* 0 */ n = 0; XtSetArg(args[n], XmNmarginWidth, 8); n++; XtSetArg(args[n], XmNmarginHeight, 4); n++; XtSetArg(args[n], XmNtopOffset, 10); n++; match_frame = XmCreateFrame(form, "match_frame", args, n); XtVaSetValues(match_frame, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, tips_frame, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); match_label = XmCreateLabelGadget(match_frame, "String Matches are shown:", &frame_title, 1); XtManageChild(match_label); match_rowcol = XmCreateRowColumn(match_frame, "tb_buttons_rowcol", two_cols, XtNumber(two_cols)); XtManageChild(match_rowcol); match_inverted = XmCreateToggleButtonGadget(match_rowcol, Xdvi_MATCH_INVERTED_STR, &one_of_many, 1); XtManageChild(match_inverted); match_boxed = XmCreateToggleButtonGadget(match_rowcol, Xdvi_MATCH_BOXED_STR, &one_of_many, 1); XtManageChild(match_boxed); XmToggleButtonGadgetSetState(match_inverted, resource.match_highlight_inverted, False); XmToggleButtonGadgetSetState(match_boxed, !resource.match_highlight_inverted, False); XtAddCallback(match_inverted, XmNvalueChangedCallback, match_cb, (XtPointer)info); XtAddCallback(match_boxed, XmNvalueChangedCallback, match_cb, (XtPointer)info); /* manage children (order shouldn't matter, since children are already managed, but ...) */ XtManageChild(gui_frame); XtManageChild(tips_form); XtManageChild(tips_frame); #if 0 XtManageChild(tb_buttons_frame); #endif XtManageChild(match_frame); XtManageChild(form); return form; } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/pagesel.h0000664000175000017500000000475210363262237020554 0ustar uwabamiuwabami/* * Copyright (c) 2001-2004 the xdvik development team * * Page selector for xdvi * * Copyright (c) 1993, 1995 * MATSUURA Syun syun@fuka.info.waseda.ac.jp * HIRAHARA Atsushi hirahara@fuka.info.waseda.ac.jp * ONO Kouichi onono@fuka.info.waseda.ac.jp * * All rights reserved. */ /* SU: I was unsure how to interpret the `All rights reserved' in the * previous line, so emailed Ono Kouichi about this. Here's (the * relevant part of) his answer (which was CC'ed to Hirahara Atsushi - * all three of them had left Waseda university around '95): * * You can modify, embed, copy and distribute a part of or the * entire of our source code when you specify our copyright in your * xdvik version. * * IANAL, but I think this is compatible with the X consortium * license as specified in the other files. */ #ifndef PAGESEL_H_ #define PAGESEL_H_ #include "xdvi.h" extern void refresh_pagelist(int newsize, int newpage); extern void maybe_scroll_pagelist(int newpage, Boolean force_recenter); extern void create_pagelist(void); extern void list_toggle_current(int arg); extern void list_toggle_marks(int arg); # ifdef MOTIF extern Widget page_list; extern void toggle_pagelist(void); # else extern int xaw_get_pagelist_size(void); extern void xaw_create_pagelist_widgets(Dimension height, Dimension width, Position y, Widget parent); extern void handle_destroy_pagelist(Widget w, XtPointer client_data, XtPointer call_data); extern void handle_pagelist_resize(void); # endif /* pageinfo access methods */ extern long pageinfo_get_offset(int page); extern int pageinfo_get_number(int page); extern int pageinfo_get_index_of_number(int number); extern unsigned int pageinfo_get_page_width(int page); extern unsigned int pageinfo_get_page_height(int page); extern unsigned int pageinfo_get_window_width(int page); extern unsigned int pageinfo_get_window_height(int page); extern void pageinfo_set_page_width(int page, unsigned int width); extern void pageinfo_set_page_height(int page, unsigned int height); extern void pageinfo_set_window_width(int page, unsigned int width); extern void pageinfo_set_window_height(int page, unsigned int height); extern void pageinfo_set_offset(int index, long offset); extern void pageinfo_set_number(int index, int number); extern void pageinfo_allocate(int total_pages); extern void pageinfo_deallocate(void); extern Boolean pageinfo_is_marked(int i); extern Boolean pageinfo_have_marked_pages(void); #endif /* PAGESEL_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/Tip.c0000664000175000017500000004210611276240141017650 0ustar uwabamiuwabami/* * Copyright (c) 2001-2004 Marcin Dalecki and others * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * */ #include "xdvi-config.h" #include "xdvi.h" #include "Tip.h" #include "xdvi-debug.h" #include "util.h" #ifdef MOTIF /* needed for `make depend' */ #ifndef UNUSED #define UNUSED(x) ((void)(x)) #endif #include #include #include #include #include #include #include #include #define TIP_NUM 1024 /* FIXME: remove this hard-coded value */ typedef struct { int __empty; } TipClassPart; /* Full class record declaration */ typedef struct _TipClassRec { CoreClassPart core_class; CompositeClassPart composite_class; ShellClassPart shell_class; OverrideShellClassPart override_shell_class; TipClassPart tip_class; } TipClassRec; /* keep information about each widget we are keeping track of */ struct tip_context { Widget watched; /* the widget we are watching */ Window window; /* Window of the object we are monitoring */ TipWidget tw; /* pointer back to the tip widget */ Position abs_x, abs_y; Boolean active; /* if False, tip is suppressed */ char *text; /* text to display */ short size; /* its size */ }; /* New fields for the widget record */ typedef struct { /* resources */ Pixel foreground; XFontSet fontset; /* the font for text in box */ int waitPeriod; /* the delay resource - pointer must be * in watched widget this long before * help is popped up - in millisecs */ unsigned int cwp; /* after help is popped down - normal * wait period is cancelled for this * period - in millisecs */ /* private state */ struct tip_context twl[TIP_NUM]; /* list of widgets we are liteClue-ing */ Cardinal nr_twl; /* number of widgets we have attached */ Dimension font_width; /* width of '1' character */ Dimension font_height; /* height of font, rows are spaced using this */ Dimension font_baseline; /* relative displacement to baseline from top */ GC text_GC; /* for drawing text */ XtIntervalId tid; /* holds timer id */ Widget isup; /* the help popup is up on this widget */ Time HelpPopDownTime; /* the time at which help popup was popped down */ } TipPart; /* * Full instance record declaration */ typedef struct _TipRec { CorePart core; CompositePart composite; ShellPart shell; OverrideShellPart override; TipPart tip; } TipRec; #define CheckWidgetClass(routine) \ if (XtClass(w) != tipWidgetClass) \ wrong_widget(routine) static void initialize(Widget, Widget, ArgList, Cardinal *); static Boolean set_values(Widget, Widget, Widget, ArgList, Cardinal *); static void destroy(Widget); /* * Widget resources: eg to set tip box background: *tipShell.background: yellow. */ #define offset(field) XtOffsetOf(TipRec, field) static XtResource resources[] = { {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), offset(tip.foreground), XtRString, "black"}, {XtNfontSet, XtCFontSet, XtRFontSet, sizeof(XFontSet), offset(tip.fontset), XtRString, "fixed"}, {XmNwaitPeriod, XmCWaitPeriod, XtRInt, sizeof(int), offset(tip.waitPeriod), XtRImmediate, (XtPointer)(ptrdiff_t)800}, {XmNcancelWaitPeriod, XmCCancelWaitPeriod, XtRInt, sizeof(int), offset(tip.cwp), XtRImmediate, (XtPointer)(ptrdiff_t)250}, }; #undef offset TipClassRec tipClassRec = { { /* superclass */ (WidgetClass) & overrideShellClassRec, /* class_name */ "Tip", /* widget size */ (Cardinal) sizeof(TipRec), /* class_init */ NULL, /* class_part_init */ (XtWidgetClassProc) NULL, /* class_inited */ (XtEnum) FALSE, /* initialize */ (XtInitProc) initialize, /* init_hook */ (XtArgsProc) NULL, /* realize */ XtInheritRealize, /* actions */ (XtActionList) 0, /* num_actions */ (Cardinal) 0, /* resources */ (XtResourceList) resources, /* num_resources */ (Cardinal) XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposur */ (XtEnum) FALSE, /* compress enterleave */ TRUE, /* visibility_interest */ FALSE, /* destroy */ destroy, /* resize */ XtInheritResize, /* expose, */ XtInheritExpose, /* set_values */ (XtSetValuesFunc) set_values, /* set_values_hook */ (XtArgsFunc) NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ (XtArgsProc) NULL, /* accept_focus */ XtInheritAcceptFocus, /* version */ XtVersion, /* callback_private */ (XtPointer) NULL, /* translations */ XtInheritTranslations, /* query_geometry */ XtInheritQueryGeometry, /* display_accelerator */ XtInheritDisplayAccelerator, /* extension */ (XtPointer) 0, }, /* composite part */ { /* geometry_manager */ XtInheritGeometryManager, /* change_managed */ XtInheritChangeManaged, /* insert_child */ XtInheritInsertChild, /* delete_child */ XtInheritDeleteChild, /* extension */ NULL }, /* Shell */ { (XtPointer) NULL, }, /* Override Shell */ { 0, }, /* tip */ { 0, } }; WidgetClass tipWidgetClass = (WidgetClass) & tipClassRec; /* * The font_information is derived. */ static void compute_font_info(TipWidget cw) { XRectangle ink; XRectangle logical; if (!cw->tip.fontset) return; XmbTextExtents(cw->tip.fontset, "1", 1, &ink, &logical); cw->tip.font_baseline = -logical.y; /* y offset from top to baseline, don't know why this is returned as negative */ cw->tip.font_width = logical.width; /* the width and height of the object */ cw->tip.font_height = logical.height; TRACE_GUI((stderr, "baseline: %d, width: %d, height: %d\n", cw->tip.font_baseline, cw->tip.font_width, cw->tip.font_height)); } /* * Creates the various graphic contexts we will need. */ static void create_GC(TipWidget cw) { XtGCMask valuemask; XGCValues myXGCV; valuemask = GCForeground | GCBackground | GCFillStyle; myXGCV.foreground = cw->tip.foreground; myXGCV.background = cw->core.background_pixel; myXGCV.fill_style = FillSolid; if (cw->tip.text_GC) XtReleaseGC((Widget) cw, cw->tip.text_GC); cw->tip.text_GC = XtGetGC((Widget) cw, valuemask, &myXGCV); } /* * A routine to halt execution and force a core dump for debugging analysis * when a public routine is called with the wrong class of widget. */ static void wrong_widget(char *routine) { XDVI_ABORT((stderr, "Wrong class of widget passed to %s", routine)); } /* * Global list of shells for tips that are in use. */ static TipWidget *shells = NULL; static int nr_shells = 0; /**************************************************************************** * Widget Methods */ static void initialize(Widget treq, Widget tnew, ArgList args, Cardinal * nargs) { TipWidget tw = (TipWidget) tnew; UNUSED(treq); UNUSED(args); UNUSED(nargs); tw->tip.text_GC = NULL; tw->tip.isup = NULL; tw->tip.HelpPopDownTime = 0; tw->tip.tid = (XtIntervalId) 0; tw->tip.nr_twl = 0; compute_font_info(tw); create_GC(tw); /* Add to our list of tip shells. */ if (!shells) shells = (TipWidget *)XtMalloc(sizeof(TipWidget)); else shells = (TipWidget *)XtRealloc((char *)shells, sizeof(TipWidget) * (nr_shells + 1)); shells[nr_shells++] = tw; } static Boolean set_values(Widget _current, Widget _request, Widget _new, ArgList args, Cardinal * nargs) { TipWidget cw_new = (TipWidget) _new; TipWidget cw_cur = (TipWidget) _current; UNUSED(_request); UNUSED(args); UNUSED(nargs); /* values of cw_new->tip.cwp and cw_new->tip.waitPeriod are accepted without checking */ if (cw_new->tip.foreground != cw_cur->tip.foreground || cw_new->core.background_pixel != cw_cur->core.background_pixel) { create_GC(cw_new); } return FALSE; } static void destroy(Widget w) { TipWidget tw = (TipWidget) w; int i; Boolean copy = False; /* Remove this tip shell from our global list. */ for (i = 0; i < nr_shells; ++i) { if (shells[i] == tw) { copy = True; --nr_shells; } if (copy && nr_shells) shells[i] = shells[i + 1]; } if (!nr_shells) { XtFree((char *) shells); shells = NULL; } } /**************************************************************************** * Event handlers */ /* callback to popup the tip window */ static void timeout_event(XtPointer client_data, XtIntervalId *id) { #define HBorderPix 3 #define VBorderPix 3 struct tip_context *obj = (struct tip_context *) client_data; TipWidget tw = obj->tw; Position abs_x, abs_y; int ptr_x, ptr_y; XRectangle ink; XRectangle logical; Position w_height, w_width; Widget w; UNUSED(id); TRACE_GUI((stderr, "timeout called!")); if (tw->tip.tid == (XtIntervalId) 0) return; /* timeout was removed but callback happened anyway */ tw->tip.tid = (XtIntervalId) 0; if (obj->active == False) return; w = obj->watched; if (!XtIsManaged(w)) return; { /* perform additional check that pointer is really still over the widget; else, tooltips will sometimes pop up if window had received an Enter event before (for some reason, not all Enters are followed by Leaves). This is especially apparent when running xdvi from a remote display over a slow connection. */ Window root, child; int root_x, root_y; unsigned int keys_buttons; if (!XQueryPointer(DISP, RootWindowOfScreen(SCRN), &root, &child, &root_x, &root_y, &ptr_x, &ptr_y, &keys_buttons)) return; TRACE_GUI((stderr, "Pointerlocate: %d, %d", root_x, root_y)); XtVaGetValues(w, XtNheight, &w_height, XtNwidth, &w_width, NULL); XtTranslateCoords(w, 0, 0, &abs_x, &abs_y); TRACE_GUI((stderr, "Window: %d,%d - %d,%d", abs_x, abs_y, abs_x + w_width, abs_y + w_height)); if (root_x < abs_x || root_x > abs_x + w_width || root_y < abs_y || root_y > abs_y + w_height) { TRACE_GUI((stderr, "not really over toolbutton - returning!")); return; } } /* position just below the pointer * (NOT the widget, in case the widget is large!) */ ptr_y += 20; /* abs_x += w_width / 2; */ /* abs_y += w_height; */ XmbTextExtents(tw->tip.fontset, obj->text, obj->size, &ink, &logical); XtRealizeWidget((Widget)tw); /* so that setting the size etc. works */ XtResizeWidget((Widget) tw, 2 * HBorderPix + logical.width, 2 * VBorderPix + tw->tip.font_height, tw->core.border_width); TRACE_GUI((stderr, "Popup size: %d x %d (hborder: %d, vborder: %d)\n", 2 * HBorderPix + logical.width, 2 * VBorderPix + tw->tip.font_height, HBorderPix, VBorderPix)); XtMoveWidget((Widget)tw, ptr_x, ptr_y); XtPopup((Widget) tw, XtGrabNone); tw->tip.isup = obj->watched; XmbDrawImageString(XtDisplay((Widget) tw), XtWindow((Widget) tw), tw->tip.fontset, tw->tip.text_GC, HBorderPix, VBorderPix + tw->tip.font_baseline, obj->text, obj->size); } /* * Pointer enters watched widget, set a timer to popup the help. */ static void enter(struct tip_context *obj, XEvent * xevent, XtAppContext app) { TipWidget tw = obj->tw; XEnterWindowEvent *event = &xevent->xcrossing; int current_waitPeriod; /* this doesn't help against the Enter/Leave problem mentioned above, so it's not related to Widget creation ... */ if (!XtIsManaged(obj->watched)) { TRACE_GUI((stderr, "%s:%d: Not yet managed!", __FILE__, __LINE__)); return; } TRACE_GUI((stderr, "%s:%d: Enter!", __FILE__, __LINE__)); if (obj->active == False) return; /* check for two enters in a row - happens when widget is exposed under a pop-up */ if (tw->tip.tid != (XtIntervalId) 0) return; if (event->mode != NotifyNormal) return; /* it seems that this makes the tooltips somewhat unpredictable (they don't show when hovering fast over several buttons, then staying on one button); disabled this for the time being. */ /* if ((event->time - tw->tip.HelpPopDownTime) > tw->tip.cwp) */ /* current_waitPeriod = tw->tip.waitPeriod; */ /* else */ /* current_waitPeriod = 0; */ /* current_waitPeriod = tw->tip.waitPeriod; */ current_waitPeriod = resource.tooltips_wait_period; if (current_waitPeriod >= 0) { tw->tip.tid = XtAppAddTimeOut(app, current_waitPeriod, timeout_event, (XtPointer) obj); } } /* * Remove timer if its pending. Then popdown help. */ static void leave(struct tip_context *obj, XEvent * xevent) { TipWidget tw = obj->tw; XEnterWindowEvent *event = &xevent->xcrossing; TRACE_GUI((stderr, "%s:%d: Leave!", __FILE__, __LINE__)); if (tw->tip.tid != (XtIntervalId) 0) { if (globals.debug & DBG_EVENT) fprintf(stderr, "%s:%d: removing timeout %ld\n", __FILE__, __LINE__, tw->tip.tid); XtRemoveTimeOut(tw->tip.tid); tw->tip.tid = (XtIntervalId) 0; } if (obj->active == False) return; if (tw->tip.isup) { XtPopdown((Widget) tw); tw->tip.isup = NULL; tw->tip.HelpPopDownTime = event->time; } } /**************************************************************************** * Public interface implementation. */ void TipAppHandle(XtAppContext app, XEvent *event) { int i; if (!(event->type == EnterNotify || event->type == MotionNotify || event->type == LeaveNotify || event->type == ButtonPress)) { return; } for (i = 0; i < nr_shells; ++i) { unsigned int j; for (j = 0; j < shells[i]->tip.nr_twl; ++j) { if (event->xany.window == shells[i]->tip.twl[j].window) { if (event->type == EnterNotify) enter(shells[i]->tip.twl + j, event, app); if (event->xany.type == LeaveNotify || event->xany.type == MotionNotify /* FIXME: this doesn' work? */ /* might be useful to popdown tip when mouse is moved */ || event->xany.type == ButtonPress) { leave(shells[i]->tip.twl + j, event); } } } } } /* * This has to replace the XtAppMainLoop in the application using * tooltips. */ void TipAppMainLoop(XtAppContext app) { XEvent event; for (;;) { XtAppNextEvent(app, &event); TipAppHandle(app, &event); XtDispatchEvent(&event); } } /* * Add a widget to be watched for tooltips. * * This function must be called after the widget has been realized! * Further on please make sure that this function will not be called twice * for one button! * * w - tip widget * watch - the widget to give tips for * text - pointer to tip text */ void TipAddWidget(Widget w, Widget watch, const String text) { #define ROUTINE "TipAddWidget" TipWidget tw = (TipWidget) w; int i; CheckWidgetClass(ROUTINE); /* make sure we are called with a tip widget */ /* Make internal resource available via resource.tooltips_wait_period(_bak) and * resource.show_tooltips. */ resource.tooltips_wait_period_bak = resource.tooltips_wait_period = ABS(tw->tip.waitPeriod); if (tw->tip.waitPeriod < 0) { resource.show_tooltips = False; } else if (!resource.show_tooltips) { if (resource.tooltips_wait_period == 0) resource.tooltips_wait_period = -1; else resource.tooltips_wait_period = -resource.tooltips_wait_period; } for (i = 0; i < nr_shells; ++i) if (shells[i] == tw) { struct tip_context *obj; if (tw->tip.nr_twl >= TIP_NUM) { XDVI_FATAL((stderr, "Too many tip widgets, cannot add new tip")); return; } obj = tw->tip.twl + tw->tip.nr_twl; obj->text = XtNewString(text); obj->size = strlen(text); obj->watched = watch; obj->window = XtWindow(watch); obj->active = True; obj->tw = tw; tw->tip.nr_twl++; } #undef ROUTINE } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_filesel.c0000664000175000017500000001525711276240141021252 0ustar uwabamiuwabami/* * Copyright (c) 2001-2004 Marcin Dalecki and others * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Implementation of the File selection dialogue for the Motif GUI. */ #include "xdvi-config.h" #include "xdvi.h" #include "sfSelFile.h" #include "dvi.h" #include "string-utils.h" #include "util.h" #include "events.h" #include "message-window.h" #include "dvi-init.h" /* for dviErrFlagT */ #include "x_util.h" #if defined(MOTIF) /* entire file */ #include #include #include /* static Widget dialog = NULL; */ /* static char *browse_fname = NULL; */ /* * Process callback from Dialog cancel actions. */ static void cancel_callback(Widget w, XtPointer client_data, XtPointer call_data) { struct filesel_callback *callback = (struct filesel_callback *)client_data; UNUSED(w); UNUSED(call_data); #if 0 /* DON'T reset browse_fname, so that user gets the current value as default next time when he cancels now */ if (callback->browse_fname != NULL) { XtFree(callback->browse_fname); callback->browse_fname = NULL; } #endif XtUnmanageChild(callback->shell); if (callback->exit_on_cancel) { exit(0); } } /* * Process callback from Dialog actions. */ static void accept_callback(Widget w, XtPointer client_data, XtPointer call_data) { XmFileSelectionBoxCallbackStruct *fcb; struct filesel_callback *callback; UNUSED(w); ASSERT(client_data != NULL, "struct filesel_callback pointer expected in client data"); callback = (struct filesel_callback *)client_data; /* get the filename from the file selection box */ fcb = (XmFileSelectionBoxCallbackStruct *)call_data; if (callback->browse_fname != NULL) { XtFree(callback->browse_fname); callback->browse_fname = NULL; } XmStringGetLtoR(fcb->value, G_charset, &callback->browse_fname); if (0 && callback->must_exist) { FILE *tmp_fp = XFOPEN(callback->browse_fname, "r"); dviErrFlagT errflag = NO_ERROR; if (tmp_fp == NULL) { popup_message(XtParent(callback->shell), MSG_ERR, NULL, "Could not open %s: %s.\n", callback->browse_fname, strerror(errno)); /* leave file selection box open */ return; } else if (!process_preamble(tmp_fp, &errflag) || !find_postamble(tmp_fp, &errflag) || !read_postamble(tmp_fp, &errflag, True #if DELAYED_MKTEXPK , False #endif )) { popup_message(XtParent(callback->shell), MSG_ERR, NULL, "Error opening %s:\n%s.", callback->browse_fname, get_dvi_error(errflag)); fclose(tmp_fp); /* leave file selection box open */ return; } else { /* file is OK */ fclose(tmp_fp); } } /* success; close dialog, and call our callback */ XtUnmanageChild(callback->shell); callback->func_ptr(callback->browse_fname, callback->data); } static void cb_open_new_window(Widget w, XtPointer client_data, XtPointer call_data) { UNUSED(client_data); UNUSED(call_data); if (XmToggleButtonGadgetGetState(w)) resource.filesel_open_new_window = True; else resource.filesel_open_new_window = False; store_preference(NULL, "fileselOpenNewWindow", "%d", resource.filesel_open_new_window); } void raise_file_selector(void) { /* dummy */ return; } void XsraSelFilePopup(struct filesel_callback *callback) { if (XtIsManaged(callback->shell)) { XBell(DISP, 10); XRaiseWindow(DISP, XtWindow(callback->shell)); return; } else { #define ARG_CNT 4 XmString filemask = NULL; XmString directory = NULL; Arg args[ARG_CNT]; int i = 0; char *path, *ptr; /* only show files matching our mask */ filemask = XmStringCreateLtoR((char *)callback->filemask, G_charset); XtSetArg(args[i], XmNpattern, filemask); i++; /* set directory to last directory used */ if (callback->browse_fname == NULL) { ASSERT(callback->init_path != NULL, "callback->init_path mustn't be NULL!"); callback->browse_fname = xt_strdup(callback->init_path); } path = xstrdup(callback->browse_fname); ptr = strrchr(path, '/'); if (ptr != NULL) *ptr = '\0'; directory = XmStringCreateLtoR(path, G_charset); XtSetArg(args[i], XmNdirectory, directory); i++; free(path); ASSERT(i < ARG_CNT, "args list too short"); XtSetValues(callback->shell, args, (Cardinal)i); free(filemask); free(directory); XtManageChild(callback->shell); #undef ARG_CNT } } Widget XsraSelFile(Widget parent, struct filesel_callback *callback) { Widget dialog = XmCreateFileSelectionDialog(parent, "file", NULL, 0); XtVaSetValues(XtParent(dialog), XmNtitle, callback->title, NULL); XtAddCallback(dialog, XmNokCallback, accept_callback, (XtPointer)callback); XtAddCallback(dialog, XmNcancelCallback, cancel_callback, (XtPointer)callback); /* When opening a DVI file, offer to open in new window */ if (callback->must_exist) { Widget form, button; XmString test; form = XtVaCreateManagedWidget("new_window_form", xmFormWidgetClass, dialog, NULL); test = XmStringCreateLocalized("Open file in new window"); button = XtVaCreateManagedWidget(Xdvi_NEW_WINDOW_RADIO_NAME, xmToggleButtonGadgetClass, form, XmNlabelString, test, XmNindicatorType, XmN_OF_MANY, XmNset, resource.filesel_open_new_window, NULL); XmStringFree(test); XtAddCallback(button, XmNvalueChangedCallback, cb_open_new_window, (XtPointer)NULL); } /* We have no help in this window, so hide help button */ XtUnmanageChild(XmFileSelectionBoxGetChild(dialog, (unsigned char)XmDIALOG_HELP_BUTTON)); return dialog; } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* defined(MOTIF) */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/selection.h0000664000175000017500000000246710363262237021122 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef SELECTION_H_ #define SELECTION_H_ #include "xdvi-config.h" #include "xdvi.h" Boolean set_selection(const char *text, Widget w); void unset_selection(Widget w); #endif /* SELECTION_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/sfDir.h0000664000175000017500000000335710363262237020203 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef SFDIR_H_ #define SFDIR_H_ #include "xdvi-config.h" #include "kpathsea/c-auto.h" #include "kpathsea/config.h" #include "kpathsea/c-dir.h" #include "kpathsea/c-stat.h" #ifndef MOTIF typedef struct { int statDone; char *real; char *shown; } SFEntry; typedef struct { char *dir; char *path; SFEntry *entries; int nEntries; int vOrigin; int nChars; int hOrigin; int changed; int beginSelection; int endSelection; time_t mtime; } SFDir; extern int SFcompareEntries(const void *vp, const void *vq); extern int SFgetDir(SFDir *dir); extern SFDir *SFdirs; #endif /* MOTIF */ #endif /* SFDIR_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/mag.h0000664000175000017500000000400311032450154017654 0ustar uwabamiuwabami/* * Copyright (c) 1990-2004 Paul Vojta and others * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * * NOTE: xdvi is based on prior work, as noted in the modification history in * xdvi.c. * */ #ifndef MAG_H_ #define MAG_H_ #define MAGBORD 1 /* border size for magnifier */ extern size_t get_magglass_items(void); extern int get_magglass_width(int idx); extern int get_magglass_height(int idx); extern void set_magglass_widht(int idx, int w); extern void set_magglass_height(int idx, int h); extern void show_distance_from_ruler(XEvent *event, Boolean to_stdout); extern void drag_ruler_motion(XEvent *event); extern void drag_ruler_release(XEvent *event); extern void clear_ruler(void); extern void show_ruler(XEvent *event); extern void redraw_ruler(void); extern void ruler_snap_origin(XEvent *event); extern void magnifier_move(String params, XEvent *event); extern void mag_release(XEvent * event); extern void move_magnifier(void); extern void create_magnifier(void); #endif /* MAG_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/sfinternal.h0000664000175000017500000000472411032450154021267 0ustar uwabamiuwabami/* * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan * Copyright 2004 the Xdvik development team * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Software Research Associates not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. Software Research Associates * makes no representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * * Author: Erik M. van der Poel * Software Research Associates, Inc., Tokyo, Japan * erik@sra.co.jp */ #include #include #include #include #include #undef wchar_t #define SEL_FILE_CANCEL -1 #define SEL_FILE_OK 0 #define SEL_FILE_NULL 1 #define SEL_FILE_TEXT 2 #define SF_DO_SCROLL 1 #define SF_DO_NOT_SCROLL 0 /* Widget names for get_widget_by_name() */ #define SfSelFile_FIELD_NAME "selFileField" #define SfSelFile_FORM_NAME "selFileForm" #define SfSelFile_HSCROLL_BIG_NAME "selFileHScrollBig" #define SfSelFile_VSCROLL_BASE_NAME "selFileVScroll" #define SfSelFile_HSCROLL_BASE_NAME "selFileHScroll" #define SfSelFile_LIST_BASE_NAME "selFileList" #define SfSelFile_LIST1_NAME "selFileList1" #define SfSelFile_LIST2_NAME "selFileList2" #define SfSelFile_LIST3_NAME "selFileList3" extern void SFenterList(), SFleaveList(), SFmotionList(), SFbuttonPressList(), SFbuttonReleaseList(); extern void SFvSliderMovedCallback(), SFvFloatSliderMovedCallback(), SFhSliderMovedCallback(), SFpathSliderMovedCallback(), SFvAreaSelectedCallback(), SFhAreaSelectedCallback(), SFpathAreaSelectedCallback(); xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xaw_menu.h0000664000175000017500000000372211032450154020742 0ustar uwabamiuwabami/* * Copyright (c) 2001-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef XAW_MENU_H_ #define XAW_MENU_H_ #include "menu.h" #ifndef MOTIF extern void xaw_set_button_state(struct button_elems *elems, Boolean on); extern void xaw_initialize_menu_bitmaps(void); extern Widget xaw_create_menu_widgets(Widget parent); extern void xaw_create_menu(struct button_info *items, Widget parent, int *ret_width); extern void SubMenuHandleEvent(XtAppContext app, XEvent *event); extern void filehist_menu_add_entry(const char *filename); extern int get_panel_width(void); extern void realize_button_panel(XtArgVal height); extern void filehist_menu_refresh(void); extern void xaw_create_pagelist(void); extern void toggle_scrollbars(void); extern void toggle_buttons(void); #ifdef USE_PANNER extern void scroll_y_panner(int y); extern void scroll_x_panner(int x); #endif #endif /* not MOTIF */ #endif /* XAW_MENU_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/sfSelFile.h0000664000175000017500000000366311032450154020777 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef SFSELFILE_H_ #define SFSELFILE_H_ struct filesel_callback { Widget shell; char *browse_fname; const char *title; const char *prompt; const char *ok; const char *cancel; const char *init_path; const char *filemask; Boolean must_exist; Boolean exit_on_cancel; void (*func_ptr)(const char *filename, void *data); void *data; }; #define Xdvi_NEW_WINDOW_RADIO_NAME "new_window_radio" extern void SFpositionWidget(Widget w); extern FILE *SFopenFile(const char *name, const char *mode, const char *prompt, const char *failed); extern void SFtextChanged(void); extern Widget XsraSelFile(Widget parent, struct filesel_callback *callback); extern void XsraSelFilePopup(struct filesel_callback *callback); void raise_file_selector(void); #endif /* SF_SEL_FILE_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/statusline.h0000664000175000017500000000414511032450154021312 0ustar uwabamiuwabami#ifndef STATUSLINE_H_ #define STATUSLINE_H_ /* * Copyright (c) 2001-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #define STAT_BUF_LEN 512 /* statusline stuff. The following function and #defines are also * needed when compiling without statusline support. */ typedef enum statusTimerT_ { STATUS_FOREVER = 0, STATUS_VERYSHORT = 1, STATUS_SHORT = 5, STATUS_MEDIUM = 10, STATUS_LONG = 30 } statusTimerT; extern int get_statusline_height(void); extern void statusline_clear(void); extern void statusline_erase(const char *pattern); extern void statusline_info(statusTimerT timeout, const char *fmt, ...); extern void statusline_error(statusTimerT timeout, const char *fmt, ...); extern void statusline_append(statusTimerT timeout, const char *pattern, const char *fmt, ...); #ifdef MOTIF extern Widget create_statusline(Widget parent); #else extern Widget create_statusline(void); #endif extern void handle_statusline_resize(void); extern void force_statusline_update(void); extern void toggle_statusline(void); #endif /* STATUSLINE_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xicon.h0000664000175000017500000000237110363262237020247 0ustar uwabamiuwabami/* * Copyright (c) 2001 Marcin Dalecki * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef XICON_H_ #define XICON_H_ extern void add_icon(Widget toplevel, String title_name, String icon_name); #endif /* XICON_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/menu.h0000664000175000017500000000440110363262237020067 0ustar uwabamiuwabami/* * Copyright (c) 2003-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Common code for Xaw and Motif menu bar creation. */ #ifndef MENU_H_ #define MENU_H_ #include "xdvi-config.h" #include "events.h" #include "xdvi.h" typedef enum { BT_INVALID = -1, /* error code */ BT_NONE = 0, BT_PUSH, /* pushbutton */ BT_RADIO, /* radio button (1 of n) */ BT_CHECK, /* check button (m of n) */ BT_SEP /* separator */ } buttonTypeT; /* structures for menu data */ struct button_elems { char *title; /* menu item label string */ buttonTypeT type; /* button type */ char mnemonic; /* 0 if none */ char *accelerator; /* NULL if none */ struct button_info *submenu;/* submenu, or NULL */ Widget widget; /* the widget in this item, for later use, or 0 */ struct xdvi_action *action; /* translated action, for later use, or NULL */ }; struct button_info { size_t size; struct button_elems *elems; }; #include "xm_menu.h" #include "xaw_menu.h" extern void create_menu_buttons(Widget parent, #ifdef MOTIF Widget *child #else int *ret_panel_width #endif ); extern void set_menu(void *val, XtActionProc proc, Boolean (*cmp)()); #endif /* MENU_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/TipP.h0000664000175000017500000000576610363262237020016 0ustar uwabamiuwabami/* * Copyright (c) 2001-2004 Marcin Dalecki and others * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef TIPP_h #define TIPP_h #include #include "Tip.h" /* Doubly Linked List Processing. */ struct list_thread_str { struct list_thread_str *forw; struct list_thread_str *back; }; typedef struct list_thread_str ListThread; typedef struct { int __empty; } TipClassPart; /* Full class record declaration. */ typedef struct _TipClassRec { CoreClassPart core_class; CompositeClassPart composite_class; ShellClassPart shell_class; OverrideShellClassPart override_shell_class; TipClassPart tip_class; } TipClassRec; extern TipClassRec xmTipClassRec; /* New fields for the widget record. */ typedef struct { /* resources */ Pixel foreground; XFontSet fontset; /* the font for text in box */ int waitPeriod; /* the delay resource - pointer must be in watched widget this long before tooltip is displayed - in milliseconds */ int cancelWaitPeriod; /* after help is popped-down - normal wait period is cancelled for this period - in milliseconds */ /* -------- private state --------- */ ListThread widget_list; /* list of widgets we are liteClue-ing */ Dimension font_width; /* width of '1' character */ Dimension font_height; /* height of font, rows are spaced using this */ Dimension font_baseline; /* relative displacement to baseline from top */ GC text_GC; /* for drawing text */ XtIntervalId tid; /* holds timer id */ XtIntervalId pid; /* holds pooler id for insensitive widgets */ Widget parent; Widget isup; /* the help popup is up on this widget */ Time HelpPopDownTime; /* the time at which help popup was popped down */ } TipPart; /* * Full instance record declaration */ typedef struct _TipRec { CorePart core; CompositePart composite; ShellPart shell; OverrideShellPart override; TipPart tip; } TipRec; #endif xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xlwradioP.h0000664000175000017500000000675710363262237021114 0ustar uwabamiuwabami/* adapted from xlwradio.c in the XEmacs distribution. Changes are Copyright (C) 2002-2004 the xdvik development team Original copyright follows: */ /* Radio Widget for XEmacs. Copyright (C) 1999 Edward A. Falk This file is part of XEmacs. XEmacs is free software; you can 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. XEmacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with XEmacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* * RadioP.h - Private definitions for Radio widget * * Author: Edward A. Falk * falk@falconer.vip.best.com * * Date: June 30, 1997 * */ #ifndef _XawRadioP_h #define _XawRadioP_h #include "xdvi-config.h" #include "xlwradio.h" #ifndef MOTIF #include #include #include #include #include #include #include #include /*********************************************************************** * * Radio Widget Private Data * ***********************************************************************/ typedef void (*XawDiamondProc) (Widget); void RadioSet (Widget w, XEvent *event, String *params, /* unused */ Cardinal *num_params); /* unused */ void RadioUnset (Widget w, XEvent *event, String *params, /* unused */ Cardinal *num_params); /* unused */ /************************************ * * Class structure * ***********************************/ /* New fields for the Radio widget class record */ typedef struct _RadioClass { Dimension dsize; /* diamond size */ XawDiamondProc drawDiamond; /* pixmaps for the button */ Pixmap sel_radio; /* selected state */ Pixmap unsel_radio; /* unselected state */ Pixmap sel_menu; /* selected state */ Pixmap unsel_menu; /* unselected state */ /* TODO: 3-d and xaw-xpm features? */ XtPointer extension; } RadioClassPart; #define XtInheritDrawDiamond ((XawDiamondProc)_XtInherit) /* Full class record declaration */ typedef struct _RadioClassRec { CoreClassPart core_class; SimpleClassPart simple_class; #ifdef _ThreeDP_h ThreeDClassPart threeD_class; #endif LabelClassPart label_class; CommandClassPart command_class; ToggleClassPart toggle_class; RadioClassPart radio_class; } RadioClassRec; extern RadioClassRec radioClassRec; /*************************************** * * Instance (widget) structure * **************************************/ /* New fields for the Radio widget record */ typedef struct { /* resources */ Boolean isRadio; /* radio if True, checkbox else */ /* TODO: 3-d and xaw-xpm features? */ /* private data */ XtPointer extension; } RadioPart; /* Full widget declaration */ typedef struct _RadioRec { CorePart core; SimplePart simple; #ifdef _ThreeDP_h ThreeDPart threeD; #endif LabelPart label; CommandPart command; TogglePart toggle; RadioPart radio; } RadioRec; #endif /* MOTIF */ #endif /* _XawRadioP_h */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xlwradio.c0000664000175000017500000004405411276240141020751 0ustar uwabamiuwabami/* adapted from xlwradio.c in the XEmacs distribution. Changes are Copyright (C) 2002-2004 the xdvik development team. Note SU: This widget doesn't work with Xaw3d, and I have little inclination to make it work - the design would need to be utterly different, e.g. the radio would need to be a diamond instead of a circle, since 3d-shadowed circles don't look circular; colormap issues would need to be settled, etc. And besides, I don't like Xaw3d ;) So instead, the caller should just do: myWidget = XtVaCreateManagedWidget("foo", #ifdef XAW radioWidgetClass, #else toggleWidgetClass, #endif ... arglist ...); Feel free to submit patches if you want this implemented. Original copyright follows: */ /* Radio Widget for XEmacs. Copyright (C) 1999 Edward A. Falk This file is part of XEmacs. XEmacs is free software; you can 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. XEmacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with XEmacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Synched up with: Radio.c 1.1 */ /* * Radio.c - Radio button widget * * Author: Edward A. Falk * falk@falconer.vip.best.com * * Date: June 30, 1997 * * * Overview: This widget is identical to the Toggle widget in behavior, * but completely different in appearance. This widget looks like a small * diamond-shaped button with a label to the right. * * To make this work, we subclass the Toggle widget to inherit its behavior * and to inherit the label-drawing function from which Toggle is * subclassed. We then completely replace the Expose, Set, Unset * and Highlight member functions. * * The Set and Unset actions are slightly unorthodox. In Toggle's * ClassInit function, Toggle searches the Command actions list and * "steals" the Set and Unset functions, caching pointers to them in its * class record. It then calls these functions from its own ToggleSet * and Toggle actions. * * We, in turn, override the Set() and Unset() actions in our own ClassRec. */ #include "xdvi-config.h" #include "xdvi.h" #include "xdvi-debug.h" #include "util.h" #include "xaw_bitmaps.h" /* bitmaps for radio/checkbuttons */ #include "xlwradioP.h" #ifndef MOTIF /* entire file */ #include #include #include #include #include #include #include #include /* #include "../src/xmu.h" */ #define BOX_SIZE 16 #define PIXMAP_OFFSET 2 /* additional space between pixmap and label */ #ifndef UNUSED # define UNUSED(x) ((void)(x)) #endif #ifndef MAX # define MAX(i, j) ( (i) > (j) ? (i) : (j) ) #endif #define rclass(w) ((RadioWidgetClass)((w)->core.widget_class)) #ifdef _ThreeDP_h #define swid(rw) ((rw)->threeD.shadow_width) #else #define swid(rw) ((rw)->core.border_width) #endif #define bsize(rw) (rclass(rw)->radio_class.dsize) #define bs(rw) (bsize(rw) + PIXMAP_OFFSET + 2*swid(rw)) /**************************************************************** * * Full class record constant * ****************************************************************/ /* The translations table from Toggle do not need to be * overridden by Radio */ /* Member functions */ static void RadioInit (Widget, Widget, ArgList, Cardinal *); static void RadioExpose (Widget, XEvent *, Region); static void RadioResize (Widget); static void RadioDestroy (Widget); static void RadioClassInit (void); static void RadioClassPartInit (WidgetClass); static Boolean RadioSetValues (Widget, Widget, Widget, ArgList, Cardinal *); static void DrawDiamond (Widget); static XtGeometryResult RadioQueryGeometry (Widget, XtWidgetGeometry *, XtWidgetGeometry *); /* Action procs */ static void RadioHighlight (Widget, XEvent *, String *, Cardinal *); static void RadioUnhighlight (Widget, XEvent *, String *, Cardinal *); /* internal privates */ static void RadioSize (RadioWidget, Dimension *, Dimension *); /* The actions table from Toggle is almost perfect, but we need * to override Highlight, Set, and Unset. */ static XtActionsRec actionsList[] = { {"highlight", RadioHighlight}, {"unhighlight", RadioUnhighlight}, }; #define offset(field) XtOffset(RadioWidget, radio.field) static XtResource resources[] = { {XtNisRadio, XtCIsRadio, XtRBoolean, sizeof(Boolean), offset(isRadio), XtRImmediate, (XtPointer)(ptrdiff_t)True }, }; #undef offset #define SuperClass ((ToggleWidgetClass)&toggleClassRec) RadioClassRec radioClassRec = { { (WidgetClass) SuperClass, /* superclass */ "Radio", /* class_name */ sizeof(RadioRec), /* size */ RadioClassInit, /* class_initialize */ RadioClassPartInit, /* class_part_initialize */ FALSE, /* class_inited */ RadioInit, /* initialize */ NULL, /* initialize_hook */ XtInheritRealize, /* realize */ actionsList, /* actions */ XtNumber(actionsList), /* num_actions */ resources, /* resources */ XtNumber(resources), /* resource_count */ NULLQUARK, /* xrm_class */ TRUE, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ FALSE, /* visible_interest */ RadioDestroy, /* destroy */ RadioResize, /* resize */ RadioExpose, /* expose */ RadioSetValues, /* set_values */ NULL, /* set_values_hook */ XtInheritSetValuesAlmost, /* set_values_almost */ NULL, /* get_values_hook */ NULL, /* accept_focus */ XtVersion, /* version */ NULL, /* callback_private */ XtInheritTranslations, /* tm_table */ RadioQueryGeometry, /* query_geometry */ XtInheritDisplayAccelerator, /* display_accelerator */ NULL /* extension */ }, /* CoreClass fields initialization */ { XtInheritChangeSensitive /* change_sensitive */ #ifndef HAVE_OLD_XAW , NULL #endif }, /* SimpleClass fields initialization */ #ifdef _ThreeDP_h { XtInheritXaw3dShadowDraw /* field not used */ }, /* ThreeDClass fields initialization */ #endif { 0 /* field not used */ }, /* LabelClass fields initialization */ { 0 /* field not used */ }, /* CommandClass fields initialization */ { RadioSet, /* Set Procedure. */ RadioUnset, /* Unset Procedure. */ NULL /* extension. */ }, /* ToggleClass fields initialization */ { BOX_SIZE, DrawDiamond, /* draw procedure */ None, /* selected radiobutton */ None, /* unselected radiobutton */ None, /* selected menubutton */ None, /* unselected menubutton */ NULL /* extension. */ } /* RadioClass fields initialization */ }; /* for public consumption */ WidgetClass radioWidgetClass = (WidgetClass) &radioClassRec; /**************************************************************** * * Class Methods * ****************************************************************/ static void RadioClassInit (void) { XawInitializeWidgetSet(); } static void RadioClassPartInit (WidgetClass class) { RadioWidgetClass c = (RadioWidgetClass) class; RadioWidgetClass super = (RadioWidgetClass)c->core_class.superclass; if( c->radio_class.drawDiamond == NULL || c->radio_class.drawDiamond == XtInheritDrawDiamond ) { c->radio_class.drawDiamond = super->radio_class.drawDiamond; } } static void RadioInit (Widget request, Widget new, ArgList args, Cardinal *num_args) { RadioWidget rw = (RadioWidget) new; RadioWidget rw_req = (RadioWidget) request; Dimension w,h; UNUSED(args); UNUSED(num_args); /* FIXME: should pixmap initialization be here?? */ /* Select initial size for the widget */ if( rw_req->core.width == 0 || rw_req->core.height == 0 ) { RadioSize(rw, &w,&h); if( rw_req->core.width == 0 ) rw->core.width = w; if( rw_req->core.height == 0 ) rw->core.height = h; rw->core.widget_class->core_class.resize(new); } /* FIXME: access to XtWindow(rw) fails in the init method, so I moved the bitmap creation here -- is there a better way?? */ /* create pixmaps */ rclass(rw)->radio_class.sel_radio = XCreateBitmapFromData(XtDisplay(rw), RootWindowOfScreen(XtScreen(rw)), (char *)button_radio_on_bits, BUTTON_BITMAP_W, BUTTON_BITMAP_H); rclass(rw)->radio_class.unsel_radio = XCreateBitmapFromData(XtDisplay(rw), RootWindowOfScreen(XtScreen(rw)), (char *)button_radio_off_bits, BUTTON_BITMAP_W, BUTTON_BITMAP_H); rclass(rw)->radio_class.sel_menu = XCreateBitmapFromData(XtDisplay(rw), RootWindowOfScreen(XtScreen(rw)), (char *)button_check_on_bits, BUTTON_BITMAP_W, BUTTON_BITMAP_H); rclass(rw)->radio_class.unsel_menu = XCreateBitmapFromData(XtDisplay(rw), RootWindowOfScreen(XtScreen(rw)), (char *)button_check_off_bits, BUTTON_BITMAP_W, BUTTON_BITMAP_H); } /* Function Name: RadioDestroy * Description: Destroy Callback for radio widget. * Arguments: w - the radio widget that is being destroyed. * Returns: none. */ static void RadioDestroy (Widget w) { RadioWidget rw = (RadioWidget)w; /* de-allocate bitmaps */ XFreePixmap(XtDisplay(w), rclass(rw)->radio_class.sel_radio); XFreePixmap(XtDisplay(w), rclass(rw)->radio_class.unsel_radio); XFreePixmap(XtDisplay(w), rclass(rw)->radio_class.sel_menu); XFreePixmap(XtDisplay(w), rclass(rw)->radio_class.unsel_menu); } /* React to size change from manager. Label widget will compute some internal * stuff, but we need to override. This code requires knowledge of the * internals of the Label widget. */ static void RadioResize (Widget w) { RadioWidget rw = (RadioWidget)w; /* call parent resize proc */ SuperClass->core_class.resize(w); /* override label offset */ switch( rw->label.justify ) { case XtJustifyLeft: rw->label.label_x += (bs(rw) + rw->label.internal_width); break; case XtJustifyRight: break; case XtJustifyCenter: default: rw->label.label_x += (bs(rw) + rw->label.internal_width)/2; break; } } /* * Repaint the widget window. */ static void RadioExpose (Widget w, XEvent *event, Region region) { RadioWidget rw = (RadioWidget) w; Display *dpy = XtDisplay(w); Window win = XtWindow(w); GC gc; Pixmap left_bitmap; extern WidgetClass labelWidgetClass; /* Note: the Label widget examines the region to decide if anything * needs to be drawn. I'm not sure that this is worth the effort, * but it bears thinking on. */ /* Command widget may sometimes override the label GC in order * to draw inverse video. We don't use inverse video, so we need * to restore the label's normal GC. */ rw->label.normal_GC = rw->command.normal_GC; /* Let label widget draw the label. If there was an lbm_x * field, we could let Label draw the bitmap too. But there * isn't, so we need to temporarily remove the bitmap and * draw it ourself later. */ left_bitmap = rw->label.left_bitmap; rw->label.left_bitmap = None; labelWidgetClass->core_class.expose(w,event,region); rw->label.left_bitmap = left_bitmap; /* now manually draw the left bitmap. TODO: 3-d look, xaw-xpm */ gc = XtIsSensitive(w) ? rw->label.normal_GC : rw->label.gray_GC; if( left_bitmap != None && rw->label.lbm_width > 0 ) { /* TODO: handle pixmaps */ XCopyPlane(dpy, left_bitmap, win, gc, 0,0, rw->label.lbm_width, rw->label.lbm_height, (int) rw->label.internal_width*2 + bs(rw), (int) rw->label.internal_height + rw->label.lbm_y, 1UL); } DrawDiamond(w); /* Finally, the button itself */ ((RadioWidgetClass)(w->core.widget_class))->radio_class.drawDiamond(w); } /************************************************************ * * Set specified arguments into widget * ***********************************************************/ /* ARGSUSED */ static Boolean RadioSetValues (Widget current, Widget request, Widget new, ArgList args, Cardinal *num_args) { RadioWidget oldrw = (RadioWidget) current; RadioWidget newrw = (RadioWidget) new; UNUSED(request); UNUSED(args); UNUSED(num_args); /* Need to find out if the size of the widget changed. Set new size * if it did and resize is permitted. One way to determine of the * widget changed size would be to scan the args list. Another way * is to compare the old and new widgets and see if any of several * size-related fields have been changed. The Label widget chose the * former method, but I choose the latter. */ if( newrw->label.resize && ( newrw->core.width != oldrw->core.width || newrw->core.height != oldrw->core.height || newrw->core.border_width != oldrw->core.border_width ) ) { RadioSize(newrw, &newrw->core.width, &newrw->core.height); } /* The label set values routine can resize the widget. We need to * recalculate if this is true. */ if (newrw->label.label_x != oldrw->label.label_x) { RadioResize (new); } return FALSE; } static XtGeometryResult RadioQueryGeometry (Widget w, XtWidgetGeometry *intended, XtWidgetGeometry *preferred) { RadioWidget rw = (RadioWidget) w; preferred->request_mode = CWWidth | CWHeight; RadioSize(rw, &preferred->width, &preferred->height); if ( ((intended->request_mode & (CWWidth | CWHeight)) == (CWWidth | CWHeight)) && intended->width == preferred->width && intended->height == preferred->height) return XtGeometryYes; else if (preferred->width == w->core.width && preferred->height == w->core.height) return XtGeometryNo; else return XtGeometryAlmost; } /************************************************************ * * Action Procedures * ************************************************************/ /* * Draw the highlight border around the widget. The Command widget * did this by drawing through a mask. We do it by just drawing the * border. */ static void DrawHighlight (Widget w, GC gc) { RadioWidget rw = (RadioWidget)w; XRectangle rects[4]; Dimension ht = rw->command.highlight_thickness; if( ht <= 0 || ht > rw->core.width/2 || ht > rw->core.height/2 ) return; if( ! XtIsRealized(w) ) return; rects[0].x = 0; rects[0].y = 0; rects[0].width = rw->core.width; rects[0].height = ht; rects[1].x = 0; rects[1].y = rw->core.height - ht; rects[1].width = rw->core.width; rects[1].height = ht; rects[2].x = 0; rects[2].y = ht; rects[2].width = ht; rects[2].height = rw->core.height - ht*2; rects[3].x = rw->core.width - ht; rects[3].y = ht; rects[3].width = ht; rects[3].height = rw->core.height - ht*2; XFillRectangles( XtDisplay(w), XtWindow(w), gc, rects, 4); } static void RadioHighlight (Widget w, XEvent *event, String *params, Cardinal *num_params) { RadioWidget rw = (RadioWidget)w; UNUSED(event); UNUSED(params); UNUSED(num_params); DrawHighlight(w, rw->command.normal_GC); } static void RadioUnhighlight (Widget w, XEvent *event, String *params, Cardinal *num_params) { RadioWidget rw = (RadioWidget)w; UNUSED(event); UNUSED(params); UNUSED(num_params); DrawHighlight(w, rw->command.inverse_GC); } void RadioSet (Widget w, XEvent *event, String *params, Cardinal *num_params) { RadioWidget rw = (RadioWidget)w; RadioWidgetClass class = (RadioWidgetClass) w->core.widget_class; UNUSED(event); UNUSED(params); UNUSED(num_params); if( rw->command.set ) return; rw->command.set = TRUE; if( XtIsRealized(w) ) class->radio_class.drawDiamond(w); } void RadioUnset (Widget w, XEvent *event, String *params, Cardinal *num_params) { RadioWidget rw = (RadioWidget)w; RadioWidgetClass class = (RadioWidgetClass) w->core.widget_class; UNUSED(event); UNUSED(params); UNUSED(num_params); if( ! rw->command.set ) return; rw->command.set = FALSE; if( XtIsRealized(w) ) class->radio_class.drawDiamond(w); } /************************************************************ * * Internal Procedures * ************************************************************/ /* Size of widget. Width is size of box plus width of border around * box plus width of label plus three margins plus the size of the left * bitmap, if any. Height is max(box,bitmap,label) plus two margins. */ static void RadioSize (RadioWidget rw, Dimension *w, Dimension *h) { *w = rw->label.label_width + bs(rw) + LEFT_OFFSET(rw) + 3 * rw->label.internal_width; *h = MAX( rw->label.label_height, bs(rw) ) + 2 * rw->label.internal_width; } static void DrawDiamond(Widget w) { RadioWidget rw = (RadioWidget) w; Display *dpy = XtDisplay(w); Window win = XtWindow(w); Position x = rw->label.internal_width; Position y = rw->core.height/2; GC gc = XtIsSensitive(w) ? rw->command.normal_GC : rw->label.gray_GC; Pixmap selected, unselected; if (rw->radio.isRadio) { /* it's a radio button */ selected = rclass(rw)->radio_class.sel_radio; unselected = rclass(rw)->radio_class.unsel_radio; } else { selected = rclass(rw)->radio_class.sel_menu; unselected = rclass(rw)->radio_class.unsel_menu; } ASSERT(selected != None, ""); ASSERT(unselected != None, ""); if(rw->command.set) { XCopyPlane(dpy, selected, win, gc, 0, 0, BUTTON_BITMAP_H, BUTTON_BITMAP_W, x, y - BUTTON_BITMAP_H / 2, 1L); } else { XCopyPlane(dpy, unselected, win, gc, 0, 0, BUTTON_BITMAP_H, BUTTON_BITMAP_W, x, y - BUTTON_BITMAP_H / 2, 1L); } } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_menu.c0000664000175000017500000002404711276240141020570 0ustar uwabamiuwabami/* * Copyright (c) 2001 Marcin Dalecki and others * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * */ #include "xdvi-config.h" #include "xdvi.h" #include "xm_menu.h" #include "xm_toolbar.h" #include "my-snprintf.h" #include "util.h" #include "x_util.h" #include "version.h" #include "statusline.h" #include "pagehist.h" #include "dvi-init.h" #include "filehist.h" #include "c-openmx.h" #include "message-window.h" #ifdef MOTIF /* needed for `make depend' */ #include #include #include #include #include #include #include #include #include /* * There's an apparent bug in Motif related to the interaction between * the menubar menus and the magnifier. * * If you click on a menu on the menubar and then click on the drawing * widget to pop up a magnifier, the keyboard and pointer are still * grabbed, leading to a weird situation in which the magnifier stays * around even after you release the pointer. The ungrab_serial * counter works around this bug by ignoring such pointer events. * * This bug occurs in Motif 1.2 and OpenMotif 2.2.2 (at least). It * does not occur in Lesstif. */ static unsigned long ungrab_event_num = 0; void popdown_callback(Widget w, XtPointer client_data, XtPointer call_data) { UNUSED(w); UNUSED(client_data); /* Lesstif gives call_data == NULL */ if (call_data != NULL && *((XtGrabKind *) call_data) != XtGrabNone) { ungrab_event_num = LastKnownRequestProcessed(DISP); } } Boolean pulldown_menu_active(unsigned long event_num) { return event_num < ungrab_event_num; } void toggle_menubar(void) { if ((resource.expert_mode & XPRT_SHOW_MENUBAR) == 0) XtUnmanageChild(globals.widgets.menu_bar); else XtManageChild(globals.widgets.menu_bar); } static void update_menu_labels(Widget menu) { WidgetList children; int num_children; int i; static char *buf = NULL; static size_t buf_len = 0; XtVaGetValues(menu, XmNnumChildren, &num_children, XmNchildren, &children, NULL); /* for (i = 0; i < num_children; i++) { */ for (i = 0; i < (int)file_history_size(); i++) { int dummy_page; char *filename; size_t new_len; XmString str; if ((filename = file_history_get_elem(i, &dummy_page)) == NULL) { XDVI_ERROR((stderr, "Error accessing element %d of file history", i)); continue; } new_len = LENGTH_OF_INT + strlen(filename) + 1; if (new_len > buf_len) { buf = xrealloc(buf, new_len); buf_len = new_len; } sprintf(buf, "%d %s", i + 1, filename); str = XmStringCreateLocalized(buf); XtVaSetValues(children[i], XmNlabelString, str, NULL); if (i + 1 < 10) { XtVaSetValues(children[i], XmNmnemonic, buf[0], NULL); } XmStringFree(str); } /* if history size < number of menu entries, destroy excess menu entries */ for (; i < num_children; i++) { XtDestroyWidget(children[i]); } } static void filehist_select_cb(Widget w, XtPointer client_data, XtPointer call_data) { Widget menu; XmString label; char *label_ptr; int pageno; char *fname; int idx; /* UNUSED(w); */ UNUSED(call_data); UNUSED(client_data); XtVaGetValues(w, XmNuserData, &menu, XmNlabelString, &label, NULL); XmStringGetLtoR(label, G_charset, &label_ptr); idx = strtol(label_ptr, (char **)NULL, 10) - 1; XtFree(label_ptr); ASSERT(menu != NULL, "XmNuserData in filehist_select_cb musn't be NULL!"); if (idx == 0) { /* user re-selected current file: reload */ globals.ev.flags |= EV_RELOAD; return; } if ((fname = file_history_get_elem(idx, &pageno)) == NULL) { statusline_error(STATUS_MEDIUM, "Error accessing file %d of history", idx); return; } file_history_open(fname); } void filehist_menu_refresh(void) { Widget menu; if (get_widget_by_name(&menu, globals.widgets.menu_bar, Xdvi_FILEHIST_MENU, True)) { update_menu_labels(menu); } } void filehist_menu_add_entry(const char *filename) { Widget menu; static char *buf = NULL; static size_t buf_len = 0; size_t new_len = LENGTH_OF_INT + strlen(filename) + 1; if (get_widget_by_name(&menu, globals.widgets.menu_bar, Xdvi_FILEHIST_MENU, True)) { int num_children; Widget w; if (new_len > buf_len) { buf = xrealloc(buf, new_len); buf_len = new_len; } XtVaGetValues(menu, XmNnumChildren, &num_children, NULL); sprintf(buf, "%d %s", num_children + 1, filename); w = XtVaCreateManagedWidget(buf, xmPushButtonGadgetClass, menu, XmNuserData, menu, NULL); if (num_children + 1 < 10) { XtVaSetValues(w, XmNmnemonic, buf[0], NULL); } XtAddCallback(w, XmNactivateCallback, filehist_select_cb, cast_int_to_XtPointer(num_children + 1)); update_menu_labels(menu); } } static void filehist_submenu(int idx, const char *filename, int pageno, void *data) { Widget menu = (Widget)data; Widget w; static char *buf = NULL; static size_t buf_len = 0; size_t new_len = LENGTH_OF_INT + strlen(filename) + 1; if (new_len > buf_len) { buf = xrealloc(buf, new_len); buf_len = new_len; } UNUSED(pageno); sprintf(buf, "%d %s", idx + 1, filename); TRACE_GUI((stderr, "Creating menu `%s'", buf)); w = XtVaCreateManagedWidget(buf, xmPushButtonGadgetClass, menu, /* XmNmnemonic, buf[0], */ XmNuserData, menu, NULL); if (idx + 1 < 10) { XtVaSetValues(w, XmNmnemonic, buf[0], NULL); } XtAddCallback(w, XmNactivateCallback, filehist_select_cb, cast_int_to_XtPointer(idx)); } static Widget recent_files_submenu(Widget parent, char *title, char mnemonic) { Widget menu = 0, cascade = 0; XmString str; menu = XmCreatePulldownMenu(parent, Xdvi_FILEHIST_MENU, NULL, 0); str = XmStringCreateLocalized(title); cascade = XtVaCreateManagedWidget(title, xmCascadeButtonGadgetClass, parent, XmNsubMenuId, menu, XmNlabelString, str, XmNmnemonic, mnemonic, NULL); XmStringFree(str); file_history_enumerate(filehist_submenu, menu); return cascade; } Widget xm_create_menu(Widget parent, char *title, char mnemonic, struct button_info *item) { Widget menu = 0, cascade = 0, w = 0; size_t i; XmString str; menu = XmCreatePulldownMenu(parent, "_pulldown", NULL, 0); str = XmStringCreateLocalized(title); cascade = XtVaCreateManagedWidget(title, xmCascadeButtonGadgetClass, parent, XmNsubMenuId, menu, XmNlabelString, str, XmNmnemonic, mnemonic, NULL); XmStringFree(str); /* add the menu items */ for (i = 0; item != NULL && i < item->size; i++) { item->elems[i].widget = 0; /* if there's a subitem, call this function recursively */ if (item->elems[i].submenu != NULL) { w = xm_create_menu(menu, item->elems[i].title, item->elems[i].mnemonic, item->elems[i].submenu); /* workaround for pointer grabbing bug; add additional callback to all menus (they have the same parent) */ XtAddCallback(XtParent(menu), XtNpopdownCallback, popdown_callback, (XtPointer) 0); } else if (item->elems[i].action != NULL && item->elems[i].action->proc == Act_recent_files) { /* special case: submenu with recent files */ w = recent_files_submenu(menu, item->elems[i].title, item->elems[i].mnemonic); XtAddCallback(XtParent(menu), XtNpopdownCallback, popdown_callback, (XtPointer) 0); } else { switch(item->elems[i].type) { case BT_PUSH: w = XtVaCreateManagedWidget(item->elems[i].title, xmPushButtonGadgetClass, menu, NULL); break; case BT_RADIO: w = XtVaCreateManagedWidget(item->elems[i].title, xmToggleButtonGadgetClass, menu, XmNindicatorType, XmONE_OF_MANY, NULL); break; case BT_CHECK: w = XtVaCreateManagedWidget(item->elems[i].title, xmToggleButtonGadgetClass, menu, XmNindicatorType, XmN_OF_MANY, NULL); break; case BT_SEP: w = XtVaCreateManagedWidget(item->elems[i].title, xmSeparatorGadgetClass, menu, NULL); break; default: XDVI_WARNING((stderr, "unrecognized button type %d in menu %s (skipping this item).\n", item->elems[i].type, item->elems[i].title)); break; } item->elems[i].widget = w; } if (item->elems[i].mnemonic != 0) XtVaSetValues(w, XmNmnemonic, item->elems[i].mnemonic, NULL); if (item->elems[i].accelerator != NULL) { str = XmStringCreateLocalized(item->elems[i].accelerator); XtVaSetValues(w, XmNacceleratorText, str, NULL); XmStringFree(str); } if (item->elems[i].action != NULL) { String cb_type; if (XmIsToggleButton(w) || XmIsToggleButtonGadget(w)) cb_type = XmNvalueChangedCallback; else cb_type = XmNactivateCallback; XtAddCallback(w, cb_type, handle_command, item->elems[i].action); } } return cascade; } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/Panner.c0000664000175000017500000011230311032450154020331 0ustar uwabamiuwabami/* * $XConsortium: Panner.c,v 1.52 95/01/10 14:31:26 kaleb Exp $ * Copyright (c) 1989, 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 CONNECTION 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 dealings in this Software without prior written authorization from the X Consortium. * * Author: Jim Fulton, MIT X Consortium */ #include "xdvi-config.h" #include "xdvi.h" #include "string-utils.h" #if defined(MOTIF) && defined(USE_PANNER) && USE_XAW_PANNER /* entire file */ #if defined(__GNUC__) && DEVEL_MODE #warning COMPILING Panner_c #endif #include #include /* for XtN and XtC defines */ #include /* for XmuCompareISOLatin1() */ #include "PannerP.h" /* us */ #include #include /* for Min */ #include #include /* for isascii() etc. */ extern Bool XmuDistinguishablePixels(); /* not defined in any Xmu headers */ /* ====================================================================== begin copy from Simple.c ====================================================================== */ #define offset(field) XtOffsetOf(SimpleRec, simple.field) static XtResource resources[] = { {XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor), offset(cursor), XtRImmediate, (XtPointer) None}, {XtNinsensitiveBorder, XtCInsensitive, XtRPixmap, sizeof(Pixmap), offset(insensitive_border), XtRImmediate, (XtPointer) NULL}, {XtNpointerColor, XtCForeground, XtRPixel, sizeof(Pixel), offset(pointer_fg), XtRString, XtDefaultForeground}, {XtNpointerColorBackground, XtCBackground, XtRPixel, sizeof(Pixel), offset(pointer_bg), XtRString, XtDefaultBackground}, {XtNcursorName, XtCCursor, XtRString, sizeof(String), offset(cursor_name), XtRString, NULL}, {XtNinternational, XtCInternational, XtRBoolean, sizeof(Boolean), offset(international), XtRImmediate, (XtPointer) FALSE}, #undef offset }; static void ClassPartInitialize(), ClassInitialize(),Realize(),ConvertCursor(); static Bool SetValues(Widget current, Widget request, Widget new, ArgList args, Cardinal *num_args); static Bool ChangeSensitive(Widget w); SimpleClassRec simpleClassRec = { { /* core fields */ /* superclass */ (WidgetClass) &widgetClassRec, /* class_name */ "Simple", /* widget_size */ sizeof(SimpleRec), /* class_initialize */ ClassInitialize, /* class_part_initialize */ ClassPartInitialize, /* class_inited */ FALSE, /* initialize */ NULL, /* initialize_hook */ NULL, /* realize */ Realize, /* actions */ NULL, /* num_actions */ 0, /* resources */ resources, /* num_resources */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ TRUE, /* visible_interest */ FALSE, /* destroy */ NULL, /* resize */ NULL, /* expose */ NULL, #warning FIXME: incompatible pointer type /* set_values */ SetValues, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* version */ XtVersion, /* callback_private */ NULL, /* tm_table */ NULL, /* query_geometry */ XtInheritQueryGeometry, /* display_accelerator */ XtInheritDisplayAccelerator, /* extension */ NULL }, { /* simple fields */ /* change_sensitive */ ChangeSensitive #ifndef HAVE_OLD_XAW , NULL #endif } }; WidgetClass simpleWidgetClass = (WidgetClass)&simpleClassRec; static void ClassInitialize() { static XtConvertArgRec convertArg[] = { {XtWidgetBaseOffset, (XtPointer) XtOffsetOf(WidgetRec, core.screen), sizeof(Screen *)}, {XtResourceString, (XtPointer) XtNpointerColor, sizeof(Pixel)}, {XtResourceString, (XtPointer) XtNpointerColorBackground, sizeof(Pixel)}, {XtWidgetBaseOffset, (XtPointer) XtOffsetOf(WidgetRec, core.colormap), sizeof(Colormap)} }; XawInitializeWidgetSet(); XtSetTypeConverter( XtRString, XtRColorCursor, XmuCvtStringToColorCursor, convertArg, XtNumber(convertArg), XtCacheByDisplay, (XtDestructor)NULL); } static void ClassPartInitialize(class) WidgetClass class; { SimpleWidgetClass c = (SimpleWidgetClass) class; SimpleWidgetClass super = (SimpleWidgetClass) c->core_class.superclass; if (c->simple_class.change_sensitive == NULL) { char buf[BUFSIZ]; (void) sprintf(buf, "%s Widget: The Simple Widget class method 'change_sensitive' is undefined.\nA function must be defined or inherited.", c->core_class.class_name); XtWarning(buf); c->simple_class.change_sensitive = ChangeSensitive; } if (c->simple_class.change_sensitive == XtInheritChangeSensitive) c->simple_class.change_sensitive = super->simple_class.change_sensitive; } static void Realize(w, valueMask, attributes) Widget w; Mask *valueMask; XSetWindowAttributes *attributes; { Pixmap border_pixmap = 0; if (!XtIsSensitive(w)) { /* change border to gray; have to remember the old one, * so XtDestroyWidget deletes the proper one */ if (((SimpleWidget)w)->simple.insensitive_border == None) ((SimpleWidget)w)->simple.insensitive_border = XmuCreateStippledPixmap(XtScreen(w), w->core.border_pixel, w->core.background_pixel, w->core.depth); border_pixmap = w->core.border_pixmap; attributes->border_pixmap = w->core.border_pixmap = ((SimpleWidget)w)->simple.insensitive_border; *valueMask |= CWBorderPixmap; *valueMask &= ~CWBorderPixel; } ConvertCursor(w); if ((attributes->cursor = ((SimpleWidget)w)->simple.cursor) != None) *valueMask |= CWCursor; XtCreateWindow( w, (unsigned int)InputOutput, (Visual *)CopyFromParent, *valueMask, attributes ); if (!XtIsSensitive(w)) w->core.border_pixmap = border_pixmap; } /* Function Name: ConvertCursor * Description: Converts a name to a new cursor. * Arguments: w - the simple widget. * Returns: none. */ static void ConvertCursor(w) Widget w; { SimpleWidget simple = (SimpleWidget) w; XrmValue from, to; Cursor cursor; if (simple->simple.cursor_name == NULL) return; from.addr = (XPointer) simple->simple.cursor_name; from.size = strlen((char *) from.addr) + 1; to.size = sizeof(Cursor); to.addr = (XPointer) &cursor; if (XtConvertAndStore(w, XtRString, &from, XtRColorCursor, &to)) { if ( cursor != None) simple->simple.cursor = cursor; } else { XtAppErrorMsg(XtWidgetToApplicationContext(w), "convertFailed","ConvertCursor","XawError", "Simple: ConvertCursor failed.", (String *)NULL, (Cardinal *)NULL); } } /* ARGSUSED */ static Bool SetValues(Widget current, Widget request, Widget new, ArgList args, Cardinal *num_args) { SimpleWidget s_old = (SimpleWidget) current; SimpleWidget s_new = (SimpleWidget) new; Boolean new_cursor = FALSE; UNUSED(request); UNUSED(args); UNUSED(num_args); /* this disables user changes after creation*/ s_new->simple.international = s_old->simple.international; if ( XtIsSensitive(current) != XtIsSensitive(new) ) (*((SimpleWidgetClass)XtClass(new))-> simple_class.change_sensitive) ( new ); if (s_old->simple.cursor != s_new->simple.cursor) { new_cursor = TRUE; } /* * We are not handling the string cursor_name correctly here. */ if ( (s_old->simple.pointer_fg != s_new->simple.pointer_fg) || (s_old->simple.pointer_bg != s_new->simple.pointer_bg) || (s_old->simple.cursor_name != s_new->simple.cursor_name) ) { ConvertCursor(new); new_cursor = TRUE; } if (new_cursor && XtIsRealized(new)) XDefineCursor(XtDisplay(new), XtWindow(new), s_new->simple.cursor); return False; } static Bool ChangeSensitive(Widget w) { if (XtIsRealized(w)) { if (XtIsSensitive(w)) if (w->core.border_pixmap != XtUnspecifiedPixmap) XSetWindowBorderPixmap( XtDisplay(w), XtWindow(w), w->core.border_pixmap ); else XSetWindowBorder( XtDisplay(w), XtWindow(w), w->core.border_pixel ); else { if (((SimpleWidget)w)->simple.insensitive_border == None) ((SimpleWidget)w)->simple.insensitive_border = XmuCreateStippledPixmap(XtScreen(w), w->core.border_pixel, w->core.background_pixel, w->core.depth); XSetWindowBorderPixmap( XtDisplay(w), XtWindow(w), ((SimpleWidget)w)-> simple.insensitive_border ); } } return False; } /* ====================================================================== end copy from Simple.c ====================================================================== */ /* following function copied from XawInit.c */ void XawInitializeWidgetSet () { static int firsttime = 1; if (firsttime) { firsttime = 0; XtInitializeWidgetClass (vendorShellWidgetClass); } } static char defaultTranslations[] = ": start() \n\ : move() \n\ : notify() stop() \n\ : abort() \n\ :KP_Enter: set(rubberband,toggle) \n\ space: page(+1p,+1p) \n\ Delete: page(-1p,-1p) \n\ :KP_Delete: page(-1p,-1p) \n\ BackSpace: page(-1p,-1p) \n\ Left: page(-.5p,+0) \n\ :KP_Left: page(-.5p,+0) \n\ Right: page(+.5p,+0) \n\ :KP_Right: page(+.5p,+0) \n\ Up: page(+0,-.5p) \n\ :KP_Up: page(+0,-.5p) \n\ Down: page(+0,+.5p) \n\ :KP_Down: page(+0,+.5p) \n\ Home: page(0,0) \n\ :KP_Home: page(0,0)"; static void ActionStart(), ActionStop(), ActionAbort(), ActionMove(); static void ActionPage(), ActionNotify(), ActionSet(); static XtActionsRec actions[] = { { "start", ActionStart }, /* start tmp graphics */ { "stop", ActionStop }, /* stop tmp graphics */ { "abort", ActionAbort }, /* punt */ { "move", ActionMove }, /* move tmp graphics on Motion event */ { "page", ActionPage }, /* page around usually from keyboard */ { "notify", ActionNotify }, /* callback new position */ { "set", ActionSet }, /* set various parameters */ }; /* * resources for the panner */ static XtResource panner_resources[] = { #define poff(field) XtOffsetOf(PannerRec, panner.field) { XtNallowOff, XtCAllowOff, XtRBoolean, sizeof(Boolean), poff(allow_off), XtRImmediate, (XtPointer) FALSE }, { XtNresize, XtCResize, XtRBoolean, sizeof(Boolean), poff(resize_to_pref), XtRImmediate, (XtPointer) TRUE }, { XtNreportCallback, XtCReportCallback, XtRCallback, sizeof(XtPointer), poff(report_callbacks), XtRCallback, (XtPointer) NULL }, { XtNdefaultScale, XtCDefaultScale, XtRDimension, sizeof(Dimension), poff(default_scale), XtRImmediate, (XtPointer) PANNER_DEFAULT_SCALE }, { XtNrubberBand, XtCRubberBand, XtRBoolean, sizeof(Boolean), poff(rubber_band), XtRImmediate, (XtPointer) FALSE }, { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), poff(foreground), XtRString, (XtPointer) XtDefaultBackground }, { XtNinternalSpace, XtCInternalSpace, XtRDimension, sizeof(Dimension), poff(internal_border), XtRImmediate, (XtPointer) 4 }, { XtNlineWidth, XtCLineWidth, XtRDimension, sizeof(Dimension), poff(line_width), XtRImmediate, (XtPointer) 0 }, { XtNcanvasWidth, XtCCanvasWidth, XtRDimension, sizeof(Dimension), poff(canvas_width), XtRImmediate, (XtPointer) 0 }, { XtNcanvasHeight, XtCCanvasHeight, XtRDimension, sizeof(Dimension), poff(canvas_height), XtRImmediate, (XtPointer) 0 }, { XtNsliderX, XtCSliderX, XtRPosition, sizeof(Position), poff(slider_x), XtRImmediate, (XtPointer) 0 }, { XtNsliderY, XtCSliderY, XtRPosition, sizeof(Position), poff(slider_y), XtRImmediate, (XtPointer) 0 }, { XtNsliderWidth, XtCSliderWidth, XtRDimension, sizeof(Dimension), poff(slider_width), XtRImmediate, (XtPointer) 0 }, { XtNsliderHeight, XtCSliderHeight, XtRDimension, sizeof(Dimension), poff(slider_height), XtRImmediate, (XtPointer) 0 }, { XtNshadowColor, XtCShadowColor, XtRPixel, sizeof(Pixel), poff(shadow_color), XtRString, (XtPointer) XtDefaultForeground }, { XtNshadowThickness, XtCShadowThickness, XtRDimension, sizeof(Dimension), poff(shadow_thickness), XtRImmediate, (XtPointer) 2 }, { XtNbackgroundStipple, XtCBackgroundStipple, XtRString, sizeof(String), poff(stipple_name), XtRImmediate, (XtPointer) NULL }, #undef poff }; /* * widget class methods used below */ static void Initialize(); /* create gc's */ static void PannerRealize(); /* create window */ static void Destroy(); /* clean up widget */ static void Resize(); /* need to rescale ourselves */ static void Redisplay(); /* draw ourselves */ static Boolean PannerSetValues(); /* set all of the resources */ static void SetValuesAlmost(); /* deal with failed setval geom req */ static XtGeometryResult QueryGeometry(); /* say how big we would like to be */ PannerClassRec pannerClassRec = { { /* core fields */ /* superclass */ (WidgetClass) &simpleClassRec, /* class_name */ "Panner", /* widget_size */ sizeof(PannerRec), /* class_initialize */ XawInitializeWidgetSet, /* class_part_initialize */ NULL, /* class_inited */ FALSE, /* initialize */ Initialize, /* initialize_hook */ NULL, /* realize */ PannerRealize, /* actions */ actions, /* num_actions */ XtNumber(actions), /* resources */ panner_resources, /* num_resources */ XtNumber(panner_resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ TRUE, /* visible_interest */ FALSE, /* destroy */ Destroy, /* resize */ Resize, /* expose */ Redisplay, /* set_values */ PannerSetValues, /* set_values_hook */ NULL, /* set_values_almost */ SetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* version */ XtVersion, /* callback_private */ NULL, /* tm_table */ defaultTranslations, /* query_geometry */ QueryGeometry, /* display_accelerator */ XtInheritDisplayAccelerator, /* extension */ NULL }, { /* simple fields */ /* change_sensitive */ XtInheritChangeSensitive #ifndef HAVE_OLD_XAW , NULL #endif }, { /* panner fields */ /* ignore */ 0 } }; WidgetClass pannerWidgetClass = (WidgetClass) &pannerClassRec; /***************************************************************************** * * * panner utility routines * * * *****************************************************************************/ static void reset_shadow_gc (pw) /* used when resources change */ PannerWidget pw; { XtGCMask valuemask = GCForeground; XGCValues values; unsigned long pixels[3]; if (pw->panner.shadow_gc) XtReleaseGC ((Widget) pw, pw->panner.shadow_gc); pixels[0] = pw->panner.foreground; pixels[1] = pw->core.background_pixel; pixels[2] = pw->panner.shadow_color; if (!pw->panner.stipple_name && !XmuDistinguishablePixels (XtDisplay (pw), pw->core.colormap, pixels, 3) && XmuDistinguishablePixels (XtDisplay (pw), pw->core.colormap, pixels, 2)) { valuemask = GCTile | GCFillStyle; values.fill_style = FillTiled; values.tile = XmuCreateStippledPixmap(XtScreen((Widget)pw), pw->panner.foreground, pw->core.background_pixel, pw->core.depth); } else { if (!pw->panner.line_width && !XmuDistinguishablePixels (XtDisplay (pw), pw->core.colormap, pixels, 2)) pw->panner.line_width = 1; valuemask = GCForeground; values.foreground = pw->panner.shadow_color; } if (pw->panner.line_width > 0) { values.line_width = pw->panner.line_width; valuemask |= GCLineWidth; } pw->panner.shadow_gc = XtGetGC ((Widget) pw, valuemask, &values); } static void reset_slider_gc (pw) /* used when resources change */ PannerWidget pw; { XtGCMask valuemask = GCForeground; XGCValues values; if (pw->panner.slider_gc) XtReleaseGC ((Widget) pw, pw->panner.slider_gc); values.foreground = pw->panner.foreground; pw->panner.slider_gc = XtGetGC ((Widget) pw, valuemask, &values); } static void reset_xor_gc (pw) /* used when resources change */ PannerWidget pw; { if (pw->panner.xor_gc) XtReleaseGC ((Widget) pw, pw->panner.xor_gc); if (pw->panner.rubber_band) { XtGCMask valuemask = (GCForeground | GCFunction); XGCValues values; Pixel tmp; tmp = ((pw->panner.foreground == pw->core.background_pixel) ? pw->panner.shadow_color : pw->panner.foreground); values.foreground = tmp ^ pw->core.background_pixel; values.function = GXxor; if (pw->panner.line_width > 0) { valuemask |= GCLineWidth; values.line_width = pw->panner.line_width; } pw->panner.xor_gc = XtGetGC ((Widget) pw, valuemask, &values); } else { pw->panner.xor_gc = NULL; } } static void check_knob (pw, knob) PannerWidget pw; Boolean knob; { Position pad = pw->panner.internal_border * 2; Position maxx = (((Position) pw->core.width) - pad - ((Position) pw->panner.knob_width)); Position maxy = (((Position) pw->core.height) - pad - ((Position) pw->panner.knob_height)); Position *x = (knob ? &pw->panner.knob_x : &pw->panner.tmp.x); Position *y = (knob ? &pw->panner.knob_y : &pw->panner.tmp.y); /* * note that positions are already normalized (i.e. internal_border * has been subtracted out) */ if (*x < 0) *x = 0; if (*x > maxx) *x = maxx; if (*y < 0) *y = 0; if (*y > maxy) *y = maxy; if (knob) { pw->panner.slider_x = (Position) (((double) pw->panner.knob_x) / pw->panner.haspect + 0.5); pw->panner.slider_y = (Position) (((double) pw->panner.knob_y) / pw->panner.vaspect + 0.5); pw->panner.last_x = pw->panner.last_y = PANNER_OUTOFRANGE; } } static void move_shadow (pw) PannerWidget pw; { if (pw->panner.shadow_thickness > 0) { int lw = pw->panner.shadow_thickness + pw->panner.line_width * 2; int pad = pw->panner.internal_border; if ((int)pw->panner.knob_height > lw && (int)pw->panner.knob_width > lw) { XRectangle *r = pw->panner.shadow_rects; r->x = (short) (pw->panner.knob_x + pad + pw->panner.knob_width); r->y = (short) (pw->panner.knob_y + pad + lw); r->width = pw->panner.shadow_thickness; r->height = (unsigned short) (pw->panner.knob_height - lw); r++; r->x = (short) (pw->panner.knob_x + pad + lw); r->y = (short) (pw->panner.knob_y + pad + pw->panner.knob_height); r->width = (unsigned short) (pw->panner.knob_width - lw + pw->panner.shadow_thickness); r->height = pw->panner.shadow_thickness; pw->panner.shadow_valid = TRUE; return; } } pw->panner.shadow_valid = FALSE; } static void scale_knob (pw, location, size) /* set knob size and/or loc */ PannerWidget pw; Boolean location, size; { if (location) { pw->panner.knob_x = (Position) PANNER_HSCALE (pw, pw->panner.slider_x); pw->panner.knob_y = (Position) PANNER_VSCALE (pw, pw->panner.slider_y); } if (size) { Dimension width, height; if (pw->panner.slider_width < 1) { pw->panner.slider_width = pw->panner.canvas_width; } if (pw->panner.slider_height < 1) { pw->panner.slider_height = pw->panner.canvas_height; } width = Min (pw->panner.slider_width, pw->panner.canvas_width); height = Min (pw->panner.slider_height, pw->panner.canvas_height); pw->panner.knob_width = (Dimension) PANNER_HSCALE (pw, width); pw->panner.knob_height = (Dimension) PANNER_VSCALE (pw, height); } if (!pw->panner.allow_off) check_knob (pw, TRUE); move_shadow (pw); } static void rescale (pw) PannerWidget pw; { int hpad = pw->panner.internal_border * 2; int vpad = hpad; if (pw->panner.canvas_width < 1) pw->panner.canvas_width = pw->core.width; if (pw->panner.canvas_height < 1) pw->panner.canvas_height = pw->core.height; if ((int)pw->core.width <= hpad) hpad = 0; if ((int)pw->core.height <= vpad) vpad = 0; pw->panner.haspect = ((double) pw->core.width - hpad) / (double) pw->panner.canvas_width; pw->panner.vaspect = ((double) pw->core.height - vpad) / (double) pw->panner.canvas_height; scale_knob (pw, TRUE, TRUE); } static void get_default_size (pw, wp, hp) PannerWidget pw; Dimension *wp, *hp; { Dimension pad = pw->panner.internal_border * 2; *wp = PANNER_DSCALE (pw, pw->panner.canvas_width) + pad; *hp = PANNER_DSCALE (pw, pw->panner.canvas_height) + pad; } static Boolean get_event_xy (pw, event, x, y) PannerWidget pw; XEvent *event; int *x, *y; { int pad = pw->panner.internal_border; switch (event->type) { case ButtonPress: case ButtonRelease: *x = event->xbutton.x - pad; *y = event->xbutton.y - pad; return TRUE; case KeyPress: case KeyRelease: *x = event->xkey.x - pad; *y = event->xkey.y - pad; return TRUE; case EnterNotify: case LeaveNotify: *x = event->xcrossing.x - pad; *y = event->xcrossing.y - pad; return TRUE; case MotionNotify: *x = event->xmotion.x - pad; *y = event->xmotion.y - pad; return TRUE; } return FALSE; } static int parse_page_string (s, pagesize, canvassize, relative) char *s; int pagesize, canvassize; Boolean *relative; { char *cp; double val = 1.0; Boolean rel = FALSE; /* * syntax: spaces [+-] number spaces [pc\0] spaces */ for (; isascii(*s) && isspace(*s); s++) ; /* skip white space */ if (*s == '+' || *s == '-') { /* deal with signs */ rel = TRUE; if (*s == '-') val = -1.0; s++; } if (!*s) { /* if null then return nothing */ *relative = TRUE; return 0; } /* skip over numbers */ for (cp = s; isascii(*s) && (isdigit(*s) || *s == '.'); s++) ; val *= atof(cp); /* skip blanks */ for (; isascii(*s) && isspace(*s); s++) ; if (*s) { /* if units */ switch (s[0]) { case 'p': case 'P': val *= (double) pagesize; break; case 'c': case 'C': val *= (double) canvassize; break; } } *relative = rel; return ((int) val); } #define DRAW_TMP(pw) \ { \ XDrawRectangle (XtDisplay(pw), XtWindow(pw), \ pw->panner.xor_gc, \ (int) (pw->panner.tmp.x + pw->panner.internal_border), \ (int) (pw->panner.tmp.y + pw->panner.internal_border), \ (unsigned int) (pw->panner.knob_width - 1), \ (unsigned int) (pw->panner.knob_height - 1)); \ pw->panner.tmp.showing = !pw->panner.tmp.showing; \ } #define UNDRAW_TMP(pw) \ { \ if (pw->panner.tmp.showing) DRAW_TMP(pw); \ } #define BACKGROUND_STIPPLE(pw) \ XmuLocatePixmapFile (pw->core.screen, pw->panner.stipple_name, \ pw->panner.shadow_color, pw->core.background_pixel, \ pw->core.depth, NULL, 0, NULL, NULL, NULL, NULL) #define PIXMAP_OKAY(pm) ((pm) != None && (pm) != XtUnspecifiedPixmap) /***************************************************************************** * * * panner class methods * * * *****************************************************************************/ /*ARGSUSED*/ static void Initialize (greq, gnew, args, num_args) Widget greq, gnew; ArgList args; Cardinal *num_args; { PannerWidget req = (PannerWidget) greq, new = (PannerWidget) gnew; Dimension defwidth, defheight; UNUSED(args); UNUSED(num_args); if (req->panner.canvas_width < 1) new->panner.canvas_width = 1; if (req->panner.canvas_height < 1) new->panner.canvas_height = 1; if (req->panner.default_scale < 1) new->panner.default_scale = PANNER_DEFAULT_SCALE; get_default_size (req, &defwidth, &defheight); if (req->core.width < 1) new->core.width = defwidth; if (req->core.height < 1) new->core.height = defheight; new->panner.shadow_gc = NULL; reset_shadow_gc (new); /* shadowColor */ new->panner.slider_gc = NULL; reset_slider_gc (new); /* foreground */ new->panner.xor_gc = NULL; reset_xor_gc (new); /* foreground ^ background */ rescale (new); /* does a position check */ new->panner.shadow_valid = FALSE; new->panner.tmp.doing = FALSE; new->panner.tmp.showing = FALSE; } static void PannerRealize (gw, valuemaskp, attr) Widget gw; XtValueMask *valuemaskp; XSetWindowAttributes *attr; { PannerWidget pw = (PannerWidget) gw; Pixmap pm = XtUnspecifiedPixmap; Boolean gotpm = FALSE; if (pw->core.background_pixmap == XtUnspecifiedPixmap) { if (pw->panner.stipple_name) pm = BACKGROUND_STIPPLE (pw); if (PIXMAP_OKAY(pm)) { attr->background_pixmap = pm; *valuemaskp |= CWBackPixmap; *valuemaskp &= ~CWBackPixel; gotpm = TRUE; } } (*pannerWidgetClass->core_class.superclass->core_class.realize) (gw, valuemaskp, attr); if (gotpm) XFreePixmap (XtDisplay(gw), pm); } static void Destroy (gw) Widget gw; { PannerWidget pw = (PannerWidget) gw; XtReleaseGC (gw, pw->panner.shadow_gc); XtReleaseGC (gw, pw->panner.slider_gc); XtReleaseGC (gw, pw->panner.xor_gc); } static void Resize (gw) Widget gw; { rescale ((PannerWidget) gw); } /* ARGSUSED */ static void Redisplay (Widget gw, XEvent *event, Region region) { PannerWidget pw = (PannerWidget) gw; Display *dpy = XtDisplay(gw); Window w = XtWindow(gw); int pad = pw->panner.internal_border; Dimension lw = pw->panner.line_width; Dimension extra = pw->panner.shadow_thickness + lw * 2; int kx = pw->panner.knob_x + pad, ky = pw->panner.knob_y + pad; UNUSED(event); UNUSED(region); pw->panner.tmp.showing = FALSE; XClearArea (XtDisplay(pw), XtWindow(pw), (int) pw->panner.last_x - ((int) lw) + pad, (int) pw->panner.last_y - ((int) lw) + pad, (unsigned int) (pw->panner.knob_width + extra), (unsigned int) (pw->panner.knob_height + extra), False); pw->panner.last_x = pw->panner.knob_x; pw->panner.last_y = pw->panner.knob_y; XFillRectangle (dpy, w, pw->panner.slider_gc, kx, ky, pw->panner.knob_width - 1, pw->panner.knob_height - 1); if (lw) { XDrawRectangle (dpy, w, pw->panner.shadow_gc, kx, ky, (unsigned int) (pw->panner.knob_width - 1), (unsigned int) (pw->panner.knob_height - 1)); } if (pw->panner.shadow_valid) { XFillRectangles (dpy, w, pw->panner.shadow_gc, pw->panner.shadow_rects, 2); } if (pw->panner.tmp.doing && pw->panner.rubber_band) DRAW_TMP (pw); } /* ARGSUSED */ static Boolean PannerSetValues (Widget gcur, Widget greq, Widget gnew, ArgList args, Cardinal *num_args) { PannerWidget cur = (PannerWidget) gcur; PannerWidget new = (PannerWidget) gnew; Boolean redisplay = FALSE; UNUSED(greq); UNUSED(args); UNUSED(num_args); if (cur->panner.foreground != new->panner.foreground) { reset_slider_gc (new); if (cur->panner.foreground != cur->core.background_pixel) reset_xor_gc (new); redisplay = TRUE; } else if (cur->panner.line_width != new->panner.line_width || cur->core.background_pixel != new->core.background_pixel) { reset_xor_gc (new); redisplay = TRUE; } if (cur->panner.shadow_color != new->panner.shadow_color) { reset_shadow_gc (new); if (cur->panner.foreground == cur->core.background_pixel) reset_xor_gc (new); redisplay = TRUE; } if (cur->panner.shadow_thickness != new->panner.shadow_thickness) { move_shadow (new); redisplay = TRUE; } if (cur->panner.rubber_band != new->panner.rubber_band) { reset_xor_gc (new); if (new->panner.tmp.doing) redisplay = TRUE; } if ((cur->panner.stipple_name != new->panner.stipple_name || cur->panner.shadow_color != new->panner.shadow_color || cur->core.background_pixel != new->core.background_pixel) && XtIsRealized(gnew)) { Pixmap pm = (new->panner.stipple_name ? BACKGROUND_STIPPLE (new) : XtUnspecifiedPixmap); if (PIXMAP_OKAY(pm)) { XSetWindowBackgroundPixmap (XtDisplay (new), XtWindow(new), pm); XFreePixmap (XtDisplay (new), pm); } else { XSetWindowBackground (XtDisplay (new), XtWindow(new), new->core.background_pixel); } redisplay = TRUE; } if (new->panner.resize_to_pref && (cur->panner.canvas_width != new->panner.canvas_width || cur->panner.canvas_height != new->panner.canvas_height || cur->panner.resize_to_pref != new->panner.resize_to_pref)) { get_default_size (new, &new->core.width, &new->core.height); redisplay = TRUE; } else if (cur->panner.canvas_width != new->panner.canvas_width || cur->panner.canvas_height != new->panner.canvas_height || cur->panner.internal_border != new->panner.internal_border) { rescale (new); /* does a scale_knob as well */ redisplay = TRUE; } else { Boolean loc = (cur->panner.slider_x != new->panner.slider_x || cur->panner.slider_y != new->panner.slider_y); Boolean siz = (cur->panner.slider_width != new->panner.slider_width || cur->panner.slider_height != new->panner.slider_height); if (loc || siz || (cur->panner.allow_off != new->panner.allow_off && new->panner.allow_off)) { scale_knob (new, loc, siz); redisplay = TRUE; } } return redisplay; } static void SetValuesAlmost (gold, gnew, req, reply) Widget gold, gnew; XtWidgetGeometry *req, *reply; { if (reply->request_mode == 0) { /* got turned down, so cope */ Resize (gnew); } (*pannerWidgetClass->core_class.superclass->core_class.set_values_almost) (gold, gnew, req, reply); } static XtGeometryResult QueryGeometry (gw, intended, pref) Widget gw; XtWidgetGeometry *intended, *pref; { PannerWidget pw = (PannerWidget) gw; pref->request_mode = (CWWidth | CWHeight); get_default_size (pw, &pref->width, &pref->height); if (((intended->request_mode & (CWWidth | CWHeight)) == (CWWidth | CWHeight)) && intended->width == pref->width && intended->height == pref->height) return XtGeometryYes; else if (pref->width == pw->core.width && pref->height == pw->core.height) return XtGeometryNo; else return XtGeometryAlmost; } /***************************************************************************** * * * panner action procs * * * *****************************************************************************/ /* ARGSUSED */ static void ActionStart (Widget gw, XEvent *event, String *params, Cardinal *num_params) { PannerWidget pw = (PannerWidget) gw; int x, y; UNUSED(params); UNUSED(num_params); if (!get_event_xy (pw, event, &x, &y)) { XBell (XtDisplay(gw), 0); /* should do error message */ return; } pw->panner.tmp.doing = TRUE; pw->panner.tmp.startx = pw->panner.knob_x; pw->panner.tmp.starty = pw->panner.knob_y; pw->panner.tmp.dx = (((Position) x) - pw->panner.knob_x); pw->panner.tmp.dy = (((Position) y) - pw->panner.knob_y); pw->panner.tmp.x = pw->panner.knob_x; pw->panner.tmp.y = pw->panner.knob_y; if (pw->panner.rubber_band) DRAW_TMP (pw); } /* ARGSUSED */ static void ActionStop (Widget gw, XEvent *event, String *params, Cardinal *num_params) { PannerWidget pw = (PannerWidget) gw; int x, y; UNUSED(params); UNUSED(num_params); if (get_event_xy (pw, event, &x, &y)) { pw->panner.tmp.x = ((Position) x) - pw->panner.tmp.dx; pw->panner.tmp.y = ((Position) y) - pw->panner.tmp.dy; if (!pw->panner.allow_off) check_knob (pw, FALSE); } if (pw->panner.rubber_band) UNDRAW_TMP (pw); pw->panner.tmp.doing = FALSE; } /* ARGSUSED */ static void ActionAbort (Widget gw, XEvent *event, String *params, Cardinal *num_params) { PannerWidget pw = (PannerWidget) gw; UNUSED(params); UNUSED(num_params); if (!pw->panner.tmp.doing) return; if (pw->panner.rubber_band) UNDRAW_TMP (pw); if (!pw->panner.rubber_band) { /* restore old position */ pw->panner.tmp.x = pw->panner.tmp.startx; pw->panner.tmp.y = pw->panner.tmp.starty; ActionNotify (gw, event, params, num_params); } pw->panner.tmp.doing = FALSE; } /* ARGSUSED */ static void ActionMove (Widget gw, XEvent *event, String *params, Cardinal *num_params) { PannerWidget pw = (PannerWidget) gw; int x, y; UNUSED(params); UNUSED(num_params); if (!pw->panner.tmp.doing) return; if (!get_event_xy (pw, event, &x, &y)) { XBell (XtDisplay(gw), 0); /* should do error message */ return; } if (pw->panner.rubber_band) UNDRAW_TMP (pw); pw->panner.tmp.x = ((Position) x) - pw->panner.tmp.dx; pw->panner.tmp.y = ((Position) y) - pw->panner.tmp.dy; if (!pw->panner.rubber_band) { ActionNotify (gw, event, params, num_params); /* does a check */ } else { if (!pw->panner.allow_off) check_knob (pw, FALSE); DRAW_TMP (pw); } } /* ARGSUSED */ static void ActionPage (Widget gw, XEvent *event, String *params, Cardinal *num_params) { PannerWidget pw = (PannerWidget) gw; Cardinal zero = 0; Boolean isin = pw->panner.tmp.doing; int x, y; Boolean relx, rely; int pad = pw->panner.internal_border * 2; UNUSED(event); UNUSED(num_params); if (*num_params != 2) { XBell (XtDisplay(gw), 0); return; } x = parse_page_string (params[0], (int) pw->panner.knob_width, ((int) pw->core.width) - pad, &relx); y = parse_page_string (params[1], (int) pw->panner.knob_height, ((int) pw->core.height) - pad, &rely); if (relx) x += pw->panner.knob_x; if (rely) y += pw->panner.knob_y; if (isin) { /* if in, then use move */ XEvent ev; ev.xbutton.type = ButtonPress; ev.xbutton.x = x; ev.xbutton.y = y; ActionMove (gw, &ev, (String *) NULL, &zero); } else { /* else just do it */ pw->panner.tmp.doing = TRUE; pw->panner.tmp.x = x; pw->panner.tmp.y = y; ActionNotify (gw, event, (String *) NULL, &zero); pw->panner.tmp.doing = FALSE; } } /* ARGSUSED */ static void ActionNotify (Widget gw, XEvent *event, String *params, Cardinal *num_params) { PannerWidget pw = (PannerWidget) gw; UNUSED(event); UNUSED(params); UNUSED(num_params); if (!pw->panner.tmp.doing) return; if (!pw->panner.allow_off) check_knob (pw, FALSE); pw->panner.knob_x = pw->panner.tmp.x; pw->panner.knob_y = pw->panner.tmp.y; move_shadow (pw); pw->panner.slider_x = (Position) (((double) pw->panner.knob_x) / pw->panner.haspect + 0.5); pw->panner.slider_y = (Position) (((double) pw->panner.knob_y) / pw->panner.vaspect + 0.5); if (!pw->panner.allow_off) { Position tmp; if (pw->panner.slider_x > (tmp = (((Position) pw->panner.canvas_width) - ((Position) pw->panner.slider_width)))) pw->panner.slider_x = tmp; if (pw->panner.slider_x < 0) pw->panner.slider_x = 0; if (pw->panner.slider_y > (tmp = (((Position) pw->panner.canvas_height) - ((Position) pw->panner.slider_height)))) pw->panner.slider_y = tmp; if (pw->panner.slider_y < 0) pw->panner.slider_y = 0; } if (pw->panner.last_x != pw->panner.knob_x || pw->panner.last_y != pw->panner.knob_y) { XawPannerReport rep; Redisplay (gw, (XEvent*) NULL, (Region) NULL); rep.changed = (XawPRSliderX | XawPRSliderY); rep.slider_x = pw->panner.slider_x; rep.slider_y = pw->panner.slider_y; rep.slider_width = pw->panner.slider_width; rep.slider_height = pw->panner.slider_height; rep.canvas_width = pw->panner.canvas_width; rep.canvas_height = pw->panner.canvas_height; XtCallCallbackList (gw, pw->panner.report_callbacks, (XtPointer) &rep); } } /* ARGSUSED */ static void ActionSet (Widget gw, XEvent *event, String *params, Cardinal *num_params) { PannerWidget pw = (PannerWidget) gw; Boolean rb; UNUSED(event); if (*num_params < 2 || XmuCompareISOLatin1 (params[0], "rubberband") != 0) { XBell (XtDisplay(gw), 0); return; } if (XmuCompareISOLatin1 (params[1], "on") == 0) { rb = TRUE; } else if (XmuCompareISOLatin1 (params[1], "off") == 0) { rb = FALSE; } else if (XmuCompareISOLatin1 (params[1], "toggle") == 0) { rb = !pw->panner.rubber_band; } else { XBell (XtDisplay(gw), 0); return; } if (rb != pw->panner.rubber_band) { Arg args[1]; XtSetArg (args[0], XtNrubberBand, rb); XtSetValues (gw, args, (Cardinal) 1); } } #endif /* MOTIF && USE_PANNER */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/sfDraw.h0000664000175000017500000000620510363262237020355 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef SFDRAW_H_ #define SFDRAW_H_ #include "xdvi-config.h" #if !defined(MOTIF) /* for xdvik */ #include #include #include #include #include #include #include #include #define SF_DO_SCROLL 1 #define SF_DO_NOT_SCROLL 0 extern Pixel SFfore, SFback; void SFinitFont(void); void SFcreateGC(void); void SFclearList(int n, int doScroll); void SFdrawList(int n, int doScroll); void SFdrawLists(int doScroll); void SFenterList(Widget w, int n, XEnterWindowEvent *event); void SFleaveList(Widget w, int n, XEvent *event); void SFmotionList(Widget w, int n, XMotionEvent *event); void SFvFloatSliderMovedCallback(Widget w, int n, float *fnew); void SFvSliderMovedCallback(Widget w, int n, int new); void SFvAreaSelectedCallback(Widget w, int n, int pnew); void SFhSliderMovedCallback(Widget w, int n, float *new); void SFhAreaSelectedCallback(Widget w, int n, int pnew); void SFpathSliderMovedCallback(Widget w, XtPointer client_data, float *new); void SFpathAreaSelectedCallback(Widget w, XtPointer client_data, int pnew); Boolean SFworkProc(void); extern int (*SFfunc)(); extern Widget selFileField, selFileForm, selFileHScroll, selFileHScrolls[], selFileLists[], selFileVScrolls[]; extern Display *SFdisplay; extern int SFcharWidth, SFcharHeight, SFcharAscent; extern XSegment SFsegs[], SFcompletionSegs[]; extern XawTextPosition SFtextPos; extern int SFupperX, SFlowerY, SFupperY; extern int SFtextX, SFtextYoffset; extern int SFentryWidth, SFentryHeight; extern int SFlineToTextH, SFlineToTextV; extern int SFbesideText, SFaboveAndBelowText; extern int SFcharsPerEntry; extern int SFlistSize; extern int SFcurrentInvert[]; extern int SFworkProcAdded; extern XtAppContext SFapp; extern int SFpathScrollWidth, SFvScrollHeight, SFhScrollWidth; extern char SFtextBuffer[]; extern int SFbuttonPressed; extern XtIntervalId SFdirModTimerId; #endif /* !defined(MOTIF) */ #endif /* SFDRAW_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_toolbar.h0000664000175000017500000000372710363262237021303 0ustar uwabamiuwabami/* * Copyright (c) 2001 Marcin Dalecki * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef XM_TOOLBAR_H_ #define XM_TOOLBAR_H_ #ifdef MOTIF extern Widget create_toolbar(Widget parent, Widget menu_bar); extern Boolean toolbar_visible, scrollbars_visible, pagelist_visible; extern void create_tips(Widget parent); #if HAVE_XPM extern void tb_check_navigation_sensitivity(int pageno); extern void tb_check_navigation_sensitivity(int pageno); extern void tb_set_htex_forward_sensitivity(Boolean sensitive); extern void tb_set_htex_back_sensitivity(Boolean sensitive); extern void tb_set_pagehist_forward_sensitivity(Boolean sensitive); extern void tb_set_pagehist_back_sensitivity(Boolean sensitive); extern void tb_set_zoom_sensitivity(Boolean sensitive); #endif /* HAVE_XPM */ extern void toggle_toolbar(void); extern void toggle_scrollbars(void); #endif /* MOTIF */ #endif /* XM_TOOLBAR_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xaw_bitmaps.c0000664000175000017500000000672611032450154021437 0ustar uwabamiuwabami#include "xaw_bitmaps.h" /* * Bitmaps for indicating checkbuttons and radiobuttons in Xaw popup windows. * The size of these is 16x16. */ /* checkbuttons: rectangular box containing a tick mark if on, empty box else */ unsigned char button_check_on_bits[] = { 0x00, 0x00, 0x00, 0x80, 0xfc, 0xff, 0x04, 0x60, 0x04, 0x30, 0x04, 0x38, 0x64, 0x2c, 0xe4, 0x26, 0xc4, 0x23, 0x84, 0x21, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00 }; unsigned char button_check_off_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xfc, 0x3f, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00 }; /* radiobuttons: round and filled with dot if on, empty else */ unsigned char button_radio_on_bits[] = { /* 0x70, 0x00, 0x8c, 0x01, 0x02, 0x02, 0x72, 0x02, 0xf9, 0x04, 0xf9, 0x04, */ /* 0xf9, 0x04, 0x72, 0x02, 0x02, 0x02, 0x8c, 0x01, 0x70, 0x00 */ 0x00,0x00,0x00,0x00,0xc0,0x03,0x30,0x0c,0x08,0x10,0xc8,0x13,0xe4,0x27,0xe4, 0x27,0xe4,0x27,0xe4,0x27,0xc8,0x13,0x08,0x10,0x30,0x0c,0xc0,0x03,0x00,0x00, 0x00,0x00 }; unsigned char button_radio_off_bits[] = { /* 0x70, 0x00, 0x8c, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x04, 0x01, 0x04, */ /* 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0x8c, 0x01, 0x70, 0x00 */ 0x00,0x00,0x00,0x00,0xc0,0x03,0x30,0x0c,0x08,0x10,0x08,0x10,0x04,0x20,0x04, 0x20,0x04,0x20,0x04,0x20,0x08,0x10,0x08,0x10,0x30,0x0c,0xc0,0x03,0x00,0x00, 0x00,0x00 }; /* * Bitmaps for left-hand markers in Xaw pulldown menus; these only * use the mark elements from the button markers (dot, or tick). */ /* check options: similar to button_check_*_bits. */ unsigned char menu_check_on_bits[] = { 0x00, 0x04, 0x00, 0x06, 0x00, 0x03, 0x80, 0x01, 0xc6, 0x00, 0x6e, 0x00, 0x3c, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; unsigned char menu_check_off_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* radio options: tick mark if on, else empty. These are different from the `round' buttons in button_radio_* (not ideal ...) since the round buttons are too large for menus. */ unsigned char menu_radio_on_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; unsigned char menu_radio_off_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* arrow for Xaw submenus */ unsigned char menu_arrow_bits[] = { /* 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x38, 0x00, 0x78, 0x00, 0xf8, 0x00, */ /* 0x78, 0x00, 0x38, 0x00, 0x18, 0x00, 0x08, 0x00, 0x00, 0x00 */ 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0xe0, 0x00, 0xe0, 0x01, 0xe0, 0x03, 0xe0, 0x01, 0xe0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00 /* 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x38, 0x00, 0x78, 0x00, 0xf8, */ /* 0x00, 0x78, 0x00, 0x38, 0x00, 0x18, 0x00, 0x08, 0x00, 0x00 */ /* 0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00 */ }; /* double arrow for popup menus */ unsigned char menu_double_arrow_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x70, 0x00, 0xf8, 0x00, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0xf8, 0x00, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/Tip.h0000664000175000017500000000406410363262237017664 0ustar uwabamiuwabami/* * Copyright (c) 2001-2004 Marcin Dalecki and others * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef TIP_H_ #define TIP_H_ #ifdef MOTIF /* Tooltip widget handling. This has somewhat of a library character, * but we don't want to go into the trouble of making a library for just * one function. */ #include #include /* New resource names */ #define XmNcancelWaitPeriod "cancelWaitPeriod" #define XmNwaitPeriod "waitPeriod" /* New resource classes */ #define XmCCancelWaitPeriod "CancelWaitPeriod" #define XmCWaitPeriod "WaitPeriod" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif extern WidgetClass tipWidgetClass; typedef struct _TipClassRec *TipWidgetClass; typedef struct _TipRec *TipWidget; extern void TipAddWidget(Widget, Widget, const String); extern void TipAppMainLoop(XtAppContext); extern void TipAppHandle(XtAppContext, XEvent *); #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif /* MOTIF */ #endif /* TIP_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/PannerP.h0000664000175000017500000001024510363262237020471 0ustar uwabamiuwabami/* * $XConsortium: PannerP.h,v 1.19 94/04/17 20:12:33 jim Exp $ * Copyright (c) 1989 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 CONNECTION 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 dealings in this Software without prior written authorization from the X Consortium. * * Author: Jim Fulton, MIT X Consortium */ #ifndef _XawPannerP_h #define _XawPannerP_h #include "Panner.h" #include /* parent */ typedef struct { /* new fields in widget class */ int dummy; } PannerClassPart; typedef struct _PannerClassRec { /* Panner widget class */ CoreClassPart core_class; SimpleClassPart simple_class; PannerClassPart panner_class; } PannerClassRec; typedef struct { /* new fields in widget */ /* resources... */ XtCallbackList report_callbacks; /* callback/Callback */ Boolean allow_off; /* allowOff/AllowOff */ Boolean resize_to_pref; /* resizeToPreferred/Boolean */ Pixel foreground; /* foreground/Foreground */ Pixel shadow_color; /* shadowColor/ShadowColor */ Dimension shadow_thickness; /* shadowThickness/ShadowThickness */ Dimension default_scale; /* defaultScale/DefaultScale */ Dimension line_width; /* lineWidth/LineWidth */ Dimension canvas_width; /* canvasWidth/CanvasWidth */ Dimension canvas_height; /* canvasHeight/CanvasHeight */ Position slider_x; /* sliderX/SliderX */ Position slider_y; /* sliderY/SliderY */ Dimension slider_width; /* sliderWidth/SliderWidth */ Dimension slider_height; /* sliderHeight/SliderHeight */ Dimension internal_border; /* internalBorderWidth/BorderWidth */ String stipple_name; /* backgroundStipple/BackgroundStipple */ /* private data... */ GC slider_gc; /* background of slider */ GC shadow_gc; /* edge of slider and shadow */ GC xor_gc; /* for doing XOR tmp graphics */ double haspect, vaspect; /* aspect ratio of core to canvas */ Boolean rubber_band; /* true = rubber band, false = move */ struct { Boolean doing; /* tmp graphics in progress */ Boolean showing; /* true if tmp graphics displayed */ Position startx, starty; /* initial position of slider */ Position dx, dy; /* offset loc for tmp graphics */ Position x, y; /* location for tmp graphics */ } tmp; Position knob_x, knob_y; /* real upper left of knob in canvas */ Dimension knob_width, knob_height; /* real size of knob in canvas */ Boolean shadow_valid; /* true if rects are valid */ XRectangle shadow_rects[2]; /* location of shadows */ Position last_x, last_y; /* previous location of knob */ } PannerPart; typedef struct _PannerRec { CorePart core; SimplePart simple; PannerPart panner; } PannerRec; #define PANNER_HSCALE(pw,val) ((pw)->panner.haspect * ((double) (val))) #define PANNER_VSCALE(pw,val) ((pw)->panner.vaspect * ((double) (val))) #define PANNER_DSCALE(pw,val) (Dimension) \ ((((unsigned long) (val)) * (unsigned long) pw->panner.default_scale) / 100L) #define PANNER_DEFAULT_SCALE 8 /* percent */ #define PANNER_OUTOFRANGE -30000 /* * external declarations */ extern PannerClassRec pannerClassRec; #endif /* _XawPannerP_h */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/search-dialog.c0000664000175000017500000012504411164427731021631 0ustar uwabamiuwabami/* * Copyright (c) 2003-2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ #include "xdvi-config.h" #include "xdvi.h" #include "events.h" #include "dvi-init.h" #include "search-dialog.h" #include "search-internal.h" #include "xlwradio.h" #include "statusline.h" #include "string-utils.h" #include "string_list.h" #include "util.h" #include "message-window.h" #include "x_util.h" #include "xm_menu.h" /* for popdown_callback() */ #include #include #ifdef MOTIF # include # include # include # include # include # include # include # include # include # include # include # include # include # if USE_COMBOBOX # include # include # endif /* USE_COMBOBOX */ #else /* MOTIF */ # include # include # include # include # include # include # include # include #endif /* MOTIF */ /* #defines for widgets that are used in common code */ #ifdef MOTIF # define SHELL_WIDGET xmDialogShellWidgetClass # define PANED_WIDGET xmPanedWindowWidgetClass # define FORM_WIDGET xmFormWidgetClass # define LABEL_WIDGET xmLabelGadgetClass # define TEXT_WIDGET xmTextFieldWidgetClass # define CHECKBOX_WIDGET xmToggleButtonGadgetClass # define CHECKBUTTON_IS_SET XmNset # define PUSHBUTTON_WIDGET xmPushButtonWidgetClass # define VALUE_CALLBACK_NAME XmNvalueChangedCallback # define ACTIVATE_CALLBACK_NAME XmNactivateCallback #else /* MOTIF */ # define SHELL_WIDGET transientShellWidgetClass # define PANED_WIDGET panedWidgetClass # define FORM_WIDGET formWidgetClass # define LABEL_WIDGET labelWidgetClass # define TEXT_WIDGET asciiTextWidgetClass # ifdef XAW # define CHECKBOX_WIDGET radioWidgetClass # else /* XAW */ # define CHECKBOX_WIDGET toggleWidgetClass # endif /* XAW */ # define CHECKBUTTON_IS_SET XtNstate # define PUSHBUTTON_WIDGET commandWidgetClass # define VALUE_CALLBACK_NAME XtNcallback # define ACTIVATE_CALLBACK_NAME XtNcallback #endif /* MOTIF */ #if defined(MOTIF) && USE_COMBOBOX struct search_history { char **char_items; size_t item_cnt; Boolean empty; }; #define Xdvi_HISTORY_EMPTY_MARKER "" static void search_history_init(struct search_history *hist) { if (resource.search_history == NULL) { hist->empty = True; hist->char_items = xmalloc(1 * sizeof *(hist->char_items)); hist->char_items[0] = NULL; hist->item_cnt = 0; } else { hist->char_items = get_separated_list(resource.search_history, "\n", False); hist->empty = False; /* count number of items and save to hist->item_cnt */ for (hist->item_cnt = 0; hist->char_items[hist->item_cnt] != NULL; hist->item_cnt++) { ; } } } static void search_history_update(struct search_history *hist, Widget w, const char *str) { size_t i; char *tmp; XmString tmp_str = XmStringCreateLocalized((char *)str); Boolean found = False; Widget textfield = NULL; TRACE_FIND((stderr, "search_history_update for: |%s|\n", str)); /* special case if Xdvi_HISTORY_EMPTY_MARKER is present: Replace it with `str' */ if (hist->empty) { XmComboBoxDeletePos(w, 0); hist->empty = False; hist->char_items = string_list_prepend(hist->char_items, str); XmComboBoxAddItem(w, tmp_str, 0, True); hist->item_cnt++; XmStringFree(tmp_str); return; } XtVaGetValues(w, XmNtextField, &textfield, NULL); if (textfield == NULL) { XDVI_ERROR((stderr, "Could not get text field from combo box!")); XmStringFree(tmp_str); return; } /* if str is already in the history, just move it to the first position */ for (i = 0; hist->char_items[i] != NULL; i++) { if (strcmp(hist->char_items[i], str) == 0) { found = True; break; } } if (found) { hist->char_items = string_list_move_to_start(hist->char_items, i); XmComboBoxDeletePos(w, i + 1); XmComboBoxAddItem(w, tmp_str, 1, True); XmComboBoxSelectItem(w, tmp_str); XtVaSetValues(textfield, XmNcursorPosition, strlen(hist->char_items[0]), NULL); XmStringFree(tmp_str); return; } if ((int)hist->item_cnt >= resource.search_history_size) { /* history has reached its max size, delete the oldest element and put the new element at the beginning */ XmComboBoxDeletePos(w, hist->item_cnt); free(hist->char_items[hist->item_cnt - 1]); hist->char_items[hist->item_cnt - 1] = xstrdup(str); hist->char_items = string_list_rotate_up(hist->char_items); XmComboBoxAddItem(w, tmp_str, 1, False); XmComboBoxSelectItem(w, tmp_str); XtVaSetValues(textfield, XmNcursorPosition, strlen(str), NULL); } else { /* add item */ hist->char_items = string_list_prepend(hist->char_items, str); XmComboBoxAddItem(w, tmp_str, 1, False); XmComboBoxSelectItem(w, tmp_str); XtVaSetValues(textfield, XmNcursorPosition, strlen(str), NULL); hist->item_cnt++; } tmp = string_list_to_str(hist->char_items, "\n"); TRACE_FIND((stderr, "Saving search history: |%s|\n", tmp)); store_preference(NULL, "searchHistory", "%s", tmp); free(tmp); XmStringFree(tmp_str); } /* * User selected an item from seach history list */ static void cb_search_history_select(Widget w, XtPointer client_data, XtPointer call_data) { XmComboBoxCallbackStruct *cb = (XmComboBoxCallbackStruct *)call_data; struct search_history *hist = NULL; Widget textfield; int pos; int idx; UNUSED(client_data); if (cb->event == NULL) /* only browsing, no selection */ return; pos = cb->item_position; TRACE_FIND((stderr, "POS: %d; reason: %d, event type: %d\n", pos, cb->reason, cb->event->type)); /* Return if user didn't select from menu, but entered text directly. Strangely, `pos == 0' doesn't indicate this, contrary to what the docs say about XmONE_BASED. */ if (pos == 0 || cb->event->type != ButtonRelease) return; XtVaGetValues(w, XmNuserData, &hist, XmNtextField, &textfield, NULL); if (hist == NULL || textfield == NULL) { XDVI_ERROR((stderr, "Couldn't get XmNuserData or XmNtextField from combo box widget!\n")); return; } idx = pos - 1; if (idx == 0 && hist->char_items[0] == NULL) { /* Xdvi_HISTORY_EMPTY_MARKER selected, do nothing */ XtVaSetValues(textfield, XmNvalue, "", NULL); } else { XmString tmp_str; TRACE_FIND((stderr, "moving item %d, %s to pos 0\n", idx, hist->char_items[idx])); hist->char_items = string_list_move_to_start(hist->char_items, idx); /* same for list in combo box */ tmp_str = XmStringCreateLocalized(hist->char_items[0]); XmComboBoxDeletePos(w, pos); XmComboBoxAddItem(w, tmp_str, 1, True); XmComboBoxSelectItem(w, tmp_str); XtVaSetValues(textfield, XmNcursorPosition, strlen(hist->char_items[0]), NULL); XmStringFree(tmp_str); } } #endif /* defined(MOTIF) && USE_COMBOBOX */ static Boolean m_find_popup_active = False; /* flags for setting single bits in resource.search_window_defaults */ static const int SETTINGS_USE_REGEXP_FLAG = 1; static const int SETTINGS_CASE_SENSITIVE_FLAG = 2; static const int SETTINGS_BACKWARDS_FLAG = 4; static const int SETTINGS_IGNORE_LINEBREAKS_FLAG = 8; static const int SETTINGS_WRAP_FLAG = 16; static void cb_search_go(Widget w, XtPointer client_data, XtPointer call_data) { struct search_settings *settings = (struct search_settings *)client_data; Widget find_popup; Position x = 0, y = 0; ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!"); UNUSED(call_data); TRACE_FIND((stderr, "cb_search_go: settings: searchterm=|%s|, down = %d, re = %d, case = %d, wrap = %d", settings->term, settings->direction, settings->use_regexp, settings->case_sensitive, settings->wrap)); if (!get_widget_by_name(&find_popup, globals.widgets.top_level, "find_popup", True)) return; XtVaGetValues(find_popup, XtNx, &x, XtNy, &y, NULL); /* add some offsets */ settings->x_pos = x + 10; settings->y_pos = y + 10; TRACE_GUI((stderr, "SHELL: %ld; x: %d, y: %d", (unsigned long)w, x, y)); settings->from_page = current_page; settings->message_window = 0; settings->wrapcnt = 0; TRACE_FIND((stderr, "starting search from page: %d", settings->from_page)); search_dvi((XtPointer)settings); } static void show_settings(const char *func_name, struct search_settings *settings) { TRACE_FIND((stderr, "%s: settings: str=|%s|, down = %d, re = %d, " "case = %d, ignore_hyphens = %d, ignore_linebreaks = %d, wrap = %d\n", func_name, settings->term, settings->direction, settings->use_regexp, settings->case_sensitive, settings->ignore_hyphens, settings->ignore_linebreaks, settings->wrap)); } static void cb_regexp_search(Widget w, XtPointer client_data, XtPointer call_data) { struct search_settings *settings = (struct search_settings *)client_data; /* Hack: Since XawToggleUnsetCurrent() will invoke this callback again, return every second time to avoid multiple popups. This is done by setting the flag `do_return'. */ #if !HAVE_REGEX_H static Boolean do_return = False; #endif ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!"); UNUSED(call_data); #if !HAVE_REGEX_H if (do_return) { do_return = False; return; } XBell(DISP, 0); popup_message(get_matching_parent(w, globals.widgets.top_level, "find_popup", NULL), MSG_ERR, NULL, "Sorry, regular expression support (regex.h) is not available on this platform."); do_return = True; #ifdef MOTIF XmToggleButtonGadgetSetState(w, True, False); #else XawToggleUnsetCurrent(w); #endif #else UNUSED(w); settings->use_regexp = !(settings->use_regexp); /* force re-initialization of search term by resetting utf8_term: */ free(settings->utf8_term); settings->utf8_term = NULL; show_settings("cb_regexp_search", settings); #endif if (settings->use_regexp) resource.search_window_defaults |= SETTINGS_USE_REGEXP_FLAG; else resource.search_window_defaults &= ~SETTINGS_USE_REGEXP_FLAG; store_preference(NULL, "searchWindowDefaults", "%u", resource.search_window_defaults); } static void cb_backwards_search(Widget w, XtPointer client_data, XtPointer call_data) { struct search_settings *settings = (struct search_settings *)client_data; ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!"); UNUSED(w); UNUSED(call_data); switch (settings->direction) { case SEARCH_UP: settings->direction = SEARCH_DOWN; break; case SEARCH_DOWN: settings->direction = SEARCH_UP; break; default: ASSERT(0, "shouldn't happen: settings->direction is neither SEARCH_UP nor SEARCH_DOWN!"); break; } show_settings("cb_backwards_search", settings); if (settings->direction == SEARCH_UP) resource.search_window_defaults |= SETTINGS_BACKWARDS_FLAG; else resource.search_window_defaults &= ~SETTINGS_BACKWARDS_FLAG; store_preference(NULL, "searchWindowDefaults", "%u", resource.search_window_defaults); } static void cb_wrap_search(Widget w, XtPointer client_data, XtPointer call_data) { struct search_settings *settings = (struct search_settings *)client_data; ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!"); UNUSED(w); UNUSED(call_data); settings->wrap = !settings->wrap; show_settings("cb_wrap_search", settings); if (settings->wrap) resource.search_window_defaults |= SETTINGS_WRAP_FLAG; else resource.search_window_defaults &= ~SETTINGS_WRAP_FLAG; store_preference(NULL, "searchWindowDefaults", "%u", resource.search_window_defaults); } static void cb_match_case(Widget w, XtPointer client_data, XtPointer call_data) { struct search_settings *settings = (struct search_settings *)client_data; ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!"); UNUSED(w); UNUSED(call_data); settings->case_sensitive = !(settings->case_sensitive); show_settings("cb_match_case", settings); if (settings->case_sensitive) resource.search_window_defaults |= SETTINGS_CASE_SENSITIVE_FLAG; else resource.search_window_defaults &= ~SETTINGS_CASE_SENSITIVE_FLAG; store_preference(NULL, "searchWindowDefaults", "%u", resource.search_window_defaults); } static void cb_linebreaks(Widget w, XtPointer client_data, XtPointer call_data) { struct search_settings *settings = (struct search_settings *)client_data; ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!"); UNUSED(w); UNUSED(call_data); settings->ignore_linebreaks = !(settings->ignore_linebreaks); settings->ignore_hyphens = !(settings->ignore_hyphens); show_settings("cb_linebreaks", settings); if (settings->ignore_linebreaks) resource.search_window_defaults |= SETTINGS_IGNORE_LINEBREAKS_FLAG; else resource.search_window_defaults &= ~SETTINGS_IGNORE_LINEBREAKS_FLAG; store_preference(NULL, "searchWindowDefaults", "%u", resource.search_window_defaults); } static void cb_search_cancel(Widget w, XtPointer client_data, XtPointer call_data) { Widget find_popup; struct search_settings *settings = (struct search_settings *)client_data; UNUSED(w); UNUSED(call_data); if (!get_widget_by_name(&find_popup, globals.widgets.top_level, "find_popup", True)) return; /* This flag is checked in the scanning routines, and will be eventually reset by do_pages() in events.c. (The scanning routines musn't reset it, since they might not be called again after this point!) */ globals.ev.flags |= EV_FIND_CANCEL; search_signal_page_changed(); /* Hack to make search restart anew */ search_erase_highlighting(True); if (settings->message_window != 0) { TRACE_GUI((stderr, "kill_message_window: %p\n", (void *)settings->message_window)); kill_message_window(settings->message_window); } XtPopdown(find_popup); m_find_popup_active = False; } static void cb_search_get_term_button(Widget w, XtPointer client_data, XtPointer call_data) { struct search_settings *settings = (struct search_settings *)client_data; char *searchterm = NULL; #if defined(MOTIF) && USE_COMBOBOX struct search_history *hist = NULL; #endif Widget searchbox_input, paned, box; UNUSED(call_data); box = XtParent(w); ASSERT(box != 0, "Parent of button widget mustn't be NULL!"); paned = XtParent(box); ASSERT(paned != 0, "Parent of box widget mustn't be NULL!"); if (!get_widget_by_name(&searchbox_input, paned, Xdvi_SEARCHBOX_INPUT_NAME, True)) return; #ifdef MOTIF # if USE_COMBOBOX { Widget textfield = NULL; XtVaGetValues(searchbox_input, XmNtextField, &textfield, XmNuserData, &hist, NULL); if (textfield == NULL || hist == NULL) { XDVI_ERROR((stderr, "Couldn't get XmNtextField or XmNuserData from combo box widget!\n")); return; } XtVaGetValues(textfield, XmNvalue, &searchterm, NULL); } # else XtVaGetValues(searchbox_input, XmNvalue, &searchterm, NULL); # endif #else XtVaGetValues(searchbox_input, XtNstring, &searchterm, NULL); #endif if (searchterm == NULL) { XDVI_WARNING((stderr, "Searchterm in cb_search_get_term callback shouldn't be NULL!")); return; } TRACE_FIND((stderr, "searchterm1: |%s|", searchterm)); settings->term = searchterm; #if defined(MOTIF) && USE_COMBOBOX search_history_update(hist, searchbox_input, searchterm); #endif cb_search_go(w, settings, NULL); } static void search_cancel(Widget w, XEvent *event, String *params, Cardinal *num_params) { struct search_settings *settings = NULL; void *ptr; UNUSED(event); ASSERT(*num_params > 0, "params in search_cancel must be > 0!"); ASSERT(*params != NULL, "params in search_cancel mustn't be NULL!"); /* * the *params char pointer contains the pointer value (address) of `settings'; * convert it back to a pointer: */ TRACE_GUI((stderr, "Pointer string value: |%s|", *params)); sscanf(*params, "%p", &ptr); settings = (struct search_settings *)ptr; TRACE_GUI((stderr, "Pointer address: |%p|", (void *)settings)); ASSERT(settings != NULL, "Shouldn't happen: Couldn't get string representation of argument pointer."); cb_search_cancel(w, settings, NULL); } #ifdef MOTIF static void cb_search_get_term(Widget w, XtPointer client_data, XtPointer call_data) { struct search_settings *settings = (struct search_settings *)client_data; char *searchterm = NULL; Widget popup, button, textfield; XEvent ev; UNUSED(call_data); TRACE_FIND((stderr, "cb_search_get_term!\n")); #if USE_COMBOBOX UNUSED(w); { Widget combobox; if (!get_widget_by_name(&combobox, globals.widgets.top_level, Xdvi_SEARCHBOX_INPUT_NAME, True) || !get_widget_by_name(&textfield, globals.widgets.top_level, "Text", True)) return; } #else textfield = w; #endif /* retrieve the `Find' button widget */ if (!get_widget_by_name(&popup, globals.widgets.top_level, Xdvi_SEARCH_POPUP_NAME, True) || !get_widget_by_name(&button, popup, "find_button", True)) return; if (settings != NULL) { /* retrieve search term from text input field */ XtVaGetValues(textfield, XmNvalue, &searchterm, NULL); if (searchterm == NULL) { XDVI_WARNING((stderr, "Searchterm in cb_search_get_term callback shouldn't be NULL!")); return; } TRACE_FIND((stderr, "searchterm2: |%s|", searchterm)); settings->term = (const char *)searchterm; } /* make the `Find' button think it got pushed. Also synthesize an event, just to be sure ... */ synthesize_event(&ev, button); XtCallActionProc(button, "ArmAndActivate", &ev, NULL, 0); /* the following don't make the button appear visually pressed: */ /* XtCallCallbacks(button, XmNarmCallback, NULL); */ /* XtCallCallbacks(button, XmNactivateCallback, NULL); */ } static void xm_search_go(Widget w, XEvent *event, String *params, Cardinal *num_params) { struct search_settings *settings = NULL; void *ptr; Widget input; UNUSED(w); UNUSED(event); if (params != NULL) { /* re-initialize search term */ ASSERT(*num_params == 1, "num_params in xm_search_go should be 1 if *params != NULL"); /* * the *params char pointer contains the pointer value (address) of `settings' as a string; * convert it back to a pointer: */ TRACE_GUI((stderr, "Pointer string value: |%s|", *params)); sscanf(*params, "%p", &ptr); settings = (struct search_settings *)ptr; TRACE_GUI((stderr, "Pointer address: |%p|", (void *)settings)); ASSERT(settings != NULL, "Shouldn't happen: Couldn't get string representation of argument pointer."); } if (get_widget_by_name(&input, globals.widgets.top_level, "searchbox_input", True)) { cb_search_get_term(input, settings, NULL); } } #else /* MOTIF */ static void xaw_unset_button(XtPointer client_data, XtIntervalId *id) { XEvent ev; Widget button = (Widget)client_data; UNUSED(id); synthesize_event(&ev, button); XtCallActionProc(button, "unset", &ev, NULL, 0); } static void xaw_search_go(Widget w, XEvent *event, String *params, Cardinal *num_params) { struct search_settings *settings = NULL; void *ptr; char *searchterm = NULL; Widget button, input; XtIntervalId timeout; UNUSED(w); if (!get_widget_by_name(&button, globals.widgets.top_level, "find_button", True) || !get_widget_by_name(&input, globals.widgets.top_level, "searchbox_input", True)) return; XtVaGetValues(input, XtNstring, &searchterm, NULL); if (searchterm == NULL) { XDVI_WARNING((stderr, "Searchterm in xaw_search_go callback shouldn't be NULL!")); return; } if (params != NULL) { /* re-initialize search term */ ASSERT(*num_params == 1, "num_params in xaw_search_go should be 1 if *params != NULL"); /* * the *params char pointer contains the pointer value (address) of `settings'; * convert it back to a pointer: */ TRACE_GUI((stderr, "Pointer string value: |%s|", *params)); sscanf(*params, "%p", &ptr); settings = (struct search_settings *)ptr; TRACE_GUI((stderr, "Pointer address: |%p|", (void *)settings)); ASSERT(settings != NULL, "Shouldn't happen: Couldn't get string representation of argument pointer."); settings->term = (const char *)searchterm; } /* * Again, we want the button to appear activated when is pressed. * For this, we explicitly invoke set()notify(), and unset() after a timeout * of 150 milliseconds, which seems to correspond to the Motif default. */ XtCallActionProc(button, "set", event, NULL, 0); XtCallActionProc(button, "notify", event, NULL, 0); XSync(DISP, False); timeout = XtAppAddTimeOut(globals.app, 150, xaw_unset_button, (XtPointer)button); } /* * Restart search from within another popup (confirmation) window. */ static void xaw_search_restart(Widget w, XEvent *event, String *params, Cardinal *num_params) { void *ptr; struct search_settings *settings; UNUSED(event); UNUSED(w); ASSERT(*num_params > 0, "params in xaw_search_restart must be > 0!"); ASSERT(*params != NULL, "params in xaw_search_restart mustn't be NULL!"); TRACE_GUI((stderr, "Pointer string value: |%s|", *params)); sscanf(*params, "%p", &ptr); settings = (struct search_settings *)ptr; search_restart((XtPointer)settings); } static XtActionsRec xaw_search_actions[] = { { "do-search-restart", xaw_search_restart }, { "do-search", xaw_search_go }, }; #endif /* MOTIF */ static XtActionsRec search_actions[] = { { "do-search", #ifdef MOTIF xm_search_go #else xaw_search_go #endif }, { "cancel-search", search_cancel }, }; static Widget create_search_window(struct search_settings *settings) { Widget top_level_shell; Atom WM_DELETE_WINDOW; Widget form, find_paned, box; unsigned char curr_state; #if defined(MOTIF) && USE_COMBOBOX static struct search_history hist = { NULL, 0, True }; #endif Widget searchbox_form, searchbox_label, searchbox_input; /* left and right column */ Widget options_left_form, options_right_form; /* checkboxes in left column */ Widget regexp_checkbox, matchcase_checkbox, backwards_checkbox, wrap_checkbox; /* checkboxes in right column */ Widget linebreaks_checkbox; Widget find_button, cancel_button; XtTranslations xlats; char *translation_str = NULL; #ifdef MOTIF XmString str; #else /* MOTIF */ XtTranslations wm_translations; int ddist; #endif XtAddActions(search_actions, XtNumber(search_actions)); #ifndef MOTIF XtAddActions(xaw_search_actions, XtNumber(xaw_search_actions)); #define HORIZONTAL_RESIZING_NO XtNleft, XtChainLeft, XtNright, XtChainLeft #define HORIZONTAL_RESIZING_YES XtNleft, XtChainLeft, XtNright, XtChainRight #define VERTICAL_RESIZING_NO XtNtop, XtChainTop, XtNbottom, XtChainTop /* * hacky: Since translations can only contain strings, pass * the pointer address as string in the callback. But the only * portability problem should be the size of the pointer * representation, and we deal with that by using VSNPRINTF(). */ translation_str = get_string_va("WM_PROTOCOLS: cancel-search(%p)\nCtrlg:find-next()", (void *)settings); wm_translations = XtParseTranslationTable(translation_str); free(translation_str); translation_str = NULL; #endif /* not MOTIF */ translation_str = get_string_va( #ifdef MOTIF "osfCancel:cancel-search(%p)\n" #else "Escape:cancel-search(%p)\n" #endif "Return:do-search(%p)\n" "Ctrlg:find-next()", (void *)settings, (void *)settings); xlats = XtParseTranslationTable(translation_str); free(translation_str); top_level_shell = XtVaCreatePopupShell("find_popup", SHELL_WIDGET, globals.widgets.top_level, XtNtitle, "xdvik: Find in File", XtNmappedWhenManaged, False, /* so that we can center it first */ XtNtransientFor, globals.widgets.top_level, XtNallowShellResize, True, #ifdef MOTIF XmNdeleteResponse, XmDO_NOTHING, /* we'll take care of that ourselves */ #else XtNtranslations, wm_translations, #endif NULL); TRACE_GUI((stderr, "toplevel: %ld", (unsigned long)top_level_shell)); WM_DELETE_WINDOW = XInternAtom(XtDisplay(top_level_shell), "WM_DELETE_WINDOW", False); #ifdef MOTIF XmAddWMProtocolCallback(top_level_shell, WM_DELETE_WINDOW, cb_search_cancel, settings); #endif find_paned = XtVaCreateWidget("find_paned", PANED_WIDGET, top_level_shell, #ifdef MOTIF /* make sashes invisible */ XmNsashWidth, 1, XmNsashHeight, 1, #endif NULL); form = XtVaCreateWidget("form", FORM_WIDGET, find_paned, #ifdef MOTIF XmNhorizontalSpacing, DDIST_MAJOR, XmNverticalSpacing, DDIST_MAJOR, XmNautoUnmanage, False, #else XtNallowResize, True, #endif NULL); #ifdef MOTIF str = XmStringCreateLocalized("Find:"); #else XtVaGetValues(form, XtNdefaultDistance, &ddist, NULL); #endif /* search term input field */ searchbox_form = XtVaCreateWidget("searchbox_form", FORM_WIDGET, form, #ifdef MOTIF XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNhorizontalSpacing, DDIST, XmNverticalSpacing, DDIST, #else XtNborderWidth, 0, HORIZONTAL_RESIZING_YES, #endif NULL); searchbox_label = XtVaCreateManagedWidget("searchbox_label", LABEL_WIDGET, searchbox_form, #ifdef MOTIF XmNlabelString, str, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNalignment, XmALIGNMENT_BEGINNING, #else XtNlabel, "Find:", XtNborderWidth, 0, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, #endif NULL); #if defined(MOTIF) && USE_COMBOBOX { Widget textfield = NULL; Widget grab_shell = NULL; size_t n; XmStringTable items; search_history_init(&hist); /* initialize Motif string list */ n = hist.item_cnt == 0 ? 1 : hist.item_cnt; items = (XmStringTable)XtMalloc(n * sizeof(XmString *)); if (hist.item_cnt == 0) items[0] = XmStringCreateLocalized(Xdvi_HISTORY_EMPTY_MARKER); else { for (n = 0; hist.char_items[n] != NULL; n++) items[n] = XmStringCreateLocalized(hist.char_items[n]); } searchbox_input = XtVaCreateManagedWidget(Xdvi_SEARCHBOX_INPUT_NAME, xmComboBoxWidgetClass, searchbox_form, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, searchbox_label, XmNbottomAttachment, XmATTACH_FORM, XmNcomboBoxType, XmDROP_DOWN_COMBO_BOX, XmNitems, items, XmNitemCount, n, /* XmONE_BASED so that we can distinguish between keyboard entry and selection from popdown list */ XmNpositionMode, XmONE_BASED, /* XmNitemCount, hist.item_cnt, */ /* XmNvisibleItemCount, hist.item_cnt, */ XmNuserData, &hist, XmNarrowSize, Xdvi_COMBO_BOX_ARROW_SIZE, NULL); if (resource.search_history_size < 10) { /* usually the dropdown list shows 10 entries */ XtVaSetValues(searchbox_input, XmNvisibleItemCount, resource.search_history_size, NULL); } /* free Motif strings */ if (hist.item_cnt == 0) XmStringFree(items[0]); else { for (n = 0; hist.char_items[n] != NULL; n++) XmStringFree(items[n]); } XtFree((XtPointer)items); /* start with empty search field */ XtVaGetValues(searchbox_input, XmNtextField, &textfield, NULL); if (textfield == NULL) XDVI_ERROR((stderr, "Couldn't get textfield from combo box widget!\n")); if (settings->term != NULL) { XtVaSetValues(textfield, XmNvalue, settings->term, NULL); } else { XtVaSetValues(textfield, XmNvalue, "", NULL); } XtAddCallback(textfield, XmNactivateCallback, cb_search_get_term, settings); XtAddCallback(searchbox_input, XmNselectionCallback, cb_search_history_select, (XtPointer)settings); XtOverrideTranslations(textfield, xlats); /* workaround for pointer grabbing bug (see xm_menu.c) */ if (get_widget_by_name(&grab_shell, searchbox_input, "GrabShell", True)) { XtAddCallback(grab_shell, XtNpopdownCallback, popdown_callback, NULL); } } #else /* defined(MOTIF) && USE_COMBOBOX */ searchbox_input = XtVaCreateManagedWidget(Xdvi_SEARCHBOX_INPUT_NAME, TEXT_WIDGET, searchbox_form, #ifdef MOTIF XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, searchbox_label, XmNbottomAttachment, XmATTACH_FORM, #else XtNwidth, 260, XtNdataCompression, False, XtNeditType, XawtextEdit, XtNfromHoriz, searchbox_label, HORIZONTAL_RESIZING_YES, VERTICAL_RESIZING_NO, #endif NULL); #ifdef MOTIF XtAddCallback(searchbox_input, XmNactivateCallback, cb_search_get_term, settings); #endif if (settings->term != NULL) { XtVaSetValues(searchbox_input, #ifdef MOTIF XmNvalue, #else XtNstring, #endif settings->term, NULL); } #endif /* defined(MOTIF) && USE_COMBOBOX */ XtManageChild(searchbox_form); /* Fix for #1499566: Force input focus for text input field */ #ifndef MOTIF XtSetKeyboardFocus(find_paned, searchbox_input); #endif /* * form for left row of options checkbuttons */ options_left_form = XtVaCreateManagedWidget("options_left_form", FORM_WIDGET, form, #ifdef MOTIF XmNhorizontalSpacing, DDIST, XmNverticalSpacing, DDIST, XmNresizable, True, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, searchbox_form, XmNleftAttachment, XmATTACH_FORM, /* XmNrightAttachment, XmATTACH_FORM, */ /* XmNbottomAttachment, XmATTACH_FORM, */ #else XtNborderWidth, 0, XtNfromVert, searchbox_form, HORIZONTAL_RESIZING_NO, #endif NULL); /* * form for right row of options checkbuttons */ options_right_form = XtVaCreateManagedWidget("options_right_form", FORM_WIDGET, form, #ifdef MOTIF XmNhorizontalSpacing, DDIST, XmNverticalSpacing, DDIST, XmNresizable, True, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, searchbox_form, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, options_left_form, XmNrightAttachment, XmATTACH_FORM, /* XmNbottomAttachment, XmATTACH_FORM, */ #else XtNborderWidth, 0, XtNfromVert, searchbox_form, XtNfromHoriz, options_left_form, HORIZONTAL_RESIZING_NO, #endif NULL); #ifdef MOTIF XmStringFree(str); str = XmStringCreateLocalized("Regular expression"); #endif regexp_checkbox = XtVaCreateManagedWidget("regexp_checkbox", CHECKBOX_WIDGET, options_left_form, #ifdef MOTIF XmNlabelString, str, XmNindicatorType, XmN_OF_MANY, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, #else XtNlabel, "Regular expression", XtNborderWidth, 0, XtNisRadio, False, XtNhighlightThickness, 1, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, #endif NULL); XtAddCallback(regexp_checkbox, VALUE_CALLBACK_NAME, cb_regexp_search, settings); #ifdef MOTIF XmStringFree(str); str = XmStringCreateLocalized("Find backwards"); #endif backwards_checkbox = XtVaCreateManagedWidget("backwards_checkbox", CHECKBOX_WIDGET, options_left_form, #ifdef MOTIF XmNlabelString, str, XmNindicatorType, XmN_OF_MANY, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, regexp_checkbox, XmNleftAttachment, XmATTACH_FORM, #else XtNlabel, "Find backwards", XtNfromVert, regexp_checkbox, XtNborderWidth, 0, XtNisRadio, False, XtNhighlightThickness, 1, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, #endif NULL); XtAddCallback(backwards_checkbox, VALUE_CALLBACK_NAME, cb_backwards_search, settings); #ifdef MOTIF XmStringFree(str); str = XmStringCreateLocalized("Wrap search"); #endif wrap_checkbox = XtVaCreateManagedWidget("backwards_checkbox", CHECKBOX_WIDGET, options_left_form, #ifdef MOTIF XmNlabelString, str, XmNindicatorType, XmN_OF_MANY, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, backwards_checkbox, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, #else XtNlabel, "Wrap search", XtNfromVert, backwards_checkbox, XtNborderWidth, 0, XtNisRadio, False, XtNhighlightThickness, 1, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, #endif NULL); XtAddCallback(wrap_checkbox, VALUE_CALLBACK_NAME, cb_wrap_search, settings); #ifdef MOTIF XmStringFree(str); str = XmStringCreateLocalized("Case sensitive"); #endif matchcase_checkbox = XtVaCreateManagedWidget("matchcase_checkbox", CHECKBOX_WIDGET, options_right_form, #ifdef MOTIF XmNlabelString, str, XmNindicatorType, XmN_OF_MANY, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, #else XtNlabel, "Case sensitive", XtNborderWidth, 0, XtNisRadio, False, XtNhighlightThickness, 1, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, #endif NULL); XtAddCallback(matchcase_checkbox, VALUE_CALLBACK_NAME, cb_match_case, settings); #ifdef MOTIF XmStringFree(str); str = XmStringCreateLocalized("Ignore newlines/hyphens"); #endif linebreaks_checkbox = XtVaCreateManagedWidget("linebreaks_checkbox", CHECKBOX_WIDGET, options_right_form, #ifdef MOTIF XmNlabelString, str, XmNindicatorType, XmN_OF_MANY, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, matchcase_checkbox, XmNleftAttachment, XmATTACH_FORM, #else XtNlabel, "Ignore newlines/hyphens", XtNfromVert, matchcase_checkbox, XtNborderWidth, 0, XtNisRadio, False, XtNhighlightThickness, 1, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, #endif NULL); XtAddCallback(linebreaks_checkbox, VALUE_CALLBACK_NAME, cb_linebreaks, settings); /* * box for Find/Cancel buttons */ box = XtVaCreateManagedWidget("box", FORM_WIDGET, find_paned, #ifdef MOTIF XmNskipAdjust, True, /* don't resize this area */ #else /* resizing by user isn't needed */ XtNshowGrip, False, XtNdefaultDistance, 6, /* some padding */ /* resizing the window shouldn't influence this box, * but only the pane widget */ XtNskipAdjust, True, XtNaccelerators, G_accels_cr, #endif NULL); #ifdef MOTIF XmStringFree(str); str = XmStringCreateLocalized("Find"); #endif find_button = XtVaCreateManagedWidget("find_button", PUSHBUTTON_WIDGET, box, #ifdef MOTIF XmNlabelString, str, XmNshowAsDefault, True, XmNdefaultButtonShadowThickness, 1, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, /* to mimick appearance of native dialog buttons: */ XmNmarginWidth, 6, XmNmarginHeight, 4, XmNtopOffset, 10, XmNbottomOffset, 10, XmNleftOffset, 10, #else XtNlabel, "Find", XtNaccelerators, G_accels_cr, XtNtop, XtChainTop, XtNbottom, XtChainBottom, HORIZONTAL_RESIZING_NO, #endif NULL); #ifdef MOTIF XmStringFree(str); str = XmStringCreateLocalized("Cancel"); #endif cancel_button = XtVaCreateManagedWidget("cancel_button", PUSHBUTTON_WIDGET, box, #ifdef MOTIF XmNlabelString, str, XmNdefaultButtonShadowThickness, 1, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, /* to mimick appearance of native dialog buttons: */ XmNmarginWidth, 6, XmNmarginHeight, 4, XmNtopOffset, 10, XmNbottomOffset, 10, XmNrightOffset, 10, #else XtNlabel, "Cancel", XtNfromHoriz, find_button, XtNbottom, XtChainBottom, XtNjustify, XtJustifyRight, XtNleft, XtChainRight, XtNright, XtChainRight, #endif NULL); #ifdef MOTIF XmStringFree(str); #endif XtAddCallback(cancel_button, ACTIVATE_CALLBACK_NAME, cb_search_cancel, settings); XtAddCallback(find_button, ACTIVATE_CALLBACK_NAME, cb_search_get_term_button, settings); XtOverrideTranslations(searchbox_form, xlats); XtOverrideTranslations(options_left_form, xlats); XtOverrideTranslations(options_right_form, xlats); XtOverrideTranslations(regexp_checkbox, xlats); XtOverrideTranslations(matchcase_checkbox, xlats); XtOverrideTranslations(backwards_checkbox, xlats); XtOverrideTranslations(box, xlats); XtOverrideTranslations(find_button, xlats); XtOverrideTranslations(cancel_button, xlats); XtOverrideTranslations(searchbox_input, xlats); /* following doesn't help to force input to textbox in xaw: */ /* XtInstallAllAccelerators(find_paned, find_paned); */ /* XtInstallAllAccelerators(searchbox_input, find_paned); */ XtManageChild(form); XtManageChild(find_paned); { /* set all buttons to same size */ Dimension w1, w2, max; XtVaGetValues(find_button, XtNwidth, &w1, NULL); XtVaGetValues(cancel_button, XtNwidth, &w2, NULL); max = MAX(w1, w2); XtVaSetValues(find_button, XtNwidth, max, NULL); XtVaSetValues(cancel_button, XtNwidth, max, NULL); } XtManageChild(top_level_shell); /* don't center this one - would just get in the way in this case. */ /* center_window(top_level_shell, globals.widgets.top_level); */ XtPopup(top_level_shell, XtGrabNone); m_find_popup_active = True; #ifdef MOTIF XmProcessTraversal(searchbox_input, XmTRAVERSE_CURRENT); /* XmProcessTraversal(find_button, XmTRAVERSE_CURRENT); */ #endif XSetWMProtocols(XtDisplay(top_level_shell), XtWindow(top_level_shell), &WM_DELETE_WINDOW, 1); /* check if we have default values from resource.search_window_defaults */ if (resource.search_window_defaults & SETTINGS_USE_REGEXP_FLAG) XtVaSetValues(regexp_checkbox, CHECKBUTTON_IS_SET, True, NULL); if (resource.search_window_defaults & SETTINGS_CASE_SENSITIVE_FLAG) XtVaSetValues(matchcase_checkbox, CHECKBUTTON_IS_SET, True, NULL); if (resource.search_window_defaults & SETTINGS_BACKWARDS_FLAG) XtVaSetValues(backwards_checkbox, CHECKBUTTON_IS_SET, True, NULL); if (resource.search_window_defaults & SETTINGS_IGNORE_LINEBREAKS_FLAG) XtVaSetValues(linebreaks_checkbox, CHECKBUTTON_IS_SET, True, NULL); if (resource.search_window_defaults & SETTINGS_WRAP_FLAG) XtVaSetValues(wrap_checkbox, CHECKBUTTON_IS_SET, True, NULL); /* initialize `settings' values according to the checkbox states (in case user has assigned values via X defaults): */ XtVaGetValues(regexp_checkbox, CHECKBUTTON_IS_SET, &curr_state, NULL); settings->use_regexp = curr_state; XtVaGetValues(matchcase_checkbox, CHECKBUTTON_IS_SET, &curr_state, NULL); settings->case_sensitive = curr_state; XtVaGetValues(wrap_checkbox, CHECKBUTTON_IS_SET, &curr_state, NULL); settings->wrap = curr_state; XtVaGetValues(backwards_checkbox, CHECKBUTTON_IS_SET, &curr_state, NULL); settings->direction = curr_state ? SEARCH_UP : SEARCH_DOWN; XtVaGetValues(linebreaks_checkbox, CHECKBUTTON_IS_SET, &curr_state, NULL); settings->ignore_hyphens = settings->ignore_linebreaks = curr_state; #ifndef MOTIF #undef HORIZONTAL_RESIZING_NO #undef HORIZONTAL_RESIZING_YES #undef VERTICAL_RESIZING_NO #endif /* MOTIF */ return top_level_shell; } void dvi_find_string(const char *str, Boolean find_next) { /* Synthesize a RET keystroke for the find dialog. * Also pops up the find dialog, to make it easier for user to * edit options, change direction etc. */ Widget find_popup; if (!get_widget_by_name(&find_popup, globals.widgets.top_level, "find_popup", False)) { static struct search_settings settings; static struct search_info searchinfo = { False, False, False, 0, 0, 0, 0 }; settings.term = str; settings.use_regexp = False; settings.case_sensitive = False; settings.direction = SEARCH_DOWN; settings.ignore_hyphens = False; settings.ignore_linebreaks = False; settings.wrap = False; settings.isearchterm = NULL; settings.wrapcnt = 0; settings.x_pos = -1; settings.y_pos = -1; settings.searchinfo = &searchinfo; settings.hyphen_delta = 0; find_popup = create_search_window(&settings); if (find_next) return; } else if (str != NULL) { /* change the search term */ Widget searchbox_input; if (!get_widget_by_name(&searchbox_input, find_popup, "searchbox_input", True)) return; XtVaSetValues(searchbox_input, #ifdef MOTIF XmNvalue, #else XtNstring, #endif str, NULL); } if (m_find_popup_active) { XRaiseWindow(DISP, XtWindow(find_popup)); } else { XtPopup(find_popup, XtGrabNone); m_find_popup_active = True; } if (str != NULL || find_next) { #ifdef MOTIF xm_search_go(NULL, NULL, NULL, NULL); #else xaw_search_go(NULL, NULL, NULL, NULL); #endif } } xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/sfPath.c0000664000175000017500000004342311276240141020344 0ustar uwabamiuwabami/* * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Software Research Associates not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. Software Research Associates * makes no representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * * Author: Erik M. van der Poel * Software Research Associates, Inc., Tokyo, Japan * erik@sra.co.jp */ #include "xdvi-config.h" #include "kpathsea/c-auto.h" #include "kpathsea/config.h" #include "kpathsea/c-stat.h" #include "xdvi.h" #include "sfDir.h" #include "sfDraw.h" #include "sfPath.h" #include "sfSelFile.h" #if !defined(MOTIF) /* entire file */ #include #include #include #include #include #include #include #include #ifdef SEL_FILE_IGNORE_CASE #include #endif /* def SEL_FILE_IGNORE_CASE */ #ifndef S_IXUSR #define S_IXUSR 0100 #endif #ifndef S_IXGRP #define S_IXGRP 0010 #endif #ifndef S_IXOTH #define S_IXOTH 0001 #endif #define S_ISXXX(m) ((m) & (S_IXUSR | S_IXGRP | S_IXOTH)) #include #include #include typedef struct { const char *name; const char *dir; } SFLogin; SFDir *SFdirs = NULL; int SFdirEnd; int SFdirPtr; int SFbuttonPressed = 0; static int SFdoNotTouchDirPtr = 0; static int SFdoNotTouchVorigin = 0; static SFDir SFrootDir, SFhomeDir; static SFLogin *SFlogins; static int SFtwiddle = 0; int SFchdir(const char *path) { int result; result = 0; if (strcmp(path, SFcurrentDir)) { result = chdir(path); if (!result) { (void)strcpy(SFcurrentDir, path); } } return result; } static void SFfree(int i) { SFDir *dir; int j; dir = &(SFdirs[i]); for (j = dir->nEntries - 1; j >= 0; j--) { if (dir->entries[j].shown != dir->entries[j].real) { XtFree(dir->entries[j].shown); } XtFree(dir->entries[j].real); } XtFree((char *)dir->entries); XtFree(dir->dir); dir->dir = NULL; } static char * SFstrdup(const char *s2) { char *s1 = strcpy(XtMalloc((unsigned)(strlen(s2) + 1)), s2); return s1; } static void SFunreadableDir(SFDir *dir) { const char *cannotOpen = " "; dir->entries = (SFEntry *) XtMalloc(sizeof(SFEntry)); dir->entries[0].statDone = 1; dir->entries[0].real = SFstrdup(cannotOpen); dir->entries[0].shown = dir->entries[0].real; dir->nEntries = 1; dir->nChars = strlen(cannotOpen); } #ifdef SEL_FILE_IGNORE_CASE static SFstrncmp(char *p, char *q, int n) { char c1, c2; char *psave, *qsave; int nsave; psave = p; qsave = q; nsave = n; c1 = *p++; if (islower(c1)) { c1 = toupper(c1); } c2 = *q++; if (islower(c2)) { c2 = toupper(c2); } while ((--n >= 0) && (c1 == c2)) { if (!c1) { return strncmp(psave, qsave, nsave); } c1 = *p++; if (islower(c1)) { c1 = toupper(c1); } c2 = *q++; if (islower(c2)) { c2 = toupper(c2); } } if (n < 0) { return strncmp(psave, qsave, nsave); } return c1 - c2; } #endif /* def SEL_FILE_IGNORE_CASE */ static void SFreplaceText(SFDir *dir, char *str) { int len; *(dir->path) = 0; len = strlen(str); if (str[len - 1] == '/') { (void)strcat(SFcurrentPath, str); } else { (void)strncat(SFcurrentPath, str, len - 1); } /* if (strncmp(SFcurrentPath, SFstartDir, strlen(SFstartDir))) { */ /* SFsetText(SFcurrentPath); */ /* } */ /* else { */ /* SFsetText(&(SFcurrentPath[strlen(SFstartDir)])); */ /* } */ SFsetText(SFcurrentPath); SFtextChanged(); } static void SFexpand(char *str) { int len; int cmp; char *name, *growing; SFDir *dir; SFEntry *entry, *max; len = strlen(str); dir = &(SFdirs[SFdirEnd - 1]); if (dir->beginSelection == -1) { str = SFstrdup(str); SFreplaceText(dir, str); XtFree(str); return; } else if (dir->beginSelection == dir->endSelection) { SFreplaceText(dir, dir->entries[dir->beginSelection].shown); return; } max = &(dir->entries[dir->endSelection + 1]); name = dir->entries[dir->beginSelection].shown; growing = SFstrdup(name); cmp = 0; while (!cmp) { entry = &(dir->entries[dir->beginSelection]); while (entry < max) { if ((cmp = strncmp(growing, entry->shown, len))) { break; } entry++; } len++; } /* * SFreplaceText() expects filename */ growing[len - 2] = ' '; growing[len - 1] = 0; SFreplaceText(dir, growing); XtFree(growing); } static int SFfindFile(SFDir *dir, char *str) { int i, last, max; char *name, save; SFEntry *entries; int len; int begin, end; int result; len = strlen(str); if (str[len - 1] == ' ') { SFexpand(str); return 1; } else if (str[len - 1] == '/') { len--; } max = dir->nEntries; entries = dir->entries; i = 0; while (i < max) { name = entries[i].shown; last = strlen(name) - 1; save = name[last]; name[last] = 0; #ifdef SEL_FILE_IGNORE_CASE result = SFstrncmp(str, name, len); #else /* def SEL_FILE_IGNORE_CASE */ result = strncmp(str, name, len); #endif /* def SEL_FILE_IGNORE_CASE */ name[last] = save; if (result <= 0) { break; } i++; } begin = i; while (i < max) { name = entries[i].shown; last = strlen(name) - 1; save = name[last]; name[last] = 0; #ifdef SEL_FILE_IGNORE_CASE result = SFstrncmp(str, name, len); #else /* def SEL_FILE_IGNORE_CASE */ result = strncmp(str, name, len); #endif /* def SEL_FILE_IGNORE_CASE */ name[last] = save; if (result) { break; } i++; } end = i; if (begin != end) { if ((dir->beginSelection != begin) || (dir->endSelection != end - 1) ) { dir->changed = 1; dir->beginSelection = begin; if (str[strlen(str) - 1] == '/') { dir->endSelection = begin; } else { dir->endSelection = end - 1; } } } else { if (dir->beginSelection != -1) { dir->changed = 1; dir->beginSelection = -1; dir->endSelection = -1; } } if (SFdoNotTouchVorigin || ((begin > dir->vOrigin) && (end < dir->vOrigin + SFlistSize))) { SFdoNotTouchVorigin = 0; return 0; } i = begin - 1; if (i > max - SFlistSize) { i = max - SFlistSize; } if (i < 0) { i = 0; } if (dir->vOrigin != i) { dir->vOrigin = i; dir->changed = 1; } return 0; } static void SFunselect(void) { SFDir *dir; dir = &(SFdirs[SFdirEnd - 1]); if (dir->beginSelection != -1) { dir->changed = 1; } dir->beginSelection = -1; dir->endSelection = -1; } static int SFcompareLogins(const void *vp, const void *vq) { const SFLogin *p = vp; const SFLogin *q = vq; return strcmp(p->name, q->name); } static void SFgetHomeDirs(void) { struct passwd *pw; int alloc; int i; SFEntry *entries = NULL; int len; int maxChars; { alloc = 1; i = 1; entries = (SFEntry *) XtMalloc(sizeof(SFEntry)); SFlogins = (SFLogin *) XtMalloc(sizeof(SFLogin)); entries[0].real = XtMalloc(3); (void)strcpy(entries[0].real, "~"); entries[0].shown = entries[0].real; entries[0].statDone = 1; SFlogins[0].name = ""; pw = getpwuid((int)getuid()); SFlogins[0].dir = SFstrdup(pw ? pw->pw_dir : "/"); maxChars = 0; } (void)setpwent(); while ((pw = (struct passwd *)getpwent()) && (*(pw->pw_name))) { if (i >= alloc) { alloc *= 2; entries = (SFEntry *) XtRealloc( (char *)entries, (unsigned)(alloc * sizeof(SFEntry))); SFlogins = (SFLogin *) XtRealloc((char *)SFlogins, (unsigned)(alloc * sizeof(SFLogin)) ); } len = strlen(pw->pw_name); entries[i].real = XtMalloc((unsigned)(len + 3)); (void)strcat(strcpy(entries[i].real, "~"), pw->pw_name); entries[i].shown = entries[i].real; entries[i].statDone = 1; if (len > maxChars) { maxChars = len; } SFlogins[i].name = SFstrdup(pw->pw_name); SFlogins[i].dir = SFstrdup(pw->pw_dir); i++; } SFhomeDir.dir = XtMalloc(1); SFhomeDir.dir[0] = 0; SFhomeDir.path = SFcurrentPath; SFhomeDir.entries = entries; SFhomeDir.nEntries = i; SFhomeDir.vOrigin = 0; /* :-) */ SFhomeDir.nChars = maxChars + 2; SFhomeDir.hOrigin = 0; SFhomeDir.changed = 1; SFhomeDir.beginSelection = -1; SFhomeDir.endSelection = -1; #if defined(SVR4) || defined(SYSV) || defined(USG) qsort((char *)entries, (unsigned)i, sizeof(SFEntry), SFcompareEntries); qsort((char *)SFlogins, (unsigned)i, sizeof(SFLogin), SFcompareLogins); #else /* defined(SVR4) || defined(SYSV) || defined(USG) */ qsort((char *)entries, i, sizeof(SFEntry), SFcompareEntries); qsort((char *)SFlogins, i, sizeof(SFLogin), SFcompareLogins); #endif /* defined(SVR4) || defined(SYSV) || defined(USG) */ for (i--; i >= 0; i--) { (void)strcat(entries[i].real, "/"); } } static int SFfindHomeDir(char *begin, char *end) { char save; char *theRest; int i; save = *end; *end = 0; for (i = SFhomeDir.nEntries - 1; i >= 0; i--) { if (!strcmp(SFhomeDir.entries[i].real, begin)) { *end = save; theRest = SFstrdup(end); (void)strcat(strcat(strcpy(SFcurrentPath, SFlogins[i].dir), "/"), theRest); XtFree(theRest); SFsetText(SFcurrentPath); SFtextChanged(); return 1; } } *end = save; return 0; } void SFupdatePath(void) { static int alloc; static int wasTwiddle = 0; char *begin, *end; int i, j; int prevChange; int SFdirPtrSave, SFdirEndSave; SFDir *dir; if (!SFdirs) { SFdirs = (SFDir *) XtMalloc((alloc = 10) * sizeof(SFDir)); dir = &(SFdirs[0]); dir->dir = SFstrdup("/"); (void)SFchdir("/"); (void)SFgetDir(dir); for (j = 1; j < alloc; j++) { SFdirs[j].dir = NULL; } dir->path = SFcurrentPath + 1; dir->vOrigin = 0; dir->hOrigin = 0; dir->changed = 1; dir->beginSelection = -1; dir->endSelection = -1; SFhomeDir.dir = NULL; } SFdirEndSave = SFdirEnd; SFdirEnd = 1; SFdirPtrSave = SFdirPtr; SFdirPtr = 0; begin = NULL; if (SFcurrentPath[0] == '~') { if (!SFtwiddle) { SFtwiddle = 1; dir = &(SFdirs[0]); SFrootDir = *dir; if (!SFhomeDir.dir) { SFgetHomeDirs(); } *dir = SFhomeDir; dir->changed = 1; } end = SFcurrentPath; SFdoNotTouchDirPtr = 1; wasTwiddle = 1; } else { if (SFtwiddle) { SFtwiddle = 0; dir = &(SFdirs[0]); *dir = SFrootDir; dir->changed = 1; } end = SFcurrentPath + 1; } i = 0; prevChange = 0; while (*end) { while (*end++ == '/') { ; } end--; begin = end; while ((*end) && (*end++ != '/')) { ; } if ((end - SFcurrentPath <= SFtextPos) && (*(end - 1) == '/')) { SFdirPtr = i - 1; if (SFdirPtr < 0) { SFdirPtr = 0; } } if (*begin) { if (*(end - 1) == '/') { char save = *end; if (SFtwiddle) { if (SFfindHomeDir(begin, end)) { return; } } *end = 0; i++; SFdirEnd++; if (i >= alloc) { SFdirs = (SFDir *) XtRealloc( (char *)SFdirs, (unsigned)((alloc *= 2) * sizeof(SFDir)) ); for (j = alloc / 2; j < alloc; j++) { SFdirs[j].dir = NULL; } } dir = &(SFdirs[i]); if ((!(dir->dir)) || prevChange || strcmp(dir->dir, begin) ) { if (dir->dir) { SFfree(i); } prevChange = 1; dir->dir = SFstrdup(begin); dir->path = end; dir->vOrigin = 0; dir->hOrigin = 0; dir->changed = 1; dir->beginSelection = -1; dir->endSelection = -1; (void)SFfindFile(dir - 1, begin); if (SFchdir(SFcurrentPath) || SFgetDir(dir) ) { SFunreadableDir(dir); break; } } *end = save; if (!save) { SFunselect(); } } else { if (SFfindFile(&(SFdirs[SFdirEnd - 1]), begin)) { return; } } } else { SFunselect(); } } if ((end == SFcurrentPath + 1) && (!SFtwiddle)) { SFunselect(); } for (i = SFdirEnd; i < alloc; i++) { if (SFdirs[i].dir) { SFfree(i); } } if (SFdoNotTouchDirPtr) { if (wasTwiddle) { wasTwiddle = 0; SFdirPtr = SFdirEnd - 2; if (SFdirPtr < 0) { SFdirPtr = 0; } } else { SFdirPtr = SFdirPtrSave; } SFdoNotTouchDirPtr = 0; } if ((SFdirPtr != SFdirPtrSave) || (SFdirEnd != SFdirEndSave)) { XawScrollbarSetThumb(selFileHScroll, (double)(SFdirPtr) / SFdirEnd, (double)(SFdirEnd < 3 ? SFdirEnd : 3) / SFdirEnd); } if (SFdirPtr != SFdirPtrSave) { SFdrawLists(SF_DO_SCROLL); } else { for (i = 0; i < 3; i++) { if (SFdirPtr + i < SFdirEnd) { if (SFdirs[SFdirPtr + i].changed) { SFdirs[SFdirPtr + i].changed = 0; SFdrawList(i, SF_DO_SCROLL); } } else { SFclearList(i, SF_DO_SCROLL); } } } } void SFsetText(char *path) { XawTextBlock text; text.firstPos = 0; text.length = strlen(path); text.ptr = path; text.format = FMT8BIT; XawTextReplace(selFileField, 0, strlen(SFtextBuffer), &text); XawTextSetInsertionPoint(selFileField, strlen(SFtextBuffer)); } void SFbuttonPressList(Widget w, int n, XButtonPressedEvent *event) { UNUSED(w); UNUSED(n); UNUSED(event); SFbuttonPressed = 1; } void SFbuttonReleaseList(Widget w, int n, XButtonReleasedEvent *event) { SFDir *dir; SFbuttonPressed = 0; if (SFcurrentInvert[n] != -1) { if (n < 2) { SFdoNotTouchDirPtr = 1; } SFdoNotTouchVorigin = 1; dir = &(SFdirs[SFdirPtr + n]); SFreplaceText(dir, dir->entries[dir->vOrigin + SFcurrentInvert[n]].shown); SFmotionList(w, n, (XMotionEvent *)event); } } static int SFcheckDir(int n, SFDir *dir) { struct stat statBuf; int i; if ((!stat(".", &statBuf)) && (statBuf.st_mtime != dir->mtime) ) { /* * If the pointer is currently in the window that we are about * to update, we must warp it to prevent the user from * accidentally selecting the wrong file. */ if (SFcurrentInvert[n] != -1) { XWarpPointer(SFdisplay, None, XtWindow(selFileLists[n]), 0, 0, 0, 0, 0, 0); } for (i = dir->nEntries - 1; i >= 0; i--) { if (dir->entries[i].shown != dir->entries[i].real) { XtFree(dir->entries[i].shown); } XtFree(dir->entries[i].real); } XtFree((char *)dir->entries); if (SFgetDir(dir)) { SFunreadableDir(dir); } if (dir->vOrigin > dir->nEntries - SFlistSize) { dir->vOrigin = dir->nEntries - SFlistSize; } if (dir->vOrigin < 0) { dir->vOrigin = 0; } if (dir->hOrigin > dir->nChars - SFcharsPerEntry) { dir->hOrigin = dir->nChars - SFcharsPerEntry; } if (dir->hOrigin < 0) { dir->hOrigin = 0; } dir->beginSelection = -1; dir->endSelection = -1; SFdoNotTouchVorigin = 1; if ((dir + 1)->dir) { (void)SFfindFile(dir, (dir + 1)->dir); } else { (void)SFfindFile(dir, dir->path); } if (!SFworkProcAdded) { (void)XtAppAddWorkProc(SFapp, (XtWorkProc)SFworkProc, NULL); SFworkProcAdded = 1; } return 1; } return 0; } static int SFcheckFiles(SFDir *dir) { int from, to; int result; char old, new; int i; char *str; int last; struct stat statBuf; result = 0; from = dir->vOrigin; to = dir->vOrigin + SFlistSize; if (to > dir->nEntries) { to = dir->nEntries; } for (i = from; i < to; i++) { str = dir->entries[i].real; last = strlen(str) - 1; old = str[last]; str[last] = 0; if (stat(str, &statBuf)) { new = ' '; } else { new = SFstatChar(&statBuf); } str[last] = new; if (new != old) { result = 1; } } return result; } void SFdirModTimer(XtPointer cl, XtIntervalId *id) { static int n = -1; static int f = 0; char save; SFDir *dir; UNUSED(cl); UNUSED(id); if ((!SFtwiddle) && (SFdirPtr < SFdirEnd)) { n++; if ((n > 2) || (SFdirPtr + n >= SFdirEnd)) { n = 0; f++; if ((f > 2) || (SFdirPtr + f >= SFdirEnd)) { f = 0; } } dir = &(SFdirs[SFdirPtr + n]); save = *(dir->path); *(dir->path) = 0; if (SFchdir(SFcurrentPath)) { *(dir->path) = save; /* * force a re-read */ *(dir->dir) = 0; SFupdatePath(); } else { *(dir->path) = save; if (SFcheckDir(n, dir) || ((f == n) && SFcheckFiles(dir)) ) { SFdrawList(n, SF_DO_SCROLL); } } } SFdirModTimerId = XtAppAddTimeOut(SFapp, 1500UL, SFdirModTimer, (XtPointer) NULL); } /* Return a single character describing what kind of file STATBUF is. */ char SFstatChar(struct stat *statBuf) { if (S_ISDIR(statBuf->st_mode)) { return '/'; } else if (S_ISREG(statBuf->st_mode)) { return S_ISXXX(statBuf->st_mode) ? '*' : ' '; #ifdef S_ISSOCK } else if (S_ISSOCK(statBuf->st_mode)) { return '='; #endif /* S_ISSOCK */ } else { return ' '; } } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* !defined(MOTIF) */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/topic-window.h0000664000175000017500000000551710363262237021557 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef TOPIC_WINDOW_H_ #define TOPIC_WINDOW_H_ #include "xdvi-config.h" #include "xdvi.h" #include "version.h" #include #include #include struct topic_info; /* forward declaration */ struct topic_item { /* topic name */ char *topic; /* longer title of topic, displayed as heading in the right window */ char *title; /* the widget (subwindow of the right window) associated with the topic */ Widget widget; }; struct topic_info { /* the toplevel shell */ Widget shell; /* the topics list */ Widget topics_list; /* the right form, parent of the dummy form which contains the right topic-specific window */ Widget right_form; /* the topic label in right window */ Widget topic_label; /* the currently selected widget */ Widget curr_selected; /* callbacks for OK button (may be NULL); it's invoked from within the `real' widget callback and is passed a pointer to this(!) struct topic_info */ void (*ok_callback)(XtPointer arg); /* like ok_callback, for the Cancel button */ void (*cancel_callback)(XtPointer arg); /* list of topic_items */ struct topic_item *items; size_t items_size; /* additional data the callback may need ... */ void *data; }; extern Widget create_topic_window(Widget parent, const char *window_title, const char *widget_name, struct topic_info *info, void (*init_items_func)(struct topic_info *info), /* OK button label (can be NULL) */ const char *ok_label, /* Cancel button label (can be NULL) */ const char *cancel_label); extern void select_topic(struct topic_info *info, size_t idx); #endif /* TOPIC_WINDOW_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/search-dialog.h0000664000175000017500000000520111032450154021613 0ustar uwabamiuwabami/* * Copyright (c) 2003-2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef SEARCH_DIALOG_H_ #define SEARCH_DIALOG_H_ #include "xdvi-config.h" #include "xdvi.h" typedef enum { SEARCH_UP = 0, SEARCH_DOWN, SEARCH_UNINITIALIZED } searchDirectionT; /* bounding box info for words. */ struct bbox { int ulx, uly, lrx, lry; }; struct search_info { Boolean have_match; Boolean locked; /* to block multiple searches */ Boolean search_wrapped; /* if restarting from start (or end) */ int from_pos; int to_pos; int scan_page; int page_offset; /* start of current scan */ }; struct search_settings { const char *term; /* original search term */ char *utf8_term; /* term in UTF-8 encoding */ char *posix_term; /* utf8_term with Perl abbreviations mapped to POSIX */ Boolean use_regexp; Boolean case_sensitive; Boolean ignore_hyphens; Boolean ignore_linebreaks; Boolean wrap; int wrapcnt; /* > 0 if search has wrapped */ char *isearchterm; /* non-NULL when doing isearch */ searchDirectionT direction; struct search_info *searchinfo; /* internal state management */ int x_pos, y_pos; /* position of the search popup window */ int from_page; /* page to start search from */ int curr_page; /* current page of search */ int to_page; /* highest page already scanned */ int hyphen_delta; /* difference in offsets when hyphenation is removed */ Widget message_window; /* warning popup, or NULL if it doesn't exist */ }; extern void dvi_find_string(const char *str, Boolean find_next); #endif /* SEARCH_DIALOG_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_colorsel.h0000664000175000017500000000305510363262237021455 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef XM_COLORSEL_H_ #define XM_COLORSEL_H_ #ifdef MOTIF struct prefs_choice; struct topic_info; struct color_button_info { Widget w; /* current button */ Pixel pixel; /* label color of this button */ const char *resource_name; /* resource name to save this color to */ struct topic_info *tinfo; }; void popup_color_dialog(Widget parent, struct color_button_info *cinfo); #endif /* MOTIF */ #endif /* XM_COLORSEL_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs.h0000664000175000017500000000305610363262237020753 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef XM_PREFS_H_ #define XM_PREFS_H_ #ifdef MOTIF #include "xm_prefsP.h" extern void popup_preferences_dialog(Widget parent, int arg); extern void copy_resources(const struct x_resources *source, struct x_resources *target); extern void remove_from_deplist(struct prefs_choice *prefs, Widget w); extern void add_to_deplist(struct prefs_choice *prefs, Widget w); extern Boolean preferences_changed(void); #endif #endif /* XM_PREFS_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/mag.c0000664000175000017500000005625011032450154017662 0ustar uwabamiuwabami/* * Copyright (c) 1990-2004 Paul Vojta and others * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * * NOTE: xdvi is based on prior work, as noted in the modification history in * xdvi.c. * */ /* * Implementation of the magnifier window. */ #include #include "xdvi-config.h" /* one of the following should define OPEN_MAX: */ #include #include "c-openmx.h" #include "xdvi.h" #ifdef MOTIF #include #endif #include "events.h" #include "dvi-draw.h" #include "dvi-init.h" #include "statusline.h" #include "hypertex.h" #include "mag.h" #include "xm_toolbar.h" #include "xm_menu.h" /* for get_last_ungrab() */ #include "util.h" #include "pagesel.h" /* to measure distance of pointer from ruler in ruler mode */ static int g_ruler_pos_x = 0, g_ruler_pos_y = 0; struct WindowRec magnifier = { (Window) 0, 1, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0 }; /* * Mechanism to keep track of the magnifier window. The problems are, * * - if the button is released while the window is being drawn, this could * cause an X error if we continue drawing in it after it is destroyed, and * * - creating and destroying the window too quickly confuses the window * manager, which is avoided by waiting for an expose event before destroying * it. */ short magnifier_stat; /* 1 = wait for expose, -1 = destroy upon expose */ static Position main_x; static Position main_y; static Position mag_x = 0; static Position mag_y = 0; /* Under Motif the following two remain always constant */ static int mag_conv_x = 0; static int mag_conv_y = 0; static Position new_mag_x = 0; static Position new_mag_y = 0; /* default magnifier dimensions */ static struct mg_size_rec { int w; int h; } mg_size[] = { {200, 150}, {400, 250}, {700, 500}, {1000, 800}, {1200, 1200} }; size_t get_magglass_items(void) { return XtNumber(mg_size); } int get_magglass_width(int idx) { return mg_size[idx].w; } int get_magglass_height(int idx) { return mg_size[idx].h; } void set_magglass_widht(int idx, int w) { mg_size[idx].w = w; } void set_magglass_height(int idx, int h) { mg_size[idx].h = h; } static void can_exposures(struct WindowRec *windowrec) { windowrec->min_x = windowrec->min_y = MAXDIM; windowrec->max_x = windowrec->max_y = 0; } static void mag_motion(XEvent * event) { MYTRACE((stderr, "mag_motion!\n")); new_mag_x = event->xmotion.x + mag_conv_x; main_x = event->xmotion.x_root - new_mag_x; new_mag_y = event->xmotion.y + mag_conv_y; main_y = event->xmotion.y_root - new_mag_y; if (new_mag_x != mag_x || new_mag_y != mag_y) globals.ev.flags |= EV_MAG_MOVE; else globals.ev.flags &= ~EV_MAG_MOVE; } void mag_release(XEvent * event) { UNUSED(event); if (magnifier.win != (Window) 0) { if (magnifier_stat) { magnifier_stat = -1; /* destroy upon expose */ } else { XDestroyWindow(DISP, magnifier.win); if (drawing_mag) { globals.ev.flags |= EV_MAG_GONE; } magnifier.win = (Window) 0; mouse_motion = mouse_release = null_mouse; globals.ev.flags &= ~EV_MAG_MOVE; globals.cursor.flags &= ~CURSOR_MAG; globals.ev.flags |= EV_CURSOR; can_exposures(&magnifier); /* Workaround for bug #703304: For obscure reasons, XFree 3.3.5 (and apparently also Solaris 8) doesn't generate an expose event after the magnifier has beed destroyed. But only a redraw() event caused by expose would reset currwin.win back to mane.win, which is needed e.g. for getting the hyperlink info updated (otherwise, the mouse will not become active over a hyperlink). Forcing a redraw with redraw(&mane); may cause a `BadDrawable' X error with color material (e.g. from #702288), or a `draw_part: shouldn't happen: POST encountered' error. Neither do the following work: globals.ev.flags |= EV_EXPOSE; (doesn't fix the bug) draw_page(); (same effect as redraw(&mane)) globals.ev.flags |= EV_NEWPAGE; (works, but is crude and causes flicker) So I decided to use expose() for the time being, which sets mane.min_x to the current x point (which doesn't happen with EV_EXPOSE; this causes the test for `mane.min_x < MAXDIM' to fail in events.c; look for `see comment in mag.c'). */ /* fprintf(stderr, "========triggering expose!\n"); */ expose(&mane, event->xbutton.x_root, event->xbutton.y_root, 10, 10); } } } static int tick_scale(int k) { if (k == 0) return 3; else if ((k % 1000) == 0) return 7; else if ((k % 500) == 0) return 6; else if ((k % 100) == 0) return 5; else if ((k % 50) == 0) return 4; else if ((k % 10) == 0) return 3; else if ((k % 5) == 0) return 2; else return 1; } static void draw_ticks(unsigned int width, unsigned int height, GC ourGC) { int k; /* tick counter */ double old_pixels_per_tick; double pixels_per_tick; int scale; int tick_offset; /* offset along axes */ int x; /* coordinates of top-left popup */ int y; /* window corner */ double xx; /* coordinates of tick */ double yy; /* coordinates of tick */ static char *last_tick_units = ""; /* memory of last tick units */ if (resource.tick_length <= 0) /* user doesn't want tick marks */ return; x = 0; /* the pop-up window always has origin (0,0) */ y = 0; /* We need to clear the existing window to remove old rulers. I think that this could be avoided if draw_ticks() could be invoked earlier. The expose argument in XClearArea() must be True to force redrawing of the text inside the popup window. Also, it would be better to draw the rulers before painting the text, so that rulers would not overwrite the text, but I haven't figured out yet how to arrange that. */ XClearArea(DISP, magnifier.win, x, y, width, height, True); /* The global resource.pixels_per_inch tells us how to find the ruler scale. For example, 300dpi corresponds to these TeX units: 1 TeX point (pt) = 4.151 pixels 1 big point (bp) = 4.167 pixels 1 pica (pc) = 49.813 pixels 1 cicero (cc) = 53.501 pixels 1 didot point (dd) = 4.442 pixels 1 millimeter (mm) = 11.811 pixels 1 centimeter (cm) = 118.110 pixels 1 inch (in) = 300.000 pixels 1 scaled point (sp) = 0.00006334 pixels The user can select the units via a resource (e.g. XDvi*tickUnits: bp), or a command-line option (e.g. -xrm '*tickUnits: cm'). The length of the ticks can be controlled by a resource (e.g. XDvi*tickLength: 10), or a command-line option (e.g. -xrm '*tickLength: 10000'). Zero, or negative, tick length completely suppresses rulers. */ pixels_per_tick = (double)resource.pixels_per_inch; if (strcmp(resource.tick_units, "pt") == 0) pixels_per_tick /= 72.27; else if (strcmp(resource.tick_units, "bp") == 0) pixels_per_tick /= 72.0; else if (strcmp(resource.tick_units, "in") == 0) /* NO-OP */ ; else if (strcmp(resource.tick_units, "cm") == 0) pixels_per_tick /= 2.54; else if (strcmp(resource.tick_units, "mm") == 0) pixels_per_tick /= 25.4; else if (strcmp(resource.tick_units, "dd") == 0) pixels_per_tick *= (1238.0 / 1157.0) / 72.27; else if (strcmp(resource.tick_units, "cc") == 0) pixels_per_tick *= 12.0 * (1238.0 / 1157.0) / 72.27; else if (strcmp(resource.tick_units, "pc") == 0) pixels_per_tick *= 12.0 / 72.27; else if (strcmp(resource.tick_units, "sp") == 0) pixels_per_tick /= (65536.0 * 72.27); else if (strcmp(resource.tick_units, "px") == 0) pixels_per_tick = 10; else { XDVI_WARNING((stderr, "Unrecognized tickUnits [%s]: defaulting to TeX points [pt]", resource.tick_units)); resource.tick_units = "pt"; pixels_per_tick /= 72.27; } /* To permit accurate measurement in the popup window, we can reasonably * place tick marks about 3 to 10 pixels apart, so we scale the computed * pixels_per_tick by a power of ten to bring it into that range. */ old_pixels_per_tick = pixels_per_tick; /* remember the original scale */ while (pixels_per_tick < 3.0) pixels_per_tick *= 10.0; while (pixels_per_tick > 30.0) pixels_per_tick /= 10.0; /* tell user what the ruler scale is, but only when it changes */ if (strcmp(last_tick_units, resource.tick_units) != 0) { if (old_pixels_per_tick != pixels_per_tick) printf("Ruler tick interval adjusted to represent %.2f%s\n", pixels_per_tick / old_pixels_per_tick, resource.tick_units); else if (globals.debug & DBG_EVENT) printf("Ruler tick interval represents 1%s\n", resource.tick_units); } /* In order to make the ruler as accurate as possible, given the coarse * screen resolution, we compute tick positions in floating-point * arithmetic, then round to nearest integer values. */ /* draw vertical ticks on top and bottom */ for (k = 0, xx = 0.0; xx < (double)width; k++, xx += pixels_per_tick) { tick_offset = (int)(0.5 + xx); /* round to nearest pixel */ scale = tick_scale(k); XDrawLine(DISP, magnifier.win, ourGC, x + tick_offset, y, x + tick_offset, y + scale * resource.tick_length); XDrawLine(DISP, magnifier.win, ourGC, x + tick_offset, y + height, x + tick_offset, y + height - scale * resource.tick_length); } /* draw horizontal ticks on left and right */ for (k = 0, yy = 0.0; yy < (double)height; k++, yy += pixels_per_tick) { tick_offset = (int)(0.5 + yy); /* round to nearest pixel */ scale = tick_scale(k); XDrawLine(DISP, magnifier.win, ourGC, x, y + tick_offset, x + scale * resource.tick_length, y + tick_offset); XDrawLine(DISP, magnifier.win, ourGC, x + width, y + tick_offset, x + width - scale * resource.tick_length, y + tick_offset); } last_tick_units = resource.tick_units; XFlush(DISP); /* bring window up-to-date */ } static void compute_mag_pos(int *xp, int *yp) { int t; t = mag_x + main_x - magnifier.width / 2; if (t > WidthOfScreen(SCRN) - (int)magnifier.width - 2 * MAGBORD) t = WidthOfScreen(SCRN) - (int)magnifier.width - 2 * MAGBORD; if (t < 0) t = 0; *xp = t; t = mag_y + main_y - magnifier.height / 2; if (t > HeightOfScreen(SCRN) - (int)magnifier.height - 2 * MAGBORD) t = HeightOfScreen(SCRN) - (int)magnifier.height - 2 * MAGBORD; if (t < 0) t = 0; *yp = t; } static void scroll_window(struct WindowRec *windowrec, int x0, int y0) { int x, y; int x2 = 0, y2 = 0; int ww, hh; x = x0 - windowrec->base_x; y = y0 - windowrec->base_y; ww = windowrec->width - x; hh = windowrec->height - y; windowrec->base_x = x0; windowrec->base_y = y0; if (currwin.win == windowrec->win) { currwin.base_x = x0; currwin.base_y = y0; } windowrec->min_x -= x; if (windowrec->min_x < 0) windowrec->min_x = 0; windowrec->max_x -= x; if ((unsigned int)windowrec->max_x > windowrec->width) windowrec->max_x = windowrec->width; windowrec->min_y -= y; if (windowrec->min_y < 0) windowrec->min_y = 0; windowrec->max_y -= y; if ((unsigned int)windowrec->max_y > windowrec->height) windowrec->max_y = windowrec->height; if (x < 0) { x2 = -x; x = 0; ww = windowrec->width - x2; } if (y < 0) { y2 = -y; y = 0; hh = windowrec->height - y2; } if (ww <= 0 || hh <= 0) { XClearWindow(DISP, windowrec->win); windowrec->min_x = windowrec->min_y = 0; windowrec->max_x = windowrec->width; windowrec->max_y = windowrec->height; } else { XCopyArea(DISP, windowrec->win, windowrec->win, globals.gc.copy, x, y, (unsigned int)ww, (unsigned int)hh, x2, y2); if (x > 0) clearexpose(windowrec, ww, 0, (unsigned int)x, windowrec->height); if (x2 > 0) clearexpose(windowrec, 0, 0, (unsigned int)x2, windowrec->height); if (y > 0) clearexpose(windowrec, 0, hh, windowrec->width, (unsigned int)y); if (y2 > 0) clearexpose(windowrec, 0, 0, windowrec->width, (unsigned int)y2); } } static void do_movemag(int x, int y) { int xx, yy; mag_x = x; mag_y = y; if (mag_x == new_mag_x && mag_y == new_mag_y) globals.ev.flags &= ~EV_MAG_MOVE; compute_mag_pos(&xx, &yy); XMoveWindow(DISP, magnifier.win, xx, yy); scroll_window(&magnifier, (x + mane_base_x) * mane.shrinkfactor - (int)magnifier.width / 2, (y + mane_base_y) * mane.shrinkfactor - (int)magnifier.height / 2); draw_ticks(magnifier.width, magnifier.height, globals.gc.ruler); } extern jmp_buf next_env; void show_distance_from_ruler(XEvent *event, Boolean to_stdout) { int loc_x, loc_y; int precision = 2; double factor; if (event == NULL) /* when option is toggled */ return; loc_x = event->xbutton.x; loc_y = event->xbutton.y; if (event->xbutton.window != mane.win) { Window ww; (void)XTranslateCoordinates(DISP, RootWindowOfScreen(SCRN), mane.win, event->xbutton.x_root, event->xbutton.y_root, &loc_x, &loc_y, &ww); /* throw away last argument */ } /* map everything below 0 to the origin */ if (loc_x < 0) loc_x = 0; if (loc_y < 0) loc_y = 0; if (strcmp(resource.tick_units, "pt") == 0) { factor = 72.27 * currwin.shrinkfactor / (double)resource.pixels_per_inch; } else if (strcmp(resource.tick_units, "bp") == 0) { factor = 72.0 * currwin.shrinkfactor / (double)resource.pixels_per_inch; } else if (strcmp(resource.tick_units, "in") == 0) { factor = currwin.shrinkfactor / (double)resource.pixels_per_inch; } else if (strcmp(resource.tick_units, "cm") == 0) { factor = 2.54 * currwin.shrinkfactor / (double)resource.pixels_per_inch; precision = 3; } else if (strcmp(resource.tick_units, "mm") == 0) { factor = 25.4 * currwin.shrinkfactor / (double)resource.pixels_per_inch; } else if (strcmp(resource.tick_units, "dd") == 0) { factor = 72.27 / (1238.0 / 1157.0) * currwin.shrinkfactor / (double)resource.pixels_per_inch; } else if (strcmp(resource.tick_units, "cc") == 0) { factor = 72.27 / (12.0 * (1238.0 / 1157.0)) * currwin.shrinkfactor / (double)resource.pixels_per_inch; } else if (strcmp(resource.tick_units, "pc") == 0) { factor = 72.27 / 12.0 * currwin.shrinkfactor / (double)resource.pixels_per_inch; } else if (strcmp(resource.tick_units, "sp") == 0) { factor = 65536.0 * 72.27 * currwin.shrinkfactor / (double)resource.pixels_per_inch; precision = 1; } else if (strcmp(resource.tick_units, "px") == 0) { /* pixel units */ factor = 1; } else { XDVI_WARNING((stderr, "Unrecognized tickUnits [%s]: defaulting to TeX points [pt]", resource.tick_units)); resource.tick_units = "pt"; factor = 72.27 * currwin.shrinkfactor / (double)resource.pixels_per_inch; } if (mouse_release != null_mouse) { if (to_stdout) { XDVI_INFO((stdout, "Ruler/Point: %d,%d, dx: %.*f %s, dy: %.*f %s, dr: %.*f %s", loc_x, loc_y, precision, 0.000, resource.tick_units, precision, 0.000, resource.tick_units, precision, 0.000, resource.tick_units)); } else { statusline_info(STATUS_FOREVER, "Ruler/Point: %d,%d, dx: %.*f %s, dy: %.*f %s, dt: %.*f %s", loc_x, loc_y, precision, 0.000, resource.tick_units, precision, 0.000, resource.tick_units, precision, 0.000, resource.tick_units); } } else { int d_x = loc_x - g_ruler_pos_x; int d_y = loc_y - g_ruler_pos_y; double d_z = sqrt((double)d_x * d_x + (double)d_y * d_y); double unit_x = (double)d_x * factor; double unit_y = (double)d_y * factor; double unit_z = d_z * factor; if (to_stdout) { XDVI_INFO((stdout, "Ruler: %d,%d, Point: %d,%d, dx: %.*f %s, dy: %.*f %s, dr: %.*f %s", g_ruler_pos_x, g_ruler_pos_y, loc_x, loc_y, precision, unit_x, resource.tick_units, precision, unit_y, resource.tick_units, precision, unit_z, resource.tick_units)); } else { statusline_info(STATUS_FOREVER, "Ruler: %d,%d, Point: %d,%d, dx: %.*f %s, dy: %.*f %s, dr: %.*f %s", g_ruler_pos_x, g_ruler_pos_y, loc_x, loc_y, precision, unit_x, resource.tick_units, precision, unit_y, resource.tick_units, precision, unit_z, resource.tick_units); } } } void move_magnifier(void) { if (magnifier.win == (Window) 0) globals.ev.flags &= ~EV_MAG_MOVE; else if (abs(new_mag_x - mag_x) > 2 * abs(new_mag_y - mag_y)) do_movemag(new_mag_x, mag_y); else if (abs(new_mag_y - mag_y) > 2 * abs(new_mag_x - mag_x)) do_movemag(mag_x, new_mag_y); else do_movemag(new_mag_x, new_mag_y); } void clear_ruler(void) { /* maybe we should do this only for mouse-1? */ clearexpose(&mane, 0, g_ruler_pos_y, ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 2, 1); clearexpose(&mane, g_ruler_pos_x, 0, 1, ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 2); } void show_ruler(XEvent *event) { if (mouse_release == null_mouse) { if (mouse_release != null_mouse && mouse_release != drag_ruler_release) return; if (mouse_release == null_mouse) { mouse_motion = drag_ruler_motion; mouse_release = drag_ruler_release; } drag_ruler_motion(event); } } static void draw_ruler(int x, int y) { /* don't draw if outside page region (will be clipped automatically by Motif, but not by Xaw, where draw widget is entire window) */ if (x > (int)ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 1 || y > (int)ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 1) return; XFillRectangle(DISP, mane.win, globals.gc.high, 0, y, ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 2, 1); XFillRectangle(DISP, mane.win, globals.gc.high, x, 0, 1, ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 2); } /* snap ruler back to origing (0,0) */ void ruler_snap_origin(XEvent *event) { clear_ruler(); g_ruler_pos_x = g_ruler_pos_y = 0; draw_ruler(g_ruler_pos_x, g_ruler_pos_y); /* deactivate mouse dragging */ mouse_motion = mouse_release = null_mouse; show_distance_from_ruler(event, False); } void redraw_ruler(void) { draw_ruler(g_ruler_pos_x, g_ruler_pos_y); } void magnifier_move(String params, XEvent *event) { int x, y; XSetWindowAttributes attr; #ifndef MOTIF Window throwaway; #endif const char *p = params; if (*p == '*') { int n = atoi(p + 1) - 1; if (n < 0 || n >= (int)get_magglass_items() || get_magglass_width(n) <= 0) { XBell(DISP, 0); return; } magnifier.width = get_magglass_width(n); magnifier.height = get_magglass_height(n); } else { magnifier.width = magnifier.height = atoi(p); p = strchr(p, 'x'); if (p != NULL) { magnifier.height = atoi(p + 1); if (magnifier.height == 0) magnifier.width = 0; } if (magnifier.width == 0) { XBell(DISP, 0); return; } } #ifndef MOTIF XTranslateCoordinates(DISP, event->xbutton.window, mane.win, 0, 0, &mag_conv_x, &mag_conv_y, &throwaway); #endif mag_x = event->xbutton.x + mag_conv_x; mag_y = event->xbutton.y + mag_conv_y; main_x = event->xbutton.x_root - mag_x; main_y = event->xbutton.y_root - mag_y; compute_mag_pos(&x, &y); magnifier.base_x = (mag_x + mane_base_x) * mane.shrinkfactor - magnifier.width / 2; magnifier.base_y = (mag_y + mane_base_y) * mane.shrinkfactor - magnifier.height / 2; attr.save_under = True; attr.border_pixel = resource.rule_pixel; #if COLOR attr.background_pixel = bg_current->pixel; #else attr.background_pixel = resource.back_Pixel; #endif attr.override_redirect = True; #ifdef GREY attr.colormap = G_colormap; #endif magnifier.win = XCreateWindow(DISP, RootWindowOfScreen(SCRN), x, y, magnifier.width, magnifier.height, MAGBORD, G_depth, InputOutput, G_visual, CWSaveUnder | CWBorderPixel | CWBackPixel | #ifdef GREY CWColormap | #endif CWOverrideRedirect, &attr); XSelectInput(DISP, magnifier.win, ExposureMask); XMapWindow(DISP, magnifier.win); /* * This call will draw the point rulers when the magnifier first pops up, * if the XDvi*delayRulers resource is false. Some users may prefer rulers * to remain invisible until the magnifier is moved, so the default is * true. Rulers can be suppressed entirely by setting the XDvi*tickLength * resource to zero or negative. */ if (!resource.delay_rulers) draw_ticks(magnifier.width, magnifier.height, globals.gc.ruler); globals.cursor.flags |= CURSOR_MAG; globals.ev.flags |= EV_CURSOR; magnifier_stat = 1; /* waiting for exposure */ mouse_motion = mag_motion; mouse_release = mag_release; } void drag_ruler_motion(XEvent *event) { int loc_x, loc_y; if (event == NULL) { /* toggled via menu */ /* hack to avoid redrawing ruler at last g_* positions when mode is toggled on via menu, then off via keystroke */ g_ruler_pos_x = g_ruler_pos_y = 0; return; } loc_x = event->xbutton.x; loc_y = event->xbutton.y; if (event->xbutton.window != mane.win) { Window dummy; (void)XTranslateCoordinates(DISP, RootWindowOfScreen(SCRN), mane.win, event->xbutton.x_root, event->xbutton.y_root, &loc_x, &loc_y, &dummy); } /* map everything below 0 to the origin */ if (loc_x < 0) loc_x = 0; if (loc_y < 0) loc_y = 0; clear_ruler(); draw_ruler(loc_x, loc_y); g_ruler_pos_x = loc_x; g_ruler_pos_y = loc_y; } void drag_ruler_release(XEvent *event) { UNUSED(event); mouse_motion = mouse_release = null_mouse; } /* XtActionsRec mag_actions[] = { */ /* {"magnifier", Act_magnifier}, */ /* {"do-href", Act_href}, */ /* {"do-href-newwindow", Act_href_newwindow}, */ /* {"switch-magnifier-units", Act_switch_magnifier_units}, */ /* }; */ /* * This isn't creating the actual magnifier. It is created lazily on demand * if one of the corresponding actions is taken. Therefore we are here * just adding the record of actions related to magnifier handling to the * application. */ /* void */ /* create_magnifier(void) */ /* { */ /* XtAppAddActions(globals.app, mag_actions, XtNumber(mag_actions)); */ /* } */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs_page.c0000664000175000017500000005423211276240141021736 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Panel 4 (Paper size) for xdvik preferences dialog. */ #include "xdvi-config.h" #include "xdvi.h" #include "x_util.h" #include "xm_colorsel.h" #include "topic-window.h" #include "util.h" #include "events.h" #include "statusline.h" #include "xm_prefsP.h" #include "xm_prefs_page.h" #include "my-snprintf.h" #ifdef MOTIF /* entire file */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if USE_SPINBOX #include #endif /* * Handy defaults */ static Arg one_of_many = { XmNindicatorType, XmONE_OF_MANY }; static Arg n_of_many = { XmNindicatorType, XmN_OF_MANY }; static Arg frame_title = { XmNchildType, XmFRAME_TITLE_CHILD }; static Arg one_col[] = { { XmNpacking, XmPACK_TIGHT }, { XmNnumColumns, 1 }, { XmNorientation, XmVERTICAL } }; /* this is a small selection from the paper types in xdvi.c * (only the more frequenlty used ones) */ static struct paper_info { const char *format; const char *resource_format; const char *size; const char *landscape_size; } papersizes[] = { { "US (Letter)", "us", "8.5x11in", "11x8.5in" }, { "Tabloid", "tabloid", "11x17in", "17x11in" }, /* dvips compatibility */ { "Legal", "legal", "8.5x14in", "14x8.5in" }, { "A0", "a0", "841x1189mm", "1189x841mm" }, { "A1", "a1", "594x841mm", "841x594mm" }, { "A2", "a2", "420x594mm", "594x420mm" }, { "A3", "a3", "297x420mm", "420x297mm" }, { "A4", "a4", "210x297mm", "297x210mm" }, { "A5", "a5", "148x210mm", "210x148mm" }, { "B5", "b5", "176x250mm", "250x176mm" }, { "B6", "b6", "125x176mm", "176x125mm" }, { "B7", "b7", "88x125mm", "125x88mm" }, { NULL, NULL, NULL, NULL } /* terminate */ }; void update_preferences_windowsize(void) { Widget shell, button; /* it's not an error if the prefs dialog doesn't exist yet */ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False) && get_widget_by_name(&button, shell, Xdvi_REMEMBER_WINDOWSIZE_STR, True)) { XmToggleButtonGadgetSetState(button, resource.remember_windowsize, False); } } void update_preferences_shrink(void) { Widget shell, text; if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False) && get_widget_by_name(&text, shell, Xdvi_SHRINK_TEXT, True)) { char buf[LENGTH_OF_INT]; SNPRINTF(buf, LENGTH_OF_INT, "%d", resource.shrinkfactor); #if USE_SPINBOX XmTextFieldSetString(text, buf); XtVaSetValues(text, XmNposition, resource.shrinkfactor, NULL); #else XtVaSetValues(text, XmNvalue, buf, NULL); #endif } } static void landscape_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *tinfo = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)tinfo->data; Widget portrait_b, landscape_b; Boolean landscape = False, is_set; static char *paper_option = NULL; Boolean match = False; int i; UNUSED(call_data); for (i = 0; papersizes[i].format != NULL; i++) { /* ignore final `r' when comparing */ if (strncmp(resource.paper, papersizes[i].resource_format, strlen(papersizes[i].resource_format)) == 0) { const char *ptr; match = True; if (strcmp(resource.paper, "letter") == 0) /* special case */ ptr = "us"; else ptr = papersizes[i].resource_format; free(paper_option); paper_option = xstrdup(ptr); break; } } if (!match) { XDVI_ERROR((stderr, "paper resource `%s' not found in list!\n", resource.paper)); return; } if (get_widget_by_name(&portrait_b, tinfo->shell, Xdvi_PAPER_PORTRAIT_STR, True) && get_widget_by_name(&landscape_b, tinfo->shell, Xdvi_PAPER_LANDSCAPE_STR, True)) { if (w == portrait_b) { XtVaGetValues(portrait_b, XmNset, &is_set, NULL); landscape = !is_set; } else { XtVaGetValues(landscape_b, XmNset, &is_set, NULL); landscape = is_set; } /* fprintf(stderr, "++++++++ CALLBACK: setting portrait to %s, landscape to %s\n", */ /* landscape ? "False" : "True", */ /* landscape ? "True" : "False"); */ XmToggleButtonGadgetSetState(portrait_b, !landscape, False); XmToggleButtonGadgetSetState(landscape_b, landscape, False); } if (landscape) { paper_option = xstrcat(paper_option, "r"); } resource.paper = paper_option; store_preference(&(prefs->db), "paper", "%s", paper_option); } static void select_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *tinfo = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)tinfo->data; XmString str; char *choice; int i; static char *curr_choice= NULL; Boolean landscape = False; UNUSED(call_data); XtVaGetValues(w, XmNlabelString, &str, NULL); XmStringGetLtoR(str, G_charset, &choice); if (strlen(resource.paper) > 0 && strcmp(resource.paper, "letter") != 0 && resource.paper[strlen(resource.paper) - 1] == 'r') landscape = True; free(curr_choice); curr_choice = NULL; for (i = 0; papersizes[i].format != NULL; i++) { if (strcmp(choice, papersizes[i].format) == 0) { curr_choice = xstrdup(papersizes[i].resource_format); } } if (curr_choice == NULL) { XDVI_ERROR((stderr, "choice`%s' not found in list!\n", choice)); return; } if (landscape) { curr_choice = xstrcat(curr_choice, "r"); } resource.paper = curr_choice; store_preference(&(prefs->db), "paper", "%s", curr_choice); } void update_preferences_paper(void) { Widget shell, portrait_button, landscape_button, sizes_menu, sizes_cascade; Boolean landscape = False; /* it's not an error if the prefs dialog doesn't exist yet */ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False) && get_widget_by_name(&portrait_button, shell, Xdvi_PAPER_PORTRAIT_STR, True) && get_widget_by_name(&landscape_button, shell, Xdvi_PAPER_LANDSCAPE_STR, True) && get_widget_by_name(&sizes_menu, shell, Xdvi_PAPER_MENU, True) && get_widget_by_name(&sizes_cascade, shell, Xdvi_PAPER_CASCADE, True)) { int i; Widget sizes_button; if (strlen(resource.paper) > 0 && strcmp(resource.paper, "letter") != 0 && resource.paper[strlen(resource.paper) - 1] == 'r') { landscape = True; } #if 0 XtVaGetValues(portrait_button, XmNset, &test1, NULL); XtVaGetValues(landscape_button, XmNset, &test2, NULL); fprintf(stderr, "+++++++ old state of portrait: %d, landscape: %d\n", test1, test2); fprintf(stderr, "+++++++ setting portrait to %s, landscape to %s\n", landscape ? "False" : "True", landscape ? "True" : "False"); #endif /* 0 */ /* Apparently there's a bug in Motif (OpenMotif 2.1) in that the button is not properly updated in all cases. To reproduce: Open Preferences dialog, change `landscape' option, click `OK'. Now open the dialog again, change the option again, but click `Cancel'. This correctly reverts the visible state of the buttons, but when opening the dialog again, the button's internal state is not consistent with the visual appearance: when clicking on the unset button, its ValueChanged callback is not invoked, so nothing happens; but after clicking on another(!) button in the preferences dialog, it works again. As a workaround, we destroy the buttons and re-create them from scratch - yuck! */ { Widget form = XtParent(portrait_button); Widget cascade; struct topic_info *info; XtVaGetValues(portrait_button, XmNleftWidget, &cascade, XmNuserData, &info, NULL); XtDestroyWidget(portrait_button); XtDestroyWidget(landscape_button); portrait_button = XmCreateToggleButtonGadget(form, Xdvi_PAPER_PORTRAIT_STR, &one_of_many, 1); XmToggleButtonGadgetSetState(portrait_button, !landscape, False); XtVaSetValues(portrait_button, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, cascade, XmNleftOffset, 10, XmNuserData, (XtPointer)info, NULL); landscape_button = XmCreateToggleButtonGadget(form, Xdvi_PAPER_LANDSCAPE_STR, &one_of_many, 1); XmToggleButtonGadgetSetState(landscape_button, landscape, False); XtVaSetValues(landscape_button, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, portrait_button, XmNleftOffset, 10, XmNuserData, (XtPointer)info, NULL); XtManageChild(portrait_button); XtManageChild(landscape_button); XtAddCallback(portrait_button, XmNvalueChangedCallback, landscape_cb, (XtPointer)info); XtAddCallback(landscape_button, XmNvalueChangedCallback, landscape_cb, (XtPointer)info); } #if 0 XtVaGetValues(portrait_button, XmNset, &test1, NULL); XtVaGetValues(landscape_button, XmNset, &test2, NULL); fprintf(stderr, "+++++++ new state of portrait: %d, landscape: %d\n", test1, test2); #endif /* 0 */ for (i = 0; papersizes[i].format != NULL; i++) { if (strncmp(resource.paper, papersizes[i].resource_format, strlen(papersizes[i].resource_format)) == 0 && get_widget_by_name(&sizes_button, sizes_menu, papersizes[i].format, True)) { XtVaSetValues(sizes_cascade, XmNmenuHistory, sizes_button, NULL); } } } } #if 0 /* currently unused */ static void shrinkfactor_spinbox_cb(Widget w, XtPointer client_data, XtPointer call_data) { int val; /* static Boolean first_time = True; */ struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); UNUSED(call_data); XtVaGetValues(w, XmNposition, &val, NULL); /* return if value not changed yet; else the first invocation of the window may actually reset the shrink factor to the default. */ /* if (val != resource.shrinkfactor) { */ /* first_time = False; */ /* } */ if (XtIsRealized(w)) { /* don't set the resource.shrinkfactor here so that we can revert it from there if needed */ do_set_shrinkfactor(val, False); store_preference(&(prefs->db), "shrinkFactor", "%d", val); } } #endif /* currently unused */ static void set_shrinkfactor_cb(Widget w, XtPointer client_data, XtPointer call_data) { char *text; int val; struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); #if USE_SPINBOX XmTextPosition pos; UNUSED(call_data); text = XmTextFieldGetString(w); val = strtol(text, (char **)NULL, 10); #else Widget text_field; UNUSED(call_data); XtVaGetValues(w, XmNuserData, &text_field, NULL); ASSERT(text_field != 0, "Expected text field in XmNuserData, set_shrinkfactor_cb()"); XtVaGetValues(text_field, XmNvalue, &text, NULL); val = strtol(text, (char **)NULL, 10); /* fprintf(stderr, "spinbox value: |%s|\n", text); */ #endif if (!XtIsRealized(w)) return; /* verify values in case of direct text input */ if (val > 100 || val <= 0) { if (val > 100) statusline_info(STATUS_MEDIUM, "Shrink factor larger than maximum 100"); else if (val <= 0) statusline_info(STATUS_MEDIUM, "Shrink factor smaller than minimum 1"); return; } #if USE_SPINBOX /* synchronize internal spinbox value */ pos = XmTextFieldGetInsertionPosition(w); XtVaSetValues(w, XmNposition, val, NULL); XmTextFieldSetInsertionPosition(w, pos); #endif /* don't set the resource.shrinkfactor here so that we can revert it from there if needed */ do_set_shrinkfactor(val, False); store_preference(&(prefs->db), "shrinkFactor", "%d", val); XtFree(text); } static Widget h_create_shrink_frame(Widget top, struct topic_info *info) { Widget shrink_form, shrink_label; UNUSED(info); shrink_form = XmCreateForm(top, "shrink_form", NULL, 0); XtVaSetValues(shrink_form, /* XmNverticalSpacing, 10, */ /* XmNhorizontalSpacing, 10, */ NULL); shrink_label = XmCreateLabelGadget(shrink_form, "Default Shrink Factor: ", NULL, 0); XtVaSetValues(shrink_label, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, /* TODO XmNleftOffset, 10, */ NULL); XtManageChild(shrink_label); { Widget shrink_text; #if USE_SPINBOX Widget shrink_spinbox = XtVaCreateManagedWidget(Xdvi_SHRINK_SPINBOX, xmSpinBoxWidgetClass, shrink_form, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, shrink_label, XmNinitialDelay, 200, XmNrepeatDelay, 50, NULL); shrink_text = XtVaCreateManagedWidget(Xdvi_SHRINK_TEXT, xmTextFieldWidgetClass, shrink_spinbox, XmNspinBoxChildType, XmNUMERIC, XmNminimumValue, 1, XmNmaximumValue, 100, XmNeditable, True, XmNcolumns, 3, XmNincrementValue, 1, XmNwrap, False, /* too confusing */ /* NOTE: use resource.shrinkfactor here, not current setting, otherwise the current setting will sneak into ~/.xdvirc */ XmNposition, (int)(resource.shrinkfactor), NULL); XtAddCallback(shrink_text, XmNactivateCallback, set_shrinkfactor_cb, (XtPointer)info); XtAddCallback(shrink_text, XmNvalueChangedCallback, set_shrinkfactor_cb, (XtPointer)info); adjust_heights(shrink_spinbox, shrink_text, shrink_label, NULL); #else char buf[LENGTH_OF_INT]; Widget shrink_button; shrink_text = XmCreateTextField(shrink_form, Xdvi_SHRINK_TEXT, NULL, 0); SNPRINTF(buf, LENGTH_OF_INT, "%d", resource.shrinkfactor); XtVaSetValues(shrink_text, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, shrink_label, XmNcolumns, 4, XmNvalue, buf, XmNuserData, shrink_text, NULL); XtOverrideTranslations(shrink_text, XtParseTranslationTable("Return:activate()")); XtAddCallback(shrink_text, XmNactivateCallback, set_shrinkfactor_cb, (XtPointer)info); shrink_button = XmCreatePushButton(shrink_form, Xdvi_APPLY_STR, NULL, 0); XtVaSetValues(shrink_button, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftOffset, 10, XmNleftWidget, shrink_text, XmNuserData, shrink_text, NULL); XtAddCallback(shrink_button, XmNactivateCallback, set_shrinkfactor_cb, (XtPointer)info); adjust_heights(shrink_label, shrink_text, shrink_button, NULL); XtManageChild(shrink_text); XtManageChild(shrink_button); #endif } /* XtManageChild(shrink_form); */ return shrink_form; } static void remember_windowsize_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; struct prefs_choice *prefs = (struct prefs_choice *)(info->data); UNUSED(w); UNUSED(call_data); resource.remember_windowsize = !resource.remember_windowsize; store_preference(&(prefs->db), "rememberWindowSize", "%s", resource.remember_windowsize ? "True" : "False"); } static Widget h_create_papersize_form(Widget parent, struct topic_info *info) { Widget form, menu, cascade, portrait_option, landscape_option; XmString str; Arg args[8]; int n; size_t i; Boolean landscape = False; form = XmCreateForm(parent, "paper_form", NULL, 0); menu = XmCreatePulldownMenu(form, Xdvi_PAPER_MENU, NULL, 0); if (strcmp(resource.paper, "letter") != 0 && /* exceptions: these have no landscape format */ strcmp(resource.paper, "ledger") != 0 && strlen(resource.paper) > 0 && resource.paper[strlen(resource.paper) - 1] == 'r') { /* landscape format */ landscape = True; } str = XmStringCreateLocalized("Paper Size:"); n = 0; XtSetArg(args[n], XmNsubMenuId, menu); n++; XtSetArg(args[n], XmNlabelString, str); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; cascade = XmCreateOptionMenu(form, Xdvi_PAPER_CASCADE, args, n); XmStringFree(str); portrait_option = XmCreateToggleButtonGadget(form, Xdvi_PAPER_PORTRAIT_STR, &one_of_many, 1); XmToggleButtonGadgetSetState(portrait_option, !landscape, False); XtVaSetValues(portrait_option, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, cascade, XmNleftOffset, 10, XmNuserData, (XtPointer)info, NULL); landscape_option = XmCreateToggleButtonGadget(form, Xdvi_PAPER_LANDSCAPE_STR, &one_of_many, 1); XmToggleButtonGadgetSetState(landscape_option, landscape, False); XtVaSetValues(landscape_option, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, portrait_option, XmNleftOffset, 10, XmNuserData, (XtPointer)info, NULL); /* adjust_heights(landscape_option, menu, cascade, NULL); */ XtAddCallback(portrait_option, XmNvalueChangedCallback, landscape_cb, (XtPointer)info); XtAddCallback(landscape_option, XmNvalueChangedCallback, landscape_cb, (XtPointer)info); /* XtAddCallback(portrait_option, XmNarmCallback, test_cb, (XtPointer)info); */ /* XtAddCallback(landscape_option, XmNarmCallback, test_cb, (XtPointer)info); */ XtManageChild(portrait_option); XtManageChild(landscape_option); for (i = 0; papersizes[i].format != NULL; i++) { Widget w = XtVaCreateManagedWidget(papersizes[i].format, xmPushButtonGadgetClass, menu, XmNuserData, landscape_option, NULL); /* fprintf(stderr, "Created button: %p for %s\n", w, papersizes[i].format); */ /* select default value */ if (strncmp(resource.paper, papersizes[i].resource_format, strlen(papersizes[i].resource_format)) == 0) { XtVaSetValues(cascade, XmNmenuHistory, w, NULL); } XtAddCallback(w, XmNactivateCallback, select_cb, (XtPointer)info); } XtManageChild(cascade); return form; } Widget prefs_paper(struct topic_info *info) { Widget form; Widget geometry_frame, geometry_label, geometry_rowcol, shrink_frame, geometry_button; Widget paper_frame, paper_label; Arg args[10]; int n = 0; Widget rowcol; #if !defined(LESSTIF_VERSION) Widget paper_text; #endif Widget paper_size_form; form = XtVaCreateWidget("form", xmFormWidgetClass, info->right_form, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); n = 0; XtSetArg(args[n], XmNmarginWidth, 8); n++; XtSetArg(args[n], XmNmarginHeight, 4); n++; geometry_frame = XmCreateFrame(form, "geometry_frame", args, n); h_attach_below(geometry_frame, NULL); geometry_label = XmCreateLabelGadget(geometry_frame, "Window Size and Shrink Factor", &frame_title, 1); XtManageChild(geometry_label); geometry_rowcol = XmCreateRowColumn(geometry_frame, "geometry_rowcol", one_col, XtNumber(one_col)); geometry_button = XmCreateToggleButtonGadget(geometry_rowcol, Xdvi_REMEMBER_WINDOWSIZE_STR, &n_of_many, 1); XmToggleButtonGadgetSetState(geometry_button, resource.remember_windowsize, False); XtAddCallback(geometry_button, XmNvalueChangedCallback, remember_windowsize_cb, (XtPointer)info); XtManageChild(geometry_button); shrink_frame = h_create_shrink_frame(geometry_rowcol, info); XtManageChild(shrink_frame); XtManageChild(geometry_rowcol); n = 0; XtSetArg(args[n], XmNmarginWidth, 8); n++; XtSetArg(args[n], XmNmarginHeight, 4); n++; XtSetArg(args[n], XmNtopOffset, 10); n++; paper_frame = XmCreateFrame(form, "paper_frame", args, n); h_attach_below(paper_frame, geometry_frame); paper_label = XmCreateLabelGadget(paper_frame, "Default Paper Size", &frame_title, 1); XtManageChild(paper_label); rowcol = XmCreateRowColumn(paper_frame, "papersize_rowcol", NULL, 0); #if !defined(LESSTIF_VERSION) /* stupid LessTif doesn't wrap Labels at '\n' */ paper_text = XmCreateLabelGadget(rowcol, "Used if the DVI file does not specify the paper size, e.g. via\n" "\\usepackage[dvips]{geometry}. This setting will only take effect\n" "after restarting xdvi.", NULL, 0); XtVaSetValues(paper_text, XmNalignment, XmALIGNMENT_BEGINNING, NULL); XtManageChild(paper_text); #endif paper_size_form = h_create_papersize_form(rowcol, info); XtManageChild(paper_size_form); XtManageChild(rowcol); XtManageChild(geometry_frame); XtManageChild(paper_frame); XtManageChild(form); return form; } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/sfPath.h0000664000175000017500000000333411276240141020346 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef SFPATH_H_ #define SFPATH_H_ #include "xdvi-config.h" #ifndef MOTIF extern int SFchdir(const char *path); extern void SFupdatePath(void); extern void SFsetText(char *path); extern void SFbuttonPressList(Widget w, int n, XButtonPressedEvent *event); extern void SFbuttonReleaseList(Widget w, int n, XButtonReleasedEvent *event); extern void SFdirModTimer(XtPointer cl, XtIntervalId *id); extern char SFstatChar(struct stat *statBuf); extern char SFcurrentPath[], SFstartDir[], SFcurrentDir[]; extern SFDir *SFdirs; extern int SFdirEnd, SFdirPtr; #endif /* MOTIF */ #endif /* SFPATH_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/sfDraw.c0000664000175000017500000004307111276240141020344 0ustar uwabamiuwabami/* * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Software Research Associates not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. Software Research Associates * makes no representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * * Author: Erik M. van der Poel * Software Research Associates, Inc., Tokyo, Japan * erik@sra.co.jp */ #include "xdvi-config.h" #include "kpathsea/c-auto.h" #include "kpathsea/config.h" #include "kpathsea/c-stat.h" #include "xdvi.h" #include "x_util.h" #include "sfDraw.h" #include "sfDir.h" #include "sfPath.h" #if !defined(MOTIF) /* for xdvik */ #define SF_DEFAULT_FONT "9x15" typedef struct { char *font; } TextData, *textPtr; int SFcharWidth, SFcharAscent, SFcharHeight; int SFcurrentInvert[3] = { -1, -1, -1 }; static GC SFlineGC, SFscrollGC, SFinvertGC, SFtextGC; static XtResource textResources[] = { {XtNfont, XtCFont, XtRString, sizeof(char *), XtOffset(textPtr, font), XtRString, SF_DEFAULT_FONT}, }; static XFontStruct *SFfont; static int SFcurrentListY; static XtIntervalId SFscrollTimerId; void SFinitFont(void) { TextData *data; data = XtNew(TextData); XtGetApplicationResources(selFileForm, (XtPointer) data, textResources, XtNumber(textResources), (Arg *) NULL, ZERO); SFfont = XLoadQueryFont(SFdisplay, data->font); if (!SFfont) { SFfont = XLoadQueryFont(SFdisplay, SF_DEFAULT_FONT); if (!SFfont) { char sbuf[256]; (void)sprintf(sbuf, "XsraSelFile: can't get font %s", SF_DEFAULT_FONT); XtAppError(SFapp, sbuf); } } TRACE_GUI((stderr, "FONT: width %d, %d\n", SFfont->max_bounds.width, SFfont->min_bounds.width)); SFcharWidth = (SFfont->max_bounds.width + SFfont->min_bounds.width) / 2; SFcharAscent = SFfont->max_bounds.ascent; SFcharHeight = SFcharAscent + SFfont->max_bounds.descent; if (SFcharWidth == 0) { /* if min_bounds.width = -max_bounds.width, we probably have a scalable TT font; try to determine its actual width by measuring the letter `x': */ SFcharWidth = XTextWidth(SFfont, "x", 1); } if (SFcharWidth == 0) { /* last resort */ SFcharWidth = SFfont->max_bounds.width / 2; } TRACE_GUI((stderr, "Using font measures: charwidth %d, ascent %d, height %d", SFcharWidth, SFcharAscent, SFcharHeight)); } void SFcreateGC(void) { XGCValues gcValues; XRectangle rectangles[1]; /* XtVaGetValues(selFileLists[0], */ /* XtNforeground, &(gcValues.foreground), */ /* XtNbackground, &(gcValues.background), */ /* NULL); */ gcValues.foreground = SFfore; SFlineGC = XtGetGC(selFileLists[0], (XtGCMask) GCForeground | 0, &gcValues); SFscrollGC = XtGetGC(selFileLists[0], (XtGCMask) 0, &gcValues); gcValues.function = GXinvert; /* gcValues.plane_mask = (gcValues.foreground ^ gcValues.background); */ gcValues.plane_mask = (SFfore ^ SFback); SFinvertGC = XtGetGC(selFileLists[0], (XtGCMask) GCFunction | GCPlaneMask | 0, &gcValues); gcValues.foreground = SFfore; gcValues.background = SFback; gcValues.font = SFfont->fid; SFtextGC = XCreateGC(SFdisplay, XtWindow(selFileLists[0]), (unsigned long) GCForeground | GCBackground | GCFont | 0, &gcValues); rectangles[0].x = SFlineToTextH + SFbesideText; rectangles[0].y = 0; rectangles[0].width = SFcharsPerEntry * SFcharWidth; rectangles[0].height = SFupperY + 1; XSetClipRectangles(SFdisplay, SFtextGC, 0, 0, rectangles, 1, Unsorted); } void SFclearList(int n, int doScroll) { SFDir *dir; SFcurrentInvert[n] = -1; XClearWindow(SFdisplay, XtWindow(selFileLists[n])); XDrawSegments(SFdisplay, XtWindow(selFileLists[n]), SFlineGC, SFsegs, 2); if (doScroll) { dir = &(SFdirs[SFdirPtr + n]); if ((SFdirPtr + n < SFdirEnd) && dir->nEntries && dir->nChars) { XawScrollbarSetThumb(selFileVScrolls[n], (double)dir->vOrigin / dir->nEntries, (double)(dir->nEntries < SFlistSize ? dir->nEntries : SFlistSize) / dir->nEntries); XawScrollbarSetThumb(selFileHScrolls[n], (double)(dir->hOrigin) / dir->nChars, (double)(dir->nChars < SFcharsPerEntry ? dir-> nChars : SFcharsPerEntry) / dir->nChars); } else { XawScrollbarSetThumb(selFileVScrolls[n], 0.0, 1.0); XawScrollbarSetThumb(selFileHScrolls[n], 0.0, 1.0); } } } static void SFdeleteEntry(SFDir *dir, SFEntry *entry) { SFEntry *e; SFEntry *end; int n; int idx; idx = entry - dir->entries; if (idx < dir->beginSelection) { dir->beginSelection--; } if (idx <= dir->endSelection) { dir->endSelection--; } if (dir->beginSelection > dir->endSelection) { dir->beginSelection = dir->endSelection = -1; } if (idx < dir->vOrigin) { dir->vOrigin--; } XtFree(entry->real); end = &(dir->entries[dir->nEntries - 1]); for (e = entry; e < end; e++) { *e = *(e + 1); } if (!(--dir->nEntries)) { return; } n = dir - &(SFdirs[SFdirPtr]); if ((n < 0) || (n > 2)) { return; } XawScrollbarSetThumb(selFileVScrolls[n], (double)(dir->vOrigin) / dir->nEntries, (double)(dir->nEntries < SFlistSize ? dir->nEntries : SFlistSize) / dir->nEntries); } static void SFwriteStatChar(char *name, int last, struct stat *statBuf) { name[last] = SFstatChar(statBuf); } static int SFstatAndCheck(SFDir *dir, SFEntry *entry) { struct stat statBuf; char save; int last; extern int SFchdir(); /* * must be restored before returning */ save = *(dir->path); *(dir->path) = 0; if (!SFchdir(SFcurrentPath)) { last = strlen(entry->real) - 1; entry->real[last] = 0; entry->statDone = 1; if ((!stat(entry->real, &statBuf)) #ifdef S_IFLNK || (!lstat(entry->real, &statBuf)) #endif /* ndef S_IFLNK */ ) { if (SFfunc) { char *shown; shown = NULL; if (SFfunc(entry->real, &shown, &statBuf)) { if (shown) { int len; len = strlen(shown); entry->shown = XtMalloc((unsigned)(len + 2) ); (void)strcpy(entry->shown, shown); SFwriteStatChar(entry->shown, len, &statBuf); entry->shown[len + 1] = 0; } } else { SFdeleteEntry(dir, entry); *(dir->path) = save; return 1; } } SFwriteStatChar(entry->real, last, &statBuf); } else { entry->real[last] = ' '; } } *(dir->path) = save; return 0; } static void SFdrawStrings(Window w, SFDir *dir, int from, int to) { int i; SFEntry *entry; int x; x = SFtextX - dir->hOrigin * SFcharWidth; if (dir->vOrigin + to >= dir->nEntries) { to = dir->nEntries - dir->vOrigin - 1; } for (i = from; i <= to; i++) { entry = &(dir->entries[dir->vOrigin + i]); if (!(entry->statDone)) { if (SFstatAndCheck(dir, entry)) { if (dir->vOrigin + to >= dir->nEntries) { to = dir->nEntries - dir->vOrigin - 1; } i--; continue; } } XDrawImageString(SFdisplay, w, SFtextGC, x, SFtextYoffset + i * SFentryHeight, entry->shown, strlen(entry->shown)); if (dir->vOrigin + i == dir->beginSelection) { XDrawLine(SFdisplay, w, SFlineGC, SFlineToTextH + 1, SFlowerY + i * SFentryHeight, SFlineToTextH + SFentryWidth - 2, SFlowerY + i * SFentryHeight); } if ( (dir->vOrigin + i >= dir->beginSelection) && (dir->vOrigin + i <= dir->endSelection)) { SFcompletionSegs[0].y1 = SFcompletionSegs[1].y1 = SFlowerY + i * SFentryHeight; SFcompletionSegs[0].y2 = SFcompletionSegs[1].y2 = SFlowerY + (i + 1) * SFentryHeight - 1; XDrawSegments(SFdisplay, w, SFlineGC, SFcompletionSegs, 2); } if (dir->vOrigin + i == dir->endSelection) { XDrawLine(SFdisplay, w, SFlineGC, SFlineToTextH + 1, SFlowerY + (i + 1) * SFentryHeight - 1, SFlineToTextH + SFentryWidth - 2, SFlowerY + (i + 1) * SFentryHeight - 1); } } } void SFdrawList(int n, int doScroll) { SFDir *dir; Window w; SFclearList(n, doScroll); if (SFdirPtr + n < SFdirEnd) { dir = &(SFdirs[SFdirPtr + n]); w = XtWindow(selFileLists[n]); XDrawImageString(SFdisplay, w, SFtextGC, SFtextX - dir->hOrigin * SFcharWidth, SFlineToTextV + SFaboveAndBelowText + SFcharAscent, dir->dir, strlen(dir->dir) ); SFdrawStrings(w, dir, 0, SFlistSize - 1); } } void SFdrawLists(int doScroll) { int i; for (i = 0; i < 3; i++) { SFdrawList(i, doScroll); } } static void SFinvertEntry(int n) { XFillRectangle(SFdisplay, XtWindow(selFileLists[n]), SFinvertGC, SFlineToTextH, SFcurrentInvert[n] * SFentryHeight + SFlowerY, SFentryWidth, SFentryHeight); } static unsigned long SFscrollTimerInterval(void) { static int maxVal = 200; static int varyDist = 50; static int minDist = 50; int t; int dist; if (SFcurrentListY < SFlowerY) { dist = SFlowerY - SFcurrentListY; } else if (SFcurrentListY > SFupperY) { dist = SFcurrentListY - SFupperY; } else { return (unsigned long)1; } t = maxVal - ((maxVal / varyDist) * (dist - minDist)); if (t < 1) { t = 1; } if (t > maxVal) { t = maxVal; } return (unsigned long)t; } static void SFscrollTimer(XtPointer p, XtIntervalId *id) { SFDir *dir; int save; ptrdiff_t n; UNUSED(id); n = (ptrdiff_t)p; fprintf(stderr, "SFscrollTimer called!\n"); dir = &(SFdirs[SFdirPtr + n]); save = dir->vOrigin; if (SFcurrentListY < SFlowerY) { if (dir->vOrigin > 0) { SFvSliderMovedCallback(selFileVScrolls[n], n, dir->vOrigin - 1); } } else if (SFcurrentListY > SFupperY) { if (dir->vOrigin < dir->nEntries - SFlistSize) { SFvSliderMovedCallback(selFileVScrolls[n], n, dir->vOrigin + 1); } } if (dir->vOrigin != save) { if (dir->nEntries) { XawScrollbarSetThumb(selFileVScrolls[n], (double)(dir->vOrigin) / dir->nEntries, (double)(dir->nEntries < SFlistSize ? dir-> nEntries : SFlistSize) / dir->nEntries); } } if (SFbuttonPressed) { SFscrollTimerId = XtAppAddTimeOut(SFapp, SFscrollTimerInterval(), SFscrollTimer, (XtPointer)n); } } static int SFnewInvertEntry(int n, XMotionEvent *event) { int x, y; int new; static int SFscrollTimerAdded = 0; x = event->x; y = event->y; if (SFdirPtr + n >= SFdirEnd) { return -1; } else if ((x >= 0) && (x <= SFupperX) && (y >= SFlowerY) && (y <= SFupperY) ) { SFDir *dir = &(SFdirs[SFdirPtr + n]); if (SFscrollTimerAdded) { SFscrollTimerAdded = 0; XtRemoveTimeOut(SFscrollTimerId); } new = (y - SFlowerY) / SFentryHeight; if (dir->vOrigin + new >= dir->nEntries) { return -1; } return new; } else { if (SFbuttonPressed) { SFcurrentListY = y; if (!SFscrollTimerAdded) { SFscrollTimerAdded = 1; SFscrollTimerId = XtAppAddTimeOut(SFapp, SFscrollTimerInterval(), SFscrollTimer, cast_int_to_XtPointer(n)); } } return -1; } } void SFenterList(Widget w, int n, XEnterWindowEvent *event) { int new; UNUSED(w); /* sanity */ if (SFcurrentInvert[n] != -1) { SFinvertEntry(n); SFcurrentInvert[n] = -1; } new = SFnewInvertEntry(n, (XMotionEvent *) event); if (new != -1) { SFcurrentInvert[n] = new; SFinvertEntry(n); } } void SFleaveList(Widget w, int n, XEvent *event) { UNUSED(w); UNUSED(event); if (SFcurrentInvert[n] != -1) { SFinvertEntry(n); SFcurrentInvert[n] = -1; } } void SFmotionList(Widget w, int n, XMotionEvent *event) { int new; UNUSED(w); new = SFnewInvertEntry(n, event); if (new != SFcurrentInvert[n]) { if (SFcurrentInvert[n] != -1) { SFinvertEntry(n); } SFcurrentInvert[n] = new; if (new != -1) { SFinvertEntry(n); } } } void SFvFloatSliderMovedCallback(Widget w, int n, float *fnew) { int new; new = (*fnew) * SFdirs[SFdirPtr + n].nEntries; SFvSliderMovedCallback(w, n, new); } void SFvSliderMovedCallback(Widget w, int n, int new) { int old; Window win; SFDir *dir; UNUSED(w); dir = &(SFdirs[SFdirPtr + n]); old = dir->vOrigin; dir->vOrigin = new; if (old == new) { return; } win = XtWindow(selFileLists[n]); if (ABS(new - old) < SFlistSize) { if (new > old) { XCopyArea(SFdisplay, win, win, SFscrollGC, SFlineToTextH, SFlowerY + (new - old) * SFentryHeight, SFentryWidth + SFlineToTextH, (SFlistSize - (new - old)) * SFentryHeight, SFlineToTextH, SFlowerY); XClearArea(SFdisplay, win, SFlineToTextH, SFlowerY + (SFlistSize - (new - old)) * SFentryHeight, SFentryWidth + SFlineToTextH, (new - old) * SFentryHeight, False); SFdrawStrings(win, dir, SFlistSize - (new - old), SFlistSize - 1); } else { XCopyArea(SFdisplay, win, win, SFscrollGC, SFlineToTextH, SFlowerY, SFentryWidth + SFlineToTextH, (SFlistSize - (old - new)) * SFentryHeight, SFlineToTextH, SFlowerY + (old - new) * SFentryHeight); XClearArea(SFdisplay, win, SFlineToTextH, SFlowerY, SFentryWidth + SFlineToTextH, (old - new) * SFentryHeight, False); SFdrawStrings(win, dir, 0, old - new); } } else { XClearArea(SFdisplay, win, SFlineToTextH, SFlowerY, SFentryWidth + SFlineToTextH, SFlistSize * SFentryHeight, False); SFdrawStrings(win, dir, 0, SFlistSize - 1); } } void SFvAreaSelectedCallback(Widget w, int n, int pnew) { SFDir *dir; int new; dir = &(SFdirs[SFdirPtr + n]); new = dir->vOrigin + ((double)pnew / SFvScrollHeight) * dir->nEntries; if (new > dir->nEntries - SFlistSize) { new = dir->nEntries - SFlistSize; } if (new < 0) { new = 0; } if (dir->nEntries) { float f; f = ((double)new) / dir->nEntries; XawScrollbarSetThumb(w, f, (double)(dir->nEntries < SFlistSize ? dir->nEntries : SFlistSize) / dir->nEntries); } SFvSliderMovedCallback(w, n, new); } void SFhSliderMovedCallback(Widget w, int n, float *new) { SFDir *dir; int save; UNUSED(w); dir = &(SFdirs[SFdirPtr + n]); save = dir->hOrigin; dir->hOrigin = (*new) * dir->nChars; if (dir->hOrigin == save) { return; } SFdrawList(n, SF_DO_NOT_SCROLL); } void SFhAreaSelectedCallback(Widget w, int n, int pnew) { SFDir *dir; int new; dir = &(SFdirs[SFdirPtr + n]); new = dir->hOrigin + (((double)pnew) / SFhScrollWidth) * dir->nChars; if (new > dir->nChars - SFcharsPerEntry) { new = dir->nChars - SFcharsPerEntry; } if (new < 0) { new = 0; } if (dir->nChars) { float f; f = (double)new / dir->nChars; XawScrollbarSetThumb(w, f, (double)(dir->nChars < SFcharsPerEntry ? dir->nChars : SFcharsPerEntry) / dir->nChars); SFhSliderMovedCallback(w, n, &f); } } void SFpathSliderMovedCallback(Widget w, XtPointer client_data, float *new) { SFDir *dir; int n; XawTextPosition pos; int SFdirPtrSave; UNUSED(w); UNUSED(client_data); SFdirPtrSave = SFdirPtr; SFdirPtr = (*new) * SFdirEnd; if (SFdirPtr == SFdirPtrSave) { return; } SFdrawLists(SF_DO_SCROLL); n = 2; while (SFdirPtr + n >= SFdirEnd) { n--; } dir = &(SFdirs[SFdirPtr + n]); pos = dir->path - SFcurrentPath; if (!strncmp(SFcurrentPath, SFstartDir, strlen(SFstartDir))) { pos -= strlen(SFstartDir); if (pos < 0) { pos = 0; } } XawTextSetInsertionPoint(selFileField, pos); } void SFpathAreaSelectedCallback(Widget w, XtPointer client_data, int pnew) { int new; float f; UNUSED(client_data); new = SFdirPtr + (((double)pnew) / SFpathScrollWidth) * SFdirEnd; if (new > SFdirEnd - 3) { new = SFdirEnd - 3; } if (new < 0) { new = 0; } f = ((double)new) / SFdirEnd; XawScrollbarSetThumb(w, f, (double)(SFdirEnd < 3 ? SFdirEnd : 3) / SFdirEnd); SFpathSliderMovedCallback(w, (XtPointer) NULL, &f); } Boolean SFworkProc(void) { SFDir *dir; SFEntry *entry; for (dir = &(SFdirs[SFdirEnd - 1]); dir >= SFdirs; dir--) { if (!(dir->nEntries)) { continue; } for (entry = &(dir->entries[dir->nEntries - 1]); entry >= dir->entries; entry--) { if (!(entry->statDone)) { (void)SFstatAndCheck(dir, entry); return False; } } } SFworkProcAdded = 0; return True; } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* !defined(MOTIF) */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/help-window.h0000664000175000017500000000241110363262237021357 0ustar uwabamiuwabami/* * Copyright (c) 2001-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef HELP_WINDOW_H_ #define HELP_WINDOW_H_ extern void show_help(Widget parent, const char *topic); #endif /* HELP_WINDOW_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs_scroll.h0000664000175000017500000000251310363262237022326 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef XM_PREFS_SCROLL_ #define XM_PREFS_SCROLL_ #ifdef MOTIF struct topic_info; /* forward declaration */ extern Widget prefs_scrolling(struct topic_info *info); #endif /* MOTIF */ #endif /* XM_PREFS_SCROLL_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_colorsel.c0000664000175000017500000005241611276240141021447 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Color selector window showing a range of colors, and sliders to customize them. * Heavily influenced by color_slide.c from ch. 13 of O'Reilly's Motif Programming Manual 1.2. */ #include "xdvi-config.h" #include "xdvi.h" #include "Tip.h" #include "x_util.h" #include "xm_colorsel.h" #include "xm_prefsP.h" #include "xm_prefs.h" #include "events.h" #include "dvi-draw.h" #include "util.h" #include "topic-window.h" #include "search-internal.h" #ifdef MOTIF /* entire file */ #include #include #include #include #include #include #include #include #include #include #include #include # include #include #define ROWS 7 #define COLS 10 /* for passing around information - no global data here ;-) */ struct color_info { XColor new_color; Widget tooltip; Widget new_sample; Widget r_scale; Widget g_scale; Widget b_scale; struct color_button_info *button_info; }; /* * These are the colors of the GTK/Mozilla color picker * (see e.g. http://lxr.mozilla.org/mozilla/source/toolkit/content/widgets/colorpicker.xml) * which has the colors more or less sorted by columns. * It's terminated by NULL just in case the table gets out of sync with * the row/column number. */ static const char *colors[] = { /* column 1 */ "#FFFFFF", "#CCCCCC", "#C0C0C0", "#999999", "#666666", "#333333", "#000000", /* column 2 */ "#FFCCCC", "#FF6666", "#FF0000", "#CC0000", "#990000", "#660000", "#330000", /* column 3 */ "#FFCC99", "#FF9966", "#FF9900", "#FF6600", "#CC6600", "#993300", "#663300", /* column 4 */ "#FFFF99", "#FFFF66", "#FFCC66", "#FFCC33", "#CC9933", "#996633", "#663333", /* column 5 */ "#FFFFCC", "#FFFF33", "#FFFF00", "#FFCC00", "#999900", "#666600", "#333300", /* column 6 */ "#99FF99", "#66FF99", "#33FF33", "#33CC00", "#009900", "#006600", "#003300", /* column 7 */ "#99FFFF", "#33FFFF", "#66CCCC", "#00CCCC", "#339999", "#336666", "#003333", /* column 8 */ "#CCFFFF", "#66FFFF", "#33CCFF", "#3366FF", "#3333FF", "#000099", "#000066", /* column 9 */ "#CCCCFF", "#9999FF", "#6666CC", "#6633FF", "#6600CC", "#333399", "#330099", /* column 10 */ "#FFCCFF", "#FF99FF", "#CC66CC", "#CC33CC", "#993399", "#663366", "#330033", /* safety */ NULL }; #define MOTIF 1 static void popdown_cb(Widget widget, XtPointer client_data, XtPointer call_data) { Widget dialog; struct prefs_choice *prefs = (struct prefs_choice *)client_data; UNUSED(call_data); ASSERT(prefs != NULL, "user_data in popdown_cb musn't be NULL!"); if (get_widget_by_name(&dialog, widget, Xdvi_COLOR_DIALOG_NAME, True)) { /* fprintf(stderr, "popdown!\n"); */ remove_from_deplist(prefs, dialog); XtUnmanageChild(dialog); } } static void h_update_sliders(struct color_info *cinfo) { unsigned r, g, b; r = cinfo->new_color.red >> 8; g = cinfo->new_color.green >> 8; b = cinfo->new_color.blue >> 8; XtVaSetValues(cinfo->r_scale, XmNvalue, r, NULL); XtVaSetValues(cinfo->g_scale, XmNvalue, g, NULL); XtVaSetValues(cinfo->b_scale, XmNvalue, b, NULL); } static void popdown_apply_cb(Widget widget, XtPointer client_data, XtPointer call_data) { struct color_info *cinfo = NULL; static XmDrawnButtonCallbackStruct cbs; struct prefs_choice *prefs = (struct prefs_choice *)client_data; UNUSED(call_data); ASSERT(prefs != NULL, "struct prefs_choice * in popdown_apply_cb mustn't be NULL!"); /* To update button to new color, set its button_info color and call the button's expose callback */ XtVaGetValues(widget, XmNuserData, &cinfo, NULL); ASSERT(cinfo != NULL, "XmNuserData in popdown_apply_cb musn't be NULL!"); cinfo->button_info->pixel = cinfo->new_color.pixel; cbs.reason = XmCR_EXPOSE; XtCallCallbacks(cinfo->button_info->w, XmNexposeCallback, &cbs); remove_from_deplist(prefs, widget); /* Store the current setting - FIXME: better way of converting color or pixel to string? pixel_to_str() in x_util.c is broken! */ store_preference(&(prefs->db), cinfo->button_info->resource_name, "#%.2x%.2x%.2x", cinfo->new_color.red >> 8, cinfo->new_color.green >> 8, cinfo->new_color.blue >> 8); /* Update the display to use the new foreground/background. * I don't really understand the entire color interface, but * apparently the following works, and nothing else I tried did ... */ if (strcmp(cinfo->button_info->resource_name, "foreground") == 0) { XGCValues values; fg_initial.r = cinfo->new_color.red; fg_initial.g = cinfo->new_color.green; fg_initial.b = cinfo->new_color.blue; values.foreground = resource.fore_Pixel = resource.rule_pixel = cinfo->new_color.pixel; XChangeGC(DISP, globals.gc.ruler, GCForeground, &values); scanned_page = scanned_page_color = scanned_page_reset; globals.ev.flags |= EV_NEWPAGE; } else if (strcmp(cinfo->button_info->resource_name, "background") == 0) { bg_initial.r = cinfo->new_color.red; bg_initial.g = cinfo->new_color.green; bg_initial.b = cinfo->new_color.blue; resource.back_Pixel = cinfo->new_color.pixel; scanned_page = scanned_page_color = scanned_page_reset; globals.ev.flags |= EV_RELOAD; /* EV_NEWPAGE not sufficient with color code ... */ } else if (strcmp(cinfo->button_info->resource_name, "highlight") == 0) { XGCValues values; values.foreground = resource.hl_Pixel = cinfo->new_color.pixel; XChangeGC(DISP, globals.gc.high, GCForeground, &values); /* hack to update match GC: fake change in inverted property, redraw so that GC is cleared, then change inverted property back */ resource.match_highlight_inverted = !resource.match_highlight_inverted; search_draw_inverted_regions(); resource.match_highlight_inverted = !resource.match_highlight_inverted; /* end of hack to update match GC */ globals.ev.flags |= EV_NEWPAGE; /* force redraw */ } XtUnmanageChild(widget); } static void popdown_cancel_cb(Widget widget, XtPointer client_data, XtPointer call_data) { struct prefs_choice *prefs = (struct prefs_choice *)client_data; /* fprintf(stderr, "popdown cancel; call_data: %p!\n", call_data); */ if (call_data != NULL) { /* fprintf(stderr, "removing from deplist: %p!!!\n", prefs); */ remove_from_deplist(prefs, widget); } XtUnmanageChild(widget); /* XtPopdown(XtParent(widget)); */ } static void revert_color_cb(Widget widget, XtPointer client_data, XtPointer call_data) { struct color_info *cinfo = (struct color_info *)client_data; Pixel pix; UNUSED(call_data); /* get color of old_sample button */ XtVaGetValues(widget, XmNbackground, &pix, NULL); /* fprintf(stderr, "Color: 0x%.6lx\n", pix); */ /* use this instead of XtVaSetValues on XmNbackground so that the foreground color gets also changed appropriately. */ #if XmVersion >= 1002 XmChangeColor(cinfo->new_sample, pix); #else XtVaSetValues(cinfo->new_sample, XmNbackground, pix, NULL); #endif /* update sliders */ XFreeColors(DISP, G_colormap, &(cinfo->new_color.pixel), 1, 0); pixel_to_color(pix, &(cinfo->new_color), DISP, G_colormap); h_update_sliders(cinfo); } static void show_color_cb(Widget widget, XtPointer client_data, XtPointer call_data) { struct color_info *cinfo = (struct color_info *)client_data; Pixel pix; UNUSED(call_data); XtVaGetValues(widget, XmNbackground, &pix, NULL); /* fprintf(stderr, "Color: 0x%.6lx\n", pix); */ /* use this instead of XtVaSetValues on XmNbackground so that the foreground color gets also changed appropriately. */ #if XmVersion >= 1002 XmChangeColor(cinfo->new_sample, pix); #else XtVaSetValues(cinfo->new_sample, XmNbackground, pix, NULL); #endif /* update sliders */ XFreeColors(DISP, G_colormap, &(cinfo->new_color.pixel), 1, 0); pixel_to_color(pix, &(cinfo->new_color), DISP, G_colormap); h_update_sliders(cinfo); } static void slider_cb(Widget widget, XtPointer client_data, XtPointer call_data) { struct color_info *cinfo = (struct color_info *)client_data; XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct *)call_data; /* fprintf(stderr, "Pixel1 : 0x%.6lx\n", cinfo->new_color.pixel); */ /* reuse cinfo->new_color */ XFreeColors(DISP, G_colormap, &(cinfo->new_color.pixel), 1, 0); if (widget == cinfo->r_scale) { cinfo->new_color.red = cbs->value << 8; /* << 8 == * 65535 */ } else if (widget == cinfo->g_scale) { cinfo->new_color.green = cbs->value << 8; } else if (widget == cinfo->b_scale) { cinfo->new_color.blue = cbs->value << 8; } if (!XAllocColor(DISP, G_colormap, &(cinfo->new_color))) { XDVI_ERROR((stderr, "Couldn't XAllocColor\n")); return; } /* fprintf(stderr, "Pixel: 0x%.6lx\n", cinfo->new_color.pixel); */ #if XmVersion >= 1002 /* if avaliable, use this so that the foreground color also gets updated appropriately: */ XmChangeColor(cinfo->new_sample, cinfo->new_color.pixel); #else XtVaSetValues(cinfo->new_sample, XmNbackground, cinfo->new_color.pixel, NULL); #endif } static Widget h_create_color_matrix(Widget parent, Widget top, struct color_info *cinfo) { int i, j; const char **color_ptr = colors; Widget matrix = XtVaCreateManagedWidget("color_matrix", xmRowColumnWidgetClass, parent, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, top, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNpacking, XmPACK_COLUMN, XmNnumColumns, COLS, XmNorientation, XmVERTICAL, XmNbackground, BlackPixelOfScreen(XtScreen(parent)), XmNspacing, 1, XmNmarginWidth, 1, XmNmarginHeight, 1, NULL); for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { Pixel pix = BlackPixelOfScreen(XtScreen(parent)); Widget button; if (*color_ptr == NULL) /* safety */ break; str_to_pixel(top, *color_ptr++, &pix); /* fprintf(stderr, "creating button %d, %d - %s\n", i, j, k % 2 ? "b" : "w"); */ button = XtVaCreateManagedWidget("c_button", xmDrawnButtonWidgetClass, matrix, XmNbackground, pix, XmNheight, 19, XmNwidth, 19, XmNmarginWidth, 0, XmNmarginHeight, 0, XmNhighlightThickness, 0, XmNshadowThickness, 0, NULL); XtAddCallback(button, XmNactivateCallback, show_color_cb, cinfo); } } return matrix; } static void h_create_sliders(Widget parent, Widget top, struct color_info *cinfo) { XmString str; Widget r_label, g_label, b_label; Widget r_scale, g_scale, b_scale; Dimension curr, max; Arg scale_args[8]; Arg label_args[8]; int scale_n = 0; XtSetArg(scale_args[scale_n], XmNmaximum, 255); scale_n++; /* True is an older setting of XmNshowValue that should also work with 2.x */ XtSetArg(scale_args[scale_n], XmNshowValue, True); scale_n++; XtSetArg(scale_args[scale_n], XmNorientation, XmHORIZONTAL); scale_n++; #if XmVersion >= 2000 XtSetArg(scale_args[scale_n], XmNshowArrows, XmEACH_SIDE); scale_n++; /* XmVersion < 2000 only had `True' which was the default anyway */ #endif str = XmStringCreateLocalized("Red"); XtSetArg(label_args[0], XmNlabelString, str); r_label = XtCreateManagedWidget("r_label", xmLabelGadgetClass, parent, label_args, 1); XmStringFree(str); r_scale = XtCreateWidget("r_scale", xmScaleWidgetClass, parent, scale_args, scale_n); cinfo->r_scale = r_scale; XtAddCallback(r_scale, XmNdragCallback, slider_cb, cinfo); XtAddCallback(r_scale, XmNvalueChangedCallback, slider_cb, cinfo); str = XmStringCreateLocalized("Green"); XtSetArg(label_args[0], XmNlabelString, str); g_label = XtCreateManagedWidget("g_label", xmLabelGadgetClass, parent, label_args, 1); XmStringFree(str); g_scale = XtCreateWidget("g_scale", xmScaleWidgetClass, parent, scale_args, scale_n); cinfo->g_scale = g_scale; XtAddCallback(g_scale, XmNdragCallback, slider_cb, cinfo); XtAddCallback(g_scale, XmNvalueChangedCallback, slider_cb, cinfo); str = XmStringCreateLocalized("Blue"); XtSetArg(label_args[0], XmNlabelString, str); b_label = XtCreateManagedWidget("b_label", xmLabelGadgetClass, parent, label_args, 1); XmStringFree(str); b_scale = XtCreateWidget("b_scale", xmScaleWidgetClass, parent, scale_args, scale_n); cinfo->b_scale = b_scale; XtAddCallback(b_scale, XmNdragCallback, slider_cb, cinfo); XtAddCallback(b_scale, XmNvalueChangedCallback, slider_cb, cinfo); /* get max width of labels, and adjust scale size to what's left */ XtVaGetValues(r_label, XmNwidth, &curr, NULL); XtVaGetValues(g_label, XmNwidth, &max, NULL); if (curr > max) max = curr; XtVaGetValues(b_label, XmNwidth, &curr, NULL); if (curr > max) max = curr; /* we know the width of the color selector is about 200 pixels (10 fields each 20 wide), so we use that as max length */ curr = 200 - max - 2; /* some additional offset */ /* fprintf(stderr, "width of slider: %d\n", curr); */ /* fprintf(stderr, "width of string: %d\n", max); */ /* attach widgets; needs to be done after creating them since r_label attachment references g_label etc. */ XtVaSetValues(r_label, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, g_label, XmNbottomOffset, 20, /* needed to make label visible */ NULL); XtVaSetValues(r_scale, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, top, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, g_label, XmNbottomOffset, 20, /* needed to make label visible */ XmNscaleWidth, curr, NULL); XtVaSetValues(g_label, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, b_label, XmNbottomOffset, 20, /* needed to make label visible */ NULL); XtVaSetValues(g_scale, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, b_label, XmNbottomOffset, 20, /* needed to make label visible */ XmNscaleWidth, curr, NULL); XtVaSetValues(b_label, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 15, NULL); XtVaSetValues(b_scale, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 15, XmNscaleWidth, curr, NULL); XtManageChild(r_scale); XtManageChild(g_scale); XtManageChild(b_scale); h_update_sliders(cinfo); } static Widget h_create_shell(Widget parent, struct color_info *cinfo) { Widget shell, dialog, form, button_row, color_matrix; Widget old_sample, new_sample; Widget tip_shell; Atom WM_DELETE_WINDOW; Arg args[32]; int n; XmString str; Pixel old_pixel = cinfo->button_info->pixel; /* hack to disable resizing of the shell, since this messes up the color matrix badly */ int decoration = MWM_DECOR_ALL | MWM_DECOR_RESIZEH | MWM_DECOR_MENU | MWM_DECOR_MINIMIZE | MWM_DECOR_MAXIMIZE; int functions = MWM_FUNC_ALL | MWM_FUNC_RESIZE | MWM_FUNC_MAXIMIZE; struct color_button_info *binfo = cinfo->button_info; struct topic_info *tinfo = binfo->tinfo; struct prefs_choice *prefs = (struct prefs_choice *)tinfo->data; /* struct prefs_choice *prefs; */ n = 0; XtSetArg(args[n], XmNuserData, cinfo); n++; /* XtSetArg(args[n], XmNdeleteResponse, XmDO_NOTHING); n++; */ /* XtSetArg(args[n], XmNnoResize, True); n++; */ /* XtSetArg(args[n], XmNmwmFunctions, functions); n++; */ /* XtSetArg(args[n], XmNmwmDecorations, decoration); n++; */ XtSetArg(args[n], XtNtitle, "Xdvik: Select Color"); n++; dialog = XmCreatePromptDialog(parent, Xdvi_COLOR_DIALOG_NAME, args, n); /* unmanage stuff to get a `scratch' widget */ XtUnmanageChild(XtNameToWidget(dialog, "Help")); XtUnmanageChild(XtNameToWidget(dialog, "Text")); XtUnmanageChild(XtNameToWidget(dialog, "Selection")); shell = XtParent(dialog); XtVaSetValues(shell, XmNdeleteResponse, XmDO_NOTHING, XmNnoResize, True, XmNmwmFunctions, functions, XmNmwmDecorations, decoration, NULL); /* cinfo->new_color is a allocated/freed by request; initialize it with old_pixel */ XAllocColor(DISP, G_colormap, &(cinfo->new_color)); cinfo->new_color.flags = DoRed | DoGreen | DoBlue; XFreeColors(DISP, G_colormap, &(cinfo->new_color.pixel), 1, 0); pixel_to_color(old_pixel, &(cinfo->new_color), DISP, G_colormap); tip_shell = XtVaCreatePopupShell("tipShell", tipWidgetClass, parent, XtNwidth, 1, XtNheight, 1, NULL); cinfo->tooltip = tip_shell; form = XtVaCreateWidget("form", xmFormWidgetClass, dialog, XmNhorizontalSpacing, 10, XmNverticalSpacing, 10, XmNallowResize, False, NULL); button_row = XtVaCreateManagedWidget("button_row", xmRowColumnWidgetClass, form, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNorientation, XmHORIZONTAL, XmNpacking, XmPACK_COLUMN, XmNspacing, 8, XmNmarginWidth, 1, XmNmarginHeight, 1, NULL); str = XmStringCreateLocalized("Old"); old_sample = XtVaCreateManagedWidget(Xdvi_COLOR_DIALOG_OLD_SAMPLE_NAME, xmPushButtonWidgetClass, button_row, XmNbackground, old_pixel, XmNlabelString, str, XmNhighlightThickness, 0, XmNshadowThickness, 1, NULL); XtAddCallback(old_sample, XmNactivateCallback, revert_color_cb, cinfo); XmStringFree(str); str = XmStringCreateLocalized("New"); new_sample = XtVaCreateManagedWidget("new_sample", xmPushButtonWidgetClass, button_row, XmNbackground, cinfo->new_color.pixel, XmNlabelString, str, XmNhighlightThickness, 0, XmNshadowThickness, 1, NULL); XmStringFree(str); /* disable clicking on the new_sample button */ XtInsertEventHandler(new_sample, KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask, True, block_event_callback, (XtPointer)0, 0); cinfo->new_sample = new_sample; color_matrix = h_create_color_matrix(form, button_row, cinfo); h_create_sliders(form, color_matrix, cinfo); XtManageChild(form); XtAddCallback(dialog, XmNokCallback, popdown_apply_cb, prefs); XtAddCallback(dialog, XmNcancelCallback, popdown_cancel_cb, prefs); XtManageChild(dialog); add_to_deplist(prefs, dialog); TipAddWidget(tip_shell, old_sample, "Click to revert to old color"); TipAddWidget(tip_shell, new_sample, "Preview of new color"); /* TipAddWidget(tip_shell, color_matrix, "Select color"); */ WM_DELETE_WINDOW = XmInternAtom(DISP, "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(shell, WM_DELETE_WINDOW, popdown_cb, prefs); return dialog; } void popup_color_dialog(Widget parent, struct color_button_info *button_info) { static Widget shell; static Boolean first_time = True; /* Must be static so that we can pass its address around */ static struct color_info cinfo; struct topic_info *tinfo = button_info->tinfo; struct prefs_choice *prefs = (struct prefs_choice *)tinfo->data; cinfo.button_info = button_info; if (first_time) { shell = h_create_shell(parent, &cinfo); first_time = False; } else { /* Already created, but we may need to change the colors of old_sample and new_sample. This is done by changing the value of old_sample and invoking its activate callback, which will `revert' new_sample to the same color. */ Widget w; if (get_widget_by_name(&w, shell, Xdvi_COLOR_DIALOG_OLD_SAMPLE_NAME, True)) { #if XmVersion >= 1002 XmChangeColor(w, cinfo.button_info->pixel); #else XtVaSetValues(w, XmNbackground, cinfo.button_info->pixel, NULL); #endif XtCallCallbacks(w, XmNactivateCallback, &cinfo); } add_to_deplist(prefs, shell); XtManageChild(shell); } } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs_helpers.h0000664000175000017500000000257210363262237022477 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef XM_PREFS_HELPERS_ #define XM_PREFS_HELPERS_ #ifdef MOTIF struct topic_info; /* forward declaration */ extern Widget prefs_helpers(struct topic_info *info); extern void update_preferences_helpers(void); #endif /* MOTIF */ #endif /* XM_PREFS_HELPERS_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs_fonts.h0000664000175000017500000000273310363262237022165 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef XM_PREFS_FONTS_ #define XM_PREFS_FONTS_ #ifdef MOTIF struct topic_info; /* forward declaration */ extern Widget prefs_fonts_and_colors(struct topic_info *info); extern void update_preferences_color(void); extern void update_preferences_hyperlinks(void); extern void update_preferences_darkness(void); #endif /* MOTIF */ #endif /* XM_PREFS_FONTS_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs_page.h0000664000175000017500000000277110363262237021752 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef XM_PREFS_PAGE_ #define XM_PREFS_PAGE_ #ifdef MOTIF struct topic_info; /* forward declaration */ extern Widget prefs_paper(struct topic_info *info); extern void update_preferences_windowsize(void); extern void restore_preferences_shrink(void); extern void update_preferences_shrink(void); extern void update_preferences_paper(void); #endif /* MOTIF */ #endif /* XM_PREFS_PAGE_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/statusline.c0000664000175000017500000003744311217712530021320 0ustar uwabamiuwabami/*------------------------------------------------------------ statusline for the xdvi(k) previewer written by S. Ulrich (ulrich@cis.uni-muenchen.de) 2000/02/25 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------*/ #include "xdvi-config.h" #include "xdvi.h" #include "version.h" #include "statusline.h" #include "xm_menu.h" #include "x_util.h" #include "pagehist.h" #include "util.h" #include #include "my-vsnprintf.h" #include #include #include # ifdef MOTIF # include # include # include # include # else # include # include # endif Widget statusline; static Boolean initialized = False; /* * only print MAX_LEN characters to the statusline * (it's only 1 line after all) */ #define MAX_LEN 512 /* for saving the statusline string if the statusline is * destroyed and recreated */ static char g_string_savebuf[MAX_LEN + 2]; static int m_statusline_h = 20; /* access method */ int get_statusline_height(void) { return m_statusline_h; } #if MOTIF static void handle_statusline_event(Widget w, XtPointer client_data, XEvent *ev, Boolean *cont) { /* const char *text = (const char *)client_data; */ UNUSED(w); UNUSED(client_data); UNUSED(cont); /* fprintf(stderr, "text: |%s|; event: %p\n", text, ev); */ /* only used to do this if page history was already active, but it's probably nicer to be able to get the history by clicking on the statusline ... */ if (/* strncmp(text, "Page history:", sizeof "Page history:" - 1) == 0 && */ ev != NULL) { XmTextPosition pos = XmTextGetCursorPosition(statusline); char *ptr1, *ptr2; int diff = 0; /* fprintf(stderr, "pos: %d\n", pos); */ if (pos == 0) { /* just display the page history */ page_history_move(0); return; } ptr1 = g_string_savebuf + pos; ptr2 = strchr(g_string_savebuf, '['); if (ptr2 == NULL) { /* some other string, also display the page history */ page_history_move(0); return; } /* fprintf(stderr, "ptr1: |%s|; ptr2: |%s|\n", ptr1, ptr2); */ while (ptr1 < ptr2) { if (*ptr1 == ' ' && *(ptr1 + 1) != '-') /* separator */ diff--; ptr1++; } while (ptr1 > ptr2) { if (*ptr1 == ' ' && *(ptr1 - 1) != '-') /* separator */ diff++; ptr1--; } /* fprintf(stderr, "diff: %d\n", diff); */ page_history_move(diff); } } #endif /* MOTIF */ /* * Create the statusline widget. To be called at the beginning * of the program, and when expert mode is switched off. * * Side effects: * sets to the height of the statusline in pixels. */ Widget create_statusline( #ifdef MOTIF Widget parent #else void #endif ) { #ifndef MOTIF Position vport_h; Position clip_x; Position clip_w; static Position my_h = 0; #endif /* * FIXME: is there a better way to set the y position depending on * the height of the widget? * It doesn't work to change the value of XtNy *after* creating * the widget! */ if (!initialized) { #ifndef MOTIF /* * determine height of statusline (depending on the font used). * This is not changeable at runtime, so it's determined once and * for all at program start. */ statusline = XtVaCreateWidget("statusline", labelWidgetClass, globals.widgets.vport_widget, XtNlabel, (XtArgVal) "test", NULL); XtVaGetValues(statusline, XtNheight, &my_h, NULL); m_statusline_h = my_h; XtDestroyWidget(statusline); #endif initialized = True; /* initialize g_string_savebuf */ sprintf(g_string_savebuf, "This is xdvik %s", XDVI_TERSE_VERSION_INFO); } #ifndef MOTIF /* determine position and width of statusline */ XtVaGetValues(globals.widgets.clip_widget, XtNx, &clip_x, XtNwidth, &clip_w, NULL); XtVaGetValues(globals.widgets.vport_widget, XtNheight, &vport_h, NULL); if (vport_h - my_h <= 0) { XDVI_FATAL((stderr, "Window height too small for statusline (minimum value: %d).", my_h)); return NULL; } statusline = XtVaCreateManagedWidget("statusline", labelWidgetClass, globals.widgets.vport_widget, XtNlabel, (XtArgVal) g_string_savebuf, XtNwidth, clip_w, XtNx, clip_x - 1, /* so that left border becomes invisible */ XtNy, vport_h - my_h, XtNjustify, XtJustifyLeft, /* same as for the buttons line */ XtNborder, (XtArgVal) resource.fore_Pixel, NULL); #else statusline = XtVaCreateManagedWidget("statusline", xmTextFieldWidgetClass, parent, XmNalignment, XmALIGNMENT_END, XmNdepth, (XtArgVal) G_depth, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNleftOffset, 1, XmNrightOffset, 1, XmNbottomOffset, 1, XmNtopOffset, 0, XmNcursorPositionVisible, False, XmNautoShowCursorPosition, False, XmNmarginWidth, 4, XmNmarginHeight, 1, XmNeditable, False, XmNtraversalOn, False, XmNvalue, g_string_savebuf, NULL); /* Block processing of most interactive events on this widget, except * for button events that should navigate the page history. */ XtInsertEventHandler(statusline, KeyPressMask | KeyReleaseMask | PointerMotionMask| PointerMotionHintMask | ButtonMotionMask | #if !MOTIF ButtonPressMask | ButtonReleaseMask | #endif FocusChangeMask, /* ButtonPressMask | ButtonReleaseMask | */ /* PointerMotionMask| PointerMotionHintMask | */ /* ButtonMotionMask | */ True, block_event_callback, (XtPointer)0, 0); #if MOTIF XtInsertEventHandler(statusline, /* suboptimal, but needs to be release not press * since we want to query the current cursor position, * and that may not be set yet in the press event(?). */ ButtonReleaseMask, True, handle_statusline_event, (XtPointer)g_string_savebuf, XtListTail); #endif /* MOTIF */ #endif return statusline; } void toggle_statusline(void) { #ifdef MOTIF if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) == 0) XtUnmanageChild(statusline); else XtManageChild(statusline); set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert); #else static Boolean initialized = False; static Boolean statusline_mapped = False; Boolean make_statusline_visible = False; Boolean make_statusline_invisible = False; if (!initialized) { statusline_mapped = (resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0; initialized = True; } if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) == 0) { if (statusline_mapped) make_statusline_invisible = True; } else { if (!statusline_mapped) make_statusline_visible = True; } if (make_statusline_invisible) { XtDestroyWidget(statusline); statusline_mapped = False; } if (make_statusline_visible) { static Dimension window_w, window_h; static Arg arg_wh[] = { {XtNwidth, (XtArgVal) &window_w}, {XtNheight, (XtArgVal) &window_h}, }; #ifdef MOTIF XtGetValues(globals.widgets.main_window, arg_wh, XtNumber(arg_wh)); #else XtGetValues(globals.widgets.vport_widget, arg_wh, XtNumber(arg_wh)); #endif XtVaSetValues(globals.widgets.vport_widget, XtNresizable, (XtArgVal)True, NULL); TRACE_GUI((stderr, "statusline: w %d, h %d", window_w, window_h)); XtVaSetValues(globals.widgets.vport_widget, XtNwidth, (XtArgVal)window_w, XtNheight, (XtArgVal)window_h, NULL); TRACE_GUI((stderr, "after statusline")); create_statusline(); statusline_mapped = True; } #endif /* MOTIF */ } /*------------------------------------------------------------ * handle_statusline_resize * * Arguments: * void * * Returns: * void * * Purpose: * Resize the statusline when the total window size changes. * *------------------------------------------------------------*/ void handle_statusline_resize(void) { #ifndef MOTIF if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) == 0) { return; } if (!statusline) return; /* apparently the x,y values of a widget can only be set at creation time, so * the following won't work: */ #if 0 /* BROKEN Position vport_h, clip_x, clip_w; BROKEN static Position my_h = 0; BROKEN BROKEN XtVaGetValues(globals.widgets.clip_widget, BROKEN XtNx, &clip_x, BROKEN XtNwidth, &clip_w, BROKEN NULL); BROKEN XtVaGetValues(globals.widgets.vport_widget, BROKEN XtNheight, &vport_h, BROKEN NULL); BROKEN BROKEN XtUnmanageChild(statusline); BROKEN XtVaSetValues(statusline, BROKEN XtNlabel, (XtArgVal) "", BROKEN XtNwidth, clip_w, BROKEN XtNx, clip_x - 1, BROKEN XtNy, vport_h - my_h, BROKEN XtNborderWidth, 1, BROKEN XtNjustify, XtJustifyLeft, BROKEN XtNborder, (XtArgVal) resource.fore_Pixel, BROKEN NULL); BROKEN XtManageChild(statusline); BROKEN XFlush(DISP); */ #endif /* only this will: */ XtDestroyWidget(statusline); create_statusline(); #endif } /* * clear statusline by printing an empty message to it. */ static void clear_statusline(void) { if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0) { # ifdef MOTIF XmTextFieldSetString(statusline, " "); # else XtVaSetValues(statusline, XtNlabel, " ", NULL); # endif XFlush(DISP); } strcpy(g_string_savebuf, " "); } /* force a statusline update, no matter how busy the application is. Use this with care (only for important messages). */ void force_statusline_update(void) { #ifdef MOTIF XmUpdateDisplay(globals.widgets.top_level); #else XEvent event; XSync(DISP, False); while (XCheckMaskEvent(DISP, ExposureMask, &event)) XtDispatchEvent(&event); #endif /* MOTIF */ } /* * timeout - if > 0, timeout in seconds after which the message will * be deleted again. If < 0, message will remain (until * another message overprints it) * fmt - message, a C format string * * If expert mode is off, print to the statusline; else, print * to stdout, unless the `hushstdout' option is specified. */ static XtIntervalId clear_timeout_id = 0; static void clear_statusline_timer_proc(XtPointer client_data, XtIntervalId *id) { UNUSED(client_data); UNUSED(id); if (clear_timeout_id) { clear_statusline(); clear_timeout_id = 0; } } static void internal_print_statusline(Boolean error, statusTimerT timeout, const char *old_content, const char *fmt, va_list argp) { if (!XtIsRealized(globals.widgets.top_level) || !initialized || (resource.expert_mode & XPRT_SHOW_STATUSLINE) == 0) { /* only print errors to stdout */ if (!error) return; if (!resource.hush_stdout && strlen(fmt) > 0) { /* check for strlen since sometimes we clear the statusline by printing "" to it, and we don't want that on stdout */ fprintf(stdout, "xdvi: "); if (old_content != NULL) (void)fputs(old_content, stdout); (void)vfprintf(stdout, fmt, argp); fputc('\n', stdout); fflush(stdout); } } else { char buf[MAX_LEN + 1]; size_t offset = 0; if (old_content != NULL && old_content[0] != '\0') { offset += strlen(old_content); strncpy(buf, old_content, MAX_LEN); /* append separating space */ if (strlen(old_content) < MAX_LEN - 1) { strcat(buf, " "); offset++; } } VSNPRINTF(buf + offset, MAX_LEN - offset, fmt, argp); /* just throw away strings longer than MAX_LEN */ buf[MAX_LEN] = '\0'; /* terminate buf */ /* * save current contents of statusline so that toggling the statusline * on and off will display the same text again */ strcpy(g_string_savebuf, buf); #ifdef MOTIF XmTextFieldSetString(statusline, buf); #else XtVaSetValues(statusline, XtNlabel, buf, NULL); #endif /* fprintf(stderr, "timeout: %d, id: %ld\n", timeout, clear_timeout_id); */ if (timeout > 0) { timeout *= 1000; /* convert to miliseconds */ if (clear_timeout_id) { /* fprintf(stderr, "clearing!\n"); */ if (globals.debug & DBG_EVENT) fprintf(stderr, "%s:%d: removing timeout %ld\n", __FILE__, __LINE__, clear_timeout_id); XtRemoveTimeOut(clear_timeout_id); } clear_timeout_id = XtAppAddTimeOut(globals.app, timeout, clear_statusline_timer_proc, (XtPointer) NULL); } } } /* * Append the varargs-string `fmt' to the currnent contents of the statusline * erasing it after `timeout' seconds if timeout > 0, unless the current statusline * contents matches pattern - in that case, overwrite the contents. */ void statusline_append(statusTimerT timeout, const char *pattern, const char *fmt, ...) { const char *buf = NULL; va_list argp; if (XtIsRealized(globals.widgets.top_level) && initialized && (resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0) { /* get current statusline contents */ #ifdef MOTIF XtVaGetValues(statusline, XmNvalue, &buf, NULL); #else XtVaGetValues(statusline, XtNlabel, &buf, NULL); #endif } while (buf != NULL && isspace((int)*buf)) /* skip spaces inserted by statusline appending */ buf++; va_start(argp, fmt); if (buf != NULL && memcmp(buf, pattern, strlen(pattern)) == 0) { buf = NULL; } internal_print_statusline(false, timeout, buf, fmt, argp); va_end(argp); } /* * Print the varargs-string `fmt' to the currnent contents of the statusline, * erasing it after `timeout' seconds if timeout > 0. */ void statusline_info(statusTimerT timeout, const char *fmt, ...) { va_list argp; va_start(argp, fmt); /* for the time being, we don't differentiate between info/error * wrt. printing to stdout/stderr. We could probably at some point * remove the printing to stdout altogether (it's a bit un-GUIsh), * but then there's already an option 'hushstdout' to suppress it ... */ internal_print_statusline(True, timeout, NULL, fmt, argp); va_end(argp); } void statusline_error(statusTimerT timeout, const char *fmt, ...) { va_list argp; va_start(argp, fmt); internal_print_statusline(True, timeout, NULL, fmt, argp); va_end(argp); } void statusline_clear(void) { statusline_info(STATUS_SHORT, ""); } /* * Erase the contents of the statusline if it starts with 'pattern'. */ void statusline_erase(const char *pattern) { const char *buf = NULL; if (XtIsRealized(globals.widgets.top_level) && initialized && (resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0) { /* get current statusline contents */ #ifdef MOTIF XtVaGetValues(statusline, XmNvalue, &buf, NULL); #else XtVaGetValues(statusline, XtNlabel, &buf, NULL); #endif if (strncmp(buf, pattern, strlen(pattern)) == 0) { statusline_clear(); } } } xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/print-dialog.h0000664000175000017500000000264411032450154021512 0ustar uwabamiuwabami/* * Copyright (c) 2003-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef PRINT_DIALOG_H_ #define PRINT_DIALOG_H_ #include "print-internal.h" extern void save_or_print_callback(struct save_or_print_info *info); extern void cancel_saving(struct save_or_print_info *info); extern void notify_print_dialog_have_marked(void); #endif /* PRINT_DIALOG_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/message-window.h0000664000175000017500000001044711032450154022052 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef MESSAGE_WINDOW_H_ #define MESSAGE_WINDOW_H_ #define Xdvi_MESSAGE_DIALOG_NAME "dialog" #define Xdvi_MESSAGE_SHELL_NAME "message_popup" /* * Callback before the message window is closed. It is passed * the message window widget ID, and the next XtPointer argument * in the message dialog calls. */ typedef void (*pre_message_cbT)(Widget w, XtPointer arg); /* * Additional callbacks passed in as argument. It is passed * the next XtPointer argument in the message dialog calls. */ typedef void (*message_cbT)(XtPointer arg); /* preferred size of dialogs, only used for Xaw ... not really hints, but hard-coded values ;-) */ typedef enum popupMessageSizeHintT_ { SIZE_SMALL, SIZE_MEDIUM, SIZE_LARGE } popupMessageSizeHintT; typedef enum popupMessageT_ { MSG_QUESTION, MSG_HELP, MSG_INFO, MSG_WARN, MSG_ERR } popupMessageT; extern Widget popup_message(Widget parent, popupMessageT type, const char *helptext, const char *format, ...); extern Widget popup_message_sized(Widget parent, popupMessageT type, popupMessageSizeHintT size, const char *helptext, const char *format, ...); extern Widget positioned_popup_message(Widget parent, popupMessageT type, int x, int y, const char *helptext, const char *format, ...); extern Widget choice_dialog(Widget parent, popupMessageT type, const char *helptext, #ifndef MOTIF const char *ret_action_str, #endif pre_message_cbT pre_cb, XtPointer arg, const char *ok_label, message_cbT ok_cb, XtPointer ok_args, const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_args, const char *format, ...); #if MOTIF /* 3 buttons currently only implemented for Motif */ extern Widget choice3_dialog(Widget parent, popupMessageT type, const char *helptext, pre_message_cbT pre_cb, XtPointer arg, const char *yes_label, message_cbT yes_cb, XtPointer yes_args, const char *no_label, message_cbT no_cb, XtPointer no_args, const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_args, const char *format, ...); #endif extern Widget choice_dialog_sized(Widget parent, popupMessageT type, popupMessageSizeHintT size, const char *helptext, #ifndef MOTIF const char *ret_action_str, #endif pre_message_cbT pre_cb, XtPointer arg, const char *ok_label, message_cbT ok_cb, XtPointer ok_args, const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_args, const char *format, ...); extern Widget positioned_choice_dialog(Widget parent, popupMessageT type, int x_pos, int y_pos, const char *helptext, #ifndef MOTIF const char *ret_action_str, #endif pre_message_cbT pre_cb, XtPointer arg, const char *ok_label, message_cbT ok_cb, XtPointer ok_args, const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_args, const char *format, ...); extern void warn_overstrike(void); extern Boolean raise_message_windows(void); extern Boolean is_message_window(Widget w); extern Boolean kill_message_window(Widget w); #endif /* MESSAGE_WINDOW_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/topic-window.c0000664000175000017500000004563011032450154021541 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * `Topics' window framework used by help and preferences windows. * Contains a list of topics on the left-hand side, and corresponding * contents on the right-hand side. */ #include "xdvi-config.h" #include "xdvi.h" #if MOTIF # include # include # include # include # include # include # include # include # include # include # include #else /* MOTIF */ # include # include # include # include # include # include #endif /* MOTIF */ #include "version.h" #include "topic-window.h" #include "string-utils.h" #include "util.h" #include "x_util.h" #if MOTIF /* special formatting for headings in right window, if desired */ const char *const TAG_NORMAL = "NORMAL"; const char *const TAG_TOPIC_HEADING = "TOPIC_HEADING"; const char *const TAG_TOPIC_LABEL = "TOPIC_LABEL"; # define SHELL_WIDGET_CLASS xmDialogShellWidgetClass # define PANED_WIDGET_CLASS xmPanedWindowWidgetClass # define FORM_WIDGET_CLASS xmFormWidgetClass # define FORM_ARGS XmNhorizontalSpacing, 10, \ NULL # define HELP_SHELL_ARGS XmNdeleteResponse, XmDO_NOTHING, \ XtNmappedWhenManaged, False, \ NULL # define HELP_PANED_ARGS XmNsashWidth, 1, \ XmNuserData, info, \ XmNsashHeight, 1, \ NULL # define LEFT_FORM_ARGS XmNtopAttachment, XmATTACH_FORM, \ XmNleftAttachment, XmATTACH_FORM, \ XmNbottomAttachment, XmATTACH_FORM, \ XmNtopOffset, 9, \ XmNbottomOffset, 10, \ NULL # define RIGHT_FORM_ARGS XmNtopAttachment, XmATTACH_FORM, \ XmNleftAttachment, XmATTACH_WIDGET, \ XmNleftWidget, left_form, \ XmNrightAttachment, XmATTACH_FORM, \ XmNbottomAttachment, XmATTACH_FORM, \ XmNbottomOffset, 10, \ NULL # define ACTION_AREA_ARGS NULL #else /* MOTIF */ # define SHELL_WIDGET_CLASS transientShellWidgetClass # define PANED_WIDGET_CLASS panedWidgetClass # define FORM_WIDGET_CLASS formWidgetClass # define FORM_ARGS XtNdefaultDistance, 14, \ NULL # define HELP_SHELL_ARGS XtNx, 60, \ XtNy, 80, \ XtNtransientFor, globals.widgets.top_level, \ XtNtranslations, xlats, \ XtNtransientFor, parent, \ XtNallowShellResize, False, \ NULL # define HELP_PANED_ARGS NULL # define LEFT_FORM_ARGS XtNtop, XtChainTop, \ XtNbottom, XtChainBottom, \ XtNleft, XtChainLeft, \ XtNright, XtChainLeft, \ XtNborderWidth, 0, \ NULL # define RIGHT_FORM_ARGS XtNfromHoriz, left_form, \ XtNtop, XtChainTop, \ XtNbottom, XtChainBottom, \ XtNleft, XtChainLeft, \ XtNright, XtChainRight, \ XtNborderWidth, 0, \ NULL # define ACTION_AREA_ARGS XtNdefaultDistance, 6, \ XtNshowGrip, False, \ XtNskipAdjust, True, \ NULL #endif /* MOTIF */ static void ok_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; UNUSED(w); UNUSED(call_data); ASSERT(info != NULL, "No info passed to callback!"); if (info->ok_callback != NULL) info->ok_callback(info); XtPopdown(info->shell); } static void cancel_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; UNUSED(w); UNUSED(call_data); ASSERT(info != NULL, "No info passed to callback!"); if (info->cancel_callback != NULL) info->cancel_callback(info); XtPopdown(info->shell); } #if MOTIF /* * We are overriding this since otherwise the Text widget would attempt to * first move the invisible cursor instead of the scroll bars. */ /* FIXME: This gives a warning: Warning: Actions not found: scroll-one-line-down, scroll-one-line-up */ /* "osfUp: scroll-one-line-down()\n" */ /* "osfDown: scroll-one-line-up()\n" */ #endif #if MOTIF static XmString #else static char * #endif create_label_string(const char *title, const char *subtitle) { #if MOTIF XmString label; if (subtitle == NULL) { /* simple bold label */ label = XmStringCreate((char *)title, (char *)TAG_TOPIC_LABEL); } else { /* two-part title with subheading */ XmString s1, s2, s3, s4; s1 = XmStringCreate((char *)title, (char *)TAG_TOPIC_HEADING); s2 = XmStringCreate((char *)" ", (char *)TAG_NORMAL); s3 = XmStringCreate((char *)subtitle, (char *)TAG_NORMAL); s4 = XmStringConcat(s1, s2); label = XmStringConcat(s4, s3); XmStringFree(s1); XmStringFree(s2); XmStringFree(s3); XmStringFree(s4); } #else char *label = xstrdup(title); if (subtitle != NULL && strlen(subtitle) > 0) { label = xstrcat(label, " - "); label = xstrcat(label, subtitle); } #endif return label; } static Widget create_label_widget(Widget parent, const char *name, struct topic_info *info) { Widget label; #if MOTIF XmString label_string = create_label_string(info->items[0].topic, info->items[0].title); label = XtVaCreateWidget(name, xmLabelWidgetClass, parent, XmNtopAttachment, XmATTACH_FORM, XmNtopOffset, 14, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNlabelString, label_string, XmNalignment, XmALIGNMENT_BEGINNING, NULL); XmStringFree(label_string); #else /* MOTIF */ char *label_string = create_label_string(info->items[0].topic, info->items[0].title); label = XtVaCreateWidget(name, labelWidgetClass, parent, XtNlabel, label_string, XtNborderWidth, 0, /* XtNinternalHeight, 2, */ XtNjustify, XtJustifyLeft, NULL); free(label_string); #endif /* MOTIF */ return label; } void select_topic(struct topic_info *info, size_t idx) { #if MOTIF XmString label; #else char *label; #endif /* change the heading in right window */ label = create_label_string(info->items[idx].topic, info->items[idx].title); XtVaSetValues(info->topic_label, #if MOTIF XmNlabelString, #else XtNlabel, #endif label, NULL); #if MOTIF XmStringFree(label); XmListSelectPos(info->topics_list, idx + 1, False); #else free(label); XawListHighlight(info->topics_list, idx); #endif if (info->curr_selected != 0) { XtUnmanageChild(info->curr_selected); } else { /* Note: doesn't matter if not managed yet */ /* XtUnmanageChild(info->items[0].widget); */ } XtManageChild(info->items[idx].widget); info->curr_selected = info->items[idx].widget; #if MOTIF XmUpdateDisplay(info->shell); #endif } static void select_topic_cb(Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *info = (struct topic_info *)client_data; size_t idx; #if MOTIF idx = ((XmListCallbackStruct *)call_data)->item_position - 1; #else idx = ((XawListReturnStruct *)call_data)->list_index; #endif UNUSED(w); /* ASSERT(idx < info->items_size, "list position exceeds items_size!"); */ select_topic(info, idx); } static Widget create_button(Widget parent, const char *name, Boolean show_as_default, Boolean left_position) { Widget button; #if MOTIF XmString s1 = XmStringCreateLocalized((char *)name); button = XtVaCreateWidget(name, xmPushButtonWidgetClass, parent, XmNlabelString, s1, XmNdefaultButtonShadowThickness, 1, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNmarginWidth, 6, XmNmarginHeight, 4, XmNtopOffset, 10, XmNbottomOffset, 10, NULL); if (left_position) XtVaSetValues(button, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 10, NULL); else XtVaSetValues(button, XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, 10, NULL); if (show_as_default) XtVaSetValues(button, XmNshowAsDefault, True, NULL); XtManageChild(button); XmStringFree(s1); #else /* MOTIF */ UNUSED(show_as_default); button = XtVaCreateManagedWidget(name, commandWidgetClass, parent, XtNtop, XtChainTop, XtNbottom, XtChainBottom, NULL); if (left_position) XtVaSetValues(button, XtNleft, XtChainLeft, XtNright, XtChainLeft, NULL); else XtVaSetValues(button, XtNleft, XtChainRight, XtNright, XtChainRight, NULL); #endif /* MOTIF */ return button; } static void close_topic_window(Widget w, XEvent *event, String *params, Cardinal *num_params) { Widget button; void *ptr; struct topic_info *info; UNUSED(w); UNUSED(event); if (*num_params < 1) { XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params)); return; } sscanf(*params, "%p", &ptr); info = (struct topic_info *)ptr; /* get a callback to close the button, in decreasing order of preference */ if (get_widget_by_name(&button, info->shell, "Cancel", False) || get_widget_by_name(&button, info->shell, "Close", False) || get_widget_by_name(&button, info->shell, "OK", False)) { XtCallCallbacks(button, #if MOTIF XmNactivateCallback, #else XtNcallback, #endif info); } else { XDVI_WARNING((stderr, "No button found for widget %p!\n", (void *)info->shell)); } } static XtActionsRec popdown_actions[] = { #if !MOTIF { "WM_popdown", close_topic_window }, #endif { "close-topic-window", close_topic_window }, }; static Widget create_list_widget(Widget parent, const char *w_name, struct topic_info *info) { Widget list; size_t tnum; #if MOTIF XmString *topics = NULL; #else static char **topics = NULL; #endif for (tnum = 0; info->items[tnum].topic != NULL; tnum++) { /* 1 more for terminating NULL needed for Xaw */ topics = xrealloc(topics, (tnum + 2) * sizeof *topics); #if MOTIF topics[tnum] = XmStringCreateLocalized(info->items[tnum].topic); #else topics[tnum] = xstrdup(info->items[tnum].topic); #endif } #ifndef MOTIF /* list needs to be terminated for Xaw */ topics[tnum] = NULL; #endif #if MOTIF { size_t i; Arg args[20]; int n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNlistSpacing, 4); n++; XtSetArg(args[n], XmNlistMarginHeight, 4); n++; XtSetArg(args[n], XmNlistMarginWidth, 4); n++; XtSetArg(args[n], XmNhighlightThickness, 0); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; list = XmCreateScrolledList(parent, (char *)w_name, args, n); #if defined(__GNUC__) && DEVEL_MODE #warning TODO: make up/down scroll the list, and PgUp/PgDown scroll help text #warning TODO: add wheel mouse bindings /* * also fix bug with arrow keys first moving invisible cursor, then scrollbars */ #endif XmListDeleteAllItems(list); XmListAddItems(list, topics, tnum, 0); for (i = 0; i < tnum; ++i) { XmStringFree(topics[i]); } free(topics); } XtAddCallback(list, XmNbrowseSelectionCallback, select_topic_cb, info); XmListSelectPos(list, 1, False); /* default position */ #else /* MOTIF */ list = XtVaCreateWidget(w_name, listWidgetClass, parent, XtNlist, topics, XtNdefaultColumns, 1, XtNforceColumns, True, XtNverticalList, True, XtNrowSpacing, 4, XtNheight, 429, NULL); XtAddCallback(list, XtNcallback, select_topic_cb, info); XawListHighlight(list, 0); /* default position */ #endif /* MOTIF */ XtManageChild(list); return list; } Widget create_topic_window(Widget parent, const char *window_title, const char *widget_name, struct topic_info *info, void (*init_items_func)(struct topic_info *info), /* OK button/callbacks */ const char *ok_label, /* Cancel button/callbacks (can be NULL) */ const char *cancel_label) { Widget topic_window, topics_list, topic_label; Widget pane, form, left_form, right_container_form, right_form; Widget action_area, ok_button, cancel_button; XtTranslations xlats; XtAppContext app = NULL; Atom WM_DELETE_WINDOW; char *translation_str; size_t i; #if !MOTIF translation_str = get_string_va("WM_PROTOCOLS: WM_popdown(%p)", info); xlats = XtParseTranslationTable(translation_str); free(translation_str); #endif topic_window = XtVaCreatePopupShell(widget_name, SHELL_WIDGET_CLASS, parent, XtNtitle, window_title, HELP_SHELL_ARGS); #if MOTIF /* make the window manager destroy action pop down the window */ WM_DELETE_WINDOW = XmInternAtom(XtDisplay(topic_window), "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(topic_window, WM_DELETE_WINDOW, cancel_cb, info); #else WM_DELETE_WINDOW = XInternAtom(XtDisplay(topic_window), "WM_DELETE_WINDOW", False); #endif app = XtWidgetToApplicationContext(topic_window); XtAppAddActions(app, popdown_actions, XtNumber(popdown_actions)); pane = XtVaCreateWidget("topic_pane", PANED_WIDGET_CLASS, topic_window, HELP_PANED_ARGS); form = XtVaCreateWidget("form", FORM_WIDGET_CLASS, pane, FORM_ARGS); /* left pane for topics selection */ left_form = XtVaCreateWidget("left_form", FORM_WIDGET_CLASS, form, LEFT_FORM_ARGS); /* right form for topics display */ right_container_form = XtVaCreateWidget("right_container_form", FORM_WIDGET_CLASS, form, RIGHT_FORM_ARGS); /* Initialize the topic label and title string with dummy values - the real values are only known inside init_items_func(). For Xaw, the size of the widget will be adjusted below (for Motif it's always the full width of the right form, which is what we want). */ /* FIXME: Motif label is still chopped off if it's longer than right form - work around by putting longest possible lable here ... */ /* Also, not all children will be sized correctly, e.g. the colors - work around by specifying a rather large dummy text ... */ info->items[0].topic = "text text text"; info->items[0].title = "text text text text text text text text text text text text text text text text text"; topic_label = create_label_widget(right_container_form, "topic_label", info); info->topic_label = topic_label; right_form = XtVaCreateWidget("right_form", FORM_WIDGET_CLASS, right_container_form, #if MOTIF XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, topic_label, XmNtopOffset, 10, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, #else XtNborderWidth, 0, XtNfromVert, topic_label, XtNvertDistance, 6, #endif /* MOTIF */ NULL); info->right_form = right_form; /* Call the init_items_func callback. This will populate the info->items list with the appropriate info, and create the forms (info->items[i].widget) which are the children of right_form (which is accessed inside init_items_func() through info->right_form), and all their subchildren. It is important that every child form is already managed inside init_items_func so that the total size of the preferences window is set to the maximum size of the children. (The children will be unmanaged again below). All these widgets are never destroyed, and are managed by demand via the list selection callback (select_topic_cb). */ init_items_func(info); XtManageChild(topic_label); topics_list = create_list_widget(left_form, "topics_list", info); info->topics_list = topics_list; translation_str = get_string_va("#override \n" "q:close-topic-window(%p)\n" #ifdef MOTIF "osfCancel:close-topic-window(%p)\n" #else "Escape:close-topic-window(%p)\n" #endif "Return:close-topic-window(%p)", info, info, info); xlats = XtParseTranslationTable(translation_str); free(translation_str); translation_str = NULL; XtOverrideTranslations(pane, xlats); XtOverrideTranslations(topics_list, xlats); XtManageChild(left_form); XtManageChild(right_form); XtManageChild(right_container_form); /* action area at bottom */ action_area = XtVaCreateWidget("action_area", FORM_WIDGET_CLASS, pane, ACTION_AREA_ARGS); ok_button = create_button(action_area, ok_label, True, True); XtOverrideTranslations(ok_button, xlats); if (cancel_label != NULL) { cancel_button = create_button(action_area, cancel_label, False, False); adjust_width(ok_button, cancel_button); #if MOTIF XtAddCallback(cancel_button, XmNactivateCallback, cancel_cb, info); #else XtAddCallback(cancel_button, XtNcallback, cancel_cb, info); #endif XtOverrideTranslations(cancel_button, xlats); } XtManageChild(action_area); XtManageChild(form); XtManageChild(pane); XtRealizeWidget(topic_window); /* Now unmanage all children of right_form, as described above. */ for (i = 0; info->items[i].topic != NULL; i++) { XtUnmanageChild(info->items[i].widget); } info->curr_selected = 0; #if MOTIF /* enable OK button */ XmProcessTraversal(ok_button, XmTRAVERSE_CURRENT); XtOverrideTranslations(ok_button, XtParseTranslationTable("Return:ArmAndActivate()\n" "q:ArmAndActivate()")); XtAddCallback(ok_button, XmNactivateCallback, ok_cb, info); XmAddWMProtocolCallback(topic_window, WM_DELETE_WINDOW, cancel_cb, info); { /* disable resizing of lower part of pane (and button) */ Dimension h; XtVaGetValues(ok_button, XmNheight, &h, NULL); XtVaSetValues(action_area, XmNpaneMaximum, h + 20, XmNpaneMinimum, h + 20, NULL); } #else XSetWMProtocols(XtDisplay(topic_window), XtWindow(topic_window), &WM_DELETE_WINDOW, 1); XtAddCallback(ok_button, XtNcallback, ok_cb, info); #endif return topic_window; } xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_menu.h0000664000175000017500000000330210363262237020572 0ustar uwabamiuwabami/* * Copyright (c) 2001 Marcin Dalecki * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef XM_MENU_H_ #define XM_MENU_H_ #include "menu.h" #ifdef MOTIF #define Xdvi_FILEHIST_MENU "filehist_menu" extern Widget xm_create_menu(Widget parent, char *title, char mnemonic, struct button_info *item); extern Boolean pulldown_menu_active(unsigned long event_num); extern void toggle_menubar(void); extern void popdown_callback(Widget w, XtPointer client_data, XtPointer call_data); extern void filehist_menu_add_entry(const char *filename); extern void filehist_menu_refresh(void); #endif #endif /* XM_MENU_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/sfSelFile.c0000664000175000017500000007323011276240141020772 0ustar uwabamiuwabami/* * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Software Research Associates not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. Software Research Associates * makes no representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * * Author: Erik M. van der Poel * Software Research Associates, Inc., Tokyo, Japan * erik@sra.co.jp */ #include "xdvi-config.h" #include "xdvi.h" #include "dvi-init.h" /* for dviErrFlagT */ #include "message-window.h" #include "kpathsea/c-stat.h" #include #include "sfDir.h" #include "sfPath.h" #include "sfDraw.h" #include "sfSelFile.h" #include "util.h" #include "xlwradio.h" #include "x_util.h" #include #include "kpathsea/c-fopen.h" #include "kpathsea/c-stat.h" #if !defined(MOTIF) /* entire file */ #include #ifdef X_NOT_STDC_ENV extern int errno; #endif #define SEL_FILE_CANCEL -1 #define SEL_FILE_OK 0 #define SEL_FILE_NULL 1 #define SEL_FILE_TEXT 2 /* * Author's address: * * erik@sra.co.jp * OR * erik%sra.co.jp@uunet.uu.net * OR * erik%sra.co.jp@mcvax.uucp * OR * try junet instead of co.jp * OR * Erik M. van der Poel * Software Research Associates, Inc. * 1-1-1 Hirakawa-cho, Chiyoda-ku * Tokyo 102 Japan. TEL +81-3-234-2692 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef MAXPATHLEN #define MAXPATHLEN 1024 #endif /* ndef MAXPATHLEN */ /* global vars for communication with sfDraw.c */ char SFstartDir[MAXPATHLEN], SFcurrentPath[MAXPATHLEN], SFcurrentDir[MAXPATHLEN]; Widget selFileField, selFileForm, selFileHScroll, selFileHScrolls[3], selFileLists[3], selFileVScrolls[3]; Display *SFdisplay; Pixel SFfore, SFback; XSegment SFsegs[2], SFcompletionSegs[2]; XawTextPosition SFtextPos; int SFupperX, SFlowerY, SFupperY; int SFtextX, SFtextYoffset; int SFentryWidth, SFentryHeight; int SFlineToTextH = 3; int SFlineToTextV = 3; int SFbesideText = 3; int SFaboveAndBelowText = 2; int SFcharsPerEntry = 15; int SFlistSize = 10; int SFworkProcAdded = 0; XtAppContext SFapp; int SFpathScrollWidth, SFvScrollHeight, SFhScrollWidth; char SFtextBuffer[MAXPATHLEN]; XtIntervalId SFdirModTimerId; int (*SFfunc) (); static int SFstatus = SEL_FILE_NULL; static Widget selFile, selFileCancel, selFileOK, selFilePrompt; /* For file filter. */ static Widget selFileLabel, selFileMask, selFileHide; #define MASKWIDTH 16 static char fileMask[MASKWIDTH + 2] = "*.dvi"; static Atom SFwmDeleteWindow; static char *oneLineTextEditTranslations = "Return: redraw-display()\n" "CtrlM: redraw-display()\n"; #if !defined (HAVE_STRERROR) && !defined (strerror) static char * strerror(int errnum) { return 0 < errnum && errnum <= sys_nerr ? sys_errlist[errnum] : "Unknown system error"; } #endif /* not HAVE_STRERROR && not strerror */ void raise_file_selector(void) { if (selFile != NULL && XtIsManaged(selFile)) { XBell(DISP, 10); XRaiseWindow(DISP, XtWindow(selFile)); return; } } static void SFexposeList(Widget w, XtPointer n, XEvent *event, Boolean *cont) { UNUSED(w); UNUSED(cont); if ((event->type == NoExpose) || event->xexpose.count) { return; } SFdrawList((ptrdiff_t)n, SF_DO_NOT_SCROLL); } static void cb_open_new_window(Widget w, XtPointer client_data, XtPointer call_data) { Boolean set; UNUSED(client_data); UNUSED(call_data); XtVaGetValues(w, XtNstate, &set, NULL); if (set) resource.filesel_open_new_window = True; else resource.filesel_open_new_window = False; store_preference(NULL, "fileselOpenNewWindow", "%d", resource.filesel_open_new_window); } static void SFmodVerifyCallback(Widget w, XtPointer client_data, XEvent *event, Boolean *cont) { char buf[2]; UNUSED(w); UNUSED(client_data); UNUSED(cont); if ((XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1) && ((*buf) == '\r')) { SFstatus = SEL_FILE_OK; } else { SFstatus = SEL_FILE_TEXT; } } static void SFokCallback(Widget w, XtPointer cl, XtPointer cd) { UNUSED(w); UNUSED(cl); UNUSED(cd); SFstatus = SEL_FILE_OK; } static XtCallbackRec SFokSelect[] = { {SFokCallback, (XtPointer) NULL}, {NULL, (XtPointer) NULL}, }; static void SFcancelCallback(Widget w, XtPointer cl, XtPointer cd) { UNUSED(w); UNUSED(cl); UNUSED(cd); SFstatus = SEL_FILE_CANCEL; } static XtCallbackRec SFcancelSelect[] = { {SFcancelCallback, (XtPointer) NULL}, {NULL, (XtPointer) NULL}, }; static void SFdismissAction(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(params); UNUSED(num_params); if (event->type == ClientMessage && (unsigned)(event->xclient.data.l[0]) != SFwmDeleteWindow) return; SFstatus = SEL_FILE_CANCEL; } static char *wmDeleteWindowTranslation = "WM_PROTOCOLS: SelFileDismiss()\n"; static XtActionsRec sf_actions[] = { {"SelFileDismiss", SFdismissAction}, }; /* Don't show files that don't get through the filter. */ /* return 1 if file is masked (mask does not match filename), 0 otherwise */ static int maskFile(const char *mask, char *filename) { int c, c1; while ((c = *mask++)) { if (c == '*') { while ((c1 = *mask++)) { if (c1 != '*') { if (!(*filename)) return 1; if (c1 != '?') { while ((filename = strchr(filename, c1))) { if (!maskFile(mask, ++filename)) return 0; } return 1; } else filename++; } } return 0; } if (c == '?') { if (!*filename) return 1; } else if (c != *filename) return 1; filename++; } return (*filename) ? 1 : 0; } Boolean hideFlag = False; static int showEntry(char *entryReal, char **entryShown, struct stat *statBuf) { UNUSED(entryShown); if ((hideFlag && entryReal[0] == '.') || (!S_ISDIR(statBuf->st_mode) && maskFile(fileMask, entryReal))) return 0; entryReal[strlen(entryReal)] = SFstatChar(statBuf); return 1; } static void maskChanged(Widget w, XtPointer client_data, XEvent *call_data, Boolean *cont) { char buf[2]; SFDir *dir; UNUSED(w); UNUSED(client_data); UNUSED(cont); if ((XLookupString((XKeyPressedEvent *)call_data, buf, 2, NULL, NULL) == 1) && ((*buf) == '\r')) { for (dir = &(SFdirs[SFdirEnd - 1]); dir >= SFdirs; dir--) *(dir->dir) = 0; /* force a re-read */ SFupdatePath(); } } static void hideFiles(Widget w, XtPointer client_data, XtPointer call_data) { SFDir *dir; SFEntry *entry; UNUSED(client_data); UNUSED(call_data); hideFlag = !hideFlag; if (hideFlag) { XtVaSetValues(w, XtNlabel, "hidden", NULL); for (dir = &(SFdirs[SFdirEnd - 1]); dir >= SFdirs; dir--) { if (!(dir->nEntries)) continue; dir->vOrigin = 0; for (entry = &(dir->entries[dir->nEntries - 1]); entry >= dir->entries; entry--) entry->statDone = 0; SFdrawLists(SF_DO_SCROLL); } } else { XtVaSetValues(w, XtNlabel, "shown", NULL); for (dir = &(SFdirs[SFdirEnd - 1]); dir >= SFdirs; dir--) *(dir->dir) = 0; /* force a re-read */ SFupdatePath(); } } static Widget SFcreateWidgets(Widget parent, struct filesel_callback *callback) { Widget open_menu = NULL; Cardinal i, n; int listWidth, listHeight; int listSpacing = 10; int scrollThickness = 15; int hScrollX, hScrollY; int vScrollX, vScrollY; Cursor xtermCursor, sbRightArrowCursor, arrowCursor; Arg arglist[20]; Widget paned, box; i = 0; XtSetArg(arglist[i], XtNtransientFor, parent); i++; XtSetArg(arglist[i], XtNtitle, callback->title); i++; selFile = XtAppCreateShell("xdviSelFile", "XdviSelFile", transientShellWidgetClass, SFdisplay, arglist, i); /* Add WM_DELETE_WINDOW protocol */ XtAppAddActions(XtWidgetToApplicationContext(selFile), sf_actions, XtNumber(sf_actions)); XtOverrideTranslations(selFile, XtParseTranslationTable(wmDeleteWindowTranslation)); paned = XtVaCreateManagedWidget("paned", panedWidgetClass, selFile, NULL); i = 0; XtSetArg(arglist[i], XtNdefaultDistance, 6); i++; selFileForm = XtCreateManagedWidget("selFileForm", formWidgetClass, paned, arglist, i); i = 0; XtSetArg(arglist[i], XtNlabel, callback->prompt); i++; XtSetArg(arglist[i], XtNresizable, True); i++; XtSetArg(arglist[i], XtNtop, XtChainTop); i++; XtSetArg(arglist[i], XtNbottom, XtChainTop); i++; XtSetArg(arglist[i], XtNleft, XtChainLeft); i++; XtSetArg(arglist[i], XtNright, XtChainLeft); i++; XtSetArg(arglist[i], XtNborderWidth, 0); i++; XtSetArg(arglist[i], XtNvertDistance, 20); i++; selFilePrompt = XtCreateManagedWidget("selFilePrompt", labelWidgetClass, selFileForm, arglist, i); #if 1 i = 0; XtSetArg(arglist[i], XtNforeground, &SFfore); i++; XtSetArg(arglist[i], XtNbackground, &SFback); i++; XtGetValues(selFilePrompt, arglist, i); #endif SFinitFont(); SFentryWidth = SFbesideText + SFcharsPerEntry * SFcharWidth + SFbesideText; SFentryHeight = SFaboveAndBelowText + SFcharHeight + SFaboveAndBelowText; listWidth = SFlineToTextH + SFentryWidth + SFlineToTextH + 1 + scrollThickness; listHeight = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 + SFlineToTextV + SFlistSize * SFentryHeight + SFlineToTextV + 1 + scrollThickness; SFpathScrollWidth = 3 * listWidth + 2 * listSpacing + 4; hScrollX = -1; hScrollY = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 + SFlineToTextV + SFlistSize * SFentryHeight + SFlineToTextV; SFhScrollWidth = SFlineToTextH + SFentryWidth + SFlineToTextH; vScrollX = SFlineToTextH + SFentryWidth + SFlineToTextH; vScrollY = SFlineToTextV + SFentryHeight + SFlineToTextV; SFvScrollHeight = SFlineToTextV + SFlistSize * SFentryHeight + SFlineToTextV; SFupperX = SFlineToTextH + SFentryWidth + SFlineToTextH - 1; SFlowerY = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 + SFlineToTextV; SFupperY = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 + SFlineToTextV + SFlistSize * SFentryHeight - 1; SFtextX = SFlineToTextH + SFbesideText; SFtextYoffset = SFlowerY + SFaboveAndBelowText + SFcharAscent; SFsegs[0].x1 = 0; SFsegs[0].y1 = vScrollY; SFsegs[0].x2 = vScrollX - 1; SFsegs[0].y2 = vScrollY; SFsegs[1].x1 = vScrollX; SFsegs[1].y1 = 0; SFsegs[1].x2 = vScrollX; SFsegs[1].y2 = vScrollY - 1; SFcompletionSegs[0].x1 = SFcompletionSegs[0].x2 = SFlineToTextH; SFcompletionSegs[1].x1 = SFcompletionSegs[1].x2 = SFlineToTextH + SFentryWidth - 1; i = 0; XtSetArg(arglist[i], XtNwidth, 3 * listWidth + 2 * listSpacing + 4); i++; XtSetArg(arglist[i], XtNfromVert, selFilePrompt); i++; XtSetArg(arglist[i], XtNresizable, True); i++; XtSetArg(arglist[i], XtNtop, XtChainTop); i++; XtSetArg(arglist[i], XtNbottom, XtChainTop); i++; XtSetArg(arglist[i], XtNleft, XtChainLeft); i++; XtSetArg(arglist[i], XtNright, XtChainLeft); i++; XtSetArg(arglist[i], XtNstring, SFtextBuffer); i++; XtSetArg(arglist[i], XtNlength, MAXPATHLEN); i++; XtSetArg(arglist[i], XtNeditType, XawtextEdit); i++; XtSetArg(arglist[i], XtNwrap, XawtextWrapWord); i++; XtSetArg(arglist[i], XtNresize, XawtextResizeHeight); i++; XtSetArg(arglist[i], XtNuseStringInPlace, True); i++; XtSetArg(arglist[i], XtNvertDistance, 5); i++; selFileField = XtCreateManagedWidget("selFileField", asciiTextWidgetClass, selFileForm, arglist, i); XtOverrideTranslations(selFileField, XtParseTranslationTable (oneLineTextEditTranslations)); /* XtSetKeyboardFocus(selFileForm, selFileField); need focus for selFileMask widget to set the filter */ i = 0; XtSetArg(arglist[i], XtNorientation, XtorientHorizontal); i++; XtSetArg(arglist[i], XtNwidth, SFpathScrollWidth); i++; XtSetArg(arglist[i], XtNheight, scrollThickness); i++; XtSetArg(arglist[i], XtNfromVert, selFileField); i++; XtSetArg(arglist[i], XtNvertDistance, 30); i++; XtSetArg(arglist[i], XtNtop, XtChainTop); i++; XtSetArg(arglist[i], XtNbottom, XtChainTop); i++; XtSetArg(arglist[i], XtNleft, XtChainLeft); i++; XtSetArg(arglist[i], XtNright, XtChainLeft); i++; selFileHScroll = XtCreateManagedWidget("selFileHScroll", scrollbarWidgetClass, selFileForm, arglist, i); XtAddCallback(selFileHScroll, XtNjumpProc, (XtCallbackProc)SFpathSliderMovedCallback, (XtPointer) NULL); XtAddCallback(selFileHScroll, XtNscrollProc, (XtCallbackProc)SFpathAreaSelectedCallback, (XtPointer) NULL); i = 0; XtSetArg(arglist[i], XtNwidth, listWidth); i++; XtSetArg(arglist[i], XtNheight, listHeight); i++; XtSetArg(arglist[i], XtNfromVert, selFileHScroll); i++; XtSetArg(arglist[i], XtNvertDistance, 10); i++; XtSetArg(arglist[i], XtNtop, XtChainTop); i++; XtSetArg(arglist[i], XtNbottom, XtChainTop); i++; XtSetArg(arglist[i], XtNleft, XtChainLeft); i++; XtSetArg(arglist[i], XtNright, XtChainLeft); i++; selFileLists[0] = XtCreateManagedWidget("selFileList1", compositeWidgetClass, selFileForm, arglist, i); i = 0; XtSetArg(arglist[i], XtNwidth, listWidth); i++; XtSetArg(arglist[i], XtNheight, listHeight); i++; XtSetArg(arglist[i], XtNfromHoriz, selFileLists[0]); i++; XtSetArg(arglist[i], XtNfromVert, selFileHScroll); i++; XtSetArg(arglist[i], XtNhorizDistance, listSpacing); i++; XtSetArg(arglist[i], XtNvertDistance, 10); i++; XtSetArg(arglist[i], XtNtop, XtChainTop); i++; XtSetArg(arglist[i], XtNbottom, XtChainTop); i++; XtSetArg(arglist[i], XtNleft, XtChainLeft); i++; XtSetArg(arglist[i], XtNright, XtChainLeft); i++; selFileLists[1] = XtCreateManagedWidget("selFileList2", compositeWidgetClass, selFileForm, arglist, i); i = 0; XtSetArg(arglist[i], XtNwidth, listWidth); i++; XtSetArg(arglist[i], XtNheight, listHeight); i++; XtSetArg(arglist[i], XtNfromHoriz, selFileLists[1]); i++; XtSetArg(arglist[i], XtNfromVert, selFileHScroll); i++; XtSetArg(arglist[i], XtNhorizDistance, listSpacing); i++; XtSetArg(arglist[i], XtNvertDistance, 10); i++; XtSetArg(arglist[i], XtNtop, XtChainTop); i++; XtSetArg(arglist[i], XtNbottom, XtChainTop); i++; XtSetArg(arglist[i], XtNleft, XtChainLeft); i++; XtSetArg(arglist[i], XtNright, XtChainLeft); i++; selFileLists[2] = XtCreateManagedWidget("selFileList3", compositeWidgetClass, selFileForm, arglist, i); for (n = 0; n < 3; n++) { i = 0; XtSetArg(arglist[i], XtNx, vScrollX); i++; XtSetArg(arglist[i], XtNy, vScrollY); i++; XtSetArg(arglist[i], XtNwidth, scrollThickness); i++; XtSetArg(arglist[i], XtNheight, SFvScrollHeight); i++; selFileVScrolls[n] = XtCreateManagedWidget("selFileVScroll", scrollbarWidgetClass, selFileLists[n], arglist, i); XtAddCallback(selFileVScrolls[n], XtNjumpProc, (XtCallbackProc)SFvFloatSliderMovedCallback, cast_int_to_XtPointer(n)); XtAddCallback(selFileVScrolls[n], XtNscrollProc, (XtCallbackProc)SFvAreaSelectedCallback, cast_int_to_XtPointer(n)); i = 0; XtSetArg(arglist[i], XtNorientation, XtorientHorizontal); i++; XtSetArg(arglist[i], XtNx, hScrollX); i++; XtSetArg(arglist[i], XtNy, hScrollY); i++; XtSetArg(arglist[i], XtNwidth, SFhScrollWidth); i++; XtSetArg(arglist[i], XtNheight, scrollThickness); i++; selFileHScrolls[n] = XtCreateManagedWidget("selFileHScroll", scrollbarWidgetClass, selFileLists[n], arglist, i); XtAddCallback(selFileHScrolls[n], XtNjumpProc, (XtCallbackProc)SFhSliderMovedCallback, cast_int_to_XtPointer(n)); XtAddCallback(selFileHScrolls[n], XtNscrollProc, (XtCallbackProc)SFhAreaSelectedCallback, cast_int_to_XtPointer(n)); } /* When opening a DVI file, offer to open in new window */ if (callback->must_exist) { open_menu = XtVaCreateManagedWidget(Xdvi_NEW_WINDOW_RADIO_NAME, #ifdef XAW radioWidgetClass, #else toggleWidgetClass, #endif selFileForm, #ifdef XAW XtNisRadio, False, #endif XtNfromVert, selFileLists[0], XtNvertDistance, 30, XtNhighlightThickness, 1, XtNborderWidth, 0, XtNlabel, "Open file in new window", XtNstate, resource.filesel_open_new_window, NULL); XtAddCallback(open_menu, XtNcallback, cb_open_new_window, (XtPointer)NULL); } /* Do the file filter stuff. */ selFileLabel = XtVaCreateManagedWidget("selFileLabel", labelWidgetClass, selFileForm, XtNfromVert, callback->must_exist ? open_menu : selFileLists[0], XtNvertDistance, callback->must_exist ? 10 : 30, /* XtNfromHoriz, selFileCancel, */ /* XtNhorizDistance, 60, */ XtNlabel, "File Mask:", XtNborderWidth, 0, XtNtop, XtChainTop, XtNbottom, XtChainTop, NULL); selFileMask = XtVaCreateManagedWidget("selFileMask", asciiTextWidgetClass, selFileForm, XtNwidth, MASKWIDTH / 2 * SFcharWidth, XtNfromVert, callback->must_exist ? open_menu : selFileLists[0], XtNvertDistance, callback->must_exist ? 10 : 30, XtNfromHoriz, selFileLabel, XtNhorizDistance, 0, XtNtop, XtChainTop, XtNbottom, XtChainTop, XtNstring, fileMask, XtNlength, MASKWIDTH, XtNeditType, XawtextEdit, XtNwrap, XawtextWrapNever, XtNuseStringInPlace, True, NULL); for (i = 0; i < 3; i++) XtSetKeyboardFocus(selFileLists[i], selFileField); XtOverrideTranslations(selFileMask, XtParseTranslationTable (oneLineTextEditTranslations)); XtAddEventHandler(selFileMask, KeyPressMask, False, (XtEventHandler)maskChanged, (XtPointer) NULL); selFileLabel = XtVaCreateManagedWidget("selFileLabel", labelWidgetClass, selFileForm, XtNfromVert, callback->must_exist ? open_menu : selFileLists[0], XtNvertDistance, callback->must_exist ? 10 : 30, XtNfromHoriz, selFileMask, XtNhorizDistance, 40, XtNlabel, "Dot files are:", XtNborderWidth, 0, XtNtop, XtChainTop, XtNbottom, XtChainTop, NULL); selFileHide = XtVaCreateManagedWidget("selFileHide", commandWidgetClass, selFileForm, /* XtNwidth, 7 * SFcharWidth, */ XtNfromVert, callback->must_exist ? open_menu : selFileLists[0], XtNvertDistance, callback->must_exist ? 10 : 30, XtNfromHoriz, selFileLabel, XtNhorizDistance, 2, XtNlabel, hideFlag ? "hidden" : "shown", /* XtNborderWidth, 1, */ XtNtop, XtChainTop, /* XtNjustify, XtJustifyLeft, */ XtNbottom, XtChainTop, NULL); XtAddCallback(selFileHide, XtNcallback, (XtCallbackProc)hideFiles, NULL); box = XtVaCreateManagedWidget("box", formWidgetClass, paned, XtNshowGrip, False, XtNdefaultDistance, 6, XtNskipAdjust, True, XtNaccelerators, G_accels_cr, NULL); selFileOK = XtVaCreateManagedWidget("selFileOK", commandWidgetClass, box, XtNlabel, callback->ok, XtNcallback, SFokSelect, XtNtop, XtChainTop, XtNbottom, XtChainBottom, XtNleft, XtChainLeft, XtNright, XtChainLeft, NULL); selFileCancel = XtVaCreateManagedWidget("selFileCancel", commandWidgetClass, box, XtNlabel, callback->cancel, XtNcallback, SFcancelSelect, /* XtNborderColor, SFfore, */ XtNfromHoriz, selFileOK, XtNbottom, XtChainBottom, XtNleft, XtChainRight, XtNright, XtChainRight, NULL); XtSetMappedWhenManaged(selFile, False); XtRealizeWidget(selFile); /* Add WM_DELETE_WINDOW protocol */ SFwmDeleteWindow = XInternAtom(SFdisplay, "WM_DELETE_WINDOW", False); XSetWMProtocols(SFdisplay, XtWindow(selFile), &SFwmDeleteWindow, 1); SFcreateGC(); xtermCursor = XCreateFontCursor(SFdisplay, XC_xterm); sbRightArrowCursor = XCreateFontCursor(SFdisplay, XC_sb_right_arrow); arrowCursor = XCreateFontCursor(SFdisplay, XC_left_ptr); XDefineCursor(SFdisplay, XtWindow(selFileForm), arrowCursor); XDefineCursor(SFdisplay, XtWindow(selFileField), xtermCursor); for (n = 0; n < 3; n++) { XDefineCursor(SFdisplay, XtWindow(selFileLists[n]), sbRightArrowCursor); } XDefineCursor(SFdisplay, XtWindow(selFileOK), arrowCursor); XDefineCursor(SFdisplay, XtWindow(selFileCancel), arrowCursor); for (n = 0; n < 3; n++) { XtAddEventHandler(selFileLists[n], ExposureMask, True, (XtEventHandler)SFexposeList, cast_int_to_XtPointer(n)); XtAddEventHandler(selFileLists[n], EnterWindowMask, False, (XtEventHandler)SFenterList, cast_int_to_XtPointer(n)); XtAddEventHandler(selFileLists[n], LeaveWindowMask, False, (XtEventHandler)SFleaveList, cast_int_to_XtPointer(n)); XtAddEventHandler(selFileLists[n], PointerMotionMask, False, (XtEventHandler)SFmotionList, cast_int_to_XtPointer(n)); XtAddEventHandler(selFileLists[n], ButtonPressMask, False, (XtEventHandler)SFbuttonPressList, cast_int_to_XtPointer(n)); XtAddEventHandler(selFileLists[n], ButtonReleaseMask, False, (XtEventHandler)SFbuttonReleaseList, cast_int_to_XtPointer(n)); } XtAddEventHandler(selFileField, KeyPressMask, False, (XtEventHandler)SFmodVerifyCallback, (XtPointer) NULL); SFapp = XtWidgetToApplicationContext(selFile); return selFile; } /* position widget under the cursor */ void SFpositionWidget(Widget w) { Arg args[3]; Cardinal num_args; Dimension width, height, b_width; int x, y, max_x, max_y; Window root, child; int dummyx, dummyy; unsigned int dummymask; XQueryPointer(XtDisplay(w), XtWindow(w), &root, &child, &x, &y, &dummyx, &dummyy, &dummymask); num_args = 0; XtSetArg(args[num_args], XtNwidth, &width); num_args++; XtSetArg(args[num_args], XtNheight, &height); num_args++; XtSetArg(args[num_args], XtNborderWidth, &b_width); num_args++; XtGetValues(w, args, num_args); width += 2 * b_width; height += 2 * b_width; x -= ((Position) width / 2); if (x < 0) x = 0; if (x > (max_x = (Position) (XtScreen(w)->width - width))) x = max_x; y -= ((Position) height / 2); if (y < 0) y = 0; if (y > (max_y = (Position) (XtScreen(w)->height - height))) y = max_y; num_args = 0; XtSetArg(args[num_args], XtNx, x); num_args++; XtSetArg(args[num_args], XtNy, y); num_args++; XtSetValues(w, args, num_args); } FILE * SFopenFile(const char *name, const char *mode, const char *prompt, const char *failed) { Arg args[1]; FILE *fp; UNUSED(args); UNUSED(prompt); UNUSED(failed); SFchdir(SFstartDir); errno = 0; if (!name || *name == 0 || (fp = XFOPEN(name, mode)) == NULL) { XBell(DISP, 0); return NULL; } return fp; } void SFtextChanged(void) { if ((SFtextBuffer[0] == '/') || (SFtextBuffer[0] == '~')) { (void)strcpy(SFcurrentPath, SFtextBuffer); SFtextPos = XawTextGetInsertionPoint(selFileField); } else { (void)strcat(strcpy(SFcurrentPath, SFstartDir), SFtextBuffer); SFtextPos = XawTextGetInsertionPoint(selFileField) + strlen(SFstartDir); } if (!SFworkProcAdded) { (void)XtAppAddWorkProc(SFapp, (XtWorkProc)SFworkProc, NULL); SFworkProcAdded = 1; } SFupdatePath(); } static void SFprepareToReturn(void) { SFstatus = SEL_FILE_NULL; /* XtRemoveGrab(selFile); */ XtUnmapWidget(selFile); if (SFdirModTimerId) { XtRemoveTimeOut(SFdirModTimerId); SFdirModTimerId = 0; } if (SFchdir(SFstartDir)) { XtAppError(SFapp, "XsraSelFile: can't return to current directory"); } } Widget XsraSelFile(Widget parent, struct filesel_callback *callback) { SFdisplay = XtDisplay(parent); return SFcreateWidgets(parent, callback); } void XsraSelFilePopup(struct filesel_callback *callback) { Cardinal i; Arg arglist[20]; XEvent event; if (XtIsManaged(callback->shell)) { XBell(DISP, 10); XRaiseWindow(DISP, XtWindow(callback->shell)); return; } if (!callback->prompt) callback->prompt = "Pathname:"; if (!callback->title) callback->title = "xdvik: select filename"; if (!callback->ok) callback->ok = "OK"; if (!callback->cancel) callback->cancel = "Cancel"; /* if (!callback->browse_fname) */ /* callback->browse_fname = xt_strdup(xgetcwd()); */ i = 0; XtSetArg(arglist[i], XtNlabel, callback->prompt); i++; XtSetValues(selFilePrompt, arglist, i); i = 0; XtSetArg(arglist[i], XtNlabel, callback->ok); i++; XtSetValues(selFileOK, arglist, i); i = 0; XtSetArg(arglist[i], XtNtitle, callback->title); i++; XtSetValues(selFile, arglist, i); i = 0; XtSetArg(arglist[i], XtNlabel, callback->cancel); i++; XtSetValues(selFileCancel, arglist, i); SFpositionWidget(selFile); XtMapWidget(selFile); { char *cwd = xgetcwd(); strcpy(SFstartDir, cwd); free(cwd); } if (SFstartDir[0] == 0) { XtAppError(SFapp, "XsraSelFile: can't get current directory"); } (void)strcat(SFstartDir, "/"); (void)strcpy(SFcurrentDir, SFstartDir); if (callback->init_path) { if (callback->init_path[0] == '/') { (void)strcpy(SFcurrentPath, callback->init_path); if (strncmp(SFcurrentPath, SFstartDir, strlen(SFstartDir))) { SFsetText(SFcurrentPath); } else { SFsetText(&(SFcurrentPath[strlen(SFstartDir)])); } } else { (void)strcat(strcpy(SFcurrentPath, SFstartDir), callback->init_path); SFsetText(&(SFcurrentPath[strlen(SFstartDir)])); } } else { SFsetText(SFcurrentDir); (void)strcpy(SFcurrentPath, SFstartDir); } SFfunc = showEntry; SFtextChanged(); /* don't grab the pointer so that warning popups still work */ /* XtAddGrab(selFile, True, True); */ SFdirModTimerId = XtAppAddTimeOut(SFapp, 1200UL, SFdirModTimer, (XtPointer) NULL); if (strcmp(fileMask, callback->filemask) != 0) { /* if mask changed */ SFDir *dir; strncpy(fileMask, callback->filemask, MASKWIDTH); XtVaSetValues(selFileMask, XtNstring, fileMask, NULL); for (dir = &(SFdirs[SFdirEnd - 1]); dir >= SFdirs; dir--) *(dir->dir) = 0; /* force a re-read */ SFupdatePath(); } while (1) { XtAppNextEvent(SFapp, &event); switch (event.type) { Widget w; #if 0 /* DON'T do this, it may send the X server into a busy loop if the File selector is positioned over a window that is `on top' by default */ case Expose: if (!raise_message_windows()) raise_file_selector(); break; #endif case KeyPress: case ButtonPress: /* ignore keypress inside the main window (and beep to warn) */ w = XtWindowToWidget(DISP, event.xany.window); while ((w != NULL) && (w != selFile)) { /* exception: message windows */ if (is_message_window(w)) break; w = XtParent(w); } if (w == NULL || w == globals.widgets.top_level) { XBell(DISP, 0); continue; } break; } XtDispatchEvent(&event); switch (SFstatus) { case SEL_FILE_TEXT: SFstatus = SEL_FILE_NULL; SFtextChanged(); break; case SEL_FILE_OK: if (callback->must_exist) { FILE *tmp_fp = XFOPEN(SFtextBuffer, "r"); dviErrFlagT errflag = NO_ERROR; if (tmp_fp == NULL) { popup_message(selFile, MSG_ERR, NULL, "Could not open %s: %s.\n", SFtextBuffer, strerror(errno)); SFstatus = SEL_FILE_NULL; break; } else if (!process_preamble(tmp_fp, &errflag) || !find_postamble(tmp_fp, &errflag) || !read_postamble(tmp_fp, &errflag, False)) { popup_message(selFile, MSG_ERR, NULL, "Error opening %s:\n%s.", SFtextBuffer, get_dvi_error(errflag)); fclose(tmp_fp); SFstatus = SEL_FILE_NULL; break; } else { /* file is OK */ fclose(tmp_fp); SFprepareToReturn(); callback->func_ptr(SFtextBuffer, callback->data); return; /* return xstrdup(SFtextBuffer); */ } } else { SFprepareToReturn(); callback->func_ptr(SFtextBuffer, callback->data); return; /* return xstrdup(SFtextBuffer); */ } case SEL_FILE_CANCEL: SFprepareToReturn(); if (callback->exit_on_cancel) exit(0); return; /* return NULL; */ case SEL_FILE_NULL: break; } } } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* !defined(MOTIF) */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/sfDir.c0000664000175000017500000001003311276240141020155 0ustar uwabamiuwabami/* * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Software Research Associates not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. Software Research Associates * makes no representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * * Author: Erik M. van der Poel * Software Research Associates, Inc., Tokyo, Japan * erik@sra.co.jp */ #include "xdvi-config.h" #include "sfDir.h" #if !defined(MOTIF) /* entire file */ #include #include #include #include #include #undef wchar_t #include #ifdef SEL_FILE_IGNORE_CASE #include #endif /* def SEL_FILE_IGNORE_CASE */ #ifdef SEL_FILE_IGNORE_CASE int SFcompareEntries(const void *vp, const void *vq) { SFEntry *p = vp; SFEntry *q = vq; char *r, *s; char c1, c2; r = p->real; s = q->real; c1 = *r++; if (islower(c1)) { c1 = toupper(c1); } c2 = *s++; if (islower(c2)) { c2 = toupper(c2); } while (c1 == c2) { if (!c1) { return strcmp(p->real, q->real); } c1 = *r++; if (islower(c1)) { c1 = toupper(c1); } c2 = *s++; if (islower(c2)) { c2 = toupper(c2); } } return c1 - c2; } #else /* def SEL_FILE_IGNORE_CASE */ int SFcompareEntries(const void *vp, const void *vq) { const SFEntry *p = vp; const SFEntry *q = vq; return strcmp(p->real, q->real); } #endif /* def SEL_FILE_IGNORE_CASE */ int SFgetDir(SFDir *dir) { SFEntry *result = NULL; int alloc = 0; int i; DIR *dirp; struct dirent *dp; char *str; int len; int maxChars; struct stat statBuf; maxChars = strlen(dir->dir) - 1; dir->entries = NULL; dir->nEntries = 0; dir->nChars = 0; result = NULL; i = 0; dirp = opendir("."); if (!dirp) { return 1; } (void)stat(".", &statBuf); dir->mtime = statBuf.st_mtime; (void)readdir(dirp); /* throw away "." */ #ifndef S_IFLNK (void)readdir(dirp); /* throw away ".." */ #endif /* ndef S_IFLNK */ while ((dp = readdir(dirp))) { if (i >= alloc) { alloc = 2 * (alloc + 1); result = (SFEntry *) XtRealloc((char *)result, (unsigned)(alloc * sizeof(SFEntry))); } result[i].statDone = 0; str = dp->d_name; len = strlen(str); result[i].real = XtMalloc((unsigned)(len + 2)); (void)strcat(strcpy(result[i].real, str), " "); if (len > maxChars) { maxChars = len; } result[i].shown = result[i].real; i++; } #if defined(SVR4) || defined(SYSV) || defined(USG) qsort((char *)result, (unsigned)i, sizeof(SFEntry), SFcompareEntries); #else /* defined(SVR4) || defined(SYSV) || defined(USG) */ qsort((char *)result, i, sizeof(SFEntry), SFcompareEntries); #endif /* defined(SVR4) || defined(SYSV) || defined(USG) */ dir->entries = result; dir->nEntries = i; dir->nChars = maxChars + 1; closedir(dirp); return 0; } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* !defined(MOTIF) */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs_appearance.h0000664000175000017500000000274110363262237023132 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef XM_PREFS_APPEARANCE_ #define XM_PREFS_APPEARANCE_ #ifdef MOTIF struct topic_info; /* forward declaration */ extern Widget prefs_appearance(struct topic_info *info); extern void update_preferences_expert(void); extern void update_preferences_tooltips(void); extern void update_preferences_search(void); #endif /* MOTIF */ #endif /* XM_PREFS_APPEARANCE_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs_helpers.c0000664000175000017500000006515611276240141022473 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Panel 3 (Helper Applications) for xdvik preferences dialog. */ #include "xdvi-config.h" #include "xdvi.h" #include "x_util.h" #include "xm_colorsel.h" #include "topic-window.h" #include "util.h" #include "string-utils.h" #include "string_list.h" #include "message-window.h" #include "events.h" #include "xm_menu.h" #include "xm_prefsP.h" #include "xm_prefs.h" #include "xm_prefs_helpers.h" #ifdef MOTIF /* entire file */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct choice_dialog_info { struct topic_info *tinfo; /* struct prefs_choice *prefs; */ Widget combo_box; Widget message_popup; }; static char **m_browser_list = NULL; static char **m_editor_list = NULL; #if USE_COMBOBOX #include #include #else #include #endif static void select_browser_cb(Widget w, XtPointer client_data, XtPointer call_data); static void select_editor_cb(Widget w, XtPointer client_data, XtPointer call_data); /* * User clicked on `Help' in browser text input prompt */ static void help_browser_dialog_cb(Widget w, XtPointer client_data, XtPointer call_data) { Widget popup = popup_message(XtParent(w), MSG_HELP, NULL, "The browser is used by xdvi to browse remote documents. " "Please enter the name of the browser (i.e. the executable program) " "you want to use. The browser command may optionally contain a string " "`%%s' which is replaced by the current URL. If no `%%s' is present, " "the URL argument is simply appended to the command."); UNUSED(client_data); UNUSED(call_data); TRACE_GUI((stderr, "setting user data to %p", (void *)popup)); XtVaSetValues(w, XmNuserData, popup, NULL); } /* * User clicked on `Help' in editor text input prompt */ static void help_editor_dialog_cb(Widget w, XtPointer client_data, XtPointer call_data) { Widget popup = popup_message(XtParent(w), MSG_HELP, NULL, "The editor is used by reverse search to open the TeX source for a DVI file " "(see `Help' -> `Source Specials' for details)." "Please enter the name of the editor executable you want to use. " "The editor command may optionally contain two format strings: " "`%%l' is replaced by the line number in the TeX file, and `%%f' by the file name. " "(If the format strings are not present, they are appended implicitly.)"); UNUSED(client_data); UNUSED(call_data); TRACE_GUI((stderr, "setting user data to %p", (void *)popup)); XtVaSetValues(w, XmNuserData, popup, NULL); } /* * User cancelled browser or editor text input prompt */ static void destroy_dialog_cb(Widget w, XtPointer client_data, XtPointer call_data) { /* Widget browser_combo = (Widget)client_data; */ struct choice_dialog_info *info = (struct choice_dialog_info *)client_data; Widget browser_combo = NULL; Widget help_popup; #if USE_COMBOBOX Widget browser_list_w; #endif UNUSED(call_data); XtVaGetValues(w, XmNuserData, &help_popup, NULL); TRACE_GUI((stderr, "GOT help_popup: %p", (void *)help_popup)); if (info != NULL) browser_combo = info->combo_box; if (browser_combo != NULL) { #if USE_COMBOBOX /* Need to unselect the `Other...' entry from the list; to do this, we select the index from XmNuserData if it's >= 0, or the first item. */ int idx; XtPointer p; XtVaGetValues(browser_combo, XmNlist, &browser_list_w, XmNuserData, &p, NULL); idx = (int)p; if (browser_list_w == 0) XDVI_ERROR((stderr, "couldn't get list component of combo box!\n")); else { if (idx < 0) idx = 0; XmListSelectPos(browser_list_w, idx + 1, True); } #else Widget parent; if ((parent = XtParent(w)) != NULL) { Widget rowcol, child; if (strcmp(XtName(parent), Xdvi_BROWSER_POPUP) == 0) { if (get_widget_by_name(&rowcol, globals.widgets.top_level, Xdvi_BROWSER_COMBO_NAME, True)) { XtVaGetValues(rowcol, XmNuserData, &child, NULL); XtVaSetValues(rowcol, XmNmenuHistory, child, NULL); } } else if (strcmp(XtName(parent), Xdvi_EDITOR_POPUP) == 0) { if (get_widget_by_name(&rowcol, globals.widgets.top_level, Xdvi_EDITOR_COMBO_NAME, True)) { XtVaGetValues(rowcol, XmNuserData, &child, NULL); XtVaSetValues(rowcol, XmNmenuHistory, child, NULL); } } else { XDVI_WARNING((stderr, "unexpected widget name `%s' in destroy_dialog_cb", XtName(parent))); } } #endif } /* * Also popdown dependent help window if it exists before destroying the widget; * otherwise, Motif may even crash in _XmIsFastSubclass() when the help window is moved! * * Since `help_popup' is the top-level xmDialogShellWidget, we need to get its * xmMessageBoxWidget child (by name ...). Don't report an error if it doesn't * exist in case the help window has already been closed. */ if (help_popup != NULL) { static Widget message; if (get_widget_by_name(&message, help_popup, Xdvi_MESSAGE_DIALOG_NAME, False)) XtCallCallbacks(message, XmNokCallback, NULL); } if (info != NULL) { struct prefs_choice *prefs = (struct prefs_choice *)info->tinfo->data; remove_from_deplist(prefs, w); free(info); } /* destroy the parent of this dialog (the shell) */ XtDestroyWidget(XtParent(w)); } static void h_get_input_wrapper(const char *listbox_name, Widget w, XtPointer client_data, XtPointer call_data) { /* Widget combobox = (Widget)client_data; */ struct choice_dialog_info *info = (struct choice_dialog_info *)client_data; struct topic_info *tinfo = info->tinfo; struct prefs_choice *prefs = (struct prefs_choice *)tinfo->data; Widget combobox, child; /* following need to be allocated since we want to set resource.xyz to it */ static char *browser_choice= NULL, *editor_choice = NULL; #if !USE_COMBOBOX XtCallbackProc select_cb = NULL; #endif XmSelectionBoxCallbackStruct *cbs = (XmSelectionBoxCallbackStruct *)call_data; static char *ptr = NULL; char *tmp_list; if (call_data == NULL) /* widget already being destroyed? */ return; ASSERT(info != NULL, "client_data in h_get_input_wrapper mustn't be NULL!"); combobox = info->combo_box; child = info->message_popup; XtVaGetValues(w, XmNuserData, &child, NULL); TRACE_GUI((stderr, "GOT child: %p", (void *)child)); if (ptr) XtFree((XtPointer)ptr); ptr = NULL; XmStringGetLtoR(cbs->value, G_charset, &ptr); if (strlen(ptr) == 0 || is_spaces_only(ptr)) { popup_message(XtParent(w), MSG_ERR, NULL, "Empty input string"); return; } if (strcmp(listbox_name, Xdvi_BROWSER_COMBO_NAME) == 0) { #if 0 int i; #endif free(browser_choice); browser_choice = xstrdup(ptr); resource.browser = browser_choice; #if 0 for (i = 0; m_browser_list[i] != NULL; i++) { fprintf(stderr, "list %d: |%s|\n", i, m_browser_list[i]); } #endif m_browser_list = string_list_prepend(m_browser_list, ptr); #if 0 for (i = 0; m_browser_list[i] != NULL; i++) { fprintf(stderr, "NEW list %d: |%s|\n", i, m_browser_list[i]); } #endif tmp_list = string_list_to_str(m_browser_list, "\n"); #if 0 fprintf(stderr, "TMP LIST: |%s|\n", tmp_list); #endif /* 0 */ store_preference(&(prefs->db), "prefsBrowserList", "%s", tmp_list); free(tmp_list); store_preference(&(prefs->db), "wwwBrowser", "%s", ptr); #if !USE_COMBOBOX select_cb = select_browser_cb; #endif } else if (strcmp(listbox_name, Xdvi_EDITOR_COMBO_NAME) == 0) { free(editor_choice); editor_choice = xstrdup(ptr); resource.editor = editor_choice; m_editor_list = string_list_prepend(m_editor_list, ptr); tmp_list = string_list_to_str(m_editor_list, "\n"); store_preference(&(prefs->db), "prefsEditorList", "%s", tmp_list); free(tmp_list); store_preference(&(prefs->db), "editor", "%s", ptr); #if !USE_COMBOBOX select_cb = select_editor_cb; #endif } else XDVI_WARNING((stderr, "Unexpected name in h_get_input_wrapper: `%s'", listbox_name)); #if USE_COMBOBOX UNUSED(listbox_name); /* add user input to the combo box list, and make it current */ XmComboBoxAddItem(combobox, cbs->value, 1, True); XmComboBoxSelectItem(combobox, cbs->value); { /* if more than 9 items, add scrollbar */ size_t n; XtVaGetValues(combobox, XmNitemCount, &n, NULL); XtVaSetValues(combobox, XmNvisibleItemCount, n > 10 ? 10 : n, NULL); } #else { Widget new_menu, parent, grandparent, rowcol; if ((parent = XtParent(w)) != NULL && (grandparent = XtParent(parent)) != NULL) { /* add new item to front of list ... */ new_menu = XtVaCreateManagedWidget(ptr, xmPushButtonGadgetClass, grandparent, XmNpositionIndex, 0, XmNuserData, tinfo, NULL); if (select_cb != NULL) { XtAddCallback(new_menu, XmNactivateCallback, select_cb, grandparent); } /* ... and make it current! */ if (get_widget_by_name(&rowcol, globals.widgets.top_level, listbox_name, True)) { XtVaSetValues(rowcol, XmNmenuHistory, new_menu, NULL); } } } #endif /* as above: popdown help window */ if (child != NULL) { Widget message; if (get_widget_by_name(&message, child, Xdvi_MESSAGE_DIALOG_NAME, False)) XtCallCallbacks(message, XmNokCallback, NULL); } remove_from_deplist(prefs, w); free(info); /* destroy the parent of this dialog (the shell) */ XtDestroyWidget(XtParent(w)); } static void h_selector(const char *prompt_name, const char *title_str, const char *label_str, XtCallbackProc ok_cb, XtCallbackProc destroy_cb, XtCallbackProc help_cb, Widget w, XtPointer client_data, XtPointer call_data) { struct topic_info *tinfo = NULL; struct prefs_choice *prefs = NULL; struct choice_dialog_info *info = NULL; char *choice; /* following need to be allocated since we want to set resource.xyz to it */ static char *browser_choice= NULL, *editor_choice = NULL; #if USE_COMBOBOX XmComboBoxCallbackStruct *cb; #else XmString str; UNUSED(client_data); UNUSED(call_data); #endif #if USE_COMBOBOX tinfo = (struct topic_info *)client_data; prefs = (struct prefs_choice *)tinfo->data; #endif info = xmalloc(sizeof *info); #if USE_COMBOBOX cb = (XmComboBoxCallbackStruct *)call_data; if (cb->event == NULL) /* only browsing, no selection */ return; choice = (char *)XmStringUnparse(cb->item_or_text, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL); #else XtVaGetValues(w, XmNlabelString, &str, NULL); XmStringGetLtoR(str, G_charset, &choice); XtVaGetValues(w, XmNuserData, &tinfo, NULL); ASSERT(tinfo != NULL, "XmNuserData in callback musn't be NULL!"); prefs = (struct prefs_choice *)tinfo->data; #endif if (strcmp(choice, Xdvi_ADD_COMMAND_STR) == 0) { Widget prompt_widget; Arg args[8]; int n = 0; XmString title = XmStringCreateLocalized((char *)title_str); XmString label = XmStringCreateLocalized((char *)label_str); XtSetArg(args[n], XmNselectionLabelString, label); n++; XtSetArg(args[n], XmNautoUnmanage, False); n++; XtSetArg(args[n], XmNdialogTitle, title); n++; XtSetArg(args[n], XmNuserData, NULL); n++; prompt_widget = XmCreatePromptDialog( #if USE_COMBOBOX w, #else XtParent(w), #endif (char *)prompt_name, args, n); /* XmStringFree(label); */ add_to_deplist(prefs, prompt_widget); info->tinfo = tinfo; info->combo_box = w; info->message_popup = NULL; /* Note: w is the browser_combo widget */ XtAddCallback(prompt_widget, XmNokCallback, ok_cb, (XtPointer)info); XtAddCallback(prompt_widget, XmNcancelCallback, destroy_cb, (XtPointer)info); XtAddCallback(prompt_widget, XmNhelpCallback, help_cb, (XtPointer)info); XtManageChild(prompt_widget); } else { /* normal item */ #if USE_COMBOBOX int i; #endif if (strcmp(prompt_name, Xdvi_BROWSER_POPUP_NAME) == 0) { #if !USE_COMBOBOX Widget rowcol; if (get_widget_by_name(&rowcol, globals.widgets.top_level, Xdvi_BROWSER_COMBO_NAME, True)) { XtVaSetValues(rowcol, XmNuserData, w, NULL); } #endif free(browser_choice); browser_choice = xstrdup(choice); resource.browser = browser_choice; store_preference(&(prefs->db), "wwwBrowser", "%s", browser_choice); } else if (strcmp(prompt_name, Xdvi_EDITOR_POPUP_NAME) == 0) { #if !USE_COMBOBOX Widget rowcol; if (get_widget_by_name(&rowcol, globals.widgets.top_level, Xdvi_EDITOR_COMBO_NAME, True)) { XtVaSetValues(rowcol, XmNuserData, w, NULL); } #endif free(editor_choice); editor_choice = xstrdup(choice); resource.editor = editor_choice; store_preference(&(prefs->db), "editor", "%s", editor_choice); } else XDVI_ERROR((stderr, "Unknown category `%s' in h_selector()!", prompt_name)); #if USE_COMBOBOX /* update the currently selected value */ XtVaGetValues(w, XmNselectedPosition, &i, NULL); XtVaSetValues(w, XmNuserData, cast_int_to_XtPointer(i), NULL); #endif } #if USE_COMBOBOX XtFree(choice); #endif } /* * User OK'ed browser text input prompt */ static void get_browser_text_cb(Widget w, XtPointer client_data, XtPointer call_data) { if (XtIsRealized(w)) { h_get_input_wrapper(Xdvi_BROWSER_COMBO_NAME, w, client_data, call_data); } } /* * User OK'ed editor text input prompt */ static void get_editor_text_cb(Widget w, XtPointer client_data, XtPointer call_data) { if (XtIsRealized(w)) { h_get_input_wrapper(Xdvi_EDITOR_COMBO_NAME, w, client_data, call_data); } } /* * User selected an item from browser combo box pulldown list */ static void select_browser_cb(Widget w, XtPointer client_data, XtPointer call_data) { h_selector(Xdvi_BROWSER_POPUP_NAME, "xdvik: Add Browser Command", "Browser Command (optional `%s' is replaced by URL): ", get_browser_text_cb, destroy_dialog_cb, help_browser_dialog_cb, w, client_data, call_data); } /* * User selected an item from editor combo box pulldown list */ static void select_editor_cb(Widget w, XtPointer client_data, XtPointer call_data) { UNUSED(client_data); h_selector(Xdvi_EDITOR_POPUP_NAME, "xdvik: Add Editor Command", "Editor Command (optional: `%l' = line number, `%f' = file name): ", get_editor_text_cb, destroy_dialog_cb, help_editor_dialog_cb, w, client_data, call_data); } void update_preferences_helpers(void) { Widget shell, browser_cascade, editor_cascade; if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False) && get_widget_by_name(&browser_cascade, shell, Xdvi_BROWSER_COMBO_NAME, True) && get_widget_by_name(&editor_cascade, shell, Xdvi_EDITOR_COMBO_NAME, True)) { #if USE_COMBOBOX Widget browser_list_w, editor_list_w; XmString str; int i; Boolean found = False; XtVaGetValues(browser_cascade, XmNlist, &browser_list_w, NULL); XtVaGetValues(editor_cascade, XmNlist, &editor_list_w, NULL); for (i = 0; m_browser_list[i] != NULL; i++) { if (globals.curr_browser != NULL) { /* if this is set, ignore browser setting */ if (strcmp(globals.curr_browser, m_browser_list[i]) == 0) { found = True; break; } } else if (resource.browser != NULL) { if (strcmp(resource.browser, m_browser_list[i]) == 0) { found = True; break; } } } if (!found) i = 0; str = XmStringCreateLtoR((char *)m_browser_list[i], "UNMARKED"); XmComboBoxSelectItem(browser_cascade, str); XmStringFree(str); for (i = 0; m_editor_list[i] != NULL; i++) { if (globals.curr_editor != NULL) { /* if this is set, ignore editor setting */ if (strcmp(globals.curr_editor, m_editor_list[i]) == 0) { found = True; break; } } else if (resource.editor != NULL) { if (strcmp(resource.editor, m_editor_list[i]) == 0) { found = True; break; } } } if (!found) i = 0; str = XmStringCreateLtoR((char *)m_editor_list[i], "UNMARKED"); XmComboBoxSelectItem(editor_cascade, str); XmStringFree(str); /* XmListSetPos(editor_list_w, i); */ /* fprintf(stderr, "setting editor list index %d, %s\n", */ /* i, editor_list[i-1]); */ /* if (XmListGetSelectedPos(browser_list_w, &browser_items, &browser_cnt) */ /* && XmListGetSelectedPos(editor_list_w, &editor_items, &editor_cnt)) { */ /* if (browser_cnt > 0 && editor_cnt > 0) { */ /* int browser_idx = browser_items[0] - 1; */ /* int editor_idx = editor_items[0] - 1; */ /* fprintf(stderr, "selected: %s, %s\n", */ /* browser_list[browser_idx], */ /* editor_list[editor_idx]); */ /* } */ /* else { */ /* XDVI_WARNING((stderr, "Shouldn't happen: No items selected in browser list?")); */ /* return; */ /* } */ /* XtFree((XtPointer)browser_items); */ /* XtFree((XtPointer)editor_items); */ /* } */ #else Widget browser_menu, editor_menu; if (get_widget_by_name(&browser_menu, shell, Xdvi_BROWSER_MENU_NAME, True) && get_widget_by_name(&editor_menu, shell, Xdvi_EDITOR_MENU_NAME, True)) { int i, num_buttons; WidgetList buttons; XtVaGetValues(browser_menu, XmNnumChildren, &num_buttons, XmNchildren, &buttons, NULL); for (i = 0; i < num_buttons; i++) { XmString str; char *ptr; XtVaGetValues(buttons[i], XmNlabelString, &str, NULL); XmStringGetLtoR(str, G_charset, &ptr); /* fprintf(stderr, "kid %d: %s\n", i, ptr); */ if (globals.curr_browser != NULL) { /* if this is set, ignore browser setting */ if (strcmp(globals.curr_browser, ptr) == 0) { break; } } else if (resource.browser != NULL) { if (strcmp(resource.browser, ptr) == 0) { break; } } } if (i >= num_buttons) /* not found */ i = 0; XtVaSetValues(browser_cascade, XmNmenuHistory, buttons[i], NULL); /* same for editor */ XtVaGetValues(editor_menu, XmNnumChildren, &num_buttons, XmNchildren, &buttons, NULL); for (i = 0; i < num_buttons; i++) { XmString str; char *ptr; XtVaGetValues(buttons[i], XmNlabelString, &str, NULL); XmStringGetLtoR(str, G_charset, &ptr); /* fprintf(stderr, "kid %d: %s\n", i, ptr); */ if (globals.curr_editor != NULL) { /* if this is set, ignore editor setting */ if (strcmp(globals.curr_editor, ptr) == 0) { break; } } else if (resource.editor != NULL) { if (strcmp(resource.editor, ptr) == 0) { break; } } } if (i >= num_buttons) /* not found */ i = 0; XtVaSetValues(editor_cascade, XmNmenuHistory, buttons[i], NULL); } #endif /* for browser/editor, try: Widget menu; int num_buttons; WidgetList buttons; XtVaGetValues( simple_option_widget, XmNsubMenuId, &menu, NULL); XtVaGetValues( menu, XmNnumChildren, &num_buttons, XmNchildren, &buttons, NULL ) ; */ } } static Widget h_create_command(const char *name, const char *menu_name, const char *label, const char *curr_value, Widget parent, Widget top, char **command_list, XtCallbackProc select_cb, struct topic_info *tinfo) { const char *ptr = NULL; size_t i; #if USE_COMBOBOX XmStringTable str_list; Widget text_label, combo_box; size_t k, num; int curr_index = -1; #else Widget menu, cascade, item; XmString str; Arg args[8]; int n; #endif /* check if we need to add the default resource name */ ptr = curr_value; /* don't add it if it's already in our list */ for (i = 0; ptr != NULL && command_list[i] != NULL; i++) { if (strcmp(command_list[i], ptr) == 0) { ptr = NULL; } } #if USE_COMBOBOX UNUSED(menu_name); text_label = XmCreateLabelGadget(parent, (char *)label, NULL, 0); XtVaSetValues(text_label, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, top, XmNleftAttachment, XmATTACH_FORM, /* XmNrightAttachment, XmATTACH_FORM, */ NULL); /* count elements in command_list */ for (num = 0; command_list[num] != NULL; num++) { ; } if (ptr != NULL) num++; str_list = (XmStringTable)XtMalloc(num * sizeof(XmString *)); i = 0; if (ptr != NULL) str_list[i++] = XmStringCreateLtoR((char *)ptr, "UNMARKED"); for (k = 0; i < num; i++, k++) { if (curr_value != NULL && strcmp(command_list[k], curr_value) == 0) { curr_index = i; } if (strcmp(command_list[k], Xdvi_ADD_COMMAND_STR) == 0) str_list[i] = XmStringCreateLtoR((char *)command_list[k], "MARKED"); else str_list[i] = XmStringCreateLtoR((char *)command_list[k], "UNMARKED"); } combo_box = XtVaCreateWidget(name, xmComboBoxWidgetClass, parent, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, top, /* if top == NULL, this uses XmATTACH_FORM */ XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, text_label, XmNrightAttachment, XmATTACH_FORM, XmNcomboBoxType, XmDROP_DOWN_LIST, XmNitems, str_list, XmNitemCount, num, XmNvisibleItemCount, num > 10 ? 10 : num, XmNuserData, cast_int_to_XtPointer(curr_index), XmNarrowSize, Xdvi_COMBO_BOX_ARROW_SIZE, NULL); if (top != NULL) /* FIXME: This assumes we only have 2 items ... */ XtVaSetValues(combo_box, XmNbottomAttachment, XmATTACH_FORM, NULL); /* make resource setting current value */ if (curr_index >= 0) { XmComboBoxSelectItem(combo_box, str_list[curr_index]); } for (i = 0; i < num; i++) XmStringFree(str_list[i]); XtFree((XtPointer)str_list); XtAddCallback(combo_box, XmNselectionCallback, select_cb, (XtPointer)tinfo); /* * workaround for pointer grabbing bug (see xm_menu.c). We need to use * the popdownCallback of the internal `GrabShell' child of the combo box. */ { Widget grab_shell; if (get_widget_by_name(&grab_shell, combo_box, "GrabShell", True)) XtAddCallback(grab_shell, XtNpopdownCallback, popdown_callback, NULL); } adjust_heights(text_label, combo_box, NULL); XtManageChild(text_label); XtManageChild(combo_box); return combo_box; #else menu = XmCreatePulldownMenu(parent, (char *)menu_name, NULL, 0); /* XtVaSetValues(menu, */ /* XmNtopAttachment, XmATTACH_WIDGET, */ /* XmNtopWidget, top, */ /* XmNleftAttachment, XmATTACH_FORM, */ /* XmNrightAttachment, XmATTACH_FORM, */ /* NULL); */ str = XmStringCreateLocalized((char *)label); n = 0; XtSetArg(args[n], XmNsubMenuId, menu); n++; XtSetArg(args[n], XmNlabelString, str); n++; XtSetArg(args[n], XmNuserData, NULL); n++; cascade = XmCreateOptionMenu(parent, (char *)name, args, n); if (top) XtVaSetValues(cascade, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, top, XmNleftAttachment, XmATTACH_FORM, NULL); else XtVaSetValues(cascade, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL); XmStringFree(str); if (ptr != NULL) { item = XtVaCreateManagedWidget(ptr, xmPushButtonGadgetClass, menu, XmNuserData, tinfo, NULL); XtAddCallback(item, XmNactivateCallback, select_cb, menu); } for (i = 0; command_list[i] != NULL; i++) { item = XtVaCreateManagedWidget(command_list[i], xmPushButtonGadgetClass, menu, XmNuserData, tinfo, NULL); XtAddCallback(item, XmNactivateCallback, select_cb, menu); } XtManageChild(cascade); return cascade; #endif } Widget prefs_helpers(struct topic_info *tinfo) { /* struct prefs_choice *prefs = (struct prefs_choice *)info->data; */ Widget form, /* frame, */ form1; Widget browser_command, editor_command; form = XmCreateForm(tinfo->right_form, "helpers_form", NULL, 0); /* frame = XmCreateFrame(form, "commands_frame", NULL, 0); */ form1 = XtVaCreateWidget("commands_form", xmFormWidgetClass, form, XmNverticalSpacing, 10, XmNhorizontalSpacing, 0, NULL); if (m_browser_list == NULL) m_browser_list = get_separated_list(resource.prefs_browser_list, "\n", False); if (m_editor_list == NULL) m_editor_list = get_separated_list(resource.prefs_editor_list, "\n", False); browser_command = h_create_command(Xdvi_BROWSER_COMBO_NAME, Xdvi_BROWSER_MENU_NAME, "Web Browser: ", resource.browser, form1, NULL, m_browser_list, select_browser_cb, tinfo); editor_command = h_create_command(Xdvi_EDITOR_COMBO_NAME, Xdvi_EDITOR_MENU_NAME, "Editor for Source Specials: ", resource.editor, form1, browser_command, m_editor_list, select_editor_cb, tinfo); /* #if PS_GS */ /* Widget b2 = XmCreateLabelGadget(rowcol, "[x] Use Ghostscript to interpret PS specials", NULL, 0); */ /* TODO: don't need this??? Similar: ps2pdf, dvips conversion?? */ /* Widget b3 = XmCreateLabelGadget(rowcol, "Path to Ghostscript: ____________", NULL, 0); */ /* #endif */ /* Widget b4 = XmCreateLabelGadget(rowcol, "Editor for source specials: [Other ...]", NULL, 0); */ /* XtManageChild(b1); */ /* XtManageChild(b2); */ /* XtManageChild(b3); */ /* XtManageChild(b4); */ /* XtManageChild(rowcol); */ XtManageChild(form1); /* XtManageChild(frame); */ return form; } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_prefs.c0000664000175000017500000004164611276240141020747 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Preferences dialog for xdvik. */ #include "xdvi-config.h" #include "xdvi.h" #include "x_util.h" #include "xm_colorsel.h" #include "topic-window.h" #include "message-window.h" #include "util.h" #include "events.h" #include "xm_prefsP.h" #include "xm_prefs.h" #include "xm_prefs_appearance.h" #include "xm_prefs_fonts.h" #include "xm_prefs_helpers.h" #include "xm_prefs_page.h" #include "xm_prefs_scroll.h" /* for reverting preferences, we need access to more prototypes ... */ #include "dvi-draw.h" #include "search-internal.h" #include "statusline.h" #include "xm_toolbar.h" #include "xm_menu.h" #include "pagesel.h" #ifdef MOTIF /* entire file */ #include #include #include #include #include #define SCROLLING_DONE 0 #define NUM_PREFS_TOPICS 16 /* should be ample ... */ /* hmm, should maybe move these into xm_prefsP.c ... */ void h_attach_below(Widget x, Widget y) { if (y == NULL) { /* no top widget, attach to form - could just pass NULL as XmNtopWidget, but lesstif warns in that case ... */ XtVaSetValues(x, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); } else { XtVaSetValues(x, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, y, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); } } static void initialize_items(struct topic_info *info) { int i = 0; info->items[i].widget = prefs_appearance(info); info->items[i].topic = xstrdup("Appearance"); info->items[i].title = xstrdup("Change the appearance of xdvi"); i++; info->items[i].widget = prefs_fonts_and_colors(info); info->items[i].topic = xstrdup("Fonts and Colors"); info->items[i].title = xstrdup("Display of fonts and colors in DVI files"); i++; info->items[i].widget = prefs_paper(info); info->items[i].topic = xstrdup("Page Size"); info->items[i].title = xstrdup("Customize the default window and page size"); #if SCROLLING_DONE /* not finished yet */ i++; info->items[i].widget = prefs_scrolling(info); info->items[i].topic = xstrdup("Scrolling"); info->items[i].title = xstrdup("Customize the scrolling behaviour when switching pages"); #endif i++; info->items[i].widget = prefs_helpers(info); #ifdef LESSTIF_VERSION /* compensate for width computation bug by adding extra whitespace at end */ info->items[i].topic = xstrdup("Helper Applications "); #else info->items[i].topic = xstrdup("Helper Applications"); #endif info->items[i].title = xstrdup("External programs used by xdvi"); /* terminate */ i++; info->items[i].widget = 0; info->items[i].topic = info->items[i].title = NULL; ASSERT(i < NUM_PREFS_TOPICS, "NUM_PREFS_TOPICS too small!"); } void remove_from_deplist(struct prefs_choice *prefs, Widget w) { size_t i; Boolean found = False; /* locate this widget */ for (i = 0; i < prefs->depwin_cnt; i++) { if (prefs->depwin[i] == w) { found = True; break; } } if (found) { /* move later widgets down */ for (; i < prefs->depwin_cnt - 1; i++) { prefs->depwin[i] = prefs->depwin[i + 1]; } prefs->depwin_cnt--; } #if 0 fprintf(stderr, "deplist after removal:\n"); for (i = 0; i < prefs->depwin_cnt; i++) { fprintf(stderr, "%d: %p\n", i, prefs->depwin[i]); } #endif } static void update_button(Widget button, Pixel pix) { struct color_button_info *cinfo; static XmDrawnButtonCallbackStruct cbs; XtVaGetValues(button, XmNuserData, &cinfo, NULL); cinfo->pixel = pix; cbs.reason = XmCR_EXPOSE; XtCallCallbacks(button, XmNexposeCallback, &cbs); } static void update_button_by_name(Pixel pix, const char *name) { static Widget pref_shell = 0; Widget button; if (pref_shell == 0 && !get_widget_by_name(&pref_shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, True)) return; if (get_widget_by_name(&button, pref_shell, name, True)) { update_button(button, pix); } } static Boolean revert_colors(Pixel fg, Pixel bg, Pixel hl) { XColor color_data[2]; Boolean need_redraw = False; Widget button; Pixel visited, unvisited; color_data[0].pixel = resource.fore_Pixel; color_data[1].pixel = resource.back_Pixel; str_to_pixel(globals.widgets.top_level, resource.visited_link_color, &visited); str_to_pixel(globals.widgets.top_level, resource.link_color, &unvisited); XQueryColors(DISP, G_colormap, color_data, 2); if (fg != resource.fore_Pixel) { XGCValues values; fg_initial.r = color_data[0].red; fg_initial.g = color_data[0].green; fg_initial.b = color_data[0].blue; values.foreground = resource.rule_pixel = resource.fore_Pixel; XChangeGC(DISP, globals.gc.ruler, GCForeground, &values); scanned_page = scanned_page_color = scanned_page_reset; update_button_by_name(resource.fore_Pixel, Xdvi_FG_COLOR_BTN); need_redraw = True; } if (bg != resource.back_Pixel) { bg_initial.r = color_data[1].red; bg_initial.g = color_data[1].green; bg_initial.b = color_data[1].blue; scanned_page = scanned_page_color = scanned_page_reset; update_button_by_name(resource.back_Pixel, Xdvi_BG_COLOR_BTN); need_redraw = True; } if (hl != resource.hl_Pixel) { XGCValues values; values.foreground = resource.hl_Pixel; XChangeGC(DISP, globals.gc.high, GCForeground, &values); /* hack to update match GC: fake change in inverted property, redraw so that GC is cleared, then change inverted property back */ resource.match_highlight_inverted = !resource.match_highlight_inverted; search_draw_inverted_regions(); resource.match_highlight_inverted = !resource.match_highlight_inverted; update_button_by_name(resource.hl_Pixel, Xdvi_HL_COLOR_BTN); need_redraw = True; } /* NOTE: pixels for hyperlinks are not stored anywhere; just update always: */ if (get_widget_by_name(&button, globals.widgets.top_level, Xdvi_VISITED_LINKS_BTN, True)) { update_button(button, visited); h_update_hyperlinks(button, visited); /* this already triggers a redraw */ } if (get_widget_by_name(&button, globals.widgets.top_level, Xdvi_UNVISITED_LINKS_BTN, True)) { update_button(button, unvisited); h_update_hyperlinks(button, unvisited); /* this already triggers a redraw */ } return need_redraw; } static void revert_resources(void) { Pixel curr_fg = resource.fore_Pixel; Pixel curr_bg = resource.back_Pixel; Pixel curr_hl = resource.hl_Pixel; Boolean need_redraw = False; /* save some old values */ int save_shrink = resource.shrinkfactor; load_app_resources(True); /* revert from saved values */ resource.use_color = globals.curr_use_color; resource.gamma = globals.curr_gamma; resource.paper = globals.curr_paper; resource.shrinkfactor = save_shrink; do_set_shrinkfactor(resource.shrinkfactor, True); update_preferences_darkness(); /* revert expert mode */ if (resource.expert) resource.expert_mode = XPRT_SHOW_NONE; update_expert_mode(); toggle_statusline(); #ifndef MOTIF if (!BROKEN_RECONFIG) toggle_scrollbars(); #else toggle_scrollbars(); #endif #ifdef MOTIF toggle_pagelist(); toggle_toolbar(); toggle_menubar(); #else toggle_buttons(); #endif /* reset tooltips_wait_period, similar to TipAddWidget() in Tip.c */ resource.tooltips_wait_period = resource.tooltips_wait_period_bak; if (resource.tooltips_wait_period < 0) { resource.show_tooltips = False; } else if (!resource.show_tooltips) { if (resource.tooltips_wait_period == 0) resource.tooltips_wait_period = -1; else resource.tooltips_wait_period = -resource.tooltips_wait_period; } update_preferences_expert(); update_preferences_tooltips(); update_preferences_search(); update_preferences_color(); update_preferences_hyperlinks(); update_preferences_windowsize(); update_preferences_shrink(); update_preferences_paper(); update_preferences_helpers(); need_redraw |= revert_colors(curr_fg, curr_bg, curr_hl); /* if (need_redraw) */ /* just reload it always, there's too many exceptions ... redraw isn't always sufficient if file has colors. */ globals.ev.flags |= EV_RELOAD; } /* add widget w to list of dependent windows */ void add_to_deplist(struct prefs_choice *prefs, Widget w) { #if 0 size_t i; #endif prefs->depwin = xrealloc(prefs->depwin, (prefs->depwin_cnt + 1) * sizeof *(prefs->depwin)); prefs->depwin[prefs->depwin_cnt] = w; prefs->depwin_cnt++; #if 0 fprintf(stderr, "deplist after adding:\n"); for (i = 0; i < prefs->depwin_cnt; i++) { fprintf(stderr, "%lu: %p\n", (unsigned long)i, prefs->depwin[i]); } #endif } static void reread_prefs_cb(Window w) { if (w != XtWindow(globals.widgets.top_level)) { XChangeProperty(DISP, w, atom_reread_prefs(), atom_reread_prefs(), 8, PropModeReplace, /* dummy values, since all the other instance needs to do is reread the ~/.xdvirc.tmp file */ (unsigned char *)"Y", 1); } } static void apply_prefs_cb(XtPointer arg) { struct topic_info *info = (struct topic_info *)arg; struct prefs_choice *prefs = (struct prefs_choice *)info->data; size_t i; Widget colorsel; if (get_widget_by_name(&colorsel, globals.widgets.top_level, Xdvi_COLOR_DIALOG_NAME, False)) { XtPopdown(XtParent(colorsel)); } /* pop down dependent windows */ TRACE_GUI((stderr, "window count: %lu\n", (unsigned long)prefs->depwin_cnt)); for (i = 0; i < prefs->depwin_cnt; i++) { TRACE_GUI((stderr, "popping down %lu: %p", (unsigned long)i, (void *)(prefs->depwin[i]))); if (XtIsRealized(prefs->depwin[i])) { XtCallCallbacks(prefs->depwin[i], XmNcancelCallback, NULL); XSync(DISP, True); /* wait for server to catch up */ if (XtIsRealized(prefs->depwin[i])) { TRACE_GUI((stderr, "calling XmNokCallback of %lu: %p", (unsigned long)i, (void *)(prefs->depwin[i]))); XtCallCallbacks(prefs->depwin[i], XmNokCallback, NULL); } } } free(prefs->depwin); prefs->depwin = NULL; prefs->depwin_cnt = 0; if (prefs->db == NULL) /* callback invoked multiple times? */ return; merge_into_user_db(prefs->db); /* this destroys prefs->db */ prefs->db = NULL; /* remember some current values */ free(globals.curr_paper); if (resource.paper != NULL) globals.curr_paper = xstrdup(resource.paper); free(globals.curr_editor); if (resource.editor != NULL) globals.curr_editor = xstrdup(resource.editor); free(globals.curr_browser); if (resource.browser != NULL) globals.curr_browser = xstrdup(resource.browser); /* fprintf(stderr, "set curr_browser to: |%s|\n", globals.curr_browser); */ /* fprintf(stderr, "set curr_editor to: |%s|\n", globals.curr_editor); */ if (get_xdvi_window_id(False, NULL) && save_user_preferences(False)) { /* if other instances of xdvi are running, make them reread the changed preferences by writing them to ~/.xdvirc.tmp and having them read that file; otherwise they would overwrite the file if user quits them after the current instance. */ get_xdvi_window_id(False, reread_prefs_cb); } } static void revert_prefs_cb(XtPointer arg) { struct topic_info *info = (struct topic_info *)arg; struct prefs_choice *prefs = (struct prefs_choice *)info->data; size_t i; /* pop down dependent windows */ TRACE_GUI((stderr, "window count: %lu", (unsigned long)prefs->depwin_cnt)); for (i = 0; i < prefs->depwin_cnt; i++) { TRACE_GUI((stderr, "popping down %lu: %p", (unsigned long)i, (void *)(prefs->depwin[i]))); if (XtIsRealized(prefs->depwin[i])) { XtCallCallbacks(prefs->depwin[i], XmNcancelCallback, NULL); XSync(DISP, True); /* wait for server to catch up */ if (XtIsRealized(prefs->depwin[i])) { TRACE_GUI((stderr, "calling XmNokCallback of %lu: %p", (unsigned long)i, (void *)(prefs->depwin[i]))); XtCallCallbacks(prefs->depwin[i], XmNokCallback, NULL); } } } free(prefs->depwin); prefs->depwin = NULL; prefs->depwin_cnt = 0; if (prefs->db == NULL) { /* callback invoked multiple times, or prefs not changed */ return; } revert_resources(); XrmDestroyDatabase(prefs->db); prefs->db = NULL; } static void save_prefs_exit(XtPointer arg) { struct topic_info *info = (struct topic_info *)arg; apply_prefs_cb(info); XtPopdown(info->shell); XSync(DISP, False); xdvi_exit(EXIT_SUCCESS); } static void no_save_prefs_exit(XtPointer arg) { struct topic_info *info = (struct topic_info *)arg; revert_prefs_cb(info); XtPopdown(info->shell); XSync(DISP, False); xdvi_exit(EXIT_SUCCESS); } static void close_prefs_exit(Widget w, XtPointer arg) { struct topic_info *info = (struct topic_info *)arg; struct prefs_choice *prefs = (struct prefs_choice *)info->data; /* Widget dialog; */ /* if (get_widget_by_name(&dialog, w, Xdvi_MESSAGE_DIALOG_NAME, True)) { */ /* fprintf(stderr, "!!!!!!!!! removing window from deplist!\n"); */ /* remove_from_deplist(prefs, dialog); */ /* } */ remove_from_deplist(prefs, w); } Boolean preferences_changed(void) { Widget prefs_shell = 0, topic_pane = 0; if (get_widget_by_name(&prefs_shell, globals.widgets.top_level, "preferences_window", False) && get_widget_by_name(&topic_pane, prefs_shell, "topic_pane", False)) { struct topic_info *info = NULL; struct prefs_choice *prefs = NULL; XtVaGetValues(topic_pane, XmNuserData, &info, NULL); if (info == NULL) { return False; } prefs = (struct prefs_choice *)info->data; if (prefs->db != NULL) { /* prefs changed */ Widget popup = choice3_dialog(prefs_shell, MSG_QUESTION, NULL, #ifndef MOTIF NULL, #endif close_prefs_exit, info, /* pre_callbacks */ "Save and Exit", save_prefs_exit, info, "Exit, don't Save", no_save_prefs_exit, info, "Cancel", NULL, NULL, "Preferences have been changed, but not saved yet. " "Save them now?"); add_to_deplist(prefs, popup); return True; } } return False; } void popup_preferences_dialog(Widget parent, int arg) { static Widget preferences_shell = 0; static struct topic_info info; static struct topic_item items[NUM_PREFS_TOPICS]; static struct prefs_choice *prefs = NULL; if (preferences_shell == 0) { /* called 1st time; create widget */ info.ok_callback = apply_prefs_cb; info.cancel_callback = revert_prefs_cb; info.items = items; /* info.items_size = NUM_PREFS_TOPICS; */ prefs = xmalloc(sizeof *prefs); prefs->depwin_cnt = 0; prefs->depwin = NULL; /* prefs->orig = orig_prefs; */ /* apply_prefs_cb/revert_prefs_cb are responsible for copying the changed preferences into the current preferences as appropriate, and free()ing prefs.changed */ /* prefs->changed = xmalloc(sizeof *(prefs->changed)); */ /* copy_resources(orig_prefs, prefs->changed); */ prefs->db = NULL; /* XrmGetStringDatabase(""); */ info.data = prefs; preferences_shell = create_topic_window(parent, "xdvik: Preferences", Xdvi_PREFS_DIALOG_NAME, &info, initialize_items, "OK", "Cancel"); info.shell = preferences_shell; center_window(preferences_shell, parent); select_topic(&info, 0); } if (arg >= 0) select_topic(&info, arg); XtPopup(preferences_shell, XtGrabNone); if (resource.no_init_file) { popup_message(preferences_shell, MSG_WARN, NULL, "You specified the resource `noInitFile' or the `-q' command-line option. " "Any preferences that you set in this dialog will be lost when you exit xdvi."); } } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xaw_menu.c0000664000175000017500000006251011276240141020740 0ustar uwabamiuwabami/* * Copyright (c) 2001-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Menu bar implementation for the Athena widget set. */ #include "xdvi-config.h" #include "xdvi.h" #include "c-openmx.h" #include "events.h" #include "dvi-draw.h" #include "dvi-init.h" #include "statusline.h" #include "pagesel.h" #include "util.h" #include "x_util.h" #include "xaw_menu.h" #include "message-window.h" #include "my-snprintf.h" #include "filehist.h" #include "menu.h" #ifndef MOTIF /* entire file */ #include #include #include #include #include /* needed for def. of XtNiconX */ #include #include #include #include #include #include #include #include #include #include #include #ifndef MAX # define MAX(i, j) ( (i) > (j) ? (i) : (j) ) #endif static Widget line_widget, panel_widget; /* width of button panel */ static int m_panel_width = 0; /* used for communication with the pagelist in xaw_create_pagelist */ static int m_y_pos; /* access method for panel width */ int get_panel_width(void) { /* int retval = 0; */ /* if (resource.expert_mode & XPRT_SHOW_BUTTONS) */ /* retval = m_panel_width; */ /* TRACE_GUI((stderr, "get_panel_width: %d", retval)); */ /* return retval; */ return m_panel_width; } /* ================================================================================ Pixmaps indicating the state of menu buttons (radiobutton/checkbox on/off, cascading menu). Inspired by menu.c, `check_bits' in the xterm source. ================================================================================ */ #include "xaw_bitmaps.h" static Pixmap menu_check_on_bitmap; static Pixmap menu_check_off_bitmap; static Pixmap menu_radio_on_bitmap; static Pixmap menu_radio_off_bitmap; static Pixmap menu_arrow_bitmap; /* ============================================================ Hack for pullright menus part I: data ============================================================ */ /* There are a few custom widgets for pullright menus out there, but * these are old and potentially buggy, so just do it manually via an * event handler, similar to Motif tooltips. */ static XtIntervalId m_timeout = 0; static Widget m_active_submenu = NULL; /* if not NULL, the currently active pullright */ static Widget m_submenu = NULL; /* parent of the currently active pullright (i.e. the menu label in the parent window) */ static void ActPopdownSubmenus(Widget w, XEvent *event, String *params, Cardinal *num_params); /* to safely pop down the pullright, this callback is added to its parent menu */ static XtActionsRec menu_actions[] = { { "popdown-submenus", ActPopdownSubmenus } }; struct pullright_position_info { Position y; Dimension w; Dimension h; Dimension border_width; Widget menu; }; /* * Set all pixmaps indicating the state of the wigdet pointed to by `elems'. */ void xaw_set_button_state(struct button_elems *elems, Boolean on) { static Arg args[] = { { XtNleftBitmap, (XtArgVal)0 }, { XtNrightBitmap, (XtArgVal)0 } }; if (elems->type == BT_CHECK) args[0].value = on ? menu_check_on_bitmap : menu_check_off_bitmap; else if (elems->type == BT_RADIO) args[0].value = on ? menu_radio_on_bitmap : menu_radio_off_bitmap; if (elems->submenu != NULL) args[1].value = menu_arrow_bitmap; XtSetValues(elems->widget, args, XtNumber(args)); } /* * Initialize the bitmaps. */ void xaw_initialize_menu_bitmaps(void) { static Boolean initialized = False; if (!initialized) { initialized = True; menu_check_on_bitmap = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level), RootWindowOfScreen(XtScreen(globals.widgets.top_level)), (char *)menu_check_on_bits, MENU_BITMAP_W, MENU_BITMAP_H); menu_check_off_bitmap = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level), RootWindowOfScreen(XtScreen(globals.widgets.top_level)), (char *)menu_check_off_bits, MENU_BITMAP_W, MENU_BITMAP_H); menu_radio_on_bitmap = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level), RootWindowOfScreen(XtScreen(globals.widgets.top_level)), (char *)menu_radio_on_bits, MENU_BITMAP_W, MENU_BITMAP_H); menu_radio_off_bitmap = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level), RootWindowOfScreen(XtScreen(globals.widgets.top_level)), (char *)menu_radio_off_bits, MENU_BITMAP_W, MENU_BITMAP_H); menu_arrow_bitmap = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level), RootWindowOfScreen(XtScreen(globals.widgets.top_level)), (char *)menu_arrow_bits, MENU_ARROW_W, MENU_ARROW_H); } } void xaw_create_pagelist(void) { Dimension height, width; XtVaGetValues(globals.widgets.clip_widget, XtNheight, &height, NULL); XtVaGetValues(panel_widget, XtNwidth, &width, NULL); width = MAX(width - 2 * (resource.btn_side_spacing + resource.btn_border_width), xaw_get_pagelist_size()); height -= resource.btn_top_spacing + resource.btn_border_width + m_y_pos; xaw_create_pagelist_widgets(height, width, m_y_pos, panel_widget); } static XtCallbackRec command_call[] = { {handle_command, NULL}, {NULL, NULL}, }; #ifdef USE_PANNER void scroll_x_panner(int x) { static int old_x = 0; if (panner != 0 && ABS(x - old_x) > 8) { XtVaSetValues(panner, XtNsliderX, x, NULL); old_x = x; } } void scroll_y_panner(int y) { static int old_y = 0; if (panner != 0 && ABS(y - old_y) > 8) { XtVaSetValues(panner, XtNsliderY, y, NULL); old_y = y; } } static void panner_cb(Widget widget, XtPointer closure, XtPointer report_ptr) { XawPannerReport *report = (XawPannerReport *)report_ptr; static int orig_x = 0, orig_y = 0; int x = report->slider_x; int y = report->slider_y; static Dimension w, h; static Arg arg_wh_clip[] = { {XtNwidth, (XtArgVal) &w}, {XtNheight, (XtArgVal) &h}, }; UNUSED(closure); XtGetValues(globals.widgets.clip_widget, arg_wh_clip, XtNumber(arg_wh_clip)); fprintf(stderr, "w: %d, h: %d, globals.page.w: %d, globals.page.h: %d\n", w, h, globals.page.w, globals.page.h); XtVaSetValues(widget, XtNsliderWidth, w, XtNsliderHeight, h, XtNcanvasWidth, globals.page.w, XtNcanvasHeight, globals.page.h, NULL); fprintf(stderr, "panner moved: %d, %d\n", report->slider_x, report->slider_y); if (globals.widgets.x_bar != NULL) XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(x - orig_x)); if (globals.widgets.y_bar != NULL) XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(y - orig_y)); orig_x = x; orig_y = y; } #endif /* USE_PANNER */ static void create_menu_entries(struct button_info *item, Widget parent) { size_t i; /* add our own popdown-submenus() action to the default translations of this menu */ XtAccelerators menu_accels = XtParseAcceleratorTable(":MenuPopdown()notify()unhighlight()popdown-submenus()"); for (i = 0; item != NULL && i < item->size; i++) { Widget w; if (item->elems[i].submenu != NULL) { /* another submenu */ XDVI_ERROR((stderr, "Xaw menus don't support nested pulldown menus (ignoring)")); continue; } if (item->elems[i].type == BT_SEP) { /* separator */ w = XtCreateManagedWidget(item->elems[i].title, smeLineObjectClass, parent, NULL, 0); } else if (item->elems[i].action != NULL && item->elems[i].action->proc == Act_recent_files) { /* special case: submenu with recent files */ w = XtVaCreateManagedWidget(item->elems[i].title, smeBSBObjectClass, parent, XtNlabel, item->elems[i].title, XtNleftMargin, 20, XtNrightMargin, 16, XtNrightBitmap, menu_arrow_bitmap, NULL); m_submenu = w; XtOverrideTranslations(parent, menu_accels); } else { /* normal menu entry */ w = XtVaCreateManagedWidget(item->elems[i].title, smeBSBObjectClass, parent, XtNlabel, item->elems[i].title, XtNleftMargin, 20, NULL); XtAddCallback(w, XtNcallback, handle_command, item->elems[i].action); } item->elems[i].widget = w; } } void xaw_create_menu(struct button_info *item, Widget parent, int *ret_width) { Dimension y_pos = resource.btn_top_spacing; size_t i; XtAppAddActions(XtWidgetToApplicationContext(globals.widgets.form_widget), menu_actions, XtNumber(menu_actions)); for (i = 0; item != NULL && i < item->size; i++) { Widget button; Dimension w, h; if (item->elems[i].type == BT_SEP) { /* separator */ XDVI_ERROR((stderr, "Cannot have a separator on a toplevel Xaw menu (ignoring)")); /* y_pos += resource.btn_between_extra; */ continue; } else if (item->elems[i].submenu != NULL) { /* menu button, create a pulldown menu */ Widget shell; button = XtVaCreateWidget("button", menuButtonWidgetClass, parent, XtNmenuName, item->elems[i].title, XtNlabel, item->elems[i].title, XtNx, resource.btn_side_spacing, XtNy, y_pos, XtNborderWidth, resource.btn_border_width, NULL); shell = XtCreatePopupShell(item->elems[i].title, simpleMenuWidgetClass, button, NULL, 0); create_menu_entries(item->elems[i].submenu, shell); } else { /* command button */ command_call[0].closure = (XtPointer)item->elems[i].action; button = XtVaCreateWidget(item->elems[i].title, commandWidgetClass, parent, XtNlabel, item->elems[i].title, XtNx, resource.btn_side_spacing, XtNy, y_pos, XtNborderWidth, resource.btn_border_width, XtNcallback, (XtArgVal)command_call, NULL); } XtVaGetValues(button, XtNwidth, &w, XtNheight, &h, NULL); y_pos += h + resource.btn_between_spacing + 2 * resource.btn_border_width; if (w > m_panel_width) m_panel_width = w; item->elems[i].widget = button; } /* adjust button sizes, and manage buttons (managing them earlier may result in `parent has no geometry manager' error) */ for (i = 0; item != NULL && i < item->size; i++) { XtVaSetValues(item->elems[i].widget, XtNwidth, m_panel_width, NULL); XtManageChild(item->elems[i].widget); } m_y_pos = y_pos - resource.btn_between_spacing + resource.btn_top_spacing + 2 * resource.btn_border_width; m_panel_width += 2 * resource.btn_side_spacing + resource.btn_border_width; XtVaSetValues(panel_widget, XtNwidth, m_panel_width, NULL); *ret_width = m_panel_width; } Widget xaw_create_menu_widgets(Widget parent) { /* hack to disable the magnifier in the panel: */ XtTranslations panel_translations = XtParseTranslationTable("#augment :"); XtAppAddActions(XtWidgetToApplicationContext(parent), menu_actions, XtNumber(menu_actions)); line_widget = XtVaCreateWidget("line", widgetClass, parent, XtNbackground, (XtArgVal)resource.fore_Pixel, XtNwidth, (XtArgVal)1, XtNfromHoriz, (XtArgVal)globals.widgets.vport_widget, XtNborderWidth, (XtArgVal)0, XtNtop, (XtArgVal)XtChainTop, XtNbottom, (XtArgVal)XtChainBottom, XtNleft, (XtArgVal)XtChainRight, XtNright, (XtArgVal)XtChainRight, NULL); panel_widget = XtVaCreateWidget("panel", compositeWidgetClass, parent, XtNborderWidth, (XtArgVal)0, XtNfromHoriz, (XtArgVal)line_widget, XtNtranslations, (XtArgVal)panel_translations, XtNtop, (XtArgVal)XtChainTop, XtNbottom, (XtArgVal)XtChainBottom, XtNleft, (XtArgVal)XtChainRight, XtNright, (XtArgVal)XtChainRight, NULL); return panel_widget; } static void filehist_select_cb(Widget w, XtPointer client_data, XtPointer call_data) { char *label, *ptr; int idx; UNUSED(client_data); UNUSED(call_data); XtVaGetValues(w, XtNlabel, &label, NULL); idx = strtol(label, &ptr, 10) - 1; while (isspace(*ptr)) ptr++; TRACE_GUI((stderr, "User selected: %d, `%s'", idx, ptr)); if (idx == 0) { globals.ev.flags |= EV_RELOAD; return; } file_history_open(ptr); } static void update_menu_labels(Widget menu) { WidgetList children; int num_children; int i; static char *buf = NULL; static size_t buf_len = 0; size_t new_len; XtVaGetValues(menu, XtNnumChildren, &num_children, XtNchildren, &children, NULL); for (i = 0; i < (int)file_history_size(); i++) { int dummy_page; char *filename; if ((filename = file_history_get_elem(i, &dummy_page)) == NULL) { XDVI_ERROR((stderr, "Error accessing element %d of file history", i)); continue; } new_len = LENGTH_OF_INT + strlen(filename) + 1; if (new_len > buf_len) { buf = xrealloc(buf, new_len); buf_len = new_len; } sprintf(buf, "%d %s", i + 1, filename); XtVaSetValues(children[i], XtNlabel, buf, NULL); TRACE_GUI((stderr, "child %d: `%s'", i, buf)); } /* if history size < number of menu entries, destroy excess menu entries */ for (; i < num_children; i++) { XtDestroyWidget(children[i]); } } void filehist_menu_add_entry(const char *filename) { static char *buf = NULL; static size_t buf_len = 0; size_t new_len = LENGTH_OF_INT + strlen(filename) + 1; Widget menu; /* Don't report an error here, since "filehist_pullright" is only created on-demand when user clicks on menu, but this may be called before from the event loop. (The menu will still contain this entry when it's created later.) */ if (get_widget_by_name(&menu, globals.widgets.top_level, "filehist_pullright", False)) { int num_children; Widget w; if (new_len > buf_len) { buf = xrealloc(buf, new_len); buf_len = new_len; } XtVaGetValues(menu, XtNnumChildren, &num_children, NULL); sprintf(buf, "%d %s", num_children + 1, filename); w = XtVaCreateManagedWidget("_filehist", smeBSBObjectClass, menu, XtNlabel, buf, XtNleftMargin, 10, NULL); XtAddCallback(w, XtNcallback, filehist_select_cb, NULL); update_menu_labels(menu); } } void filehist_menu_refresh(void) { Widget menu; /* Don't report an error here, since "filehist_pullright" is only created on-demand when user clicks on menu, but this may be called before from the event loop. (The menu will still contain this entry when it's created later.) */ if (get_widget_by_name(&menu, globals.widgets.top_level, "filehist_pullright", False)) { update_menu_labels(menu); } } static void filehist_insert_submenu(int idx, const char *filename, int pageno, void *data) { Widget menu = (Widget)data; Widget w; static char *buf = NULL; static size_t buf_len = 0; size_t new_len = LENGTH_OF_INT + strlen(filename) + 1; UNUSED(pageno); if (new_len > buf_len) { buf = xrealloc(buf, new_len); buf_len = new_len; } sprintf(buf, "%d %s", idx + 1, filename); TRACE_GUI((stderr, "Creating menu `%s'", buf)); w = XtVaCreateManagedWidget("_filehist", smeBSBObjectClass, menu, XtNlabel, buf, XtNleftMargin, 10, NULL); XtAddCallback(w, XtNcallback, filehist_select_cb, NULL); } /* ============================================================ Hack for pullright menus part II: callbacks and functions ============================================================ */ /* callback to pop down the currently active pullright */ static void ActPopdownSubmenus(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); if (m_timeout != 0) XtRemoveTimeOut(m_timeout); m_timeout = 0; if (m_active_submenu != NULL) XtPopdown(m_active_submenu); } /* create a parent shell for the pullright menu entries */ static Widget create_files_submenu(void) { Widget popup = XtCreatePopupShell("filehist_pullright", simpleMenuWidgetClass, globals.widgets.top_level, NULL, 0); file_history_enumerate(filehist_insert_submenu, popup); return popup; } /* Acutally pop up the pullright menu */ static void popup_pullright(XtPointer client_data, XtIntervalId *id) { int pos_x, pos_y; Dimension w1; Window dummy; static Widget files_submenu = NULL; struct pullright_position_info *info = (struct pullright_position_info *)client_data; UNUSED(id); if (files_submenu == NULL) files_submenu = create_files_submenu(); /* XtManageChild(files_submenu); */ XTranslateCoordinates(DISP, XtWindow(XtParent(m_submenu)), RootWindowOfScreen(SCRN), info->w, info->y, &pos_x, &pos_y, &dummy); XtRealizeWidget(files_submenu); XtVaGetValues(files_submenu, XtNwidth, &w1, NULL); TRACE_GUI((stderr, "Popping up at %d, %d, %d, %d", pos_x, pos_y, w1, WidthOfScreen(SCRN))); /* if not sufficient place on the right, pop it up on the left */ /* fprintf(stderr, "border_width: %d\n", info->border_width); */ if (pos_x + w1 > WidthOfScreen(SCRN)) { /* fprintf(stderr, "%d > %d!\n", pos_x + w1, WidthOfScreen(SCRN)); */ pos_x -= (w1 + info->w + 3 * info->border_width); /* fprintf(stderr, "new x: %d\n", pos_x); */ } else { pos_x += info->border_width; } XtVaSetValues(files_submenu, XtNx, pos_x, XtNy, pos_y, NULL); /* use XtPopupSpringLoaded() instead of XtPopup() since it does a few things that make the pullright behave like a proper menu, like highlighting the current selection, setting the cursor shape etc. */ XtPopupSpringLoaded(files_submenu); m_active_submenu = files_submenu; } /* * This event handler (to be called by read_events(), the main event handling loop) * creates a timeout for the pullright to pop up. */ void SubMenuHandleEvent(XtAppContext app, XEvent *event) { static int flag = 0; static struct pullright_position_info info = { -1, 0, 0, 0, NULL }; UNUSED(app); if (m_submenu == NULL) return; if (event->type == EnterNotify || event->type == MotionNotify || event->type == LeaveNotify || event->type == ButtonPress) { /* fprintf(stderr, "SubMenuHandleEvent: 0x%lx, 0x%lx\n", event->xany.window, XtWindow(m_submenu)); */ /* Could also loop through a list of windows here ... We need to check for the parent of the menu item, since smeBSBObject is not a real window, and then manually check whether the pointer is inside the menu item. */ if (XtParent(m_submenu) != NULL && event->xany.window == XtWindow(XtParent(m_submenu))) { /* don't need to check for x coordinates since we already know that pointer is inside the parent */ if (info.y == -1) { /* initialize info */ XtVaGetValues(m_submenu, XtNy, &(info.y), XtNwidth, &(info.w), XtNheight, &(info.h), NULL); XtVaGetValues(XtParent(m_submenu), XtNborderWidth, &(info.border_width), NULL); info.menu = m_submenu; } if (info.y < event->xbutton.y && info.y + info.h > event->xbutton.y) { if (flag == 0) { /* Create a timeout of 200ms to pop up the menu, so that it doesn't pop up always when the cursor is only moved over the pulldown menu. I think this is about the same delay as the one used by Motif. */ flag = 1; TRACE_GUI((stderr, "ENTER: %d, %d, %d; %d, %d", info.y, info.w, info.h, event->xbutton.x, event->xbutton.y)); m_timeout = XtAppAddTimeOut(app, 200, popup_pullright, &info); return; } } else if (flag == 1) { flag = 0; TRACE_GUI((stderr, "LEAVE!")); if (m_timeout != 0) XtRemoveTimeOut(m_timeout); m_timeout = 0; if (m_active_submenu != NULL) XtPopdown(m_active_submenu); m_active_submenu = NULL; } } } } void realize_button_panel(XtArgVal h) { XtVaSetValues(line_widget, XtNheight, h, NULL); XtVaSetValues(panel_widget, XtNheight, h, NULL); if ((resource.expert_mode & XPRT_SHOW_BUTTONS) != 0) { XtManageChild(line_widget); XtManageChild(panel_widget); } } static void reconfig_window(void) { Dimension x_top, y_top, h_top, w_top; XWindowChanges sizeconfigure; int sizeconfiguremask; /* brute-force method to bring the scrollbars back. Apparently a single XConfigureWindow() isn't enough to get the scrollbars back, we actually need to move the window a bit, and then move it back. */ sizeconfiguremask = CWWidth | CWHeight; XtVaGetValues(globals.widgets.top_level, XtNx, &x_top, XtNy, &y_top, XtNheight, &h_top, XtNwidth, &w_top, NULL); sizeconfigure.width = w_top + 1; sizeconfigure.height = h_top + 1; XConfigureWindow(DISP, XtWindow(globals.widgets.top_level), sizeconfiguremask, &sizeconfigure); sizeconfigure.width = w_top; sizeconfigure.height = h_top; XConfigureWindow(DISP, XtWindow(globals.widgets.top_level), sizeconfiguremask, &sizeconfigure); } /* toggle scrollbars to state `visible' */ void toggle_scrollbars(void) { Widget v_bar = XtNameToWidget(globals.widgets.vport_widget, "vertical"); Widget h_bar = XtNameToWidget(globals.widgets.vport_widget, "horizontal"); static Dimension bar_thick; static Boolean v_bar_mapped = False, h_bar_mapped = False; static Boolean initialized = False; Boolean make_v_bar_visible = False; Boolean make_v_bar_invisible = False; Boolean make_h_bar_visible = False; Boolean make_h_bar_invisible = False; if (v_bar != 0) { int test_v = 0; XtVaGetValues(v_bar, XtNwidth, &test_v, NULL); if (test_v > 1) v_bar_mapped = True; } if (h_bar != 0) { int test_h = 0; XtVaGetValues(h_bar, XtNheight, &test_h, NULL); if (test_h > 1) h_bar_mapped = True; } if (!initialized) { v_bar_mapped = h_bar_mapped = (resource.expert_mode & XPRT_SHOW_SCROLLBARS) != 0; initialized = True; if (v_bar != 0) XtVaGetValues(v_bar, XtNwidth, &bar_thick, NULL); else if (h_bar != 0) XtVaGetValues(h_bar, XtNheight, &bar_thick, NULL); else bar_thick = 15; /* FIXME */ } if ((resource.expert_mode & XPRT_SHOW_SCROLLBARS) == 0) { if (v_bar_mapped) make_v_bar_invisible = True; if (h_bar_mapped) make_h_bar_invisible = True; } else { if (!v_bar_mapped) make_v_bar_visible = True; if (!h_bar_mapped) make_h_bar_visible = True; } if (make_h_bar_visible || make_v_bar_visible) { if (make_h_bar_visible && h_bar != 0) { TRACE_GUI((stderr, "h_bar: h %d", bar_thick)); XtVaSetValues(h_bar, XtNheight, bar_thick, XtNx, bar_thick, XtNy, 0, XtNborderWidth, 1, NULL); XtManageChild(h_bar); h_bar_mapped = True; } if (make_v_bar_visible && v_bar != 0) { TRACE_GUI((stderr, "v_bar: w %d", bar_thick)); XtVaSetValues(v_bar, XtNwidth, bar_thick, XtNx, 0, XtNy, bar_thick, XtNborderWidth, 1, NULL); XtManageChild(v_bar); v_bar_mapped = True; } if (h_bar != 0 || v_bar != 0) { /* need to reconfigure screen */ reconfig_window(); } } else if (make_h_bar_invisible || make_v_bar_invisible) { if (make_h_bar_invisible && h_bar != 0) { XtUnmanageChild(h_bar); XtVaSetValues(h_bar, XtNheight, 1, XtNx, 0, XtNy, 0, XtNborderWidth, 0, NULL); h_bar_mapped = False; } if (make_v_bar_invisible && v_bar != 0) { XtUnmanageChild(v_bar); XtVaSetValues(v_bar, XtNwidth, 1, XtNy, 0, XtNy, 0, XtNborderWidth, 0, NULL); v_bar_mapped = False; } if (h_bar != 0 || v_bar != 0) { /* need to reconfigure screen */ reconfig_window(); } } } void toggle_buttons(void) { static Dimension panel_width = 0; Dimension w; if (panel_width == 0) /* initialize */ XtVaGetValues(panel_widget, XtNwidth, &panel_width, NULL); /* need to get current width of form in case user has resized the window */ XtVaGetValues(globals.widgets.form_widget, XtNwidth, &w, NULL); XtVaSetValues(globals.widgets.vport_widget, XtNresizable, (XtArgVal)True, NULL); if (resource.expert_mode & XPRT_SHOW_BUTTONS) { /* show buttons */ XtManageChild(panel_widget); XtManageChild(line_widget); XtVaSetValues(globals.widgets.vport_widget, XtNwidth, w - panel_width - 1, /* -1 for line_widget */ NULL); } else { /* hide buttons */ XtUnmanageChild(panel_widget); XtUnmanageChild(line_widget); XtVaSetValues(globals.widgets.vport_widget, XtNwidth, w, NULL); } } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* ifndef MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xicon.c0000664000175000017500000001121210363262237020234 0ustar uwabamiuwabami/* * Copyright (c) 2001 Marcin Dalecki * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Implement a nice and well behaved application icon. */ #include "xdvi-config.h" #include "xdvi.h" #include "xicon.h" #include "util.h" #include "xdvi-debug.h" #include #include #include #include #include #include #include #include #ifdef MOTIF # include #endif #if defined(HAVE_X11_XPM_H) # include #elif defined(HAVE_XPM_H) # include #elif defined(HAVE_XM_XPMP_H) # include #endif #include "xdvi.icon" #include "pixmaps/xdvi32x32.xpm" #include "pixmaps/xdvi16x16.xpm" #include "pixmaps/xdvi48x48.xpm" void add_icon(Widget top_level, String title_name, String icon_name) { #if !HAVE_XPM static Arg args[] = { {XtNiconX, (XtArgVal) 0}, {XtNiconY, (XtArgVal) 0}, }; static Pixmap icon_pm; static Arg temp_args4 = { XtNiconPixmap, (XtArgVal) &icon_pm }; UNUSED(xdvi16x16_xpm); UNUSED(xdvi32x32_xpm); UNUSED(xdvi48x48_xpm); if (resource.icon_geometry != NULL) { int junk; (void)XGeometry(DISP, XScreenNumberOfScreen(SCRN), resource.icon_geometry, "", 0, 0, 0, 0, 0, (int *)&args[0].value, (int *)&args[1].value, &junk, &junk); XtSetValues(top_level, args, XtNumber(args)); } /* Set icon pixmap */ XtGetValues(top_level, &temp_args4, 1); if (icon_pm == (Pixmap) 0) { temp_args4.value = (XtArgVal)XCreateBitmapFromData(DISP, RootWindowOfScreen(SCRN), (const char *)xdvi_bits, xdvi_width, xdvi_height); XtSetValues(top_level, &temp_args4, 1); } #else /* HAVE_XPM */ /* Use Pixmaps, looking much nicer. */ static Pixmap icon = 0; static Pixmap icon_mask = 0; static const char **pixmap_data = xdvi32x32_xpm; XIconSize *size; int number_sizes; Display *dsp; Screen *scr; XpmAttributes attr; UNUSED(xdvi_bits); /* * get the icon size preferred by the window manager */ if (XGetIconSizes(XtDisplay(top_level), RootWindowOfScreen(SCRN), &size, &number_sizes) != 0) { if (number_sizes > 0) { if (size->max_height >= 48 && size->max_height >= 48) pixmap_data = xdvi48x48_xpm; else if (size->max_height >= 32 && size->max_height >= 32) pixmap_data = xdvi32x32_xpm; else if (size->max_height >= 16 && size->max_height >= 16) pixmap_data = xdvi16x16_xpm; } } dsp = XtDisplay(top_level); scr = XtScreen(top_level); attr.valuemask = 0L; attr.valuemask = XpmCloseness | XpmReturnPixels | XpmColormap | XpmDepth | XpmVisual; attr.closeness = 65535; /* accuracy isn't crucial */ /* use the same visual/colormap/depth as main window, else BadMatch ... */ attr.visual = G_visual; attr.colormap = G_colormap; attr.depth = G_depth; if (!icon) { Window rootWindow = XtWindow(globals.widgets.top_level); ASSERT(rootWindow != 0, ""); XpmCreatePixmapFromData(dsp, rootWindow, (char **)pixmap_data, &icon, &icon_mask, &attr); } # ifdef MOTIF XtVaSetValues(top_level, XmNiconPixmap, icon, XmNiconMask, icon_mask, NULL); # else XtVaSetValues(top_level, XtNiconPixmap, icon, XtNiconMask, icon_mask, NULL); # endif XpmFreeAttributes(&attr); #endif { /* code locality ... */ static Arg args[] = { { XtNtitle, (XtArgVal) 0 }, { XtNiconName, (XtArgVal) 0 }, { XtNinput, (XtArgVal) True }, }; args[0].value = (XtArgVal)title_name; args[1].value = (XtArgVal)icon_name; XtSetValues(top_level, args, XtNumber(args)); } } xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/print-dialog.c0000664000175000017500000024445711164427731021532 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 Paul Vojta and the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ /* SU: Adapted from non-k xdvi's popups.c and added saving functionality. */ #include #include "xdvi-config.h" #include "xdvi.h" #include "my-vsnprintf.h" #include #include "print-dialog.h" #include "print-internal.h" #include "print-log.h" #include "print-internal.h" #include "events.h" #include "dvi-init.h" #include "string-utils.h" #include "util.h" #include "x_util.h" #include "message-window.h" #include "pagesel.h" #include "my-snprintf.h" #include "sfSelFile.h" #include "dvisel.h" /* for select_marked_pages() */ #include "xlwradio.h" #include "statusline.h" #include "search-dialog.h" #include "search-internal.h" #include "special.h" /* Xlib and Xutil are already included */ #include #include #ifdef MOTIF # include # include # include # include # include # include # include # include # include # include # include # include # include #define XTranslations XmNtranslations #else /* MOTIF */ # include # include # include # include # include # include # include # include # include # include # include # include #if 0 #include "xaw_bitmaps.h" static Pixmap menu_double_arrow_bitmap; #endif #define XTranslations XtNtranslations #endif /* MOTIF */ struct output_format_mapping { const char *fmt_string; outputFormatT fmt; const char *extension; } output_format_mapping[] = { { "Postscript", FMT_PS , ".ps" }, { "PDF", FMT_PS2PDF, ".pdf" }, { "DVI", FMT_DVI, ".dvi" }, { "Plain Text (ISO_8859-1)",FMT_ISO_8859_1, ".txt" }, { "Plain Text (UTF-8)", FMT_UTF8, ".txt" }, { NULL, FMT_NONE, NULL } }; /* Widget names that are used in callbacks ... */ #define Xdvi_SAVE_SHELL_NAME "save_popup" #define Xdvi_PRINT_SHELL_NAME "print_popup" #define Xdvi_PAGE_RANGE_FORM_NAME "page_range_form" #define Xdvi_PAGES_ALL_RADIO_NAME "pages_all" #define Xdvi_PAGES_MARKED_RADIO_NAME "pages_marked" #define Xdvi_PAGES_RANGE_RADIO_NAME "pages_range" #define Xdvi_PAGES_RANGE_FROM_LABEL_NAME "range_from_lab" #define Xdvi_PAGES_RANGE_FROM_TEXT_NAME "range_from_text" #define Xdvi_PAGES_RANGE_TO_LABEL_NAME "range_to_lab" #define Xdvi_PAGES_RANGE_TO_TEXT_NAME "range_to_text" #define Xdvi_PAGES_RANGE_OF_LABEL_NAME "range_of_lab" #define Xdvi_TO_PRINTER_NAME "to_printer" #define Xdvi_TO_PRINTER_TEXT "printer_text" #define Xdvi_TO_FILE_NAME "to_file" #define Xdvi_TO_FILE_TEXT "file_text" #define Xdvi_BROWSE_BUTTON "file_button" #define Xdvi_DVIPS_OPTIONS_NAME "dvips_options_name" #define Xdvi_DVIPS_OPTIONS_TEXT "dvips_options_text" #define Xdvi_FORMAT_SELECTION_BUTTON_NAME "format_selection_button" /* number of items in `format' pulldown menu */ #define FORMAT_SEL_CNT 5 static void print_check_page_values(struct save_or_print_info *info); static void print_check_dvi_file(struct save_or_print_info *info); static void print_check_target_file(XtPointer info); #ifndef MOTIF static void xaw_print_save_act_go(Widget, XEvent *, String *, Cardinal *); #endif /* not MOTIF */ static void wm_cancel(Widget, XEvent *, String *, Cardinal *); static XtActionsRec print_actions[] = { #ifndef MOTIF {"xaw_print_or_save", xaw_print_save_act_go }, #endif {"WM_cancel", wm_cancel }, }; /* ============================================================ generic utility functions ============================================================ */ /* return basename of `old_name' with `old_ext' replaced by `new_ext', in fresh memory */ static char * get_new_file_name(const char *old_name, const char *old_ext, const char *new_ext) { /* old_name contains the normalized DVI file name, with path and extension */ char *basename, *new_name; size_t len; basename = strrchr(old_name, DIR_SEPARATOR); if (basename != NULL) { basename++; new_name = xmalloc(strlen(basename) + strlen(new_ext) + 1); new_name = strcpy(new_name, basename); } else { new_name = xmalloc(strlen(old_name) + strlen(new_ext) + 1); new_name = strcpy(new_name, old_name); } len = strlen(new_name); if (old_ext == NULL) { strcpy(new_name + len, new_ext); } else { strcpy(new_name + len - strlen(old_ext), new_ext); } return new_name; } /* * Translate `non-standard' paper sizes for xdvi into options suitable * for dvips. We don't do this always, since it would override the papersize * specials inserted by e.g. * \usepackage[dvips]{geometry} * which is the preferred way to specify the papersize. If the papersize * has been explicitly set by such a special, this function returns NULL. * Else it returns the value of the `paper' resource, without the trailing * `r', and sets the `landscape' argument to True if a trailing `r' was * present. * * Note that we don't check/warn about whether the current paper * resource is valid for dvips; dvips will ignore invalid paper sizes. */ static char * get_dvips_papersize(Boolean *landscape) { char *papersize; if (have_papersize_special()) return NULL; papersize = xstrdup(resource.paper); /* fprintf(stderr, "PAPERSIZE: |%s|\n", papersize); */ *landscape = False; if (papersize[strlen(papersize) - 1] == 'r') { /* landscape size */ papersize[strlen(papersize) - 1] = '\0'; *landscape = True; } TRACE_GUI((stderr, "Using dvips arguments: `%s', %s", papersize, *landscape ? "landscape" : "portrait")); return papersize; } static void update_dvips_options_sensitivity(int idx, Widget top) { Widget dvips_label; #if MOTIF Widget dvips_options; if (get_widget_by_name(&dvips_label, top, Xdvi_DVIPS_OPTIONS_NAME, True) && get_widget_by_name(&dvips_options, top, Xdvi_DVIPS_OPTIONS_TEXT, True)) { if (output_format_mapping[idx].fmt == FMT_PS || output_format_mapping[idx].fmt == FMT_PS2PDF) { XtSetSensitive(dvips_label, True); XtSetSensitive(dvips_options, True); } else { XtSetSensitive(dvips_label, False); XtSetSensitive(dvips_options, False); } } #else if (get_widget_by_name(&dvips_label, top, Xdvi_DVIPS_OPTIONS_NAME, True)) { XtSetSensitive(XtParent(dvips_label), output_format_mapping[idx].fmt == FMT_PS || output_format_mapping[idx].fmt == FMT_PS2PDF); } #endif } /* callbacks */ static void cb_select_format(Widget w, XtPointer client_data, XtPointer call_data) { struct save_or_print_info *info = NULL; Widget file_text; char *filename; int i = 0; #ifndef MOTIF Widget button; char *old_label, *new_label; char tmp_label[1024]; #endif UNUSED(call_data); #ifdef MOTIF i = (int)client_data; XtVaGetValues(XtParent(w), XmNuserData, &info, NULL); ASSERT(info != NULL, "Expected struct save_or_print_info * in XmNuserData of button!"); if (get_widget_by_name(&file_text, info->shell, Xdvi_TO_FILE_TEXT, True)) { XtVaGetValues(file_text, XmNvalue, &filename, NULL); if (strrchr(filename, '.') != NULL) { char buf[1024]; replace_extension(filename, output_format_mapping[i].extension, buf, sizeof buf); XtVaSetValues(file_text, XmNvalue, buf, XmNcursorPosition, strlen(buf), NULL); } } #else /* MOTIF */ info = (struct save_or_print_info *)client_data; if (get_widget_by_name(&file_text, info->shell, Xdvi_TO_FILE_TEXT, True) && get_widget_by_name(&button, info->shell, Xdvi_FORMAT_SELECTION_BUTTON_NAME, True)) { XtVaGetValues(file_text, XtNstring, &filename, NULL); /* swap title strings */ XtVaGetValues(button, XtNlabel, &old_label, NULL); XtVaGetValues(w, XtNlabel, &new_label, NULL); strncpy(tmp_label, old_label, sizeof tmp_label); /* update the filename with new format */ for (i = 0; output_format_mapping[i].fmt_string != NULL; i++) { if (strcmp(new_label, output_format_mapping[i].fmt_string) == 0) { char buf[1024]; replace_extension(filename, output_format_mapping[i].extension, buf, sizeof buf); XtVaSetValues(file_text, XtNstring, buf, NULL); XawTextSetInsertionPoint(file_text, strlen(buf)); break; } } /* format not found, complain: */ if (output_format_mapping[i].fmt_string == NULL) { popup_message(info->shell, MSG_WARN, REPORT_XDVI_BUG_TEMPLATE, "Unrecognized string in format selector: |%s|", new_label); } XtVaSetValues(button, XtNlabel, new_label, NULL); XtVaSetValues(w, XtNlabel, tmp_label, NULL); } #endif /* MOTIF */ update_dvips_options_sensitivity(i, info->shell); info->fmt = resource.default_saving_format = output_format_mapping[i].fmt; } static void cb_popdown(Widget w, XtPointer client_data, XtPointer call_data) { struct save_or_print_info *info = (struct save_or_print_info *)client_data; UNUSED(w); UNUSED(call_data); ASSERT(info != NULL, "client_data in cb_popdown musn't be NULL!"); if (info->message_popup != 0) { kill_message_window(info->message_popup); } /* fprintf(stderr, "Popping down shell: %p\n", (void *)info->shell); */ XtPopdown(info->shell); } static void cb_print_or_save(Widget w, XtPointer client_data, XtPointer call_data) { struct save_or_print_info *info = (struct save_or_print_info *)client_data; UNUSED(w); UNUSED(call_data); print_check_page_values(info); } /* access from outside the module */ void cancel_saving(struct save_or_print_info *info) { cb_popdown(NULL, info, NULL); } static void wm_cancel(Widget w, XEvent *event, String *params, Cardinal *num_params) { struct save_or_print_info *info = NULL; void *ptr; UNUSED(w); UNUSED(event); ASSERT(*num_params > 0, "params in wm_cancel must be > 0!"); ASSERT(*params != NULL, "params in wm_cancel mustn't be NULL!"); TRACE_GUI((stderr, "Pointer string value: |%s|", *params)); sscanf(*params, "%p", &ptr); info = (struct save_or_print_info *)ptr; cb_popdown(NULL, info, NULL); } /* * Callbacks to enable the corresponding radio button if the user clicks on a text field to * edit it. This is more user-friendly than making the text field insensitive * until the radio button has been clicked. There are 2 separate callbacks, one for * printing vs. saving (only used when actually printing), and one for the page range. */ static void text_print_vs_save_callback(Widget widget, XtPointer closure, XEvent *ev, Boolean *cont) { struct save_or_print_info *info = (struct save_or_print_info *)closure; Widget to_printer; /* used to check where we have been called from */ Widget radio_printer, radio_file; UNUSED(ev); UNUSED(cont); if (get_widget_by_name(&to_printer, info->shell, Xdvi_TO_PRINTER_TEXT, True) && get_widget_by_name(&radio_printer, info->shell, Xdvi_TO_PRINTER_NAME, True) && get_widget_by_name(&radio_file, info->shell, Xdvi_TO_FILE_NAME, True)) { #ifdef MOTIF XmToggleButtonGadgetSetState(radio_printer, widget == to_printer, True); XmToggleButtonGadgetSetState(radio_file, widget != to_printer, True); #else XawToggleSetCurrent(radio_printer, widget == to_printer ? cast_int_to_XtPointer(TO_PRINTER) : cast_int_to_XtPointer(TO_FILE)); #endif } } /* This case is slightly simpler, since the callback only needs to enable * the radio button for the page range, never disable it. */ static void text_page_range_callback(Widget widget, XtPointer closure, XEvent *ev, Boolean *cont) { struct save_or_print_info *info = (struct save_or_print_info *)closure; Widget radio_all, radio_selected, radio_range; UNUSED(ev); UNUSED(cont); UNUSED(widget); if (get_widget_by_name(&radio_all, info->shell, Xdvi_PAGES_ALL_RADIO_NAME, True) && get_widget_by_name(&radio_selected, info->shell, Xdvi_PAGES_MARKED_RADIO_NAME, True) && get_widget_by_name(&radio_range, info->shell, Xdvi_PAGES_RANGE_RADIO_NAME, True)) { #ifdef MOTIF XmToggleButtonGadgetSetState(radio_all, False, True); XmToggleButtonGadgetSetState(radio_selected, False, True); XmToggleButtonGadgetSetState(radio_range, True, True); #else XawToggleSetCurrent(radio_all, cast_int_to_XtPointer(PAGE_RANGE)); #endif } } #ifdef MOTIF /* Motif type callbacks for the above. */ static void cb_text_print_vs_save(Widget w, XtPointer client_data, XtPointer call_data) { UNUSED(call_data); /* fprintf(stderr, "************ cb_text_print_vs_save!\n"); */ text_print_vs_save_callback(w, client_data, NULL, NULL); } static void cb_text_page_range(Widget w, XtPointer client_data, XtPointer call_data) { UNUSED(call_data); text_page_range_callback(w, client_data, NULL, NULL); } #else /* MOTIF */ static void xaw_print_save_act_go(Widget w, XEvent *event, String *params, Cardinal *num_params) { struct save_or_print_info *info = NULL; void *ptr; UNUSED(w); UNUSED(event); ASSERT(*num_params > 0, "params in xaw_print_save_act_go must be > 0!"); ASSERT(*params != NULL, "params in xaw_print_save_act_go mustn't be NULL!"); TRACE_GUI((stderr, "Pointer string value: |%s|", *params)); sscanf(*params, "%p", &ptr); info = (struct save_or_print_info *)ptr; print_check_page_values(info); } #endif /* MOTIF */ static void cb_print_vs_save(Widget w, XtPointer client_data, XtPointer call_data) { struct save_or_print_info *info = (struct save_or_print_info *)client_data; Widget radio_printer, radio_file; /* Widget file_button; */ UNUSED(call_data); if (get_widget_by_name(&radio_printer, info->shell, Xdvi_TO_PRINTER_NAME, True) && get_widget_by_name(&radio_file, info->shell, Xdvi_TO_FILE_NAME, True)) { #ifdef MOTIF Widget text; if (radio_printer == w) { XmToggleButtonGadgetSetState(radio_printer, True, False); XmToggleButtonGadgetSetState(radio_file, False, False); if (get_widget_by_name(&text, info->shell, Xdvi_TO_PRINTER_TEXT, True)) XmProcessTraversal(text, XmTRAVERSE_CURRENT); } else { XmToggleButtonGadgetSetState(radio_printer, False, False); XmToggleButtonGadgetSetState(radio_file, True, False); if (get_widget_by_name(&text, info->shell, Xdvi_TO_FILE_TEXT, True)) XmProcessTraversal(text, XmTRAVERSE_CURRENT); } #endif if (radio_printer == w) info->print_target = TO_PRINTER; else info->print_target = TO_FILE; } } static void cb_range(Widget w, XtPointer client_data, XtPointer call_data) { struct save_or_print_info *info = (struct save_or_print_info *)client_data; Widget radio_all, radio_selected, radio_range; UNUSED(call_data); #ifndef MOTIF UNUSED(w); #endif if (get_widget_by_name(&radio_all, info->shell, Xdvi_PAGES_ALL_RADIO_NAME, True) && get_widget_by_name(&radio_selected, info->shell, Xdvi_PAGES_MARKED_RADIO_NAME, True) && get_widget_by_name(&radio_range, info->shell, Xdvi_PAGES_RANGE_RADIO_NAME, True)) { #ifdef MOTIF XmToggleButtonGadgetSetState(radio_all, radio_all == w, False); XmToggleButtonGadgetSetState(radio_selected, radio_selected == w, False); XmToggleButtonGadgetSetState(radio_range, radio_range == w, False); #endif } /* update_page_range_sensitivity(info->shell, radio_range == w); */ } static void set_filename_callback(const char *fname, void *data) { /* fprintf(stderr, "Filename: |%s|; widget: %p\n", fname, data); */ if (fname != NULL) { Widget w = (Widget)data; #ifdef MOTIF XtVaSetValues(w, XmNvalue, fname, XmNcursorPosition, strlen(fname), NULL); #else XtVaSetValues(w, XtNstring, fname, NULL); XawTextSetInsertionPoint(w, strlen(fname)); #endif } } static void cb_browse(Widget w, XtPointer client_data, XtPointer call_data) { struct save_or_print_info *info = (struct save_or_print_info *)client_data; printOrSaveActionT act = info->act; Widget file_text; /* static so that we can pass its address */ static struct filesel_callback cb[2] = { { NULL, NULL, "xdvik: Save to file", "Save to file:", "OK", "Cancel", NULL, NULL, False, False, NULL, NULL }, { NULL, NULL, "xdvik: Print to file", "Print to file:", "OK", "Cancel", NULL, "*.ps", False, False, NULL, NULL } }; UNUSED(call_data); /* switch on `to file' radio button */ if (act == FILE_PRINT) text_print_vs_save_callback(w, (XtPointer)info, NULL, NULL); if (!get_widget_by_name(&file_text, info->shell, Xdvi_TO_FILE_TEXT, True)) return; if (act == FILE_SAVE) { if (resource.default_saving_format == FMT_PS) cb[0].filemask = "*.ps"; else if (resource.default_saving_format == FMT_PS2PDF) cb[0].filemask = "*.pdf"; else if (resource.default_saving_format == FMT_DVI) cb[0].filemask = "*.dvi"; else cb[0].filemask = "*.txt"; cb[0].func_ptr = set_filename_callback; cb[0].data = file_text; cb[0].browse_fname = xt_strdup(globals.cwd); /* fprintf(stderr, "==== text widget save: %p; shell: %p\n", (void *)file_text, (void *)info->shell); */ if (cb[0].shell == NULL) cb[0].shell = XsraSelFile(info->shell, &cb[0]); XsraSelFilePopup(&cb[0]); /* fprintf(stderr, "done saving: return widget = %p\n", ret_widget); */ } else { cb[1].func_ptr = set_filename_callback; cb[1].data = file_text; cb[1].init_path = globals.cwd; /* fprintf(stderr, "==== text widget print: %p; shell: %p\n", (void *)file_text, (void *)info->shell); */ /* if (!get_widget_by_name(&parent, globals.widgets.top_level, Xdvi_PRINT_SHELL_NAME, True)) */ /* parent = globals.widgets.top_level; */ if (cb[1].shell == NULL) cb[1].shell = XsraSelFile(info->shell, &cb[1]); XsraSelFilePopup(&cb[1]); } } /* create a dialog for printing OR saving */ #ifdef MOTIF static void motif_create_dialog(struct save_or_print_info *info) { printOrSaveActionT act = info->act; Atom WM_DELETE_WINDOW; char *ptr; char ofstring[1024]; Widget form, pane, box; Widget print_or_save_frame, destination_label, destination_form; Widget dvips_options_label; Widget pages_frame, pages_label, pages_form; Widget print_to_file_text, to_file_radio_or_label; Widget dvips_options_text; Widget print_to_file_button; Widget range_marked_radio, range_from_to_radio, to_printer_radio = NULL, print_to_printer_text = NULL, format_selection_option = NULL, print_or_save_range_all_radio, page_from_text, to_label, page_to_text, of_label, ok_button, cancel_button; Widget from_label; XmString str; XmString format_selection_texts[FORMAT_SEL_CNT]; XtTranslations xlats; XtAddActions(print_actions, XtNumber(print_actions)); ptr = get_string_va("#override \nosfCancel:WM_cancel(%p)", info); xlats = XtParseTranslationTable(ptr); free(ptr); if (globals.pageno_correct == 1) sprintf(ofstring, "of %d physical pages", total_pages); else sprintf(ofstring, "of %d to %d pages", globals.pageno_correct, total_pages + globals.pageno_correct - 1); info->shell = XtVaCreatePopupShell(act == FILE_SAVE ? "save_popup" : "print_popup", xmDialogShellWidgetClass, globals.widgets.top_level, XmNtitle, act == FILE_SAVE ? "xdvik: Save File" : "xdvik: Print File", XmNallowShellResize, True, XmNdeleteResponse, XmDO_NOTHING, /* we'll take care of that ourselves */ XmNmappedWhenManaged, False, /* so that we can center it first */ NULL); /* make the window manager destroy action just pop down the dialog */ WM_DELETE_WINDOW = XmInternAtom(XtDisplay(info->shell), "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(info->shell, WM_DELETE_WINDOW, cb_popdown, (XtPointer)info); pane = XtVaCreateWidget(act == FILE_SAVE ? "save_paned" : "print_paned", xmPanedWindowWidgetClass, info->shell, /* make sashes invisible */ XmNsashWidth, 1, XmNsashHeight, 1, /* turn separator off, since it gives visual noise with the frames */ XmNseparatorOn, False, NULL); form = XtVaCreateWidget("form", xmFormWidgetClass, pane, XmNhorizontalSpacing, DDIST_MAJOR, XmNverticalSpacing, DDIST_MAJOR, XmNautoUnmanage, False, XTranslations, xlats, NULL); if (act == FILE_PRINT) { /* First frame: print to printer or file */ print_or_save_frame = XtVaCreateWidget("print_to_frame", xmFrameWidgetClass, form, XmNmarginWidth, DDIST, XmNmarginHeight, DDIST, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XTranslations, xlats, NULL); str = XmStringCreateLocalized("Print to:"); destination_label = XtVaCreateManagedWidget("title", xmLabelGadgetClass, print_or_save_frame, XmNchildType, XmFRAME_TITLE_CHILD, XmNlabelString, str, NULL); XmStringFree(str); destination_form = XtVaCreateWidget("destination_form", xmFormWidgetClass, print_or_save_frame, XmNhorizontalSpacing, DDIST, XmNverticalSpacing, DDIST, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XTranslations, xlats, NULL); str = XmStringCreateLocalized("Printer:"); to_printer_radio = XtVaCreateManagedWidget(Xdvi_TO_PRINTER_NAME, xmToggleButtonGadgetClass, destination_form, XmNlabelString, str, XmNindicatorType, XmONE_OF_MANY, XmNset, resource.default_printing_target == TO_PRINTER, XmNtopAttachment, XmATTACH_FORM, XmNtopOffset, 0, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 0, NULL); XmStringFree(str); XtAddCallback(to_printer_radio, XmNvalueChangedCallback, cb_print_vs_save, (XtPointer)info); XtOverrideTranslations(to_printer_radio, xlats); print_to_printer_text = XtVaCreateManagedWidget(Xdvi_TO_PRINTER_TEXT, xmTextFieldWidgetClass, destination_form, XmNtopAttachment, XmATTACH_FORM, XmNtopOffset, 0, XmNleftAttachment, XmATTACH_WIDGET, XmNrightAttachment, XmATTACH_FORM, XmNleftWidget, to_printer_radio, /* XmNsensitive, resource.default_printing_target == TO_PRINTER, */ XTranslations, xlats, NULL); XtAddCallback(print_to_printer_text, XmNactivateCallback, cb_print_or_save, (XtPointer)info); XtAddCallback(print_to_printer_text, XmNfocusCallback, cb_text_print_vs_save, (XtPointer)info); adjust_heights(to_printer_radio, print_to_printer_text, NULL); str = XmStringCreateLocalized("PS File:"); to_file_radio_or_label = XtVaCreateManagedWidget(Xdvi_TO_FILE_NAME, xmToggleButtonGadgetClass, destination_form, XmNlabelString, str, XmNindicatorType, XmONE_OF_MANY, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, print_to_printer_text, XmNleftAttachment, XmATTACH_FORM, XmNset, resource.default_printing_target == TO_FILE, XmNleftOffset, 0, NULL); XmStringFree(str); XtAddCallback(to_file_radio_or_label, XmNvalueChangedCallback, cb_print_vs_save, (XtPointer)info); str = XmStringCreateLocalized("Browse ..."); print_to_file_button = XtVaCreateManagedWidget(Xdvi_BROWSE_BUTTON, xmPushButtonWidgetClass, destination_form, XmNlabelString, str, /* XmNsensitive, resource.default_printing_target == TO_FILE, */ XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, print_to_printer_text, XmNrightAttachment, XmATTACH_FORM, NULL); XmStringFree(str); XtOverrideTranslations(to_file_radio_or_label, xlats); XtOverrideTranslations(print_to_file_button, xlats); print_to_file_text = XtVaCreateManagedWidget(Xdvi_TO_FILE_TEXT, xmTextFieldWidgetClass, destination_form, /* XmNsensitive, resource.default_printing_target == TO_FILE, */ XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, print_to_printer_text, XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, print_to_file_button, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, to_file_radio_or_label, XTranslations, xlats, NULL); adjust_heights(to_file_radio_or_label, print_to_file_button, print_to_file_text, NULL); XtAddCallback(print_to_file_text, XmNactivateCallback, cb_print_or_save, (XtPointer)info); XtAddCallback(print_to_file_text, XmNfocusCallback, cb_text_print_vs_save, (XtPointer)info); XtAddCallback(print_to_file_button, XmNactivateCallback, cb_browse, (XtPointer)info); XtManageChild(destination_form); XtManageChild(print_or_save_frame); /* initial value for printer name */ XtVaSetValues(print_to_printer_text, XmNvalue, info->printer_options, XmNcursorPosition, strlen(info->printer_options), NULL); } else { /* saving, not printing */ print_or_save_frame = XtVaCreateWidget("save_as_frame", xmFrameWidgetClass, form, XmNmarginWidth, DDIST, XmNmarginHeight, DDIST, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); str = XmStringCreateLocalized("Save as:"); destination_label = XtVaCreateManagedWidget("title", xmLabelGadgetClass, print_or_save_frame, XmNchildType, XmFRAME_TITLE_CHILD, XmNlabelString, str, NULL); XmStringFree(str); destination_form = XtVaCreateWidget("destination_form", xmFormWidgetClass, print_or_save_frame, XmNhorizontalSpacing, DDIST, XmNverticalSpacing, DDIST, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XTranslations, xlats, NULL); /* fprintf(stderr, "CHILD: 0x%x\n", (long)destination_form); */ str = XmStringCreateLocalized("Format:"); format_selection_texts[0] = XmStringCreateLocalized((char *)output_format_mapping[0].fmt_string); format_selection_texts[1] = XmStringCreateLocalized((char *)output_format_mapping[1].fmt_string); format_selection_texts[2] = XmStringCreateLocalized((char *)output_format_mapping[2].fmt_string); format_selection_texts[3] = XmStringCreateLocalized((char *)output_format_mapping[3].fmt_string); format_selection_texts[4] = XmStringCreateLocalized((char *)output_format_mapping[4].fmt_string); format_selection_option = XmVaCreateSimpleOptionMenu(destination_form, "format_selection_option", str, 'F', resource.default_saving_format, /*initial menu selection*/ cb_select_format, /* callback */ XmVaPUSHBUTTON, format_selection_texts[0], 'P', NULL, NULL, XmVaPUSHBUTTON, format_selection_texts[1], 'F', NULL, NULL, XmVaPUSHBUTTON, format_selection_texts[2], 'D', NULL, NULL, XmVaPUSHBUTTON, format_selection_texts[3], 'T', NULL, NULL, XmVaPUSHBUTTON, format_selection_texts[4], 'U', NULL, NULL, XmNuserData, (XtPointer)info, NULL); XmStringFree(str); XmStringFree(format_selection_texts[0]); XmStringFree(format_selection_texts[1]); XmStringFree(format_selection_texts[2]); XmStringFree(format_selection_texts[3]); XmStringFree(format_selection_texts[4]); str = XmStringCreateLocalized("File name:"); to_file_radio_or_label = XtVaCreateManagedWidget(Xdvi_TO_FILE_NAME, xmLabelGadgetClass, destination_form, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, format_selection_option, XmNleftAttachment, XmATTACH_FORM, /* XmNchildType, XmFRAME_TITLE_CHILD, */ XmNlabelString, str, NULL); XmStringFree(str); str = XmStringCreateLocalized("Browse ..."); print_to_file_button = XtVaCreateManagedWidget(Xdvi_BROWSE_BUTTON, xmPushButtonWidgetClass, destination_form, XmNlabelString, str, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, format_selection_option, XmNrightAttachment, XmATTACH_FORM, XTranslations, xlats, NULL); print_to_file_text = XtVaCreateManagedWidget(Xdvi_TO_FILE_TEXT, xmTextFieldWidgetClass, destination_form, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, format_selection_option, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, to_file_radio_or_label, XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, print_to_file_button, XTranslations, xlats, NULL); adjust_heights(to_file_radio_or_label, print_to_file_button, print_to_file_text, NULL); XtAddCallback(print_to_file_button, XmNactivateCallback, cb_browse, (XtPointer)info); } /* initial value for filename */ XtVaSetValues(print_to_file_text, XmNvalue, info->finfo->out_file, XmNcursorPosition, strlen(info->finfo->out_file), NULL); { /* align left edges of widgets */ Dimension w1, w2; XtVaGetValues(to_file_radio_or_label, XmNwidth, &w2, NULL); if (act == FILE_PRINT) XtVaGetValues(to_printer_radio, XmNwidth, &w1, NULL); else { Widget w; if (get_widget_by_name(&w, format_selection_option, "OptionLabel", True)) { XtVaGetValues(w, XmNwidth, &w1, NULL); } else { w1 = w2; } } if (w1 > w2) { Dimension offset = DDIST; offset += w1 - w2; XtVaSetValues(print_to_file_text, XmNleftOffset, offset, NULL); } else if (w2 > w1) { Dimension offset = DDIST; offset += w2 - w1; if (act == FILE_PRINT) XtVaSetValues(print_to_printer_text, XmNleftOffset, offset, NULL); else { Widget w; if (get_widget_by_name(&w, format_selection_option, "OptionLabel", True)) { /* FIXME: Setting width would be cleaner, but it doesn't work ...? Dimension curr_w; XtVaGetValues(w, XmNwidth, &curr_w, NULL); XtVaSetValues(w, XmNwidth, curr_w + offset, NULL); */ /* fprintf(stderr, "Setting width from %d to: %d\n", curr_w, curr_w + offset); */ XtVaSetValues(w, XmNmarginRight, offset, XmNalignment, XmALIGNMENT_BEGINNING, NULL); } } } } if (act == FILE_SAVE) { XtManageChild(format_selection_option); XtManageChild(destination_form); XtManageChild(print_or_save_frame); } /* additional dvips options */ str = XmStringCreateLocalized("Dvips Options:"); dvips_options_label = XtVaCreateManagedWidget(Xdvi_DVIPS_OPTIONS_NAME, xmLabelGadgetClass, form, XmNlabelString, str, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, print_or_save_frame, XmNleftAttachment, XmATTACH_FORM, NULL); XmStringFree(str); dvips_options_text = XtVaCreateManagedWidget(Xdvi_DVIPS_OPTIONS_TEXT, xmTextFieldWidgetClass, form, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, print_or_save_frame, XmNleftAttachment, XmATTACH_WIDGET, XmNrightAttachment, XmATTACH_FORM, XmNleftWidget, dvips_options_label, XmNcolumns, 20, XTranslations, xlats, NULL); XtAddCallback(dvips_options_text, XmNactivateCallback, cb_print_or_save, (XtPointer)info); adjust_heights(dvips_options_label, dvips_options_text, NULL); /* initial value for dvips options */ XtVaSetValues(dvips_options_text, XmNvalue, info->dvips_options, XmNcursorPosition, strlen(info->dvips_options), NULL); /* page selection */ pages_frame = XtVaCreateWidget(act == FILE_PRINT ? "print_page_frame" : "save_page_frame", xmFrameWidgetClass, form, XmNmarginWidth, DDIST, XmNmarginHeight, DDIST, XmNresizable, True, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, dvips_options_text, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XTranslations, xlats, NULL); str = XmStringCreateLocalized("Pages:"); pages_label = XtVaCreateManagedWidget("title", xmLabelGadgetClass, pages_frame, XmNchildType, XmFRAME_TITLE_CHILD, XmNlabelString, str, NULL); XmStringFree(str); pages_form = XtVaCreateWidget("pages_form", xmFormWidgetClass, pages_frame, XmNhorizontalSpacing, DDIST, XmNverticalSpacing, DDIST, XmNresizable, True, XTranslations, xlats, NULL); str = XmStringCreateLocalized("All"); print_or_save_range_all_radio = XtVaCreateManagedWidget(Xdvi_PAGES_ALL_RADIO_NAME, xmToggleButtonGadgetClass, pages_form, XmNlabelString, str, XmNindicatorType, XmONE_OF_MANY, XmNset, True, XmNtopAttachment, XmATTACH_FORM, XmNtopOffset, 0, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 0, XTranslations, xlats, NULL); XmStringFree(str); XtAddCallback(print_or_save_range_all_radio, XmNvalueChangedCallback, cb_range, (XtPointer)info); str = XmStringCreateLocalized("Marked"); range_marked_radio = XtVaCreateManagedWidget(Xdvi_PAGES_MARKED_RADIO_NAME, xmToggleButtonGadgetClass, pages_form, XmNlabelString, str, XmNindicatorType, XmONE_OF_MANY, XmNtopAttachment, XmATTACH_WIDGET, XmNsensitive, pageinfo_have_marked_pages(), XmNtopWidget, print_or_save_range_all_radio, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 0, XTranslations, xlats, NULL); XmStringFree(str); XtAddCallback(range_marked_radio, XmNvalueChangedCallback, cb_range, (XtPointer)info); str = XmStringCreateLocalized("Range:"); range_from_to_radio = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_RADIO_NAME, xmToggleButtonGadgetClass, pages_form, XmNlabelString, str, XmNindicatorType, XmONE_OF_MANY, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, range_marked_radio, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 0, XTranslations, xlats, NULL); XmStringFree(str); XtAddCallback(range_from_to_radio, XmNvalueChangedCallback, cb_range, (XtPointer)info); str = XmStringCreateLocalized("From"); from_label = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_FROM_LABEL_NAME, xmLabelGadgetClass, pages_form, XmNlabelString, str, /* XmNsensitive, info->page_selection == PAGE_RANGE, */ XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, range_marked_radio, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, range_from_to_radio, NULL); XmStringFree(str); page_from_text = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_FROM_TEXT_NAME, xmTextFieldWidgetClass, pages_form, XmNcolumns, 5, /* XmNsensitive, info->page_selection == PAGE_RANGE, */ XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, range_marked_radio, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, from_label, XTranslations, xlats, NULL); XtAddCallback(page_from_text, XmNactivateCallback, cb_print_or_save, (XtPointer)info); XtAddCallback(page_from_text, XmNfocusCallback, cb_text_page_range, (XtPointer)info); str = XmStringCreateLocalized("to"); to_label = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_TO_LABEL_NAME, xmLabelGadgetClass, pages_form, XmNlabelString, str, /* XmNsensitive, info->page_selection == PAGE_RANGE, */ XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, range_marked_radio, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, page_from_text, NULL); XmStringFree(str); page_to_text = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_TO_TEXT_NAME, xmTextFieldWidgetClass, pages_form, XmNcolumns, 5, /* XmNsensitive, info->page_selection == PAGE_RANGE, */ XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, range_marked_radio, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, to_label, XTranslations, xlats, NULL); XtAddCallback(page_to_text, XmNactivateCallback, cb_print_or_save, (XtPointer)info); XtAddCallback(page_to_text, XmNfocusCallback, cb_text_page_range, (XtPointer)info); str = XmStringCreateLocalized(ofstring); of_label = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_OF_LABEL_NAME, xmLabelGadgetClass, pages_form, XmNlabelString, str, /* XmNsensitive, info->page_selection == PAGE_RANGE, */ XmNresizable, True, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, range_marked_radio, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, page_to_text, NULL); XmStringFree(str); adjust_heights(range_from_to_radio, from_label, page_from_text, to_label, page_to_text, of_label, NULL); XtManageChild(pages_form); XtManageChild(pages_frame); /* box for the OK/Cancel button */ box = XtVaCreateManagedWidget("box", xmFormWidgetClass, pane, XmNskipAdjust, True, /* don't resize this area */ XTranslations, xlats, NULL); str = XmStringCreateLocalized(act == FILE_PRINT ? "Print" : "Save"); ok_button = XtVaCreateManagedWidget(act == FILE_PRINT ? "print_button" : "save_button", xmPushButtonWidgetClass, box, XmNlabelString, str, XmNshowAsDefault, True, XmNdefaultButtonShadowThickness, 1, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, /* to mimick appearance of native dialog buttons: */ XmNmarginWidth, 6, XmNmarginHeight, 4, XmNtopOffset, 10, XmNbottomOffset, 10, XmNleftOffset, 10, NULL); XmStringFree(str); XtAddCallback(ok_button, XmNactivateCallback, cb_print_or_save, (XtPointer)info); XtOverrideTranslations(ok_button, XtParseTranslationTable("Return:ArmAndActivate()")); str = XmStringCreateLocalized("Cancel"); cancel_button = XtVaCreateManagedWidget("cancel", xmPushButtonWidgetClass, box, XmNlabelString, str, XmNdefaultButtonShadowThickness, 1, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, /* to mimick appearance of native dialog buttons: */ XmNmarginWidth, 6, XmNmarginHeight, 4, XmNtopOffset, 10, XmNbottomOffset, 10, XmNrightOffset, 10, NULL); XmStringFree(str); XtOverrideTranslations(print_or_save_range_all_radio, xlats); XtOverrideTranslations(range_marked_radio, xlats); XtOverrideTranslations(range_from_to_radio, xlats); XtOverrideTranslations(ok_button, xlats); XtOverrideTranslations(cancel_button, xlats); XtAddCallback(cancel_button, XmNactivateCallback, cb_popdown, (XtPointer)info); { /* make the buttons the same size: */ Dimension w1, w2; XtVaGetValues(ok_button, XtNwidth, &w1, NULL); XtVaGetValues(cancel_button, XtNwidth, &w2, NULL); if (w1 < w2) XtVaSetValues(ok_button, XtNwidth, w2, NULL); else if (w2 > w1) XtVaSetValues(cancel_button, XtNwidth, w1, NULL); } if (pageinfo_have_marked_pages()) { XmToggleButtonGadgetSetState(range_marked_radio, True, True); } else if (info->page_selection == PAGE_MARKED) { XmToggleButtonGadgetSetState(print_or_save_range_all_radio, True, True); } XtManageChild(form); XtManageChild(pane); center_window(info->shell, globals.widgets.top_level); XtMapWidget(info->shell); XmProcessTraversal(ok_button, XmTRAVERSE_CURRENT); /* if (act == FILE_PRINT) { */ /* if (resource.default_printing_target == TO_PRINTER) */ /* XmProcessTraversal(print_to_printer_text, XmTRAVERSE_CURRENT); */ /* else */ /* XmProcessTraversal(print_to_file_text, XmTRAVERSE_CURRENT); */ /* } */ } #else /* MOTIF */ static void xaw_create_dialog(struct save_or_print_info *info) { printOrSaveActionT act = info->act; Atom WM_DELETE_WINDOW; char *ptr; char ofstring[1024]; Widget form, paned, box; Widget dummy_label_form, dummy_pages_form; /* dummy forms to get indentation consistent */ Widget save_to_file_form; Widget dest_label; Widget print_to_printer_form, print_to_file_form, dvips_options_form; Widget dvips_options_label; Widget range_label; Widget page_range_form; Widget range_marked_form; Widget range_from_to_form; Widget print_to_file_text, to_file_radio_or_label; Widget dvips_options_text; Widget print_to_file_button; Widget format_selection_menu[FORMAT_SEL_CNT]; Widget format_selection_label = NULL, format_selection_button = NULL, format_selection_popup; Widget range_marked_radio, range_from_to_radio, to_printer_radio = NULL, print_to_printer_text = NULL, print_or_save_range_all_radio, page_from_text, to_label, page_to_text, of_label, ok_button, cancel_button; XtTranslations xlats, xlats2, wm_translations; XtAccelerators accels2; int ddist; static Dimension w_avg = 220; Dimension w_curr; /* handy abbrevs */ #define HORIZONTAL_RESIZING_NO XtNleft, XtChainLeft, XtNright, XtChainLeft #define HORIZONTAL_RESIZING_YES XtNleft, XtChainLeft, XtNright, XtChainRight #define VERTICAL_RESIZING_NO XtNtop, XtChainTop, XtNbottom, XtChainTop XtAddActions(print_actions, XtNumber(print_actions)); if (globals.pageno_correct == 1) sprintf(ofstring, "of %d physical pages", total_pages); else sprintf(ofstring, "of %d to %d pages", globals.pageno_correct, total_pages + globals.pageno_correct - 1); ptr = get_string_va("WM_PROTOCOLS: WM_cancel(%p)\n" "Escape:WM_cancel(%p)\n" "q:WM_cancel(%p)", info, info, info); wm_translations = XtParseTranslationTable(ptr); free(ptr); info->shell = XtVaCreatePopupShell(act == FILE_SAVE ? Xdvi_SAVE_SHELL_NAME : Xdvi_PRINT_SHELL_NAME, transientShellWidgetClass, globals.widgets.top_level, XtNtitle, act == FILE_SAVE ? "xdvik: Save File" : "xdvik: Print File", XtNmappedWhenManaged, False, XtNtransientFor, globals.widgets.top_level, XtNallowShellResize, True, XtNtranslations, wm_translations, NULL); WM_DELETE_WINDOW = XInternAtom(XtDisplay(info->shell), "WM_DELETE_WINDOW", False); paned = XtVaCreateManagedWidget("paned", panedWidgetClass, info->shell, NULL); form = XtVaCreateManagedWidget("save_or_print_form", formWidgetClass, paned, XtNallowResize, True, NULL); XtVaGetValues(form, XtNdefaultDistance, &ddist, NULL); /* fprintf(stderr, "form1: %ld\n", (long)form); */ xlats = XtParseTranslationTable(":highlight(Always)\n" ":unhighlight()\n" ",:set()notify()"); ptr = get_string_va("Return:xaw_print_or_save(%p)", info); xlats2 = XtParseTranslationTable(ptr); free(ptr); if (act == FILE_PRINT) { /* selection `to printer/to file' */ /* FIXME: set real sizes here */ /* Dimension w_curr; */ dummy_label_form = XtVaCreateManagedWidget("dummy_print_to_label_form", formWidgetClass, form, XtNresizable, True, XtNborderWidth, 0, HORIZONTAL_RESIZING_YES, NULL); dest_label = XtVaCreateManagedWidget("print_to", labelWidgetClass, dummy_label_form, XtNlabel, "Print to: ", XtNborderWidth, 0, HORIZONTAL_RESIZING_NO, NULL); print_to_printer_form = XtVaCreateManagedWidget("print_to_printer_form", formWidgetClass, form, XtNresizable, True, XtNborderWidth, 0, XtNvertDistance, 0, XtNfromVert, dummy_label_form, HORIZONTAL_RESIZING_YES, XtNallowResize, True, NULL); accels2 = XtParseAcceleratorTable(",:set()notify()"); to_printer_radio = XtVaCreateManagedWidget(Xdvi_TO_PRINTER_NAME, #ifdef XAW radioWidgetClass, #else toggleWidgetClass, #endif print_to_printer_form, XtNlabel, "Printer: ", XtNborderWidth, 0, XtNhighlightThickness, 1, XtNradioData, TO_PRINTER, XtNstate, resource.default_printing_target == TO_PRINTER, XtNtranslations, xlats, XtNaccelerators, accels2, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, NULL); XtAddCallback(to_printer_radio, XtNcallback, cb_print_vs_save, (XtPointer)info); XtInstallAccelerators(print_to_printer_form, to_printer_radio); print_to_printer_text = XtVaCreateManagedWidget(Xdvi_TO_PRINTER_TEXT, asciiTextWidgetClass, print_to_printer_form, XtNwidth, w_avg, XtNdataCompression, False, XtNeditType, XawtextEdit, /* XtNresize, XawtextResizeWidth, */ XtNfromHoriz, to_printer_radio, HORIZONTAL_RESIZING_YES, VERTICAL_RESIZING_NO, /* XtNscrollHorizontal, XawtextScrollAlways, */ NULL); XtOverrideTranslations(print_to_printer_text, xlats2); XtAddEventHandler(print_to_printer_text, KeyPressMask | ButtonPressMask, False, text_print_vs_save_callback, (XtPointer)info); adjust_vertically(to_printer_radio, print_to_printer_text, ddist); print_to_file_form = XtVaCreateManagedWidget("print_to_file_form", formWidgetClass, form, XtNborderWidth, 0, XtNvertDistance, -ddist, XtNfromVert, print_to_printer_form, HORIZONTAL_RESIZING_YES, NULL); to_file_radio_or_label = XtVaCreateManagedWidget(Xdvi_TO_FILE_NAME, #ifdef XAW radioWidgetClass, #else toggleWidgetClass, #endif print_to_file_form, XtNhighlightThickness, 1, XtNborderWidth, 0, XtNlabel, "PS File: ", XtNstate, resource.default_printing_target == TO_FILE, XtNradioGroup, to_printer_radio, XtNradioData, TO_FILE, XtNtranslations, xlats, XtNaccelerators, accels2, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, NULL); XtAddCallback(to_file_radio_or_label, XtNcallback, cb_print_vs_save, (XtPointer)info); XtInstallAccelerators(print_to_file_form, to_file_radio_or_label); print_to_file_text = XtVaCreateManagedWidget(Xdvi_TO_FILE_TEXT, asciiTextWidgetClass, print_to_file_form, XtNwidth, w_avg, XtNdataCompression, False, XtNeditType, XawtextEdit, XtNfromHoriz, to_file_radio_or_label, HORIZONTAL_RESIZING_YES, VERTICAL_RESIZING_NO, NULL); XtOverrideTranslations(print_to_file_text, xlats2); XtAddEventHandler(print_to_file_text, KeyPressMask | ButtonPressMask, False, text_print_vs_save_callback, (XtPointer)info); /* initial value for printer name */ XtVaSetValues(print_to_printer_text, XtNstring, info->printer_options, NULL); XawTextSetInsertionPoint(print_to_printer_text, strlen(info->printer_options)); } else { /* not printing, but saving */ int i; Dimension max_entry_width = 0; dummy_label_form = XtVaCreateManagedWidget("dummy_save_as_form", formWidgetClass, form, XtNresizable, True, XtNborderWidth, 0, HORIZONTAL_RESIZING_YES, NULL); dest_label = XtVaCreateManagedWidget("save_as", labelWidgetClass, dummy_label_form, XtNlabel, "Save as: ", XtNborderWidth, 0, HORIZONTAL_RESIZING_NO, NULL); save_to_file_form = XtVaCreateManagedWidget("save_to_file_form", formWidgetClass, form, XtNborderWidth, 0, XtNfromVert, dummy_label_form, HORIZONTAL_RESIZING_YES, VERTICAL_RESIZING_NO, NULL); /* fprintf(stderr, "formr1: %ld\n", (long)save_to_file_form); */ #if 0 menu_double_arrow_bitmap = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level), RootWindowOfScreen(XtScreen(globals.widgets.top_level)), (char *)menu_double_arrow_bits, MENU_DOUBLE_ARROW_W, MENU_DOUBLE_ARROW_H); #endif format_selection_label = XtVaCreateManagedWidget("format_selection_label", labelWidgetClass, save_to_file_form, XtNlabel, "Format: ", XtNborderWidth, 0, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, NULL); format_selection_button = XtVaCreateManagedWidget(Xdvi_FORMAT_SELECTION_BUTTON_NAME, menuButtonWidgetClass, save_to_file_form, XtNmenuName, "format_selection_popup", XtNlabel, output_format_mapping[resource.default_saving_format].fmt_string, XtNjustify, XtJustifyLeft, XtNborderWidth, resource.btn_border_width, XtNfromHoriz, format_selection_label, #if 0 XtNhighlightThickness, 0, #endif NULL); #if 0 /* Hack for arrow - menuButtonWidget cannot have a XtNrightBitmap!!! */ format_selection_b1 = XtVaCreateManagedWidget("format_selection_b1", commandWidgetClass, save_to_file_form, XtNborderWidth, resource.btn_border_width, XtNfromHoriz, format_selection_button, XtNhorizDistance, -1, XtNhighlightThickness, 0, XtNbitmap, menu_double_arrow_bitmap, NULL); adjust_heights(format_selection_button, format_selection_b1, NULL); #endif format_selection_popup = XtCreatePopupShell("format_selection_popup", simpleMenuWidgetClass, format_selection_button, /* globals.widgets.top_level, */ NULL, 0); #if 0 XtAddCallback(format_selection_b1, XtNcallback, xaw_popup_menu_cb, format_selection_popup); #endif for (i = 1; i < FORMAT_SEL_CNT; i++) { char name[1024]; Dimension curr_entry_width; SNPRINTF(name, sizeof name, "format_selection_pulldown_%d", i); format_selection_menu[i] = XtVaCreateManagedWidget(name, smeBSBObjectClass, format_selection_popup, XtNjustify, XtJustifyLeft, XtNlabel, i == resource.default_saving_format ? output_format_mapping[0].fmt_string : output_format_mapping[i].fmt_string, NULL); XtVaGetValues(format_selection_menu[i], XtNwidth, &curr_entry_width, NULL); if (curr_entry_width > max_entry_width) max_entry_width = curr_entry_width; XtAddCallback(format_selection_menu[i], XtNcallback, cb_select_format, (XtPointer)info); } XtVaSetValues(format_selection_button, XtNwidth, max_entry_width, NULL); print_to_file_form = XtVaCreateManagedWidget("to_file_form", formWidgetClass, form, XtNborderWidth, 0, XtNfromVert, save_to_file_form, XtNvertDistance, -ddist, HORIZONTAL_RESIZING_YES, VERTICAL_RESIZING_NO, NULL); to_file_radio_or_label = XtVaCreateManagedWidget(Xdvi_TO_FILE_NAME, labelWidgetClass, print_to_file_form, XtNlabel, "File name: ", XtNborderWidth, 0, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, NULL); print_to_file_text = XtVaCreateManagedWidget(Xdvi_TO_FILE_TEXT, asciiTextWidgetClass, print_to_file_form, XtNwidth, w_avg, XtNdataCompression, False, XtNeditType, XawtextEdit, XtNfromHoriz, to_file_radio_or_label, HORIZONTAL_RESIZING_YES, VERTICAL_RESIZING_NO, NULL); XtOverrideTranslations(print_to_file_text, xlats2); { /* align left edges of format selection pulldown and filename field */ Dimension w1, w2, w_max; XtVaGetValues(format_selection_label, XtNwidth, &w1, NULL); XtVaGetValues(to_file_radio_or_label, XtNwidth, &w2, NULL); w_max = MAX(w1, w2); XtVaSetValues(format_selection_button, XtNhorizDistance, ddist + (w_max - w1), NULL); XtVaSetValues(print_to_file_text, XtNhorizDistance, ddist + (w_max - w2), NULL); } } /* initial value for filename */ XtVaSetValues(print_to_file_text, XtNstring, info->finfo->out_file, NULL); XawTextSetInsertionPoint(print_to_file_text, strlen(info->finfo->out_file)); #define DIST_1 8 /* FIXME */ print_to_file_button = XtVaCreateManagedWidget(Xdvi_BROWSE_BUTTON, commandWidgetClass, print_to_file_form, XtNlabel, "Browse ...", XtNfromHoriz, print_to_file_text, XtNhorizDistance, DIST_1, /* XtNsensitive, act == FILE_PRINT ? resource.default_printing_target == TO_FILE : True, */ /* attach to right of form, no resizing: */ XtNleft, XtChainRight, XtNright, XtChainRight, VERTICAL_RESIZING_NO, NULL); XtVaGetValues(print_to_file_button, XtNwidth, &w_curr, NULL); XtVaSetValues(print_to_file_text, XtNwidth, w_avg - w_curr - DIST_1 - 2, NULL); #undef DIST_1 adjust_vertically(to_file_radio_or_label, print_to_file_text, ddist + 5); adjust_vertically(print_to_file_text, to_file_radio_or_label, ddist + 5); adjust_vertically(print_to_file_button, to_file_radio_or_label, ddist + 5); XtAddCallback(print_to_file_button, XtNcallback, cb_browse, (XtPointer)info); /* other dvips options */ dvips_options_form = XtVaCreateManagedWidget("dvips_options_form", formWidgetClass, form, XtNborderWidth, 0, XtNfromVert, print_to_file_form, XtNvertDistance, 3 * ddist, HORIZONTAL_RESIZING_YES, NULL); dvips_options_label = XtVaCreateManagedWidget(Xdvi_DVIPS_OPTIONS_NAME, labelWidgetClass, dvips_options_form, XtNlabel, "Dvips Options:", XtNborderWidth, 0, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, NULL); dvips_options_text = XtVaCreateManagedWidget(Xdvi_DVIPS_OPTIONS_TEXT, asciiTextWidgetClass, dvips_options_form, XtNwidth, w_avg, XtNdataCompression, False, XtNeditType, XawtextEdit, XtNfromHoriz, dvips_options_label, HORIZONTAL_RESIZING_YES, VERTICAL_RESIZING_NO, NULL); XtOverrideTranslations(dvips_options_text, xlats2); { /* align left edges of input fields */ Dimension w1, w2, w3, w_max; if (act == FILE_PRINT) XtVaGetValues(to_printer_radio, XtNwidth, &w1, NULL); else XtVaGetValues(format_selection_label, XtNwidth, &w1, NULL); XtVaGetValues(to_file_radio_or_label, XtNwidth, &w2, NULL); XtVaGetValues(dvips_options_label, XtNwidth, &w3, NULL); w_max = MAX(MAX(w1, w2), w3); if (act == FILE_PRINT) XtVaSetValues(print_to_printer_text, XtNhorizDistance, ddist + (w_max - w1), NULL); else XtVaSetValues(format_selection_button, XtNhorizDistance, ddist + (w_max - w1), NULL); XtVaSetValues(print_to_file_text, XtNhorizDistance, ddist + (w_max - w2), NULL); XtVaSetValues(dvips_options_text, XtNhorizDistance, ddist + (w_max - w3), NULL); } /* initial value for dvips options */ XtVaSetValues(dvips_options_text, XtNstring, info->dvips_options, NULL); XawTextSetInsertionPoint(dvips_options_text, strlen(info->dvips_options)); /* page selection */ dummy_pages_form = XtVaCreateManagedWidget("dummy_pages_form", formWidgetClass, form, XtNfromVert, dvips_options_form, XtNresizable, True, XtNborderWidth, 0, XtNvertDistance, 3 * ddist, HORIZONTAL_RESIZING_NO, NULL); range_label = XtVaCreateManagedWidget("range_lab", labelWidgetClass, dummy_pages_form, XtNlabel, "Pages:", XtNborderWidth, 0, HORIZONTAL_RESIZING_NO, NULL); page_range_form = XtVaCreateManagedWidget(Xdvi_PAGE_RANGE_FORM_NAME, formWidgetClass, form, XtNborderWidth, 0, XtNfromVert, dummy_pages_form, XtNvertDistance, 0, HORIZONTAL_RESIZING_NO, NULL); accels2 = XtParseAcceleratorTable(",:set()notify()"); print_or_save_range_all_radio = XtVaCreateManagedWidget(Xdvi_PAGES_ALL_RADIO_NAME, #ifdef XAW radioWidgetClass, #else toggleWidgetClass, #endif page_range_form, XtNlabel, "All ", XtNborderWidth, 0, XtNhighlightThickness, 1, XtNradioData, PAGE_ALL, /* enable this button by default */ XtNstate, True, XtNtranslations, xlats, XtNaccelerators, accels2, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, NULL); XtAddCallback(print_or_save_range_all_radio, XtNcallback, cb_range, (XtPointer)info); XtInstallAccelerators(page_range_form, print_or_save_range_all_radio); range_marked_form = XtVaCreateManagedWidget("range_marked_form", formWidgetClass, form, XtNborderWidth, 0, XtNfromVert, page_range_form, XtNvertDistance, 0, HORIZONTAL_RESIZING_NO, NULL); range_marked_radio = XtVaCreateManagedWidget(Xdvi_PAGES_MARKED_RADIO_NAME, #ifdef XAW radioWidgetClass, #else toggleWidgetClass, #endif range_marked_form, XtNlabel, "Marked ", XtNsensitive, pageinfo_have_marked_pages(), XtNborderWidth, 0, XtNhighlightThickness, 1, XtNradioGroup, print_or_save_range_all_radio, XtNradioData, PAGE_MARKED, XtNtranslations, xlats, XtNaccelerators, accels2, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, NULL); XtAddCallback(range_marked_radio, XtNcallback, cb_range, (XtPointer)info); XtInstallAccelerators(range_marked_form, range_marked_radio); range_from_to_form = XtVaCreateManagedWidget("range_from_to_form", formWidgetClass, form, XtNborderWidth, 0, XtNfromVert, range_marked_form, XtNvertDistance, 0, XtNresizable, True, /* HORIZONTAL_RESIZING_NO, */ NULL); range_from_to_radio = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_RADIO_NAME, #ifdef XAW radioWidgetClass, #else toggleWidgetClass, #endif range_from_to_form, XtNlabel, "From: ", XtNborderWidth, 0, XtNhighlightThickness, 1, XtNradioGroup, print_or_save_range_all_radio, XtNradioData, PAGE_RANGE, XtNtranslations, xlats, XtNaccelerators, accels2, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, NULL); XtAddCallback(range_from_to_radio, XtNcallback, cb_range, (XtPointer)info); XtInstallAccelerators(range_from_to_form, range_from_to_radio); page_from_text = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_FROM_TEXT_NAME, asciiTextWidgetClass, range_from_to_form, XtNdataCompression, False, XtNeditType, XawtextEdit, XtNwidth, 50, XtNfromHoriz, range_from_to_radio, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, NULL); XtOverrideTranslations(page_from_text, xlats2); XtAddEventHandler(page_from_text, KeyPressMask | ButtonPressMask, False, text_page_range_callback, (XtPointer)info); to_label = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_TO_LABEL_NAME, labelWidgetClass, range_from_to_form, XtNlabel, "to: ", XtNborderWidth, 0, XtNfromHoriz, page_from_text, /* XtNsensitive, info->page_selection == PAGE_RANGE, */ HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, NULL); page_to_text = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_TO_TEXT_NAME, asciiTextWidgetClass, range_from_to_form, XtNdataCompression, False, XtNeditType, XawtextEdit, XtNwidth, 50, XtNfromHoriz, to_label, HORIZONTAL_RESIZING_NO, VERTICAL_RESIZING_NO, NULL); XtOverrideTranslations(page_to_text, xlats2); XtAddEventHandler(page_to_text, KeyPressMask | ButtonPressMask, False, text_page_range_callback, (XtPointer)info); of_label = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_OF_LABEL_NAME, labelWidgetClass, range_from_to_form, XtNlabel, ofstring, XtNborderWidth, 0, /* XtNsensitive, info->page_selection == PAGE_RANGE, */ XtNresizable, True, XtNfromHoriz, page_to_text, /* HORIZONTAL_RESIZING_NO, */ XtNleft, XtChainLeft, VERTICAL_RESIZING_NO, NULL); adjust_vertically(range_from_to_radio, page_from_text, ddist); adjust_vertically(to_label, page_from_text, ddist); adjust_vertically(of_label, page_from_text, ddist); /* box for the OK/Cancel button */ box = XtVaCreateManagedWidget("box", formWidgetClass, paned, /* resizing by user isn't needed */ XtNshowGrip, False, XtNdefaultDistance, 6, /* some padding */ /* resizing the window shouldn't influence this box, * but only the pane widget */ XtNskipAdjust, True, XtNaccelerators, G_accels_cr, NULL); ok_button = XtVaCreateManagedWidget(act == FILE_PRINT ? "print_button" : "save_button", commandWidgetClass, box, XtNlabel, act == FILE_PRINT ? "Print" : "Save", XtNaccelerators, G_accels_cr, XtNtop, XtChainTop, XtNbottom, XtChainBottom, HORIZONTAL_RESIZING_NO, NULL); XtAddCallback(ok_button, XtNcallback, cb_print_or_save, (XtPointer)info); XtInstallAccelerators(form, ok_button); if (act == FILE_PRINT) XtInstallAccelerators(print_to_printer_text, ok_button); XtInstallAccelerators(print_to_file_text, ok_button); cancel_button = XtVaCreateManagedWidget("cancel", commandWidgetClass, box, XtNlabel, "Cancel", XtNfromHoriz, ok_button, XtNbottom, XtChainBottom, XtNjustify, XtJustifyRight, XtNleft, XtChainRight, XtNright, XtChainRight, NULL); XtAddCallback(cancel_button, XtNcallback, cb_popdown, (XtPointer)info); XtManageChild(info->shell); center_window(info->shell, globals.widgets.top_level); XtMapWidget(info->shell); XSetWMProtocols(XtDisplay(info->shell), XtWindow(info->shell), &WM_DELETE_WINDOW, 1); if (pageinfo_have_marked_pages()) { XawToggleSetCurrent(print_or_save_range_all_radio, cast_int_to_XtPointer(PAGE_MARKED)); } else if (info->page_selection == PAGE_MARKED) { XawToggleSetCurrent(print_or_save_range_all_radio, cast_int_to_XtPointer(PAGE_ALL)); } #undef HORIZONTAL_RESIZING_NO #undef HORIZONTAL_RESIZING_YES #undef VERTICAL_RESIZING_NO } #endif /* MOTIF */ static void get_initial_values(struct save_or_print_info *info) { const char *extension = NULL; char *tmp = NULL; info->finfo->tmp_dvi_file = NULL; info->finfo->tmp_ps_file = NULL; info->finfo->tmp_dvi_fp = NULL; /* info->finfo->out_fp = NULL; */ info->message_popup = NULL; info->dvips_options = info->printer_options = NULL; /* * dvips options */ info->dvips_options = xstrdup(resource.dvips_options_str ? resource.dvips_options_str : ""); /* add -t options if needed */ if (info->dvips_options == NULL || info->dvips_options[0] == '\0' || strstr(info->dvips_options, "-t ") == NULL) { Boolean landscape = False; char *paper = get_dvips_papersize(&landscape); if (paper != NULL) { if (info->dvips_options == NULL) info->dvips_options = xstrdup("-t "); else info->dvips_options = xstrcat(info->dvips_options, " -t "); info->dvips_options = xstrcat(info->dvips_options, paper); free(paper); if (landscape) { info->dvips_options = xstrcat(info->dvips_options, " -t landscape"); } } } /* * printer options */ if (resource.dvips_printer_str != NULL) info->printer_options = xstrdup(resource.dvips_printer_str); else { /* initialize with default. We add the $PRINTER environment variable * since dvips otherwise doesn't use it. */ char *printer = getenv("PRINTER"); info->printer_options = xstrdup("lpr"); if (printer != NULL) { info->printer_options = xstrcat(info->printer_options, " -P"); info->printer_options = xstrcat(info->printer_options, printer); } } info->print_target = resource.default_printing_target; info->fmt = resource.default_saving_format; if (pageinfo_have_marked_pages()) { info->page_selection = PAGE_MARKED; } else { info->page_selection = PAGE_ALL; } if (info->act == FILE_SAVE) extension = output_format_mapping[resource.default_saving_format].extension; else extension = ".ps"; tmp = get_new_file_name(globals.dvi_name, get_extension(globals.dvi_name), extension); info->finfo->out_file = xmalloc(strlen(globals.cwd) + strlen(tmp) + 2); /* 1 extra for dir separator */ sprintf(info->finfo->out_file, "%s/%s", globals.cwd, tmp); free(tmp); TRACE_FILES((stderr, "OUTFILE: |%s|\n", info->finfo->out_file)); } static int textfield_to_int(Widget w) { char *s, *p; int pageno; #ifndef MOTIF XtVaGetValues(w, XtNstring, &s, NULL); #else /* MOTIF */ s = XmTextFieldGetString(w); #endif p = s; if (*p == '-') ++p; if (!isdigit((int)*p)) { return 0; } do { ++p; } while (isdigit((int)*p)); if (*p != '\0') return 0; pageno = atoi(s) - globals.pageno_correct; #ifdef MOTIF XtFree(s); #endif return pageno; } /* Return a copy of the text value of Widget w in malloc'ed memory, or NULL if the text is empty. */ static char * widgets_get_textfield(Widget w) { char *ptr = NULL; XtVaGetValues(w, #if MOTIF XmNvalue, #else XtNstring, #endif &ptr, NULL); if (ptr == NULL || *ptr == '\0') return NULL; else return xstrdup(ptr); } static char * widgets_get_textfield_by_name(const struct save_or_print_info *info, const char *widget_name) { Widget w; if (get_widget_by_name(&w, info->shell, widget_name, True)) { return widgets_get_textfield(w); } return NULL; } static pageRadioT widgets_get_page_selection(struct save_or_print_info *info) { Widget radio_all; #ifdef MOTIF Widget radio_marked; #endif if (get_widget_by_name(&radio_all, info->shell, Xdvi_PAGES_ALL_RADIO_NAME, True) #ifdef MOTIF && get_widget_by_name(&radio_marked, info->shell, Xdvi_PAGES_MARKED_RADIO_NAME, True) #endif ) { #ifdef MOTIF if (XmToggleButtonGadgetGetState(radio_all)) return PAGE_ALL; else if (XmToggleButtonGadgetGetState(radio_marked)) return PAGE_MARKED; else return PAGE_RANGE; #else return (pageRadioT)XawToggleGetCurrent(radio_all); #endif } return NO_PAGE_VAL; /* dummy */ } static int widgets_get_from_page(struct save_or_print_info *info) { Widget w; if (get_widget_by_name(&w, info->shell, Xdvi_PAGES_RANGE_FROM_TEXT_NAME, True)) { return textfield_to_int(w); } return 0; } static int widgets_get_to_page(struct save_or_print_info *info) { Widget w; if (get_widget_by_name(&w, info->shell, Xdvi_PAGES_RANGE_TO_TEXT_NAME, True)) { return textfield_to_int(w); } return 0; } static void set_check_page_range(struct save_or_print_info *info, Boolean check) { Widget text_from, text_to; if (get_widget_by_name(&text_from, info->shell, Xdvi_PAGES_RANGE_FROM_TEXT_NAME, True) && get_widget_by_name(&text_to, info->shell, Xdvi_PAGES_RANGE_TO_TEXT_NAME, True)) { char page_string[LENGTH_OF_INT]; if (check) { /* check validity of current values */ int curr_from = textfield_to_int(text_from); int curr_to = textfield_to_int(text_to); if (curr_from < total_pages && curr_to < total_pages) /* values are OK */ return; } sprintf(page_string, "%d", current_page + globals.pageno_correct); #ifdef MOTIF XtVaSetValues(text_from, XmNvalue, page_string, XmNcursorPosition, strlen(page_string), NULL); XtVaSetValues(text_to, XmNvalue, page_string, XmNcursorPosition, strlen(page_string), NULL); #else XtVaSetValues(text_from, XtNstring, page_string, NULL); XtVaSetValues(text_to, XtNstring, page_string, NULL); XawTextSetInsertionPoint(text_from, strlen(page_string)); XawTextSetInsertionPoint(text_to, strlen(page_string)); #endif } } static void popdown_dialog_and_print_or_save(XtPointer myinfo) { struct save_or_print_info *info = (struct save_or_print_info *)myinfo; cb_popdown(NULL, info, NULL); if (globals.dvi_file.bak_fp == NULL) { /* shouldn't happen */ info->message_popup = popup_message(globals.widgets.top_level, MSG_ERR, NULL, "No active DVI file"); return; } ASSERT(info->finfo->in_fp != NULL, "DVI input FILE * must have been set!"); store_preference(NULL, "dvipsOptionsString", "%s", info->dvips_options ? info->dvips_options : ""); if (info->act == FILE_PRINT) { store_preference(NULL, "defaultPrintingTarget", "%d", info->print_target); store_preference(NULL, "dvipsPrinterString", "%s", info->printer_options ? info->printer_options : ""); internal_print(info); } else { store_preference(NULL, "defaultSavingFormat", "%d", info->fmt); internal_save(info); } } /* Clean up after user has aborted printing/saving */ static void do_cleanup(XtPointer arg) { struct save_or_print_info *info = (struct save_or_print_info *)arg; cancel_saving(info); if (info->finfo->tmp_dvi_file != NULL) { unlink(info->finfo->tmp_dvi_file); info->finfo->tmp_dvi_file = NULL; } if (info->finfo->tmp_ps_file != NULL) { unlink(info->finfo->tmp_ps_file); info->finfo->tmp_ps_file = NULL; } } /* * First round of sanity checks for page range etc. */ static void print_check_page_values(struct save_or_print_info *info) { struct select_pages_info *pinfo = info->pinfo; /* get current dvips and printer options */ free(info->dvips_options); free(info->printer_options); info->dvips_options = info->printer_options = NULL; info->dvips_options = widgets_get_textfield_by_name(info, Xdvi_DVIPS_OPTIONS_TEXT); if (info->act == FILE_PRINT) info->printer_options = widgets_get_textfield_by_name(info, Xdvi_TO_PRINTER_TEXT); info->page_selection = widgets_get_page_selection(info); /* fprintf(stderr, "page selection: %d\n", info->page_selection); */ if (info->page_selection == PAGE_ALL) { /* fprintf(stderr, "ALL!!!\n"); */ pinfo->callback = NULL; } else if (info->page_selection == PAGE_MARKED) { /* fprintf(stderr, "MARKED!!!\n"); */ pinfo->callback = check_marked; } else { /* PAGE_RANGE */ /* fprintf(stderr, "RANGE!!!\n"); */ pinfo->from = widgets_get_from_page(info); pinfo->to = widgets_get_to_page(info); pinfo->callback = check_pagerange; if (pinfo->from + 1 < 1) { info->message_popup = popup_message(info->shell, MSG_ERR, "Please specify a valid page range.", "Invalid page range: start (%d) < 1.", pinfo->from + 1); return; } else if (pinfo->from > pinfo->to) { info->message_popup = popup_message(info->shell, MSG_ERR, "Please specify a valid page range.", "Invalid page range: start (%d) > end (%d).", pinfo->from + 1, pinfo->to + 1); return; } else if (pinfo->to + 1 > total_pages) { info->message_popup = popup_message(info->shell, MSG_ERR, "Please specify a valid page range.", "Invalid page range: end (%d) > total_pages (%d).", pinfo->to + 1, total_pages); return; } } print_check_dvi_file(info); } /* Second round of sanity checks. */ static void print_check_dvi_file(struct save_or_print_info *info) { FILE *fin = NULL; /* Return if there are active popups; otherwise, the print process may get messed up */ if (raise_message_windows()) { XBell(DISP, 0); #if 0 popup_message(info->shell, MSG_WARN, NULL, "Please close other open message windows first!"); #endif return; } /* If we want to print/save the marked pages, or save to a DVI file, we need to create a temporary DVI file containing the selected or all pages. */ if (info->page_selection == PAGE_MARKED || info->fmt == FMT_DVI) { int tmp_fd; free(info->finfo->tmp_dvi_file); info->finfo->tmp_dvi_file = NULL; tmp_fd = xdvi_temp_fd(&(info->finfo->tmp_dvi_file)); /* this allocates info->finfo->tmp_dvi_file */ if (tmp_fd == -1) { info->message_popup = popup_message(info->shell, MSG_ERR, NULL, "Couldn't create temporary DVI file for printing: %s", strerror(errno)); return; } /* don't use XFOPEN here, since we don't want to treat an error in opening the file as fatal. */ /* `b' in mode won't hurt ... */ if ((info->finfo->tmp_dvi_fp = try_fdopen(tmp_fd, "wb+")) == NULL) { /* failure */ info->message_popup = popup_message(info->shell, MSG_ERR, "Xdvi needs to create a temporary file containing the " "currently marked pages, but creating that file failed. " "Try to fix the cause of the problem, or choose " "\"Print selected pages\" as a workaround.", "Could not open temp file for writing: %s.\n", strerror(errno)); return; } } /* We try to use the original DVI file unless it's corrupted, in which case we ask the user if they want to save the cached copy instead */ if ((fin = fopen(globals.dvi_name, "rb")) == NULL || !find_postamble(fin, &(info->pinfo->errflag))) { Boolean could_not_open = False; if (fin == NULL) could_not_open = True; if (fin) fclose(fin); /* if we can't use the temporary file as source for our copy, this is a fatal error */ if (!resource.use_temp_fp) { info->message_popup = popup_message(info->shell, MSG_ERR, NULL, "Could not copy DVI file %s: The file %s", globals.dvi_name, could_not_open ? "doesn't exist any more" : "seems to be corrupted"); return; } /* else, we'll try to use the cached copy of the DVI file */ if ((fin = fopen(get_tmp_dvi_name(), "rb")) == NULL) { info->message_popup = popup_message(info->shell, MSG_ERR, NULL, "Something's very wrong here - opening of both the " "original DVI file and the cached copy failed!"); return; } if (!find_postamble(fin, &(info->pinfo->errflag))) { info->message_popup = popup_message(info->shell, MSG_ERR, NULL, "Shouldn't happen: Cached copy of the DVI file seems corrupted!"); return; } info->finfo->in_fp = fin; /* tell user about it */ info->message_popup = choice_dialog(info->shell, MSG_QUESTION, NULL, #ifndef MOTIF NULL, /* TODO: binding for RET? */ #endif /* MOTIF */ NULL, NULL, /* no pre_callbacks */ info->act == FILE_PRINT ? "Print Copy" : "Save Copy", print_check_target_file, (XtPointer)info, "Cancel", do_cleanup, (XtPointer)info, "The DVI file %s %s. Do you want to %s a cached copy of the file?", globals.dvi_name, could_not_open ? "doesn't exist any more" : "seems to be corrupted", info->act == FILE_PRINT ? "print" : "save"); } else { /* original DVI file is OK, copy it */ info->finfo->in_fp = fin; print_check_target_file((XtPointer)info); } } static void print_check_target_file(XtPointer myinfo) { struct save_or_print_info *info = (struct save_or_print_info *)myinfo; char *filename = widgets_get_textfield_by_name(info, Xdvi_TO_FILE_TEXT); char *expanded_filename; /* Return if there are active popups; otherwise, the print process will be messed up. */ if (raise_message_windows()) { XBell(DISP, 0); return; } /* if we're just printing to printer, go ahead */ if (!(info->act == FILE_SAVE || (info->act == FILE_PRINT && info->print_target == TO_FILE))) { popdown_dialog_and_print_or_save(info); return; } /* expand and canonicalize filename */ if (filename == NULL) { info->message_popup = popup_message(info->shell, MSG_WARN, NULL, "No filename specified!"); return; } expanded_filename = expand_homedir(filename); /* this allocates expanded_filename */ if (expanded_filename == NULL) { info->message_popup = popup_message(info->shell, MSG_WARN, "Please specify either a filename or a full path, without using \"~\" or \"~user\".", "Couldn't expand filename \"%s\" to a full path.", filename); free(filename); return; } free(filename); free(info->finfo->out_file); info->finfo->out_file = expanded_filename; if (info->act == FILE_SAVE && info->fmt == FMT_DVI) { /* canonicalize filename */ char *tmp = expand_filename_append_dvi(info->finfo->out_file, USE_CWD_PATH, False); /* this mallocs tmp */ if (strcmp(tmp, globals.dvi_name) == 0) { info->message_popup = popup_message(info->shell, MSG_ERR, NULL, "Cannot overwrite the current DVI file (%s). " "Please choose a different file name.", info->finfo->out_file); free(tmp); free(info->finfo->out_file); info->finfo->out_file = NULL; return; } free(info->finfo->out_file); info->finfo->out_file = tmp; } if (info->act == FILE_SAVE || (info->act == FILE_PRINT && info->print_target == TO_FILE)) { /* check whether to clobber existing file */ struct stat statbuf; if (stat(info->finfo->out_file, &statbuf) == 0 && S_ISREG(statbuf.st_mode)) { info->message_popup = choice_dialog(info->shell, MSG_QUESTION, NULL, #ifndef MOTIF NULL, /* TODO: binding for RET */ #endif NULL, NULL, /* no pre_callbacks */ "Replace", popdown_dialog_and_print_or_save, (XtPointer)info, /* do nothing if user selects `cancel'; this will return to the printing dialog, since user hasn't changed their mind about printing, but would probably just like to choose another filename */ "Cancel", NULL, (XtPointer)NULL, "The file %s already exists.\nDo you want to replace it?", info->finfo->out_file); return; } else { popdown_dialog_and_print_or_save(info); } } else { popdown_dialog_and_print_or_save(info); } } static void notify_dialog(Widget w, pageRadioT *value_bak) { Widget radio_all, radio_marked; #ifdef MOTIF Widget radio_range; #endif Boolean have_marked = pageinfo_have_marked_pages(); pageRadioT value_curr; /* fprintf(stderr, "have_marked: %d\n", have_marked); */ if (get_widget_by_name(&radio_all, w, Xdvi_PAGES_ALL_RADIO_NAME, True) && get_widget_by_name(&radio_marked, w, Xdvi_PAGES_MARKED_RADIO_NAME, True) #ifdef MOTIF && get_widget_by_name(&radio_range, w, Xdvi_PAGES_RANGE_RADIO_NAME, True) #endif ) { /* get the current value */ #ifdef MOTIF if (XmToggleButtonGadgetGetState(radio_all)) value_curr = PAGE_ALL; else if (XmToggleButtonGadgetGetState(radio_marked)) value_curr = PAGE_MARKED; else value_curr = PAGE_RANGE; #else value_curr = (pageRadioT)XawToggleGetCurrent(radio_all); #endif /* fprintf(stderr, "current value: %d\n", value_curr); */ if (value_curr == PAGE_MARKED && have_marked) return; if (value_curr != PAGE_MARKED && !have_marked) { XtVaSetValues(radio_marked, #ifdef MOTIF XmNsensitive, #else XtNsensitive, #endif False, NULL); return; } /* otherwise, if we have marked pages now, we want to switch from the current value to `marked', saving the current value in *value_bak. */ /* XXX FIXME: There's a bug with OpenMotif 2.1 if the following order is used: - without marked pages, open dialog - mark a page; button `marked' is selected - select button `all' - select button `range' - unmark page; `marked' becomes insensitive - mark page, `marked' becomes sensitive and is selected, `range' is unselected - up to here, everything is as expected, but if you now select `range', it doesn't work, no button changes its state. As a workaround, if you select `marked' again and then `range', it works. Strangely, the callback when unsetting `range' is invoked correctly, so the button should be in the correct internal state ... I think this is an OpenMotif bug. */ if (have_marked) { *value_bak = value_curr; #ifdef MOTIF if (value_curr == PAGE_ALL) { XmToggleButtonGadgetSetState(radio_all, False, True); } else { XmToggleButtonGadgetSetState(radio_range, False, True); } XmToggleButtonGadgetSetState(radio_marked, True, True); XtVaSetValues(radio_marked, XmNsensitive, True, NULL); XmProcessTraversal(radio_marked, XmTRAVERSE_CURRENT); #else XawToggleSetCurrent(radio_all, cast_int_to_XtPointer(PAGE_MARKED)); XtVaSetValues(radio_marked, XtNsensitive, True, NULL); #endif } else { /* no marked pages now; switch back to the value from *value_bak. */ /* fprintf(stderr, "switching back to button %d\n", *value_bak); */ #ifdef MOTIF if (*value_bak == PAGE_ALL) { XmToggleButtonGadgetSetState(radio_all, True, True); XmProcessTraversal(radio_all, XmTRAVERSE_CURRENT); } else { XmToggleButtonGadgetSetState(radio_range, True, True); XmProcessTraversal(radio_range, XmTRAVERSE_CURRENT); } XmToggleButtonGadgetSetState(radio_marked, False, True); XtVaSetValues(radio_marked, XmNsensitive, False, NULL); #else XawToggleSetCurrent(radio_all, (XtPointer)*value_bak); XtVaSetValues(radio_marked, XtNsensitive, *value_bak == PAGE_MARKED, NULL); #endif } } } /* access from pagesel.c if user marks or unmarks a page in the page list */ void notify_print_dialog_have_marked(void) { Widget print_shell, save_shell; static pageRadioT save_value_bak = PAGE_ALL; static pageRadioT print_value_bak = PAGE_ALL; /* notify *both* windows, save and print, but only if they already exist */ if (get_widget_by_name(&print_shell, globals.widgets.top_level, Xdvi_PRINT_SHELL_NAME, False)) notify_dialog(print_shell, &save_value_bak); if (get_widget_by_name(&save_shell, globals.widgets.top_level, Xdvi_SAVE_SHELL_NAME, False)) notify_dialog(save_shell, &print_value_bak); } /* main entry point: pop up the dialog */ void save_or_print_callback(struct save_or_print_info *info) { if (info->shell != NULL && window_is_mapped(XtWindow(info->shell), DISP)) { XBell(DISP, 0); XRaiseWindow(DISP, XtWindow(info->shell)); return; } if (info->act == FILE_PRINT && printlog_raise_active(info)) { XBell(DISP, 0); return; } if (globals.dvi_file.bak_fp == NULL) { popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Empty or incomplete DVI file. " "Please select a new DVI file via File -> Open."); return; } if (info->shell == NULL) { /* first time */ get_initial_values(info); #ifdef MOTIF motif_create_dialog(info); #else xaw_create_dialog(info); #endif /* fprintf(stderr, "SHELL IS: %p\n", (void *)info->shell); */ set_check_page_range(info, False); /* set initial values */ if (info->act == FILE_SAVE) update_dvips_options_sensitivity(resource.default_saving_format, info->shell); } else { set_check_page_range(info, False); /* was: True, use False to reset values to current page */ } /* map the dialog */ XtPopup(info->shell, XtGrabNone); } xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/print-log.c0000664000175000017500000005410511032450154021026 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 Paul Vojta and the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ /* FIXME: The printlog presents too much detail and is confusing for users. Re-implement it using an `printing page n of m' message, i.e. according to the spec on: http://xdvi.sourceforge.net/gui.html#file-print Possible save the detailed log to a different window that can be viewed via `File -> logs', as described on: http://xdvi.sourceforge.net/gui.html#file-logs */ #include #include "xdvi-config.h" #include "xdvi.h" #include "xdvi-debug.h" #include "print-dialog.h" #include "print-internal.h" #include "print-log.h" /* for adjust_vertically() */ #include "util.h" #include "string-utils.h" #include "x_util.h" #include "xlwradio.h" #include #include #ifdef MOTIF # include # include # include # include # include # include # include # include # include # include # include # include # include #else # include # include # include # include # include # include # include # include /* XawFmt8Bit is only available starting with X11R6: */ # if XtSpecificationRelease < 6 # define XawFmt8Bit FMT8BIT # endif #endif /* MOTIF */ static void printlog_act_close(Widget, XEvent *, String *, Cardinal *); static void printlog_act_keep(Widget, XEvent *, String *, Cardinal *); static void printlog_act_unkeep(Widget, XEvent *, String *, Cardinal *); static void printlog_act_cancel(Widget, XEvent *, String *, Cardinal *); static void printlog_act_cancel_or_destroy(Widget, XEvent *, String *, Cardinal *); static Atom WM_DELETE_WINDOW; static XtActionsRec printlog_actions[] = { {"printlogIntClose", printlog_act_close}, {"printlogIntKeep", printlog_act_keep}, {"printlogIntUnkeep", printlog_act_unkeep}, {"printlogIntCancel", printlog_act_cancel}, {"WM_cancel_or_destroy", printlog_act_cancel_or_destroy }, }; static const char *const PRINTLOG_WINDOW_TRANSLATIONS = #ifdef MOTIF "osfCancel:WM_cancel_or_destroy(%p)" #else "Escape:WM_cancel_or_destroy(%p)" #endif ; #ifdef MOTIF static const char *const PRINTLOG_WINDOW_OVERRIDE_TRANSLATIONS = "#override\n" "osfCancel:WM_cancel_or_destroy(%p)"; #endif static const char *const PRINTLOG_TEXT_TRANSLATIONS = #ifdef MOTIF "osfCancel:WM_cancel_or_destroy(%p)\n" #else "Escape:WM_cancel_or_destroy(%p)\n" #endif "Return:printlogIntClose(%p)\n" "^c:printlogIntCancel(%p)\n" "^s:printlogIntKeep(%p)\n" "^q:printlogIntUnkeep(%p)\n" "q:printlogIntClose(%p)"; #define Xdvi_PRINTLOG_TEXT_NAME "text" #define Xdvi_PRINTLOG_CLOSE_NAME "close" #define Xdvi_PRINTLOG_KEEP_NAME "keep" #define Xdvi_PRINTLOG_CANCEL_NAME "cancel" static void cb_printlog_act_cancel_or_destroy(Widget w, XtPointer client_data, XtPointer call_data) { struct save_or_print_info *info = (struct save_or_print_info *)client_data; Widget cancel_button = NULL; UNUSED(w); UNUSED(call_data); ASSERT(info->callbacks != NULL && info->callbacks->cb_destroy != NULL, "Callback not initialized"); /* If the `Cancel' button is still active, cancel printing, else close the window. */ if (get_widget_by_name(&cancel_button, info->printlog, Xdvi_PRINTLOG_CANCEL_NAME, True)) { Boolean sensitive = False; XtVaGetValues(cancel_button, #ifdef MOTIF XmNsensitive, #else XtNsensitive, #endif &sensitive, NULL); fprintf(stderr, "Sensitive: %d\n", sensitive); if (sensitive) info->callbacks->cb_cancel(w, info, NULL); else info->callbacks->cb_destroy(w, info, NULL); } } Boolean printlog_raise_active(struct save_or_print_info *info) { Widget w = info->printlog; if (w != NULL && window_is_mapped(XtWindow(w), DISP)) { XRaiseWindow(DISP, XtWindow(w)); return True; } return False; } void printlog_popup(struct save_or_print_info *info) { Widget w = info->printlog; #ifdef MOTIF Widget cancel, text; #endif #ifdef MOTIF char *text_translations = get_string_va(PRINTLOG_TEXT_TRANSLATIONS, info, info, info, info, info, info); char *window_translations = get_string_va(PRINTLOG_WINDOW_TRANSLATIONS, info); #endif printlog_reset(info); center_window(w, globals.widgets.top_level); XtMapWidget(w); /* XtPopup(w, XtGrabNone); */ #ifndef MOTIF XSetWMProtocols(XtDisplay(w), XtWindow(w), &WM_DELETE_WINDOW, 1); #else XtOverrideTranslations(w, XtParseTranslationTable(window_translations)); if (get_widget_by_name(&cancel, w, Xdvi_PRINTLOG_CANCEL_NAME, True) && get_widget_by_name(&text, w, Xdvi_PRINTLOG_TEXT_NAME, True)) { /* This breaks PRINTLOG_WINDOW_OVERRIDE_TRANSLATIONS?? * We don't want it activated on Return anyway ... */ /* XmProcessTraversal(cancel, XmTRAVERSE_CURRENT); */ XtOverrideTranslations(text, XtParseTranslationTable(text_translations)); XtOverrideTranslations(text, XtParseTranslationTable(window_translations)); free(text_translations); free(window_translations); } #endif } void printlog_reset(struct save_or_print_info *info) { Widget w = info->printlog; Widget text; if (get_widget_by_name(&text, w, Xdvi_PRINTLOG_TEXT_NAME, True)) { #ifndef MOTIF XtVaSetValues(text, XtNstring, "", NULL); XawTextSetInsertionPoint(text, 0); #else XmTextSetString(text, ""); XtVaSetValues(text, XmNcursorPosition, 0, NULL); #endif } } void printlog_create(struct save_or_print_info *info, const char *title, const char *close_label) { Widget printlog_text, printlog_close, printlog_keep, printlog_cancel; Widget form, paned, box; char *window_translation_str; #ifdef MOTIF XmString str; XtTranslations window_override_translations; #else char *text_translation_str = NULL; XtTranslations wm_translations; XtTranslations window_translations; #endif #ifdef MOTIF window_translation_str = get_string_va(PRINTLOG_WINDOW_OVERRIDE_TRANSLATIONS, info); window_override_translations = XtParseTranslationTable(window_translation_str); free(window_translation_str); #else window_translation_str = get_string_va(PRINTLOG_WINDOW_TRANSLATIONS, info); window_translations = XtParseTranslationTable(window_translation_str); free(window_translation_str); #endif XtAddActions(printlog_actions, XtNumber(printlog_actions)); #ifndef MOTIF wm_translations = XtParseTranslationTable("WM_PROTOCOLS: WM_cancel_or_destroy()"); info->printlog = XtVaCreatePopupShell("printlog", transientShellWidgetClass, globals.widgets.top_level, XtNtitle, title, XtNtransientFor, globals.widgets.top_level, XtNmappedWhenManaged, False, XtNtranslations, wm_translations, XtNtransientFor, globals.widgets.top_level, NULL); WM_DELETE_WINDOW = XInternAtom(XtDisplay(info->printlog), "WM_DELETE_WINDOW", False); XtOverrideTranslations(info->printlog, window_translations); paned = XtVaCreateManagedWidget("paned", panedWidgetClass, info->printlog, NULL); form = XtVaCreateManagedWidget("form", formWidgetClass, paned, XtNdefaultDistance, 6, NULL); printlog_text = XtVaCreateManagedWidget(Xdvi_PRINTLOG_TEXT_NAME, asciiTextWidgetClass, form, XtNstring, "", XtNdataCompression, False, XtNeditType, XawtextAppend, XtNscrollHorizontal, XawtextScrollAlways, XtNscrollVertical, XawtextScrollAlways, XtNwidth, 600, XtNheight, 400, XtNleft, XawChainLeft, XtNright, XawChainRight, XtNtop, XawChainTop, XtNbottom, XawChainBottom, NULL); text_translation_str = get_string_va(PRINTLOG_TEXT_TRANSLATIONS, info, info, info, info, info, info); XtOverrideTranslations(printlog_text, XtParseTranslationTable(text_translation_str)); free(text_translation_str); printlog_keep = XtVaCreateManagedWidget(Xdvi_PRINTLOG_KEEP_NAME, #ifdef XAW radioWidgetClass, #else toggleWidgetClass, #endif form, XtNlabel, close_label, XtNborderWidth, 0, #ifdef XAW XtNisRadio, False, #endif XtNhighlightThickness, 1, XtNfromVert, printlog_text, XtNleft, XawChainLeft, XtNright, XawChainLeft, XtNtop, XawChainBottom, XtNbottom, XawChainBottom, NULL); XtVaSetValues(printlog_keep, XtNstate, resource.dvips_hang > 0 && resource.dvips_fail_hang > 0, NULL); XtAddCallback(printlog_keep, XtNcallback, info->callbacks->cb_keep, (XtPointer)info); /* box for the Close/Cancel button */ box = XtVaCreateManagedWidget("box", formWidgetClass, paned, /* resizing by user isn't needed */ XtNshowGrip, False, XtNdefaultDistance, 6, /* some padding */ /* resizing the window shouldn't influence this box, * but only the pane widget */ XtNskipAdjust, True, XtNaccelerators, G_accels_cr, NULL); printlog_close = XtVaCreateManagedWidget(Xdvi_PRINTLOG_CLOSE_NAME, commandWidgetClass, box, XtNlabel, "Close", XtNsensitive, False, XtNleft, XawChainLeft, XtNright, XawChainLeft, XtNtop, XawChainBottom, XtNbottom, XawChainBottom, NULL); XtAddCallback(printlog_close, XtNcallback, info->callbacks->cb_close, (XtPointer)info); printlog_cancel = XtVaCreateManagedWidget(Xdvi_PRINTLOG_CANCEL_NAME, commandWidgetClass, box, XtNlabel, "Cancel", XtNfromHoriz, printlog_keep, XtNleft, XawChainRight, XtNright, XawChainRight, XtNtop, XawChainBottom, XtNbottom, XawChainBottom, NULL); XtAddCallback(printlog_cancel, XtNcallback, info->callbacks->cb_cancel, (XtPointer)info); XtManageChild(info->printlog); printlog_enable_cancelbutton(info); #else /* MOTIF */ info->printlog = XtVaCreatePopupShell("printlog", xmDialogShellWidgetClass, globals.widgets.top_level, XmNdeleteResponse, XmDO_NOTHING, /* we'll take care of that ourselves */ XmNtitle, title, XtNmappedWhenManaged, False, XmNtranslations, window_override_translations, NULL); WM_DELETE_WINDOW = XmInternAtom(XtDisplay(info->printlog), "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(info->printlog, WM_DELETE_WINDOW, cb_printlog_act_cancel_or_destroy, (XtPointer)info); paned = XtVaCreateWidget("printlog_pane", xmPanedWindowWidgetClass, info->printlog, /* make sashes invisible */ XmNsashWidth, 1, XmNsashHeight, 1, XmNtranslations, window_override_translations, NULL); form = XtVaCreateWidget("form", xmFormWidgetClass, paned, XmNhorizontalSpacing, DDIST, XmNverticalSpacing, DDIST, XmNautoUnmanage, False, XmNtranslations, window_override_translations, NULL); /* force vertical scrollbars. Under Motif 2.x (2.1.0 and 2.2.2 at least), XmNeditMode must be set early in order to have an effect. */ { Arg args[10]; int n = 0; XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; XtSetArg(args[n], XmNeditable, False); n++; XtSetArg(args[n], XmNrows, 24); n++; XtSetArg(args[n], XmNcolumns, 80); n++; printlog_text = XmCreateScrolledText(form, Xdvi_PRINTLOG_TEXT_NAME, args, n); } XtVaSetValues(XtParent(printlog_text), XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNtranslations, window_override_translations, NULL); XtManageChild(printlog_text); str = XmStringCreateLocalized((char *)close_label); printlog_keep = XtVaCreateManagedWidget(Xdvi_PRINTLOG_KEEP_NAME, xmToggleButtonGadgetClass, form, XmNlabelString, str, XmNindicatorType, XmN_OF_MANY, XmNnavigationType, XmTAB_GROUP, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, XtParent(printlog_text), XmNleftAttachment, XmATTACH_FORM, XmNtranslations, window_override_translations, NULL); XmStringFree(str); XtAddCallback(printlog_keep, XmNvalueChangedCallback, info->callbacks->cb_keep, (XtPointer)info); XmToggleButtonGadgetSetState(printlog_keep, resource.dvips_hang > 0 && resource.dvips_fail_hang > 0, False); /* box for Close/Cancel button */ box = XtVaCreateManagedWidget("box", xmFormWidgetClass, paned, NULL); str = XmStringCreateLocalized("Close"); printlog_close = XtVaCreateManagedWidget(Xdvi_PRINTLOG_CLOSE_NAME, xmPushButtonWidgetClass, box, XmNlabelString, str, XmNshowAsDefault, True, XmNsensitive, False, XmNdefaultButtonShadowThickness, 1, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, /* mimick appearance of native dialog buttons (better way would be to extend existing dialog with custom widgets, as in search-dialog.c) */ XmNmarginWidth, 6, XmNmarginHeight, 4, XmNtopOffset, 10, XmNbottomOffset, 10, XmNleftOffset, 10, XmNtranslations, window_override_translations, NULL); XmStringFree(str); XtAddCallback(printlog_close, XmNactivateCallback, info->callbacks->cb_close, (XtPointer)info); XtOverrideTranslations(printlog_close, XtParseTranslationTable("Return:ArmAndActivate()\n")); str = XmStringCreateLocalized("Cancel"); printlog_cancel = XtVaCreateManagedWidget(Xdvi_PRINTLOG_CANCEL_NAME, xmPushButtonWidgetClass, box, XmNlabelString, str, XmNdefaultButtonShadowThickness, 1, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, /* to mimick appearance of native dialog buttons: */ XmNmarginWidth, 6, XmNmarginHeight, 4, XmNtopOffset, 10, XmNbottomOffset, 10, XmNrightOffset, 10, XmNtranslations, window_override_translations, NULL); XmStringFree(str); XtAddCallback(printlog_cancel, XmNactivateCallback, info->callbacks->cb_cancel, (XtPointer)info); XtOverrideTranslations(printlog_close, XtParseTranslationTable("Return:ArmAndActivate()\n")); XtManageChild(box); XtManageChild(form); XtManageChild(paned); /* center_window(info->printlog, globals.widgets.top_level); */ /* XtMapWidget(info->printlog); */ /* this doesn't help */ /* XtOverrideTranslations(form, XtParseTranslationTable(text_translation_str)); */ /* XtOverrideTranslations(paned, XtParseTranslationTable(text_translation_str)); */ printlog_enable_cancelbutton(info); #endif adjust_width(printlog_close, printlog_cancel); } void printlog_append(struct save_or_print_info *info, const char *str, size_t len) { Widget text; Widget w = info->printlog; if (!get_widget_by_name(&text, w, Xdvi_PRINTLOG_TEXT_NAME, True)) return; #ifndef MOTIF { XawTextPosition point; static XawTextBlock block = {0, 0, NULL, 0}; block.ptr = (char *) str; block.length = len; block.format = XawFmt8Bit; point = XawTextGetInsertionPoint(text); while (XawTextReplace(text, point, point, &block) != XawEditDone) { int length; XtVaGetValues(text, XtNlength, &length, NULL); point = length; } point += len; XawTextSetInsertionPoint(text, point); } #else /* MOTIF */ { XmTextPosition point = XmTextGetInsertionPosition(text); XmTextInsert(text, point, (char *) str); point += len; XtVaSetValues(text, XmNcursorPosition, point, NULL); XmTextShowPosition(text, point); } #endif /* MOTIF */ } void printlog_append_str(struct save_or_print_info *info, const char *str) { printlog_append(info, str, strlen(str)); } /* enable cancel button, disable close button */ void printlog_enable_cancelbutton(struct save_or_print_info *info) { Widget w = info->printlog; Widget close, cancel; if (get_widget_by_name(&cancel, w, Xdvi_PRINTLOG_CANCEL_NAME, True) && get_widget_by_name(&close, w, Xdvi_PRINTLOG_CLOSE_NAME, True)) { XtSetSensitive(close, False); XtSetSensitive(cancel, True); #if MOTIF /* This breaks PRINTLOG_WINDOW_OVERRIDE_TRANSLATIONS?? * We don't want it activated on Return anyway ... */ /* XmProcessTraversal(cancel, XmTRAVERSE_CURRENT); */ #endif } } /* disable cancel button, enable close button */ void printlog_enable_closebutton(struct save_or_print_info *info) { Widget w = info->printlog; Widget close, cancel; if (get_widget_by_name(&cancel, w, Xdvi_PRINTLOG_CANCEL_NAME, True) && get_widget_by_name(&close, w, Xdvi_PRINTLOG_CLOSE_NAME, True)) { #if MOTIF char *window_translations = get_string_va(PRINTLOG_WINDOW_TRANSLATIONS, info); #endif XtSetSensitive(close, True); XtSetSensitive(cancel, False); #if MOTIF XmProcessTraversal(close, XmTRAVERSE_CURRENT); XtOverrideTranslations(close, XtParseTranslationTable(window_translations)); free(window_translations); #endif } } static void printlog_internal_close(struct save_or_print_info *info) { Widget w = info->printlog; Widget text; XtUnmapWidget(w); if (get_widget_by_name(&text, w, Xdvi_PRINTLOG_TEXT_NAME, True)) { #ifndef MOTIF XtVaSetValues(text, XtNstring, "", NULL); #else XmTextSetString(text, ""); #endif } } void printlog_popdown(struct save_or_print_info *info, Boolean force) { Widget w = info->printlog; Widget keep; if (force) { /* user clicked on `Close' */ printlog_internal_close(info); } else if (get_widget_by_name(&keep, w, Xdvi_PRINTLOG_KEEP_NAME, True)) { /* timer elapsed */ #ifndef MOTIF Boolean state; XtVaGetValues(keep, XtNstate, &state, NULL); if (state) { printlog_internal_close(info); } #else if (XmToggleButtonGadgetGetState(keep)) { printlog_internal_close(info); } #endif } } static void printlog_act_close(Widget w, XEvent *event, String *params, Cardinal *num_params) { void *ptr; struct save_or_print_info *info; UNUSED(w); UNUSED(event); if (*num_params < 1) { XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params)); return; } sscanf(*params, "%p", &ptr); info = (struct save_or_print_info *)ptr; ASSERT(info->callbacks != NULL && info->callbacks->cb_close != NULL, "Callback not initialized"); info->callbacks->cb_close(w, info, NULL); } static void printlog_act_keep(Widget w, XEvent *event, String *params, Cardinal *num_params) { void *ptr; struct save_or_print_info *info; Widget keep; UNUSED(w); UNUSED(event); if (*num_params < 1) { XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params)); return; } sscanf(*params, "%p", &ptr); info = (struct save_or_print_info *)ptr; ASSERT(info->callbacks != NULL && info->callbacks->cb_keep != NULL, "Callback not initialized"); info->callbacks->cb_keep(w, info, NULL); if (get_widget_by_name(&keep, info->printlog, Xdvi_PRINTLOG_KEEP_NAME, True)) { #ifdef MOTIF XmToggleButtonGadgetSetState(keep, False, False); #else XtVaSetValues(keep, XtNstate, False, NULL); #endif } } static void printlog_act_unkeep(Widget w, XEvent *event, String *params, Cardinal *num_params) { void *ptr; struct save_or_print_info *info; Widget keep; UNUSED(w); UNUSED(event); if (*num_params < 1) { XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params)); return; } sscanf(*params, "%p", &ptr); info = (struct save_or_print_info *)ptr; if (get_widget_by_name(&keep, info->printlog, Xdvi_PRINTLOG_KEEP_NAME, True)) { #ifdef MOTIF XmToggleButtonGadgetSetState(keep, True, False); #else XtVaSetValues(keep, XtNstate, True, NULL); #endif } } static void printlog_act_cancel(Widget w, XEvent *event, String *params, Cardinal *num_params) { void *ptr; struct save_or_print_info *info; UNUSED(w); UNUSED(event); if (*num_params < 1) { XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params)); return; } sscanf(*params, "%p", &ptr); info = (struct save_or_print_info *)ptr; ASSERT(info->callbacks != NULL && info->callbacks->cb_cancel != NULL, "Callback not initialized"); info->callbacks->cb_cancel(w, info, NULL); } static void printlog_act_cancel_or_destroy(Widget w, XEvent *event, String *params, Cardinal *num_params) { void *ptr; struct save_or_print_info *info; UNUSED(w); UNUSED(event); if (*num_params < 1) { XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params)); return; } sscanf(*params, "%p", &ptr); info = (struct save_or_print_info *)ptr; cb_printlog_act_cancel_or_destroy(w, (XtPointer)ptr, NULL); /* ASSERT(info->callbacks != NULL && info->callbacks->cb_cancel != NULL, "Callback not initialized"); */ /* info->callbacks->cb_cancel(w, info, NULL); */ } xdvik-ja-22.84.16-j1.40/texk/xdvik/gui/xm_toolbar.c0000664000175000017500000006353411276240141021272 0ustar uwabamiuwabami/* * Copyright (c) 2001 Marcin Dalecki * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* * Tool bar implementation for the Motif widget set. */ #include "xdvi-config.h" #include "xdvi.h" #include "pagesel.h" #include "help-window.h" #include "message-window.h" #include "kpathsea/tex-file.h" #include "kpathsea/expand.h" #include "statusline.h" #include "dvi-init.h" #include "events.h" #include "dvi-draw.h" #include "xm_menu.h" #include "xm_toolbar.h" #include "util.h" #include "x_util.h" #include "Tip.h" #include #include "xdvi-config.h" #include "c-openmx.h" /* default toolbar pixmap file */ #include "pixmaps/toolbar.xpm" #ifdef MOTIF #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_X11_XPM_H) # include #elif defined(HAVE_XPM_H) # include #elif defined(HAVE_XM_XPMP_H) # include #endif #include /* * The following needs to be keept in sync with the actual pixmap sizes in * tools.xpm. When editing the pixmaps, take care that the symbolic names * are not messed up (e.g. it works with "pixmap" from ftp.x11.org, but * not with xv). */ #define PIXMAP_WIDTH 18 #define PIXMAP_HEIGHT 18 /* #define PIXMAP_COUNT 13 */ static Widget tool_bar_frame; #define SEP_CHAR ':' /* character separating entries in translations lines */ void toggle_scrollbars(void) { Widget x_bar = XtNameToWidget(globals.widgets.main_window, "HorScrollBar"); Widget y_bar = XtNameToWidget(globals.widgets.main_window, "VertScrollBar"); if ((resource.expert_mode & XPRT_SHOW_SCROLLBARS) == 0) { XtUnmanageChild(x_bar); XtUnmanageChild(y_bar); } else { XtManageChild(x_bar); XtManageChild(y_bar); } set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert); } void toggle_toolbar(void) { #if !HAVE_XPM statusline_error(STATUS_LONG, "Compiled without XPM support; no toolbar available."); #else if (resource.toolbar_unusable) { statusline_error(STATUS_LONG, "Toolbar pixmap file not found; toolbar is disabled."); return; } if ((resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0) XtUnmanageChild(tool_bar_frame); else XtManageChild(tool_bar_frame); set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert); #endif /* not HAVE_XPM */ } typedef enum { TB_BUTTON, TB_SEPARATOR } toolbarButtonT; /* global array of button infos */ static struct toolbar_button_info { Widget button; toolbarButtonT type; char *tip; } *toolbar_buttons = NULL; #if HAVE_XPM /* remainder of file: toolbar is disabled without XPM support */ /* to save current values to */ static Pixel m_background = 0, m_top_shadow_color = 0, m_bottom_shadow_color = 0; /* to save resource value of XmNshadowThickness before overriding it if toolbar_buttons_raised is false; it will be used to raise the button on enter: */ static int m_shadow_thickness; extern Boolean get_int_arg(String *param, Cardinal *num_params, int *res); /* indexes for named colors */ enum { BACKGROUND, FOREGROUND, BOTTOM_SHADOW, TOP_SHADOW, HIGHLIGHT }; /* save info about buttons that need to change state */ static struct state_buttons_info { Widget back_button; /* insensitive when current page is last page */ Widget zoom_in_button; /* insensitive when shrinkfactor is 1 */ Widget forward_button; /* insensitive when current page is first page */ Widget hyperref_back_button; /* insensitive when at end of href history */ Widget hyperref_forward_button; /* insensitive when at begin of href history */ } m_button_info; static XtCallbackRec command_call[] = { { handle_command, NULL }, { NULL, NULL }, }; static void set_button_sensitivity(Widget w, Boolean sensitive) { if (w == NULL) { /* if button hadn't been initialized properly */ return; } XtVaSetValues(w, XmNsensitive, sensitive, NULL); /* also remove `raised' property on mouse over */ if (!sensitive && !resource.toolbar_buttons_raised) { Dimension x, y, wd, ht; Pixel foreground; static GC backgroundGC = NULL; if (!XtIsRealized(w)) return; XtVaGetValues(w, XmNx, &x, XmNy, &y, XmNwidth, &wd, XmNheight, &ht, NULL); if (backgroundGC == NULL) { XtVaGetValues(w, XmNforeground, &foreground, NULL); backgroundGC = set_or_make_gc(NULL, GXcopy, m_background, foreground); } XtVaSetValues(w, XmNtopShadowColor, m_background, XmNbottomShadowColor, m_background, NULL); #if 0 fprintf(stderr, "drawing on %d,%d\n", x, y); XFillRectangle(XtDisplay(w), XtWindow(w), globals.gc.high, /* backgroundGC, */ x, y, wd, ht); #endif } XSync(DISP, False); } void tb_check_navigation_sensitivity(int pageno) { if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0) return; set_button_sensitivity(m_button_info.forward_button, pageno == total_pages - 1 ? False : True); set_button_sensitivity(m_button_info.back_button, pageno == 0 ? False : True); } void tb_set_htex_back_sensitivity(Boolean sensitive) { if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0) return; set_button_sensitivity(m_button_info.hyperref_back_button, sensitive); } void tb_set_htex_forward_sensitivity(Boolean sensitive) { if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0) return; set_button_sensitivity(m_button_info.hyperref_forward_button, sensitive); } void tb_set_pagehist_back_sensitivity(Boolean sensitive) { if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0) return; set_button_sensitivity(m_button_info.hyperref_back_button, sensitive); } void tb_set_pagehist_forward_sensitivity(Boolean sensitive) { if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0) return; set_button_sensitivity(m_button_info.hyperref_forward_button, sensitive); } void tb_set_zoom_sensitivity(Boolean sensitive) { if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0) return; set_button_sensitivity(m_button_info.zoom_in_button, sensitive); } #if 0 static void search_callback(Widget w, XtPointer client_data, XmAnyCallbackStruct *call_data) { UNUSED(w); UNUSED(client_data); UNUSED(call_data); popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Sorry, not yet implemented"); } #endif /* 0 */ /* * If successful, this extracts a square pixmap from resource.toolbar_pixmap_file * and returns True. * In this case, the pixmap `sen' will contain the actual * pixmap and `insen' will contain a drawn pixmap for the insensitive state of * the button. We are emulating a shaded state derived from the monochrome 'm' * color attributes of the XPM. * * If unsuccessful, it returns False, and the Pixmap pointers are undefined. */ static Boolean create_pixmap(Widget parent, int iconidx, Pixmap *sen, Pixmap *insen) { static Boolean first_time = True; static Window rootWindow; static XpmColorSymbol color[5] = { {"none", "none", 0}, {"iconColor1", NULL, 0}, {"bottomShadowColor", NULL, 0}, {"topShadowColor", NULL, 0}, {"selectColor", NULL, 0} }; static int screenNum; static Pixmap tools_map; static Pixmap tools_mask; static Pixmap shade_map; static Pixmap shade_mask; int status = 0; XpmAttributes attr; Pixmap map; Pixmap mask; static String pixmap_file_path = NULL; /* note: never free()d */ ASSERT(iconidx >= 0, "index must be positive"); if (first_time) { /* FIXME: We use a dummy window here to get the correct depth/visual for the pixmap creation (cant use globals.widgets.top_level since it's not realized yet and realizing it now would result in wrong dimensions) ... */ Widget dummy = XtVaAppCreateShell("xdvi", "Xdvi", transientShellWidgetClass, DISP, XtNdepth, G_depth, XtNvisual, G_visual, XtNcolormap, G_colormap, XtNmappedWhenManaged, False, NULL); XtRealizeWidget(dummy); /* note: doesn't pop it up */ rootWindow = XtWindow(dummy); screenNum = DefaultScreen(XtDisplay(globals.widgets.top_level)); ASSERT(rootWindow != 0, ""); XtVaGetValues(parent, XmNbackground, &color[BACKGROUND].pixel, XmNforeground, &color[FOREGROUND].pixel, XmNbottomShadowColor, &color[BOTTOM_SHADOW].pixel, XmNtopShadowColor, &color[TOP_SHADOW].pixel, XmNhighlightColor, &color[HIGHLIGHT].pixel, NULL); /* try to locate the XPM file with the toolbar pixmaps */ pixmap_file_path = XtResolvePathname(DISP, "pixmaps", resource.toolbar_pixmap_file, (String)NULL, /* suffix */ (String)NULL, /* use default path */ (Substitution)NULL, /* substitutions */ 0, /* number of substitutions */ (XtFilePredicate)NULL); /* return True iff file exists */ TRACE_GUI((stderr, "pixmap file search via XtResolvePathname: %s => %s", resource.toolbar_pixmap_file, pixmap_file_path ? (char*)pixmap_file_path : "")); if (pixmap_file_path == NULL) { pixmap_file_path = (String)kpse_find_file(resource.toolbar_pixmap_file, kpse_program_text_format, 0); TRACE_GUI((stderr, "pixmap file search via kpse_find_file: %s => %s", resource.toolbar_pixmap_file, pixmap_file_path ? (char*)pixmap_file_path : "")); if (pixmap_file_path == NULL) { TRACE_GUI((stderr, "No installed toolbar pixmap found, using built-in pixmap.")); } } } /* Setup the color subsititution table */ attr.valuemask = XpmColorSymbols | XpmCloseness | XpmColormap | XpmDepth | XpmVisual; attr.closeness = 65535; /* accuracy isn't crucial */ attr.colorsymbols = color; attr.numsymbols = XtNumber(color); attr.visual = G_visual; attr.colormap = G_colormap; attr.depth = G_depth; /* Create the "sensitive" pixmap */ if (!tools_map) { if (pixmap_file_path != NULL) { status = XpmReadFileToPixmap(XtDisplay(globals.widgets.top_level), rootWindow, pixmap_file_path, &tools_map, &tools_mask, &attr); } else { status = XpmCreatePixmapFromData(XtDisplay(globals.widgets.top_level), rootWindow, (char **)toolbar_xpm, &tools_map, &tools_mask, &attr); } } else status = XpmSuccess; map = tools_map; mask = tools_mask; if (status == XpmSuccess) { static Pixmap tmp_mask; static GC gc; if (first_time) { tmp_mask = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow, PIXMAP_WIDTH, PIXMAP_HEIGHT, 1); gc = XCreateGC(XtDisplay(globals.widgets.top_level), tmp_mask, 0, NULL); } XCopyArea(XtDisplay(globals.widgets.top_level), mask, tmp_mask, gc, iconidx * PIXMAP_WIDTH, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, 0, 0); mask = tmp_mask; } else { /* something went wrong */ popup_message(globals.widgets.top_level, MSG_ERR, "Something's wrong with your XPM file - " "try to load it into an image editor and fix the problem.", "Xpm error: %s - switching toolbar off.", XpmGetErrorString(status)); sen = insen = NULL; resource.expert_mode ^= XPRT_SHOW_TOOLBAR; return False; } XpmFreeAttributes(&attr); if (map != 0) { static GC back_gc, bots_gc; if (first_time) { XGCValues gcvalues; gcvalues.foreground = color[BACKGROUND].pixel; back_gc = XCreateGC(XtDisplay(globals.widgets.top_level), rootWindow, GCForeground, &gcvalues); gcvalues.foreground = color[BOTTOM_SHADOW].pixel; bots_gc = XCreateGC(XtDisplay(globals.widgets.top_level), rootWindow, GCForeground, &gcvalues); } /* Need to create new Pixmaps with the mask applied. */ XSetClipMask(XtDisplay(globals.widgets.top_level), bots_gc, mask); /* Create the "sensitive" pixmap. */ *sen = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow, PIXMAP_WIDTH, PIXMAP_HEIGHT, G_depth); XFillRectangle(XtDisplay(globals.widgets.top_level), *sen, back_gc, 0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT); if (iconidx != -1) XCopyArea(XtDisplay(globals.widgets.top_level), map, *sen, bots_gc, iconidx * PIXMAP_WIDTH, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, 0, 0); else XCopyArea(XtDisplay(globals.widgets.top_level), map, *sen, bots_gc, 0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, 0, 0); if (iconidx == -1) XFreePixmap(XtDisplay(globals.widgets.top_level), map); /* Create the "insensitive" pixmap. */ if (insen != NULL) { Pixmap map; Pixmap mask; attr.valuemask = XpmColorSymbols | XpmCloseness | XpmColorKey | XpmColormap | XpmDepth | XpmVisual; attr.closeness = 65535; /* accuracy isn't crucial */ attr.colorsymbols = color; attr.numsymbols = XtNumber(color); attr.color_key = XPM_MONO; attr.visual = G_visual; attr.colormap = G_colormap; attr.depth = G_depth; if (!shade_map) { if (pixmap_file_path != NULL) { status = XpmReadFileToPixmap(XtDisplay(globals.widgets.top_level), rootWindow, pixmap_file_path, &shade_map, &shade_mask, &attr); } else { status = XpmCreatePixmapFromData(XtDisplay(globals.widgets.top_level), rootWindow, (char **)toolbar_xpm, &shade_map, &shade_mask, &attr); } } else status = XpmSuccess; map = shade_map; mask = shade_mask; if (status == XpmSuccess) { static Pixmap tmp_mask; static GC gc; if (first_time) { tmp_mask = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow, PIXMAP_WIDTH, PIXMAP_HEIGHT, 1); gc = XCreateGC(XtDisplay(globals.widgets.top_level), tmp_mask, 0, NULL); } XCopyArea(XtDisplay(globals.widgets.top_level), mask, tmp_mask, gc, iconidx * PIXMAP_WIDTH, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, 0, 0); mask = tmp_mask; } else { /* something went wrong */ popup_message(globals.widgets.top_level, MSG_ERR, "Something's wrong with your XPM file - " "try to load it into an image editor and fix the problem.", "Xpm error: %s - switching toolbar off.", XpmGetErrorString(status)); sen = insen = NULL; resource.expert_mode ^= XPRT_SHOW_TOOLBAR; return False; } if (mask != 0) { static GC tops_gc; if (first_time) { XGCValues gcvalues; gcvalues.foreground = color[TOP_SHADOW].pixel; tops_gc = XCreateGC(XtDisplay(globals.widgets.top_level), rootWindow, GCForeground, &gcvalues); } /* Need to create new Pixmaps with the mask applied. */ XSetClipMask(XtDisplay(globals.widgets.top_level), bots_gc, mask); XSetClipMask(XtDisplay(globals.widgets.top_level), tops_gc, mask); XSetClipOrigin(XtDisplay(globals.widgets.top_level), tops_gc, 1, 1); *insen = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow, PIXMAP_WIDTH, PIXMAP_HEIGHT, G_depth); XFillRectangle(XtDisplay(globals.widgets.top_level), *insen, back_gc, 0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT); XFillRectangle(XtDisplay(globals.widgets.top_level), *insen, tops_gc, 1, 1, PIXMAP_WIDTH - 1, PIXMAP_HEIGHT - 1); XFillRectangle(XtDisplay(globals.widgets.top_level), *insen, bots_gc, 0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT); if (iconidx == -1) XFreePixmap(XtDisplay(globals.widgets.top_level), map); } XpmFreeAttributes(&attr); } } first_time = False; return True; } /* * If successful, this returns True, and sets *button to a button with * a square pixmap on it (which is cut out form `index' position in * resource.toolbar_pixmap_file). If unsuccessful, it returns false, * and *button is undefined. */ static Boolean create_toolbar_button(Widget parent, Widget *button, const Pixmap *image_sens, const Pixmap *image_insens) { Boolean sensitive = True; /* dummy */ *button = XtVaCreateManagedWidget("button", xmPushButtonWidgetClass, parent, XmNhighlightOnEnter, True, XmNlabelPixmap, *image_sens, XmNlabelInsensitivePixmap, *image_insens, XmNsensitive, sensitive, XmNlabelType, XmPIXMAP, NULL); XtVaGetValues(*button, XmNshadowThickness, &m_shadow_thickness, NULL); if (!resource.toolbar_buttons_raised) { if (m_background == 0) { /* initialize values */ XtVaGetValues(*button, /* should we rather get background of parent widget? */ XmNbackground, &m_background, XmNtopShadowColor, &m_top_shadow_color, XmNbottomShadowColor, &m_bottom_shadow_color, NULL); } /* remove shadows, setting them later when mouse enters button */ XtVaSetValues(*button, XmNtopShadowColor, m_background, XmNbottomShadowColor, m_background, NULL); } return True; } static void create_toolbar_separator(Widget parent, Widget *separator, int width) { *separator = XtVaCreateManagedWidget("toolbarSeparator", xmSeparatorWidgetClass, parent, XmNseparatorType, XmNO_LINE, XmNminWidth, width, XmNwidth, width, XmNorientation, XmVERTICAL, XmNleftAttachment, XmATTACH_WIDGET, XmNrightAttachment, XmATTACH_WIDGET, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); } /* taken from shadow_trick in WlToolBar.c, mgv-3.1.5: Get a raised behaviour for armed buttons, by explicitly setting a shadow on entry and removing it on leave. */ static void enter_leave(Widget w, XtPointer closure, XEvent *event, Boolean *cont) { char *tooltip = (char *)closure; XCrossingEvent *ev = (XCrossingEvent *)event; static Boolean entered = False; /* to skip double leaves */ UNUSED(cont); if (ev->type == EnterNotify) { if (!resource.toolbar_buttons_raised) { /* draw shadows */ XtVaSetValues(w, XmNtopShadowColor, m_top_shadow_color, XmNbottomShadowColor, m_bottom_shadow_color, NULL); } entered = True; if (resource.tooltips_in_statusline) { statusline_info(STATUS_SHORT, tooltip); } } else if (ev->type == LeaveNotify && !resource.toolbar_buttons_raised) { /* remove shadows */ if (!entered) return; XtVaSetValues(w, XmNtopShadowColor, m_background, XmNbottomShadowColor, m_background, NULL); entered = False; } } /* save info about special buttons in m_button_info (see definition of that for details) */ static void button_info_save(struct xdvi_action *action, Widget w) { if (action->proc == Act_back_page && strcmp(action->param, "1") == 0) { m_button_info.back_button = w; } else if (action->proc == Act_forward_page && strcmp(action->param, "1") == 0) { m_button_info.forward_button = w; } else if (action->proc == Act_pagehistory_back) { set_button_sensitivity(w, False); m_button_info.hyperref_back_button = w; } else if (action->proc == Act_pagehistory_forward) { set_button_sensitivity(w, False); m_button_info.hyperref_forward_button = w; } else if (action->proc == Act_set_shrink_factor && action->param[0] == '+') { m_button_info.zoom_in_button = w; } } #endif /* HAVE_XPM */ /* * Create a toolbar with buttons, return toolbar widget. */ Widget create_toolbar(Widget parent, Widget menu_bar) { #if HAVE_XPM size_t alloc_len = 0, n; size_t alloc_step = 16; const char *c_ptr, *e_ptr; #endif /* HAVE_XPM */ Widget tool_bar; resource.toolbar_unusable = False; tool_bar_frame = XtVaCreateWidget("toolBarFrame", xmFrameWidgetClass, parent, XmNshadowType, XmSHADOW_OUT, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, menu_bar, NULL); tool_bar = XtVaCreateManagedWidget("toolBar", xmRowColumnWidgetClass, tool_bar_frame, XmNchildType, XmFRAME_WORKAREA_CHILD, XmNrowColumnType, XmWORK_AREA, XmNorientation, XmHORIZONTAL, XmNtraversalOn, False, XmNisHomogeneous, False, XmNpacking, XmPACK_TIGHT, XmNspacing, 0, /* override to use SEPARATOR(n) instead */ XmNadjustLast, True, NULL); #if HAVE_XPM /* parse toolbar_translations, create the widgets and assign the actions */ for (n = 0, c_ptr = resource.toolbar_translations; c_ptr != NULL && *c_ptr != '\0'; c_ptr = e_ptr, n++) { char **line_items = NULL; int extra_space; size_t len, curr, item_count = 0; if ((e_ptr = strchr(c_ptr, '\n')) == NULL /* ... and in case last line doesn't end with \n ... */ && (e_ptr = strchr(c_ptr, '\0')) == NULL) { break; } if (e_ptr == c_ptr) { XDVI_WARNING((stderr, "Skipping empty line in toolbarTranslations resource.")); e_ptr++; continue; } len = e_ptr - c_ptr; TRACE_GUI((stderr, "LEN %lu: |%.*s|", (unsigned long)len, (int)len, c_ptr)); line_items = split_line(c_ptr, SEP_CHAR, 0, len, &item_count); if (globals.debug & DBG_GUI) { int k; for (k = 0; line_items[k] != NULL; k++) { fprintf(stderr, "ITEM %d of %lu: |%s|\n", k, (unsigned long)item_count, line_items[k]); } } while (alloc_len <= n + 1) { alloc_len += alloc_step; toolbar_buttons = xrealloc(toolbar_buttons, alloc_len * sizeof *toolbar_buttons); } if (item_count == 1 && sscanf(line_items[0], "SPACER(%d)", &extra_space) == 1) { TRACE_GUI((stderr, "creating spacer of witdh %d at %lu", extra_space, (unsigned long)n)); create_toolbar_separator(tool_bar, &(toolbar_buttons[n].button), extra_space); toolbar_buttons[n].type = TB_SEPARATOR; } else if (item_count == 4) { Pixmap sens, insens; sens = insens = 0; /* make compiler happy ... */ int idx = strtoul(line_items[0], (char **)NULL, 10); struct xdvi_action *action; TRACE_GUI((stderr, "creating pixmap at %d", idx)); if (!create_pixmap(tool_bar, idx, &sens, &insens)) { free(toolbar_buttons); toolbar_buttons = NULL; break; } TRACE_GUI((stderr, "creating button %ld", (unsigned long)n)); if (!create_toolbar_button(tool_bar, &(toolbar_buttons[n].button), &sens, &insens)) { free(toolbar_buttons); toolbar_buttons = NULL; break; } toolbar_buttons[n].type = TB_BUTTON; if ((action = compile_action(line_items[3])) != NULL) { char *long_tooltip = xstrdup(line_items[1]); toolbar_buttons[n].tip = xstrdup(line_items[2]); /* char *short_tooltip = xstrdup(line_items[2]); */ command_call[0].closure = (XtPointer) action; /* eventually save this widget in list of `special' buttons that need to toggle between sensitive/insensitive */ button_info_save(action, toolbar_buttons[n].button); XtVaSetValues(toolbar_buttons[n].button, XmNactivateCallback, (XtArgVal)command_call, NULL); XtAddEventHandler(toolbar_buttons[n].button, EnterWindowMask | LeaveWindowMask, False, enter_leave, long_tooltip); } else { XDVI_WARNING((stderr, "Invalid action \"%s\" in toolbarTranslations resource:\n\"%.*s\"", line_items[3], (int)len, c_ptr)); } } else { XDVI_WARNING((stderr, "Skipping malformed line \"%.*s\" in toolbarTranslations resource " "(%lu instead of 4 items).", (int)len, c_ptr, (unsigned long)item_count)); toolbar_buttons[n].button = 0; } for (curr = 0; curr < item_count; curr++) { free(line_items[curr]); } free(line_items); line_items = NULL; if (*e_ptr != '\0') e_ptr++; } #else if ((resource.expert_mode & XPRT_SHOW_SCROLLBARS) != 0) { XDVI_WARNING((stderr, "This version has been compiled without XPM support. " "Disabling the toolbar, which needs XPM.")); } #endif /* HAVE_XPM */ if (toolbar_buttons == NULL) { resource.toolbar_unusable = True; resource.expert_mode ^= XPRT_SHOW_TOOLBAR; } else { #if HAVE_XPM toolbar_buttons[n].button = 0; /* terminate info */ #endif } return tool_bar; } /* * Add the tips to the toolbar. This has to be done after the toolbar has been * realized. */ void create_tips(Widget toplevel) { #if HAVE_XPM Widget tip_shell; int i; if (resource.toolbar_unusable) /* don't create tips in this case */ return; tip_shell = XtVaCreatePopupShell("tipShell", tipWidgetClass, toplevel, XtNwidth, 1, XtNheight, 1, NULL); for (i = 0; toolbar_buttons[i].button != 0; i++) { if (toolbar_buttons[i].type == TB_BUTTON) { TipAddWidget(tip_shell, toolbar_buttons[i].button, toolbar_buttons[i].tip); } } #else UNUSED(toplevel); #endif /* HAVE_XPM */ } #else /* MOTIF */ /* silence "empty compilation unit" and "`toolbar_xpm' defined but not used" warnings */ static void bar(void); static void foo(void) { UNUSED(toolbar_xpm); bar(); } static void bar(void) { foo(); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/encodings.c0000664000175000017500000062315511276240141020312 0ustar uwabamiuwabami/* The unicode2adobe structure and the adobe2unicode_table mapping is taken from the catdvi (v0.12) `adobetbl.h' source file; it has the following copyright: catdvi - get text from DVI files Copyright (C) 1999 Antti-Juhani Kaijanaho Copyright (C) 2001 Bjoern Brill 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Other parts are adapted from the GNU `iconv' library, (search for `iconv'), which has the following copyright: Copyright (C) 1999-2001 Free Software Foundation, Inc. The GNU LIBICONV Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU LIBICONV 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU LIBICONV Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* The rest of the file is Copyright (c) 2003-2004 the xdvik development team 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "xdvi-config.h" #include "xdvi.h" #if HAVE_ICONV_H # include static iconv_t m_iconv_gb_ucs4 = (iconv_t)(-1); #endif /* HAVE_ICONV_H */ #include #include "util.h" #include "encodings.h" #include "my-snprintf.h" #include "message-window.h" #include "exit-handlers.h" #define MY_DEBUG 0 #define HAS_PREFIX(src,dst) (memcmp(src, dst, strlen(dst)) == 0) #if MY_DEBUG # define TRACE_FIND_VERBOSE(x) TRACE_FIND(x) #else # define TRACE_FIND_VERBOSE(x) /* as nothing */ #endif /* The following encoding vectors are copied from catdvi's enc/xyz.h files; only the `.notdef' values have been replaced by 0 instead of 0x003f (question mark) to make the mapping more flexible. */ /* from enc/texmsym.h */ static uint32_t m_cm_symbol_encoding[256] = { 0x2212, 0x00b7, 0x00d7, 0x2217, 0x00f7, 0x22c4, 0x00b1, 0x2213, 0x2295, 0x2296, 0x2297, 0x2298, 0x2299, 0x25ef, 0x25e6, 0x2022, /* 0x10 */ 0x224d, 0x2261, 0x2286, 0x2287, 0x2264, 0x2265, 0x227c, 0x227d, 0x223c, 0x2248, 0x2282, 0x2283, 0x226a, 0x226b, 0x227a, 0x227b, /* 0x20 */ 0x2190, 0x2192, 0x2191, 0x2193, 0x2194, 0x2197, 0x2198, 0x2243, 0x21d0, 0x21d2, 0x21d1, 0x21d3, 0x21d4, 0x2196, 0x2199, 0x221d, /* 0x30 */ 0x2032, 0x221e, 0x2208, 0x220b, 0x25b3, 0x25bd, 0x10fffc, 0, 0x2200, 0x2203, 0x00ac, 0x2205, 0x211c, 0x2111, 0x22a4, 0x22a5, /* 0x40 */ 0x2135, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, /* 0x50 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x222a, 0x2229, 0x228e, 0x2227, 0x2228, /* 0x60 */ 0x22a2, 0x22a3, 0x230a, 0x230b, 0x2308, 0x2309, 0x007b, 0x007d, 0x2329, 0x232a, 0x007c, 0x2225, 0x2195, 0x21d5, 0x005c, 0x2240, /* 0x70 */ 0x221a, 0x2210, 0x2207, 0x222b, 0x2294, 0x2293, 0x2291, 0x2292, 0x00a7, 0x2020, 0x2021, 0x00b6, 0x2663, 0x2666, 0x2665, 0x2660, /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* cbgreek, greek encoding */ static uint32_t m_cb_greek_encoding[256] = { 0x2013, 0x20032f, 0x10144, 0x10145, 0x10146, 0x10147, 0x03db, 0x03db, 0x1fbe, 0x1fbc, 0x1fcc, 0x1ffc, 0x0391, 0x03ab, 0x03b1, 0x03cb, /* 0x10 */ 0x02cf, 0x02ce, 0x03df, 0x03d9, 0x20032e, 0x03d8, 0x03da, 0x03e0, 0x20ac, 0x2030, 0x0259, 0x03e1, 0x2018, 0x2019, 0x02d8, 0x00af, /* 0x20 */ 0x1fc1, 0x0021, 0x00a8, 0x0385, 0x1fed, 0x0025, 0x00b7, 0x0384, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, /* 0x30 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x0387, 0x1ffe, 0x003d, 0x1fbf, 0x003b, /* 0x40 */ 0x1fdf, 0x0391, 0x0392, 0x1fdd, 0x0394, 0x0395, 0x03a6, 0x0393, 0x0397, 0x0399, 0x0398, 0x039a, 0x039b, 0x039c, 0x039d, 0x039f, /* 0x50 */ 0x03a0, 0x03a7, 0x03a1, 0x03a3, 0x03a4, 0x03d2, 0x1fde, 0x03a9, 0x039e, 0x03a8, 0x0396, 0x005b, 0x1fcf, 0x005d, 0x1fce, 0x1fcd, /* 0x60 */ 0x1fef, 0x03b1, 0x03b2, 0x03c2, 0x03b4, 0x03b5, 0x03c6, 0x03b3, 0x03b7, 0x03b9, 0x03b8, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03bf, /* 0x70 */ 0x03c0, 0x03c7, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0, 0x03c9, 0x03be, 0x03c8, 0x03b6, 0x00ab, 0x037a, 0x00bb, 0x1fc0, 0x2014, /* 0x80 */ 0x1f70, 0x1f01, 0x1f00, 0x1f03, 0x1fb2, 0x1f81, 0x1f80, 0x1f83, 0x03ac, 0x1f05, 0x1f04, 0x1f02, 0x1fb4, 0x1f85, 0x1f84, 0x1f82, /* 0x90 */ 0x1fb6, 0x1f07, 0x1f06, 0x03dd, 0x1fb7, 0x1f87, 0x1f86, 0, 0x1f74, 0x1f21, 0x1f20, 0, 0x1fc2, 0x1f91, 0x1f90, 0, /* 0xa0 */ 0x03ae, 0x1f25, 0x1f24, 0x1f23, 0x1fc4, 0x1f95, 0x1f94, 0x1f93, 0x1fc6, 0x1f27, 0x1f26, 0x1f22, 0x1fc7, 0x1f97, 0x1f96, 0x1f92, /* 0b0 */ 0x1f7c, 0x1f61, 0x1f60, 0x1f63, 0x1ff2, 0x1fa1, 0x1fa0, 0x1fa3, 0x03ce, 0x1f65, 0x1f64, 0x1f62, 0x1ff4, 0x1fa5, 0x1fa4, 0x1fa2, /* 0xc0 */ 0x1ff6, 0x1f67, 0x1f66, 0x03dc, 0x1ff7, 0x1fa7, 0x1fa6, 0, 0x1f76, 0x1f31, 0x1f30, 0x1f33, 0x1f7a, 0x1f51, 0x1f50, 0x1f53, /* 0xd0 */ 0x03af, 0x1f35, 0x1f34, 0x1f32, 0x03cd, 0x1f55, 0x1f54, 0x1f52, 0x1fd6, 0x1f37, 0x1f36, 0x03aa, 0x1fe6, 0x1f57, 0x1f56, 0x03ab, /* 0xe0 */ 0x1f72, 0x1f11, 0x1f10, 0x1f13, 0x1f78, 0x1f41, 0x1f40, 0x1f43, 0x03ad, 0x1f15, 0x1f14, 0x1f12, 0x03cc, 0x1f45, 0x1f44, 0x1f42, /* 0xf0 */ 0x03ca, 0x1fd2, 0x0390, 0x1fd7, 0x03cb, 0x1fe2, 0x03b0, 0x1fe7, 0x1fb3, 0x1fc3, 0x1ff3, 0x1fe5, 0x1fe4, 0, 0x0374, 0x0375 }; /* from enc/texmital.h */ static uint32_t m_cm_math_italics_encoding[256] = { /* 0x00 */ 0x0393, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x03a3, 0x03a5, 0x03a6, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03f5, /* 0x10 */ 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03d5, 0x03c7, /* 0x20 */ 0x03c8, 0x03c9, 0x03b5, 0x03d1, 0x03d6, 0x03f1, 0x03c2, 0x03c6, 0x21bc, 0x21bd, 0x21c0, 0x21c1, 0, 0, 0x22b3, 0x22b2, /* 0x30 */ 0xf730, 0xf731, 0xf732, 0xf733, 0xf734, 0xf735, 0xf736, 0xf737, 0xf738, 0xf739, 0x002e, 0x002c, 0x003c, 0x002f, 0x003e, 0x22c6, /* 0x40 */ 0x2202, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, /* 0x50 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x266d, 0x266e, 0x266f, 0x2323, 0x2322, /* 0x60 */ 0x2113, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, /* 0x70 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x0131, 0xf6be, 0x2118, 0x10fffb, 0x2040, /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static uint32_t m_bbold_encoding[256] = { /* 0x00 */ 0x0393, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x03a3, 0x03a5, 0x03a6, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03f5, /* 0x10 */ 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03d5, 0x03c7, /* 0x20 */ 0x03c8, 0x0021, 0x201c, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, /* 0x30 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x00a1, 0x003d, 0x00bf, 0x003f, /* 0x40 */ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, /* 0x50 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x0028, 0x0029, /* 0x60 */ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, /* 0x70 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x002d, 0x007c, 0x2013, 0x201d, 0x03c9, /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* from enc/texmext.h */ static uint32_t m_cm_math_extended_encoding[256] = { /* 0x00 */ 0x10ff00, 0x10ff01, 0x10ff02, 0x10ff03, 0x10ff04, 0x10ff05, 0x10ff06, 0x10ff07, 0x10ff08, 0x10ff09, 0x10ff0a, 0x10ff0b, 0x10ff0c, 0x10ff0d, 0x10ff0e, 0x10ff0f, /* 0x10 */ 0x10ff10, 0x10ff11, 0x10ff12, 0x10ff13, 0x10ff14, 0x10ff15, 0x10ff16, 0x10ff17, 0x10ff18, 0x10ff19, 0x10ff1a, 0x10ff1b, 0x10ff1c, 0x10ff1d, 0x10ff1e, 0x10ff1f, /* 0x20 */ 0x10ff20, 0x10ff21, 0x10ff22, 0x10ff23, 0x10ff24, 0x10ff25, 0x10ff26, 0x10ff27, 0x10ff28, 0x10ff29, 0x10ff2a, 0x10ff2b, 0x10ff2c, 0x10ff2d, 0x10ff2e, 0x10ff2f, /* 0x30 */ 0xf8eb, 0xf8f6, 0xf8ee, 0xf8f9, 0xf8f0, 0xf8fb, 0xf8ef, 0xf8fa, 0xf8f1, 0xf8fc, 0xf8f3, 0xf8fe, 0xf8f2, 0xf8fd, 0xf8f4, 0xf8e6, /* 0x40 */ 0xf8ed, 0xf8f8, 0xf8ec, 0xf8f7, 0x10ff44, 0x10ff45, 0x10ff46, 0x10ff47, 0x10ff48, 0x10ff49, 0x10ff4a, 0x10ff4b, 0x10ff4c, 0x10ff4d, 0x10ff4e, 0x10ff4f, /* 0x50 */ 0x10ff50, 0x10ff51, 0x10ff52, 0x10ff53, 0x10ff54, 0x10ff55, 0x10ff56, 0x10ff57, 0x10ff58, 0x10ff59, 0x10ff5a, 0x10ff5b, 0x10ff5c, 0x10ff5d, 0x10ff5e, 0x10ff5f, /* 0x60 */ 0x10ff60, 0x10ff61, 0x10ff62, 0x10ff63, 0x10ff64, 0x10ff65, 0x10ff66, 0x10ff67, 0x10ff68, 0x10ff69, 0x10ff6a, 0x10ff6b, 0x10ff6c, 0x10ff6d, 0x10ff6e, 0x10ff6f, /* 0x70 */ 0x10ff70, 0x10ff71, 0x10ff72, 0x10ff73, 0x10ff74, 0x10ff75, 0x10ff76, 0x10ff77, 0x10ff78, 0x10ff79, 0x10ff7a, 0x10ff7b, 0x10ff7c, 0x10ff7d, 0x10ff7e, 0x10ff7f, /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* from enc/textt.h */ static uint32_t m_cm_typewriter_encoding[256] = { /* 0x00 */ 0x0393, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x03a3, 0x03a5, 0x03a6, 0x03a8, 0x03a9, 0x2191, 0x2193, 0x0027, 0x00a1, 0x00bf, /* 0x10 */ 0x0131, 0xf6be, 0x0060, 0x00b4, 0x02c7, 0x02d8, 0x00af, 0x02da, 0x00b8, 0x00df, 0x00e6, 0x0153, 0x00f8, 0x00c6, 0x0152, 0x00d8, /* 0x20 */ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, /* 0x30 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, /* 0x40 */ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, /* 0x50 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x02c6, 0x005f, /* 0x60 */ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, /* 0x70 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x02dc, 0x00a8, /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* from enc/ot1.h */ static uint32_t m_ot1_encoding[256] = { /* 0x00 */ 0x0393, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x03a3, 0x03a5, 0x03a6, 0x03a8, 0x03a9, 0xfb00, 0xfb01, 0xfb02, 0xfb03, 0xfb04, /* 0x10 */ 0x0131, 0xf6be, 0x0060, 0x00b4, 0x02c7, 0x02d8, 0x00af, 0x02da, 0x00b8, 0x00df, 0x00e6, 0x0153, 0x00f8, 0x00c6, 0x0152, 0x00d8, /* 0x20 */ 0x0020, 0x0021, 0x201c, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, /* 0x30 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x00a1, 0x003d, 0x00bf, 0x003f, /* 0x40 */ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, /* 0x50 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x201d, 0x005d, 0x02c6, 0x02d9, /* 0x60 */ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, /* 0x70 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x2013, 0x2014, 0x0022, 0x02dc, 0x00a8, /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* Cyrilic e.g. fro larm1000.mf; from http://www.tug.org/tex-archive/macros/latex/contrib/t2/enc-maps/OT2uni.map */ static uint32_t m_t2_encoding[256] = { 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00a8, 0x02dd, 0x02da, 0x02c7, 0x02d8, 0x00af, 0x02d9, 0x00b8, 0x02db, 0x04c0, 0x2329, 0x232a, /* 0x10 */ 0x201c, 0x201d, 0xf6d5, 0xf6d6, 0xf6d4, 0x2013, 0x2014, 0xfeff, 0x2080, 0x0131, 0xf6be, 0xfb00, 0xfb01, 0xfb02, 0xfb03, 0xfb04, /* 0x20 */ 0x2420, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, /* 0x30 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, /* 0x40 */ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, /* 0x50 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, /* 0x60 */ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, /* 0x70 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x002d, /* 0x80 */ 0x0490, 0x0492, 0x0402, 0x040b, 0x04ba, 0x0496, 0x0498, 0x0409, 0x0407, 0x049a, 0x04a0, 0x049c, 0x04d4, 0x04a2, 0x04a4, 0x0405, /* 0x90 */ 0x04e8, 0x04aa, 0x040e, 0x04ae, 0x04b0, 0x04b2, 0x040f, 0x04b8, 0x04b6, 0x0404, 0x04d8, 0x040a, 0x0401, 0x2116, 0x00a4, 0x00a7, /* 0xa0 */ 0x0491, 0x0493, 0x0452, 0x045b, 0x04bb, 0x0497, 0x0499, 0x0459, 0x0457, 0x049b, 0x04a1, 0x049d, 0x04d5, 0x04a3, 0x04a5, 0x0455, /* 0xb0 */ 0x04e9, 0x04ab, 0x045e, 0x04af, 0x04b1, 0x04b3, 0x045f, 0x04b9, 0x04b7, 0x0454, 0x04d9, 0x045a, 0x0451, 0x201e, 0x00ab, 0x00bb, /* 0xc0 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0xd0 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xe0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xf0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, }; /* from enc/cork.h */ static uint32_t m_cork_encoding[256] = { /* 0x00 */ 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00a8, 0x02dd, 0x02da, 0x02c7, 0x02d8, 0x00af, 0x02d9, 0x00b8, 0x02db, 0x201a, 0x2039, 0x203a, /* 0x10 */ 0x201c, 0x201d, 0x201e, 0x00ab, 0x00bb, 0x2013, 0x2014, 0x0020, 0x0030, 0x0131, 0xf6be, 0xfb00, 0xfb01, 0xfb02, 0xfb03, 0xfb04, /* 0x20 */ 0x2420, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, /* 0x30 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, /* 0x40 */ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, /* 0x50 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, /* 0x60 */ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, /* 0x70 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x002d, /* 0x80 */ 0x0102, 0x0104, 0x0106, 0x010c, 0x010e, 0x011a, 0x0118, 0x011e, 0x0139, 0x013d, 0x0141, 0x0143, 0x0147, 0x10ffff, 0x0150, 0x0154, /* 0x90 */ 0x0158, 0x015a, 0x0160, 0x015e, 0x0164, 0x0162, 0x0170, 0x016e, 0x0178, 0x0179, 0x017d, 0x017b, 0x0132, 0x0130, 0x0111, 0x00a7, /* 0xa0 */ 0x0103, 0x0105, 0x0107, 0x010d, 0x010f, 0x011b, 0x0119, 0x011f, 0x013a, 0x013e, 0x0142, 0x0144, 0x0148, 0x10fffe, 0x0151, 0x0155, /* 0xb0 */ 0x0159, 0x015b, 0x0161, 0x015f, 0x0165, 0x0163, 0x0171, 0x016f, 0x00FF, 0x017a, 0x017e, 0x017c, 0x0133, 0x00a1, 0x00bf, 0x00a3, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0152, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x10fffd, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0153, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00df }; /* Newly created ts1-lm.h, which we use for TC (textcomp) fonts. This only gets the accents and stuff from iso-latin1 right; lots of the special characters aren't defined in the Adobe lookup list used by catdvi's `pse2unic'. */ static uint32_t m_ts1_encoding[256] = { /* 0x00 */ 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00a8, 0x02dd, 0x02da, 0x02c7, 0x02d8, 0, 0x02d9, 0x00b8, 0x02db, 0, 0, 0, /* 0x10 */ 0, 0, 0, 0, 0, 0x2013, 0xf6de, 0, 0x2190, 0x2192, 0, 0, 0, 0, 0, 0, /* 0x20 */ 0, 0, 0, 0, 0x0024, 0, 0, 0, 0, 0, 0x2217, 0, 0x002c, 0, 0x002e, 0, /* 0x30 */ 0xf730, 0xf731, 0xf732, 0xf733, 0xf734, 0xf735, 0xf736, 0xf737, 0xf738, 0xf739, 0, 0, 0x2329, 0x2212, 0x232a, 0, /* 0x40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2191, 0x2193, /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x266a, 0, /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x007e, 0x003d, /* 0x80 */ 0, 0, 0, 0, 0x2020, 0x2021, 0, 0x2030, 0x2022, 0, 0xf724, 0xf7a2, 0x0192, 0x20a1, 0, 0, /* 0x90 */ 0, 0, 0x20a4, 0, 0, 0, 0x20ab, 0x2122, 0, 0, 0, 0, 0, 0x212e, 0x25e6, 0, /* 0xa0 */ 0, 0, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0, 0x00a9, 0x00aa, 0, 0x00ac, 0, 0x00ae, 0, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0, 0, 0x00b6, 0x00b7, 0, 0x00b9, 0x00ba, 0x221a, 0x00bc, 0x00bd, 0x00be, 0x20ac, /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0x00d7, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0x00f7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* blackletter fonts with funny encodings */ static uint32_t m_yfrak_encoding[176] = { /* 0x00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */ 0x0131, 0xF6BE, 0x0060, 0x00b4, 0x02c7, 0x02d8, 0x00af, 0x02da, 0x00b8, 0, 0x00df, 0, 0, 0, 0, 0, /* 0x20 */ 0, 0x0021, 0x0022, 0x0023, 0, 0x0025, 0, 0x2019, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, /* 0x30 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0, 0x003c, 0x003d, 0, 0x003f, /* 0x40 */ 0, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, /* 0x50 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x00ab, 0x005d, 0x005e, 0x02d9, /* 0x60 */ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, /* 0x70 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x2013, 0x2014, 0x00a8, 0x02dd, 0, /* 0x80 */ /* ch/ck ligatures treated as special cases */ 0, 0xfb00, 0xfb05, 0xfb00, 0xfb00, 0, 0, 0, 0, 0x00e4, 0x00e4, 0, 0, 0x0073, 0, 0, /* 0x90 */ 0x00eb, 0x00eb, 0, 0, 0, 0, 0, 0, 0, 0x00f6, 0x00f6, 0, 0, 0, 0x00fc, 0x00fc, /* 0xa0 */ 0, 0, 0, 0, 0x00B6, 0, 0, 0 /* sz */, 0, 0, 0, 0, 0, 0, 0, 0 }; /* Mapping table of adobe character names (from .enc files) to Unicode IDs. Taken from catdvi's adobetbl.h; the original glyph list is available from: http://partners.adobe.com/asn/tech/type/glyphlist.txt All `private space' entries have been removed (I think they are of not much use). The names beginning with `$' have been added by the catdvi developers. Changes: - The macros DUP1/DUP2 have been #if 0'ed because I didn't understand them. - `.notdef' has been replaced by 0 to remove ambiguity with the real question mark. The list is sorted for strcmp() so that we can use bsearch() on it. */ static struct adobe2unicode adobe2unicode_table[] = { { "$Delta" , 0x0394 }, /* GREEK CAPITAL LETTER DELTA; distinguish Adobe duplicates */ { "$Ohm" , 0x2126 }, /* OHM SIGN; distinguish Adobe duplicates */ { "$Omega" , 0x03A9 }, /* GREEK CAPITAL LETTER OMEGA; distinguish Adobe duplicates */ { "$Scedilla" , 0x015E }, /* LATIN CAPITAL LETTER S WITH CEDILLA; distinguish Adobe duplicates */ { "$Tcedilla", 0x0162 }, /* LATIN CAPITAL LETTER T WITH CEDILLA; distinguish Adobe duplicates */ { "$Tcommaaccent", 0x021A }, /* LATIN CAPITAL LETTER T WITH COMMA BELOW; distinguish Adobe duplicates */ { "$acutemodifier", 0x02CA }, /* MODIFIER LETTER ACUTE ACCENT */ { "$arrowdblupdn", 0x21D5 }, /* UP DOWN DOUBLE ARROW */ { "$arrownortheast", 0x2197 }, /* NORTH EAST ARROW */ { "$arrownorthwest", 0x2196 }, /* NORTH WEST ARROW */ { "$arrowsoutheast", 0x2198 }, /* SOUTH EAST ARROW */ { "$arrowsouthwest", 0x2199 }, /* SOUTH WEST ARROW */ { "$brevecomb", 0x0306 }, /* COMBINING BREVE */ { "$bulletmath" , 0x2219 }, /* BULLET OPERATOR; distinguish Adobe duplicates */ { "$caroncomb", 0x030C }, /* COMBINING CARON */ { "$cedillacomb", 0x0327 }, /* COMBINING CEDILLA */ { "$ceilingleft", 0x2308 }, /* LEFT CEILING */ { "$ceilingright", 0x2309 }, /* RIGHT CEILING */ { "$circlecomb", 0x20DD }, /* COMBINING ENCLOSING CIRCLE */ { "$circledivide", 0x2298 }, /* CIRCLED DIVISION SLASH */ { "$circledot", 0x2299 }, /* CIRCLED DOT OPERATOR */ { "$circlelarge", 0x25EF }, /* LARGE CIRCLE */ { "$circleminus", 0x2296 }, /* CIRCLED MINUS */ { "$circumflexcomb", 0x0302 }, /* COMBINING CIRCUMFLEX ACCENT */ { "$contintegral", 0x222E }, /* CONTOUR INTEGRAL */ { "$coproduct", 0x2210 }, /* N-ARY COPRODUCT */ { "$diamondmath", 0x22C4 }, /* DIAMOND OPERATOR */ { "$dieresiscomb", 0x0308 }, /* COMBINING DIAERESIS */ { "$divisionslash", 0x2215 }, /* DIVISION SLASH; distinguish Adobe duplicates */ { "$dotaccentcomb", 0x0307 }, /* COMBINING DOT ABOVE */ { "$epsilon1", 0x03F5 }, /* GREEK LUNATE EPSILON SYMBOL */ { "$equivasymptotic", 0x224D }, /* EQUIVALENT TO */ { "$flat", 0x266D }, /* MUSIC FLAT SIGN */ { "$floorleft", 0x230A }, /* LEFT FLOOR */ { "$floorright", 0x230B }, /* RIGHT FLOOR */ { "$follows", 0x227B }, /* SUCCEEDS */ { "$followsequal", 0x227D }, /* SUCCEEDS OR EQUAL TO */ { "$fractionslash", 0x2044 }, /* FRACTION SLASH; distinguish Adobe duplicates */ { "$frown", 0x2322 }, /* FROWN */ { "$gravemodifier", 0x02CB }, /* MODIFIER LETTER GRAVE ACCENT */ { "$greatermuch", 0x226B }, /* MUCH GREATER-THAN */ { "$harpoonleftbarbdown", 0x21BD }, /* LEFTWARDS HARPOON WITH BARB DOWNWARDS */ { "$harpoonleftbarbup", 0x21BC }, /* LEFTWARDS HARPOON WITH BARB UPWARDS */ { "$harpoonrightbarbdown", 0x21C1 }, /* RIGHTWARDS HARPOON WITH BARB DOWNWARDS */ { "$harpoonrightbarbup", 0x21C0 }, /* RIGHTWARDS HARPOON WITH BARB UPWARDS */ { "$hyphen" , 0x002D }, /* HYPHEN-MINUS; distinguish Adobe duplicates */ { "$hyphensoft" , 0x00AD }, /* SOFT HYPHEN; distinguish Adobe duplicates */ { "$increment" , 0x2206 }, /* INCREMENT; distinguish Adobe duplicates */ { "$intersectionsq", 0x2293 }, /* SQUARE CAP */ { "$latticetop", 0x22A4 }, /* DOWN TACK */ { "$lessmuch", 0x226A }, /* MUCH-LESS THAN */ { "$longst", 0xFB05 }, /* LATIN SMALL LIGATURE LONG S T */ { "$lscript", 0x2113 }, /* SCRIPT SMALL L; Adobe has this as "afii61289" */ { "$macron", 0x00AF }, /* MACRON; distinguish Adobe duplicates */ { "$macroncomb", 0x0304 }, /* COMBINING MACRON */ { "$macronmodifier", 0x02C9 }, /* MODIFIER LETTER MACRON */ { "$micro", 0x00B5 }, /* MICRO SIGN; distinguish Adobe duplicates */ { "$minusplus", 0x2213 }, /* MINUS-OR-PLUS SIGN */ { "$mu", 0x03BC }, /* GREEK SMALL LETTER MU; distinguish Adobe duplicates */ { "$natural", 0x266E }, /* MUSIC NATURAL SIGN */ { "$normalin", 0x22B2 }, /* NORMAL SUBGROUP OF */ { "$normalizes", 0x22B3 }, /* CONTAINS AS NORMAL SUBGROUP */ { "$ogonekcomb", 0x0328 }, /* COMBINING OGONEK */ { "$overlinecomb", 0x0305 }, /* COMBINING OVERLINE */ { "$parallel", 0x2225 }, /* PARALLEL TO */ { "$periodcentered" , 0x00B7 }, /* MIDDLE DOT; distinguish Adobe duplicates */ { "$pi1", 0x03D6 }, /* GREEK PI SYMBOL; Adobe has this as "omega1" which is too confusing */ { "$precedes", 0x227A }, /* PRECEDES */ { "$precedesequal", 0x227C }, /* PRECEDES OR EQUAL TO */ { "$quotedblreversed", 0x201F }, /* DOUBLE HIGH-REVERSED-9 QUOTATION MARK */ { "$reflexnormalin", 0x22B4 }, /* NORMAL SUBGROUP OF OR EQUAL TO */ { "$reflexnormalizes", 0x22B5 }, /* CONTAINS AS NORMAL SUBGROUP OR EQUAL TO */ { "$reflexsubsetsq", 0x2291 }, /* SQUARE IMAGE OF OR EQUAL TO */ { "$reflexsupersetsq", 0x2292 }, /* SQUARE ORIGINAL OF OR EQUAL TO */ { "$rho1", 0x03F1 }, /* GREEK RHO SYMBOL */ { "$ringcomb", 0x030A }, /* COMBINING RING ABOVE */ { "$scedilla" , 0x015F }, /* LATIN SMALL LETTER S WITH CEDILLA; distinguish Adobe duplicates */ { "$sharp", 0x266F }, /* MUSIC SHARP SIGN */ { "$similarequal", 0x2243 }, /* ASYMPTOTICALLY EQUAL TO */ { "$slashlongcomb", 0x0338 }, /* COMBINING LONG SOLIDUS OVERLAY */ { "$smile", 0x2323 }, /* SMILE */ { "$space" , 0x0020 }, /* SPACE; distinguish Adobe duplicates */ { "$spacenobreak" , 0x00A0 }, /* NO-BREAK SPACE; distinguish Adobe duplicates */ { "$spacesymbol", 0x2420 }, /* SYMBOL FOR SPACE */ { "$st", 0xFB06 }, /* LATIN SMALL LIGATURE ST */ { "$starmath", 0x22C6 }, /* STAR OPERATOR */ { "$tcedilla", 0x0163 }, /* LATIN SMALL LETTER T WITH CEDILLA; distinguish Adobe duplicates */ { "$tcommaaccent", 0x021B }, /* LATIN SMALL LETTER T WITH COMMA BELOW; distinguish Adobe duplicates */ { "$tie", 0x2040 }, /* CHARACTER TIE */ { "$triagwhitedn", 0x25BD }, /* WHITE DOWN-POINTING TRIANGLE */ { "$triagwhiteup", 0x25B3 }, /* WHITE UP-POINTING TRIANGLE */ { "$turnstileleft", 0x22A2 }, /* RIGHT TACK */ { "$turnstileright", 0x22A3 }, /* LEFT TACK */ { "$unionmulti", 0x228E }, /* MULTISET UNION */ { "$unionsq", 0x2294 }, /* SQUARE CUP */ { "$vectorcomb", 0x20D7 }, /* COMBINING RIGHT ARROW ABOVE */ { "$wreathproduct", 0x2240 }, /* WREATH PRODUCT */ { ".notdef", 0 }, /* was: QUESTION MARK; changed to 0 */ { "A", 0x0041 }, /* LATIN CAPITAL LETTER A */ { "AE", 0x00C6 }, /* LATIN CAPITAL LETTER AE */ { "AEacute", 0x01FC }, /* LATIN CAPITAL LETTER AE WITH ACUTE */ { "AEsmall", 0xF7E6 }, /* LATIN SMALL CAPITAL LETTER AE */ { "Aacute", 0x00C1 }, /* LATIN CAPITAL LETTER A WITH ACUTE */ { "Aacutesmall", 0xF7E1 }, /* LATIN SMALL CAPITAL LETTER A WITH ACUTE */ { "Abreve", 0x0102 }, /* LATIN CAPITAL LETTER A WITH BREVE */ { "Acircumflex", 0x00C2 }, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ { "Acircumflexsmall", 0xF7E2 }, /* LATIN SMALL CAPITAL LETTER A WITH CIRCUMFLEX */ { "Acute", 0xF6C9 }, /* CAPITAL ACUTE ACCENT */ { "Acutesmall", 0xF7B4 }, /* SMALL CAPITAL ACUTE ACCENT */ { "Adieresis", 0x00C4 }, /* LATIN CAPITAL LETTER A WITH DIAERESIS */ { "Adieresissmall", 0xF7E4 }, /* LATIN SMALL CAPITAL LETTER A WITH DIAERESIS */ { "Agrave", 0x00C0 }, /* LATIN CAPITAL LETTER A WITH GRAVE */ { "Agravesmall", 0xF7E0 }, /* LATIN SMALL CAPITAL LETTER A WITH GRAVE */ { "Alpha", 0x0391 }, /* GREEK CAPITAL LETTER ALPHA */ { "Alphatonos", 0x0386 }, /* GREEK CAPITAL LETTER ALPHA WITH TONOS */ { "Amacron", 0x0100 }, /* LATIN CAPITAL LETTER A WITH MACRON */ { "Aogonek", 0x0104 }, /* LATIN CAPITAL LETTER A WITH OGONEK */ { "Aring", 0x00C5 }, /* LATIN CAPITAL LETTER A WITH RING ABOVE */ { "Aringacute", 0x01FA }, /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */ { "Aringsmall", 0xF7E5 }, /* LATIN SMALL CAPITAL LETTER A WITH RING ABOVE */ { "Asmall", 0xF761 }, /* LATIN SMALL CAPITAL LETTER A */ { "Atilde", 0x00C3 }, /* LATIN CAPITAL LETTER A WITH TILDE */ { "Atildesmall", 0xF7E3 }, /* LATIN SMALL CAPITAL LETTER A WITH TILDE */ { "B", 0x0042 }, /* LATIN CAPITAL LETTER B */ { "Beta", 0x0392 }, /* GREEK CAPITAL LETTER BETA */ { "Brevesmall", 0xF6F4 }, /* SMALL CAPITAL BREVE */ { "Bsmall", 0xF762 }, /* LATIN SMALL CAPITAL LETTER B */ { "C", 0x0043 }, /* LATIN CAPITAL LETTER C */ { "Cacute", 0x0106 }, /* LATIN CAPITAL LETTER C WITH ACUTE */ { "Caron", 0xF6CA }, /* CAPITAL CARON */ { "Caronsmall", 0xF6F5 }, /* SMALL CAPITAL CARON */ { "Ccaron", 0x010C }, /* LATIN CAPITAL LETTER C WITH CARON */ { "Ccedilla", 0x00C7 }, /* LATIN CAPITAL LETTER C WITH CEDILLA */ { "Ccedillasmall", 0xF7E7 }, /* LATIN SMALL CAPITAL LETTER C WITH CEDILLA */ { "Ccircumflex", 0x0108 }, /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ { "Cdotaccent", 0x010A }, /* LATIN CAPITAL LETTER C WITH DOT ABOVE */ { "Cedillasmall", 0xF7B8 }, /* SMALL CAPITAL CEDILLA */ { "Chi", 0x03A7 }, /* GREEK CAPITAL LETTER CHI */ { "Circumflexsmall", 0xF6F6 }, /* SMALL CAPITAL MODIFIER LETTER CIRCUMFLEX ACCENT */ { "Csmall", 0xF763 }, /* LATIN SMALL CAPITAL LETTER C */ { "D", 0x0044 }, /* LATIN CAPITAL LETTER D */ { "Dcaron", 0x010E }, /* LATIN CAPITAL LETTER D WITH CARON */ { "Dcroat", 0x0110 }, /* LATIN CAPITAL LETTER D WITH STROKE */ { "Delta", 0x2206 }, /* INCREMENT */ #if 0 { "Delta" DUP2, 0x0394 }, /* GREEK CAPITAL LETTER DELTA;Duplicate */ #endif /* 0 */ { "Dieresis", 0xF6CB }, /* CAPITAL DIAERESIS */ { "DieresisAcute", 0xF6CC }, /* CAPITAL DIAERESIS ACUTE ACCENT */ { "DieresisGrave", 0xF6CD }, /* CAPITAL DIAERESIS GRAVE ACCENT */ { "Dieresissmall", 0xF7A8 }, /* SMALL CAPITAL DIAERESIS */ { "Dotaccentsmall", 0xF6F7 }, /* SMALL CAPITAL DOT ABOVE */ { "Dsmall", 0xF764 }, /* LATIN SMALL CAPITAL LETTER D */ { "E", 0x0045 }, /* LATIN CAPITAL LETTER E */ { "Eacute", 0x00C9 }, /* LATIN CAPITAL LETTER E WITH ACUTE */ { "Eacutesmall", 0xF7E9 }, /* LATIN SMALL CAPITAL LETTER E WITH ACUTE */ { "Ebreve", 0x0114 }, /* LATIN CAPITAL LETTER E WITH BREVE */ { "Ecaron", 0x011A }, /* LATIN CAPITAL LETTER E WITH CARON */ { "Ecircumflex", 0x00CA }, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ { "Ecircumflexsmall", 0xF7EA }, /* LATIN SMALL CAPITAL LETTER E WITH CIRCUMFLEX */ { "Edieresis", 0x00CB }, /* LATIN CAPITAL LETTER E WITH DIAERESIS */ { "Edieresissmall", 0xF7EB }, /* LATIN SMALL CAPITAL LETTER E WITH DIAERESIS */ { "Edotaccent", 0x0116 }, /* LATIN CAPITAL LETTER E WITH DOT ABOVE */ { "Egrave", 0x00C8 }, /* LATIN CAPITAL LETTER E WITH GRAVE */ { "Egravesmall", 0xF7E8 }, /* LATIN SMALL CAPITAL LETTER E WITH GRAVE */ { "Emacron", 0x0112 }, /* LATIN CAPITAL LETTER E WITH MACRON */ { "Eng", 0x014A }, /* LATIN CAPITAL LETTER ENG */ { "Eogonek", 0x0118 }, /* LATIN CAPITAL LETTER E WITH OGONEK */ { "Epsilon", 0x0395 }, /* GREEK CAPITAL LETTER EPSILON */ { "Epsilontonos", 0x0388 }, /* GREEK CAPITAL LETTER EPSILON WITH TONOS */ { "Esmall", 0xF765 }, /* LATIN SMALL CAPITAL LETTER E */ { "Eta", 0x0397 }, /* GREEK CAPITAL LETTER ETA */ { "Etatonos", 0x0389 }, /* GREEK CAPITAL LETTER ETA WITH TONOS */ { "Eth", 0x00D0 }, /* LATIN CAPITAL LETTER ETH */ { "Ethsmall", 0xF7F0 }, /* LATIN SMALL CAPITAL LETTER ETH */ { "Euro", 0x20AC }, /* EURO SIGN */ { "F", 0x0046 }, /* LATIN CAPITAL LETTER F */ { "Fsmall", 0xF766 }, /* LATIN SMALL CAPITAL LETTER F */ { "G", 0x0047 }, /* LATIN CAPITAL LETTER G */ { "Gamma", 0x0393 }, /* GREEK CAPITAL LETTER GAMMA */ { "Gbreve", 0x011E }, /* LATIN CAPITAL LETTER G WITH BREVE */ { "Gcaron", 0x01E6 }, /* LATIN CAPITAL LETTER G WITH CARON */ { "Gcircumflex", 0x011C }, /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ { "Gcommaaccent", 0x0122 }, /* LATIN CAPITAL LETTER G WITH CEDILLA */ { "Gdotaccent", 0x0120 }, /* LATIN CAPITAL LETTER G WITH DOT ABOVE */ { "Grave", 0xF6CE }, /* CAPITAL GRAVE ACCENT */ { "Gravesmall", 0xF760 }, /* SMALL CAPITAL GRAVE ACCENT */ { "Gsmall", 0xF767 }, /* LATIN SMALL CAPITAL LETTER G */ { "H", 0x0048 }, /* LATIN CAPITAL LETTER H */ { "H18533", 0x25CF }, /* BLACK CIRCLE */ { "H18543", 0x25AA }, /* BLACK SMALL SQUARE */ { "H18551", 0x25AB }, /* WHITE SMALL SQUARE */ { "H22073", 0x25A1 }, /* WHITE SQUARE */ { "Hbar", 0x0126 }, /* LATIN CAPITAL LETTER H WITH STROKE */ { "Hcircumflex", 0x0124 }, /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ { "Hsmall", 0xF768 }, /* LATIN SMALL CAPITAL LETTER H */ { "Hungarumlaut", 0xF6CF }, /* CAPITAL DOUBLE ACUTE ACCENT */ { "Hungarumlautsmall", 0xF6F8 }, /* SMALL CAPITAL DOUBLE ACUTE ACCENT */ { "I", 0x0049 }, /* LATIN CAPITAL LETTER I */ { "IJ", 0x0132 }, /* LATIN CAPITAL LIGATURE IJ */ { "Iacute", 0x00CD }, /* LATIN CAPITAL LETTER I WITH ACUTE */ { "Iacutesmall", 0xF7ED }, /* LATIN SMALL CAPITAL LETTER I WITH ACUTE */ { "Ibreve", 0x012C }, /* LATIN CAPITAL LETTER I WITH BREVE */ { "Icircumflex", 0x00CE }, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ { "Icircumflexsmall", 0xF7EE }, /* LATIN SMALL CAPITAL LETTER I WITH CIRCUMFLEX */ { "Idieresis", 0x00CF }, /* LATIN CAPITAL LETTER I WITH DIAERESIS */ { "Idieresissmall", 0xF7EF }, /* LATIN SMALL CAPITAL LETTER I WITH DIAERESIS */ { "Idotaccent", 0x0130 }, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */ { "Ifraktur", 0x2111 }, /* BLACK-LETTER CAPITAL I */ { "Igrave", 0x00CC }, /* LATIN CAPITAL LETTER I WITH GRAVE */ { "Igravesmall", 0xF7EC }, /* LATIN SMALL CAPITAL LETTER I WITH GRAVE */ { "Imacron", 0x012A }, /* LATIN CAPITAL LETTER I WITH MACRON */ { "Iogonek", 0x012E }, /* LATIN CAPITAL LETTER I WITH OGONEK */ { "Iota", 0x0399 }, /* GREEK CAPITAL LETTER IOTA */ { "Iotadieresis", 0x03AA }, /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ { "Iotatonos", 0x038A }, /* GREEK CAPITAL LETTER IOTA WITH TONOS */ { "Ismall", 0xF769 }, /* LATIN SMALL CAPITAL LETTER I */ { "Itilde", 0x0128 }, /* LATIN CAPITAL LETTER I WITH TILDE */ { "J", 0x004A }, /* LATIN CAPITAL LETTER J */ { "Jcircumflex", 0x0134 }, /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ { "Jsmall", 0xF76A }, /* LATIN SMALL CAPITAL LETTER J */ { "K", 0x004B }, /* LATIN CAPITAL LETTER K */ { "Kappa", 0x039A }, /* GREEK CAPITAL LETTER KAPPA */ { "Kcommaaccent", 0x0136 }, /* LATIN CAPITAL LETTER K WITH CEDILLA */ { "Ksmall", 0xF76B }, /* LATIN SMALL CAPITAL LETTER K */ { "L", 0x004C }, /* LATIN CAPITAL LETTER L */ { "LL", 0xF6BF }, /* LATIN CAPITAL LETTER LL */ { "Lacute", 0x0139 }, /* LATIN CAPITAL LETTER L WITH ACUTE */ { "Lambda", 0x039B }, /* GREEK CAPITAL LETTER LAMDA */ { "Lcaron", 0x013D }, /* LATIN CAPITAL LETTER L WITH CARON */ { "Lcommaaccent", 0x013B }, /* LATIN CAPITAL LETTER L WITH CEDILLA */ { "Ldot", 0x013F }, /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */ { "Lslash", 0x0141 }, /* LATIN CAPITAL LETTER L WITH STROKE */ { "Lslashsmall", 0xF6F9 }, /* LATIN SMALL CAPITAL LETTER L WITH STROKE */ { "Lsmall", 0xF76C }, /* LATIN SMALL CAPITAL LETTER L */ { "M", 0x004D }, /* LATIN CAPITAL LETTER M */ { "Macron", 0xF6D0 }, /* CAPITAL MACRON */ { "Macronsmall", 0xF7AF }, /* SMALL CAPITAL MACRON */ { "Msmall", 0xF76D }, /* LATIN SMALL CAPITAL LETTER M */ { "Mu", 0x039C }, /* GREEK CAPITAL LETTER MU */ { "N", 0x004E }, /* LATIN CAPITAL LETTER N */ { "Nacute", 0x0143 }, /* LATIN CAPITAL LETTER N WITH ACUTE */ { "Ncaron", 0x0147 }, /* LATIN CAPITAL LETTER N WITH CARON */ { "Ncommaaccent", 0x0145 }, /* LATIN CAPITAL LETTER N WITH CEDILLA */ { "Nsmall", 0xF76E }, /* LATIN SMALL CAPITAL LETTER N */ { "Ntilde", 0x00D1 }, /* LATIN CAPITAL LETTER N WITH TILDE */ { "Ntildesmall", 0xF7F1 }, /* LATIN SMALL CAPITAL LETTER N WITH TILDE */ { "Nu", 0x039D }, /* GREEK CAPITAL LETTER NU */ { "O", 0x004F }, /* LATIN CAPITAL LETTER O */ { "OE", 0x0152 }, /* LATIN CAPITAL LIGATURE OE */ { "OEsmall", 0xF6FA }, /* LATIN SMALL CAPITAL LIGATURE OE */ { "Oacute", 0x00D3 }, /* LATIN CAPITAL LETTER O WITH ACUTE */ { "Oacutesmall", 0xF7F3 }, /* LATIN SMALL CAPITAL LETTER O WITH ACUTE */ { "Obreve", 0x014E }, /* LATIN CAPITAL LETTER O WITH BREVE */ { "Ocircumflex", 0x00D4 }, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ { "Ocircumflexsmall", 0xF7F4 }, /* LATIN SMALL CAPITAL LETTER O WITH CIRCUMFLEX */ { "Odieresis", 0x00D6 }, /* LATIN CAPITAL LETTER O WITH DIAERESIS */ { "Odieresissmall", 0xF7F6 }, /* LATIN SMALL CAPITAL LETTER O WITH DIAERESIS */ { "Ogoneksmall", 0xF6FB }, /* SMALL CAPITAL OGONEK */ { "Ograve", 0x00D2 }, /* LATIN CAPITAL LETTER O WITH GRAVE */ { "Ogravesmall", 0xF7F2 }, /* LATIN SMALL CAPITAL LETTER O WITH GRAVE */ { "Ohorn", 0x01A0 }, /* LATIN CAPITAL LETTER O WITH HORN */ { "Ohungarumlaut", 0x0150 }, /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ { "Omacron", 0x014C }, /* LATIN CAPITAL LETTER O WITH MACRON */ { "Omega", 0x2126 }, /* OHM SIGN */ #if 0 { "Omega" DUP2, 0x03A9 }, /* GREEK CAPITAL LETTER OMEGA;Duplicate */ #endif /* 0 */ { "Omegatonos", 0x038F }, /* GREEK CAPITAL LETTER OMEGA WITH TONOS */ { "Omicron", 0x039F }, /* GREEK CAPITAL LETTER OMICRON */ { "Omicrontonos", 0x038C }, /* GREEK CAPITAL LETTER OMICRON WITH TONOS */ { "Oslash", 0x00D8 }, /* LATIN CAPITAL LETTER O WITH STROKE */ { "Oslashacute", 0x01FE }, /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */ { "Oslashsmall", 0xF7F8 }, /* LATIN SMALL CAPITAL LETTER O WITH STROKE */ { "Osmall", 0xF76F }, /* LATIN SMALL CAPITAL LETTER O */ { "Otilde", 0x00D5 }, /* LATIN CAPITAL LETTER O WITH TILDE */ { "Otildesmall", 0xF7F5 }, /* LATIN SMALL CAPITAL LETTER O WITH TILDE */ { "P", 0x0050 }, /* LATIN CAPITAL LETTER P */ { "Phi", 0x03A6 }, /* GREEK CAPITAL LETTER PHI */ { "Pi", 0x03A0 }, /* GREEK CAPITAL LETTER PI */ { "Psi", 0x03A8 }, /* GREEK CAPITAL LETTER PSI */ { "Psmall", 0xF770 }, /* LATIN SMALL CAPITAL LETTER P */ { "Q", 0x0051 }, /* LATIN CAPITAL LETTER Q */ { "Qsmall", 0xF771 }, /* LATIN SMALL CAPITAL LETTER Q */ { "R", 0x0052 }, /* LATIN CAPITAL LETTER R */ { "Racute", 0x0154 }, /* LATIN CAPITAL LETTER R WITH ACUTE */ { "Rcaron", 0x0158 }, /* LATIN CAPITAL LETTER R WITH CARON */ { "Rcommaaccent", 0x0156 }, /* LATIN CAPITAL LETTER R WITH CEDILLA */ { "Rfraktur", 0x211C }, /* BLACK-LETTER CAPITAL R */ { "Rho", 0x03A1 }, /* GREEK CAPITAL LETTER RHO */ { "Ringsmall", 0xF6FC }, /* SMALL CAPITAL RING ABOVE */ { "Rsmall", 0xF772 }, /* LATIN SMALL CAPITAL LETTER R */ { "S", 0x0053 }, /* LATIN CAPITAL LETTER S */ { "SF010000", 0x250C }, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */ { "SF020000", 0x2514 }, /* BOX DRAWINGS LIGHT UP AND RIGHT */ { "SF030000", 0x2510 }, /* BOX DRAWINGS LIGHT DOWN AND LEFT */ { "SF040000", 0x2518 }, /* BOX DRAWINGS LIGHT UP AND LEFT */ { "SF050000", 0x253C }, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ { "SF060000", 0x252C }, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ { "SF070000", 0x2534 }, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */ { "SF080000", 0x251C }, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ { "SF090000", 0x2524 }, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */ { "SF100000", 0x2500 }, /* BOX DRAWINGS LIGHT HORIZONTAL */ { "SF110000", 0x2502 }, /* BOX DRAWINGS LIGHT VERTICAL */ { "SF190000", 0x2561 }, /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE */ { "SF200000", 0x2562 }, /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE */ { "SF210000", 0x2556 }, /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE */ { "SF220000", 0x2555 }, /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE */ { "SF230000", 0x2563 }, /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT */ { "SF240000", 0x2551 }, /* BOX DRAWINGS DOUBLE VERTICAL */ { "SF250000", 0x2557 }, /* BOX DRAWINGS DOUBLE DOWN AND LEFT */ { "SF260000", 0x255D }, /* BOX DRAWINGS DOUBLE UP AND LEFT */ { "SF270000", 0x255C }, /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE */ { "SF280000", 0x255B }, /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE */ { "SF360000", 0x255E }, /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE */ { "SF370000", 0x255F }, /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE */ { "SF380000", 0x255A }, /* BOX DRAWINGS DOUBLE UP AND RIGHT */ { "SF390000", 0x2554 }, /* BOX DRAWINGS DOUBLE DOWN AND RIGHT */ { "SF400000", 0x2569 }, /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL */ { "SF410000", 0x2566 }, /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL */ { "SF420000", 0x2560 }, /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT */ { "SF430000", 0x2550 }, /* BOX DRAWINGS DOUBLE HORIZONTAL */ { "SF440000", 0x256C }, /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL */ { "SF450000", 0x2567 }, /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE */ { "SF460000", 0x2568 }, /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE */ { "SF470000", 0x2564 }, /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE */ { "SF480000", 0x2565 }, /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE */ { "SF490000", 0x2559 }, /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE */ { "SF500000", 0x2558 }, /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE */ { "SF510000", 0x2552 }, /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE */ { "SF520000", 0x2553 }, /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE */ { "SF530000", 0x256B }, /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE */ { "SF540000", 0x256A }, /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE */ { "Sacute", 0x015A }, /* LATIN CAPITAL LETTER S WITH ACUTE */ { "Scaron", 0x0160 }, /* LATIN CAPITAL LETTER S WITH CARON */ { "Scaronsmall", 0xF6FD }, /* LATIN SMALL CAPITAL LETTER S WITH CARON */ { "Scedilla", 0x015E }, /* LATIN CAPITAL LETTER S WITH CEDILLA */ #if 0 { "Scedilla" DUP2, 0xF6C1 }, /* LATIN CAPITAL LETTER S WITH CEDILLA;Duplicate */ #endif /* 0 */ { "Scircumflex", 0x015C }, /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ { "Scommaaccent", 0x0218 }, /* LATIN CAPITAL LETTER S WITH COMMA BELOW */ { "Sigma", 0x03A3 }, /* GREEK CAPITAL LETTER SIGMA */ { "Ssmall", 0xF773 }, /* LATIN SMALL CAPITAL LETTER S */ { "T", 0x0054 }, /* LATIN CAPITAL LETTER T */ { "Tau", 0x03A4 }, /* GREEK CAPITAL LETTER TAU */ { "Tbar", 0x0166 }, /* LATIN CAPITAL LETTER T WITH STROKE */ { "Tcaron", 0x0164 }, /* LATIN CAPITAL LETTER T WITH CARON */ { "Tcommaaccent", 0x0162 }, /* LATIN CAPITAL LETTER T WITH CEDILLA */ #if 0 { "Tcommaaccent" DUP2, 0x021A }, /* LATIN CAPITAL LETTER T WITH COMMA BELOW;Duplicate */ #endif /* 0 */ { "Theta", 0x0398 }, /* GREEK CAPITAL LETTER THETA */ { "Thorn", 0x00DE }, /* LATIN CAPITAL LETTER THORN */ { "Thornsmall", 0xF7FE }, /* LATIN SMALL CAPITAL LETTER THORN */ { "Tildesmall", 0xF6FE }, /* SMALL CAPITAL SMALL TILDE */ { "Tsmall", 0xF774 }, /* LATIN SMALL CAPITAL LETTER T */ { "U", 0x0055 }, /* LATIN CAPITAL LETTER U */ { "Uacute", 0x00DA }, /* LATIN CAPITAL LETTER U WITH ACUTE */ { "Uacutesmall", 0xF7FA }, /* LATIN SMALL CAPITAL LETTER U WITH ACUTE */ { "Ubreve", 0x016C }, /* LATIN CAPITAL LETTER U WITH BREVE */ { "Ucircumflex", 0x00DB }, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ { "Ucircumflexsmall", 0xF7FB }, /* LATIN SMALL CAPITAL LETTER U WITH CIRCUMFLEX */ { "Udieresis", 0x00DC }, /* LATIN CAPITAL LETTER U WITH DIAERESIS */ { "Udieresissmall", 0xF7FC }, /* LATIN SMALL CAPITAL LETTER U WITH DIAERESIS */ { "Ugrave", 0x00D9 }, /* LATIN CAPITAL LETTER U WITH GRAVE */ { "Ugravesmall", 0xF7F9 }, /* LATIN SMALL CAPITAL LETTER U WITH GRAVE */ { "Uhorn", 0x01AF }, /* LATIN CAPITAL LETTER U WITH HORN */ { "Uhungarumlaut", 0x0170 }, /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ { "Umacron", 0x016A }, /* LATIN CAPITAL LETTER U WITH MACRON */ { "Uogonek", 0x0172 }, /* LATIN CAPITAL LETTER U WITH OGONEK */ { "Upsilon", 0x03A5 }, /* GREEK CAPITAL LETTER UPSILON */ { "Upsilon1", 0x03D2 }, /* GREEK UPSILON WITH HOOK SYMBOL */ { "Upsilondieresis", 0x03AB }, /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ { "Upsilontonos", 0x038E }, /* GREEK CAPITAL LETTER UPSILON WITH TONOS */ { "Uring", 0x016E }, /* LATIN CAPITAL LETTER U WITH RING ABOVE */ { "Usmall", 0xF775 }, /* LATIN SMALL CAPITAL LETTER U */ { "Utilde", 0x0168 }, /* LATIN CAPITAL LETTER U WITH TILDE */ { "V", 0x0056 }, /* LATIN CAPITAL LETTER V */ { "Vsmall", 0xF776 }, /* LATIN SMALL CAPITAL LETTER V */ { "W", 0x0057 }, /* LATIN CAPITAL LETTER W */ { "Wacute", 0x1E82 }, /* LATIN CAPITAL LETTER W WITH ACUTE */ { "Wcircumflex", 0x0174 }, /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ { "Wdieresis", 0x1E84 }, /* LATIN CAPITAL LETTER W WITH DIAERESIS */ { "Wgrave", 0x1E80 }, /* LATIN CAPITAL LETTER W WITH GRAVE */ { "Wsmall", 0xF777 }, /* LATIN SMALL CAPITAL LETTER W */ { "X", 0x0058 }, /* LATIN CAPITAL LETTER X */ { "Xi", 0x039E }, /* GREEK CAPITAL LETTER XI */ { "Xsmall", 0xF778 }, /* LATIN SMALL CAPITAL LETTER X */ { "Y", 0x0059 }, /* LATIN CAPITAL LETTER Y */ { "Yacute", 0x00DD }, /* LATIN CAPITAL LETTER Y WITH ACUTE */ { "Yacutesmall", 0xF7FD }, /* LATIN SMALL CAPITAL LETTER Y WITH ACUTE */ { "Ycircumflex", 0x0176 }, /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ { "Ydieresis", 0x0178 }, /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ { "Ydieresissmall", 0xF7FF }, /* LATIN SMALL CAPITAL LETTER Y WITH DIAERESIS */ { "Ygrave", 0x1EF2 }, /* LATIN CAPITAL LETTER Y WITH GRAVE */ { "Ysmall", 0xF779 }, /* LATIN SMALL CAPITAL LETTER Y */ { "Z", 0x005A }, /* LATIN CAPITAL LETTER Z */ { "Zacute", 0x0179 }, /* LATIN CAPITAL LETTER Z WITH ACUTE */ { "Zcaron", 0x017D }, /* LATIN CAPITAL LETTER Z WITH CARON */ { "Zcaronsmall", 0xF6FF }, /* LATIN SMALL CAPITAL LETTER Z WITH CARON */ { "Zdotaccent", 0x017B }, /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */ { "Zeta", 0x0396 }, /* GREEK CAPITAL LETTER ZETA */ { "Zsmall", 0xF77A }, /* LATIN SMALL CAPITAL LETTER Z */ { "a", 0x0061 }, /* LATIN SMALL LETTER A */ { "aacute", 0x00E1 }, /* LATIN SMALL LETTER A WITH ACUTE */ { "abreve", 0x0103 }, /* LATIN SMALL LETTER A WITH BREVE */ { "acircumflex", 0x00E2 }, /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ { "acute", 0x00B4 }, /* ACUTE ACCENT */ { "acutecomb", 0x0301 }, /* COMBINING ACUTE ACCENT */ { "adieresis", 0x00E4 }, /* LATIN SMALL LETTER A WITH DIAERESIS */ { "ae", 0x00E6 }, /* LATIN SMALL LETTER AE */ { "aeacute", 0x01FD }, /* LATIN SMALL LETTER AE WITH ACUTE */ { "afii00208", 0x2015 }, /* HORIZONTAL BAR */ { "afii10017", 0x0410 }, /* CYRILLIC CAPITAL LETTER A */ { "afii10018", 0x0411 }, /* CYRILLIC CAPITAL LETTER BE */ { "afii10019", 0x0412 }, /* CYRILLIC CAPITAL LETTER VE */ { "afii10020", 0x0413 }, /* CYRILLIC CAPITAL LETTER GHE */ { "afii10021", 0x0414 }, /* CYRILLIC CAPITAL LETTER DE */ { "afii10022", 0x0415 }, /* CYRILLIC CAPITAL LETTER IE */ { "afii10023", 0x0401 }, /* CYRILLIC CAPITAL LETTER IO */ { "afii10024", 0x0416 }, /* CYRILLIC CAPITAL LETTER ZHE */ { "afii10025", 0x0417 }, /* CYRILLIC CAPITAL LETTER ZE */ { "afii10026", 0x0418 }, /* CYRILLIC CAPITAL LETTER I */ { "afii10027", 0x0419 }, /* CYRILLIC CAPITAL LETTER SHORT I */ { "afii10028", 0x041A }, /* CYRILLIC CAPITAL LETTER KA */ { "afii10029", 0x041B }, /* CYRILLIC CAPITAL LETTER EL */ { "afii10030", 0x041C }, /* CYRILLIC CAPITAL LETTER EM */ { "afii10031", 0x041D }, /* CYRILLIC CAPITAL LETTER EN */ { "afii10032", 0x041E }, /* CYRILLIC CAPITAL LETTER O */ { "afii10033", 0x041F }, /* CYRILLIC CAPITAL LETTER PE */ { "afii10034", 0x0420 }, /* CYRILLIC CAPITAL LETTER ER */ { "afii10035", 0x0421 }, /* CYRILLIC CAPITAL LETTER ES */ { "afii10036", 0x0422 }, /* CYRILLIC CAPITAL LETTER TE */ { "afii10037", 0x0423 }, /* CYRILLIC CAPITAL LETTER U */ { "afii10038", 0x0424 }, /* CYRILLIC CAPITAL LETTER EF */ { "afii10039", 0x0425 }, /* CYRILLIC CAPITAL LETTER HA */ { "afii10040", 0x0426 }, /* CYRILLIC CAPITAL LETTER TSE */ { "afii10041", 0x0427 }, /* CYRILLIC CAPITAL LETTER CHE */ { "afii10042", 0x0428 }, /* CYRILLIC CAPITAL LETTER SHA */ { "afii10043", 0x0429 }, /* CYRILLIC CAPITAL LETTER SHCHA */ { "afii10044", 0x042A }, /* CYRILLIC CAPITAL LETTER HARD SIGN */ { "afii10045", 0x042B }, /* CYRILLIC CAPITAL LETTER YERU */ { "afii10046", 0x042C }, /* CYRILLIC CAPITAL LETTER SOFT SIGN */ { "afii10047", 0x042D }, /* CYRILLIC CAPITAL LETTER E */ { "afii10048", 0x042E }, /* CYRILLIC CAPITAL LETTER YU */ { "afii10049", 0x042F }, /* CYRILLIC CAPITAL LETTER YA */ { "afii10050", 0x0490 }, /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ { "afii10051", 0x0402 }, /* CYRILLIC CAPITAL LETTER DJE */ { "afii10052", 0x0403 }, /* CYRILLIC CAPITAL LETTER GJE */ { "afii10053", 0x0404 }, /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */ { "afii10054", 0x0405 }, /* CYRILLIC CAPITAL LETTER DZE */ { "afii10055", 0x0406 }, /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ { "afii10056", 0x0407 }, /* CYRILLIC CAPITAL LETTER YI */ { "afii10057", 0x0408 }, /* CYRILLIC CAPITAL LETTER JE */ { "afii10058", 0x0409 }, /* CYRILLIC CAPITAL LETTER LJE */ { "afii10059", 0x040A }, /* CYRILLIC CAPITAL LETTER NJE */ { "afii10060", 0x040B }, /* CYRILLIC CAPITAL LETTER TSHE */ { "afii10061", 0x040C }, /* CYRILLIC CAPITAL LETTER KJE */ { "afii10062", 0x040E }, /* CYRILLIC CAPITAL LETTER SHORT U */ { "afii10063", 0xF6C4 }, /* CYRILLIC SMALL LETTER GHE VARIANT */ { "afii10064", 0xF6C5 }, /* CYRILLIC SMALL LETTER BE VARIANT */ { "afii10065", 0x0430 }, /* CYRILLIC SMALL LETTER A */ { "afii10066", 0x0431 }, /* CYRILLIC SMALL LETTER BE */ { "afii10067", 0x0432 }, /* CYRILLIC SMALL LETTER VE */ { "afii10068", 0x0433 }, /* CYRILLIC SMALL LETTER GHE */ { "afii10069", 0x0434 }, /* CYRILLIC SMALL LETTER DE */ { "afii10070", 0x0435 }, /* CYRILLIC SMALL LETTER IE */ { "afii10071", 0x0451 }, /* CYRILLIC SMALL LETTER IO */ { "afii10072", 0x0436 }, /* CYRILLIC SMALL LETTER ZHE */ { "afii10073", 0x0437 }, /* CYRILLIC SMALL LETTER ZE */ { "afii10074", 0x0438 }, /* CYRILLIC SMALL LETTER I */ { "afii10075", 0x0439 }, /* CYRILLIC SMALL LETTER SHORT I */ { "afii10076", 0x043A }, /* CYRILLIC SMALL LETTER KA */ { "afii10077", 0x043B }, /* CYRILLIC SMALL LETTER EL */ { "afii10078", 0x043C }, /* CYRILLIC SMALL LETTER EM */ { "afii10079", 0x043D }, /* CYRILLIC SMALL LETTER EN */ { "afii10080", 0x043E }, /* CYRILLIC SMALL LETTER O */ { "afii10081", 0x043F }, /* CYRILLIC SMALL LETTER PE */ { "afii10082", 0x0440 }, /* CYRILLIC SMALL LETTER ER */ { "afii10083", 0x0441 }, /* CYRILLIC SMALL LETTER ES */ { "afii10084", 0x0442 }, /* CYRILLIC SMALL LETTER TE */ { "afii10085", 0x0443 }, /* CYRILLIC SMALL LETTER U */ { "afii10086", 0x0444 }, /* CYRILLIC SMALL LETTER EF */ { "afii10087", 0x0445 }, /* CYRILLIC SMALL LETTER HA */ { "afii10088", 0x0446 }, /* CYRILLIC SMALL LETTER TSE */ { "afii10089", 0x0447 }, /* CYRILLIC SMALL LETTER CHE */ { "afii10090", 0x0448 }, /* CYRILLIC SMALL LETTER SHA */ { "afii10091", 0x0449 }, /* CYRILLIC SMALL LETTER SHCHA */ { "afii10092", 0x044A }, /* CYRILLIC SMALL LETTER HARD SIGN */ { "afii10093", 0x044B }, /* CYRILLIC SMALL LETTER YERU */ { "afii10094", 0x044C }, /* CYRILLIC SMALL LETTER SOFT SIGN */ { "afii10095", 0x044D }, /* CYRILLIC SMALL LETTER E */ { "afii10096", 0x044E }, /* CYRILLIC SMALL LETTER YU */ { "afii10097", 0x044F }, /* CYRILLIC SMALL LETTER YA */ { "afii10098", 0x0491 }, /* CYRILLIC SMALL LETTER GHE WITH UPTURN */ { "afii10099", 0x0452 }, /* CYRILLIC SMALL LETTER DJE */ { "afii10100", 0x0453 }, /* CYRILLIC SMALL LETTER GJE */ { "afii10101", 0x0454 }, /* CYRILLIC SMALL LETTER UKRAINIAN IE */ { "afii10102", 0x0455 }, /* CYRILLIC SMALL LETTER DZE */ { "afii10103", 0x0456 }, /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ { "afii10104", 0x0457 }, /* CYRILLIC SMALL LETTER YI */ { "afii10105", 0x0458 }, /* CYRILLIC SMALL LETTER JE */ { "afii10106", 0x0459 }, /* CYRILLIC SMALL LETTER LJE */ { "afii10107", 0x045A }, /* CYRILLIC SMALL LETTER NJE */ { "afii10108", 0x045B }, /* CYRILLIC SMALL LETTER TSHE */ { "afii10109", 0x045C }, /* CYRILLIC SMALL LETTER KJE */ { "afii10110", 0x045E }, /* CYRILLIC SMALL LETTER SHORT U */ { "afii10145", 0x040F }, /* CYRILLIC CAPITAL LETTER DZHE */ { "afii10146", 0x0462 }, /* CYRILLIC CAPITAL LETTER YAT */ { "afii10147", 0x0472 }, /* CYRILLIC CAPITAL LETTER FITA */ { "afii10148", 0x0474 }, /* CYRILLIC CAPITAL LETTER IZHITSA */ { "afii10192", 0xF6C6 }, /* CYRILLIC SMALL LETTER DE VARIANT */ { "afii10193", 0x045F }, /* CYRILLIC SMALL LETTER DZHE */ { "afii10194", 0x0463 }, /* CYRILLIC SMALL LETTER YAT */ { "afii10195", 0x0473 }, /* CYRILLIC SMALL LETTER FITA */ { "afii10196", 0x0475 }, /* CYRILLIC SMALL LETTER IZHITSA */ { "afii10831", 0xF6C7 }, /* CYRILLIC SMALL LETTER PE VARIANT */ { "afii10832", 0xF6C8 }, /* CYRILLIC SMALL LETTER TE VARIANT */ { "afii10846", 0x04D9 }, /* CYRILLIC SMALL LETTER SCHWA */ { "afii299", 0x200E }, /* LEFT-TO-RIGHT MARK */ { "afii300", 0x200F }, /* RIGHT-TO-LEFT MARK */ { "afii301", 0x200D }, /* ZERO WIDTH JOINER */ { "afii57381", 0x066A }, /* ARABIC PERCENT SIGN */ { "afii57388", 0x060C }, /* ARABIC COMMA */ { "afii57392", 0x0660 }, /* ARABIC-INDIC DIGIT ZERO */ { "afii57393", 0x0661 }, /* ARABIC-INDIC DIGIT ONE */ { "afii57394", 0x0662 }, /* ARABIC-INDIC DIGIT TWO */ { "afii57395", 0x0663 }, /* ARABIC-INDIC DIGIT THREE */ { "afii57396", 0x0664 }, /* ARABIC-INDIC DIGIT FOUR */ { "afii57397", 0x0665 }, /* ARABIC-INDIC DIGIT FIVE */ { "afii57398", 0x0666 }, /* ARABIC-INDIC DIGIT SIX */ { "afii57399", 0x0667 }, /* ARABIC-INDIC DIGIT SEVEN */ { "afii57400", 0x0668 }, /* ARABIC-INDIC DIGIT EIGHT */ { "afii57401", 0x0669 }, /* ARABIC-INDIC DIGIT NINE */ { "afii57403", 0x061B }, /* ARABIC SEMICOLON */ { "afii57407", 0x061F }, /* ARABIC QUESTION MARK */ { "afii57409", 0x0621 }, /* ARABIC LETTER HAMZA */ { "afii57410", 0x0622 }, /* ARABIC LETTER ALEF WITH MADDA ABOVE */ { "afii57411", 0x0623 }, /* ARABIC LETTER ALEF WITH HAMZA ABOVE */ { "afii57412", 0x0624 }, /* ARABIC LETTER WAW WITH HAMZA ABOVE */ { "afii57413", 0x0625 }, /* ARABIC LETTER ALEF WITH HAMZA BELOW */ { "afii57414", 0x0626 }, /* ARABIC LETTER YEH WITH HAMZA ABOVE */ { "afii57415", 0x0627 }, /* ARABIC LETTER ALEF */ { "afii57416", 0x0628 }, /* ARABIC LETTER BEH */ { "afii57417", 0x0629 }, /* ARABIC LETTER TEH MARBUTA */ { "afii57418", 0x062A }, /* ARABIC LETTER TEH */ { "afii57419", 0x062B }, /* ARABIC LETTER THEH */ { "afii57420", 0x062C }, /* ARABIC LETTER JEEM */ { "afii57421", 0x062D }, /* ARABIC LETTER HAH */ { "afii57422", 0x062E }, /* ARABIC LETTER KHAH */ { "afii57423", 0x062F }, /* ARABIC LETTER DAL */ { "afii57424", 0x0630 }, /* ARABIC LETTER THAL */ { "afii57425", 0x0631 }, /* ARABIC LETTER REH */ { "afii57426", 0x0632 }, /* ARABIC LETTER ZAIN */ { "afii57427", 0x0633 }, /* ARABIC LETTER SEEN */ { "afii57428", 0x0634 }, /* ARABIC LETTER SHEEN */ { "afii57429", 0x0635 }, /* ARABIC LETTER SAD */ { "afii57430", 0x0636 }, /* ARABIC LETTER DAD */ { "afii57431", 0x0637 }, /* ARABIC LETTER TAH */ { "afii57432", 0x0638 }, /* ARABIC LETTER ZAH */ { "afii57433", 0x0639 }, /* ARABIC LETTER AIN */ { "afii57434", 0x063A }, /* ARABIC LETTER GHAIN */ { "afii57440", 0x0640 }, /* ARABIC TATWEEL */ { "afii57441", 0x0641 }, /* ARABIC LETTER FEH */ { "afii57442", 0x0642 }, /* ARABIC LETTER QAF */ { "afii57443", 0x0643 }, /* ARABIC LETTER KAF */ { "afii57444", 0x0644 }, /* ARABIC LETTER LAM */ { "afii57445", 0x0645 }, /* ARABIC LETTER MEEM */ { "afii57446", 0x0646 }, /* ARABIC LETTER NOON */ { "afii57448", 0x0648 }, /* ARABIC LETTER WAW */ { "afii57449", 0x0649 }, /* ARABIC LETTER ALEF MAKSURA */ { "afii57450", 0x064A }, /* ARABIC LETTER YEH */ { "afii57451", 0x064B }, /* ARABIC FATHATAN */ { "afii57452", 0x064C }, /* ARABIC DAMMATAN */ { "afii57453", 0x064D }, /* ARABIC KASRATAN */ { "afii57454", 0x064E }, /* ARABIC FATHA */ { "afii57455", 0x064F }, /* ARABIC DAMMA */ { "afii57456", 0x0650 }, /* ARABIC KASRA */ { "afii57457", 0x0651 }, /* ARABIC SHADDA */ { "afii57458", 0x0652 }, /* ARABIC SUKUN */ { "afii57470", 0x0647 }, /* ARABIC LETTER HEH */ { "afii57505", 0x06A4 }, /* ARABIC LETTER VEH */ { "afii57506", 0x067E }, /* ARABIC LETTER PEH */ { "afii57507", 0x0686 }, /* ARABIC LETTER TCHEH */ { "afii57508", 0x0698 }, /* ARABIC LETTER JEH */ { "afii57509", 0x06AF }, /* ARABIC LETTER GAF */ { "afii57511", 0x0679 }, /* ARABIC LETTER TTEH */ { "afii57512", 0x0688 }, /* ARABIC LETTER DDAL */ { "afii57513", 0x0691 }, /* ARABIC LETTER RREH */ { "afii57514", 0x06BA }, /* ARABIC LETTER NOON GHUNNA */ { "afii57519", 0x06D2 }, /* ARABIC LETTER YEH BARREE */ { "afii57534", 0x06D5 }, /* ARABIC LETTER AE */ { "afii57636", 0x20AA }, /* NEW SHEQEL SIGN */ { "afii57645", 0x05BE }, /* HEBREW PUNCTUATION MAQAF */ { "afii57658", 0x05C3 }, /* HEBREW PUNCTUATION SOF PASUQ */ { "afii57664", 0x05D0 }, /* HEBREW LETTER ALEF */ { "afii57665", 0x05D1 }, /* HEBREW LETTER BET */ { "afii57666", 0x05D2 }, /* HEBREW LETTER GIMEL */ { "afii57667", 0x05D3 }, /* HEBREW LETTER DALET */ { "afii57668", 0x05D4 }, /* HEBREW LETTER HE */ { "afii57669", 0x05D5 }, /* HEBREW LETTER VAV */ { "afii57670", 0x05D6 }, /* HEBREW LETTER ZAYIN */ { "afii57671", 0x05D7 }, /* HEBREW LETTER HET */ { "afii57672", 0x05D8 }, /* HEBREW LETTER TET */ { "afii57673", 0x05D9 }, /* HEBREW LETTER YOD */ { "afii57674", 0x05DA }, /* HEBREW LETTER FINAL KAF */ { "afii57675", 0x05DB }, /* HEBREW LETTER KAF */ { "afii57676", 0x05DC }, /* HEBREW LETTER LAMED */ { "afii57677", 0x05DD }, /* HEBREW LETTER FINAL MEM */ { "afii57678", 0x05DE }, /* HEBREW LETTER MEM */ { "afii57679", 0x05DF }, /* HEBREW LETTER FINAL NUN */ { "afii57680", 0x05E0 }, /* HEBREW LETTER NUN */ { "afii57681", 0x05E1 }, /* HEBREW LETTER SAMEKH */ { "afii57682", 0x05E2 }, /* HEBREW LETTER AYIN */ { "afii57683", 0x05E3 }, /* HEBREW LETTER FINAL PE */ { "afii57684", 0x05E4 }, /* HEBREW LETTER PE */ { "afii57685", 0x05E5 }, /* HEBREW LETTER FINAL TSADI */ { "afii57686", 0x05E6 }, /* HEBREW LETTER TSADI */ { "afii57687", 0x05E7 }, /* HEBREW LETTER QOF */ { "afii57688", 0x05E8 }, /* HEBREW LETTER RESH */ { "afii57689", 0x05E9 }, /* HEBREW LETTER SHIN */ { "afii57690", 0x05EA }, /* HEBREW LETTER TAV */ { "afii57694", 0xFB2A }, /* HEBREW LETTER SHIN WITH SHIN DOT */ { "afii57695", 0xFB2B }, /* HEBREW LETTER SHIN WITH SIN DOT */ { "afii57700", 0xFB4B }, /* HEBREW LETTER VAV WITH HOLAM */ { "afii57705", 0xFB1F }, /* HEBREW LIGATURE YIDDISH YOD YOD PATAH */ { "afii57716", 0x05F0 }, /* HEBREW LIGATURE YIDDISH DOUBLE VAV */ { "afii57717", 0x05F1 }, /* HEBREW LIGATURE YIDDISH VAV YOD */ { "afii57718", 0x05F2 }, /* HEBREW LIGATURE YIDDISH DOUBLE YOD */ { "afii57723", 0xFB35 }, /* HEBREW LETTER VAV WITH DAGESH */ { "afii57793", 0x05B4 }, /* HEBREW POINT HIRIQ */ { "afii57794", 0x05B5 }, /* HEBREW POINT TSERE */ { "afii57795", 0x05B6 }, /* HEBREW POINT SEGOL */ { "afii57796", 0x05BB }, /* HEBREW POINT QUBUTS */ { "afii57797", 0x05B8 }, /* HEBREW POINT QAMATS */ { "afii57798", 0x05B7 }, /* HEBREW POINT PATAH */ { "afii57799", 0x05B0 }, /* HEBREW POINT SHEVA */ { "afii57800", 0x05B2 }, /* HEBREW POINT HATAF PATAH */ { "afii57801", 0x05B1 }, /* HEBREW POINT HATAF SEGOL */ { "afii57802", 0x05B3 }, /* HEBREW POINT HATAF QAMATS */ { "afii57803", 0x05C2 }, /* HEBREW POINT SIN DOT */ { "afii57804", 0x05C1 }, /* HEBREW POINT SHIN DOT */ { "afii57806", 0x05B9 }, /* HEBREW POINT HOLAM */ { "afii57807", 0x05BC }, /* HEBREW POINT DAGESH OR MAPIQ */ { "afii57839", 0x05BD }, /* HEBREW POINT METEG */ { "afii57841", 0x05BF }, /* HEBREW POINT RAFE */ { "afii57842", 0x05C0 }, /* HEBREW PUNCTUATION PASEQ */ { "afii57929", 0x02BC }, /* MODIFIER LETTER APOSTROPHE */ { "afii61248", 0x2105 }, /* CARE OF */ { "afii61289", 0x2113 }, /* SCRIPT SMALL L */ { "afii61352", 0x2116 }, /* NUMERO SIGN */ { "afii61573", 0x202C }, /* POP DIRECTIONAL FORMATTING */ { "afii61574", 0x202D }, /* LEFT-TO-RIGHT OVERRIDE */ { "afii61575", 0x202E }, /* RIGHT-TO-LEFT OVERRIDE */ { "afii61664", 0x200C }, /* ZERO WIDTH NON-JOINER */ { "afii63167", 0x066D }, /* ARABIC FIVE POINTED STAR */ { "afii64937", 0x02BD }, /* MODIFIER LETTER REVERSED COMMA */ { "agrave", 0x00E0 }, /* LATIN SMALL LETTER A WITH GRAVE */ { "aleph", 0x2135 }, /* ALEF SYMBOL */ { "alpha", 0x03B1 }, /* GREEK SMALL LETTER ALPHA */ { "alphatonos", 0x03AC }, /* GREEK SMALL LETTER ALPHA WITH TONOS */ { "amacron", 0x0101 }, /* LATIN SMALL LETTER A WITH MACRON */ { "ampersand", 0x0026 }, /* AMPERSAND */ { "ampersandsmall", 0xF726 }, /* SMALL CAPITAL AMPERSAND */ { "angle", 0x2220 }, /* ANGLE */ { "angleleft", 0x2329 }, /* LEFT-POINTING ANGLE BRACKET */ { "angleright", 0x232A }, /* RIGHT-POINTING ANGLE BRACKET */ { "anoteleia", 0x0387 }, /* GREEK ANO TELEIA */ { "aogonek", 0x0105 }, /* LATIN SMALL LETTER A WITH OGONEK */ { "approxequal", 0x2248 }, /* ALMOST EQUAL TO */ { "aring", 0x00E5 }, /* LATIN SMALL LETTER A WITH RING ABOVE */ { "aringacute", 0x01FB }, /* LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE */ { "arrowboth", 0x2194 }, /* LEFT RIGHT ARROW */ { "arrowdblboth", 0x21D4 }, /* LEFT RIGHT DOUBLE ARROW */ { "arrowdbldown", 0x21D3 }, /* DOWNWARDS DOUBLE ARROW */ { "arrowdblleft", 0x21D0 }, /* LEFTWARDS DOUBLE ARROW */ { "arrowdblright", 0x21D2 }, /* RIGHTWARDS DOUBLE ARROW */ { "arrowdblup", 0x21D1 }, /* UPWARDS DOUBLE ARROW */ { "arrowdown", 0x2193 }, /* DOWNWARDS ARROW */ { "arrowhorizex", 0xF8E7 }, /* HORIZONTAL ARROW EXTENDER */ { "arrowleft", 0x2190 }, /* LEFTWARDS ARROW */ { "arrowright", 0x2192 }, /* RIGHTWARDS ARROW */ { "arrowup", 0x2191 }, /* UPWARDS ARROW */ { "arrowupdn", 0x2195 }, /* UP DOWN ARROW */ { "arrowupdnbse", 0x21A8 }, /* UP DOWN ARROW WITH BASE */ { "arrowvertex", 0xF8E6 }, /* VERTICAL ARROW EXTENDER */ { "asciicircum", 0x005E }, /* CIRCUMFLEX ACCENT */ { "asciitilde", 0x007E }, /* TILDE */ { "asterisk", 0x002A }, /* ASTERISK */ { "asteriskmath", 0x2217 }, /* ASTERISK OPERATOR */ { "asuperior", 0xF6E9 }, /* SUPERSCRIPT LATIN SMALL LETTER A */ { "at", 0x0040 }, /* COMMERCIAL AT */ { "atilde", 0x00E3 }, /* LATIN SMALL LETTER A WITH TILDE */ { "b", 0x0062 }, /* LATIN SMALL LETTER B */ { "backslash", 0x005C }, /* REVERSE SOLIDUS */ { "bar", 0x007C }, /* VERTICAL LINE */ { "beta", 0x03B2 }, /* GREEK SMALL LETTER BETA */ { "block", 0x2588 }, /* FULL BLOCK */ { "braceex", 0xF8F4 }, /* CURLY BRACKET EXTENDER */ { "braceleft", 0x007B }, /* LEFT CURLY BRACKET */ { "braceleftbt", 0xF8F3 }, /* LEFT CURLY BRACKET BOTTOM */ { "braceleftmid", 0xF8F2 }, /* LEFT CURLY BRACKET MID */ { "bracelefttp", 0xF8F1 }, /* LEFT CURLY BRACKET TOP */ { "braceright", 0x007D }, /* RIGHT CURLY BRACKET */ { "bracerightbt", 0xF8FE }, /* RIGHT CURLY BRACKET BOTTOM */ { "bracerightmid", 0xF8FD }, /* RIGHT CURLY BRACKET MID */ { "bracerighttp", 0xF8FC }, /* RIGHT CURLY BRACKET TOP */ { "bracketleft", 0x005B }, /* LEFT SQUARE BRACKET */ { "bracketleftbt", 0xF8F0 }, /* LEFT SQUARE BRACKET BOTTOM */ { "bracketleftex", 0xF8EF }, /* LEFT SQUARE BRACKET EXTENDER */ { "bracketlefttp", 0xF8EE }, /* LEFT SQUARE BRACKET TOP */ { "bracketright", 0x005D }, /* RIGHT SQUARE BRACKET */ { "bracketrightbt", 0xF8FB }, /* RIGHT SQUARE BRACKET BOTTOM */ { "bracketrightex", 0xF8FA }, /* RIGHT SQUARE BRACKET EXTENDER */ { "bracketrighttp", 0xF8F9 }, /* RIGHT SQUARE BRACKET TOP */ { "breve", 0x02D8 }, /* BREVE */ { "brokenbar", 0x00A6 }, /* BROKEN BAR */ { "bsuperior", 0xF6EA }, /* SUPERSCRIPT LATIN SMALL LETTER B */ { "bullet", 0x2022 }, /* BULLET */ { "c", 0x0063 }, /* LATIN SMALL LETTER C */ { "cacute", 0x0107 }, /* LATIN SMALL LETTER C WITH ACUTE */ { "caron", 0x02C7 }, /* CARON */ { "carriagereturn", 0x21B5 }, /* DOWNWARDS ARROW WITH CORNER LEFTWARDS */ { "ccaron", 0x010D }, /* LATIN SMALL LETTER C WITH CARON */ { "ccedilla", 0x00E7 }, /* LATIN SMALL LETTER C WITH CEDILLA */ { "ccircumflex", 0x0109 }, /* LATIN SMALL LETTER C WITH CIRCUMFLEX */ { "cdotaccent", 0x010B }, /* LATIN SMALL LETTER C WITH DOT ABOVE */ { "cedilla", 0x00B8 }, /* CEDILLA */ { "cent", 0x00A2 }, /* CENT SIGN */ { "centinferior", 0xF6DF }, /* SUBSCRIPT CENT SIGN */ { "centoldstyle", 0xF7A2 }, /* OLDSTYLE CENT SIGN */ { "centsuperior", 0xF6E0 }, /* SUPERSCRIPT CENT SIGN */ { "chi", 0x03C7 }, /* GREEK SMALL LETTER CHI */ { "circle", 0x25CB }, /* WHITE CIRCLE */ { "circlemultiply", 0x2297 }, /* CIRCLED TIMES */ { "circleplus", 0x2295 }, /* CIRCLED PLUS */ /* { "circumflex", 0x02C6 }, /\* MODIFIER LETTER CIRCUMFLEX ACCENT *\/ */ { "circumflex", 0x005E }, /* MODIFIER LETTER CIRCUMFLEX ACCENT */ { "club", 0x2663 }, /* BLACK CLUB SUIT */ { "colon", 0x003A }, /* COLON */ { "colonmonetary", 0x20A1 }, /* COLON SIGN */ { "comma", 0x002C }, /* COMMA */ { "commaaccent", 0xF6C3 }, /* COMMA BELOW */ { "commainferior", 0xF6E1 }, /* SUBSCRIPT COMMA */ { "commasuperior", 0xF6E2 }, /* SUPERSCRIPT COMMA */ { "congruent", 0x2245 }, /* APPROXIMATELY EQUAL TO */ { "copyright", 0x00A9 }, /* COPYRIGHT SIGN */ { "copyrightsans", 0xF8E9 }, /* COPYRIGHT SIGN SANS SERIF */ { "copyrightserif", 0xF6D9 }, /* COPYRIGHT SIGN SERIF */ { "currency", 0x00A4 }, /* CURRENCY SIGN */ { "cyrBreve", 0xF6D1 }, /* CAPITAL CYRILLIC BREVE */ { "cyrFlex", 0xF6D2 }, /* CAPITAL CYRILLIC CIRCUMFLEX */ { "cyrbreve", 0xF6D4 }, /* CYRILLIC BREVE */ { "cyrflex", 0xF6D5 }, /* CYRILLIC CIRCUMFLEX */ { "d", 0x0064 }, /* LATIN SMALL LETTER D */ { "dagger", 0x2020 }, /* DAGGER */ { "daggerdbl", 0x2021 }, /* DOUBLE DAGGER */ { "dblGrave", 0xF6D3 }, /* CAPITAL DOUBLE GRAVE ACCENT */ { "dblgrave", 0xF6D6 }, /* DOUBLE GRAVE ACCENT */ { "dcaron", 0x010F }, /* LATIN SMALL LETTER D WITH CARON */ { "dcroat", 0x0111 }, /* LATIN SMALL LETTER D WITH STROKE */ { "degree", 0x00B0 }, /* DEGREE SIGN */ { "delta", 0x03B4 }, /* GREEK SMALL LETTER DELTA */ { "diamond", 0x2666 }, /* BLACK DIAMOND SUIT */ { "dieresis", 0x00A8 }, /* DIAERESIS */ { "dieresisacute", 0xF6D7 }, /* DIAERESIS ACUTE ACCENT */ { "dieresisgrave", 0xF6D8 }, /* DIAERESIS GRAVE ACCENT */ { "dieresistonos", 0x0385 }, /* GREEK DIALYTIKA TONOS */ { "divide", 0x00F7 }, /* DIVISION SIGN */ { "dkshade", 0x2593 }, /* DARK SHADE */ { "dnblock", 0x2584 }, /* LOWER HALF BLOCK */ { "dollar", 0x0024 }, /* DOLLAR SIGN */ { "dollarinferior", 0xF6E3 }, /* SUBSCRIPT DOLLAR SIGN */ { "dollaroldstyle", 0xF724 }, /* OLDSTYLE DOLLAR SIGN */ { "dollarsuperior", 0xF6E4 }, /* SUPERSCRIPT DOLLAR SIGN */ { "dong", 0x20AB }, /* DONG SIGN */ { "dotaccent", 0x02D9 }, /* DOT ABOVE */ { "dotbelowcomb", 0x0323 }, /* COMBINING DOT BELOW */ { "dotlessi", 0x0131 }, /* LATIN SMALL LETTER DOTLESS I */ { "dotlessj", 0xF6BE }, /* LATIN SMALL LETTER DOTLESS J */ { "dotmath", 0x22C5 }, /* DOT OPERATOR */ { "dsuperior", 0xF6EB }, /* SUPERSCRIPT LATIN SMALL LETTER D */ { "e", 0x0065 }, /* LATIN SMALL LETTER E */ { "eacute", 0x00E9 }, /* LATIN SMALL LETTER E WITH ACUTE */ { "ebreve", 0x0115 }, /* LATIN SMALL LETTER E WITH BREVE */ { "ecaron", 0x011B }, /* LATIN SMALL LETTER E WITH CARON */ { "ecircumflex", 0x00EA }, /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ { "edieresis", 0x00EB }, /* LATIN SMALL LETTER E WITH DIAERESIS */ { "edotaccent", 0x0117 }, /* LATIN SMALL LETTER E WITH DOT ABOVE */ { "egrave", 0x00E8 }, /* LATIN SMALL LETTER E WITH GRAVE */ { "eight", 0x0038 }, /* DIGIT EIGHT */ { "eightinferior", 0x2088 }, /* SUBSCRIPT EIGHT */ { "eightoldstyle", 0xF738 }, /* OLDSTYLE DIGIT EIGHT */ { "eightsuperior", 0x2078 }, /* SUPERSCRIPT EIGHT */ { "element", 0x2208 }, /* ELEMENT OF */ { "ellipsis", 0x2026 }, /* HORIZONTAL ELLIPSIS */ { "emacron", 0x0113 }, /* LATIN SMALL LETTER E WITH MACRON */ { "emdash", 0x2014 }, /* EM DASH */ { "emptyset", 0x2205 }, /* EMPTY SET */ { "endash", 0x2013 }, /* EN DASH */ { "eng", 0x014B }, /* LATIN SMALL LETTER ENG */ { "eogonek", 0x0119 }, /* LATIN SMALL LETTER E WITH OGONEK */ { "epsilon", 0x03B5 }, /* GREEK SMALL LETTER EPSILON */ { "epsilontonos", 0x03AD }, /* GREEK SMALL LETTER EPSILON WITH TONOS */ { "equal", 0x003D }, /* EQUALS SIGN */ { "equivalence", 0x2261 }, /* IDENTICAL TO */ { "estimated", 0x212E }, /* ESTIMATED SYMBOL */ { "esuperior", 0xF6EC }, /* SUPERSCRIPT LATIN SMALL LETTER E */ { "eta", 0x03B7 }, /* GREEK SMALL LETTER ETA */ { "etatonos", 0x03AE }, /* GREEK SMALL LETTER ETA WITH TONOS */ { "eth", 0x00F0 }, /* LATIN SMALL LETTER ETH */ { "exclam", 0x0021 }, /* EXCLAMATION MARK */ { "exclamdbl", 0x203C }, /* DOUBLE EXCLAMATION MARK */ { "exclamdown", 0x00A1 }, /* INVERTED EXCLAMATION MARK */ { "exclamdownsmall", 0xF7A1 }, /* SMALL CAPITAL INVERTED EXCLAMATION MARK */ { "exclamsmall", 0xF721 }, /* SMALL CAPITAL EXCLAMATION MARK */ { "existential", 0x2203 }, /* THERE EXISTS */ { "f", 0x0066 }, /* LATIN SMALL LETTER F */ { "female", 0x2640 }, /* FEMALE SIGN */ { "ff", 0xFB00 }, /* LATIN SMALL LIGATURE FF */ { "ffi", 0xFB03 }, /* LATIN SMALL LIGATURE FFI */ { "ffl", 0xFB04 }, /* LATIN SMALL LIGATURE FFL */ { "fi", 0xFB01 }, /* LATIN SMALL LIGATURE FI */ { "figuredash", 0x2012 }, /* FIGURE DASH */ { "filledbox", 0x25A0 }, /* BLACK SQUARE */ { "filledrect", 0x25AC }, /* BLACK RECTANGLE */ { "five", 0x0035 }, /* DIGIT FIVE */ { "fiveeighths", 0x215D }, /* VULGAR FRACTION FIVE EIGHTHS */ { "fiveinferior", 0x2085 }, /* SUBSCRIPT FIVE */ { "fiveoldstyle", 0xF735 }, /* OLDSTYLE DIGIT FIVE */ { "fivesuperior", 0x2075 }, /* SUPERSCRIPT FIVE */ { "fl", 0xFB02 }, /* LATIN SMALL LIGATURE FL */ { "florin", 0x0192 }, /* LATIN SMALL LETTER F WITH HOOK */ { "four", 0x0034 }, /* DIGIT FOUR */ { "fourinferior", 0x2084 }, /* SUBSCRIPT FOUR */ { "fouroldstyle", 0xF734 }, /* OLDSTYLE DIGIT FOUR */ { "foursuperior", 0x2074 }, /* SUPERSCRIPT FOUR */ { "fraction", 0x2044 }, /* FRACTION SLASH */ #if 0 { "fraction" DUP2, 0x2215 }, /* DIVISION SLASH;Duplicate */ #endif /* 0 */ { "franc", 0x20A3 }, /* FRENCH FRANC SIGN */ { "ft", 0xFB05 }, /* LATIN SMALL LIGATURE FT */ { "g", 0x0067 }, /* LATIN SMALL LETTER G */ { "gamma", 0x03B3 }, /* GREEK SMALL LETTER GAMMA */ { "gbreve", 0x011F }, /* LATIN SMALL LETTER G WITH BREVE */ { "gcaron", 0x01E7 }, /* LATIN SMALL LETTER G WITH CARON */ { "gcircumflex", 0x011D }, /* LATIN SMALL LETTER G WITH CIRCUMFLEX */ { "gcommaaccent", 0x0123 }, /* LATIN SMALL LETTER G WITH CEDILLA */ { "gdotaccent", 0x0121 }, /* LATIN SMALL LETTER G WITH DOT ABOVE */ { "germandbls", 0x00DF }, /* LATIN SMALL LETTER SHARP S */ { "gradient", 0x2207 }, /* NABLA */ { "grave", 0x0060 }, /* GRAVE ACCENT */ { "gravecomb", 0x0300 }, /* COMBINING GRAVE ACCENT */ { "greater", 0x003E }, /* GREATER-THAN SIGN */ { "greaterequal", 0x2265 }, /* GREATER-THAN OR EQUAL TO */ { "guillemotleft", 0x00AB }, /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ { "guillemotright", 0x00BB }, /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ { "guilsinglleft", 0x2039 }, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ { "guilsinglright", 0x203A }, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ { "h", 0x0068 }, /* LATIN SMALL LETTER H */ { "hbar", 0x0127 }, /* LATIN SMALL LETTER H WITH STROKE */ { "hcircumflex", 0x0125 }, /* LATIN SMALL LETTER H WITH CIRCUMFLEX */ { "heart", 0x2665 }, /* BLACK HEART SUIT */ { "hookabovecomb", 0x0309 }, /* COMBINING HOOK ABOVE */ { "house", 0x2302 }, /* HOUSE */ { "hungarumlaut", 0x02DD }, /* DOUBLE ACUTE ACCENT */ { "hyphen", 0x002D }, /* HYPHEN-MINUS */ #if 0 { "hyphen" DUP2, 0x00AD }, /* SOFT HYPHEN;Duplicate */ #endif /* 0 */ { "hypheninferior", 0xF6E5 }, /* SUBSCRIPT HYPHEN-MINUS */ { "hyphensuperior", 0xF6E6 }, /* SUPERSCRIPT HYPHEN-MINUS */ { "i", 0x0069 }, /* LATIN SMALL LETTER I */ { "iacute", 0x00ED }, /* LATIN SMALL LETTER I WITH ACUTE */ { "ibreve", 0x012D }, /* LATIN SMALL LETTER I WITH BREVE */ { "icircumflex", 0x00EE }, /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ { "idieresis", 0x00EF }, /* LATIN SMALL LETTER I WITH DIAERESIS */ { "igrave", 0x00EC }, /* LATIN SMALL LETTER I WITH GRAVE */ { "ij", 0x0133 }, /* LATIN SMALL LIGATURE IJ */ { "imacron", 0x012B }, /* LATIN SMALL LETTER I WITH MACRON */ { "infinity", 0x221E }, /* INFINITY */ { "integral", 0x222B }, /* INTEGRAL */ { "integralbt", 0x2321 }, /* BOTTOM HALF INTEGRAL */ { "integralex", 0xF8F5 }, /* INTEGRAL EXTENDER */ { "integraltp", 0x2320 }, /* TOP HALF INTEGRAL */ { "intersection", 0x2229 }, /* INTERSECTION */ { "invbullet", 0x25D8 }, /* INVERSE BULLET */ { "invcircle", 0x25D9 }, /* INVERSE WHITE CIRCLE */ { "invsmileface", 0x263B }, /* BLACK SMILING FACE */ { "iogonek", 0x012F }, /* LATIN SMALL LETTER I WITH OGONEK */ { "iota", 0x03B9 }, /* GREEK SMALL LETTER IOTA */ { "iotadieresis", 0x03CA }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */ { "iotadieresistonos", 0x0390 }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ { "iotatonos", 0x03AF }, /* GREEK SMALL LETTER IOTA WITH TONOS */ { "isuperior", 0xF6ED }, /* SUPERSCRIPT LATIN SMALL LETTER I */ { "itilde", 0x0129 }, /* LATIN SMALL LETTER I WITH TILDE */ { "j", 0x006A }, /* LATIN SMALL LETTER J */ { "jcircumflex", 0x0135 }, /* LATIN SMALL LETTER J WITH CIRCUMFLEX */ { "k", 0x006B }, /* LATIN SMALL LETTER K */ { "kappa", 0x03BA }, /* GREEK SMALL LETTER KAPPA */ { "kcommaaccent", 0x0137 }, /* LATIN SMALL LETTER K WITH CEDILLA */ { "kgreenlandic", 0x0138 }, /* LATIN SMALL LETTER KRA */ { "l", 0x006C }, /* LATIN SMALL LETTER L */ { "lacute", 0x013A }, /* LATIN SMALL LETTER L WITH ACUTE */ { "lambda", 0x03BB }, /* GREEK SMALL LETTER LAMDA */ { "lcaron", 0x013E }, /* LATIN SMALL LETTER L WITH CARON */ { "lcommaaccent", 0x013C }, /* LATIN SMALL LETTER L WITH CEDILLA */ { "ldot", 0x0140 }, /* LATIN SMALL LETTER L WITH MIDDLE DOT */ { "less", 0x003C }, /* LESS-THAN SIGN */ { "lessequal", 0x2264 }, /* LESS-THAN OR EQUAL TO */ { "lfblock", 0x258C }, /* LEFT HALF BLOCK */ { "lira", 0x20A4 }, /* LIRA SIGN */ { "ll", 0xF6C0 }, /* LATIN SMALL LETTER LL */ { "logicaland", 0x2227 }, /* LOGICAL AND */ { "logicalnot", 0x00AC }, /* NOT SIGN */ { "logicalor", 0x2228 }, /* LOGICAL OR */ { "longs", 0x017F }, /* LATIN SMALL LETTER LONG S */ { "lozenge", 0x25CA }, /* LOZENGE */ { "lslash", 0x0142 }, /* LATIN SMALL LETTER L WITH STROKE */ { "lsuperior", 0xF6EE }, /* SUPERSCRIPT LATIN SMALL LETTER L */ { "ltshade", 0x2591 }, /* LIGHT SHADE */ { "m", 0x006D }, /* LATIN SMALL LETTER M */ { "macron", 0x00AF }, /* MACRON */ #if 0 { "macron" DUP2, 0x02C9 }, /* MODIFIER LETTER MACRON;Duplicate */ #endif /* 0 */ { "male", 0x2642 }, /* MALE SIGN */ { "minus", 0x2212 }, /* MINUS SIGN */ { "minute", 0x2032 }, /* PRIME */ { "msuperior", 0xF6EF }, /* SUPERSCRIPT LATIN SMALL LETTER M */ { "mu", 0x00B5 }, /* MICRO SIGN */ #if 0 { "mu" DUP2, 0x03BC }, /* GREEK SMALL LETTER MU;Duplicate */ #endif /* 0 */ { "multiply", 0x00D7 }, /* MULTIPLICATION SIGN */ { "musicalnote", 0x266A }, /* EIGHTH NOTE */ { "musicalnotedbl", 0x266B }, /* BEAMED EIGHTH NOTES */ { "n", 0x006E }, /* LATIN SMALL LETTER N */ { "nacute", 0x0144 }, /* LATIN SMALL LETTER N WITH ACUTE */ { "napostrophe", 0x0149 }, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */ { "ncaron", 0x0148 }, /* LATIN SMALL LETTER N WITH CARON */ { "ncommaaccent", 0x0146 }, /* LATIN SMALL LETTER N WITH CEDILLA */ { "nine", 0x0039 }, /* DIGIT NINE */ { "nineinferior", 0x2089 }, /* SUBSCRIPT NINE */ { "nineoldstyle", 0xF739 }, /* OLDSTYLE DIGIT NINE */ { "ninesuperior", 0x2079 }, /* SUPERSCRIPT NINE */ { "notelement", 0x2209 }, /* NOT AN ELEMENT OF */ { "notequal", 0x2260 }, /* NOT EQUAL TO */ { "notsubset", 0x2284 }, /* NOT A SUBSET OF */ { "nsuperior", 0x207F }, /* SUPERSCRIPT LATIN SMALL LETTER N */ { "ntilde", 0x00F1 }, /* LATIN SMALL LETTER N WITH TILDE */ { "nu", 0x03BD }, /* GREEK SMALL LETTER NU */ { "numbersign", 0x0023 }, /* NUMBER SIGN */ { "o", 0x006F }, /* LATIN SMALL LETTER O */ { "oacute", 0x00F3 }, /* LATIN SMALL LETTER O WITH ACUTE */ { "obreve", 0x014F }, /* LATIN SMALL LETTER O WITH BREVE */ { "ocircumflex", 0x00F4 }, /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ { "odieresis", 0x00F6 }, /* LATIN SMALL LETTER O WITH DIAERESIS */ { "oe", 0x0153 }, /* LATIN SMALL LIGATURE OE */ { "ogonek", 0x02DB }, /* OGONEK */ { "ograve", 0x00F2 }, /* LATIN SMALL LETTER O WITH GRAVE */ { "ohorn", 0x01A1 }, /* LATIN SMALL LETTER O WITH HORN */ { "ohungarumlaut", 0x0151 }, /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */ { "omacron", 0x014D }, /* LATIN SMALL LETTER O WITH MACRON */ { "omega", 0x03C9 }, /* GREEK SMALL LETTER OMEGA */ { "omega1", 0x03D6 }, /* GREEK PI SYMBOL */ { "omegatonos", 0x03CE }, /* GREEK SMALL LETTER OMEGA WITH TONOS */ { "omicron", 0x03BF }, /* GREEK SMALL LETTER OMICRON */ { "omicrontonos", 0x03CC }, /* GREEK SMALL LETTER OMICRON WITH TONOS */ { "one", 0x0031 }, /* DIGIT ONE */ { "onedotenleader", 0x2024 }, /* ONE DOT LEADER */ { "oneeighth", 0x215B }, /* VULGAR FRACTION ONE EIGHTH */ { "onefitted", 0xF6DC }, /* PROPORTIONAL DIGIT ONE */ { "onehalf", 0x00BD }, /* VULGAR FRACTION ONE HALF */ { "oneinferior", 0x2081 }, /* SUBSCRIPT ONE */ { "oneoldstyle", 0xF731 }, /* OLDSTYLE DIGIT ONE */ { "onequarter", 0x00BC }, /* VULGAR FRACTION ONE QUARTER */ { "onesuperior", 0x00B9 }, /* SUPERSCRIPT ONE */ { "onethird", 0x2153 }, /* VULGAR FRACTION ONE THIRD */ { "openbullet", 0x25E6 }, /* WHITE BULLET */ { "ordfeminine", 0x00AA }, /* FEMININE ORDINAL INDICATOR */ { "ordmasculine", 0x00BA }, /* MASCULINE ORDINAL INDICATOR */ { "orthogonal", 0x221F }, /* RIGHT ANGLE */ { "oslash", 0x00F8 }, /* LATIN SMALL LETTER O WITH STROKE */ { "oslashacute", 0x01FF }, /* LATIN SMALL LETTER O WITH STROKE AND ACUTE */ { "osuperior", 0xF6F0 }, /* SUPERSCRIPT LATIN SMALL LETTER O */ { "otilde", 0x00F5 }, /* LATIN SMALL LETTER O WITH TILDE */ { "p", 0x0070 }, /* LATIN SMALL LETTER P */ { "paragraph", 0x00B6 }, /* PILCROW SIGN */ { "parenleft", 0x0028 }, /* LEFT PARENTHESIS */ { "parenleftbt", 0xF8ED }, /* LEFT PAREN BOTTOM */ { "parenleftex", 0xF8EC }, /* LEFT PAREN EXTENDER */ { "parenleftinferior", 0x208D }, /* SUBSCRIPT LEFT PARENTHESIS */ { "parenleftsuperior", 0x207D }, /* SUPERSCRIPT LEFT PARENTHESIS */ { "parenlefttp", 0xF8EB }, /* LEFT PAREN TOP */ { "parenright", 0x0029 }, /* RIGHT PARENTHESIS */ { "parenrightbt", 0xF8F8 }, /* RIGHT PAREN BOTTOM */ { "parenrightex", 0xF8F7 }, /* RIGHT PAREN EXTENDER */ { "parenrightinferior", 0x208E }, /* SUBSCRIPT RIGHT PARENTHESIS */ { "parenrightsuperior", 0x207E }, /* SUPERSCRIPT RIGHT PARENTHESIS */ { "parenrighttp", 0xF8F6 }, /* RIGHT PAREN TOP */ { "partialdiff", 0x2202 }, /* PARTIAL DIFFERENTIAL */ { "percent", 0x0025 }, /* PERCENT SIGN */ { "period", 0x002E }, /* FULL STOP */ { "periodcentered", 0x00B7 }, /* MIDDLE DOT */ #if 0 { "periodcentered" DUP2, 0x2219 }, /* BULLET OPERATOR;Duplicate */ #endif /* 0 */ { "periodinferior", 0xF6E7 }, /* SUBSCRIPT FULL STOP */ { "periodsuperior", 0xF6E8 }, /* SUPERSCRIPT FULL STOP */ { "perpendicular", 0x22A5 }, /* UP TACK */ { "perthousand", 0x2030 }, /* PER MILLE SIGN */ { "peseta", 0x20A7 }, /* PESETA SIGN */ { "phi", 0x03C6 }, /* GREEK SMALL LETTER PHI */ { "phi1", 0x03D5 }, /* GREEK PHI SYMBOL */ { "pi", 0x03C0 }, /* GREEK SMALL LETTER PI */ { "plus", 0x002B }, /* PLUS SIGN */ { "plusminus", 0x00B1 }, /* PLUS-MINUS SIGN */ { "prescription", 0x211E }, /* PRESCRIPTION TAKE */ { "product", 0x220F }, /* N-ARY PRODUCT */ { "propersubset", 0x2282 }, /* SUBSET OF */ { "propersuperset", 0x2283 }, /* SUPERSET OF */ { "proportional", 0x221D }, /* PROPORTIONAL TO */ { "psi", 0x03C8 }, /* GREEK SMALL LETTER PSI */ { "q", 0x0071 }, /* LATIN SMALL LETTER Q */ { "question", 0x003F }, /* QUESTION MARK */ { "questiondown", 0x00BF }, /* INVERTED QUESTION MARK */ { "questiondownsmall", 0xF7BF }, /* SMALL CAPITAL INVERTED QUESTION MARK */ { "questionsmall", 0xF73F }, /* SMALL CAPITAL QUESTION MARK */ { "quotedbl", 0x0022 }, /* QUOTATION MARK */ { "quotedblbase", 0x201E }, /* DOUBLE LOW-9 QUOTATION MARK */ { "quotedblleft", 0x201C }, /* LEFT DOUBLE QUOTATION MARK */ { "quotedblright", 0x201D }, /* RIGHT DOUBLE QUOTATION MARK */ { "quoteleft", 0x2018 }, /* LEFT SINGLE QUOTATION MARK */ { "quotereversed", 0x201B }, /* SINGLE HIGH-REVERSED-9 QUOTATION MARK */ { "quoteright", 0x2019 }, /* RIGHT SINGLE QUOTATION MARK */ { "quotesinglbase", 0x201A }, /* SINGLE LOW-9 QUOTATION MARK */ { "quotesingle", 0x0027 }, /* APOSTROPHE */ { "r", 0x0072 }, /* LATIN SMALL LETTER R */ { "racute", 0x0155 }, /* LATIN SMALL LETTER R WITH ACUTE */ { "radical", 0x221A }, /* SQUARE ROOT */ { "radicalex", 0xF8E5 }, /* RADICAL EXTENDER */ { "rcaron", 0x0159 }, /* LATIN SMALL LETTER R WITH CARON */ { "rcommaaccent", 0x0157 }, /* LATIN SMALL LETTER R WITH CEDILLA */ { "reflexsubset", 0x2286 }, /* SUBSET OF OR EQUAL TO */ { "reflexsuperset", 0x2287 }, /* SUPERSET OF OR EQUAL TO */ { "registered", 0x00AE }, /* REGISTERED SIGN */ { "registersans", 0xF8E8 }, /* REGISTERED SIGN SANS SERIF */ { "registerserif", 0xF6DA }, /* REGISTERED SIGN SERIF */ { "revlogicalnot", 0x2310 }, /* REVERSED NOT SIGN */ { "rho", 0x03C1 }, /* GREEK SMALL LETTER RHO */ { "ring", 0x02DA }, /* RING ABOVE */ { "rsuperior", 0xF6F1 }, /* SUPERSCRIPT LATIN SMALL LETTER R */ { "rtblock", 0x2590 }, /* RIGHT HALF BLOCK */ { "rupiah", 0xF6DD }, /* RUPIAH SIGN */ { "s", 0x0073 }, /* LATIN SMALL LETTER S */ { "sacute", 0x015B }, /* LATIN SMALL LETTER S WITH ACUTE */ { "scaron", 0x0161 }, /* LATIN SMALL LETTER S WITH CARON */ { "scedilla", 0x015F }, /* LATIN SMALL LETTER S WITH CEDILLA */ #if 0 { "scedilla" DUP2, 0xF6C2 }, /* LATIN SMALL LETTER S WITH CEDILLA;Duplicate */ #endif /* 0 */ { "scircumflex", 0x015D }, /* LATIN SMALL LETTER S WITH CIRCUMFLEX */ { "scommaaccent", 0x0219 }, /* LATIN SMALL LETTER S WITH COMMA BELOW */ { "second", 0x2033 }, /* DOUBLE PRIME */ { "section", 0x00A7 }, /* SECTION SIGN */ { "semicolon", 0x003B }, /* SEMICOLON */ { "seven", 0x0037 }, /* DIGIT SEVEN */ { "seveneighths", 0x215E }, /* VULGAR FRACTION SEVEN EIGHTHS */ { "seveninferior", 0x2087 }, /* SUBSCRIPT SEVEN */ { "sevenoldstyle", 0xF737 }, /* OLDSTYLE DIGIT SEVEN */ { "sevensuperior", 0x2077 }, /* SUPERSCRIPT SEVEN */ { "shade", 0x2592 }, /* MEDIUM SHADE */ { "sigma", 0x03C3 }, /* GREEK SMALL LETTER SIGMA */ { "sigma1", 0x03C2 }, /* GREEK SMALL LETTER FINAL SIGMA */ { "similar", 0x223C }, /* TILDE OPERATOR */ { "six", 0x0036 }, /* DIGIT SIX */ { "sixinferior", 0x2086 }, /* SUBSCRIPT SIX */ { "sixoldstyle", 0xF736 }, /* OLDSTYLE DIGIT SIX */ { "sixsuperior", 0x2076 }, /* SUPERSCRIPT SIX */ { "slash", 0x002F }, /* SOLIDUS */ { "smileface", 0x263A }, /* WHITE SMILING FACE */ { "space", 0x0020 }, /* SPACE */ #if 0 { "space" DUP2, 0x00A0 }, /* NO-BREAK SPACE;Duplicate */ #endif /* 0 */ { "spade", 0x2660 }, /* BLACK SPADE SUIT */ { "ssuperior", 0xF6F2 }, /* SUPERSCRIPT LATIN SMALL LETTER S */ { "st", 0xFB06 }, /* LATIN SMALL LIGATURE ST */ { "sterling", 0x00A3 }, /* POUND SIGN */ { "suchthat", 0x220B }, /* CONTAINS AS MEMBER */ { "summation", 0x2211 }, /* N-ARY SUMMATION */ { "summationtext", 0x2211 }, /* N-ARY SUMMATION - apparently this is the name used in cmex? */ { "sun", 0x263C }, /* WHITE SUN WITH RAYS */ { "t", 0x0074 }, /* LATIN SMALL LETTER T */ { "tau", 0x03C4 }, /* GREEK SMALL LETTER TAU */ { "tbar", 0x0167 }, /* LATIN SMALL LETTER T WITH STROKE */ { "tcaron", 0x0165 }, /* LATIN SMALL LETTER T WITH CARON */ { "tcommaaccent", 0x0163 }, /* LATIN SMALL LETTER T WITH CEDILLA */ #if 0 { "tcommaaccent" DUP2, 0x021B }, /* LATIN SMALL LETTER T WITH COMMA BELOW;Duplicate */ #endif /* 0 */ { "therefore", 0x2234 }, /* THEREFORE */ { "theta", 0x03B8 }, /* GREEK SMALL LETTER THETA */ { "theta1", 0x03D1 }, /* GREEK THETA SYMBOL */ { "thorn", 0x00FE }, /* LATIN SMALL LETTER THORN */ { "three", 0x0033 }, /* DIGIT THREE */ { "threeeighths", 0x215C }, /* VULGAR FRACTION THREE EIGHTHS */ { "threeinferior", 0x2083 }, /* SUBSCRIPT THREE */ { "threeoldstyle", 0xF733 }, /* OLDSTYLE DIGIT THREE */ { "threequarters", 0x00BE }, /* VULGAR FRACTION THREE QUARTERS */ { "threequartersemdash", 0xF6DE }, /* THREE QUARTERS EM DASH */ { "threesuperior", 0x00B3 }, /* SUPERSCRIPT THREE */ /* { "tilde", 0x02DC }, /\* SMALL TILDE *\/ */ { "tilde", 0x007E }, /* ASCII TILDE */ { "tildecomb", 0x0303 }, /* COMBINING TILDE */ { "tonos", 0x0384 }, /* GREEK TONOS */ { "trademark", 0x2122 }, /* TRADE MARK SIGN */ { "trademarksans", 0xF8EA }, /* TRADE MARK SIGN SANS SERIF */ { "trademarkserif", 0xF6DB }, /* TRADE MARK SIGN SERIF */ { "triagdn", 0x25BC }, /* BLACK DOWN-POINTING TRIANGLE */ { "triaglf", 0x25C4 }, /* BLACK LEFT-POINTING POINTER */ { "triagrt", 0x25BA }, /* BLACK RIGHT-POINTING POINTER */ { "triagup", 0x25B2 }, /* BLACK UP-POINTING TRIANGLE */ { "tsuperior", 0xF6F3 }, /* SUPERSCRIPT LATIN SMALL LETTER T */ { "two", 0x0032 }, /* DIGIT TWO */ { "twodotenleader", 0x2025 }, /* TWO DOT LEADER */ { "twoinferior", 0x2082 }, /* SUBSCRIPT TWO */ { "twooldstyle", 0xF732 }, /* OLDSTYLE DIGIT TWO */ { "twosuperior", 0x00B2 }, /* SUPERSCRIPT TWO */ { "twothirds", 0x2154 }, /* VULGAR FRACTION TWO THIRDS */ { "u", 0x0075 }, /* LATIN SMALL LETTER U */ { "uacute", 0x00FA }, /* LATIN SMALL LETTER U WITH ACUTE */ { "ubreve", 0x016D }, /* LATIN SMALL LETTER U WITH BREVE */ { "ucircumflex", 0x00FB }, /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ { "udieresis", 0x00FC }, /* LATIN SMALL LETTER U WITH DIAERESIS */ { "ugrave", 0x00F9 }, /* LATIN SMALL LETTER U WITH GRAVE */ { "uhorn", 0x01B0 }, /* LATIN SMALL LETTER U WITH HORN */ { "uhungarumlaut", 0x0171 }, /* LATIN SMALL LETTER U WITH DOUBLE ACUTE */ { "umacron", 0x016B }, /* LATIN SMALL LETTER U WITH MACRON */ { "underscore", 0x005F }, /* LOW LINE */ { "underscoredbl", 0x2017 }, /* DOUBLE LOW LINE */ { "union", 0x222A }, /* UNION */ { "universal", 0x2200 }, /* FOR ALL */ { "uogonek", 0x0173 }, /* LATIN SMALL LETTER U WITH OGONEK */ { "upblock", 0x2580 }, /* UPPER HALF BLOCK */ { "upsilon", 0x03C5 }, /* GREEK SMALL LETTER UPSILON */ { "upsilondieresis", 0x03CB }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ { "upsilondieresistonos", 0x03B0 }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ { "upsilontonos", 0x03CD }, /* GREEK SMALL LETTER UPSILON WITH TONOS */ { "uring", 0x016F }, /* LATIN SMALL LETTER U WITH RING ABOVE */ { "utilde", 0x0169 }, /* LATIN SMALL LETTER U WITH TILDE */ { "v", 0x0076 }, /* LATIN SMALL LETTER V */ { "w", 0x0077 }, /* LATIN SMALL LETTER W */ { "wacute", 0x1E83 }, /* LATIN SMALL LETTER W WITH ACUTE */ { "wcircumflex", 0x0175 }, /* LATIN SMALL LETTER W WITH CIRCUMFLEX */ { "wdieresis", 0x1E85 }, /* LATIN SMALL LETTER W WITH DIAERESIS */ { "weierstrass", 0x2118 }, /* SCRIPT CAPITAL P */ { "wgrave", 0x1E81 }, /* LATIN SMALL LETTER W WITH GRAVE */ { "x", 0x0078 }, /* LATIN SMALL LETTER X */ { "xi", 0x03BE }, /* GREEK SMALL LETTER XI */ { "y", 0x0079 }, /* LATIN SMALL LETTER Y */ { "yacute", 0x00FD }, /* LATIN SMALL LETTER Y WITH ACUTE */ { "ycircumflex", 0x0177 }, /* LATIN SMALL LETTER Y WITH CIRCUMFLEX */ { "ydieresis", 0x00FF }, /* LATIN SMALL LETTER Y WITH DIAERESIS */ { "yen", 0x00A5 }, /* YEN SIGN */ { "ygrave", 0x1EF3 }, /* LATIN SMALL LETTER Y WITH GRAVE */ { "z", 0x007A }, /* LATIN SMALL LETTER Z */ { "zacute", 0x017A }, /* LATIN SMALL LETTER Z WITH ACUTE */ { "zcaron", 0x017E }, /* LATIN SMALL LETTER Z WITH CARON */ { "zdotaccent", 0x017C }, /* LATIN SMALL LETTER Z WITH DOT ABOVE */ { "zero", 0x0030 }, /* DIGIT ZERO */ { "zeroinferior", 0x2080 }, /* SUBSCRIPT ZERO */ { "zerooldstyle", 0xF730 }, /* OLDSTYLE DIGIT ZERO */ { "zerosuperior", 0x2070 }, /* SUPERSCRIPT ZERO */ { "zeta", 0x03B6 } /* GREEK SMALL LETTER ZETA */ }; #if 0 static struct unicode2adobe unicode2adobe_table[] = { { 0, ".notdef" }, /* was: QUESTION MARK; changed to 0 */ { 0x0020, "space" }, /* SPACE */ { 0x0021, "exclam" }, /* EXCLAMATION MARK */ { 0x0022, "quotedbl" }, /* QUOTATION MARK */ { 0x0023, "numbersign" }, /* NUMBER SIGN */ { 0x0024, "dollar" }, /* DOLLAR SIGN */ { 0x0025, "percent" }, /* PERCENT SIGN */ { 0x0026, "ampersand" }, /* AMPERSAND */ { 0x0027, "quotesingle" }, /* APOSTROPHE */ { 0x0028, "parenleft" }, /* LEFT PARENTHESIS */ { 0x0029, "parenright" }, /* RIGHT PARENTHESIS */ { 0x002A, "asterisk" }, /* ASTERISK */ { 0x002B, "plus" }, /* PLUS SIGN */ { 0x002C, "comma" }, /* COMMA */ { 0x002D, "hyphen" }, /* HYPHEN-MINUS */ { 0x002D, "$hyphen" }, /* HYPHEN-MINUS; distinguish Adobe duplicates */ { 0x002E, "period" }, /* FULL STOP */ { 0x002F, "slash" }, /* SOLIDUS */ { 0x0030, "zero" }, /* DIGIT ZERO */ { 0x0031, "one" }, /* DIGIT ONE */ { 0x0032, "two" }, /* DIGIT TWO */ { 0x0033, "three" }, /* DIGIT THREE */ { 0x0034, "four" }, /* DIGIT FOUR */ { 0x0035, "five" }, /* DIGIT FIVE */ { 0x0036, "six" }, /* DIGIT SIX */ { 0x0037, "seven" }, /* DIGIT SEVEN */ { 0x0038, "eight" }, /* DIGIT EIGHT */ { 0x0039, "nine" }, /* DIGIT NINE */ { 0x003A, "colon" }, /* COLON */ { 0x003B, "semicolon" }, /* SEMICOLON */ { 0x003C, "less" }, /* LESS-THAN SIGN */ { 0x003D, "equal" }, /* EQUALS SIGN */ { 0x003E, "greater" }, /* GREATER-THAN SIGN */ { 0x003F, "question" }, /* QUESTION MARK */ { 0x0040, "at" }, /* COMMERCIAL AT */ { 0x0041, "A" }, /* LATIN CAPITAL LETTER A */ { 0x0042, "B" }, /* LATIN CAPITAL LETTER B */ { 0x0043, "C" }, /* LATIN CAPITAL LETTER C */ { 0x0044, "D" }, /* LATIN CAPITAL LETTER D */ { 0x0045, "E" }, /* LATIN CAPITAL LETTER E */ { 0x0046, "F" }, /* LATIN CAPITAL LETTER F */ { 0x0047, "G" }, /* LATIN CAPITAL LETTER G */ { 0x0048, "H" }, /* LATIN CAPITAL LETTER H */ { 0x0049, "I" }, /* LATIN CAPITAL LETTER I */ { 0x004A, "J" }, /* LATIN CAPITAL LETTER J */ { 0x004B, "K" }, /* LATIN CAPITAL LETTER K */ { 0x004C, "L" }, /* LATIN CAPITAL LETTER L */ { 0x004D, "M" }, /* LATIN CAPITAL LETTER M */ { 0x004E, "N" }, /* LATIN CAPITAL LETTER N */ { 0x004F, "O" }, /* LATIN CAPITAL LETTER O */ { 0x0050, "P" }, /* LATIN CAPITAL LETTER P */ { 0x0051, "Q" }, /* LATIN CAPITAL LETTER Q */ { 0x0052, "R" }, /* LATIN CAPITAL LETTER R */ { 0x0053, "S" }, /* LATIN CAPITAL LETTER S */ { 0x0054, "T" }, /* LATIN CAPITAL LETTER T */ { 0x0055, "U" }, /* LATIN CAPITAL LETTER U */ { 0x0056, "V" }, /* LATIN CAPITAL LETTER V */ { 0x0057, "W" }, /* LATIN CAPITAL LETTER W */ { 0x0058, "X" }, /* LATIN CAPITAL LETTER X */ { 0x0059, "Y" }, /* LATIN CAPITAL LETTER Y */ { 0x005A, "Z" }, /* LATIN CAPITAL LETTER Z */ { 0x005B, "bracketleft" }, /* LEFT SQUARE BRACKET */ { 0x005C, "backslash" }, /* REVERSE SOLIDUS */ { 0x005D, "bracketright" }, /* RIGHT SQUARE BRACKET */ { 0x005E, "circumflex" }, /* CIRCUMFLEX ACCENT */ /* SU: renamed from asciicircum */ { 0x005F, "underscore" }, /* LOW LINE */ { 0x0060, "grave" }, /* GRAVE ACCENT */ { 0x0061, "a" }, /* LATIN SMALL LETTER A */ { 0x0062, "b" }, /* LATIN SMALL LETTER B */ { 0x0063, "c" }, /* LATIN SMALL LETTER C */ { 0x0064, "d" }, /* LATIN SMALL LETTER D */ { 0x0065, "e" }, /* LATIN SMALL LETTER E */ { 0x0066, "f" }, /* LATIN SMALL LETTER F */ { 0x0067, "g" }, /* LATIN SMALL LETTER G */ { 0x0068, "h" }, /* LATIN SMALL LETTER H */ { 0x0069, "i" }, /* LATIN SMALL LETTER I */ { 0x006A, "j" }, /* LATIN SMALL LETTER J */ { 0x006B, "k" }, /* LATIN SMALL LETTER K */ { 0x006C, "l" }, /* LATIN SMALL LETTER L */ { 0x006D, "m" }, /* LATIN SMALL LETTER M */ { 0x006E, "n" }, /* LATIN SMALL LETTER N */ { 0x006F, "o" }, /* LATIN SMALL LETTER O */ { 0x0070, "p" }, /* LATIN SMALL LETTER P */ { 0x0071, "q" }, /* LATIN SMALL LETTER Q */ { 0x0072, "r" }, /* LATIN SMALL LETTER R */ { 0x0073, "s" }, /* LATIN SMALL LETTER S */ { 0x0074, "t" }, /* LATIN SMALL LETTER T */ { 0x0075, "u" }, /* LATIN SMALL LETTER U */ { 0x0076, "v" }, /* LATIN SMALL LETTER V */ { 0x0077, "w" }, /* LATIN SMALL LETTER W */ { 0x0078, "x" }, /* LATIN SMALL LETTER X */ { 0x0079, "y" }, /* LATIN SMALL LETTER Y */ { 0x007A, "z" }, /* LATIN SMALL LETTER Z */ { 0x007B, "braceleft" }, /* LEFT CURLY BRACKET */ { 0x007C, "bar" }, /* VERTICAL LINE */ { 0x007D, "braceright" }, /* RIGHT CURLY BRACKET */ { 0x007E, "tilde" }, /* TILDE */ /* SU: renamed from asciitilde */ { 0x00A0, "$spacenobreak" }, /* NO-BREAK SPACE; distinguish Adobe duplicates */ { 0x00A1, "exclamdown" }, /* INVERTED EXCLAMATION MARK */ { 0x00A2, "cent" }, /* CENT SIGN */ { 0x00A3, "sterling" }, /* POUND SIGN */ { 0x00A4, "currency" }, /* CURRENCY SIGN */ { 0x00A5, "yen" }, /* YEN SIGN */ { 0x00A6, "brokenbar" }, /* BROKEN BAR */ { 0x00A7, "section" }, /* SECTION SIGN */ { 0x00A8, "dieresis" }, /* DIAERESIS */ { 0x00A9, "copyright" }, /* COPYRIGHT SIGN */ { 0x00AA, "ordfeminine" }, /* FEMININE ORDINAL INDICATOR */ { 0x00AB, "guillemotleft" }, /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ { 0x00AC, "logicalnot" }, /* NOT SIGN */ { 0x00AD, "$hyphensoft" }, /* SOFT HYPHEN; distinguish Adobe duplicates */ { 0x00AE, "registered" }, /* REGISTERED SIGN */ { 0x00AF, "macron" }, /* MACRON */ { 0x00AF, "$macron" }, /* MACRON; distinguish Adobe duplicates */ { 0x00B0, "degree" }, /* DEGREE SIGN */ { 0x00B1, "plusminus" }, /* PLUS-MINUS SIGN */ { 0x00B2, "twosuperior" }, /* SUPERSCRIPT TWO */ { 0x00B3, "threesuperior" }, /* SUPERSCRIPT THREE */ { 0x00B4, "acute" }, /* ACUTE ACCENT */ { 0x00B5, "$micro" }, /* MICRO SIGN; distinguish Adobe duplicates */ { 0x00B5, "mu" }, /* MICRO SIGN */ { 0x00B6, "paragraph" }, /* PILCROW SIGN */ { 0x00B7, "periodcentered" }, /* MIDDLE DOT */ { 0x00B7, "$periodcentered" }, /* MIDDLE DOT; distinguish Adobe duplicates */ { 0x00B8, "cedilla" }, /* CEDILLA */ { 0x00B9, "onesuperior" }, /* SUPERSCRIPT ONE */ { 0x00BA, "ordmasculine" }, /* MASCULINE ORDINAL INDICATOR */ { 0x00BB, "guillemotright" }, /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ { 0x00BC, "onequarter" }, /* VULGAR FRACTION ONE QUARTER */ { 0x00BD, "onehalf" }, /* VULGAR FRACTION ONE HALF */ { 0x00BE, "threequarters" }, /* VULGAR FRACTION THREE QUARTERS */ { 0x00BF, "questiondown" }, /* INVERTED QUESTION MARK */ { 0x00C0, "Agrave" }, /* LATIN CAPITAL LETTER A WITH GRAVE */ { 0x00C1, "Aacute" }, /* LATIN CAPITAL LETTER A WITH ACUTE */ { 0x00C2, "Acircumflex" }, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ { 0x00C3, "Atilde" }, /* LATIN CAPITAL LETTER A WITH TILDE */ { 0x00C4, "Adieresis" }, /* LATIN CAPITAL LETTER A WITH DIAERESIS */ { 0x00C5, "Aring" }, /* LATIN CAPITAL LETTER A WITH RING ABOVE */ { 0x00C6, "AE" }, /* LATIN CAPITAL LETTER AE */ { 0x00C7, "Ccedilla" }, /* LATIN CAPITAL LETTER C WITH CEDILLA */ { 0x00C8, "Egrave" }, /* LATIN CAPITAL LETTER E WITH GRAVE */ { 0x00C9, "Eacute" }, /* LATIN CAPITAL LETTER E WITH ACUTE */ { 0x00CA, "Ecircumflex" }, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ { 0x00CB, "Edieresis" }, /* LATIN CAPITAL LETTER E WITH DIAERESIS */ { 0x00CC, "Igrave" }, /* LATIN CAPITAL LETTER I WITH GRAVE */ { 0x00CD, "Iacute" }, /* LATIN CAPITAL LETTER I WITH ACUTE */ { 0x00CE, "Icircumflex" }, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ { 0x00CF, "Idieresis" }, /* LATIN CAPITAL LETTER I WITH DIAERESIS */ { 0x00D0, "Eth" }, /* LATIN CAPITAL LETTER ETH */ { 0x00D1, "Ntilde" }, /* LATIN CAPITAL LETTER N WITH TILDE */ { 0x00D2, "Ograve" }, /* LATIN CAPITAL LETTER O WITH GRAVE */ { 0x00D3, "Oacute" }, /* LATIN CAPITAL LETTER O WITH ACUTE */ { 0x00D4, "Ocircumflex" }, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ { 0x00D5, "Otilde" }, /* LATIN CAPITAL LETTER O WITH TILDE */ { 0x00D6, "Odieresis" }, /* LATIN CAPITAL LETTER O WITH DIAERESIS */ { 0x00D7, "multiply" }, /* MULTIPLICATION SIGN */ { 0x00D8, "Oslash" }, /* LATIN CAPITAL LETTER O WITH STROKE */ { 0x00D9, "Ugrave" }, /* LATIN CAPITAL LETTER U WITH GRAVE */ { 0x00DA, "Uacute" }, /* LATIN CAPITAL LETTER U WITH ACUTE */ { 0x00DB, "Ucircumflex" }, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ { 0x00DC, "Udieresis" }, /* LATIN CAPITAL LETTER U WITH DIAERESIS */ { 0x00DD, "Yacute" }, /* LATIN CAPITAL LETTER Y WITH ACUTE */ { 0x00DE, "Thorn" }, /* LATIN CAPITAL LETTER THORN */ { 0x00DF, "germandbls" }, /* LATIN SMALL LETTER SHARP S */ { 0x00E0, "agrave" }, /* LATIN SMALL LETTER A WITH GRAVE */ { 0x00E1, "aacute" }, /* LATIN SMALL LETTER A WITH ACUTE */ { 0x00E2, "acircumflex" }, /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ { 0x00E3, "atilde" }, /* LATIN SMALL LETTER A WITH TILDE */ { 0x00E4, "adieresis" }, /* LATIN SMALL LETTER A WITH DIAERESIS */ { 0x00E5, "aring" }, /* LATIN SMALL LETTER A WITH RING ABOVE */ { 0x00E6, "ae" }, /* LATIN SMALL LETTER AE */ { 0x00E7, "ccedilla" }, /* LATIN SMALL LETTER C WITH CEDILLA */ { 0x00E8, "egrave" }, /* LATIN SMALL LETTER E WITH GRAVE */ { 0x00E9, "eacute" }, /* LATIN SMALL LETTER E WITH ACUTE */ { 0x00EA, "ecircumflex" }, /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ { 0x00EB, "edieresis" }, /* LATIN SMALL LETTER E WITH DIAERESIS */ { 0x00EC, "igrave" }, /* LATIN SMALL LETTER I WITH GRAVE */ { 0x00ED, "iacute" }, /* LATIN SMALL LETTER I WITH ACUTE */ { 0x00EE, "icircumflex" }, /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ { 0x00EF, "idieresis" }, /* LATIN SMALL LETTER I WITH DIAERESIS */ { 0x00F0, "eth" }, /* LATIN SMALL LETTER ETH */ { 0x00F1, "ntilde" }, /* LATIN SMALL LETTER N WITH TILDE */ { 0x00F2, "ograve" }, /* LATIN SMALL LETTER O WITH GRAVE */ { 0x00F3, "oacute" }, /* LATIN SMALL LETTER O WITH ACUTE */ { 0x00F4, "ocircumflex" }, /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ { 0x00F5, "otilde" }, /* LATIN SMALL LETTER O WITH TILDE */ { 0x00F6, "odieresis" }, /* LATIN SMALL LETTER O WITH DIAERESIS */ { 0x00F7, "divide" }, /* DIVISION SIGN */ { 0x00F8, "oslash" }, /* LATIN SMALL LETTER O WITH STROKE */ { 0x00F9, "ugrave" }, /* LATIN SMALL LETTER U WITH GRAVE */ { 0x00FA, "uacute" }, /* LATIN SMALL LETTER U WITH ACUTE */ { 0x00FB, "ucircumflex" }, /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ { 0x00FC, "udieresis" }, /* LATIN SMALL LETTER U WITH DIAERESIS */ { 0x00FD, "yacute" }, /* LATIN SMALL LETTER Y WITH ACUTE */ { 0x00FE, "thorn" }, /* LATIN SMALL LETTER THORN */ { 0x00FF, "ydieresis" }, /* LATIN SMALL LETTER Y WITH DIAERESIS */ { 0x0100, "Amacron" }, /* LATIN CAPITAL LETTER A WITH MACRON */ { 0x0101, "amacron" }, /* LATIN SMALL LETTER A WITH MACRON */ { 0x0102, "Abreve" }, /* LATIN CAPITAL LETTER A WITH BREVE */ { 0x0103, "abreve" }, /* LATIN SMALL LETTER A WITH BREVE */ { 0x0104, "Aogonek" }, /* LATIN CAPITAL LETTER A WITH OGONEK */ { 0x0105, "aogonek" }, /* LATIN SMALL LETTER A WITH OGONEK */ { 0x0106, "Cacute" }, /* LATIN CAPITAL LETTER C WITH ACUTE */ { 0x0107, "cacute" }, /* LATIN SMALL LETTER C WITH ACUTE */ { 0x0108, "Ccircumflex" }, /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ { 0x0109, "ccircumflex" }, /* LATIN SMALL LETTER C WITH CIRCUMFLEX */ { 0x010A, "Cdotaccent" }, /* LATIN CAPITAL LETTER C WITH DOT ABOVE */ { 0x010B, "cdotaccent" }, /* LATIN SMALL LETTER C WITH DOT ABOVE */ { 0x010C, "Ccaron" }, /* LATIN CAPITAL LETTER C WITH CARON */ { 0x010D, "ccaron" }, /* LATIN SMALL LETTER C WITH CARON */ { 0x010E, "Dcaron" }, /* LATIN CAPITAL LETTER D WITH CARON */ { 0x010F, "dcaron" }, /* LATIN SMALL LETTER D WITH CARON */ { 0x0110, "Dcroat" }, /* LATIN CAPITAL LETTER D WITH STROKE */ { 0x0111, "dcroat" }, /* LATIN SMALL LETTER D WITH STROKE */ { 0x0112, "Emacron" }, /* LATIN CAPITAL LETTER E WITH MACRON */ { 0x0113, "emacron" }, /* LATIN SMALL LETTER E WITH MACRON */ { 0x0114, "Ebreve" }, /* LATIN CAPITAL LETTER E WITH BREVE */ { 0x0115, "ebreve" }, /* LATIN SMALL LETTER E WITH BREVE */ { 0x0116, "Edotaccent" }, /* LATIN CAPITAL LETTER E WITH DOT ABOVE */ { 0x0117, "edotaccent" }, /* LATIN SMALL LETTER E WITH DOT ABOVE */ { 0x0118, "Eogonek" }, /* LATIN CAPITAL LETTER E WITH OGONEK */ { 0x0119, "eogonek" }, /* LATIN SMALL LETTER E WITH OGONEK */ { 0x011A, "Ecaron" }, /* LATIN CAPITAL LETTER E WITH CARON */ { 0x011B, "ecaron" }, /* LATIN SMALL LETTER E WITH CARON */ { 0x011C, "Gcircumflex" }, /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ { 0x011D, "gcircumflex" }, /* LATIN SMALL LETTER G WITH CIRCUMFLEX */ { 0x011E, "Gbreve" }, /* LATIN CAPITAL LETTER G WITH BREVE */ { 0x011F, "gbreve" }, /* LATIN SMALL LETTER G WITH BREVE */ { 0x0120, "Gdotaccent" }, /* LATIN CAPITAL LETTER G WITH DOT ABOVE */ { 0x0121, "gdotaccent" }, /* LATIN SMALL LETTER G WITH DOT ABOVE */ { 0x0122, "Gcommaaccent" }, /* LATIN CAPITAL LETTER G WITH CEDILLA */ { 0x0123, "gcommaaccent" }, /* LATIN SMALL LETTER G WITH CEDILLA */ { 0x0124, "Hcircumflex" }, /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ { 0x0125, "hcircumflex" }, /* LATIN SMALL LETTER H WITH CIRCUMFLEX */ { 0x0126, "Hbar" }, /* LATIN CAPITAL LETTER H WITH STROKE */ { 0x0127, "hbar" }, /* LATIN SMALL LETTER H WITH STROKE */ { 0x0128, "Itilde" }, /* LATIN CAPITAL LETTER I WITH TILDE */ { 0x0129, "itilde" }, /* LATIN SMALL LETTER I WITH TILDE */ { 0x012A, "Imacron" }, /* LATIN CAPITAL LETTER I WITH MACRON */ { 0x012B, "imacron" }, /* LATIN SMALL LETTER I WITH MACRON */ { 0x012C, "Ibreve" }, /* LATIN CAPITAL LETTER I WITH BREVE */ { 0x012D, "ibreve" }, /* LATIN SMALL LETTER I WITH BREVE */ { 0x012E, "Iogonek" }, /* LATIN CAPITAL LETTER I WITH OGONEK */ { 0x012F, "iogonek" }, /* LATIN SMALL LETTER I WITH OGONEK */ { 0x0130, "Idotaccent" }, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */ { 0x0131, "dotlessi" }, /* LATIN SMALL LETTER DOTLESS I */ { 0x0132, "IJ" }, /* LATIN CAPITAL LIGATURE IJ */ { 0x0133, "ij" }, /* LATIN SMALL LIGATURE IJ */ { 0x0134, "Jcircumflex" }, /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ { 0x0135, "jcircumflex" }, /* LATIN SMALL LETTER J WITH CIRCUMFLEX */ { 0x0136, "Kcommaaccent" }, /* LATIN CAPITAL LETTER K WITH CEDILLA */ { 0x0137, "kcommaaccent" }, /* LATIN SMALL LETTER K WITH CEDILLA */ { 0x0138, "kgreenlandic" }, /* LATIN SMALL LETTER KRA */ { 0x0139, "Lacute" }, /* LATIN CAPITAL LETTER L WITH ACUTE */ { 0x013A, "lacute" }, /* LATIN SMALL LETTER L WITH ACUTE */ { 0x013B, "Lcommaaccent" }, /* LATIN CAPITAL LETTER L WITH CEDILLA */ { 0x013C, "lcommaaccent" }, /* LATIN SMALL LETTER L WITH CEDILLA */ { 0x013D, "Lcaron" }, /* LATIN CAPITAL LETTER L WITH CARON */ { 0x013E, "lcaron" }, /* LATIN SMALL LETTER L WITH CARON */ { 0x013F, "Ldot" }, /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */ { 0x0140, "ldot" }, /* LATIN SMALL LETTER L WITH MIDDLE DOT */ { 0x0141, "Lslash" }, /* LATIN CAPITAL LETTER L WITH STROKE */ { 0x0142, "lslash" }, /* LATIN SMALL LETTER L WITH STROKE */ { 0x0143, "Nacute" }, /* LATIN CAPITAL LETTER N WITH ACUTE */ { 0x0144, "nacute" }, /* LATIN SMALL LETTER N WITH ACUTE */ { 0x0145, "Ncommaaccent" }, /* LATIN CAPITAL LETTER N WITH CEDILLA */ { 0x0146, "ncommaaccent" }, /* LATIN SMALL LETTER N WITH CEDILLA */ { 0x0147, "Ncaron" }, /* LATIN CAPITAL LETTER N WITH CARON */ { 0x0148, "ncaron" }, /* LATIN SMALL LETTER N WITH CARON */ { 0x0149, "napostrophe" }, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */ { 0x014A, "Eng" }, /* LATIN CAPITAL LETTER ENG */ { 0x014B, "eng" }, /* LATIN SMALL LETTER ENG */ { 0x014C, "Omacron" }, /* LATIN CAPITAL LETTER O WITH MACRON */ { 0x014D, "omacron" }, /* LATIN SMALL LETTER O WITH MACRON */ { 0x014E, "Obreve" }, /* LATIN CAPITAL LETTER O WITH BREVE */ { 0x014F, "obreve" }, /* LATIN SMALL LETTER O WITH BREVE */ { 0x0150, "Ohungarumlaut" }, /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ { 0x0151, "ohungarumlaut" }, /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */ { 0x0152, "OE" }, /* LATIN CAPITAL LIGATURE OE */ { 0x0153, "oe" }, /* LATIN SMALL LIGATURE OE */ { 0x0154, "Racute" }, /* LATIN CAPITAL LETTER R WITH ACUTE */ { 0x0155, "racute" }, /* LATIN SMALL LETTER R WITH ACUTE */ { 0x0156, "Rcommaaccent" }, /* LATIN CAPITAL LETTER R WITH CEDILLA */ { 0x0157, "rcommaaccent" }, /* LATIN SMALL LETTER R WITH CEDILLA */ { 0x0158, "Rcaron" }, /* LATIN CAPITAL LETTER R WITH CARON */ { 0x0159, "rcaron" }, /* LATIN SMALL LETTER R WITH CARON */ { 0x015A, "Sacute" }, /* LATIN CAPITAL LETTER S WITH ACUTE */ { 0x015B, "sacute" }, /* LATIN SMALL LETTER S WITH ACUTE */ { 0x015C, "Scircumflex" }, /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ { 0x015D, "scircumflex" }, /* LATIN SMALL LETTER S WITH CIRCUMFLEX */ { 0x015E, "Scedilla" }, /* LATIN CAPITAL LETTER S WITH CEDILLA */ { 0x015E, "$Scedilla" }, /* LATIN CAPITAL LETTER S WITH CEDILLA; distinguish Adobe duplicates */ { 0x015F, "scedilla" }, /* LATIN SMALL LETTER S WITH CEDILLA */ { 0x015F, "$scedilla" }, /* LATIN SMALL LETTER S WITH CEDILLA; distinguish Adobe duplicates */ { 0x0160, "Scaron" }, /* LATIN CAPITAL LETTER S WITH CARON */ { 0x0161, "scaron" }, /* LATIN SMALL LETTER S WITH CARON */ { 0x0162, "$Tcedilla" }, /* LATIN CAPITAL LETTER T WITH CEDILLA; distinguish Adobe duplicates */ { 0x0162, "Tcommaaccent" }, /* LATIN CAPITAL LETTER T WITH CEDILLA */ { 0x0163, "$tcedilla" }, /* LATIN SMALL LETTER T WITH CEDILLA; distinguish Adobe duplicates */ { 0x0163, "tcommaaccent" }, /* LATIN SMALL LETTER T WITH CEDILLA */ { 0x0164, "Tcaron" }, /* LATIN CAPITAL LETTER T WITH CARON */ { 0x0165, "tcaron" }, /* LATIN SMALL LETTER T WITH CARON */ { 0x0166, "Tbar" }, /* LATIN CAPITAL LETTER T WITH STROKE */ { 0x0167, "tbar" }, /* LATIN SMALL LETTER T WITH STROKE */ { 0x0168, "Utilde" }, /* LATIN CAPITAL LETTER U WITH TILDE */ { 0x0169, "utilde" }, /* LATIN SMALL LETTER U WITH TILDE */ { 0x016A, "Umacron" }, /* LATIN CAPITAL LETTER U WITH MACRON */ { 0x016B, "umacron" }, /* LATIN SMALL LETTER U WITH MACRON */ { 0x016C, "Ubreve" }, /* LATIN CAPITAL LETTER U WITH BREVE */ { 0x016D, "ubreve" }, /* LATIN SMALL LETTER U WITH BREVE */ { 0x016E, "Uring" }, /* LATIN CAPITAL LETTER U WITH RING ABOVE */ { 0x016F, "uring" }, /* LATIN SMALL LETTER U WITH RING ABOVE */ { 0x0170, "Uhungarumlaut" }, /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ { 0x0171, "uhungarumlaut" }, /* LATIN SMALL LETTER U WITH DOUBLE ACUTE */ { 0x0172, "Uogonek" }, /* LATIN CAPITAL LETTER U WITH OGONEK */ { 0x0173, "uogonek" }, /* LATIN SMALL LETTER U WITH OGONEK */ { 0x0174, "Wcircumflex" }, /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ { 0x0175, "wcircumflex" }, /* LATIN SMALL LETTER W WITH CIRCUMFLEX */ { 0x0176, "Ycircumflex" }, /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ { 0x0177, "ycircumflex" }, /* LATIN SMALL LETTER Y WITH CIRCUMFLEX */ { 0x0178, "Ydieresis" }, /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ { 0x0179, "Zacute" }, /* LATIN CAPITAL LETTER Z WITH ACUTE */ { 0x017A, "zacute" }, /* LATIN SMALL LETTER Z WITH ACUTE */ { 0x017B, "Zdotaccent" }, /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */ { 0x017C, "zdotaccent" }, /* LATIN SMALL LETTER Z WITH DOT ABOVE */ { 0x017D, "Zcaron" }, /* LATIN CAPITAL LETTER Z WITH CARON */ { 0x017E, "zcaron" }, /* LATIN SMALL LETTER Z WITH CARON */ { 0x017F, "longs" }, /* LATIN SMALL LETTER LONG S */ { 0x0192, "florin" }, /* LATIN SMALL LETTER F WITH HOOK */ { 0x01A0, "Ohorn" }, /* LATIN CAPITAL LETTER O WITH HORN */ { 0x01A1, "ohorn" }, /* LATIN SMALL LETTER O WITH HORN */ { 0x01AF, "Uhorn" }, /* LATIN CAPITAL LETTER U WITH HORN */ { 0x01B0, "uhorn" }, /* LATIN SMALL LETTER U WITH HORN */ { 0x01E6, "Gcaron" }, /* LATIN CAPITAL LETTER G WITH CARON */ { 0x01E7, "gcaron" }, /* LATIN SMALL LETTER G WITH CARON */ { 0x01FA, "Aringacute" }, /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */ { 0x01FB, "aringacute" }, /* LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE */ { 0x01FC, "AEacute" }, /* LATIN CAPITAL LETTER AE WITH ACUTE */ { 0x01FD, "aeacute" }, /* LATIN SMALL LETTER AE WITH ACUTE */ { 0x01FE, "Oslashacute" }, /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */ { 0x01FF, "oslashacute" }, /* LATIN SMALL LETTER O WITH STROKE AND ACUTE */ { 0x0218, "Scommaaccent" }, /* LATIN CAPITAL LETTER S WITH COMMA BELOW */ { 0x0219, "scommaaccent" }, /* LATIN SMALL LETTER S WITH COMMA BELOW */ { 0x021A, "$Tcommaaccent" }, /* LATIN CAPITAL LETTER T WITH COMMA BELOW; distinguish Adobe duplicates */ { 0x021B, "$tcommaaccent" }, /* LATIN SMALL LETTER T WITH COMMA BELOW; distinguish Adobe duplicates */ { 0x02BC, "afii57929" }, /* MODIFIER LETTER APOSTROPHE */ { 0x02BD, "afii64937" }, /* MODIFIER LETTER REVERSED COMMA */ { 0x02C6, "circumflex" }, /* MODIFIER LETTER CIRCUMFLEX ACCENT */ { 0x02C7, "caron" }, /* CARON */ { 0x02C9, "$macronmodifier" }, /* MODIFIER LETTER MACRON */ { 0x02CA, "$acutemodifier" }, /* MODIFIER LETTER ACUTE ACCENT */ { 0x02CB, "$gravemodifier" }, /* MODIFIER LETTER GRAVE ACCENT */ { 0x02D8, "breve" }, /* BREVE */ { 0x02D9, "dotaccent" }, /* DOT ABOVE */ { 0x02DA, "ring" }, /* RING ABOVE */ { 0x02DB, "ogonek" }, /* OGONEK */ { 0x02DC, "tilde" }, /* SMALL TILDE */ { 0x02DD, "hungarumlaut" }, /* DOUBLE ACUTE ACCENT */ { 0x0300, "gravecomb" }, /* COMBINING GRAVE ACCENT */ { 0x0301, "acutecomb" }, /* COMBINING ACUTE ACCENT */ { 0x0302, "$circumflexcomb" }, /* COMBINING CIRCUMFLEX ACCENT */ { 0x0303, "tildecomb" }, /* COMBINING TILDE */ { 0x0304, "$macroncomb" }, /* COMBINING MACRON */ { 0x0305, "$overlinecomb" }, /* COMBINING OVERLINE */ { 0x0306, "$brevecomb" }, /* COMBINING BREVE */ { 0x0307, "$dotaccentcomb" }, /* COMBINING DOT ABOVE */ { 0x0308, "$dieresiscomb" }, /* COMBINING DIAERESIS */ { 0x0309, "hookabovecomb" }, /* COMBINING HOOK ABOVE */ { 0x030A, "$ringcomb" }, /* COMBINING RING ABOVE */ { 0x030C, "$caroncomb" }, /* COMBINING CARON */ { 0x0323, "dotbelowcomb" }, /* COMBINING DOT BELOW */ { 0x0327, "$cedillacomb" }, /* COMBINING CEDILLA */ { 0x0328, "$ogonekcomb" }, /* COMBINING OGONEK */ { 0x0338, "$slashlongcomb" }, /* COMBINING LONG SOLIDUS OVERLAY */ { 0x0384, "tonos" }, /* GREEK TONOS */ { 0x0385, "dieresistonos" }, /* GREEK DIALYTIKA TONOS */ { 0x0386, "Alphatonos" }, /* GREEK CAPITAL LETTER ALPHA WITH TONOS */ { 0x0387, "anoteleia" }, /* GREEK ANO TELEIA */ { 0x0388, "Epsilontonos" }, /* GREEK CAPITAL LETTER EPSILON WITH TONOS */ { 0x0389, "Etatonos" }, /* GREEK CAPITAL LETTER ETA WITH TONOS */ { 0x038A, "Iotatonos" }, /* GREEK CAPITAL LETTER IOTA WITH TONOS */ { 0x038C, "Omicrontonos" }, /* GREEK CAPITAL LETTER OMICRON WITH TONOS */ { 0x038E, "Upsilontonos" }, /* GREEK CAPITAL LETTER UPSILON WITH TONOS */ { 0x038F, "Omegatonos" }, /* GREEK CAPITAL LETTER OMEGA WITH TONOS */ { 0x0390, "iotadieresistonos" }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ { 0x0391, "Alpha" }, /* GREEK CAPITAL LETTER ALPHA */ { 0x0392, "Beta" }, /* GREEK CAPITAL LETTER BETA */ { 0x0393, "Gamma" }, /* GREEK CAPITAL LETTER GAMMA */ { 0x0394, "$Delta" }, /* GREEK CAPITAL LETTER DELTA; distinguish Adobe duplicates */ { 0x0395, "Epsilon" }, /* GREEK CAPITAL LETTER EPSILON */ { 0x0396, "Zeta" }, /* GREEK CAPITAL LETTER ZETA */ { 0x0397, "Eta" }, /* GREEK CAPITAL LETTER ETA */ { 0x0398, "Theta" }, /* GREEK CAPITAL LETTER THETA */ { 0x0399, "Iota" }, /* GREEK CAPITAL LETTER IOTA */ { 0x039A, "Kappa" }, /* GREEK CAPITAL LETTER KAPPA */ { 0x039B, "Lambda" }, /* GREEK CAPITAL LETTER LAMDA */ { 0x039C, "Mu" }, /* GREEK CAPITAL LETTER MU */ { 0x039D, "Nu" }, /* GREEK CAPITAL LETTER NU */ { 0x039E, "Xi" }, /* GREEK CAPITAL LETTER XI */ { 0x039F, "Omicron" }, /* GREEK CAPITAL LETTER OMICRON */ { 0x03A0, "Pi" }, /* GREEK CAPITAL LETTER PI */ { 0x03A1, "Rho" }, /* GREEK CAPITAL LETTER RHO */ { 0x03A3, "Sigma" }, /* GREEK CAPITAL LETTER SIGMA */ { 0x03A4, "Tau" }, /* GREEK CAPITAL LETTER TAU */ { 0x03A5, "Upsilon" }, /* GREEK CAPITAL LETTER UPSILON */ { 0x03A6, "Phi" }, /* GREEK CAPITAL LETTER PHI */ { 0x03A7, "Chi" }, /* GREEK CAPITAL LETTER CHI */ { 0x03A8, "Psi" }, /* GREEK CAPITAL LETTER PSI */ { 0x03A9, "$Omega" }, /* GREEK CAPITAL LETTER OMEGA; distinguish Adobe duplicates */ { 0x03AA, "Iotadieresis" }, /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ { 0x03AB, "Upsilondieresis" }, /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ { 0x03AC, "alphatonos" }, /* GREEK SMALL LETTER ALPHA WITH TONOS */ { 0x03AD, "epsilontonos" }, /* GREEK SMALL LETTER EPSILON WITH TONOS */ { 0x03AE, "etatonos" }, /* GREEK SMALL LETTER ETA WITH TONOS */ { 0x03AF, "iotatonos" }, /* GREEK SMALL LETTER IOTA WITH TONOS */ { 0x03B0, "upsilondieresistonos" }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ { 0x03B1, "alpha" }, /* GREEK SMALL LETTER ALPHA */ { 0x03B2, "beta" }, /* GREEK SMALL LETTER BETA */ { 0x03B3, "gamma" }, /* GREEK SMALL LETTER GAMMA */ { 0x03B4, "delta" }, /* GREEK SMALL LETTER DELTA */ { 0x03B5, "epsilon" }, /* GREEK SMALL LETTER EPSILON */ { 0x03B6, "zeta" }, /* GREEK SMALL LETTER ZETA */ { 0x03B7, "eta" }, /* GREEK SMALL LETTER ETA */ { 0x03B8, "theta" }, /* GREEK SMALL LETTER THETA */ { 0x03B9, "iota" }, /* GREEK SMALL LETTER IOTA */ { 0x03BA, "kappa" }, /* GREEK SMALL LETTER KAPPA */ { 0x03BB, "lambda" }, /* GREEK SMALL LETTER LAMDA */ { 0x03BC, "$mu" }, /* GREEK SMALL LETTER MU; distinguish Adobe duplicates */ { 0x03BD, "nu" }, /* GREEK SMALL LETTER NU */ { 0x03BE, "xi" }, /* GREEK SMALL LETTER XI */ { 0x03BF, "omicron" }, /* GREEK SMALL LETTER OMICRON */ { 0x03C0, "pi" }, /* GREEK SMALL LETTER PI */ { 0x03C1, "rho" }, /* GREEK SMALL LETTER RHO */ { 0x03C2, "sigma1" }, /* GREEK SMALL LETTER FINAL SIGMA */ { 0x03C3, "sigma" }, /* GREEK SMALL LETTER SIGMA */ { 0x03C4, "tau" }, /* GREEK SMALL LETTER TAU */ { 0x03C5, "upsilon" }, /* GREEK SMALL LETTER UPSILON */ { 0x03C6, "phi" }, /* GREEK SMALL LETTER PHI */ { 0x03C7, "chi" }, /* GREEK SMALL LETTER CHI */ { 0x03C8, "psi" }, /* GREEK SMALL LETTER PSI */ { 0x03C9, "omega" }, /* GREEK SMALL LETTER OMEGA */ { 0x03CA, "iotadieresis" }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */ { 0x03CB, "upsilondieresis" }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ { 0x03CC, "omicrontonos" }, /* GREEK SMALL LETTER OMICRON WITH TONOS */ { 0x03CD, "upsilontonos" }, /* GREEK SMALL LETTER UPSILON WITH TONOS */ { 0x03CE, "omegatonos" }, /* GREEK SMALL LETTER OMEGA WITH TONOS */ { 0x03D1, "theta1" }, /* GREEK THETA SYMBOL */ { 0x03D2, "Upsilon1" }, /* GREEK UPSILON WITH HOOK SYMBOL */ { 0x03D5, "phi1" }, /* GREEK PHI SYMBOL */ { 0x03D6, "omega1" }, /* GREEK PI SYMBOL */ { 0x03D6, "$pi1" }, /* GREEK PI SYMBOL; Adobe has this as "omega1" which is too confusing */ { 0x03F1, "$rho1" }, /* GREEK RHO SYMBOL */ { 0x03F5, "$epsilon1" }, /* GREEK LUNATE EPSILON SYMBOL */ { 0x0401, "afii10023" }, /* CYRILLIC CAPITAL LETTER IO */ { 0x0402, "afii10051" }, /* CYRILLIC CAPITAL LETTER DJE */ { 0x0403, "afii10052" }, /* CYRILLIC CAPITAL LETTER GJE */ { 0x0404, "afii10053" }, /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */ { 0x0405, "afii10054" }, /* CYRILLIC CAPITAL LETTER DZE */ { 0x0406, "afii10055" }, /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ { 0x0407, "afii10056" }, /* CYRILLIC CAPITAL LETTER YI */ { 0x0408, "afii10057" }, /* CYRILLIC CAPITAL LETTER JE */ { 0x0409, "afii10058" }, /* CYRILLIC CAPITAL LETTER LJE */ { 0x040A, "afii10059" }, /* CYRILLIC CAPITAL LETTER NJE */ { 0x040B, "afii10060" }, /* CYRILLIC CAPITAL LETTER TSHE */ { 0x040C, "afii10061" }, /* CYRILLIC CAPITAL LETTER KJE */ { 0x040E, "afii10062" }, /* CYRILLIC CAPITAL LETTER SHORT U */ { 0x040F, "afii10145" }, /* CYRILLIC CAPITAL LETTER DZHE */ { 0x0410, "afii10017" }, /* CYRILLIC CAPITAL LETTER A */ { 0x0411, "afii10018" }, /* CYRILLIC CAPITAL LETTER BE */ { 0x0412, "afii10019" }, /* CYRILLIC CAPITAL LETTER VE */ { 0x0413, "afii10020" }, /* CYRILLIC CAPITAL LETTER GHE */ { 0x0414, "afii10021" }, /* CYRILLIC CAPITAL LETTER DE */ { 0x0415, "afii10022" }, /* CYRILLIC CAPITAL LETTER IE */ { 0x0416, "afii10024" }, /* CYRILLIC CAPITAL LETTER ZHE */ { 0x0417, "afii10025" }, /* CYRILLIC CAPITAL LETTER ZE */ { 0x0418, "afii10026" }, /* CYRILLIC CAPITAL LETTER I */ { 0x0419, "afii10027" }, /* CYRILLIC CAPITAL LETTER SHORT I */ { 0x041A, "afii10028" }, /* CYRILLIC CAPITAL LETTER KA */ { 0x041B, "afii10029" }, /* CYRILLIC CAPITAL LETTER EL */ { 0x041C, "afii10030" }, /* CYRILLIC CAPITAL LETTER EM */ { 0x041D, "afii10031" }, /* CYRILLIC CAPITAL LETTER EN */ { 0x041E, "afii10032" }, /* CYRILLIC CAPITAL LETTER O */ { 0x041F, "afii10033" }, /* CYRILLIC CAPITAL LETTER PE */ { 0x0420, "afii10034" }, /* CYRILLIC CAPITAL LETTER ER */ { 0x0421, "afii10035" }, /* CYRILLIC CAPITAL LETTER ES */ { 0x0422, "afii10036" }, /* CYRILLIC CAPITAL LETTER TE */ { 0x0423, "afii10037" }, /* CYRILLIC CAPITAL LETTER U */ { 0x0424, "afii10038" }, /* CYRILLIC CAPITAL LETTER EF */ { 0x0425, "afii10039" }, /* CYRILLIC CAPITAL LETTER HA */ { 0x0426, "afii10040" }, /* CYRILLIC CAPITAL LETTER TSE */ { 0x0427, "afii10041" }, /* CYRILLIC CAPITAL LETTER CHE */ { 0x0428, "afii10042" }, /* CYRILLIC CAPITAL LETTER SHA */ { 0x0429, "afii10043" }, /* CYRILLIC CAPITAL LETTER SHCHA */ { 0x042A, "afii10044" }, /* CYRILLIC CAPITAL LETTER HARD SIGN */ { 0x042B, "afii10045" }, /* CYRILLIC CAPITAL LETTER YERU */ { 0x042C, "afii10046" }, /* CYRILLIC CAPITAL LETTER SOFT SIGN */ { 0x042D, "afii10047" }, /* CYRILLIC CAPITAL LETTER E */ { 0x042E, "afii10048" }, /* CYRILLIC CAPITAL LETTER YU */ { 0x042F, "afii10049" }, /* CYRILLIC CAPITAL LETTER YA */ { 0x0430, "afii10065" }, /* CYRILLIC SMALL LETTER A */ { 0x0431, "afii10066" }, /* CYRILLIC SMALL LETTER BE */ { 0x0432, "afii10067" }, /* CYRILLIC SMALL LETTER VE */ { 0x0433, "afii10068" }, /* CYRILLIC SMALL LETTER GHE */ { 0x0434, "afii10069" }, /* CYRILLIC SMALL LETTER DE */ { 0x0435, "afii10070" }, /* CYRILLIC SMALL LETTER IE */ { 0x0436, "afii10072" }, /* CYRILLIC SMALL LETTER ZHE */ { 0x0437, "afii10073" }, /* CYRILLIC SMALL LETTER ZE */ { 0x0438, "afii10074" }, /* CYRILLIC SMALL LETTER I */ { 0x0439, "afii10075" }, /* CYRILLIC SMALL LETTER SHORT I */ { 0x043A, "afii10076" }, /* CYRILLIC SMALL LETTER KA */ { 0x043B, "afii10077" }, /* CYRILLIC SMALL LETTER EL */ { 0x043C, "afii10078" }, /* CYRILLIC SMALL LETTER EM */ { 0x043D, "afii10079" }, /* CYRILLIC SMALL LETTER EN */ { 0x043E, "afii10080" }, /* CYRILLIC SMALL LETTER O */ { 0x043F, "afii10081" }, /* CYRILLIC SMALL LETTER PE */ { 0x0440, "afii10082" }, /* CYRILLIC SMALL LETTER ER */ { 0x0441, "afii10083" }, /* CYRILLIC SMALL LETTER ES */ { 0x0442, "afii10084" }, /* CYRILLIC SMALL LETTER TE */ { 0x0443, "afii10085" }, /* CYRILLIC SMALL LETTER U */ { 0x0444, "afii10086" }, /* CYRILLIC SMALL LETTER EF */ { 0x0445, "afii10087" }, /* CYRILLIC SMALL LETTER HA */ { 0x0446, "afii10088" }, /* CYRILLIC SMALL LETTER TSE */ { 0x0447, "afii10089" }, /* CYRILLIC SMALL LETTER CHE */ { 0x0448, "afii10090" }, /* CYRILLIC SMALL LETTER SHA */ { 0x0449, "afii10091" }, /* CYRILLIC SMALL LETTER SHCHA */ { 0x044A, "afii10092" }, /* CYRILLIC SMALL LETTER HARD SIGN */ { 0x044B, "afii10093" }, /* CYRILLIC SMALL LETTER YERU */ { 0x044C, "afii10094" }, /* CYRILLIC SMALL LETTER SOFT SIGN */ { 0x044D, "afii10095" }, /* CYRILLIC SMALL LETTER E */ { 0x044E, "afii10096" }, /* CYRILLIC SMALL LETTER YU */ { 0x044F, "afii10097" }, /* CYRILLIC SMALL LETTER YA */ { 0x0451, "afii10071" }, /* CYRILLIC SMALL LETTER IO */ { 0x0452, "afii10099" }, /* CYRILLIC SMALL LETTER DJE */ { 0x0453, "afii10100" }, /* CYRILLIC SMALL LETTER GJE */ { 0x0454, "afii10101" }, /* CYRILLIC SMALL LETTER UKRAINIAN IE */ { 0x0455, "afii10102" }, /* CYRILLIC SMALL LETTER DZE */ { 0x0456, "afii10103" }, /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ { 0x0457, "afii10104" }, /* CYRILLIC SMALL LETTER YI */ { 0x0458, "afii10105" }, /* CYRILLIC SMALL LETTER JE */ { 0x0459, "afii10106" }, /* CYRILLIC SMALL LETTER LJE */ { 0x045A, "afii10107" }, /* CYRILLIC SMALL LETTER NJE */ { 0x045B, "afii10108" }, /* CYRILLIC SMALL LETTER TSHE */ { 0x045C, "afii10109" }, /* CYRILLIC SMALL LETTER KJE */ { 0x045E, "afii10110" }, /* CYRILLIC SMALL LETTER SHORT U */ { 0x045F, "afii10193" }, /* CYRILLIC SMALL LETTER DZHE */ { 0x0462, "afii10146" }, /* CYRILLIC CAPITAL LETTER YAT */ { 0x0463, "afii10194" }, /* CYRILLIC SMALL LETTER YAT */ { 0x0472, "afii10147" }, /* CYRILLIC CAPITAL LETTER FITA */ { 0x0473, "afii10195" }, /* CYRILLIC SMALL LETTER FITA */ { 0x0474, "afii10148" }, /* CYRILLIC CAPITAL LETTER IZHITSA */ { 0x0475, "afii10196" }, /* CYRILLIC SMALL LETTER IZHITSA */ { 0x0490, "afii10050" }, /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ { 0x0491, "afii10098" }, /* CYRILLIC SMALL LETTER GHE WITH UPTURN */ { 0x04D9, "afii10846" }, /* CYRILLIC SMALL LETTER SCHWA */ { 0x05B0, "afii57799" }, /* HEBREW POINT SHEVA */ { 0x05B1, "afii57801" }, /* HEBREW POINT HATAF SEGOL */ { 0x05B2, "afii57800" }, /* HEBREW POINT HATAF PATAH */ { 0x05B3, "afii57802" }, /* HEBREW POINT HATAF QAMATS */ { 0x05B4, "afii57793" }, /* HEBREW POINT HIRIQ */ { 0x05B5, "afii57794" }, /* HEBREW POINT TSERE */ { 0x05B6, "afii57795" }, /* HEBREW POINT SEGOL */ { 0x05B7, "afii57798" }, /* HEBREW POINT PATAH */ { 0x05B8, "afii57797" }, /* HEBREW POINT QAMATS */ { 0x05B9, "afii57806" }, /* HEBREW POINT HOLAM */ { 0x05BB, "afii57796" }, /* HEBREW POINT QUBUTS */ { 0x05BC, "afii57807" }, /* HEBREW POINT DAGESH OR MAPIQ */ { 0x05BD, "afii57839" }, /* HEBREW POINT METEG */ { 0x05BE, "afii57645" }, /* HEBREW PUNCTUATION MAQAF */ { 0x05BF, "afii57841" }, /* HEBREW POINT RAFE */ { 0x05C0, "afii57842" }, /* HEBREW PUNCTUATION PASEQ */ { 0x05C1, "afii57804" }, /* HEBREW POINT SHIN DOT */ { 0x05C2, "afii57803" }, /* HEBREW POINT SIN DOT */ { 0x05C3, "afii57658" }, /* HEBREW PUNCTUATION SOF PASUQ */ { 0x05D0, "afii57664" }, /* HEBREW LETTER ALEF */ { 0x05D1, "afii57665" }, /* HEBREW LETTER BET */ { 0x05D2, "afii57666" }, /* HEBREW LETTER GIMEL */ { 0x05D3, "afii57667" }, /* HEBREW LETTER DALET */ { 0x05D4, "afii57668" }, /* HEBREW LETTER HE */ { 0x05D5, "afii57669" }, /* HEBREW LETTER VAV */ { 0x05D6, "afii57670" }, /* HEBREW LETTER ZAYIN */ { 0x05D7, "afii57671" }, /* HEBREW LETTER HET */ { 0x05D8, "afii57672" }, /* HEBREW LETTER TET */ { 0x05D9, "afii57673" }, /* HEBREW LETTER YOD */ { 0x05DA, "afii57674" }, /* HEBREW LETTER FINAL KAF */ { 0x05DB, "afii57675" }, /* HEBREW LETTER KAF */ { 0x05DC, "afii57676" }, /* HEBREW LETTER LAMED */ { 0x05DD, "afii57677" }, /* HEBREW LETTER FINAL MEM */ { 0x05DE, "afii57678" }, /* HEBREW LETTER MEM */ { 0x05DF, "afii57679" }, /* HEBREW LETTER FINAL NUN */ { 0x05E0, "afii57680" }, /* HEBREW LETTER NUN */ { 0x05E1, "afii57681" }, /* HEBREW LETTER SAMEKH */ { 0x05E2, "afii57682" }, /* HEBREW LETTER AYIN */ { 0x05E3, "afii57683" }, /* HEBREW LETTER FINAL PE */ { 0x05E4, "afii57684" }, /* HEBREW LETTER PE */ { 0x05E5, "afii57685" }, /* HEBREW LETTER FINAL TSADI */ { 0x05E6, "afii57686" }, /* HEBREW LETTER TSADI */ { 0x05E7, "afii57687" }, /* HEBREW LETTER QOF */ { 0x05E8, "afii57688" }, /* HEBREW LETTER RESH */ { 0x05E9, "afii57689" }, /* HEBREW LETTER SHIN */ { 0x05EA, "afii57690" }, /* HEBREW LETTER TAV */ { 0x05F0, "afii57716" }, /* HEBREW LIGATURE YIDDISH DOUBLE VAV */ { 0x05F1, "afii57717" }, /* HEBREW LIGATURE YIDDISH VAV YOD */ { 0x05F2, "afii57718" }, /* HEBREW LIGATURE YIDDISH DOUBLE YOD */ { 0x060C, "afii57388" }, /* ARABIC COMMA */ { 0x061B, "afii57403" }, /* ARABIC SEMICOLON */ { 0x061F, "afii57407" }, /* ARABIC QUESTION MARK */ { 0x0621, "afii57409" }, /* ARABIC LETTER HAMZA */ { 0x0622, "afii57410" }, /* ARABIC LETTER ALEF WITH MADDA ABOVE */ { 0x0623, "afii57411" }, /* ARABIC LETTER ALEF WITH HAMZA ABOVE */ { 0x0624, "afii57412" }, /* ARABIC LETTER WAW WITH HAMZA ABOVE */ { 0x0625, "afii57413" }, /* ARABIC LETTER ALEF WITH HAMZA BELOW */ { 0x0626, "afii57414" }, /* ARABIC LETTER YEH WITH HAMZA ABOVE */ { 0x0627, "afii57415" }, /* ARABIC LETTER ALEF */ { 0x0628, "afii57416" }, /* ARABIC LETTER BEH */ { 0x0629, "afii57417" }, /* ARABIC LETTER TEH MARBUTA */ { 0x062A, "afii57418" }, /* ARABIC LETTER TEH */ { 0x062B, "afii57419" }, /* ARABIC LETTER THEH */ { 0x062C, "afii57420" }, /* ARABIC LETTER JEEM */ { 0x062D, "afii57421" }, /* ARABIC LETTER HAH */ { 0x062E, "afii57422" }, /* ARABIC LETTER KHAH */ { 0x062F, "afii57423" }, /* ARABIC LETTER DAL */ { 0x0630, "afii57424" }, /* ARABIC LETTER THAL */ { 0x0631, "afii57425" }, /* ARABIC LETTER REH */ { 0x0632, "afii57426" }, /* ARABIC LETTER ZAIN */ { 0x0633, "afii57427" }, /* ARABIC LETTER SEEN */ { 0x0634, "afii57428" }, /* ARABIC LETTER SHEEN */ { 0x0635, "afii57429" }, /* ARABIC LETTER SAD */ { 0x0636, "afii57430" }, /* ARABIC LETTER DAD */ { 0x0637, "afii57431" }, /* ARABIC LETTER TAH */ { 0x0638, "afii57432" }, /* ARABIC LETTER ZAH */ { 0x0639, "afii57433" }, /* ARABIC LETTER AIN */ { 0x063A, "afii57434" }, /* ARABIC LETTER GHAIN */ { 0x0640, "afii57440" }, /* ARABIC TATWEEL */ { 0x0641, "afii57441" }, /* ARABIC LETTER FEH */ { 0x0642, "afii57442" }, /* ARABIC LETTER QAF */ { 0x0643, "afii57443" }, /* ARABIC LETTER KAF */ { 0x0644, "afii57444" }, /* ARABIC LETTER LAM */ { 0x0645, "afii57445" }, /* ARABIC LETTER MEEM */ { 0x0646, "afii57446" }, /* ARABIC LETTER NOON */ { 0x0647, "afii57470" }, /* ARABIC LETTER HEH */ { 0x0648, "afii57448" }, /* ARABIC LETTER WAW */ { 0x0649, "afii57449" }, /* ARABIC LETTER ALEF MAKSURA */ { 0x064A, "afii57450" }, /* ARABIC LETTER YEH */ { 0x064B, "afii57451" }, /* ARABIC FATHATAN */ { 0x064C, "afii57452" }, /* ARABIC DAMMATAN */ { 0x064D, "afii57453" }, /* ARABIC KASRATAN */ { 0x064E, "afii57454" }, /* ARABIC FATHA */ { 0x064F, "afii57455" }, /* ARABIC DAMMA */ { 0x0650, "afii57456" }, /* ARABIC KASRA */ { 0x0651, "afii57457" }, /* ARABIC SHADDA */ { 0x0652, "afii57458" }, /* ARABIC SUKUN */ { 0x0660, "afii57392" }, /* ARABIC-INDIC DIGIT ZERO */ { 0x0661, "afii57393" }, /* ARABIC-INDIC DIGIT ONE */ { 0x0662, "afii57394" }, /* ARABIC-INDIC DIGIT TWO */ { 0x0663, "afii57395" }, /* ARABIC-INDIC DIGIT THREE */ { 0x0664, "afii57396" }, /* ARABIC-INDIC DIGIT FOUR */ { 0x0665, "afii57397" }, /* ARABIC-INDIC DIGIT FIVE */ { 0x0666, "afii57398" }, /* ARABIC-INDIC DIGIT SIX */ { 0x0667, "afii57399" }, /* ARABIC-INDIC DIGIT SEVEN */ { 0x0668, "afii57400" }, /* ARABIC-INDIC DIGIT EIGHT */ { 0x0669, "afii57401" }, /* ARABIC-INDIC DIGIT NINE */ { 0x066A, "afii57381" }, /* ARABIC PERCENT SIGN */ { 0x066D, "afii63167" }, /* ARABIC FIVE POINTED STAR */ { 0x0679, "afii57511" }, /* ARABIC LETTER TTEH */ { 0x067E, "afii57506" }, /* ARABIC LETTER PEH */ { 0x0686, "afii57507" }, /* ARABIC LETTER TCHEH */ { 0x0688, "afii57512" }, /* ARABIC LETTER DDAL */ { 0x0691, "afii57513" }, /* ARABIC LETTER RREH */ { 0x0698, "afii57508" }, /* ARABIC LETTER JEH */ { 0x06A4, "afii57505" }, /* ARABIC LETTER VEH */ { 0x06AF, "afii57509" }, /* ARABIC LETTER GAF */ { 0x06BA, "afii57514" }, /* ARABIC LETTER NOON GHUNNA */ { 0x06D2, "afii57519" }, /* ARABIC LETTER YEH BARREE */ { 0x06D5, "afii57534" }, /* ARABIC LETTER AE */ { 0x1E80, "Wgrave" }, /* LATIN CAPITAL LETTER W WITH GRAVE */ { 0x1E81, "wgrave" }, /* LATIN SMALL LETTER W WITH GRAVE */ { 0x1E82, "Wacute" }, /* LATIN CAPITAL LETTER W WITH ACUTE */ { 0x1E83, "wacute" }, /* LATIN SMALL LETTER W WITH ACUTE */ { 0x1E84, "Wdieresis" }, /* LATIN CAPITAL LETTER W WITH DIAERESIS */ { 0x1E85, "wdieresis" }, /* LATIN SMALL LETTER W WITH DIAERESIS */ { 0x1EF2, "Ygrave" }, /* LATIN CAPITAL LETTER Y WITH GRAVE */ { 0x1EF3, "ygrave" }, /* LATIN SMALL LETTER Y WITH GRAVE */ { 0x200C, "afii61664" }, /* ZERO WIDTH NON-JOINER */ { 0x200D, "afii301" }, /* ZERO WIDTH JOINER */ { 0x200E, "afii299" }, /* LEFT-TO-RIGHT MARK */ { 0x200F, "afii300" }, /* RIGHT-TO-LEFT MARK */ { 0x2012, "figuredash" }, /* FIGURE DASH */ { 0x2013, "endash" }, /* EN DASH */ { 0x2014, "emdash" }, /* EM DASH */ { 0x2015, "afii00208" }, /* HORIZONTAL BAR */ { 0x2017, "underscoredbl" }, /* DOUBLE LOW LINE */ { 0x2018, "quoteleft" }, /* LEFT SINGLE QUOTATION MARK */ { 0x2019, "quoteright" }, /* RIGHT SINGLE QUOTATION MARK */ { 0x201A, "quotesinglbase" }, /* SINGLE LOW-9 QUOTATION MARK */ { 0x201B, "quotereversed" }, /* SINGLE HIGH-REVERSED-9 QUOTATION MARK */ { 0x201C, "quotedblleft" }, /* LEFT DOUBLE QUOTATION MARK */ { 0x201D, "quotedblright" }, /* RIGHT DOUBLE QUOTATION MARK */ { 0x201E, "quotedblbase" }, /* DOUBLE LOW-9 QUOTATION MARK */ { 0x201F, "$quotedblreversed" }, /* DOUBLE HIGH-REVERSED-9 QUOTATION MARK */ { 0x2020, "dagger" }, /* DAGGER */ { 0x2021, "daggerdbl" }, /* DOUBLE DAGGER */ { 0x2022, "bullet" }, /* BULLET */ { 0x2024, "onedotenleader" }, /* ONE DOT LEADER */ { 0x2025, "twodotenleader" }, /* TWO DOT LEADER */ { 0x2026, "ellipsis" }, /* HORIZONTAL ELLIPSIS */ { 0x202C, "afii61573" }, /* POP DIRECTIONAL FORMATTING */ { 0x202D, "afii61574" }, /* LEFT-TO-RIGHT OVERRIDE */ { 0x202E, "afii61575" }, /* RIGHT-TO-LEFT OVERRIDE */ { 0x2030, "perthousand" }, /* PER MILLE SIGN */ { 0x2032, "minute" }, /* PRIME */ { 0x2033, "second" }, /* DOUBLE PRIME */ { 0x2039, "guilsinglleft" }, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ { 0x203A, "guilsinglright" }, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ { 0x203C, "exclamdbl" }, /* DOUBLE EXCLAMATION MARK */ { 0x2040, "$tie" }, /* CHARACTER TIE */ { 0x2044, "fraction" }, /* FRACTION SLASH */ { 0x2044, "$fractionslash" }, /* FRACTION SLASH; distinguish Adobe duplicates */ { 0x2070, "zerosuperior" }, /* SUPERSCRIPT ZERO */ { 0x2074, "foursuperior" }, /* SUPERSCRIPT FOUR */ { 0x2075, "fivesuperior" }, /* SUPERSCRIPT FIVE */ { 0x2076, "sixsuperior" }, /* SUPERSCRIPT SIX */ { 0x2077, "sevensuperior" }, /* SUPERSCRIPT SEVEN */ { 0x2078, "eightsuperior" }, /* SUPERSCRIPT EIGHT */ { 0x2079, "ninesuperior" }, /* SUPERSCRIPT NINE */ { 0x207D, "parenleftsuperior" }, /* SUPERSCRIPT LEFT PARENTHESIS */ { 0x207E, "parenrightsuperior" }, /* SUPERSCRIPT RIGHT PARENTHESIS */ { 0x207F, "nsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER N */ { 0x2080, "zeroinferior" }, /* SUBSCRIPT ZERO */ { 0x2081, "oneinferior" }, /* SUBSCRIPT ONE */ { 0x2082, "twoinferior" }, /* SUBSCRIPT TWO */ { 0x2083, "threeinferior" }, /* SUBSCRIPT THREE */ { 0x2084, "fourinferior" }, /* SUBSCRIPT FOUR */ { 0x2085, "fiveinferior" }, /* SUBSCRIPT FIVE */ { 0x2086, "sixinferior" }, /* SUBSCRIPT SIX */ { 0x2087, "seveninferior" }, /* SUBSCRIPT SEVEN */ { 0x2088, "eightinferior" }, /* SUBSCRIPT EIGHT */ { 0x2089, "nineinferior" }, /* SUBSCRIPT NINE */ { 0x208D, "parenleftinferior" }, /* SUBSCRIPT LEFT PARENTHESIS */ { 0x208E, "parenrightinferior" }, /* SUBSCRIPT RIGHT PARENTHESIS */ { 0x20A1, "colonmonetary" }, /* COLON SIGN */ { 0x20A3, "franc" }, /* FRENCH FRANC SIGN */ { 0x20A4, "lira" }, /* LIRA SIGN */ { 0x20A7, "peseta" }, /* PESETA SIGN */ { 0x20AA, "afii57636" }, /* NEW SHEQEL SIGN */ { 0x20AB, "dong" }, /* DONG SIGN */ { 0x20AC, "Euro" }, /* EURO SIGN */ { 0x20D7, "$vectorcomb" }, /* COMBINING RIGHT ARROW ABOVE */ { 0x20DD, "$circlecomb" }, /* COMBINING ENCLOSING CIRCLE */ { 0x2105, "afii61248" }, /* CARE OF */ { 0x2111, "Ifraktur" }, /* BLACK-LETTER CAPITAL I */ { 0x2113, "afii61289" }, /* SCRIPT SMALL L */ { 0x2113, "$lscript" }, /* SCRIPT SMALL L; Adobe has this as "afii61289" */ { 0x2116, "afii61352" }, /* NUMERO SIGN */ { 0x2118, "weierstrass" }, /* SCRIPT CAPITAL P */ { 0x211C, "Rfraktur" }, /* BLACK-LETTER CAPITAL R */ { 0x211E, "prescription" }, /* PRESCRIPTION TAKE */ { 0x2122, "trademark" }, /* TRADE MARK SIGN */ { 0x2126, "$Ohm" }, /* OHM SIGN; distinguish Adobe duplicates */ { 0x2126, "Omega" }, /* OHM SIGN */ { 0x212E, "estimated" }, /* ESTIMATED SYMBOL */ { 0x2135, "aleph" }, /* ALEF SYMBOL */ { 0x2153, "onethird" }, /* VULGAR FRACTION ONE THIRD */ { 0x2154, "twothirds" }, /* VULGAR FRACTION TWO THIRDS */ { 0x215B, "oneeighth" }, /* VULGAR FRACTION ONE EIGHTH */ { 0x215C, "threeeighths" }, /* VULGAR FRACTION THREE EIGHTHS */ { 0x215D, "fiveeighths" }, /* VULGAR FRACTION FIVE EIGHTHS */ { 0x215E, "seveneighths" }, /* VULGAR FRACTION SEVEN EIGHTHS */ { 0x2190, "arrowleft" }, /* LEFTWARDS ARROW */ { 0x2191, "arrowup" }, /* UPWARDS ARROW */ { 0x2192, "arrowright" }, /* RIGHTWARDS ARROW */ { 0x2193, "arrowdown" }, /* DOWNWARDS ARROW */ { 0x2194, "arrowboth" }, /* LEFT RIGHT ARROW */ { 0x2195, "arrowupdn" }, /* UP DOWN ARROW */ { 0x2196, "$arrownorthwest" }, /* NORTH WEST ARROW */ { 0x2197, "$arrownortheast" }, /* NORTH EAST ARROW */ { 0x2198, "$arrowsoutheast" }, /* SOUTH EAST ARROW */ { 0x2199, "$arrowsouthwest" }, /* SOUTH WEST ARROW */ { 0x21A8, "arrowupdnbse" }, /* UP DOWN ARROW WITH BASE */ { 0x21B5, "carriagereturn" }, /* DOWNWARDS ARROW WITH CORNER LEFTWARDS */ { 0x21BC, "$harpoonleftbarbup" }, /* LEFTWARDS HARPOON WITH BARB UPWARDS */ { 0x21BD, "$harpoonleftbarbdown" }, /* LEFTWARDS HARPOON WITH BARB DOWNWARDS */ { 0x21C0, "$harpoonrightbarbup" }, /* RIGHTWARDS HARPOON WITH BARB UPWARDS */ { 0x21C1, "$harpoonrightbarbdown" }, /* RIGHTWARDS HARPOON WITH BARB DOWNWARDS */ { 0x21D0, "arrowdblleft" }, /* LEFTWARDS DOUBLE ARROW */ { 0x21D1, "arrowdblup" }, /* UPWARDS DOUBLE ARROW */ { 0x21D2, "arrowdblright" }, /* RIGHTWARDS DOUBLE ARROW */ { 0x21D3, "arrowdbldown" }, /* DOWNWARDS DOUBLE ARROW */ { 0x21D4, "arrowdblboth" }, /* LEFT RIGHT DOUBLE ARROW */ { 0x21D5, "$arrowdblupdn" }, /* UP DOWN DOUBLE ARROW */ { 0x2200, "universal" }, /* FOR ALL */ { 0x2202, "partialdiff" }, /* PARTIAL DIFFERENTIAL */ { 0x2203, "existential" }, /* THERE EXISTS */ { 0x2205, "emptyset" }, /* EMPTY SET */ { 0x2206, "Delta" }, /* INCREMENT */ { 0x2206, "$increment" }, /* INCREMENT; distinguish Adobe duplicates */ { 0x2207, "gradient" }, /* NABLA */ { 0x2208, "element" }, /* ELEMENT OF */ { 0x2209, "notelement" }, /* NOT AN ELEMENT OF */ { 0x220B, "suchthat" }, /* CONTAINS AS MEMBER */ { 0x220F, "product" }, /* N-ARY PRODUCT */ { 0x2210, "$coproduct" }, /* N-ARY COPRODUCT */ { 0x2211, "summation" }, /* N-ARY SUMMATION */ { 0x2212, "minus" }, /* MINUS SIGN */ { 0x2213, "$minusplus" }, /* MINUS-OR-PLUS SIGN */ { 0x2215, "$divisionslash" }, /* DIVISION SLASH; distinguish Adobe duplicates */ { 0x2217, "asteriskmath" }, /* ASTERISK OPERATOR */ { 0x2219, "$bulletmath" }, /* BULLET OPERATOR; distinguish Adobe duplicates */ { 0x221A, "radical" }, /* SQUARE ROOT */ { 0x221D, "proportional" }, /* PROPORTIONAL TO */ { 0x221E, "infinity" }, /* INFINITY */ { 0x221F, "orthogonal" }, /* RIGHT ANGLE */ { 0x2220, "angle" }, /* ANGLE */ { 0x2225, "$parallel" }, /* PARALLEL TO */ { 0x2227, "logicaland" }, /* LOGICAL AND */ { 0x2228, "logicalor" }, /* LOGICAL OR */ { 0x2229, "intersection" }, /* INTERSECTION */ { 0x222A, "union" }, /* UNION */ { 0x222B, "integral" }, /* INTEGRAL */ { 0x222E, "$contintegral" }, /* CONTOUR INTEGRAL */ { 0x2234, "therefore" }, /* THEREFORE */ { 0x223C, "similar" }, /* TILDE OPERATOR */ { 0x2240, "$wreathproduct" }, /* WREATH PRODUCT */ { 0x2243, "$similarequal" }, /* ASYMPTOTICALLY EQUAL TO */ { 0x2245, "congruent" }, /* APPROXIMATELY EQUAL TO */ { 0x2248, "approxequal" }, /* ALMOST EQUAL TO */ { 0x224D, "$equivasymptotic" }, /* EQUIVALENT TO */ { 0x2260, "notequal" }, /* NOT EQUAL TO */ { 0x2261, "equivalence" }, /* IDENTICAL TO */ { 0x2264, "lessequal" }, /* LESS-THAN OR EQUAL TO */ { 0x2265, "greaterequal" }, /* GREATER-THAN OR EQUAL TO */ { 0x226A, "$lessmuch" }, /* MUCH-LESS THAN */ { 0x226B, "$greatermuch" }, /* MUCH GREATER-THAN */ { 0x227A, "$precedes" }, /* PRECEDES */ { 0x227B, "$follows" }, /* SUCCEEDS */ { 0x227C, "$precedesequal" }, /* PRECEDES OR EQUAL TO */ { 0x227D, "$followsequal" }, /* SUCCEEDS OR EQUAL TO */ { 0x2282, "propersubset" }, /* SUBSET OF */ { 0x2283, "propersuperset" }, /* SUPERSET OF */ { 0x2284, "notsubset" }, /* NOT A SUBSET OF */ { 0x2286, "reflexsubset" }, /* SUBSET OF OR EQUAL TO */ { 0x2287, "reflexsuperset" }, /* SUPERSET OF OR EQUAL TO */ { 0x228E, "$unionmulti" }, /* MULTISET UNION */ { 0x2291, "$reflexsubsetsq" }, /* SQUARE IMAGE OF OR EQUAL TO */ { 0x2292, "$reflexsupersetsq" }, /* SQUARE ORIGINAL OF OR EQUAL TO */ { 0x2293, "$intersectionsq" }, /* SQUARE CAP */ { 0x2294, "$unionsq" }, /* SQUARE CUP */ { 0x2295, "circleplus" }, /* CIRCLED PLUS */ { 0x2296, "$circleminus" }, /* CIRCLED MINUS */ { 0x2297, "circlemultiply" }, /* CIRCLED TIMES */ { 0x2298, "$circledivide" }, /* CIRCLED DIVISION SLASH */ { 0x2299, "$circledot" }, /* CIRCLED DOT OPERATOR */ { 0x22A2, "$turnstileleft" }, /* RIGHT TACK */ { 0x22A3, "$turnstileright" }, /* LEFT TACK */ { 0x22A4, "$latticetop" }, /* DOWN TACK */ { 0x22A5, "perpendicular" }, /* UP TACK */ { 0x22B2, "$normalin" }, /* NORMAL SUBGROUP OF */ { 0x22B3, "$normalizes" }, /* CONTAINS AS NORMAL SUBGROUP */ { 0x22B4, "$reflexnormalin" }, /* NORMAL SUBGROUP OF OR EQUAL TO */ { 0x22B5, "$reflexnormalizes" }, /* CONTAINS AS NORMAL SUBGROUP OR EQUAL TO */ { 0x22C4, "$diamondmath" }, /* DIAMOND OPERATOR */ { 0x22C5, "dotmath" }, /* DOT OPERATOR */ { 0x22C6, "$starmath" }, /* STAR OPERATOR */ { 0x2302, "house" }, /* HOUSE */ { 0x2308, "$ceilingleft" }, /* LEFT CEILING */ { 0x2309, "$ceilingright" }, /* RIGHT CEILING */ { 0x230A, "$floorleft" }, /* LEFT FLOOR */ { 0x230B, "$floorright" }, /* RIGHT FLOOR */ { 0x2310, "revlogicalnot" }, /* REVERSED NOT SIGN */ { 0x2320, "integraltp" }, /* TOP HALF INTEGRAL */ { 0x2321, "integralbt" }, /* BOTTOM HALF INTEGRAL */ { 0x2322, "$frown" }, /* FROWN */ { 0x2323, "$smile" }, /* SMILE */ { 0x2329, "angleleft" }, /* LEFT-POINTING ANGLE BRACKET */ { 0x232A, "angleright" }, /* RIGHT-POINTING ANGLE BRACKET */ { 0x2420, "$spacesymbol" }, /* SYMBOL FOR SPACE */ { 0x2500, "SF100000" }, /* BOX DRAWINGS LIGHT HORIZONTAL */ { 0x2502, "SF110000" }, /* BOX DRAWINGS LIGHT VERTICAL */ { 0x250C, "SF010000" }, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */ { 0x2510, "SF030000" }, /* BOX DRAWINGS LIGHT DOWN AND LEFT */ { 0x2514, "SF020000" }, /* BOX DRAWINGS LIGHT UP AND RIGHT */ { 0x2518, "SF040000" }, /* BOX DRAWINGS LIGHT UP AND LEFT */ { 0x251C, "SF080000" }, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ { 0x2524, "SF090000" }, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */ { 0x252C, "SF060000" }, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ { 0x2534, "SF070000" }, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */ { 0x253C, "SF050000" }, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ { 0x2550, "SF430000" }, /* BOX DRAWINGS DOUBLE HORIZONTAL */ { 0x2551, "SF240000" }, /* BOX DRAWINGS DOUBLE VERTICAL */ { 0x2552, "SF510000" }, /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE */ { 0x2553, "SF520000" }, /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE */ { 0x2554, "SF390000" }, /* BOX DRAWINGS DOUBLE DOWN AND RIGHT */ { 0x2555, "SF220000" }, /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE */ { 0x2556, "SF210000" }, /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE */ { 0x2557, "SF250000" }, /* BOX DRAWINGS DOUBLE DOWN AND LEFT */ { 0x2558, "SF500000" }, /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE */ { 0x2559, "SF490000" }, /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE */ { 0x255A, "SF380000" }, /* BOX DRAWINGS DOUBLE UP AND RIGHT */ { 0x255B, "SF280000" }, /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE */ { 0x255C, "SF270000" }, /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE */ { 0x255D, "SF260000" }, /* BOX DRAWINGS DOUBLE UP AND LEFT */ { 0x255E, "SF360000" }, /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE */ { 0x255F, "SF370000" }, /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE */ { 0x2560, "SF420000" }, /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT */ { 0x2561, "SF190000" }, /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE */ { 0x2562, "SF200000" }, /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE */ { 0x2563, "SF230000" }, /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT */ { 0x2564, "SF470000" }, /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE */ { 0x2565, "SF480000" }, /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE */ { 0x2566, "SF410000" }, /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL */ { 0x2567, "SF450000" }, /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE */ { 0x2568, "SF460000" }, /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE */ { 0x2569, "SF400000" }, /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL */ { 0x256A, "SF540000" }, /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE */ { 0x256B, "SF530000" }, /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE */ { 0x256C, "SF440000" }, /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL */ { 0x2580, "upblock" }, /* UPPER HALF BLOCK */ { 0x2584, "dnblock" }, /* LOWER HALF BLOCK */ { 0x2588, "block" }, /* FULL BLOCK */ { 0x258C, "lfblock" }, /* LEFT HALF BLOCK */ { 0x2590, "rtblock" }, /* RIGHT HALF BLOCK */ { 0x2591, "ltshade" }, /* LIGHT SHADE */ { 0x2592, "shade" }, /* MEDIUM SHADE */ { 0x2593, "dkshade" }, /* DARK SHADE */ { 0x25A0, "filledbox" }, /* BLACK SQUARE */ { 0x25A1, "H22073" }, /* WHITE SQUARE */ { 0x25AA, "H18543" }, /* BLACK SMALL SQUARE */ { 0x25AB, "H18551" }, /* WHITE SMALL SQUARE */ { 0x25AC, "filledrect" }, /* BLACK RECTANGLE */ { 0x25B2, "triagup" }, /* BLACK UP-POINTING TRIANGLE */ { 0x25B3, "$triagwhiteup" }, /* WHITE UP-POINTING TRIANGLE */ { 0x25BA, "triagrt" }, /* BLACK RIGHT-POINTING POINTER */ { 0x25BC, "triagdn" }, /* BLACK DOWN-POINTING TRIANGLE */ { 0x25BD, "$triagwhitedn" }, /* WHITE DOWN-POINTING TRIANGLE */ { 0x25C4, "triaglf" }, /* BLACK LEFT-POINTING POINTER */ { 0x25CA, "lozenge" }, /* LOZENGE */ { 0x25CB, "circle" }, /* WHITE CIRCLE */ { 0x25CF, "H18533" }, /* BLACK CIRCLE */ { 0x25D8, "invbullet" }, /* INVERSE BULLET */ { 0x25D9, "invcircle" }, /* INVERSE WHITE CIRCLE */ { 0x25E6, "openbullet" }, /* WHITE BULLET */ { 0x25EF, "$circlelarge" }, /* LARGE CIRCLE */ { 0x263A, "smileface" }, /* WHITE SMILING FACE */ { 0x263B, "invsmileface" }, /* BLACK SMILING FACE */ { 0x263C, "sun" }, /* WHITE SUN WITH RAYS */ { 0x2640, "female" }, /* FEMALE SIGN */ { 0x2642, "male" }, /* MALE SIGN */ { 0x2660, "spade" }, /* BLACK SPADE SUIT */ { 0x2663, "club" }, /* BLACK CLUB SUIT */ { 0x2665, "heart" }, /* BLACK HEART SUIT */ { 0x2666, "diamond" }, /* BLACK DIAMOND SUIT */ { 0x266A, "musicalnote" }, /* EIGHTH NOTE */ { 0x266B, "musicalnotedbl" }, /* BEAMED EIGHTH NOTES */ { 0x266D, "$flat" }, /* MUSIC FLAT SIGN */ { 0x266E, "$natural" }, /* MUSIC NATURAL SIGN */ { 0x266F, "$sharp" }, /* MUSIC SHARP SIGN */ { 0xF6BE, "dotlessj" }, /* LATIN SMALL LETTER DOTLESS J */ { 0xF6BF, "LL" }, /* LATIN CAPITAL LETTER LL */ { 0xF6C0, "ll" }, /* LATIN SMALL LETTER LL */ { 0xF6C3, "commaaccent" }, /* COMMA BELOW */ { 0xF6C4, "afii10063" }, /* CYRILLIC SMALL LETTER GHE VARIANT */ { 0xF6C5, "afii10064" }, /* CYRILLIC SMALL LETTER BE VARIANT */ { 0xF6C6, "afii10192" }, /* CYRILLIC SMALL LETTER DE VARIANT */ { 0xF6C7, "afii10831" }, /* CYRILLIC SMALL LETTER PE VARIANT */ { 0xF6C8, "afii10832" }, /* CYRILLIC SMALL LETTER TE VARIANT */ { 0xF6C9, "Acute" }, /* CAPITAL ACUTE ACCENT */ { 0xF6CA, "Caron" }, /* CAPITAL CARON */ { 0xF6CB, "Dieresis" }, /* CAPITAL DIAERESIS */ { 0xF6CC, "DieresisAcute" }, /* CAPITAL DIAERESIS ACUTE ACCENT */ { 0xF6CD, "DieresisGrave" }, /* CAPITAL DIAERESIS GRAVE ACCENT */ { 0xF6CE, "Grave" }, /* CAPITAL GRAVE ACCENT */ { 0xF6CF, "Hungarumlaut" }, /* CAPITAL DOUBLE ACUTE ACCENT */ { 0xF6D0, "Macron" }, /* CAPITAL MACRON */ { 0xF6D1, "cyrBreve" }, /* CAPITAL CYRILLIC BREVE */ { 0xF6D2, "cyrFlex" }, /* CAPITAL CYRILLIC CIRCUMFLEX */ { 0xF6D3, "dblGrave" }, /* CAPITAL DOUBLE GRAVE ACCENT */ { 0xF6D4, "cyrbreve" }, /* CYRILLIC BREVE */ { 0xF6D5, "cyrflex" }, /* CYRILLIC CIRCUMFLEX */ { 0xF6D6, "dblgrave" }, /* DOUBLE GRAVE ACCENT */ { 0xF6D7, "dieresisacute" }, /* DIAERESIS ACUTE ACCENT */ { 0xF6D8, "dieresisgrave" }, /* DIAERESIS GRAVE ACCENT */ { 0xF6D9, "copyrightserif" }, /* COPYRIGHT SIGN SERIF */ { 0xF6DA, "registerserif" }, /* REGISTERED SIGN SERIF */ { 0xF6DB, "trademarkserif" }, /* TRADE MARK SIGN SERIF */ { 0xF6DC, "onefitted" }, /* PROPORTIONAL DIGIT ONE */ { 0xF6DD, "rupiah" }, /* RUPIAH SIGN */ { 0xF6DE, "threequartersemdash" }, /* THREE QUARTERS EM DASH */ { 0xF6DF, "centinferior" }, /* SUBSCRIPT CENT SIGN */ { 0xF6E0, "centsuperior" }, /* SUPERSCRIPT CENT SIGN */ { 0xF6E1, "commainferior" }, /* SUBSCRIPT COMMA */ { 0xF6E2, "commasuperior" }, /* SUPERSCRIPT COMMA */ { 0xF6E3, "dollarinferior" }, /* SUBSCRIPT DOLLAR SIGN */ { 0xF6E4, "dollarsuperior" }, /* SUPERSCRIPT DOLLAR SIGN */ { 0xF6E5, "hypheninferior" }, /* SUBSCRIPT HYPHEN-MINUS */ { 0xF6E6, "hyphensuperior" }, /* SUPERSCRIPT HYPHEN-MINUS */ { 0xF6E7, "periodinferior" }, /* SUBSCRIPT FULL STOP */ { 0xF6E8, "periodsuperior" }, /* SUPERSCRIPT FULL STOP */ { 0xF6E9, "asuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER A */ { 0xF6EA, "bsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER B */ { 0xF6EB, "dsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER D */ { 0xF6EC, "esuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER E */ { 0xF6ED, "isuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER I */ { 0xF6EE, "lsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER L */ { 0xF6EF, "msuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER M */ { 0xF6F0, "osuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER O */ { 0xF6F1, "rsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER R */ { 0xF6F2, "ssuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER S */ { 0xF6F3, "tsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER T */ { 0xF6F4, "Brevesmall" }, /* SMALL CAPITAL BREVE */ { 0xF6F5, "Caronsmall" }, /* SMALL CAPITAL CARON */ { 0xF6F6, "Circumflexsmall" }, /* SMALL CAPITAL MODIFIER LETTER CIRCUMFLEX ACCENT */ { 0xF6F7, "Dotaccentsmall" }, /* SMALL CAPITAL DOT ABOVE */ { 0xF6F8, "Hungarumlautsmall" }, /* SMALL CAPITAL DOUBLE ACUTE ACCENT */ { 0xF6F9, "Lslashsmall" }, /* LATIN SMALL CAPITAL LETTER L WITH STROKE */ { 0xF6FA, "OEsmall" }, /* LATIN SMALL CAPITAL LIGATURE OE */ { 0xF6FB, "Ogoneksmall" }, /* SMALL CAPITAL OGONEK */ { 0xF6FC, "Ringsmall" }, /* SMALL CAPITAL RING ABOVE */ { 0xF6FD, "Scaronsmall" }, /* LATIN SMALL CAPITAL LETTER S WITH CARON */ { 0xF6FE, "Tildesmall" }, /* SMALL CAPITAL SMALL TILDE */ { 0xF6FF, "Zcaronsmall" }, /* LATIN SMALL CAPITAL LETTER Z WITH CARON */ { 0xF721, "exclamsmall" }, /* SMALL CAPITAL EXCLAMATION MARK */ { 0xF724, "dollaroldstyle" }, /* OLDSTYLE DOLLAR SIGN */ { 0xF726, "ampersandsmall" }, /* SMALL CAPITAL AMPERSAND */ { 0xF730, "zerooldstyle" }, /* OLDSTYLE DIGIT ZERO */ { 0xF731, "oneoldstyle" }, /* OLDSTYLE DIGIT ONE */ { 0xF732, "twooldstyle" }, /* OLDSTYLE DIGIT TWO */ { 0xF733, "threeoldstyle" }, /* OLDSTYLE DIGIT THREE */ { 0xF734, "fouroldstyle" }, /* OLDSTYLE DIGIT FOUR */ { 0xF735, "fiveoldstyle" }, /* OLDSTYLE DIGIT FIVE */ { 0xF736, "sixoldstyle" }, /* OLDSTYLE DIGIT SIX */ { 0xF737, "sevenoldstyle" }, /* OLDSTYLE DIGIT SEVEN */ { 0xF738, "eightoldstyle" }, /* OLDSTYLE DIGIT EIGHT */ { 0xF739, "nineoldstyle" }, /* OLDSTYLE DIGIT NINE */ { 0xF73F, "questionsmall" }, /* SMALL CAPITAL QUESTION MARK */ { 0xF760, "Gravesmall" }, /* SMALL CAPITAL GRAVE ACCENT */ { 0xF761, "Asmall" }, /* LATIN SMALL CAPITAL LETTER A */ { 0xF762, "Bsmall" }, /* LATIN SMALL CAPITAL LETTER B */ { 0xF763, "Csmall" }, /* LATIN SMALL CAPITAL LETTER C */ { 0xF764, "Dsmall" }, /* LATIN SMALL CAPITAL LETTER D */ { 0xF765, "Esmall" }, /* LATIN SMALL CAPITAL LETTER E */ { 0xF766, "Fsmall" }, /* LATIN SMALL CAPITAL LETTER F */ { 0xF767, "Gsmall" }, /* LATIN SMALL CAPITAL LETTER G */ { 0xF768, "Hsmall" }, /* LATIN SMALL CAPITAL LETTER H */ { 0xF769, "Ismall" }, /* LATIN SMALL CAPITAL LETTER I */ { 0xF76A, "Jsmall" }, /* LATIN SMALL CAPITAL LETTER J */ { 0xF76B, "Ksmall" }, /* LATIN SMALL CAPITAL LETTER K */ { 0xF76C, "Lsmall" }, /* LATIN SMALL CAPITAL LETTER L */ { 0xF76D, "Msmall" }, /* LATIN SMALL CAPITAL LETTER M */ { 0xF76E, "Nsmall" }, /* LATIN SMALL CAPITAL LETTER N */ { 0xF76F, "Osmall" }, /* LATIN SMALL CAPITAL LETTER O */ { 0xF770, "Psmall" }, /* LATIN SMALL CAPITAL LETTER P */ { 0xF771, "Qsmall" }, /* LATIN SMALL CAPITAL LETTER Q */ { 0xF772, "Rsmall" }, /* LATIN SMALL CAPITAL LETTER R */ { 0xF773, "Ssmall" }, /* LATIN SMALL CAPITAL LETTER S */ { 0xF774, "Tsmall" }, /* LATIN SMALL CAPITAL LETTER T */ { 0xF775, "Usmall" }, /* LATIN SMALL CAPITAL LETTER U */ { 0xF776, "Vsmall" }, /* LATIN SMALL CAPITAL LETTER V */ { 0xF777, "Wsmall" }, /* LATIN SMALL CAPITAL LETTER W */ { 0xF778, "Xsmall" }, /* LATIN SMALL CAPITAL LETTER X */ { 0xF779, "Ysmall" }, /* LATIN SMALL CAPITAL LETTER Y */ { 0xF77A, "Zsmall" }, /* LATIN SMALL CAPITAL LETTER Z */ { 0xF7A1, "exclamdownsmall" }, /* SMALL CAPITAL INVERTED EXCLAMATION MARK */ { 0xF7A2, "centoldstyle" }, /* OLDSTYLE CENT SIGN */ { 0xF7A8, "Dieresissmall" }, /* SMALL CAPITAL DIAERESIS */ { 0xF7AF, "Macronsmall" }, /* SMALL CAPITAL MACRON */ { 0xF7B4, "Acutesmall" }, /* SMALL CAPITAL ACUTE ACCENT */ { 0xF7B8, "Cedillasmall" }, /* SMALL CAPITAL CEDILLA */ { 0xF7BF, "questiondownsmall" }, /* SMALL CAPITAL INVERTED QUESTION MARK */ { 0xF7E0, "Agravesmall" }, /* LATIN SMALL CAPITAL LETTER A WITH GRAVE */ { 0xF7E1, "Aacutesmall" }, /* LATIN SMALL CAPITAL LETTER A WITH ACUTE */ { 0xF7E2, "Acircumflexsmall" }, /* LATIN SMALL CAPITAL LETTER A WITH CIRCUMFLEX */ { 0xF7E3, "Atildesmall" }, /* LATIN SMALL CAPITAL LETTER A WITH TILDE */ { 0xF7E4, "Adieresissmall" }, /* LATIN SMALL CAPITAL LETTER A WITH DIAERESIS */ { 0xF7E5, "Aringsmall" }, /* LATIN SMALL CAPITAL LETTER A WITH RING ABOVE */ { 0xF7E6, "AEsmall" }, /* LATIN SMALL CAPITAL LETTER AE */ { 0xF7E7, "Ccedillasmall" }, /* LATIN SMALL CAPITAL LETTER C WITH CEDILLA */ { 0xF7E8, "Egravesmall" }, /* LATIN SMALL CAPITAL LETTER E WITH GRAVE */ { 0xF7E9, "Eacutesmall" }, /* LATIN SMALL CAPITAL LETTER E WITH ACUTE */ { 0xF7EA, "Ecircumflexsmall" }, /* LATIN SMALL CAPITAL LETTER E WITH CIRCUMFLEX */ { 0xF7EB, "Edieresissmall" }, /* LATIN SMALL CAPITAL LETTER E WITH DIAERESIS */ { 0xF7EC, "Igravesmall" }, /* LATIN SMALL CAPITAL LETTER I WITH GRAVE */ { 0xF7ED, "Iacutesmall" }, /* LATIN SMALL CAPITAL LETTER I WITH ACUTE */ { 0xF7EE, "Icircumflexsmall" }, /* LATIN SMALL CAPITAL LETTER I WITH CIRCUMFLEX */ { 0xF7EF, "Idieresissmall" }, /* LATIN SMALL CAPITAL LETTER I WITH DIAERESIS */ { 0xF7F0, "Ethsmall" }, /* LATIN SMALL CAPITAL LETTER ETH */ { 0xF7F1, "Ntildesmall" }, /* LATIN SMALL CAPITAL LETTER N WITH TILDE */ { 0xF7F2, "Ogravesmall" }, /* LATIN SMALL CAPITAL LETTER O WITH GRAVE */ { 0xF7F3, "Oacutesmall" }, /* LATIN SMALL CAPITAL LETTER O WITH ACUTE */ { 0xF7F4, "Ocircumflexsmall" }, /* LATIN SMALL CAPITAL LETTER O WITH CIRCUMFLEX */ { 0xF7F5, "Otildesmall" }, /* LATIN SMALL CAPITAL LETTER O WITH TILDE */ { 0xF7F6, "Odieresissmall" }, /* LATIN SMALL CAPITAL LETTER O WITH DIAERESIS */ { 0xF7F8, "Oslashsmall" }, /* LATIN SMALL CAPITAL LETTER O WITH STROKE */ { 0xF7F9, "Ugravesmall" }, /* LATIN SMALL CAPITAL LETTER U WITH GRAVE */ { 0xF7FA, "Uacutesmall" }, /* LATIN SMALL CAPITAL LETTER U WITH ACUTE */ { 0xF7FB, "Ucircumflexsmall" }, /* LATIN SMALL CAPITAL LETTER U WITH CIRCUMFLEX */ { 0xF7FC, "Udieresissmall" }, /* LATIN SMALL CAPITAL LETTER U WITH DIAERESIS */ { 0xF7FD, "Yacutesmall" }, /* LATIN SMALL CAPITAL LETTER Y WITH ACUTE */ { 0xF7FE, "Thornsmall" }, /* LATIN SMALL CAPITAL LETTER THORN */ { 0xF7FF, "Ydieresissmall" }, /* LATIN SMALL CAPITAL LETTER Y WITH DIAERESIS */ { 0xF8E5, "radicalex" }, /* RADICAL EXTENDER */ { 0xF8E6, "arrowvertex" }, /* VERTICAL ARROW EXTENDER */ { 0xF8E7, "arrowhorizex" }, /* HORIZONTAL ARROW EXTENDER */ { 0xF8E8, "registersans" }, /* REGISTERED SIGN SANS SERIF */ { 0xF8E9, "copyrightsans" }, /* COPYRIGHT SIGN SANS SERIF */ { 0xF8EA, "trademarksans" }, /* TRADE MARK SIGN SANS SERIF */ { 0xF8EB, "parenlefttp" }, /* LEFT PAREN TOP */ { 0xF8EC, "parenleftex" }, /* LEFT PAREN EXTENDER */ { 0xF8ED, "parenleftbt" }, /* LEFT PAREN BOTTOM */ { 0xF8EE, "bracketlefttp" }, /* LEFT SQUARE BRACKET TOP */ { 0xF8EF, "bracketleftex" }, /* LEFT SQUARE BRACKET EXTENDER */ { 0xF8F0, "bracketleftbt" }, /* LEFT SQUARE BRACKET BOTTOM */ { 0xF8F1, "bracelefttp" }, /* LEFT CURLY BRACKET TOP */ { 0xF8F2, "braceleftmid" }, /* LEFT CURLY BRACKET MID */ { 0xF8F3, "braceleftbt" }, /* LEFT CURLY BRACKET BOTTOM */ { 0xF8F4, "braceex" }, /* CURLY BRACKET EXTENDER */ { 0xF8F5, "integralex" }, /* INTEGRAL EXTENDER */ { 0xF8F6, "parenrighttp" }, /* RIGHT PAREN TOP */ { 0xF8F7, "parenrightex" }, /* RIGHT PAREN EXTENDER */ { 0xF8F8, "parenrightbt" }, /* RIGHT PAREN BOTTOM */ { 0xF8F9, "bracketrighttp" }, /* RIGHT SQUARE BRACKET TOP */ { 0xF8FA, "bracketrightex" }, /* RIGHT SQUARE BRACKET EXTENDER */ { 0xF8FB, "bracketrightbt" }, /* RIGHT SQUARE BRACKET BOTTOM */ { 0xF8FC, "bracerighttp" }, /* RIGHT CURLY BRACKET TOP */ { 0xF8FD, "bracerightmid" }, /* RIGHT CURLY BRACKET MID */ { 0xF8FE, "bracerightbt" }, /* RIGHT CURLY BRACKET BOTTOM */ { 0xFB00, "ff" }, /* LATIN SMALL LIGATURE FF */ { 0xFB01, "fi" }, /* LATIN SMALL LIGATURE FI */ { 0xFB02, "fl" }, /* LATIN SMALL LIGATURE FL */ { 0xFB03, "ffi" }, /* LATIN SMALL LIGATURE FFI */ { 0xFB04, "ffl" }, /* LATIN SMALL LIGATURE FFL */ { 0xFB05, "$longst" }, /* LATIN SMALL LIGATURE LONG S T */ { 0xFB06, "$st" }, /* LATIN SMALL LIGATURE ST */ { 0xFB1F, "afii57705" }, /* HEBREW LIGATURE YIDDISH YOD YOD PATAH */ { 0xFB2A, "afii57694" }, /* HEBREW LETTER SHIN WITH SHIN DOT */ { 0xFB2B, "afii57695" }, /* HEBREW LETTER SHIN WITH SIN DOT */ { 0xFB35, "afii57723" }, /* HEBREW LETTER VAV WITH DAGESH */ { 0xFB4B, "afii57700" } /* HEBREW LETTER VAV WITH HOLAM */ }; #endif /* 0 */ static int adobe_name_cmp(const void *s1, const void *s2) { const struct adobe2unicode *a = s1; const struct adobe2unicode *b = s2; return strcmp(a->adobe_name, b->adobe_name); } #if 0 static int unicode_id_cmp(const void *s1, const void *s2) { const struct unicode2adobe *a = s1; const struct unicode2adobe *b = s2; return a->unicode - b->unicode; } #endif /* 0 */ static void close_iconv(void *dummy) { UNUSED(dummy); #if HAVE_ICONV_H if (m_iconv_gb_ucs4 != (iconv_t)(-1)) { iconv_close(m_iconv_gb_ucs4); m_iconv_gb_ucs4 = (iconv_t)(-1); } #endif /* HAVE_ICONV_H */ } /* convert a CJK char to unicode (UCS-4) using iconv() */ static uint32_t cjk2unicode(unsigned char *cjk) { #if HAVE_ICONV_H uint32_t u = 0; unsigned char unicode[4]; size_t from = 2; size_t to = sizeof unicode; static Boolean initialized = False; char *from_ptr = (char *)cjk; char *to_ptr = (char *)unicode; if (m_iconv_gb_ucs4 == (iconv_t)(-1)) { if (initialized) return 0; initialized = True; m_iconv_gb_ucs4 = iconv_open( #ifdef WORDS_BIGENDIAN "UCS-4BE", #else "UCS-4LE", #endif "GB18030"); if (m_iconv_gb_ucs4 == (iconv_t)(-1)) { XDVI_ERROR((stderr, "cjk2unicode: iconv_open() failed: %s", strerror(errno))); return 0; } register_exit_handler(close_iconv, NULL); } if (iconv(m_iconv_gb_ucs4, (iconv_char_pptrT)&from_ptr, &from, &to_ptr, &to) == (size_t)(-1)) { XDVI_ERROR((stderr, "cjk2unicode: can't convert GBK to unicode: %s", strerror(errno))); return 0; } memcpy(&u, unicode, sizeof unicode); return u; #else /* HAVE_ICONV_H */ static Boolean warned = False; if (!warned) { popup_message(globals.widgets.top_level, MSG_WARN, NULL, "This version of xdvi has been compiled without iconv support - " "cannot convert CJK character to UTF-8"); warned = True; } return 0; #endif /* HAVE_ICONV_H */ } /* * Return the unicode ID of adobe_name, or 0 if it isn't found. * Uses the lookup table adobe2unicode_table, or iconv for CJK fonts. */ uint32_t adobe2unicode_name(const char *adobe_name) { struct adobe2unicode search_item; struct adobe2unicode *match_item; if (HAS_PREFIX(adobe_name, "cjk")) { /* Special case for CJK fonts (Chinese) - ZLB: the Adobe names in * the Chinese T1 fonts are of the form 'cjkXXXX' where 'XXXX' are * the hex number of the GBK/GB18030 encoding */ unsigned char cjk[2], xx[3]; xx[0] = adobe_name[3]; xx[1] = adobe_name[4]; xx[2] = '\0'; cjk[0] = strtoul((char *)xx, NULL, 16); xx[0] = adobe_name[5]; xx[1] = adobe_name[6]; cjk[1] = strtoul((char *)xx, NULL, 16); /* convert GBK ==> unicode */ return cjk2unicode(cjk); } else { search_item.adobe_name = adobe_name; match_item = bsearch(&search_item, adobe2unicode_table, sizeof adobe2unicode_table / sizeof adobe2unicode_table[0], sizeof adobe2unicode_table[0], adobe_name_cmp); if (match_item != NULL) return match_item->unicode; else return 0; } } #if 0 /* * Return the adobe_name of unicode ID, or NULL if it isn't found. * Uses the lookup table unicode2adobe_table. */ const char * unicode2adobe_name(uint32_t unicode) { struct unicode2adobe search_item; struct unicode2adobe *match_item; search_item.unicode = unicode; match_item = bsearch(&search_item, unicode2adobe_table, sizeof unicode2adobe_table / sizeof unicode2adobe_table[0], sizeof unicode2adobe_table[0], unicode_id_cmp); if (match_item != NULL) return match_item->adobe_name; else return NULL; } #endif /* 0 */ static uint32_t ucs4_lowercase(uint32_t c) { /* This table was produced by: cat uni2adobe | while read a b; do lc_b=`echo $b | tr 'A-Z' 'a-z'`; \ if [ "$lc_b" != "$b" ] ; then res=`egrep " $lc_b\$" uni2adobe` ; \ if [ -n "$res" ]; then echo "RES: $a $b -> $res"; fi; fi; done | grep 'RES' > uni2adobe-map And then, some Emacs keyboard macros. */ switch (c) { case 0x0041: /* A */ return 0x0061; /* a */ case 0x0042: /* B */ return 0x0062; /* b */ case 0x0043: /* C */ return 0x0063; /* c */ case 0x0044: /* D */ return 0x0064; /* d */ case 0x0045: /* E */ return 0x0065; /* e */ case 0x0046: /* F */ return 0x0066; /* f */ case 0x0047: /* G */ return 0x0067; /* g */ case 0x0048: /* H */ return 0x0068; /* h */ case 0x0049: /* I */ return 0x0069; /* i */ case 0x004A: /* J */ return 0x006A; /* j */ case 0x004B: /* K */ return 0x006B; /* k */ case 0x004C: /* L */ return 0x006C; /* l */ case 0x004D: /* M */ return 0x006D; /* m */ case 0x004E: /* N */ return 0x006E; /* n */ case 0x004F: /* O */ return 0x006F; /* o */ case 0x0050: /* P */ return 0x0070; /* p */ case 0x0051: /* Q */ return 0x0071; /* q */ case 0x0052: /* R */ return 0x0072; /* r */ case 0x0053: /* S */ return 0x0073; /* s */ case 0x0054: /* T */ return 0x0074; /* t */ case 0x0055: /* U */ return 0x0075; /* u */ case 0x0056: /* V */ return 0x0076; /* v */ case 0x0057: /* W */ return 0x0077; /* w */ case 0x0058: /* X */ return 0x0078; /* x */ case 0x0059: /* Y */ return 0x0079; /* y */ case 0x005A: /* Z */ return 0x007A; /* z */ case 0x00C0: /* Agrave */ return 0x00E0; /* agrave */ case 0x00C1: /* Aacute */ return 0x00E1; /* aacute */ case 0x00C2: /* Acircumflex */ return 0x00E2; /* acircumflex */ case 0x00C3: /* Atilde */ return 0x00E3; /* atilde */ case 0x00C4: /* Adieresis */ return 0x00E4; /* adieresis */ case 0x00C5: /* Aring */ return 0x00E5; /* aring */ case 0x00C6: /* AE */ return 0x00E6; /* ae */ case 0x00C7: /* Ccedilla */ return 0x00E7; /* ccedilla */ case 0x00C8: /* Egrave */ return 0x00E8; /* egrave */ case 0x00C9: /* Eacute */ return 0x00E9; /* eacute */ case 0x00CA: /* Ecircumflex */ return 0x00EA; /* ecircumflex */ case 0x00CB: /* Edieresis */ return 0x00EB; /* edieresis */ case 0x00CC: /* Igrave */ return 0x00EC; /* igrave */ case 0x00CD: /* Iacute */ return 0x00ED; /* iacute */ case 0x00CE: /* Icircumflex */ return 0x00EE; /* icircumflex */ case 0x00CF: /* Idieresis */ return 0x00EF; /* idieresis */ case 0x00D0: /* Eth */ return 0x00F0; /* eth */ case 0x00D1: /* Ntilde */ return 0x00F1; /* ntilde */ case 0x00D2: /* Ograve */ return 0x00F2; /* ograve */ case 0x00D3: /* Oacute */ return 0x00F3; /* oacute */ case 0x00D4: /* Ocircumflex */ return 0x00F4; /* ocircumflex */ case 0x00D5: /* Otilde */ return 0x00F5; /* otilde */ case 0x00D6: /* Odieresis */ return 0x00F6; /* odieresis */ case 0x00D8: /* Oslash */ return 0x00F8; /* oslash */ case 0x00D9: /* Ugrave */ return 0x00F9; /* ugrave */ case 0x00DA: /* Uacute */ return 0x00FA; /* uacute */ case 0x00DB: /* Ucircumflex */ return 0x00FB; /* ucircumflex */ case 0x00DC: /* Udieresis */ return 0x00FC; /* udieresis */ case 0x00DD: /* Yacute */ return 0x00FD; /* yacute */ case 0x00DE: /* Thorn */ return 0x00FE; /* thorn */ case 0x0100: /* Amacron */ return 0x0101; /* amacron */ case 0x0102: /* Abreve */ return 0x0103; /* abreve */ case 0x0104: /* Aogonek */ return 0x0105; /* aogonek */ case 0x0106: /* Cacute */ return 0x0107; /* cacute */ case 0x0108: /* Ccircumflex */ return 0x0109; /* ccircumflex */ case 0x010A: /* Cdotaccent */ return 0x010B; /* cdotaccent */ case 0x010C: /* Ccaron */ return 0x010D; /* ccaron */ case 0x010E: /* Dcaron */ return 0x010F; /* dcaron */ case 0x0110: /* Dcroat */ return 0x0111; /* dcroat */ case 0x0112: /* Emacron */ return 0x0113; /* emacron */ case 0x0114: /* Ebreve */ return 0x0115; /* ebreve */ case 0x0116: /* Edotaccent */ return 0x0117; /* edotaccent */ case 0x0118: /* Eogonek */ return 0x0119; /* eogonek */ case 0x011A: /* Ecaron */ return 0x011B; /* ecaron */ case 0x011C: /* Gcircumflex */ return 0x011D; /* gcircumflex */ case 0x011E: /* Gbreve */ return 0x011F; /* gbreve */ case 0x0120: /* Gdotaccent */ return 0x0121; /* gdotaccent */ case 0x0122: /* Gcommaaccent */ return 0x0123; /* gcommaaccent */ case 0x0124: /* Hcircumflex */ return 0x0125; /* hcircumflex */ case 0x0126: /* Hbar */ return 0x0127; /* hbar */ case 0x0128: /* Itilde */ return 0x0129; /* itilde */ case 0x012A: /* Imacron */ return 0x012B; /* imacron */ case 0x012C: /* Ibreve */ return 0x012D; /* ibreve */ case 0x012E: /* Iogonek */ return 0x012F; /* iogonek */ case 0x0132: /* IJ */ return 0x0133; /* ij */ case 0x0134: /* Jcircumflex */ return 0x0135; /* jcircumflex */ case 0x0136: /* Kcommaaccent */ return 0x0137; /* kcommaaccent */ case 0x0139: /* Lacute */ return 0x013A; /* lacute */ case 0x013B: /* Lcommaaccent */ return 0x013C; /* lcommaaccent */ case 0x013D: /* Lcaron */ return 0x013E; /* lcaron */ case 0x013F: /* Ldot */ return 0x0140; /* ldot */ case 0x0141: /* Lslash */ return 0x0142; /* lslash */ case 0x0143: /* Nacute */ return 0x0144; /* nacute */ case 0x0145: /* Ncommaaccent */ return 0x0146; /* ncommaaccent */ case 0x0147: /* Ncaron */ return 0x0148; /* ncaron */ case 0x014A: /* Eng */ return 0x014B; /* eng */ case 0x014C: /* Omacron */ return 0x014D; /* omacron */ case 0x014E: /* Obreve */ return 0x014F; /* obreve */ case 0x0150: /* Ohungarumlaut */ return 0x0151; /* ohungarumlaut */ case 0x0152: /* OE */ return 0x0153; /* oe */ case 0x0154: /* Racute */ return 0x0155; /* racute */ case 0x0156: /* Rcommaaccent */ return 0x0157; /* rcommaaccent */ case 0x0158: /* Rcaron */ return 0x0159; /* rcaron */ case 0x015A: /* Sacute */ return 0x015B; /* sacute */ case 0x015C: /* Scircumflex */ return 0x015D; /* scircumflex */ case 0x015E: /* Scedilla */ return 0x015F; /* scedilla */ case 0x0160: /* Scaron */ return 0x0161; /* scaron */ case 0x0162: /* Tcommaaccent */ return 0x0163; /* tcommaaccent */ case 0x0164: /* Tcaron */ return 0x0165; /* tcaron */ case 0x0166: /* Tbar */ return 0x0167; /* tbar */ case 0x0168: /* Utilde */ return 0x0169; /* utilde */ case 0x016A: /* Umacron */ return 0x016B; /* umacron */ case 0x016C: /* Ubreve */ return 0x016D; /* ubreve */ case 0x016E: /* Uring */ return 0x016F; /* uring */ case 0x0170: /* Uhungarumlaut */ return 0x0171; /* uhungarumlaut */ case 0x0172: /* Uogonek */ return 0x0173; /* uogonek */ case 0x0174: /* Wcircumflex */ return 0x0175; /* wcircumflex */ case 0x0176: /* Ycircumflex */ return 0x0177; /* ycircumflex */ case 0x0178: /* Ydieresis */ return 0x00FF; /* ydieresis */ case 0x0179: /* Zacute */ return 0x017A; /* zacute */ case 0x017B: /* Zdotaccent */ return 0x017C; /* zdotaccent */ case 0x017D: /* Zcaron */ return 0x017E; /* zcaron */ case 0x01A0: /* Ohorn */ return 0x01A1; /* ohorn */ case 0x01AF: /* Uhorn */ return 0x01B0; /* uhorn */ case 0x01E6: /* Gcaron */ return 0x01E7; /* gcaron */ case 0x01FA: /* Aringacute */ return 0x01FB; /* aringacute */ case 0x01FC: /* AEacute */ return 0x01FD; /* aeacute */ case 0x01FE: /* Oslashacute */ return 0x01FF; /* oslashacute */ case 0x0218: /* Scommaaccent */ return 0x0219; /* scommaaccent */ case 0x0386: /* Alphatonos */ return 0x03AC; /* alphatonos */ case 0x0388: /* Epsilontonos */ return 0x03AD; /* epsilontonos */ case 0x0389: /* Etatonos */ return 0x03AE; /* etatonos */ case 0x038A: /* Iotatonos */ return 0x03AF; /* iotatonos */ case 0x038C: /* Omicrontonos */ return 0x03CC; /* omicrontonos */ case 0x038E: /* Upsilontonos */ return 0x03CD; /* upsilontonos */ case 0x038F: /* Omegatonos */ return 0x03CE; /* omegatonos */ case 0x0391: /* Alpha */ return 0x03B1; /* alpha */ case 0x0392: /* Beta */ return 0x03B2; /* beta */ case 0x0393: /* Gamma */ return 0x03B3; /* gamma */ case 0x0395: /* Epsilon */ return 0x03B5; /* epsilon */ case 0x0396: /* Zeta */ return 0x03B6; /* zeta */ case 0x0397: /* Eta */ return 0x03B7; /* eta */ case 0x0398: /* Theta */ return 0x03B8; /* theta */ case 0x0399: /* Iota */ return 0x03B9; /* iota */ case 0x039A: /* Kappa */ return 0x03BA; /* kappa */ case 0x039B: /* Lambda */ return 0x03BB; /* lambda */ case 0x039C: /* Mu */ return 0x00B5; /* mu */ case 0x039D: /* Nu */ return 0x03BD; /* nu */ case 0x039E: /* Xi */ return 0x03BE; /* xi */ case 0x039F: /* Omicron */ return 0x03BF; /* omicron */ case 0x03A0: /* Pi */ return 0x03C0; /* pi */ case 0x03A1: /* Rho */ return 0x03C1; /* rho */ case 0x03A3: /* Sigma */ return 0x03C3; /* sigma */ case 0x03A4: /* Tau */ return 0x03C4; /* tau */ case 0x03A5: /* Upsilon */ return 0x03C5; /* upsilon */ case 0x03A6: /* Phi */ return 0x03C6; /* phi */ case 0x03A7: /* Chi */ return 0x03C7; /* chi */ case 0x03A8: /* Psi */ return 0x03C8; /* psi */ case 0x03AA: /* Iotadieresis */ return 0x03CA; /* iotadieresis */ case 0x03AB: /* Upsilondieresis */ return 0x03CB; /* upsilondieresis */ case 0x1E80: /* Wgrave */ return 0x1E81; /* wgrave */ case 0x1E82: /* Wacute */ return 0x1E83; /* wacute */ case 0x1E84: /* Wdieresis */ return 0x1E85; /* wdieresis */ case 0x1EF2: /* Ygrave */ return 0x1EF3; /* ygrave */ case 0x2126: /* Omega */ return 0x03C9; /* omega */ case 0x2206: /* Delta */ return 0x03B4; /* delta */ case 0xF6BF: /* LL */ return 0xF6C0; /* ll */ case 0xF6C9: /* Acute */ return 0x00B4; /* acute */ case 0xF6CA: /* Caron */ return 0x02C7; /* caron */ case 0xF6CB: /* Dieresis */ return 0x00A8; /* dieresis */ case 0xF6CC: /* DieresisAcute */ return 0xF6D7; /* dieresisacute */ case 0xF6CD: /* DieresisGrave */ return 0xF6D8; /* dieresisgrave */ case 0xF6CE: /* Grave */ return 0x0060; /* grave */ case 0xF6CF: /* Hungarumlaut */ return 0x02DD; /* hungarumlaut */ case 0xF6D0: /* Macron */ return 0x00AF; /* macron */ case 0xF6D1: /* cyrBreve */ return 0xF6D4; /* cyrbreve */ case 0xF6D2: /* cyrFlex */ return 0xF6D5; /* cyrflex */ case 0xF6D3: /* dblGrave */ return 0xF6D6; /* dblgrave */ default: return c; } } /* * For the unicode IDs of an accent and a base_glyph, return the * unicode ID of the composed (accented) glyph. If there is no * suitable composed glyph, return 0. */ uint32_t get_accented_glyph(uint32_t accent, uint32_t base_glyph) { TRACE_FIND((stderr, "get_accented_glyph: %lu, %lu", (unsigned long)accent, (unsigned long)base_glyph)); switch(accent) { case 0x0060: /* grave */ switch (base_glyph) { case 0x0041: /* A */ return 0x00C0; case 0x0045: /* E */ return 0x00C8; case 0x0049: /* I */ return 0x00CC; case 0x004F: /* O */ return 0x00D2; case 0x0055: /* U */ return 0x00D9; case 0x0057: /* W */ return 0x1E80; case 0x0059: /* Y */ return 0x1EF2; case 0x0061: /* a */ return 0x00E0; case 0x0065: /* e */ return 0x00E8; case 0x0069: /* i */ return 0x00EC; case 0x006F: /* o */ return 0x00F2; case 0x0075: /* u */ return 0x00F9; case 0x0077: /* w */ return 0x1E81; case 0x0079: /* y */ return 0x1EF3; default: return 0; } case 0x00B4: /* acute */ switch (base_glyph) { case 0x0041: /* A */ return 0x00C1; case 0x0043: /* C */ return 0x0106; case 0x0045: /* E */ return 0x00C9; case 0x0049: /* I */ return 0x00CD; case 0x004C: /* L */ return 0x0139; case 0x004E: /* N */ return 0x0143; case 0x004F: /* O */ return 0x00D3; case 0x0052: /* R */ return 0x0154; case 0x0053: /* S */ return 0x015A; case 0x0055: /* U */ return 0x00DA; case 0x0057: /* W */ return 0x1E82; case 0x0059: /* Y */ return 0x00DD; case 0x0060: /* Z */ return 0x0179; case 0x0061: /* a */ return 0x00E1; case 0x0063: /* c */ return 0x0107; case 0x0065: /* e */ return 0x00E9; case 0x0069: /* i */ return 0x00ED; case 0x006C: /* l */ return 0x013A; case 0x006E: /* n */ return 0x0144; case 0x006F: /* o */ return 0x00F3; case 0x0072: /* r */ return 0x0155; case 0x0073: /* s */ return 0x015B; case 0x0075: /* u */ return 0x00FA; case 0x0077: /* w */ return 0x1E83; case 0x0079: /* y */ return 0x00FD; case 0x0080: /* z */ return 0x017A; default: return 0; } case 0x02C6: /* circumflex */ case 0x005E: /* asciicircum */ switch (base_glyph) { case 0x0041: /* A */ return 0x00C2; case 0x0045: /* E */ return 0x00CA; case 0x0047: /* G */ return 0x011C; case 0x0048: /* H */ return 0x0124; case 0x0049: /* I */ return 0x00CE; case 0x0050: /* H */ return 0x0124; case 0x004F: /* O */ return 0x00D4; case 0x0055: /* U */ return 0x00DB; case 0x0061: /* a */ return 0x00E2; case 0x0065: /* e */ return 0x00EA; case 0x0067: /* g */ return 0x011D; case 0x0068: /* h */ return 0x0125; case 0x0069: /* i */ return 0x00EE; case 0x0070: /* j */ return 0x0135; case 0x006F: /* o */ return 0x00F4; case 0x0075: /* u */ return 0x00FB; default: return 0; } case 0x02DC: /* tilde */ case 0x007E: /* asciitilde */ switch (base_glyph) { case 0x0041: /* A */ return 0x00C3; case 0x0049: /* I */ return 0x0128; case 0x004E: /* N */ return 0x00D1; case 0x004F: /* O */ return 0x00D5; case 0x0055: /* U */ return 0x0168; case 0x0061: /* a */ return 0x00E3; case 0x0069: /* i */ return 0x0129; case 0x006E: /* n */ return 0x00F1; case 0x006F: /* o */ return 0x00F5; case 0x0075: /* u */ return 0x0169; default: return 0; } case 0x00A8: /* dieresis */ switch (base_glyph) { case 0x0041: /* A */ return 0x00C4; case 0x0045: /* E */ return 0x00CB; case 0x0049: /* I */ return 0x00CF; case 0x004F: /* O */ return 0x00D6; case 0x0055: /* U */ return 0x00DC; case 0x0057: /* w */ return 0x1E84; case 0x0061: /* a */ return 0x00E4; case 0x0065: /* e */ return 0x00EB; case 0x0069: /* i */ return 0x00EF; case 0x006F: /* o */ return 0x00F6; case 0x0075: /* u */ return 0x00FC; case 0x0077: /* w */ return 0x1E85; case 0x0079: /* y */ return 0x00FF; default: return 0; } case 0x02DA: /* ring */ switch (base_glyph) { case 0x0041: /* A */ return 0x00C5; case 0x0061: /* a */ return 0x00E5; case 0x0055: /* U */ return 0x016E; case 0x0075: /* u */ return 0x016F; default: return 0; } case 0x00B8: /* cedilla */ switch (base_glyph) { case 0x0043: /* C */ return 0x00C7; case 0x0063: /* c */ return 0x00E7; case 0x0053: /* S */ return 0x015E; case 0x0073: /* s */ return 0x015F; default: return 0; } case 0x02DB: /* ogonek */ switch (base_glyph) { case 0x0041: /* A */ return 0x0104; case 0x0045: /* E */ return 0x0118; case 0x0049: /* I */ return 0x012E; case 0x0055: /* U */ return 0x0172; case 0x0061: /* a */ return 0x0105; case 0x0065: /* e */ return 0x0119; case 0x0069: /* i */ return 0x012F; case 0x006F: /* o */ return 0x02DB; case 0x0075: /* u */ return 0x0173; default: return 0; } case 0x002F: /* solidus */ switch (base_glyph) { case 0x004C: /* L */ return 0x0141; case 0x004F: /* O */ return 0x00D8; case 0x006C: /* l */ return 0x0142; case 0x006F: /* o */ return 0x00F8; default: return 0; } case 0x02C7: /* caron */ switch (base_glyph) { case 0x0043: /* C */ return 0x010C; case 0x0044: /* D */ return 0x010E; case 0x0045: /* E */ return 0x011A; case 0x0047: /* G */ return 0x01E6; case 0x004C: /* L */ return 0x013D; case 0x004E: /* N */ return 0x0147; case 0x0052: /* R */ return 0x0158; case 0x0053: /* S */ return 0x0160; case 0x0054: /* T */ return 0x0164; case 0x005A: /* Z */ return 0x017D; case 0x0063: /* c */ return 0x010D; case 0x0064: /* d */ return 0x010F; case 0x0065: /* e */ return 0x011B; case 0x0067: /* g */ return 0x01E7; case 0x006C: /* l */ return 0x013E; case 0x006E: /* n */ return 0x0148; case 0x0072: /* r */ return 0x0159; case 0x0073: /* s */ return 0x0161; case 0x0074: /* t */ return 0x0165; case 0x007A: /* z */ return 0x017E; default: return 0; } case 0x02D8: /* breve */ switch (base_glyph) { case 0x0041: /* A */ return 0x0102; case 0x0045: /* E */ return 0x0114; case 0x0047: /* G */ return 0x011E; case 0x0049: /* I */ return 0x012C; case 0x004F: /* O */ return 0x014E; case 0x0055: /* U */ return 0x016C; case 0x0061: /* a */ return 0x0103; case 0x0065: /* e */ return 0x0115; case 0x0067: /* g */ return 0x011F; case 0x0069: /* i */ return 0x012D; case 0x006F: /* o */ return 0x014F; case 0x0075: /* u */ return 0x016D; default: return 0; } case 0x02DD: /* hungarumlaut */ switch (base_glyph) { case 0x004F: /* O */ return 0x0150; case 0x0055: /* U */ return 0x0170; case 0x006F: /* o */ return 0x0151; case 0x0075: /* u */ return 0x0171; default: return 0; } case 0x00AF: /* macron */ switch (base_glyph) { case 0x0041: /* A */ return 0x0100; case 0x0045: /* E */ return 0x0112; case 0x0049: /* I */ return 0x012A; case 0x004F: /* O */ return 0x014C; case 0x0055: /* U */ return 0x016A; case 0x0061: /* a */ return 0x0101; case 0x0065: /* e */ return 0x0113; case 0x0069: /* i */ return 0x012B; case 0x006D: /* m */ return 0x00AF; case 0x006F: /* o */ return 0x014D; case 0x0075: /* u */ return 0x016B; default: return 0; } /* special cases: accent - char inverted */ case 0x0043: /* C; special case: cedilla is set after C in OT1 */ switch (base_glyph) { case 0x00B8: /* cedilla */ return 0x00C7; default: return 0; } case 0x0063: /* c; see above */ switch (base_glyph) { case 0x00B8: /* cedilla */ return 0x00E7; default: return 0; } case 0x0053: /* S; see above */ switch (base_glyph) { case 0x00B8: /* cedilla */ return 0x015E; default: return 0; } case 0x0073: /* s; see above */ switch (base_glyph) { case 0x00B8: /* cedilla */ return 0x015F; default: return 0; } } return 0; } uint32_t guess_encoding(wide_ubyte ch, const char *fontname, char *retbuf) { uint32_t i; static hashTableT unknown_font_hash; static Boolean hash_initialized = False; size_t dummy = 0; TRACE_FIND_VERBOSE((stderr, "guess_encoding: |%s|, char 0x%.4X", fontname, ch)); /* our encoding vectors only have size 256 */ if (ch > 255) { XDVI_WARNING((stderr, "guess_encoding: font index %lu too large", (unsigned long)ch)); return 0; } if (HAS_PREFIX(fontname, "gbk") && isdigit((int)fontname[(i=strlen(fontname))-1]) && isdigit((int)fontname[i-2])) { unsigned char cjk[2]; TRACE_FIND_VERBOSE((stderr, "guess_encoding: CJK fonts (GBK encoding)")); i = atoi(fontname + i - 2); /* font no */ i = (i - 1) * 256 + (uint32_t)ch; /* char index */ cjk[0] = i / 190 + 129; cjk[1] = i % 190 + 64; if (cjk[1] >= 128) cjk[1]++; return cjk2unicode(cjk); } if (HAS_PREFIX(fontname, "cmsy") || HAS_PREFIX(fontname, "xccsy") ) { TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cm_symbol", fontname)); return m_cm_symbol_encoding[ch]; } if (HAS_PREFIX(fontname, "cmmi") || HAS_PREFIX(fontname, "xccmi") ) { TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cm_math_italics", fontname)); return m_cm_math_italics_encoding[ch]; } if (HAS_PREFIX(fontname, "cmex") || HAS_PREFIX(fontname, "xccex") ) { TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cm_math_extended", fontname)); return m_cm_math_extended_encoding[ch]; } if (HAS_PREFIX(fontname, "cmtt")) { TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cm_typewriter", fontname)); return m_cm_typewriter_encoding[ch]; } /* following to cover cmsl, cmb, cmbx, cmti, cmdunghill, whatever ... hope it doesn't overgenerate ;-) */ if (HAS_PREFIX(fontname, "cm") || HAS_PREFIX(fontname, "ccr") || HAS_PREFIX(fontname, "lcmss") /* lcmss8 etc. */ || HAS_PREFIX(fontname, "ygoth") || HAS_PREFIX(fontname, "yinit") || HAS_PREFIX(fontname, "logo") || HAS_PREFIX(fontname, "rsfs") || HAS_PREFIX(fontname, "bbm") ) { TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_ot1", fontname)); return m_ot1_encoding[ch]; } /* cyrillic fonts */ if (HAS_PREFIX(fontname, "la")) { TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_t2", fontname)); return m_t2_encoding[ch]; } if (HAS_PREFIX(fontname, "ec") || HAS_PREFIX(fontname, "eo") || HAS_PREFIX(fontname, "eb")) { TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cork", fontname)); /* FIXME: why cork and not EC? Are there fonts that actually use EC? The only difference seems that dvips' EC.enc has `ldot' at 0xb8, whereas cork.enc has `ydieresis' there. A document with \usepackage[T1]{fontenc} also produces a ydieresis. */ return m_cork_encoding[ch]; } if (HAS_PREFIX(fontname, "tc")) { TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_ts1", fontname)); return m_ts1_encoding[ch]; } /* blackletter fonts with funny encoding */ if (HAS_PREFIX(fontname, "ysmfrak") || HAS_PREFIX(fontname, "yswab")) { TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_yfrak", fontname)); /* special cases for ligatures */ switch (ch) { case 0x85: strcpy(retbuf, "ch"); return 0; case 0x86: strcpy(retbuf, "ck"); return 0; case 0xA7: strcpy(retbuf, "sz"); return 0; default: return m_yfrak_encoding[ch]; } } /* euler mathematical */ if (HAS_PREFIX(fontname, "eufm") || HAS_PREFIX(fontname, "eusm")) { switch (ch) { case 0x0: case 0x1: return 'd'; break; case 0x2: case 0x3: return 'f'; break; case 0x4: return 'g'; break; case 0x5: return 'k'; break; case 0x6: return 't'; break; case 0x7: return 'u'; break; default: return m_ot1_encoding[ch]; } } /* stuff that doesn't have a good ASCII representation */ if (HAS_PREFIX(fontname, "lcircle") || HAS_PREFIX(fontname, "line") || HAS_PREFIX(fontname, "fmvr8x") || HAS_PREFIX(fontname, "feymr") || HAS_PREFIX(fontname, "msbm") || HAS_PREFIX(fontname, "msam") || HAS_PREFIX(fontname, "wasy") || HAS_PREFIX(fontname, "txsy") ) { return 0; } if (HAS_PREFIX(fontname, "bbold")) { return m_bbold_encoding[ch]; } if (HAS_PREFIX(fontname, "gli") || HAS_PREFIX(fontname, "glj") || HAS_PREFIX(fontname, "glm") || HAS_PREFIX(fontname, "glt") || HAS_PREFIX(fontname, "glw") || HAS_PREFIX(fontname, "glx") || HAS_PREFIX(fontname, "gmm") || HAS_PREFIX(fontname, "gmt") || HAS_PREFIX(fontname, "gmx") || HAS_PREFIX(fontname, "gom") || HAS_PREFIX(fontname, "gox") || HAS_PREFIX(fontname, "grb") || HAS_PREFIX(fontname, "grm") || HAS_PREFIX(fontname, "grx") || HAS_PREFIX(fontname, "gsm") || HAS_PREFIX(fontname, "gsx") || HAS_PREFIX(fontname, "gtt") ) { TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cb_greek_encoding", fontname)); return m_cb_greek_encoding[ch]; } if (HAS_PREFIX(fontname, "wasy")) { /* these are all special symbols */ return 0; } if (HAS_PREFIX(fontname, "to")) { if (ch >= '0' && ch <= '9') { return ch; } else { /* special symbols */ return 0; } } /* TODO: txfonts */ /* default: assume cork encoding, and print out a warning for each font */ if (!hash_initialized) { unknown_font_hash = hash_create(1031); hash_initialized = True; } if (!find_str_int_hash(&unknown_font_hash, fontname, &dummy)) { if (resource.t1lib) { XDVI_WARNING((stderr, "guess_encoding(): nothing suitable for \"%s\", assuming Cork encoding.\n" "(Please tell us about this at " "http://sourceforge.net/tracker/?group_id=23164&atid=377580)", fontname)); } else { XDVI_INFO((stderr, "T1lib not enabled, assuming Cork encoding for font \"%s\".\n", fontname)); } put_str_int_hash(&unknown_font_hash, fontname, dummy); } return m_cork_encoding[ch]; } /* Mapping of unicode glyphs to ASCII `equivalents' that are useful when searching for text. */ const char * search_normalize_chars(uint32_t unicode) { const char *ret = NULL; switch(unicode) { case 0x2212: ret = "-"; break; case 0x2022: ret = "\xb7"; break; /* middle dot */ default: ret = NULL; break; } if (ret != NULL) { TRACE_FIND((stderr, "expand_searchchars: 0x%X --> `%s'", (unsigned int)unicode, ret)); } return ret; } /* Expand a unicode ligature character consisting of several `ordinary' characters to a string of those characters, and map some unicode glyphs to ASCII `equivalents'. TODO: move the more ambiguous replacements (e.g. guilsinglleft vs. angleleft) into a user-defined table? */ const char * expand_ligature(uint32_t unicode) { const char *ret = NULL; switch(unicode) { case 0xFB00: ret = "ff"; break; case 0xFB01: ret = "fi"; break; case 0xFB02: ret = "fl"; break; case 0xFB03: ret = "ffi"; break; case 0xFB04: ret = "ffl"; break; case 0xFB06: ret = "st"; break; case 0x0133: ret = "ij"; break; case 0x2013: ret = "--"; break; case 0x2014: ret = "---"; break; case 0x2039: case 0x2329: ret = "<"; break; case 0x203A: case 0x232A: ret = ">"; break; case 0x2018: ret = "`"; break; case 0x2019: ret = "'"; break; case 0x201C: ret = "``"; break; case 0x201D: ret = "''"; break; case 0x2026: ret = "..."; break; case 0x10ff28: ret = "{"; break; case 0x10ff29: ret = "}"; break; default: ret = NULL; break; } if (ret != NULL) { TRACE_FIND((stderr, "expand_ligature: 0x%X --> `%s'", (unsigned int)unicode, ret)); } return ret; } /* * Convert the utf8-string passed as argument to lowercase, by * first converting to UCS4, then converting back, lowercasing the * UCS4 characters as we go (it's easier like that). */ Boolean utf8_lowercase(char *utf8) { size_t utf8_len = strlen(utf8) + 1; /* also convert terminating byte (acutally not needed ...) */ size_t ucs4_len = utf8_len * 6; /* ample ... */ int i = 0; uint32_t *ucs4 = xmalloc(ucs4_len); uint32_t *ucs4_start = ucs4; /* save for free()ing */ for (; *utf8 != '\0'; ucs4++, utf8 += i) { size_t conv_len; if ((i = utf8_to_ucs4(utf8, ucs4, 6 /* don't care about character len */)) < 0) { XDVI_ERROR((stderr, "Error in utf8_lowercase: Illegal UTF-8 sequence")); free(ucs4_start); return False; } ucs4_to_utf8(*ucs4, utf8, &conv_len, True); /* lowercases it */ if ((int)conv_len != i) { XDVI_ERROR((stderr, "Error in utf8_lowercase: length after UCS4 conversion (%lu)\n" "differs from length after utf8 conversion(%lu) (string: %s)\n", (unsigned long)conv_len, (unsigned long)i, utf8)); free(ucs4_start); return False; } } free(ucs4_start); return True; } /* * Adapted from iconv's utf8_wctomb in lib/utf8.h * Converts the character sequence pointed to by utf8 of maximum length `len' * into an UCS4 character pointed to by ucs4. * TODO: maybe implement this as a macro?? */ int utf8_to_ucs4(const char *utf8, uint32_t *ucs4, size_t len) { const unsigned char *str = (const unsigned char *)utf8; unsigned char c = *str; if (c < 0x80) { *ucs4 = c; return 1; } else if (c < 0xc2) { return -1; /* illegal UTF8; shouldn't happen */ } else if (c < 0xe0) { if (len < 2) return -1; /* len too short */ if (!((str[1] ^ 0x80) < 0x40)) { return -1; /* illegal UTF8; shouldn't happen */ } *ucs4 = ((uint32_t) (c & 0x1f) << 6) | (uint32_t) (str[1] ^ 0x80); return 2; } else if (c < 0xf0) { if (len < 3) return -1; /* len too short */ if (!((str[1] ^ 0x80) < 0x40 && (str[2] ^ 0x80) < 0x40 && (c >= 0xe1 || str[1] >= 0xa0))) { return -1; /* illegal UTF8; shouldn't happen */ } *ucs4 = ((uint32_t) (c & 0x0f) << 12) | ((uint32_t) (str[1] ^ 0x80) << 6) | (uint32_t) (str[2] ^ 0x80); return 3; } else if (c < 0xf8 && sizeof(uint32_t) * 8 >= 32) { if (len < 4) return -1; /* len too short */ if (!((str[1] ^ 0x80) < 0x40 && (str[2] ^ 0x80) < 0x40 && (str[3] ^ 0x80) < 0x40 && (c >= 0xf1 || str[1] >= 0x90))) { return -1; /* illegal UTF8; shouldn't happen */ } *ucs4 = ((uint32_t) (c & 0x07) << 18) | ((uint32_t) (str[1] ^ 0x80) << 12) | ((uint32_t) (str[2] ^ 0x80) << 6) | (uint32_t) (str[3] ^ 0x80); return 4; } else if (c < 0xfc && sizeof(uint32_t)*8 >= 32) { if (len < 5) return -1; /* len too short */ if (!((str[1] ^ 0x80) < 0x40 && (str[2] ^ 0x80) < 0x40 && (str[3] ^ 0x80) < 0x40 && (str[4] ^ 0x80) < 0x40 && (c >= 0xf9 || str[1] >= 0x88))) { return -1; /* illegal UTF8; shouldn't happen */ } *ucs4 = ((uint32_t) (c & 0x03) << 24) | ((uint32_t) (str[1] ^ 0x80) << 18) | ((uint32_t) (str[2] ^ 0x80) << 12) | ((uint32_t) (str[3] ^ 0x80) << 6) | (uint32_t) (str[4] ^ 0x80); return 5; } else if (c < 0xfe && sizeof(uint32_t)*8 >= 32) { if (len < 6) return -1; /* len too short */ if (!((str[1] ^ 0x80) < 0x40 && (str[2] ^ 0x80) < 0x40 && (str[3] ^ 0x80) < 0x40 && (str[4] ^ 0x80) < 0x40 && (str[5] ^ 0x80) < 0x40 && (c >= 0xfd || str[1] >= 0x84))) { return -1; /* illegal UTF8; shouldn't happen */ } *ucs4 = ((uint32_t) (c & 0x01) << 30) | ((uint32_t) (str[1] ^ 0x80) << 24) | ((uint32_t) (str[2] ^ 0x80) << 18) | ((uint32_t) (str[3] ^ 0x80) << 12) | ((uint32_t) (str[4] ^ 0x80) << 6) | (uint32_t) (str[5] ^ 0x80); return 6; } else { return -1; /* illegal UTF8 */ } } /* adapted from iconv's utf8_wctomb in lib/utf8.h */ /* TODO: maybe implement this as a macro?? */ void ucs4_to_utf8(uint32_t ucs4, char *utf8, size_t *len, Boolean do_lowercase) { if (do_lowercase) { ucs4 = ucs4_lowercase(ucs4); TRACE_FIND_VERBOSE((stderr, "Lowercasing of 0x%lx --> 0x%lx\n", ucs4_bak, ucs4)); } else { TRACE_FIND_VERBOSE((stderr, "NOT lowercasing 0x%lx\n", ucs4)); } if (ucs4 < 0x80) *len = 1; else if (ucs4 < 0x800) *len = 2; else if (ucs4 < 0x10000) *len = 3; else if (ucs4 < 0x200000) *len = 4; else if (ucs4 < 0x4000000) *len = 5; else if (ucs4 <= 0x7fffffff) *len = 6; switch(*len) { /* note: code falls through cases! */ case 6: utf8[5] = 0x80 | (ucs4 & 0x3f); ucs4 = ucs4 >> 6; ucs4 |= 0x4000000; case 5: utf8[4] = 0x80 | (ucs4 & 0x3f); ucs4 = ucs4 >> 6; ucs4 |= 0x200000; case 4: utf8[3] = 0x80 | (ucs4 & 0x3f); ucs4 = ucs4 >> 6; ucs4 |= 0x10000; case 3: utf8[2] = 0x80 | (ucs4 & 0x3f); ucs4 = ucs4 >> 6; ucs4 |= 0x800; case 2: utf8[1] = 0x80 | (ucs4 & 0x3f); ucs4 = ucs4 >> 6; ucs4 |= 0xc0; case 1: utf8[0] = ucs4; } } /* * (Lossy) conversion of utf8 sequence to an iso-latin1; produces * `?' if the character is not representable in iso-latin1. * Returns the number of converted characters in `len'. */ unsigned char utf8_to_iso_8859_1(const char *utf8, size_t *len) { unsigned char c = *utf8; uint32_t wc; if (c < 0x80) { *len = 1; return c; } else if (c < 0xe0) { *len = 2; wc = ((unsigned char)(c & 0x1f) << 6) | (unsigned char)(utf8[1] ^ 0x80); if (wc <= 0xff) return (unsigned char)wc; else return '?'; } else if (c < 0xf0) { *len = 3; return '?'; } else if (c < 0xf8) { *len = 4; return '?'; } else if (c < 0xfc) { *len = 5; return '?'; } else if (c < 0xfe) { *len = 6; return '?'; } else return '?'; } /* convert an iso_8859_1 character to utf8, writing the result to the buffer `utf8' (which should have at least length 2), and storing the length of the converted utf-8 sequence in *len. */ void iso_8859_1_to_utf8(unsigned char c, char *utf8, size_t *len) { if (c < 0x80) { *len = 1; utf8[0] = c; } else { *len = 2; utf8[1] = 0x80 | (c & 0x3f); c >>= 6; utf8[0] = 0xc0 | (c & 0x1f); } } /* Convert an iso_latin-1 string to a UTF-8 string (including the terminating `\0'), not writing more than `len' characters to `utf8'. Returns the number of written characters, or -1 if len was too small to convert the entire input string. */ int str_iso_8859_1_to_utf8(const char *latin1, char *utf8, size_t len) { size_t i = 0; while (i < len && *latin1 != '\0') { char tmpbuf[2]; size_t tmp_len = 0; iso_8859_1_to_utf8((unsigned char)*latin1, tmpbuf, &tmp_len); if (i + tmp_len >= len) return -1; memcpy(utf8 + i, tmpbuf, tmp_len); i += tmp_len; latin1++; } /* terminate utf8 */ if (i < len) utf8[i++] = '\0'; else return -1; return i; } Boolean is_hyphenchar(uint32_t u) { if (u == 0x002D || u == 0x00AD) return True; return False; } /* * Determine ideographic property according to * http://www.unicode.org/Public/UNIDATA/PropList.txt: * * 3006 ; Ideographic # Lo IDEOGRAPHIC CLOSING MARK * 3007 ; Ideographic # Nl IDEOGRAPHIC NUMBER ZERO * 3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE * 3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY * 3400..4DB5 ; Ideographic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 * 4E00..9FA5 ; Ideographic # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 * F900..FA2D ; Ideographic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D * 20000..2A6D6 ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 * 2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D * * # Total code points: 71053 * * plus space, comma and full stop. * */ Boolean is_ideograph(uint32_t u) { return (u >= 0x3000 && u <= 0x3002) || /* IDEOGRAPHIC SPACE, COMMA, FULL STOP */ u == 0xFF61 || /* HALFWIDTH IDEOGRAPHIC FULL STOP */ u == 0xFF64 || /* HALFWIDTH IDEOGRAPHIC COMMA */ (u >= 0x3006 && u <= 0x3007) || (u >= 0x3021 && u <= 0x3029) || (u >= 0x3038 && u <= 0x303A) || (u >= 0x3400 && u <= 0x4DB5) || (u >= 0x4E00 && u <= 0x9FA5) || (u >= 0xF900 && u <= 0xFA2D) || (u >= 0x20000 && u <= 0x2A6D6) || (u >= 0x2F800 && u <= 0x2FA1D); } char * str_utf8_to_iso_8859_1(const char *utf8) { size_t utf8_len = strlen(utf8), i = 0, offset = 0; char *buf = xmalloc(4 * utf8_len + 1); /* worst case of non-printables */ while (i < utf8_len) { uint32_t ucs4; const char *ret; /* fprintf(stderr, "offset: %d\n", (int)offset); */ /* first apply normalization heurisitcs also used by search */ size_t len = utf8_to_ucs4(utf8 + i, &ucs4, utf8_len + 1); if ((ret = search_normalize_chars(ucs4)) != NULL) { size_t len_ret = strlen(ret); memcpy(buf + offset, ret, len_ret); offset += len_ret; } else if (ucs4 <= 0xff) { /* in iso-latin1 range */ buf[offset++] = (unsigned char)ucs4; } else { sprintf(buf + offset, "\\%.4lX", (unsigned long)ucs4); offset += 4; } i += len; } buf[offset] = '\0'; return buf; } xdvik-ja-22.84.16-j1.40/texk/xdvik/psgs.h0000664000175000017500000000247010363262237017317 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef PSGS_H_ #define PSGS_H_ extern Boolean initGS(void); extern void gs_resume_prescan(void); extern void restart_gs(void); extern void erasepage_gs(void); #endif /* PSGS_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/hypertex.c0000664000175000017500000021621111535134121020176 0ustar uwabamiuwabami /* * 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ /* * Original copyright: * * Hypertex modifications to DVI previewer for X. * This portion of xhdvi is completely in the public domain. The * author renounces any copyright claims. It may be freely used for * commercial or non-commercial purposes. The author makes no claims * or guarantees - use this at your own risk. * * Arthur Smith, U. of Washington, 1994 * * 5/1994 code written from scratch, probably inspired by (but * incompatible with) the CERN WWW library. * * 3/1995 CERN WWW library called to do document fetching. * * 5/2002 SU: rewritten from scratch to make it work with the new * event handling in xdvi >= 22.41: Anchors are now saved * per page instead of per document, making it more robust * wrt. interrupting the drawing and skipping to another page. * Only drawback is that links breaking over pages are more * difficult to handle (but they didn't work properly before either). * Clicking on a link now performs a search for the * corresponding anchor similiar to `forward search'. * * Removed libwww, since it has become too bloated * and buggy, and had only rudimentary support for GUI * interaction to begin with (e.g., interrupting a * download). And since this is 2002, we might just as well * use a web browser to fetch remote documents ;-) */ /* TODO: - implement popup with list of visited links, as specified in http://xdvi.sourceforge.net/gui.html#navigation-openLinks (maybe this should be a simple menu list, not a popup window). */ #define COPY_TMP_FILE 0 /* see comments below */ /* #define DEBUG */ /* #define DEBUG_MEMORY_HANDLING */ #include "alloc-debug.h" #include "xdvi-config.h" #include "xdvi.h" #include #include #include "kpathsea/c-fopen.h" #include "kpathsea/c-stat.h" #include /* for XtNwidth, XtNheight */ #include "events.h" #include "dvi-init.h" #include "message-window.h" #include "util.h" #include "dl_list.h" #include "x_util.h" #include "mime.h" #include "mag.h" #include "dvi-draw.h" #include "statusline.h" #include "browser.h" #include "hypertex.h" #include "special.h" #include "string-utils.h" #include "xm_toolbar.h" #include "my-snprintf.h" #include "pagehist.h" /* globals */ /* rgb specifications to translate resource.{visited_}link_color into */ char *g_link_color_rgb = NULL; char *g_visited_link_color_rgb = NULL; char *g_anchor_pos = NULL; size_t g_anchor_len = 0; static const int DEFAULT_MARKER_X_OFFSET = 2; /* horizontal offset of anchor marker to edge of screen */ static const int HTEX_ALLOC_STEP = 32; /* distance of underline from lower edge of character bbox */ static const int ANCHOR_XTRA_V_BBOX = 6; /* info whether we're dealing with hypertex or hdvips type links */ typedef enum { HYPERTEX_LINK, HDVIPS_LINK } hrefLinkT; static hrefLinkT m_href_type; typedef enum { A_HREF = 0, A_NAME, A_HREF_FILE, /* hdvips file ref */ A_HREF_URL, /* hdvips URL ref */ A_HDVIPS_INTERNAL, /* internal ref */ A_HDVIPS_HREF, /* hdvips href */ A_HDVIPS_NAME, /* hdvips name */ A_OTHER, A_END, A_NONE, A_MISMATCH } htexAnchorT; /****************************** helper routines ******************************/ static Boolean htex_is_href(htexAnchorT type) { return type == A_HREF || type == A_HREF_FILE || type == A_HREF_URL || type == A_HDVIPS_HREF || type == A_HDVIPS_INTERNAL; } static Boolean htex_is_name(htexAnchorT type) { return type == A_NAME || type == A_HDVIPS_NAME; } static void parse_html_special(const char *special, size_t len, const char **beg, const char **end) { *beg = special; while (isspace((int)**beg) || **beg == '=') { (*beg)++; len--; } *end = *beg + len - 1; while (isspace((int)**end) || **end == '>') (*end)--; /* remove quote pairs */ if (**beg == '"') { (*beg)++; if (**end == '"') { (*end)--; } } /* now end points to last anchor char, move behind that */ (*end)++; } /* Anchor prescanning stuff: We make a pass through all pages in the document before displaying them to collect information about mismatched anchors (anchors where the opening tag is on some previous page). The information is stored in the following struct: */ struct prescan_info { int anchor_depth; size_t anchor_num; size_t anchor_list_size; int *anchor_list; /* pointers to either NULL, or to mismatched anchor strings (the contents of '' on some previous page), for each page */ size_t pagelist_len; char **pagelist; }; static struct prescan_info m_prescan_info = { 0, 0, 0, NULL, 0, NULL }; static struct prescan_info m_save_prescan_info = { 0, 0, 0, NULL, 0, NULL }; /* Save prescan info from previous page, in case we only have a partial scan of the current page and need to start all over. */ void htex_prescan_save(void) { m_save_prescan_info.anchor_depth = m_prescan_info.anchor_depth; m_save_prescan_info.anchor_num = m_prescan_info.anchor_num; /* copy over anchor list */ while (m_save_prescan_info.anchor_depth >= (int)m_save_prescan_info.anchor_list_size) { int i; m_save_prescan_info.anchor_list_size += HTEX_ALLOC_STEP; m_save_prescan_info.anchor_list = XREALLOC(m_save_prescan_info.anchor_list, m_save_prescan_info.anchor_list_size * sizeof *(m_save_prescan_info.anchor_list)); for (i = 0; i < m_save_prescan_info.anchor_depth; i++) { m_save_prescan_info.anchor_list[i] = m_prescan_info.anchor_list[i]; } } /* the page list of anchor strings can only have had its current position modified; we'll simply delete that position in htex_prescan_restore(). */ } /* Restore prescan info from m_save_prescan_info. */ void htex_prescan_restore(int pageno) { m_prescan_info.anchor_depth = m_save_prescan_info.anchor_depth; m_prescan_info.anchor_num = m_save_prescan_info.anchor_num; /* copy back anchor list */ if (m_save_prescan_info.anchor_depth > 0) { int i; /* old list might have been free()d in htex_prescan_reset_firstpass */ while (m_save_prescan_info.anchor_depth >= (int)m_prescan_info.anchor_list_size) { m_prescan_info.anchor_list_size += HTEX_ALLOC_STEP; m_prescan_info.anchor_list = XREALLOC(m_prescan_info.anchor_list, m_prescan_info.anchor_list_size * sizeof *(m_prescan_info.anchor_list)); } for (i = 0; i < m_save_prescan_info.anchor_depth; i++) { m_prescan_info.anchor_list[i] = m_save_prescan_info.anchor_list[i]; } } /* reset anchor string info for this page */ if ((int)m_prescan_info.pagelist_len > pageno) { ASSERT(m_prescan_info.pagelist != NULL, "m_prescan_info.pagelist not properly allocated"); FREE(m_prescan_info.pagelist[pageno]); m_prescan_info.pagelist[pageno] = NULL; } } /* Reset prescan info for first pass (anchor numbers only) to its initial state, freeing up allocated resources for anchor_list. */ void htex_prescan_reset_firstpass(void) { MYTRACE((stderr, "resetting anchor_depth to 0!!!!!!!!!!!!")); m_prescan_info.anchor_depth = 0; m_prescan_info.anchor_num = 0; m_prescan_info.anchor_list_size = 0; FREE(m_prescan_info.anchor_list); m_prescan_info.anchor_list = NULL; } /* Reset the prescan info, freeing up all allocated memory. Used when e.g. switching to a different file via Ctrl-F. */ static void htex_prescan_reset(void) { size_t i; m_prescan_info.anchor_depth = 0; m_prescan_info.anchor_num = 0; m_prescan_info.anchor_list_size = 0; free(m_prescan_info.anchor_list); m_prescan_info.anchor_list = NULL; for (i = 0; i < m_prescan_info.pagelist_len; i++) { free(m_prescan_info.pagelist[i]); } free(m_prescan_info.pagelist); m_prescan_info.pagelist = NULL; m_prescan_info.pagelist_len = 0; } /* Initialize m_prescan_info for scanning a new page. */ void htex_prescan_initpage(void) { m_prescan_info.anchor_num = 0; } Boolean htex_prescan_special(const char *cp, int cp_len, struct htex_prescan_data *data) { UNUSED(cp_len); ASSERT(data != NULL, "data argument to htex_prescan_special() mustn't be NULL"); if (data->pageno + 1 < (int)m_prescan_info.pagelist_len) { /* already scanned this page */ MYTRACE((stderr, "already scanned page %d", data->pageno+1)); return False; } /* resize pagelist */ while (data->pageno >= (int)m_prescan_info.pagelist_len) { size_t old_len = m_prescan_info.pagelist_len; size_t i; MYTRACE((stderr, "============ resizing pagelist to %d", data->pageno + 1)); m_prescan_info.pagelist_len = data->pageno + 1; m_prescan_info.pagelist = XREALLOC(m_prescan_info.pagelist, m_prescan_info.pagelist_len * sizeof *m_prescan_info.pagelist); /* initialize with NULL values */ for (i = old_len; i < m_prescan_info.pagelist_len; i++) { MYTRACE((stderr, "============ initializing pagelist %d", i)); m_prescan_info.pagelist[i] = NULL; } } if (data->scan_type == HTEX_ANCHOR_STRING) { if ((int)m_prescan_info.anchor_num == data->anchor_num) { char *anchor; const char *beg, *end; const char *cp1 = cp; const char *ptr = NULL; const char *pptr = NULL; if (memicmp(cp1, "] */ m_prescan_info.pagelist[data->pageno] = anchor; } else if (memcmp(cp1, "/A", 2) == 0) { if ((ptr = strstr(cp1 + 2, "/GoToR")) != NULL /* external file */ && (ptr = strchr(ptr, '(')) != NULL && (pptr = strchr(ptr + 1, '(')) != NULL) { anchor = xmalloc(pptr - ptr); memcpy(anchor, ptr + 1, pptr - ptr - 1); anchor[pptr - ptr - 1] = '\0'; /* save the anchor string in m_prescan_info.pagelist[] */ m_prescan_info.pagelist[data->pageno] = anchor; } else if ((ptr = strstr(cp1 + 2, "/URI")) != NULL /* external file */ && (ptr = strchr(ptr, '(')) != NULL && (pptr = strchr(ptr + 1, '(')) != NULL) { anchor = xmalloc(pptr - ptr); memcpy(anchor, ptr + 1, pptr - ptr - 1); anchor[pptr - ptr - 1] = '\0'; /* save the anchor string in m_prescan_info.pagelist[] */ m_prescan_info.pagelist[data->pageno] = anchor; } } else if (memcmp(cp, "/L", 2) == 0) { if ((ptr = strstr(cp1 + 2, "/Dest")) != NULL /* internal link */ && (ptr = strchr(ptr, '(')) != NULL && (pptr = strchr(ptr + 1, '(')) != NULL) { anchor = xmalloc(pptr - ptr); memcpy(anchor, ptr + 1, pptr - ptr - 1); anchor[pptr - ptr - 1] = '\0'; /* save the anchor string in m_prescan_info.pagelist[] */ m_prescan_info.pagelist[data->pageno] = anchor; } } } } if (memicmp(cp, "= (int)m_prescan_info.anchor_list_size) { m_prescan_info.anchor_list_size += HTEX_ALLOC_STEP; m_prescan_info.anchor_list = XREALLOC(m_prescan_info.anchor_list, m_prescan_info.anchor_list_size * sizeof *(m_prescan_info.anchor_list)); } ASSERT(m_prescan_info.anchor_depth >= 0, "List should contain previous anchor info"); m_prescan_info.anchor_list[m_prescan_info.anchor_depth] = m_prescan_info.anchor_num; m_prescan_info.anchor_depth++; m_prescan_info.anchor_num++; } else if (memicmp(cp, "= (int)m_prescan_info.anchor_list_size) { m_prescan_info.anchor_list_size += HTEX_ALLOC_STEP; m_prescan_info.anchor_list = XREALLOC(m_prescan_info.anchor_list, m_prescan_info.anchor_list_size * sizeof *(m_prescan_info.anchor_list)); } ASSERT(m_prescan_info.anchor_depth >= 0, "List should contain previous anchor info"); m_prescan_info.anchor_list[m_prescan_info.anchor_depth] = m_prescan_info.anchor_num; m_prescan_info.anchor_depth++; m_prescan_info.anchor_num++; } else if (memcmp(cp, "H.R end", strlen("H.R end")) == 0 /* end of rect */ || memcmp(cp, "H.A end", strlen("H.A end")) == 0 /* end of anchor */ || memcmp(cp, "H.L end", strlen("H.L end")) == 0 /* end of link */ ) { if (m_prescan_info.anchor_depth < 1) { /* this can happen when stuff had been prescanned before */ return False; } m_prescan_info.anchor_depth--; m_prescan_info.anchor_num++; } return False; } int htex_prescan_get_depth(void) { return m_prescan_info.anchor_depth; } /* copy over pagelist from old_page to new_page */ void htex_prescan_carry_over(int old_page, int new_page) { ASSERT(old_page >= 0, "old_page out of range"); ASSERT(old_page < (int)m_prescan_info.pagelist_len, "old_page out of range"); /* resize if needed */ if (new_page >= (int)m_prescan_info.pagelist_len) { size_t old_len = m_prescan_info.pagelist_len; size_t i; m_prescan_info.pagelist_len = new_page + 1; m_prescan_info.pagelist = XREALLOC(m_prescan_info.pagelist, m_prescan_info.pagelist_len * sizeof *m_prescan_info.pagelist); /* initialize with NULL values */ for (i = old_len; i < m_prescan_info.pagelist_len; i++) { m_prescan_info.pagelist[i] = NULL; } } free(m_prescan_info.pagelist[new_page]); /* don't share pointers here */ if (m_prescan_info.pagelist[old_page] != NULL) { m_prescan_info.pagelist[new_page] = xstrdup(m_prescan_info.pagelist[old_page]); } else { m_prescan_info.pagelist[new_page] = NULL; } } size_t htex_prescan_get_mismatched_anchor_num(size_t depth) { ASSERT((int)depth <= m_prescan_info.anchor_depth, "depth too large"); ASSERT(depth <= m_prescan_info.anchor_list_size, "depth too large for lookup list"); return m_prescan_info.anchor_list[m_prescan_info.anchor_depth - 1]; } /******************************* end of prescan stuff ******************************/ struct anchor_marker { int page; /* page on which marker is located */ char *filename; /* file in which the marker is located */ int y_pos; /* vertical position for marker */ int x_pos; /* horizontal position for marker */ } g_anchormarker = { -1, NULL, -1, -1 }; static XtIntervalId m_href_timeout_id = 0; struct history_info { char *anchor; /* anchor name */ char *filename; /* name of file in which this anchor is located */ int page; /* pagenumber on which anchor is located */ }; struct anchor_info { /* anchor contents as strings */ char *a_name; char *a_href; htexObjectT object_type; /* bounding box info for this anchor */ int lrx, lry; /* lower-right corner */ int ulx, uly; /* upper-left corner */ /* int refpage; /\* page in DVI file for stack of visited anchors *\/ */ /* char *filename; /\* name of file in which this anchor is located, for visited anchors *\/ */ int prev_wrapped; /* index of prev elem, for wrapped hrefs, or -1 */ int next_wrapped; /* index of next elem, for wrapped hrefs, or -1 */ }; struct htex_page_info { struct anchor_info *anchors; /* anchor info */ int tot_cnt; /* anchor info size */ int curr_cnt; /* current number of anchor on page */ int page; /* page in DVI file this anchor info refers to */ int have_wrapped; /* -1 if no wrapped anchor on beginning of page, or index of wrapped anchor */ }; /* file-scope globals ... */ /* record x and y positions of current anchor, to recognize linebreaks in anchors */ static int x_pos_bak = 0; static int y_pos_bak = 0; /* holds all anchors on current page */ static struct htex_page_info htex_page_info = { NULL, 0, 0, -1, -1 }; /* double linked list with history of clicked links, for htex_forward/htex_back */ static struct dl_list *htex_history = NULL; /* current list insertion point */ struct htex_anchor_stack_elem { htexAnchorT type; /* type of anchor (href, anchor, ...) */ int anchor_num; /* number of this anchor on page (same as curr_cnt in struct htex_page_info) */ }; /* * stack datatype and access functions; used for nested anchors */ struct htex_anchor_stack { size_t size; size_t depth; struct htex_anchor_stack_elem *types; }; struct visited_anchor { int *list; size_t list_size; }; struct visited_anchors { struct visited_anchor *anchors; size_t size; }; static struct visited_anchors visited_links = { NULL, 0 }; static struct htex_anchor_stack stack = { 0, 0, NULL }; /* the following list is from http://www.iana.org/assignments/uri-schemes re-sorted for likeliness. All protocols except for `file' are considered remote. (i.e. not accessible via the ordinary Unix file system) */ static const char *remote_URL_schemes[] = { "http:", /* Hypertext Transfer Protocol [RFC2068] */ "ftp:", /* File Transfer Protocol [RFC1738] */ "https:", /* Hypertext Transfer Protocol Secure [RFC2818] */ "mailto:", /* Electronic mail address [RFC2368] */ "news:", /* USENET news [RFC1738] */ "nntp:", /* USENET news using NNTP access [RFC1738] */ "telnet:", /* Reference to interactive sessions [RFC1738] */ "nfs:", /* network file system protocol [RFC2224] */ "gopher:", /* The Gopher Protocol [RFC1738] */ "wais:", /* Wide Area Information Servers [RFC1738] */ /* the only exception: */ /* "file:", */ /* Host-specific file names [RFC1738] */ "prospero:", /* Prospero Directory Service [RFC1738] */ "z39.50s", /* Z39.50 Session [RFC2056] */ "z39.50r", /* Z39.50 Retrieval [RFC2056] */ "cid:", /* content identifier [RFC2392] */ "mid:", /* message identifier [RFC2392] */ "vemmi:", /* versatile multimedia interface [RFC2122] */ "service:", /* service location [RFC2609] */ "imap:", /* internet message access protocol [RFC2192] */ "acap:", /* application configuration access protocol [RFC2244] */ "rtsp:", /* real time streaming protocol [RFC2326] */ "tip:", /* Transaction Internet Protocol [RFC2371] */ "pop:", /* Post Office Protocol v3 [RFC2384] */ "data:", /* data [RFC2397] */ "dav:", /* dav [RFC2518] */ "opaquelocktoken:", /* opaquelocktoken [RFC2518] */ "sip:", /* session initiation protocol [RFC2543] */ "tel:", /* telephone [RFC2806] */ "fax:", /* fax [RFC2806] */ "modem:", /* modem [RFC2806] */ "ldap:", /* Lightweight Directory Access Protocol [RFC2255] */ "soap.beep:", /* soap.beep [RFCSOAP] */ "soap.beeps:", /* soap.beeps [RFCSOAP] */ /* Reserved URI Scheme Names: */ "afs:", /* Andrew File System global file names */ "tn3270:", /* Interactive 3270 emulation sessions */ "mailserver:", /* Access to data available from mail servers */ NULL }; /* prototypes */ static void htex_erase_anchormarker(XtPointer client_data, XtIntervalId *id); static void htex_draw_anchormarker(int y); static void resize_info_if_needed(struct htex_page_info *info) { /* resize info if needed */ if (info->curr_cnt + 2 >= info->tot_cnt) { int i; while (info->curr_cnt + 2 >= info->tot_cnt) { info->tot_cnt += HTEX_ALLOC_STEP; } info->anchors = XREALLOC(info->anchors, info->tot_cnt * sizeof *(info->anchors)); for (i = info->curr_cnt; i < info->tot_cnt; i++) { /* fprintf(stderr, "initializing info at index %d\n", i); */ info->anchors[i].a_href = NULL; info->anchors[i].a_name = NULL; /* info->anchors[i].filename = NULL; */ info->anchors[i].ulx = INT_MAX; info->anchors[i].uly = INT_MAX; info->anchors[i].lrx = 0; info->anchors[i].lry = 0; info->anchors[i].object_type = HTEX_TEXT; info->anchors[i].prev_wrapped = -1; info->anchors[i].next_wrapped = -1; } } } static void init_visited_links(struct visited_anchors *links, int total_pages, Boolean new_dvi_file) { size_t i, old_size = links->size; if (new_dvi_file) { /* free old list */ for (i = 0; i < old_size; i++) { FREE(links->anchors[i].list); links->anchors[i].list = NULL; links->anchors[i].list_size = 0; } } if (links->size <= (size_t)total_pages) { MYTRACE((stderr, "resetting visited links (%d != %d)", links->size, total_pages)); links->size = total_pages + 1; links->anchors = XREALLOC(links->anchors, (links->size + 1) * sizeof *(links->anchors)); for (i = old_size; i < links->size; i++) { MYTRACE((stderr, "+++ initializing visited links for page %d", i)); links->anchors[i].list = NULL; links->anchors[i].list_size = 0; } } } #if 0 static void show_visited(struct visited_anchors *links, int pageno) { size_t i; fprintf(stderr, "visited links on page %d:\n", pageno); for (i = 0; i < links->anchors[pageno].list_size; i++) { fprintf(stderr, "%d ", links->anchors[pageno].list[i]); } fprintf(stderr, "\n"); } #endif static void save_in_list(struct visited_anchors *links, int pageno, int idx) { links->anchors[pageno].list = XREALLOC(links->anchors[pageno].list, (links->anchors[pageno].list_size + 1) * sizeof *(links->anchors[pageno].list)); links->anchors[pageno].list[links->anchors[pageno].list_size] = idx; links->anchors[pageno].list_size++; } static void set_visited(struct visited_anchors *links, int pageno, int anchor_num) { int i; /* is it already present? */ for (i = 0; i < (int)links->anchors[pageno].list_size; i++) { if (links->anchors[pageno].list[i] == anchor_num) return; } save_in_list(links, pageno, anchor_num); i = anchor_num; /* also set previous/next of this anchor to visited */ while ((i = htex_page_info.anchors[i].prev_wrapped) != -1) { TRACE_HTEX((stderr, "set_visited: setting prev_wrapped %d to visited too", i)); save_in_list(links, pageno, i); } i = anchor_num; while ((i = htex_page_info.anchors[i].next_wrapped) != -1) { TRACE_HTEX((stderr, "set_visited: setting next_wrapped %d to visited too", i)); save_in_list(links, pageno, i); } #if 0 show_visited(links, pageno); #endif } static Boolean is_visited(struct visited_anchors *links, int pageno, int anchor_num) { size_t i; ASSERT((size_t)pageno < links->size, "too few elements in links structure"); for (i = 0; i < links->anchors[pageno].list_size; i++) { if (links->anchors[pageno].list[i] == anchor_num) { return True; } } return False; } static void push_stack(struct htex_anchor_stack *stack, htexAnchorT type, int anchor_num) { size_t i = 0; if (stack->depth >= stack->size) { stack->size += HTEX_ALLOC_STEP; stack->types = XREALLOC(stack->types, stack->size * sizeof *(stack->types)); for (i = stack->depth; i < stack->size; i++) { stack->types[i].type = A_NONE; stack->types[i].anchor_num = -1; } } stack->types[stack->depth].type = type; stack->types[stack->depth].anchor_num = anchor_num; stack->depth++; #if 0 { fprintf(stderr, "PUSH - stack is now: \n"); for (i = 0; i < stack->depth; i++) fprintf(stderr, "%d:%d ", i, stack->types[i]); MYTRACE(stderr, "\n"); } #endif } static htexAnchorT pop_stack(struct htex_anchor_stack *stack, int *anchor_num) { htexAnchorT ret; if (stack->depth < 1) { return A_MISMATCH; } #if 0 { int i; MYTRACE((stderr, "POP - stack is now: ")); for (i = 0; i < stack->depth; i++) MYTRACE((stderr, "%d:%d ", i, stack->types[i])); MYTRACE((stderr, "")); } #endif stack->depth--; ret = stack->types[stack->depth].type; *anchor_num = stack->types[stack->depth].anchor_num; stack->types[stack->depth].type = A_NONE; stack->types[stack->depth].anchor_num = -1; return ret; } /* return True if stack contains an A_HREF, False else */ static Boolean get_href_depth(const struct htex_anchor_stack *stack) { size_t i; for (i = 0; i <= stack->depth; i++) { ASSERT(stack->types != NULL, "types musn't be NULL!"); if (htex_is_href(stack->types[i].type)) return True; } return False; } static htexAnchorT peek_stack(struct htex_anchor_stack *stack, int *anchor_num) { if (stack->depth < 1) { MYTRACE((stderr, "Xdvi warning: wrong nesting of anchors on page %d", current_page)); *anchor_num = -1; return A_NONE; } *anchor_num = stack->types[stack->depth - 1].anchor_num; return stack->types[stack->depth - 1].type; } /* routines for coloring the anchors */ static void push_colorspecial(void) { int i; i = htex_page_info.curr_cnt - 1; /* apply color if needed */ if (resource.link_style > 1) { /* colored links are wanted */ Boolean visited = False; ASSERT(i >= 0, "i mustn't be negative"); if (is_visited(&visited_links, current_page, i)) {/* || wrapped_anchor_is_visited(i)) { */ visited = True; } MYTRACE((stderr, "anchor %d, %s is %s\n", htex_page_info.curr_cnt - 1, htex_page_info.anchors[htex_page_info.curr_cnt - 1].a_href, visited ? "******* visited ****** " : "not visited")); if ((visited && resource.visited_link_color != NULL) || (! visited && resource.link_color != NULL)) { color_special(visited ? g_visited_link_color_rgb : g_link_color_rgb); } } } static void pop_colorspecial(void) { color_special("pop"); } /* return filename if it's a local file, NULL else */ const char * is_local_file(const char *filename) { int i; if (strchr(filename, ':') != NULL) { if (memicmp(filename, "file:", strlen("file:")) == 0) { TRACE_HTEX((stderr, "%s uses file scheme", filename)); filename += strlen("file:"); /* skip over `//localhost' part, and skip first `/' iff the absolute path starts with `//' (as required by RFC2396, but in the past most browsers/applications didn't support this). */ if (memicmp(filename, "//localhost", strlen("//localhost")) == 0) { filename += strlen("//localhost"); } if (memicmp(filename, "//", 2) == 0) { filename += 1; } return filename; } /* check remote schemes */ for (i = 0; remote_URL_schemes[i] != NULL; i++) { if (memicmp(filename, remote_URL_schemes[i], strlen(remote_URL_schemes[i])) == 0) { TRACE_HTEX((stderr, "%s is a remote scheme", filename)); return NULL; } } } /* in all other cases, treat it as an ordinary filename */ TRACE_HTEX((stderr, "%s is an ordinary filename", filename)); return filename; } static char * parse_anchortext(const char *input, int len) { char *anchor = NULL; const char *beg, *end; parse_html_special(input, len, &beg, &end); anchor = XMALLOC(anchor, end - beg + 1); memcpy(anchor, beg, end - beg); anchor[end - beg] = '\0'; return anchor; } static void add_anchor(struct htex_page_info *info, htexAnchorT type, const char *str, size_t len, int pageno, char *filename) { UNUSED(pageno); UNUSED(filename); resize_info_if_needed(info); ASSERT(htex_is_name(type) || htex_is_href(type), "This doesn't look like a valid anchor"); /* add an anchor or a href, depending on `type' */ if (type == A_HREF) { if (info->anchors[info->curr_cnt].a_href == NULL) { info->anchors[info->curr_cnt].a_href = parse_anchortext(str, len); } TRACE_HTEX((stderr, "adding HREF %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_href)); } else if (type == A_HREF_URL) { if (info->anchors[info->curr_cnt].a_href == NULL) { info->anchors[info->curr_cnt].a_href = xmalloc(len + 1); strncpy(info->anchors[info->curr_cnt].a_href, str, len); info->anchors[info->curr_cnt].a_href[len] = '\0'; } TRACE_HTEX((stderr, "adding HREF_URL %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_href)); } else if (type == A_HDVIPS_INTERNAL) { if (info->anchors[info->curr_cnt].a_href == NULL) { /* dynamically add a `#' prefix */ if (str[0] != '#') { info->anchors[info->curr_cnt].a_href = xmalloc(len + 2); strcpy(info->anchors[info->curr_cnt].a_href, "#"); strncat(info->anchors[info->curr_cnt].a_href, str, len); info->anchors[info->curr_cnt].a_href[len + 1] = '\0'; } else { info->anchors[info->curr_cnt].a_href = xmalloc(len + 1); strncpy(info->anchors[info->curr_cnt].a_href, str, len); info->anchors[info->curr_cnt].a_href[len] = '\0'; } } TRACE_HTEX((stderr, "adding HREF_URL %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_href)); } else if (type == A_HREF_FILE) { if (info->anchors[info->curr_cnt].a_href == NULL) { /* dynamically add a `file:' extension */ if (memcmp(str, "file:", strlen("file:")) == 0) { info->anchors[info->curr_cnt].a_href = xmalloc(len + 1); strncpy(info->anchors[info->curr_cnt].a_href, str, len); info->anchors[info->curr_cnt].a_href[len] = '\0'; } else { info->anchors[info->curr_cnt].a_href = xmalloc(len + strlen("file:") + 1); strcpy(info->anchors[info->curr_cnt].a_href, "file:"); strncat(info->anchors[info->curr_cnt].a_href, str, len); info->anchors[info->curr_cnt].a_href[len + strlen("file:")] = '\0'; } } TRACE_HTEX((stderr, "adding HREF_FILE %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_href)); } else if (type == A_NAME) { if (info->anchors[info->curr_cnt].a_name == NULL) { info->anchors[info->curr_cnt].a_name = parse_anchortext(str, len); } TRACE_HTEX((stderr, "adding NAME %d: %s", info->curr_cnt, info->anchors[info->curr_cnt].a_name)); } else if (type == A_HDVIPS_HREF) { if (info->anchors[info->curr_cnt].a_href == NULL) { info->anchors[info->curr_cnt].a_href = xmalloc(len + 1); strncpy(info->anchors[info->curr_cnt].a_href, str, len); info->anchors[info->curr_cnt].a_href[len] = '\0'; } TRACE_HTEX((stderr, "adding HDVIPS_HREF %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_name)); } else if (type == A_HDVIPS_NAME) { if (info->anchors[info->curr_cnt].a_name == NULL) { info->anchors[info->curr_cnt].a_name = xmalloc(len + 1); strncpy(info->anchors[info->curr_cnt].a_name, str, len); info->anchors[info->curr_cnt].a_name[len] = '\0'; } TRACE_HTEX((stderr, "adding HDVIPS_NAME %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_name)); } } static void set_anchor_size(struct htex_page_info *info, int index, int ulx, int uly, int lrx, int lry) { struct anchor_info *anchor; ASSERT(info->anchors != NULL, "info->anchors should have been allocated before"); ASSERT(index < info->curr_cnt, "info too small"); anchor = &(info->anchors[index]); anchor->ulx = ulx; anchor->uly = uly; anchor->lrx = lrx; anchor->lry = lry; } void htex_set_objecttype(htexObjectT type) { htex_page_info.anchors[htex_page_info.curr_cnt - 1].object_type = type; } void htex_set_anchorsize(int ulx, int uly, int lrx, int lry) { set_anchor_size(&htex_page_info, htex_page_info.curr_cnt - 1, ulx, uly, lrx, lry); } static void enlarge_anchor_size(struct htex_page_info *info, int index, int ulx, int uly, int lrx, int lry) { struct anchor_info *anchor; ASSERT(info->anchors != NULL, "info->anchors should have been allocated before"); ASSERT(index < info->curr_cnt, "info too small"); /* fprintf(stderr, "enlarging anchor at index %d; %s\n", index, info->anchors[index].a_href); */ anchor = &(info->anchors[index]); if (ulx < anchor->ulx) { anchor->ulx = ulx; } if (uly < anchor->uly) { anchor->uly = uly; } if (lrx > anchor->lrx) { anchor->lrx = lrx; } /* set lry only for first character, since this will be used to position underline */ /* if (lry > anchor->lry && anchor->lry == 0) { */ if (lry > anchor->lry) { anchor->lry = lry; } } static void reset_page_info(struct htex_page_info *info, int pageno, Boolean force_init) { int i, dummy; if (force_init || pageno != info->page) { #if 0 fprintf(stderr, "%d or %d != %d: resetting anchorinfo for page %d (%d anchors)\n", force_init, pageno, info->page, current_page, info->curr_cnt); #endif ASSERT(info->curr_cnt == 0 || info->anchors != NULL, "inconsistency in info structure"); /* re-initialize all values */ for (i = 0; i < info->curr_cnt; i++) { TRACE_HTEX((stderr, "----- resetting info for anchor %d", i)); FREE(info->anchors[i].a_name); FREE(info->anchors[i].a_href); info->anchors[i].a_name = NULL; info->anchors[i].a_href = NULL; info->anchors[i].ulx = INT_MAX; info->anchors[i].uly = INT_MAX; info->anchors[i].lrx = 0; info->anchors[i].lry = 0; info->anchors[i].object_type = HTEX_TEXT; info->anchors[i].prev_wrapped = -1; info->anchors[i].next_wrapped = -1; } } if (pageno != info->page) { /* reset info */ free(info->anchors); info->anchors = NULL; info->tot_cnt = 0; } TRACE_HTEX((stderr, "---------------- setting curr_cnt to 0, and emptying stack")); info->page = pageno; info->curr_cnt = 0; info->have_wrapped = -1; while (stack.depth > 0) pop_stack(&stack, &dummy); } /* * htex_initpage does what's neccessary at the beginning of a page: * - re-initialize geometry info if file or page size has changed (according to size_changed), * - re-initialize visited links info if file has changed (according to new_dvi_file), * - take care of mismatched anchors at the beginning of the page. */ void htex_initpage(Boolean new_dvi_file, Boolean size_changed, int pageno) { reset_page_info(&htex_page_info, pageno, size_changed | new_dvi_file); init_visited_links(&visited_links, total_pages, new_dvi_file); #if 0 show_visited(&visited_links, pageno); #endif if (pageno > 0 && (int)m_prescan_info.pagelist_len > pageno /* pagelist_len will be 0 for file with no hyperlinks */ && m_prescan_info.pagelist[pageno - 1] != NULL) { add_anchor(&htex_page_info, A_HREF, m_prescan_info.pagelist[pageno - 1], strlen(m_prescan_info.pagelist[pageno - 1]), pageno, NULL); htex_page_info.curr_cnt++; MYTRACE((stderr, "++++++++++ mismatched anchor text (at %d): |%s|", htex_page_info.curr_cnt - 1, m_prescan_info.pagelist[pageno - 1])); /* x_pos_bak = y_pos_bak = INT_MAX; */ x_pos_bak = y_pos_bak = INT_MAX; set_anchor_size(&htex_page_info, htex_page_info.curr_cnt - 1, 0, 0, 1, 1); htex_page_info.have_wrapped = htex_page_info.curr_cnt - 1; if (bg_current != NULL) { /* only if it has been initialized by redraw_page in events.c */ push_colorspecial(); } /* else { */ /* fprintf(stderr, "----------------------- NOT pushing color, waiting ...\n"); */ /* } */ push_stack(&stack, A_HREF, htex_page_info.curr_cnt - 1); } } /* Returns a PostScript literal text string inside parentheses. The scanner works according to "PostScript language reference, third edition" - Sec. 3.2.2. The specification is implemented completely: balanced parentheses and all escape sequences are considered. The argument STR is expected to be a pointer to the first character after the opening parenthesis. The function returns NULL if the text string is malformed. Otherwise the return value points to an allocated string which should be freed by the calling function. */ static char * scan_ps_literal_text_string(const char *str) { const char *s; char *cp, *c; int count = 1; /* Search end of string by considering balanced parentheses. */ for (s = str; *s; s++) if (*s == '\\' && *(s+1)) s++; else if (*s == '(') count++; else if (*s == ')') if (! --count) break; if (!*s) return NULL; if ((cp = malloc((s - str + 1) * sizeof(*cp))) == NULL) { XDVI_ERROR((stderr, "Not enough memory")); return NULL; } /* copy string while translating escape sequences */ for (c = cp; str < s; str++) { if (*str == '\\') { switch (*++str) { case 'n': *c++ = '\n'; break; case 'r': *c++ = '\r'; break; case 't': *c++ = '\t'; break; case 'b': *c++ = '\b'; break; case 'f': *c++ = '\f'; break; case '\n': break; case '\r': if (*(str + 1) == '\n') str++; break; default: if (isdigit(*str)) { char number[] = "xxx"; char *end; strncpy(number, str, 3); *c++ = strtoul(number, &end, 8); str += end - number - 1; } else { *c++ = *str; /* ignore \ if followed by another char, including ( and ) and \ */ } } } else { *c++ = *str; } } *c = '\0'; return cp; } static void hdvips_add_anchor(struct htex_page_info *info, htexAnchorT type, const char *str) { char *ptr; if ((ptr = scan_ps_literal_text_string(str)) != NULL) { int curr_cnt_bak = info->curr_cnt; /* overwrite previously created dummy/wrapped anchors */ ASSERT(info->curr_cnt > 0, "hdvips_add_anchor must be called after add_anchor()!"); while (info->curr_cnt > 0 && info->anchors[info->curr_cnt - 1].a_href != NULL && (strcmp(info->anchors[info->curr_cnt - 1].a_href, "__WRAPPED__") == 0 || strcmp(info->anchors[info->curr_cnt - 1].a_href, "__DUMMY__") == 0)) { info->curr_cnt--; free(info->anchors[info->curr_cnt].a_href); free(info->anchors[info->curr_cnt].a_name); info->anchors[info->curr_cnt].a_href = info->anchors[info->curr_cnt].a_name = NULL; add_anchor(info, type, ptr, strlen(ptr), 0, NULL); } info->curr_cnt = curr_cnt_bak; free(ptr); } else { MYTRACE((stderr, "Xdvi warning: skipping malformed hdvips link `%s'", str)); } } /* * htex_reset_page: invoked when drawing was interrupted, * assumes that htex_page_info is in an inconsistent state and resets it. */ void htex_reset_page(int pageno) { reset_page_info(&htex_page_info, pageno, True); } /* returns True iff inside a href tag */ Boolean htex_scan_anchor(const char *cp, size_t len) { char *ptr; if (memicmp(cp, "", 4) == 0) { /* end tag */ /* struct anchor_info *anchor; */ int num; htexAnchorT type = pop_stack(&stack, &num); if (type == A_MISMATCH) return False; /* ASSERT(htex_page_info.curr_cnt - 1 >= 0, "Index out of range"); */ /* anchor = &(htex_page_info.anchors[htex_page_info.curr_cnt - 1]); */ /* reset color if needed */ if (resource.link_style > 1 && resource.link_color != NULL && htex_is_href(type)) pop_colorspecial(); } else if (memicmp(cp, " 1 && resource.link_color != NULL) pop_colorspecial(); return False; } /* add anchor texts for hdvips links */ else if (memcmp(cp, "/A", 2) == 0) { /* possibly an hdvips external link */ /* fprintf(stderr, "+++++ EXT: |%s|\n", cp); */ if ((ptr = strstr(cp + 2, "/GoToR")) != NULL /* external file */ && (ptr = strchr(ptr, '(')) != NULL) { hdvips_add_anchor(&htex_page_info, A_HREF_FILE, ptr + 1); } else if ((ptr = strstr(cp + 2, "/URI")) != NULL /* URL */ && (ptr = strchr(ptr, '(')) != NULL) { hdvips_add_anchor(&htex_page_info, A_HREF_URL, ptr + 1); } return False; } else if (memcmp(cp, "/L", 2) == 0) { /* possibly an hdvips internal link */ if ((ptr = strstr(cp + 2, "/Dest")) != NULL && (ptr = strchr(ptr, '(')) != NULL) { hdvips_add_anchor(&htex_page_info, A_HDVIPS_INTERNAL, ptr + 1); } return False; } else if (memcmp(cp, "/V", 2) == 0) { /* possibly an hdvips anchor */ if ((ptr = strstr(cp + 2, "/Dest")) != NULL && (ptr = strchr(ptr, '(')) != NULL) { hdvips_add_anchor(&htex_page_info, A_HDVIPS_NAME, ptr + 1); } return False; } else { /* unrecognized tag */ if (globals.warn_spec_now) { XDVI_WARNING((stderr, "Ignoring unknown hyperref special `%s'", cp)); } return False; } return get_href_depth(&stack); } void htex_record_position(int ulx, int uly, int w, int h) { int lrx, lry; int y_delta, x_delta; if (!INSIDE_MANE_WIN) /* this would give wrong values */ return; lrx = ulx + w; lry = uly + h; y_delta = lry - uly; x_delta = lrx - ulx; /* heuristics for creating new bounding box at what might be linebreaks */ if (lrx < x_pos_bak /* ordinary linebreak */ || lry + y_delta < y_pos_bak) { /* column break (from bottom of 1st to top 2nd column) */ htexAnchorT type; int idx, prev, curr; /* get anchor index of topmost stack item, to find the matching open tag */ if ((type = peek_stack(&stack, &idx)) == A_NONE) { /* fprintf(stderr, "!!!!!!!!!!!! couldn't find opening tag for this wrapped link!"); */ return; } ASSERT(idx >= 0, "Index out of range"); /* fprintf(stderr, "wrapped link: index %d, type %d\n", idx, type); */ /* get correct idx */ if (m_href_type == HYPERTEX_LINK) { while (htex_page_info.anchors[idx].a_href == NULL && idx > 0) { idx--; } if (htex_page_info.anchors[idx].a_href == NULL && idx == 0) { XDVI_ERROR((stderr, "Couldn't find wrapped anchor for idx %d, page %d!", idx, current_page)); return; } add_anchor(&htex_page_info, A_HREF, htex_page_info.anchors[idx].a_href, strlen(htex_page_info.anchors[idx].a_href), 0, NULL); } else { add_anchor(&htex_page_info, A_HREF, "__WRAPPED__", strlen("__WRAPPED__"), 0, NULL); } htex_page_info.curr_cnt++; /* add wrapping info */ if (htex_page_info.have_wrapped >= 0) { /* this is the only case where some other material might have come between this and the previous anchor */ prev = htex_page_info.have_wrapped; htex_page_info.have_wrapped = -1; } else { prev = htex_page_info.curr_cnt - 2; } curr = htex_page_info.curr_cnt - 1; ASSERT(prev >= 0, "Index out of range"); /* fprintf(stderr, "setting prev to %d, curr to %d\n", prev, curr); */ htex_page_info.anchors[prev].next_wrapped = curr; htex_page_info.anchors[curr].prev_wrapped = prev; /* initialize it to cover current character */ set_anchor_size(&htex_page_info, htex_page_info.curr_cnt - 1, ulx, uly, lrx, lry); } else { int prev_idx = htex_page_info.curr_cnt - 1; if (prev_idx >= 0) { enlarge_anchor_size(&htex_page_info, prev_idx, ulx, uly, lrx, lry); } else { MYTRACE((stderr, "!!!!!!!!!!!! Bug? prev_idx < 0")); } } x_pos_bak = lrx; y_pos_bak = uly; } #if 0 static void show_history(void) { struct dl_list *ptr = htex_history; struct history_info *info = ptr->item; int i; fprintf(stderr, "**************** history: %s, %d, %s\n", info->filename, info->page, info->anchor); for (; ptr->prev != NULL; ptr = ptr->prev) { ; } for (i = 0; ptr != NULL; ptr = ptr->next, i++) { info = ptr->item; fprintf(stderr, "elem %d: %s, %d, %s\n", i, info->filename, info->page, info->anchor); MYTRACE((stderr, "elem: %p, prev: %p, next: %p", (void *)ptr, (void *)ptr->prev, (void *)ptr->next)); } } #endif /* check for names like foo/bar.dvi#link, return copy of link truncated at the `#' if found (NULL else), and save `link' into resource.anchor_pos for later use. */ static char * check_relative_name(const char *link) { char *ptr; TRACE_HTEX((stderr, "check_relative_name: |%s|", link)); if ((ptr = strchr(link, '#')) != NULL && ptr > link + 4 && (memicmp(ptr - 4, ".dvi", 4) == 0)) { char *new_link = xstrdup(link); new_link[ptr - link] = '\0'; /* truncate the copy */ free(g_anchor_pos); g_anchor_pos = xstrdup(ptr + 1); g_anchor_len = strlen(g_anchor_pos); return new_link; } else { /* reset g_anchor_pos */ free(g_anchor_pos); g_anchor_pos = NULL; } return NULL; } static void htex_update_toolbar_navigation(void) { #if 0 show_history(); #endif #if defined(MOTIF) && HAVE_XPM tb_set_htex_back_sensitivity(htex_history->prev != NULL); tb_set_htex_forward_sensitivity(htex_history->next != NULL); #endif } void htex_back(void) { struct history_info *info; if (htex_history == NULL) { xdvi_bell(); statusline_info(STATUS_SHORT, "Hyperref history is empty"); return; } info = htex_history->item; if (htex_history->prev == NULL) { xdvi_bell(); /* statusline_info(STATUS_SHORT, "At begin of history"); */ htex_update_toolbar_navigation(); return; } if (strcmp(info->filename, globals.dvi_name) != 0) { /* new filename different */ Boolean tried_dvi_ext = False; char *new_dvi_name = NULL; if ((new_dvi_name = open_dvi_file_wrapper(info->filename, False, False, &tried_dvi_ext, False)) == NULL) { statusline_error(STATUS_MEDIUM, "Re-opening file \"%s\" failed!\n", info->filename); return; } else { set_dvi_name(new_dvi_name); globals.ev.flags |= EV_NEWDOC; globals.ev.flags |= EV_PAGEHIST_INSERT; /* statusline_info(STATUS_MEDIUM, "Back to file: \"%s\"", globals.dvi_name); */ } } else { page_history_insert(info->page); } goto_page(info->page, resource.keep_flag ? NULL : home, False); MYTRACE((stderr, "curr page now: %d", current_page)); htex_history = htex_history->prev; info = htex_history->item; #if 0 MYTRACE((stderr, "------ before skipping: %d, %s", info->page, info->anchor)); show_history(); while (info->page == current_page && htex_history->prev != NULL) { /* skip identical locations */ MYTRACE((stderr, "+++++++ skipping identical page %d, %s", current_page, info->anchor)); htex_history = htex_history->prev; info = htex_history->item; } MYTRACE((stderr, "------ after skipping: %d, %s", info->page, info->anchor)); #endif htex_update_toolbar_navigation(); } void htex_forward(void) { struct history_info *info; char *link; if (htex_history == NULL) { xdvi_bell(); statusline_info(STATUS_SHORT, "Hyperref history is empty"); return; } if (htex_history->next == NULL) { xdvi_bell(); /* statusline_info(STATUS_SHORT, "At end of history"); */ return; } htex_history = htex_history->next; info = htex_history->item; link = info->anchor; /* go there */ if (*link == '#') { /* it's a relative link */ MYTRACE((stderr, "XXXXXXXX %s:%d: setting anchor to |%s|+1", __FILE__, __LINE__, info->anchor)); free(g_anchor_pos); g_anchor_pos = xstrdup(info->anchor + 1); g_anchor_len = strlen(g_anchor_pos); globals.ev.flags |= EV_ANCHOR; } else { /* it's an absolute link */ char *new_linkname = NULL; char *new_dvi_name = NULL; Boolean tried_dvi_ext = False; if ((new_linkname = check_relative_name(link)) != NULL) link = new_linkname; if ((new_dvi_name = open_dvi_file_wrapper(link, False, False, &tried_dvi_ext, False)) == NULL) { statusline_error(STATUS_MEDIUM, "Re-opening file \"%s\" failed!\n", info->filename); free(new_linkname); return; } else { set_dvi_name(new_dvi_name); globals.ev.flags |= EV_NEWDOC; goto_page(0, resource.keep_flag ? NULL : home, False); globals.ev.flags |= EV_PAGEHIST_INSERT; if (g_anchor_pos != NULL) globals.ev.flags |= EV_ANCHOR; /* statusline_info(STATUS_MEDIUM, "Loaded file: \"%s\"", globals.dvi_name); */ free(new_linkname); } } htex_update_toolbar_navigation(); } /* save this anchor in jump_history, current location in goback_history, and update Motif toolbar icons */ static void history_save_anchor(const char *anchor, int current_page, const char *dvi_name) { struct history_info *item; if (htex_history == NULL) { /* Insert dummy start elem. We need this to prevent dropping off from the begin of the list, since otherwise a 1-elem list couldn't encode the information whether we can still go back. This way it will point to the dummy elem when there's no way to go back. */ struct history_info *start_marker = XMALLOC(start_marker, sizeof *start_marker); start_marker->anchor = NULL; start_marker->filename = NULL; start_marker->page = -1; htex_history = dl_list_insert(htex_history, start_marker); } item = XMALLOC(item, sizeof *item); item->anchor = xstrdup(anchor); item->filename = xstrdup(dvi_name); item->page = current_page; htex_history = dl_list_truncate(dl_list_insert(htex_history, item)); #if 0 MYTRACE((stderr, "==================== after inserting ")); show_history(); #endif htex_update_toolbar_navigation(); } /* * Return anchor string at coordinates x, y, and anchor count in 3rd argument, * or NULL if there's no anchor at these coordinates. */ static char * get_anchor_at_index(int x, int y, int *count) { int i; for (i = 0; i < htex_page_info.curr_cnt; i++) { struct anchor_info anchor = htex_page_info.anchors[i]; /* fprintf(stderr, "getting anchor at index %d; %s\n", i, anchor.a_href); */ if (anchor.a_href == NULL) { continue; } if (anchor.lry + 2 > y && anchor.uly - 1 < y /* allow some vertical fuzz */ && anchor.lrx > x && anchor.ulx < x) { *count = i; return anchor.a_href; } } *count = -1; return NULL; } /* generate exposure events for anchor at index idx, and all anchors wrapping to/from it, so that they will be redrawn in `visited' color */ static void redraw_anchors(int idx) { struct anchor_info anchor = htex_page_info.anchors[idx]; int other; int i = idx; #define DO_EXPOSE(lx,ly,rx,ry) (clearexpose(&mane, lx - 20, ly - 3, rx - lx + 26, ry - ly + 6)) /* HACK ALERT: This is a workaround for a coloring problem with wrapped anchors (see regression/href/002/url-wrap-test2.dvi): We can't change the color on-the-fly for a wrapped anchor, since the special is pushed only at the opening tag. So for wrapped anchors, the visited colour wouldn't be set correctly. Redrawing the entire page ensures this (but it's ugly). Currently this hack overrides the algorithm below for all anchors that have a `prev_wrapped' pointer. */ if (htex_page_info.anchors[i].prev_wrapped != -1) { globals.ev.flags |= EV_NEWPAGE; XSync(DISP, False); return; } DO_EXPOSE(anchor.ulx, anchor.uly, anchor.lrx, anchor.lry); /* previous parts of wrapped anchors: */ for (i = idx; i >= 0 && (other = htex_page_info.anchors[i].prev_wrapped) != -1; i--) { DO_EXPOSE(htex_page_info.anchors[other].ulx, htex_page_info.anchors[other].uly, htex_page_info.anchors[other].lrx, htex_page_info.anchors[other].lry); } /* later parts of wrapped anchors: */ for (i = idx; i < htex_page_info.curr_cnt && (other = htex_page_info.anchors[i].next_wrapped) != -1; i++) { DO_EXPOSE(htex_page_info.anchors[other].ulx, htex_page_info.anchors[other].uly, htex_page_info.anchors[other].lrx, htex_page_info.anchors[other].lry); } #undef DO_EXPOSE } /* * Invoked when clicking on a link. * newwindow == True means open new window, * newwindow == False means jump to link in current window. * With newwindow == True, don't update the toolbar navigation icons, since there's nothing to go back. */ Boolean htex_handleref(int x, int y, Boolean newwindow) { char *link; int link_num; /* fprintf(stderr, "---------- htex_handleref!\n"); */ if (!(globals.cursor.flags & CURSOR_LINK)) /* When no link cursor is shown, clicking shouldn't jump to link */ return False; if ((link = get_anchor_at_index(x, y, &link_num)) != NULL) { set_visited(&visited_links, current_page, link_num); if (*link == '#') { /* it's a relative link */ if (newwindow) { launch_xdvi(globals.dvi_name, link + 1); redraw_anchors(link_num); return True; } else { history_save_anchor(link, current_page, globals.dvi_name); free(g_anchor_pos); g_anchor_pos = xstrdup(link + 1); g_anchor_len = strlen(g_anchor_pos); globals.ev.flags |= EV_ANCHOR; redraw_anchors(link_num); return True; } } else { /* it's an absolute link */ char *new_dvi_name = NULL; int pageno_bak = current_page; char *new_linkname = NULL; char *orig_link = link; Boolean tried_dvi_ext = False; MYTRACE((stderr, "OLD FILE: |%s|", globals.dvi_name)); if ((new_linkname = check_relative_name(link)) != NULL) link = new_linkname; if ((new_dvi_name = open_dvi_file_wrapper(link, False, newwindow, &tried_dvi_ext, False)) != NULL) { /* only save link in history if opening succeeds */ history_save_anchor(orig_link, pageno_bak, globals.dvi_name); set_dvi_name(new_dvi_name); if (!newwindow) { globals.ev.flags |= EV_NEWDOC; goto_page(0, resource.keep_flag ? NULL : home, False); globals.ev.flags |= EV_PAGEHIST_INSERT; MYTRACE((stderr, "NEW FILE: |%s|", globals.dvi_name)); if (g_anchor_pos != NULL) globals.ev.flags |= EV_ANCHOR; /* statusline_info(STATUS_MEDIUM, "Loaded file: \"%s\"", dvi_name); */ } else { redraw_anchors(link_num); } } free(new_linkname); redraw_anchors(link_num); return True; } } return False; } /* change cursor and display anchor text in statusline */ void htex_displayanchor(int x, int y) { static int id_bak = -1; static int pageno_bak = -1; int id_curr; char *anchor_text; anchor_text = get_anchor_at_index(x, y, &id_curr); if (anchor_text != NULL) { /* found an anchor */ if (!(globals.cursor.flags & CURSOR_LINK) && !(globals.cursor.flags & CURSOR_TEXT)) { globals.cursor.flags |= CURSOR_LINK; globals.ev.flags |= EV_CURSOR; } /* to prevent flicker, print only when it differs from previous one, i.e. when it either has a different ID or is on a different page: */ if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0 && (id_curr != id_bak || current_page != pageno_bak)) { statusline_info(STATUS_FOREVER, "%s", anchor_text); id_bak = id_curr; pageno_bak = current_page; } } else { /* not over anchor text, reset cursor and statusline */ if (globals.cursor.flags & CURSOR_LINK) { globals.cursor.flags &= ~CURSOR_LINK; globals.ev.flags |= EV_CURSOR; } if (id_bak != -1 && (resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0) { statusline_clear(); id_bak = -1; } } } /* * Invoked from all commands that change the shrink factor; * forces re-computation of the anchor markers. */ void htex_resize_page(void) { htex_initpage(False, True, current_page); } /* * Invoked from all commands that reread the DVI file; * resets all link infos. * Note: visited_links and anchor stack data * are preserved across multiple files, so we don't need to free() them. */ void htex_reinit(void) { htex_prescan_reset(); htex_initpage(True, True, current_page); } /* Underline/highlight anchors if the appropriate resource is set. Since this is done after the entire page is parsed, we can't use the checks for fg_current and do_color_change(), but need to use a separate GC instead. */ void htex_draw_anchormarkers(void) { int i; int rule_height = (globals.page.h / 1000.0); XRectangle rect = { -1, -1, 0, 0 }; if (rule_height == 0) rule_height = 1; if (current_page == g_anchormarker.page && strcmp(globals.dvi_name, g_anchormarker.filename) == 0 && g_anchormarker.y_pos > 0) { htex_draw_anchormarker(g_anchormarker.y_pos); } if (resource.link_style == 0 || resource.link_style == 2) return; for (i = 0; i < htex_page_info.curr_cnt; i++) { struct anchor_info anchor = htex_page_info.anchors[i]; if (anchor.a_href != NULL) { int offset; Boolean visited = False; #if 0 XDrawRectangle(DISP, mane.win, globals.gc.high, anchor.ulx, anchor.uly, anchor.lrx - anchor.ulx, anchor.lry - anchor.uly); #endif if (is_visited(&visited_links, current_page, i)) {/* || wrapped_anchor_is_visited(i)) { */ visited = True; } offset = ANCHOR_XTRA_V_BBOX / (double)currwin.shrinkfactor + 0.5; TRACE_HTEX((stderr, "UNDERLINE: %d, %s is %s", i, anchor.a_href, visited ? "******* visited ****** " : "not visited")); anchor.ulx -= currwin.base_x; anchor.lrx -= currwin.base_x; anchor.lry -= currwin.base_y; anchor.uly -= currwin.base_y; /* BUG ALERT: Don't use put_rule here, since this will cause a segfault * with the new color code when switching density (#616920)! */ MYTRACE((stderr, "UNDERLINE: checking if %d is visited: %d!", i, visited)); /* if (clip_region_to_rect(&rect)) { */ if (anchor.object_type == HTEX_IMG) { rect.x = anchor.ulx - 1; rect.y = anchor.uly - 1; rect.width = anchor.lrx - anchor.ulx + 2; rect.height = anchor.lry - anchor.uly + 2; if (clip_region_to_rect(&rect)) { XDrawRectangle(DISP, mane.win, visited ? globals.gc.visited_linkcolor : globals.gc.linkcolor, rect.x, rect.y, rect.width, rect.height); } } else { rect.x = anchor.ulx - 1; rect.y = anchor.lry + offset; rect.width = anchor.lrx - anchor.ulx + 2; rect.height = rule_height; if (clip_region_to_rect(&rect)) { XFillRectangle(DISP, mane.win, visited ? globals.gc.visited_linkcolor : globals.gc.linkcolor, rect.x, rect.y, rect.width, rect.height); } } } } } void launch_xdvi(const char *filename, const char *anchor_name) { #define ARG_LEN 32 int i = 0; const char *argv[ARG_LEN]; char *shrink_arg = NULL; ASSERT(filename != NULL, "filename argument to launch_xdvi() mustn't be NULL"); argv[i++] = kpse_invocation_name; /* FIXME: there's something broken with this and invoking xdvi.bin. To reproduce the problem, invoke from the shell: xdvi.bin -geometry 829x1172 /usr/share/texmf/doc/programs/kpathsea.dvi this will run at 300dpi, i.e. ignore an .Xdefaults setting as opposed to: xdvi.bin /usr/share/texmf/doc/programs/kpathsea.dvi Also, how about the other command-line switches that might have been passed to the parent instance? How about things that have been changed at run-time, like shrink factor - should they be converted to command-line options? */ argv[i++] = "-name"; argv[i++] = "xdvi"; /* start the new instance with the same debug flags as the current instance */ if (globals.debug != 0) { argv[i++] = "-debug"; argv[i++] = resource.debug_arg; } if (anchor_name != NULL) { argv[i++] = "-anchorposition"; argv[i++] = anchor_name; } argv[i++] = "-s"; shrink_arg = XMALLOC(shrink_arg, LENGTH_OF_INT + 1); sprintf(shrink_arg, "%d", currwin.shrinkfactor); argv[i++] = shrink_arg; argv[i++] = filename; /* FIXME */ argv[i++] = NULL; ASSERT(i <= ARG_LEN, "Too few elements in argv[]"); if (globals.debug & DBG_HTEX) { fprintf(stderr, "Invoking:\n"); for (i = 0; argv[i]; i++) { fprintf(stderr, "%s\n", argv[i]); } } /* FIXME: using fork_process here hangs the new xdvi process when it tries printing to stderr, so we use plain fork/exec (see comments in util.c) */ #if 0 fork_process(argv[0], False, NULL, NULL, NULL, argv); #else { int pid; switch (pid = fork()) { case -1: perror("fork"); case 0: execvp(argv[0], (char **)argv); XDVI_ERROR((stderr, "%s: Execution of %s failed.", globals.program_name, argv[0])); _exit(EXIT_FAILURE); default: FREE(shrink_arg); } } #endif #undef ARG_LEN } #if COPY_TMP_FILE /* callback to remove temporary file after helper application has terminated. Currently unused. Note the possible danger of a temp race if the application does an fclose() on the file before ... */ static void remove_temp_file(int status, struct xchild *this) { char *pathname = (char *)this->data; if (WEXITSTATUS(status) == 0) { unlink(pathname); } else { popup_message(globals.widgets.top_level, MSG_WARN, NULL, "Warning: Calling `%s' on `%s' terminated with non-zero status (%d)" "\n(Not removing `%s')", this->name, pathname, status, pathname); } free(pathname); } #endif void launch_program(const char *filename) { const char *format_string = NULL; char *content_type = NULL; char *viewer = NULL; char *argv[4]; struct stat statbuf; const char *local_filename_sans_prefix; char *path, *syscmd, *tmp; #if COPY_TMP_FILE int tmp_fd; #endif const char *ptr; char *fullpath = NULL; char canonical_path[MAXPATHLEN + 1]; Boolean needs_terminal; TRACE_HTEX((stderr, "launch_program called with |%s|", filename)); /* is it a local file? */ local_filename_sans_prefix = is_local_file(filename); if (local_filename_sans_prefix == NULL) { /* not local */ launch_browser(filename); return; } /* expand the filename if it contains a relative path */ path = find_file(local_filename_sans_prefix, &statbuf, kpse_program_text_format); if (path != NULL) { /* fully canonicalize path before passing it to helper applications */ fullpath = REALPATH(path, canonical_path); if (fullpath == NULL) { XDVI_WARNING((stderr, "Couldn't canonicalize %s to full path - returning unexpanded.", path)); fullpath = path; } else FREE(path); } else { XDVI_WARNING((stderr, "Couldn't find file %s; passing to application unchanged.", local_filename_sans_prefix)); /* if it doesn't exist, maybe the user has encoded some magic in the filename; in that case, pass it to the application unchanged. */ fullpath = (char *)local_filename_sans_prefix; } TRACE_HTEX((stderr, "fullpath: |%s|", fullpath)); content_type = figure_mime_type(fullpath); ASSERT(content_type != NULL, "figure_mime_type() should have returned a valid type (eventually a fallback)"); /* make it safe to pass the argument to system() or `sh -c', by escaping all `dangerous' characters: */ tmp = shell_escape_string(fullpath); fullpath = tmp; if ((viewer = figure_viewer(content_type, &format_string, &needs_terminal, fullpath)) == NULL) { /* warn user if no application has been found. Help text needs to be constructed at run-time, since we want the correct content-type in it. */ #if 0 char *errmsg = NULL; #else char *errmsg = xstrdup("Please assign an application to the MIME type `"); errmsg = xstrcat(errmsg, content_type); errmsg = xstrcat(errmsg, "' in your ~/.mailcap file. " "E.g. if you want to view the file with netscape, add the following line to your ~/.mailcap:\n"); errmsg = xstrcat(errmsg, content_type); errmsg = xstrcat(errmsg, "; netscape -raise -remote 'openURL(%%s,new-window)'\n\n"); #endif popup_message(globals.widgets.top_level, MSG_WARN, errmsg, "Could not determine an application for the file %s, MIME type `%s'.", fullpath, content_type); /* FIXME: something's wrong with the memory allocation scheme here - can't free errmsg, it's already free'd inside popup_message() ?? */ /* free(errmsg); */ free(fullpath); return; } #if COPY_TMP_FILE /* copy the file to a temporary location before passing it to the viewer. This is e.g. how Acroread does it. This should fix the problem with xdvizilla without -no-rm for DVI files (see comment in figure_viewer(), mime.c). SU 2003/10/02: currently I can't reproduce the xdvizilla problem any more - it seems that for xdvi files, argv[0] will be invoked anyway? Also, copying the files to tmp may break figure locations and relative links for DVI files. Suspended this for the time being. */ tmp = NULL; if ((tmp_fd = xdvi_temp_fd(&tmp)) == -1) { XDVI_ERROR((stderr, "couldn't create temporary file; not calling helper application.")); return; } TRACE_HTEX((stderr, "copying to temporary location: |%s->%s|", fullpath, tmp)); if (!copy_file(fullpath, tmp)) { XDVI_ERROR((stderr, "couldn't copy %s to temporary file %s; not invoking helper application.", fullpath, tmp)); return; } free(fullpath); fullpath = tmp; #endif if (strlen(format_string) > 0) { ptr = find_format_str(viewer, format_string); } else { /* countrary to RFC 1343, we don't pass stuff via pipes (too bothersome) */ ptr = strchr(viewer, '\0'); } if (needs_terminal) { size_t offset = strlen("xterm -e "); syscmd = xmalloc(offset + strlen(viewer) + strlen(fullpath) + 1); strcpy(syscmd, "xterm -e "); memcpy(syscmd + offset, viewer, ptr - viewer); strcpy(syscmd + offset + (ptr - viewer), fullpath); strcpy(syscmd + offset + (ptr - viewer) + strlen(fullpath), ptr + strlen(format_string)); } else { syscmd = xmalloc(strlen(viewer) + strlen(fullpath) + 1); memcpy(syscmd, viewer, ptr - viewer); strcpy(syscmd + (ptr - viewer), fullpath); strcpy(syscmd + (ptr - viewer) + strlen(fullpath), ptr + strlen(format_string)); } /* mailcap(4) says that the mailcap command shall be passed to system(), so we musn't use fork_process() directly here. Instead, we pass the command to `/bin/sh -c', but via fork_process so that - xdvi doesn't hang if the process doesn't return; - we can still catch the return value if `sh -c' exits with an error (e.g. if the viewer command is not found). Note however that this doesn't mimick most of POSIX's system() semantics. */ TRACE_HTEX((stderr, "execv(\"/bin/sh -c %s\")", syscmd)); argv[0] = "/bin/sh"; argv[1] = "-c"; argv[2] = syscmd; argv[3] = NULL; #if COPY_TMP_FILE fork_process("/bin/sh", False, globals.dvi_file.dirname, remove_temp_file, fullpath, argv); #else fork_process("/bin/sh", False, globals.dvi_file.dirname, NULL, NULL, argv); #endif FREE(viewer); #if COPY_TMP_FILE #else FREE(fullpath); #endif FREE(syscmd); } void htex_set_anchormarker(int y) { Position drawing_x; /* erase old marker if it's on the same page as the new marker, after cancelling the old timeout so that it won't affect the new marker */ if (m_href_timeout_id) XtRemoveTimeOut(m_href_timeout_id); htex_erase_anchormarker(NULL, NULL); XFlush(DISP); XtVaGetValues(globals.widgets.draw_widget, XtNx, &drawing_x, NULL); g_anchormarker.page = current_page; free(g_anchormarker.filename); g_anchormarker.filename = xstrdup(globals.dvi_name); g_anchormarker.y_pos = y; g_anchormarker.x_pos = DEFAULT_MARKER_X_OFFSET + -drawing_x; m_href_timeout_id = XtAppAddTimeOut(globals.app, STATUS_SHORT * 1000, htex_erase_anchormarker, (XtPointer)NULL); } static void htex_draw_anchormarker(int y) { int x; XPoint points[3]; Position drawing_x, clip_w; XtVaGetValues(globals.widgets.clip_widget, XtNwidth, &clip_w, NULL); XtVaGetValues(globals.widgets.draw_widget, XtNx, &drawing_x, NULL); /* compute offset to draw into visible region */ x = DEFAULT_MARKER_X_OFFSET + -drawing_x; /* Eventually erase old marker, to avoid `smearing' on horizontal scrolls. */ if (x != g_anchormarker.x_pos) { clearexpose(&mane, g_anchormarker.x_pos - 1, y - 3, 20, 10); } g_anchormarker.x_pos = x; points[0].x = x + 10; points[1].x = x + 19; points[2].x = x + 10; points[0].y = y - 3; points[1].y = y + 2; points[2].y = y + 7; XFillRectangle(DISP, mane.win, globals.gc.visited_linkcolor, x, y, 10, 4); XFillPolygon(DISP, mane.win, globals.gc.visited_linkcolor, points, 3, Convex, CoordModeOrigin); /* -1 indicates that no horizontal scrolling is wanted, since the anchormarker will always be horizontally positioned inside the visible area. */ scroll_page_if_needed(-1, -1, y + 3, y - 3); } static void htex_erase_anchormarker(XtPointer client_data, XtIntervalId *id) { Position clip_w; UNUSED(client_data); UNUSED(id); if (globals.debug & DBG_EVENT) { fprintf(stderr, "htex_erase_anchormarker called!\n"); } if (m_href_timeout_id == (XtIntervalId)0) { /* timeout was removed but callback happened anyway */ return; } m_href_timeout_id = (XtIntervalId)0; /* clear the mark if we're in the same file and on the same page as the mark */ if (g_anchormarker.filename != NULL && strcmp(globals.dvi_name, g_anchormarker.filename) == 0 && g_anchormarker.page == current_page) { XtVaGetValues(globals.widgets.clip_widget, XtNwidth, &clip_w, NULL); clearexpose(&mane, 0, g_anchormarker.y_pos - 3, clip_w, 10); } g_anchormarker.y_pos = -1; } xdvik-ja-22.84.16-j1.40/texk/xdvik/xdvizilla.10000664000175000017500000000551110363262237020261 0ustar uwabamiuwabami.\" Copyright (c) 2002-2004 Paul Vojta .\" .\" 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 .\" PAUL VOJTA 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. .\" .TH XDVIZILLA 1 "11 October 2002" "X Version 11" .SH NAME xdvizilla \- Helper application for running xdvi .SH SYNOPSIS .B xdvizilla [\fB\-no\-rm\fP] .I file .SH DESCRIPTION Presently (October 2002), Mozilla has some bugs with helper applications: it passes gzipped .RB ( .gz ) files directly to the helper application without uncompressing, and it passes compressed .RB ( .Z ) files as empty files. .PP To work around these problems, .B xdvizilla was written to look at files and decompress them correctly (depending on their file types). .PP In addition, some sites produced tarred .I dvi files (including the .I dvi file as well as some included figures), and .B xdvizilla correctly handles those files as well. .SH OPTIONS Only one option is supported: .TP .B \-no\-rm Normally .B xdvizilla will remove .I file before finishing. This option inhibits this behavior. .SH INSTALLATION In addition to installing .B xdvizilla in a directory on the default search path, it is necessary to set it up as a helper application within the browser. .PP For .BR "Netscape 4.x" , add the following lines to the .B mailcap file: .RS 5 .nf .ft 3 .sp 1n application/x-dvi; xdvi -safer %s application/x-dvi-tar; xdvizilla -no-rm %s .sp 1n .ft .fi .RE .PP For .BR "Netscape 6.x" , .BR "Netscape 7.x" , or .BR "Mozilla 1.x" , add the following lines to the .B mailcap file: .RS 5 .nf .ft 3 .sp 1n application/x-dvi; xdvizilla %s application/x-dvi-tar; xdvizilla %s .sp 1n .ft .fi .RE .PP In addition, it would be useful to check that the following line is included in the .B mime.types file: .RS 5 .nf .ft 3 .sp 1n type=application/x-dvi exts="dvi" desc="TeX dvi file" .sp 1n .ft .fi .RE .SH SEE ALSO .BR X (1), .BR xdvi (1). .SH AUTHOR Paul Vojta, U.C. Berkeley. xdvik-ja-22.84.16-j1.40/texk/xdvik/psgs.c0000664000175000017500000006566411276240141017322 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1994-2004 Paul Vojta 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. \*========================================================================*/ #ifdef PS_GS /* entire file */ #include #include #include /* for timeval */ #include /* Condition for retrying a write */ #include #include #include "xdvi-config.h" #include "xdvi.h" #include "psgs.h" #include "kpathsea/c-pathmx.h" #include "dvi-init.h" #include "dvi-draw.h" #include "events.h" #include "statusline.h" #include "special.h" #include "util.h" #ifdef X_NOT_STDC_ENV extern int errno; #endif #ifdef EWOULDBLOCK # ifdef EAGAIN # define AGAIN_CONDITION (errno == EWOULDBLOCK || errno == EAGAIN) # else # define AGAIN_CONDITION (errno == EWOULDBLOCK) # endif #else # ifdef EAGAIN # define AGAIN_CONDITION (errno == EAGAIN) # endif #endif #if HAVE_POLL # include # define XIO_IN POLLIN # define XIO_OUT POLLOUT #else # define XIO_IN 1 # define XIO_OUT 2 #endif #ifdef MOTIF # include #endif extern const char psheader[]; extern unsigned psheaderlen; Boolean gs_postpone_prescan = False; /* global procedures (besides initGS) */ static void toggle_gs(int flag); static void destroy_gs(void); static void interrupt_gs(void); static void endpage_gs(void); static void drawbegin_gs(int, int, const char *); static void drawbegin_gs_box(int, int, const char *); void drawraw_gs(const char *); static void drawfile_gs(const char *, FILE *); static void drawend_gs(const char *); static void beginheader_gs(void); static void endheader_gs(void); static void newdoc_gs(void); static struct psprocs gs_procs = { /* toggle */ toggle_gs, /* destroy */ destroy_gs, /* interrupt */ interrupt_gs, /* endpage */ endpage_gs, /* drawbegin */ drawbegin_gs, /* drawraw */ drawraw_gs, /* drawfile */ drawfile_gs, /* drawend */ drawend_gs, /* beginheader */ beginheader_gs, /* endheader */ endheader_gs, /* newdoc */ newdoc_gs }; static int std_io[2]; Pixmap bpixmap; #define GS_fd (std_io[0]) /* some arguments are filled in later */ static char arg4[] = "-dDEVICEWIDTH=xxxxxxxxxx"; static char arg5[] = "-dDEVICEHEIGHT=xxxxxxxxxx"; static const char *argv[] = { NULL, NULL, "-dNOPAUSE", "-q", arg4, arg5, "-dDEVICEXRESOLUTION=72", "-dDEVICEYRESOLUTION=72", "-dNOSAFER", "-dNOEPS", NULL, NULL, NULL, NULL, NULL, NULL }; static unsigned int GS_page_w; /* how big our current page is */ static unsigned int GS_page_h; static Boolean GS_alpha; /* remember if we are using the alpha driver */ static unsigned long GS_mag; /* magnification currently in use */ static int GS_shrink; /* shrink factor currently in use */ static Boolean GS_active; /* if we've started a page yet */ static int GS_pending; /* number of ack's we're expecting */ static char GS_outb[257]; /* circular output buffer */ static char *GS_outb_in; /* next position in output buffer */ static char *GS_outb_out; /* next byte to come out of buffer */ #define GS_outb_limit (GS_outb + sizeof GS_outb) /* last+1 byte */ static int GS_write_ack; /* flag to set when done writing */ static Boolean GS_in_header; /* if we're sending a header */ static Boolean GS_in_doc; /* if we've sent header information */ static int GS_ev_mask; /* events for which we'll stop */ static int GS_die_ack = 0; /* flags to set when GS dies */ static Boolean GS_timer_set; /* if there's a timer set */ static Boolean GS_old; /* if we're using gs 2.xx */ #define GS_MASK_NORMAL EV_GE_NEWPAGE #define GS_MASK_HEADER EV_GE_PS_TOGGLE #define GS_MASK_INIT (EV_GE_TERM | EV_PS_TOGGLE) static Atom gs_atom; static Atom gs_colors_atom; #define Landscape 90 #define LINELEN 81 static char line[LINELEN + 1]; static char *linepos = line; static char ackstr[] = "\347\310\376"; static char oldstr[] = "\347\310\375"; static void gs_died(int, struct xchild *); static char *read_from_gs(int, void *); static void write_to_gs(int, void *); static struct xio gs_xio = {NULL, 0, XIO_IN, #if HAVE_POLL NULL, #endif read_from_gs, write_to_gs, NULL /* data */ }; static struct xchild gs_child = { NULL, 0, True, NULL, NULL, NULL, gs_died }; #define GS_pid (gs_child.pid) /* It seems that XtTimers don't work reliably with xdvi's event treatment; so use custom timers for the time being. Search for TIMER_PROBLEM_FIXED to locate the relevant code parts. */ #if TIMER_PROBLEM_FIXED static XtIntervalId gs_timeout_id = 0; static void gs_timer_proc(XtPointer client_data, XtIntervalId * id); static struct xtimer gs_timer = {NULL, {0, 0}, gs_timer_proc, NULL #if XDVI_XT_TIMER_HACK , NULL, NULL #endif }; #else static void gs_alarm(struct xtimer *this, void *data); static struct xtimer gs_timer = {NULL, {0, 0}, XTM_DEFAULT, gs_alarm, NULL #if XDVI_XT_TIMER_HACK , NULL, NULL #endif }; #endif static void showto(char *q) { char *p = line; char *p1; while (p < q) { p1 = memchr(p, '\n', q - p); if (p1 == NULL) p1 = q; *p1 = '\0'; printf("gs: %s\n", p); p = p1 + 1; } } static char * read_from_gs(int fd, void *data) { int bytes; char *line_end = NULL; char *p; UNUSED(data); for (;;) { bytes = read(fd, linepos, line + LINELEN - linepos); if (bytes < 0) { if (AGAIN_CONDITION) break; perror("xdvik: read_from_gs"); break; } line_end = linepos + bytes; if (bytes == 0) { if (GS_pid != 0) XDVI_WARNING((stderr, "Read_from_gs returned 0 bytes")); break; } /* Check for ack strings */ for (p = line; p < line_end - 2; ++p) { p = memchr(p, '\347', line_end - p - 2); if (p == NULL) break; if (memcmp(p, ackstr, 3) == 0) { --GS_pending; if (GS_pending == 0) globals.ev.flags |= EV_ACK; if (globals.debug & DBG_PS) printf("Got GS ack; %d pending.\n", GS_pending); } else if (memcmp(p, oldstr, 3) == 0) { if (globals.debug & DBG_PS) puts("Using old GS version."); GS_old = True; } else continue; showto(p); p += 3; memmove(line, p, line_end - p); line_end -= p - line; linepos = p = line; --p; } *line_end = '\0'; p = rindex(linepos, '\n'); if (p != NULL) { ++p; showto(p); memmove(line, p, line_end - p); line_end -= p - line; } linepos = line_end; /* * Normally we'd hold text until a newline character, but the * buffer is full. So we flush it, being careful not to cut up an * ack string. */ if (linepos >= line + LINELEN) { p = line + LINELEN; if ((*--p != '\347' && *--p != '\347' && *--p != '\347') || (memcmp(p, ackstr, line + LINELEN - p) != 0 && memcmp(p, oldstr, line + LINELEN - p) != 0)) p = line + LINELEN; *p = '\0'; printf("gs: %s\n", line); *p = '\347'; linepos = line; while (p < line + LINELEN) *linepos++ = *p++; } } return line_end; /* dummy */ } static void write_to_gs(int fd, void *data) { char *send_end; int bytes; UNUSED(fd); UNUSED(data); for (;;) { send_end = GS_outb_in; if (send_end < GS_outb_out) send_end = GS_outb_limit; bytes = write(GS_fd, GS_outb_out, send_end - GS_outb_out); if (bytes < 0) { if (AGAIN_CONDITION) break; perror("xdvik: write_to_gs"); break; } GS_outb_out += bytes; if (GS_outb_out == GS_outb_limit) GS_outb_out = GS_outb; if (GS_outb_out == GS_outb_in) { /* if buffer is empty */ gs_xio.xio_events = XIO_IN; #if HAVE_POLL if (gs_xio.pfd != NULL) /* write_to_gs is called directly */ gs_xio.pfd->events = XIO_IN; #endif break; } } globals.ev.flags |= GS_write_ack; GS_write_ack = 0; } /* * Main routine for writing to the GS interpreter. */ static void gs_send(const char *cp, size_t len) { const char *cp_end = cp + len; char *send_end; size_t bytes; char *old_out; Boolean interrupting; if (GS_pid == 0 || (globals.ev.flags & GS_ev_mask)) return; /* * Because cp might reside on the stack, don't return until we've * copied all of it to our circular output buffer. * Note that GS_outb_out == GS_outb_in means that the buffer is empty. */ GS_timer_set = interrupting = False; for (;;) { send_end = GS_outb_out; if (send_end == GS_outb) send_end = GS_outb_limit; --send_end; if (send_end < GS_outb_in) send_end = GS_outb_limit; bytes = send_end - GS_outb_in; if (bytes > 0) { if (bytes >= (unsigned)(cp_end - cp)) bytes = cp_end - cp; memcpy(GS_outb_in, cp, bytes); cp += bytes; GS_outb_in += bytes; if (GS_outb_in == GS_outb_limit) GS_outb_in = GS_outb; if (cp < cp_end) continue; } /* The buffer is now full --or-- we've run out of data */ old_out = GS_outb_out; if (!(gs_xio.xio_events & XIO_OUT)) { /* restart output */ gs_xio.xio_events = XIO_IN | XIO_OUT; #if HAVE_POLL if (gs_xio.pfd != NULL) gs_xio.pfd->events = POLLIN | POLLOUT; #endif write_to_gs(GS_fd, NULL); if (GS_outb_out != old_out) { if (cp == cp_end) break; else continue; } } if (cp == cp_end) break; GS_die_ack = GS_write_ack = EV_ACK; for (;;) { /* loop because there may be stray ACKs */ if (!interrupting) { (void) read_events(GS_ev_mask | EV_ACK); globals.ev.flags &= ~EV_ACK; if (GS_pid == 0) { /* if GS died */ GS_die_ack = 0; return; } if (GS_outb_out != old_out) /* if more room in buffer */ break; if (globals.ev.flags & GS_ev_mask) { /* if a serious event */ if (globals.debug & DBG_PS) puts("Setting timeout in gs_send()"); set_timer(&gs_timer, resource.gs_timeout); GS_timer_set = interrupting = True; } } else { (void) read_events(EV_GE_TERM | EV_PS_TOGGLE | EV_ACK); globals.ev.flags &= ~EV_ACK; if (GS_outb_out != old_out) /* if more room in buffer */ break; if (GS_timer_set) /* if timer still set */ cancel_timer(&gs_timer); destroy_gs(); GS_die_ack = 0; return; } } } if (GS_timer_set) /* if timer still set */ cancel_timer(&gs_timer); GS_die_ack = GS_write_ack = 0; } static void #if TIMER_PROBLEM_FIXED gs_timer_proc(XtPointer client_data, XtIntervalId * id) #else gs_alarm(struct xtimer *this, void *data) #endif { UNUSED(this); UNUSED(data); if (globals.debug & DBG_PS) puts("GS timeout expired"); globals.ev.flags |= EV_ACK; GS_timer_set = False; #if TIMER_PROBLEM_FIXED gs_timeout_id = 0; #endif } /* * Wait for acknowledgement from GS. */ static void waitack(void) { if (GS_pending == 0) { globals.ev.flags &= ~EV_ACK; return; } GS_die_ack = EV_ACK; for (;;) { /* loop because there might be stray ACKs. */ /* fprintf(stderr, "looping for stray ACKs, page %d\n", current_page); */ (void) read_events(EV_GE_ACK); globals.ev.flags &= ~EV_ACK; if (GS_pending == 0) { GS_die_ack = 0; return; } if (globals.ev.flags & EV_GE_ACK) break; } if (globals.debug & DBG_PS) puts("Setting timeout in waitack()"); #if TIMER_PROBLEM_FIXED if (gs_timeout_id) XtRemoveTimeOut(gs_timeout_id); gs_timeout_id = XtAppAddTimeOut(globals.app, resource.gs_timeout, gs_timer_proc, (XtPointer) NULL); #else set_timer(&gs_timer, resource.gs_timeout); #endif GS_timer_set = True; (void) read_events(EV_GE_TERM | EV_PS_TOGGLE | EV_ACK); globals.ev.flags &= ~EV_ACK; if (GS_timer_set) { #if TIMER_PROBLEM_FIXED XtRemoveTimeOut(gs_timeout_id); gs_timeout_id = 0; #else cancel_timer(&gs_timer); #endif } GS_die_ack = 0; if (GS_pending > 0) destroy_gs(); } /* * Fork a process to run ghostscript. This is done using the * x11 device (which needs to be compiled in). Normally the x11 * device uses ClientMessage events to communicate with the calling * program, but we don't do this. The reason for using the ClientMessage * events is that otherwise ghostview doesn't know when a non-conforming * postscript program calls showpage. That doesn't affect us here, * since in fact we disable showpage. * * SAFER mode is handled by providing both the -dNOSAFER and -dSAFER * options. Ghostscript versions 7.04 and earlier ignore -dNOSAFER and use * -dSAFER; the code in strsafe is ignored since .locksafe is not present. * In versions 7.04 and higher, -dNOSAFER overrides -dSAFER; SAFER mode is * optionally turned on by sending the strsafe string. It is possible in some * versions of gs prior to 7.04 to use -dDELAYSAFER instead of -dNOSAFER, but * there's no point in doing that since .locksafe is not defined in those * versions. I don't know where 7.03 fits in on all of this (but it works with * that version as well). */ Boolean initGS(void) { char buf[100]; static Boolean did_putenv = False; /* * This string reads chunks (delimited by %%xdvimark). * The first character of a chunk tells whether a given chunk * is to be done within save/restore or not. * The `H' at the end tells it that the first group is a * header; i.e., no save/restore. * `execute' is unique to ghostscript. */ static const char strsafe[] = "{ << /PermitFileReading [ (*) ] /PermitFileWriting [ ] /PermitFileControl [ ] " ">> setuserparams .locksafe " "} stopped pop\n"; static const char str1[] = "/xdvi$run {$error /newerror false put {currentfile cvx execute} stopped pop} " "def " "/xdvi$ack (\347\310\376) def " "/xdvi$dslen countdictstack def " "{currentfile read pop 72 eq " "{xdvi$run} " "{/xdvi$sav save def xdvi$run " "clear countdictstack xdvi$dslen sub {end} repeat xdvi$sav restore} " "ifelse " "{(%%xdvimark) currentfile =string {readline} stopped " "{clear} {pop eq {exit} if} ifelse }loop " "flushpage xdvi$ack print flush " "}loop\nH"; static const char str2[] = "[0 1 1 0 0 0] concat\n" "revision 300 lt{(\347\310\375) print flush}if\n" "stop\n%%xdvimark\n"; /* * If we're prescanning *before* setting up the widgets (to get the * page size, for example), then postpone starting up ghostscript. */ if (mane.win == (Window)0) { if (globals.debug & DBG_PS) puts("Hit PS header in early prescan; postponing."); psp = no_ps_procs; gs_postpone_prescan = True; return True; } if (globals.debug & DBG_PS) puts("Running initGS ..."); gs_atom = XInternAtom(DISP, "GHOSTVIEW", False); /* send bpixmap, orientation, bbox (in pixels), and h & v resolution */ sprintf(buf, "%ld %d 0 0 %u %u 72 72", bpixmap, /* bpixmap */ Landscape, /* orientation */ GS_page_h = globals.page.h, GS_page_w = globals.page.w); XChangeProperty(DISP, mane.win, gs_atom, XA_STRING, 8, PropModeReplace, (unsigned char *)buf, strlen(buf)); GS_alpha = resource.gs_alpha; gs_colors_atom = XInternAtom(DISP, "GHOSTVIEW_COLORS", False); sprintf(buf, "%s %ld %ld", resource.gs_palette, color_data[0].pixel, color_data[1].pixel); XChangeProperty(DISP, mane.win, gs_colors_atom, XA_STRING, 8, PropModeReplace, (unsigned char *)buf, strlen(buf)); if (!did_putenv) { sprintf(buf, "%ld", mane.win); xputenv("GHOSTVIEW", buf); did_putenv = True; } XSync(DISP, False); /* update the window */ if (xpipe(std_io) != 0) { perror("[xdvik] pipe"); return False; } fflush(stderr); /* to avoid double flushing */ GS_pid = vfork(); if (GS_pid == 0) { /* child */ const char **argvp = argv + 10; argv[1] = resource.gs_alpha ? "-sDEVICE=x11alpha" : "-sDEVICE=x11"; sprintf(arg4 + 14, "%u", GS_page_w); sprintf(arg5 + 15, "%u", GS_page_h); if (resource.gs_safer) *argvp++ = "-dSAFER"; #if 0 if (resource.gs_alpha) { *argvp++ = "-dGraphicsAlphaBits=4"; *argvp++ = "-dTextAlphaBits=4"; *argvp++ = "-dMaxBitmap=0"; } #endif *argvp = "-"; (void) close(std_io[0]); (void) dup2(std_io[1], 0); (void) dup2(std_io[1], 1); (void) dup2(std_io[1], 2); (void) close(std_io[1]); (void)execvp(argv[0] = resource.gs_path, (char *const *)argv); /*TODO: use fork_process here?? */ XDVI_ERROR((stderr, "Execvp of %s failed: %s", argv[0], strerror(errno))); _exit(EXIT_FAILURE); } (void)close(std_io[1]); if (GS_pid == -1) { /* error */ GS_pid = 0; perror("[xdvik] vfork"); (void)close(GS_fd); return False; } prep_fd(GS_fd, True); /* Set file descriptor for non-blocking I/O */ gs_child.name = xstrdup("gs"); gs_child.io = &gs_xio; set_chld(&gs_child); psp = gs_procs; GS_active = False; GS_in_header = True; GS_pending = 1; GS_mag = GS_shrink = -1; gs_xio.fd = GS_fd; gs_xio.xio_events = XIO_IN; GS_write_ack = 0; GS_outb_in = GS_outb_out = GS_outb; set_io(&gs_xio); GS_ev_mask = GS_MASK_INIT; (void) signal(SIGPIPE, SIG_IGN); if (resource.gs_safer) gs_send(strsafe, (sizeof strsafe) - 1); gs_send(str1, (sizeof str1) - 1); gs_send(psheader, psheaderlen); gs_send(str2, (sizeof str2) - 1); waitack(); GS_in_header = False; GS_ev_mask = GS_MASK_NORMAL; if (GS_pid == 0) { /* if something happened */ destroy_gs(); return False; } if (resource.postscript == 0) toggle_gs(0); /* if we got a 'v' already */ else { scanned_page = scanned_page_ps = scanned_page_reset; globals.ev.flags |= EV_NEWPAGE; /* ||| redraw the page */ longjmp(globals.ev.canit, 1); } return True; } static void toggle_gs(int flag) /* this routine is callable from within read_events(). */ { if (globals.debug & DBG_PS) fprintf(stdout, "Toggling GS to %d", flag); switch (flag) { case 0: psp.drawbegin = drawbegin_none; break; case 1: psp.drawbegin = drawbegin_gs; break; default: psp.drawbegin = drawbegin_gs_box; break; } } void gs_resume_prescan(void) { if (globals.debug & DBG_PS) puts("Resuming prescan"); gs_postpone_prescan = False; if (!initGS()) /* this may not return */ psp = no_ps_procs; } static void gs_died(int status, struct xchild *child) { UNUSED(status); if (globals.debug & DBG_PS) fprintf(stderr, "process %s died\n", child->name); GS_pid = 0; (child->io->read_proc)(child->io->fd, NULL); if (linepos > line) { *linepos = '\0'; printf("%s: %s\n", child->name, line); linepos = line; } clear_io(child->io); (void)close(child->io->fd); scanned_page = scanned_page_ps = scanned_page_reset; GS_active = GS_in_doc = False; GS_pending = 0; globals.ev.flags |= GS_die_ack; } static void destroy_gs(void) { if (globals.debug & DBG_PS) puts("Destroying GS process"); if (GS_pid != 0) { if (kill(GS_pid, SIGKILL) < 0 && errno != ESRCH) perror("xdvik: destroy_gs"); GS_pid = 0; clear_chld(&gs_child); read_from_gs(GS_fd, NULL); if (linepos > line) { *linepos = '\0'; printf("gs: %s\n", line); linepos = line; } clear_io(&gs_xio); (void) close(GS_fd); scanned_page = scanned_page_ps = scanned_page_reset; } GS_active = GS_in_doc = False; GS_pending = 0; } static void deactivate(void) { static const char str[] = " stop\n%%xdvimark\n"; int saved_mask; saved_mask = GS_ev_mask; GS_ev_mask = 0; gs_send(str, (sizeof str) - 1); GS_ev_mask = saved_mask; GS_active = False; } static void interrupt_gs(void) { if (globals.debug & DBG_PS) puts("Running interrupt_gs()"); /* FIXME: added this special case, since otherwise EV_ACK might not get reset at all, and hang xdvi forever when scrolling quickly through a file that should be reloaded. */ if (GS_pending == 0) { /* fprintf(stderr, "+++++++++ 1st case; waitack: %d\n", globals.ev.flags & EV_ACK); */ globals.ev.flags &= ~EV_ACK; return; } else if (GS_pending < 0) { /* fprintf(stderr, "GS_pending: %d; waitack: %d\n", GS_pending, globals.ev.flags & EV_ACK); */ return; /* nothing to do */ } /* * ||| what I'd really like to do here is cause gs to execute * the interrupt routine in errordict. But so far (gs 2.6.1) * that has not been implemented in ghostscript. */ if (GS_active) deactivate(); waitack(); } static void endpage_gs(void) { if (globals.debug & DBG_PS) puts("Running endpage_gs()"); if (GS_active) { deactivate(); waitack(); } } /* * Checks that the GS interpreter is running correctly. */ static void checkgs(Boolean in_header) { char buf[150]; /* For gs 2, we pretty much have to start over to enlarge the window. */ if ((GS_old && (globals.page.w > GS_page_w || globals.page.h > GS_page_h)) || GS_alpha != resource.gs_alpha) destroy_gs(); if (GS_pid == 0) (void)initGS(); if (!GS_active) { /* check whether page_w or page_h have increased */ if (globals.page.w > GS_page_w || globals.page.h > GS_page_h) { if (globals.ev.flags & GS_ev_mask) longjmp(globals.ev.canit, 1); ++GS_pending; sprintf(buf, "H mark /HWSize [%d %d] /ImagingBBox [0 0 %d %d] " "currentdevice putdeviceprops pop\n" "initgraphics [0 1 1 0 0 0] concat stop\n" "%%%%xdvimark\n", GS_page_w = globals.page.w, GS_page_h = globals.page.h, globals.page.h, globals.page.w); gs_send(buf, strlen(buf)); if (!in_header) { globals.ev.flags |= EV_NEWPAGE; /* ||| redraw the page */ longjmp(globals.ev.canit, 1); } } if (magnification != GS_mag) { if (globals.ev.flags & GS_ev_mask) longjmp(globals.ev.canit, 1); ++GS_pending; sprintf(buf, "H TeXDict begin /DVImag %ld 1000 div def end stop\n" "%%%%xdvimark\n", GS_mag = magnification); gs_send(buf, strlen(buf)); } if (mane.shrinkfactor != GS_shrink) { if (globals.ev.flags & GS_ev_mask) longjmp(globals.ev.canit, 1); ++GS_pending; sprintf(buf, "H TeXDict begin %d %d div dup /Resolution X /VResolution X end stop\n" "%%%%xdvimark\n", resource.pixels_per_inch, GS_shrink = mane.shrinkfactor); gs_send(buf, strlen(buf)); } } } static void drawbegin_gs(int xul, int yul, const char *cp) { char buf[32]; static const char str[] = " TeXDict begin\n"; checkgs(False); if (!GS_active) { if (globals.ev.flags & GS_ev_mask) longjmp(globals.ev.canit, 1); ++GS_pending; gs_send(str, (sizeof str) - 1); GS_active = True; } /* This allows the X side to clear the page */ XSync(DISP, False); sprintf(buf, "%d %d moveto\n", xul, yul); gs_send(buf, strlen(buf)); /* gs_send(clear_bg, strlen(clear_bg)); */ if (globals.debug & DBG_PS) printf("drawbegin at %d,%d: sending `%s'\n", xul, yul, cp); /* * added SU 2000/12/18: * Try to detect some simple PS rotating commands, and warn about them. * There are surely more than that ... */ if (strstr(cp, "rotate") != NULL /* used by graphics.sty */ || strstr(cp, "RotBegin") != NULL /* used by pstricks */ ) { statusline_error(STATUS_SHORT, "Warning: PS code on page %d may contain rotation, " "which is not supported by xdvi", current_page + 1); } gs_send(cp, strlen(cp)); } static void drawbegin_gs_box(int xul, int yul, const char *cp) { drawbegin_gs(xul, yul, cp); } void drawraw_gs(const char *cp) { if (!GS_active) return; if (globals.debug & DBG_PS) printf("raw ps sent to context: %s\n", cp); gs_send(cp, strlen(cp)); gs_send("\n", 1); } static void drawfile_gs(const char *cp, FILE *f) { char canonical_path[MAXPATHLEN + 1]; char *ret; fclose(f); /* don't need it */ if (!GS_active) return; if (globals.debug & DBG_PS) printf("original path: |%s|\n", cp); /* drawraw_gs("newpath 0 0 moveto 0 1000 rlineto 1000 0 rlineto 0 -1000 rlineto closepath 1 setgray fill"); */ #if 0 /* if expand_symlinks or remove_dots from kpathsea were public, we could use the following: */ ret = remove_dots(expand_symlinks(cp)); #endif ret = REALPATH(cp, canonical_path); if (ret == NULL) XDVI_WARNING((stderr, "Couldn't canonicalize path \"%s\": %s. Sending to gs unchanged.", cp, strerror(errno))); else cp = canonical_path; if (globals.debug & DBG_PS) printf("expanded path: |%s|\n", cp); gs_send("(", 1); gs_send(cp, strlen(cp)); gs_send(")run\n", 5); /* { */ /* char *clear_bg = "newpath 0 0 moveto 0 1000 rlineto 1000 0 rlineto 0 -1000 rlineto closepath .4 setgray fill\n"; */ /* gs_send(clear_bg, strlen(clear_bg)); */ /* } */ } static void drawend_gs(const char *cp) { if (!GS_active) return; if (globals.debug & DBG_PS) printf("end ps: %s\n", cp); gs_send(cp, strlen(cp)); gs_send("\n", 1); save_bbox(); } static void beginheader_gs(void) { static const char str[] = "Hsave /xdvi$doc exch def\n"; if (globals.debug & DBG_PS) puts("Running beginheader_gs()"); checkgs(True); if (GS_active) { if (!GS_in_header) XDVI_FATAL((stderr, "Internal error in beginheader_gs().")); return; } if (globals.ev.flags & GS_ev_mask) { /* fprintf(stderr, "longjmp!"); */ longjmp(globals.ev.canit, 1); } GS_in_header = True; GS_ev_mask = GS_MASK_HEADER; ++GS_pending; if (GS_in_doc) gs_send("H", 1); else { gs_send(str, (sizeof str) - 1); GS_in_doc = True; } GS_active = True; } static void endheader_gs(void) { if (globals.debug & DBG_PS) puts("Running endheader_gs()"); if (GS_active) { deactivate(); waitack(); GS_in_header = False; GS_ev_mask = GS_MASK_NORMAL; } } static void newdoc_gs(void) { static const char str[] = "Hxdvi$doc restore stop\n%%xdvimark\n"; if (globals.debug & DBG_PS) puts("Running newdoc_gs()"); if (GS_in_doc) { ++GS_pending; gs_send(str, (sizeof str) - 1); GS_mag = GS_shrink = -1; GS_in_doc = False; if (!GS_old) GS_page_w = GS_page_h = 0; } } void erasepage_gs(void) { /* In buffered mode, gs has no way of knowing that the screen has been erased. Clear the gs window buffer with an erasepage command. */ if (resource.gs_alpha && GS_pid > 0 && !GS_active) { if (globals.debug & DBG_PS) puts("erasing page!"); beginheader_gs(); drawraw_gs("erasepage"); endheader_gs(); } } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* PS_GS */ xdvik-ja-22.84.16-j1.40/texk/xdvik/alloc-debug.h0000664000175000017500000000166210363262237020523 0ustar uwabamiuwabami#include #include #include "xdvi-config.h" /* for xmalloc etc. */ #ifndef ALLOC_DEBUG_H__ #define ALLOC_DEBUG_H__ /* * Simplistic macros to help finding `hot spots'/bugs in memory handling. * Require that MALLOC(x) is never a single statement following an if(), * else() etc. without braces, and never in the middle of a variable * declarations list. */ /* #define DEBUG_MEMORY_HANDLING */ #ifdef DEBUG_MEMORY_HANDLING #define XMALLOC(x,y) ( \ fprintf(stderr, "=== %s:%d: malloc(%p (%s), %d)\n", __FILE__, __LINE__, x, #x, y), \ xmalloc(y)) #define XREALLOC(x,y) ( \ fprintf(stderr, "=== %s:%d: realloc(%p (%s), %d)\n", __FILE__, __LINE__, x, #x, y), \ xrealloc(x, y)) #define FREE(x) ( \ fprintf(stderr, "=== %s:%d: free(%p (%s))\n", __FILE__, __LINE__, x, #x), \ free(x)) #else #define XMALLOC(x,y) xmalloc(y) #define XREALLOC(x,y) xrealloc(x,y) #define FREE(x) free(x) #endif #endif /* ALLOC_DEBUG_H__ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/ChangeLog.TL0000664000175000017500000001645411720674650020275 0ustar uwabamiuwabamiChangeLog.TL: Changes for xdvik (TeX Live) ================================================== 2012-02-21 Peter Breitenlohner * configure.ac: Drop XDVI_CC_CONCAT and XDVI_SYS_SUNOS_4, the results are not used. * m4/xdvi-cc-concat.m4, m4/xdvi-sys-sunos4.m4: Removed. 2011-12-06 Peter Breitenlohner * Makefile.am: Replace ${prefix}/texmf => $(datarootdir)/texmf. 2011-07-30 Peter Breitenlohner * font-open.[ch] (font_open): Constify `char **' parameter. * dvi-init.c (load_font): Cast font_open() argument to `const char **'. 2011-06-16 Peter Breitenlohner * read-mapfile.c (read_map_file): Allow find_suffix() to return a const string. 2011-03-07 Peter Breitenlohner * hypertex.c (launch_xdvi): `program_invocation_name' has been renamed into `kpse_invocation_name'. 2010-05-25 Karl Berry * m4/xdvi-check-iconv.m4 (--with-iconv): new option to completely disable checking for iconv. Needed due to the local configuration of the machine used to build the sparc-linux binaries (namely, weyl.math.utah.edu). 2010-05-19 Peter Breitenlohner * tests/run_tests.c, test_dl_list.c: Cast size_t to long for printing to avoid warnings on 64Bit systems. 2010-03-29 Peter Breitenlohner * configure.ac: Remove AC_TYPE_SIZE_T, now part of KPSE_COMMON. 2009-12-22 Peter Breitenlohner * tests/test_string_utils.c (test_my_stristr): Make the test more stringent (and closer to the original code). 2009-12-21 Peter Breitenlohner * tests/test_string_utils.c (test_my_stristr): Make test result independent of compiler optimizations (constant folding). 2009-12-18 Peter Breitenlohner * tests/test_string_utils.c (test_expand_filename): Do not prepend cwd to absolute filenames. 2009-11-17 Peter Breitenlohner * configure.ac: Suppress some compiler warnings (too many). 2009-11-07 Peter Breitenlohner * configure.ac, xdvi.h: Require recent kpathsea version. 2009-08-27 Peter Breitenlohner Avoid some maximal compiler warnings. * encodings.c (cjk2unicode): Unconstify string arg. * events.c (show_timers): Constify string arg. * gui/sfPath.c (SFLogin): Constify string members. (SFstrdup): Convert arg1 to result that can be assigned to const strings, constify remaining arg. (SFunreadableDir): Constify local var. * gui/sfPath.[ch] (SFchdir): Constify string arg. * hypertex.c (remote_URL_schemes): 'char *const'=>'const char*'. * main.c (compare_strings): 'const char**'=>'const char*const*'. * mime.c (mailcap_map): Constify string members. * pixmaps/toolbar.xpm, pixmaps/toolbar2.xpm: Constify pixmaps. 2009-08-26 Peter Breitenlohner Avoid some maximal compiler warnings. * dvi-init.c (get_tmp_dvi_name), gui/Tip.c (foo), gui/sfDir.c (foo), gui/sfDraw.c (foo), gui/sfPath.c (foo), gui/sfSelFile.c (foo), gui/xaw_menu.c (foo), gui/xlwradio.c (foo), gui/xm_colorsel.c (foo), gui/xm_filesel.c (foo), gui/xm_menu.c (foo), gui/xm_prefs.c (foo), gui/xm_prefs_appearance.c (foo), gui/xm_prefs_fonts.c (foo), gui/xm_prefs_helpers.c (foo), gui/xm_prefs_page.c (foo), gui/xm_prefs_scroll.c (foo), gui/xm_toolbar.c (foo), image-magick.c (clear_cache, foo), pagehist.c (page_history_clear), psdps.c (DPSErrorProcHandler, foo), psgs.c (gs_resume_prescan, foo), psnews.c (initNeWS, foo), util.c (do_abort): ANSI C function definitions, i.e., '()'=>'(void)'. * xserver-info.c (print_display_info, print_visual_info, print_screen_info, foo): ANSI C function definitions. 2009-08-22 Peter Breitenlohner * configure.ac: Check for and ... * xdvi.h: ... skip extern decl if found. 2009-06-29 Karl Berry * gui/help-window.c (default_help_general): avoid embedding date in binary. 2009-06-22 Peter Breitenlohner * dvi-draw.c: do not #include "kpathsea/c-vararg.h" (after #include ). * string-utils.h, xdvi.h, gui/message-window.c, gui/statusline.c, tests/test_string_utils.c: #include , not "kpathsea/c-vararg.h". * xdvi.h: remove NeedFunctionPrototypes et al. 2009-06-03 Peter Breitenlohner * events.c: avoid declaration after statement. from Vladimir Volovich . 2009-05-21 Peter Breitenlohner * CHANGES: fixed version/relase-date such that mksedscript can extract them. 2009-04-28 Peter Breitenlohner * xdvi.h: guard typedef of iconv_char_pptrT by '#if HAVE_ICONV_H'. * squeeze/squeeze.c: add '#include '. 2009-04-18 Peter Breitenlohner * xdvi.1.in (warnspecials): fixed duplicate entry, removing an #ifkpathsea without matching #endif. 2009-03-31 Peter Breitenlohner Imported ftp://tug.org/tex/xdvik-22.84.15.tar.gz and adapted to new TeX Live build system (Automake & Co.). Renamed original files XXX -> XXX-22.84.15. * squeeze.c (removed): File moved ... * squeeze/squeeze.c (new): ... to here. Don't include any system dependent kpathsea headers, such that squeeze/ can be configured separately for the build system. 2009-03-21 Peter Breitenlohner * CHANGES: fixed version/relase-date such that mksedscript can extract them. 2008-07-01 Peter Breitenlohner Imported ftp://tug.org/tex/xdvik-22.84.14.tar.gz and adapted to new TeX Live build system (autoconf-2.59+). * Makefile.in.orig, acconfig.h.orig, aclocal.m4.orig, configure.in.orig, depend.mk.orig, gui/Makefile.in.orig, gui/depend.mk.orig, kpathsea.ac.orig, tests/Makefile.in.orig, tests/depend.mk.orig, withenable.ac.orig (all new): Original files from xdvik-22.84.14. * Makefile.in, gui/Makefile.in, tests/Makefile.in: Added '@configure_input@' line and replace ac_include by kpse_include. * acinclude.m4 (new): Renamed from aclocal.m4. Renamed cache variables (must contain '_cv_'). * acinclude.m4, configure.in, withenable.ac: Added lots of m4 quoting and third args of AC_DEFINE. * acconfig.h (removed): Use AC_DEFINE with three args to provide templates. * configure.in: Replaced AC_OUTPUT with arguments by KPSE_CONFIG_FILES, AC_CONFIG_FILES and AC_OUTPUT without arg. * kpathsea.ac (LIBKPATHSEACPPFLAGS): Set to '-I$(kpathsea_parent)' instead of '-I$(kpathsea_dir)' to avoid confusion between and . * depend.mk, gui/depend.mk, tests/depend.mk: Regenerated and cleaned by hand ('make depend' didn't quite do that). * aclocal.m4, c-auto.in, configure: Regenerated. 2008-02-29 Peter Breitenlohner * acinclude.m4: added quotes to DEFUN's first args, added AC_DEFINES's third arg to provide autoheader templates ... * configure.in, withenable.ac: added AC_DEFINES's third arg to provide autoheader templates ... * acconfig.h: ... removed. 2008-01-31 Peter Breitenlohner Convert from autoconf-2.13 to autoconf-2.59+: * configure.in (AC_PREREQ): Require autoconf-2.59. * Makefile.in, gui/Makefile.in: Add @configure_input@ lines. * acinclude.m4 (new): Renamed from aclocal.m4. * aclocal.m4 (new): Generated (aclocal -I ../m4). * ../../libs/t1lib/t1lib.ac: Fixed a typo. * configure: Regenerated (autoconf). xdvik-ja-22.84.16-j1.40/texk/xdvik/BUGS0000664000175000017500000000536210363262237016660 0ustar uwabamiuwabami For an up-to-date list of bugs, please visit: http://sourceforge.net/tracker/?group_id=23164&atid=377580 This file records only bugs that have been tagged as `Wont fix' or `Later', i.e. bugs that couldn't be resolved so far. Please report new bugs to the above SourceForge URL, including as much information as possible (whatever may be relevant: platform, compiler, X version, output of xdpyinfo, sample .dvi file to reproduce the problem; see also: http://xdvi.sourceforge.net/#bugs). (A) X interface bugs: (A1) The current code to toggle to/from fullscreen mode via Ctrl-l, and to remove the Xaw scrollbars for expert mode is an atrocious hack that won't work with many window managers (see e.g. #814327). These should be fixed by someone who knows X better than I do. (A2) The correct handling of XtAppAddTimeOut() and friends, used e.g. internally by many Motif widgets, depends on xdvi redefining the XtAppAddTimeOut() and related functions to use its own non-standard event handling routines. If this is not possible (e.g. because your linker doesn't allow multiple definitions - check for the corresponding warnings by ./configure), some of the widgets (e.g. the print log window, tooltips, statusline messages, hyperlink location markers) will not appear correctly or will only be updated when the mouse is moved. (A3) Motif: Toggle buttons in print dialog (page range) may fail under certain circumstances when button has been changed via marking pages. (For details, see comment in gui/print-dialog.c, notify_dialog()). (A4) Motif 1.2: After opening a document at page 1 and changing to page 2, an partial area of the highlighting of page 1 is not erased (#997080). (A5) Ctrl-l and the `fullscreen' option are hacks that may interact badly with certain window managers (e.g. KDE; see #815020). In such cases it's better to use the window manager's functions to enable fullscreen mode. (A6) Xaw: The page list scroll area (viewport) is not resized when switching to a file with longer page numbers (e.g. from 2-digit ones to 5-digit ones). (B) Known features: (B1) Controll of font/file generation by X-resource and commandline is overridden by controll by environment variable/texmf.cnf setting. This is a design decision in kpathsea; if you want it to be resource/commandline controlled, make sure there is no setting in the environment or texmf.cnf. (B2) Some of the optional compilation stuff (e.g. display postscript) hasn't been tested for quite some time and may be broken. (C) Autoconfigure issues: (C1) GS_PATH cannot be set except by CFLAGS=-DGS_PATH=... Paul has a macro for this. Must be compatible with kpathsea, but I haven't checked this yet. xdvik-ja-22.84.16-j1.40/texk/xdvik/my-vsnprintf.c0000664000175000017500000000661211032450154021003 0ustar uwabamiuwabami/*------------------------------------------------------------ written by Stefan Ulrich 2001/02/25 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------*/ #include #include #include "xdvi-config.h" #include "xdvi.h" #include "my-vsnprintf.h" #if !HAVE_VSNPRINTF || !HAVE_GOOD_VSNPRINTF /*------------------------------------------------------------ * my_vsnprintf - emulation of glibc2.1 vsnprintf, use if * vsnprintf is not available * * Arguments: * char *buf - buffer to print string into * int len - print only len characters of * char *format - format string * va_list argp - variable argument list * * Returns: * int size - number of characters that would have been * written if enough space had been available * * Purpose: * Implementation of GNU's vsnprintf using POSIX pipes (less * portable and much slower than the original, but also much * easier to implement ;-): * Print the formatted string to a pipe and read back * at most len-1 characters, appending a '\0' at the end. *------------------------------------------------------------*/ int my_vsnprintf(char *buf, size_t len, const char *format, va_list argp) { int pipe_fd[2]; FILE *fd; int size; #ifdef DEBUG printf("=============my_vsnprintf called!\n"); #endif if (len > 0) { len--; /* for the trailing '\0' */ } /* create a pipe for reading/writing */ if (xpipe(pipe_fd) == -1) { perror("my_vsnprintf: pipe"); xdvi_exit(EXIT_FAILURE); } if ((fd = try_fdopen(pipe_fd[1], "w")) == NULL) { perror("my_vsnprintf: fdopen"); xdvi_exit(EXIT_FAILURE); } /* instead of setting fd to non-buffering: setvbuf(fd, NULL, _IONBF, BUFSIZ); flush it explicitly: */ size = vfprintf(fd, format, argp); fflush(fd); /* according to C99, buf may be NULL, in which case just return correct number of chars. Also, don't write anything if there had been an output error. */ if (buf != NULL && size >= 0) { /* wrote less characters than len -> adjust len for the subsequent read */ if ((size_t)size < len) { len = size; } read(pipe_fd[0], buf, len); buf[len] = '\0'; /* always null-terminate */ } fclose(fd); close(pipe_fd[0]); close(pipe_fd[1]); return size; } #endif /* !HAVE_VSNPRINTF || !HAVE_GOOD_VSNPRINTF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/configure.ac0000664000175000017500000002613511720674650020470 0ustar uwabamiuwabamidnl Process this file with autoconf to produce a configure script. dnl dnl Copyright (C) 2009-2012 Peter Breitenlohner dnl dnl This file is free software; the copyright holder dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl m4_define([xdvik_version], [22.84.16]) AC_INIT([xdvik for TeX Live], xdvik_version, [tex-k@tug.org]) AC_PREREQ([2.65]) AC_CONFIG_SRCDIR([xdvi.c]) AC_CONFIG_AUX_DIR([../../build-aux]) AC_CONFIG_MACRO_DIR([../../m4]) dnl Common code for all programs using libkpathsea. KPSE_COMMON([xdvik]) KPSE_CANONICAL_HOST dnl Include additional code for xdvik. m4_include([ac/xdvik.ac]) # Reduce compiler warnings, there are just too many. WARNING_CFLAGS=`echo $WARNING_CFLAGS | sed -e 's/ -Wcast-qual/ /' -e 's/ -Wwrite-strings/ /'` AC_SEARCH_LIBS([pow], [m]) AC_ARG_WITH([ps], AS_HELP_STRING([--with-ps=PS], [Use PostScript (PS=no/yes/gs/dps/news, default gs)])) AS_CASE([$with_ps], ["" | yes | gs], [PS_DEF=-DPS_GS], [no], [PS_DEF=], [dps], [PS_DEF=-DPS_DPS], [news], [PS_DEF=-DPS_NEWS], [AC_MSG_WARN([unknown--with-ps argument `$with_ps'; using gs.]) PS_DEF=-DPS_GS]) AC_SUBST([PS_DEF]) dnl Required, not optional. dnl AC_ARG_ENABLE([grey], dnl AS_HELP_STRING([--disable-grey], dnl [Disable greyscale anti-aliasing for shrunken bitmaps])) AC_DEFINE([GREY], 1, [Define to enable greyscale anti-aliasing for shrunken bitmaps.]) dnl Required, not optional. dnl AC_ARG_ENABLE([color], dnl AS_HELP_STRING([--disable-color], dnl [Disable support for color specials])) AC_DEFINE([COLOR], 1, [Define to enable support for color specials.]) dnl OBSOLETE AC_ARG_ENABLE([buttons], dnl OBSOLETE AS_HELP_STRING([--disable-buttons], dnl OBSOLETE [Disable buttons on the side of the window])) dnl OBSOLETE AC_DEFINE([BUTTONS], 1, [Define to enable buttons on the side of the window.]) dnl OBSOLETE AC_ARG_ENABLE([statusline], dnl OBSOLETE AS_HELP_STRING([--disable-statusline], dnl OBSOLETE [Disable statusline at bottom of window])) dnl OBSOLETE AC_DEFINE([STATUSLINE], 1, [Define to enable statusline at bottom of window.]) dnl Required, not optional. dnl AC_ARG_ENABLE([t1lib], dnl AS_HELP_STRING([--disable-t1lib], dnl [Do not use T1lib (direct rendering of Type1 fonts)])) AC_DEFINE([T1LIB], 1, [Define to compile in t1lib.]) dnl OBSOLETE AC_ARG_ENABLE([gf], dnl OBSOLETE AS_HELP_STRING([--enable-gf], dnl OBSOLETE [Enable gf format pixel files (in addition to pk)])) dnl OBSOLETE AC_DEFINE([USE_GF], 1, [Define to enable gf format files (in addition to pk format).]) AC_ARG_ENABLE([a4], AS_HELP_STRING([--disable-a4], [Set default paper size to letter and default unit to inch])) AS_IF([test "x$enable_a4" = xno], [AC_MSG_NOTICE([Disabled a4/cm, using letter/in instead])], [AC_DEFINE([A4], 1, [Define to use A4 as the default paper size.])]) AC_CONFIG_HEADERS([c-auto.h:c-auto.in]) AC_FUNC_FORK AC_FUNC_VPRINTF XDVI_FUNC_WORKING_VSNPRINTF XDVI_FUNC_MEMICMP AC_FUNC_ALLOCA AC_C_STRINGIZE AC_FUNC_MEMCMP AC_HEADER_SYS_WAIT AC_TYPE_SIGNAL AC_C_BIGENDIAN AC_PATH_XTRA dnl XDVI checks by Paul Vojta XDVI_FUNC_SETSID_IN_VFORK XDVI_C_BITMAP_TYPE XDVI_SYS_STREAMS XDVI_SYS_OLD_LINUX XDVI_FUNC_POLL dnl ####### dnl COMPILER_WARNINGS dnl ####### # Check for `--allow-multiple-definition' linker flag XDVI_LINKER_MULTIPLE_DEFNS AC_CHECK_HEADERS([stdint.h inttypes.h]) AC_TYPE_UINT32_T AC_CHECK_TYPE([ptrdiff_t], [], [AC_DEFINE_UNQUOTED([ptrdiff_t], [long], [Define to `long' if does not define.])]) AC_CHECK_FUNCS([mkstemp memcpy strerror waitpid sigaction strchr setenv ulltostr \ fchdir getcwd getpwnam getuid getpwuid \ lstat ftruncate snprintf vsnprintf realpath]) # is for ISC 4.0, to define fd_set in psgs.c. # regex.h is needed for regexp support in DVI search. AC_CHECK_HEADERS([netdb.h sys/bsdtypes.h sys/param.h unistd.h sys/fcntl.h regex.h]) # Checks for iconv XDVI_CHECK_ICONV # Checks for langinfo XDVI_CHECK_LANGINFO # Check X11 headers. xdvi_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $X_CFLAGS" AC_CHECK_HEADERS([X11/Intrinsic.h X11/Xosdefs.h X11/xpm.h Xm/XpmP.h]) # For editres, we need to check both the header and define a linker option. AC_CHECK_HEADERS([X11/Xmu/Editres.h X11/Xmu/Xmu.h], [x_xmu_lib=-lXmu], [x_xmu_lib=], [#ifdef HAVE_X11_INTRINSIC_H # include #endif]) AC_SUBST([x_xmu_lib]) CPPFLAGS=$xdvi_save_CPPFLAGS AC_ARG_ENABLE([magick], AS_HELP_STRING([--enable-magick], [Use ImageMagick to load/render image files. EXPERIMENTAL - DO NOT USE!])) if test "x$enable_magick" = xyes; then AC_MSG_CHECKING([for ImageMagick version]) if MAGICK_VER=`Magick-config --version 2>/dev/null`; then AC_MSG_RESULT([$MAGICK_VER]) set dummy `echo $MAGICK_VER | sed -e 's/\./ /g'` MAGICK_VER_MAJOR=$2 MAGICK_VER_MINOR=$3 if expr $MAGICK_VER_MAJOR \> 4 >/dev/null && \ (expr $MAGICK_VER_MAJOR \> 5 >/dev/null || \ expr $MAGICK_VER_MINOR \> 2 >/dev/null); then MAGICK_CPP="-DMAGICK_VER_MAJOR=$MAGICK_VER_MAJOR -DMAGICK_VER_MINOR=$MAGICK_VER_MINOR `Magick-config --cppflags`" MAGICK_LD="`Magick-config --libs` `Magick-config --ldflags`" AC_MSG_NOTICE([ImageMagick support enabled]) X_CFLAGS="$X_CFLAGS $MAGICK_CPP" X_EXTRA_LIBS="$X_EXTRA_LIBS $MAGICK_LD" AC_DEFINE([MAGICK], 1, [Define to use ImageMagick]) else AC_MSG_NOTICE([ImageMagick version too old - disabled]) fi else AC_MSG_RESULT([cannot run 'Magick-config' - ImageMagick support disabled]) fi fi # Check whether -lXpm can be used XDVI_FIND_XPM # Check for libXext. AS_IF([test -n "$x_libraries"], [XLFLAG="-L$x_libraries"], [XLFLAG=]) if test -z "$x_ext_lib"; then # allow envvar override AC_CHECK_LIB([Xext], [XextCreateExtension], [x_ext_lib='-lXext'], [], [-lX11 $X_EXTRA_LIBS $XLFLAG]) fi AC_SUBST([x_ext_lib]) # Check for libXp. # Although libXp is now defunct (no longer part of XOrg), older versions # of libXm may need to link with libXp; same for the equally defunct libXaw8. # We certainly don't want to include libXp unless necessay, since this might # only perpetuate the need to keep libXp.so around. # Moreover for ELF shared libraries a requirement for libXp.so is probably # encoded into libXm.so and/or libXaw.so and need not be specified explicitly. AC_CHECK_LIB([Xp], [XpQueryVersion], [x_xp_lib='-lXp'], [], [$x_ext_lib -lX11 $X_EXTRA_LIBS $XLFLAG]) if test "x$enable_build" != xno || test -f config.force; then # Check which toolkit was specified AS_CASE([$with_xdvi_x_toolkit], [next | nextaw | neXtaw], [val=neXtaw], [xaw3d], [val=xaw3d], ["" | x | xa | xaw], [val=xaw], [y | ye | yes], [val=yes], [m | mo | mot | moti | motif], [val=motif], [AC_MSG_WARN([unknown --with-xdvi-x-toolkit argument `$with_xdvi_x_toolkit'; using xaw.]) val=xaw]) with_xdvi_x_toolkit=$val if test "x$with_xdvi_x_toolkit" = xxaw3d; then prog_extension="xaw3d" x_tool_libs="-lXaw3d" elif test "x$with_xdvi_x_toolkit" = xneXtaw; then prog_extension="nextaw" x_tool_libs="-lneXtaw" else # Check for Xaw headers and library version XDVI_CHECK_XAW_HEADERS if test "x$with_xdvi_x_toolkit" != xxaw; then if test "x$with_xdvi_x_toolkit" = xmotif; then # Requested motiv default_toolkit=none else # Requested motiv with Xaw as fallback default_toolkit=Xaw fi XDVI_FIND_MOTIF fi if test "x$with_xdvi_x_toolkit" = xxaw; then # Requested or fallback to Xaw, check for library XDVI_CHECK_XAW_LIBRARY fi fi AC_SUBST([x_tool_libs]) final_exec_name="xdvi-$prog_extension" program_transform_name="'s,xdvi-bin,$final_exec_name,'" AC_SUBST([final_exec_name]) dnl ####### dnl $program_transform_name replacement dnl ####### # If we're on Solaris and we want DPS, then add the extra compilation stuff # to get it. if echo "$PS_DEF" | grep PS_DPS >/dev/null; then if test "`(uname) 2>/dev/null`" = SunOS \ && uname -r | grep '^5' >/dev/null; then AC_MSG_NOTICE([adding DPS includes and libraries for Solaris]) X_CFLAGS="$X_CFLAGS -I/usr/openwin/include/X11" X_LIBS="$X_LIBS -R/usr/openwin/lib /usr/openwin/lib/libdps.so $ac_sunmath" AC_CHECK_LIB([sunmath], [isinf], [X_LIBS="$X_LIBS -lsunmath"]) dnl We only need isinf and ieeefp.h to work around a Solaris bug in dnl -ldps; see psdps.c. isinf is in -lsunmath. AC_CHECK_FUNCS([isinf]) AC_CHECK_HEADERS([ieeefp.h]) else dnl SunOS 4.x is simpler. AC_MSG_NOTICE([adding DPS libraries for SunOS 4.x]) X_LIBS="$X_LIBS -ldps" fi elif echo "$PS_DEF" | grep PS_NEWS >/dev/null; then AC_MSG_NOTICE([adding NeWS libraries]) X_LIBS="$X_LIBS -lxview -lcps -lolgx -lxvps" fi KPSE_KPATHSEA_FLAGS KPSE_T1LIB_FLAGS KPSE_ADD_FLAGS([kpathsea]) KPSE_CHECK_KPSE_FORMAT([enc], [], [AC_MSG_ERROR([your kpathsea has no kpse_enc_format.])]) AC_CHECK_HEADER([kpathsea/version.h], [], [AC_MSG_ERROR([Sorry, kpathsea too old])]) KPSE_RESTORE_FLAGS echo timestamp >config.force fi AC_ARG_WITH([default-dvips-path], AS_HELP_STRING([--with-default-dvips-path=CMD], [Use CMD as default DVI to PS converter]), , [with_default_dvips_path="dvips"]) AC_DEFINE_UNQUOTED([DEFAULT_DVIPS_PATH], ["$with_default_dvips_path"], [Define to point to the default command to use for printing (optional).]) AC_ARG_WITH([default-ps2pdf-path], AS_HELP_STRING([--with-default-ps2pdf-path=CMD], [Use CMD as default PS to PDF converter]), , [with_default_ps2pdf_path="ps2pdf"]) AC_DEFINE_UNQUOTED([DEFAULT_PS2PDF_PATH], ["$with_default_ps2pdf_path"], [Define to point to the default command to use for printing (optional).]) XDVIK_VERSION=xdvik_version AC_SUBST([XDVIK_VERSION]) AC_CONFIG_SUBDIRS([squeeze]) AC_CONFIG_FILES([Makefile tests/Makefile]) AC_CONFIG_FILES([xdvi:xdvi-sh.in], [chmod +x xdvi]) dnl The subdirectory squeeze must be configured for the build system. dnl When cross compiling, can not share the cache file with the subdirectory! AC_CONFIG_COMMANDS_POST([AS_IF([test "x$cross_compiling" = xyes], [cache_file=/dev/null ac_configure_args="$ac_configure_args --host='$kpse_build_alias' \ CC='$BUILDCC' CPPFLAGS='$BUILDCPPFLAGS'\ CFLAGS='$BUILDCFLAGS' LDFLAGS='$BUILDLDFLAGS'"])]) AC_OUTPUT xdvik-ja-22.84.16-j1.40/texk/xdvik/tfmload.h0000664000175000017500000000245310363262237017772 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef TFMLOAD_H_ #define TFMLOAD_H_ #ifdef T1LIB extern int fallbacktfm; extern Boolean tfmload(const char *, long *, long *, long *); #endif #endif /* TFMLOAD_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/psnews.h0000664000175000017500000000233510363262237017662 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef PSNEWS_H_ #define PSNEWS_H_ extern Boolean initNeWS(void); #endif /* PSNEWS_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/dvi.h0000664000175000017500000000216410363262237017125 0ustar uwabamiuwabami/* * Mnemonics for bytes in dvi file. */ #define SETCHAR0 0 #define SET1 128 #define SET2 129 #define SETRULE 132 #define PUT1 133 #define PUT2 134 #define PUTRULE 137 #define NOP 138 #define BOP 139 #define EOP 140 #define PUSH 141 #define POP 142 #define RIGHT1 143 #define RIGHT2 144 #define RIGHT3 145 #define RIGHT4 146 #define W0 147 #define W1 148 #define W2 149 #define W3 150 #define W4 151 #define X0 152 #define X1 153 #define X2 154 #define X3 155 #define X4 156 #define DOWN1 157 #define DOWN2 158 #define DOWN3 159 #define DOWN4 160 #define Y0 161 #define Y1 162 #define Y2 163 #define Y3 164 #define Y4 165 #define Z0 166 #define Z1 167 #define Z2 168 #define Z3 169 #define Z4 170 #define FNTNUM0 171 #define FNT1 235 #define FNT2 236 #define FNT3 237 #define FNT4 238 #define XXX1 239 #define XXX2 240 #define XXX3 241 #define XXX4 242 #define FNTDEF1 243 #define FNTDEF2 244 #define FNTDEF3 245 #define FNTDEF4 246 #define PRE 247 #define POST 248 #define POSTPOST 249 #define SREFL 250 #define EREFL 251 #define TRAILER 223 /* Trailing bytes at end of file */ xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/0000775000175000017500000000000011730170101016472 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-func-memicmp.m40000664000175000017500000000164211174354211022277 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 2002 - 2009 Stefan Ulrich # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_FUNC_MEMICMP # ----------------- # Check for memicmp(), which some installations have in . AC_DEFUN([XDVI_FUNC_MEMICMP], [AC_CACHE_CHECK([for memicmp], [xdvi_cv_memicmp], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[(void)memicmp((char *)NULL, (char *)NULL, 0);]])], [xdvi_cv_memicmp=yes], [xdvi_cv_memicmp=no])]) if test "x$xdvi_cv_memicmp" = xyes; then AC_DEFINE([HAVE_MEMICMP], 1, [Define if the memicmp() function is in ]) fi ]) # XDVI_FUNC_MEMICMP xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-check-xaw.m40000664000175000017500000000523211276240141021567 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 2003 - 2009 Stefan Ulrich # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_CHECK_XAW_HEADERS # ---------------------- # Check for Xaw headers and library version. AC_DEFUN([XDVI_CHECK_XAW_HEADERS], [save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $X_CFLAGS" AC_CACHE_CHECK([for Xaw headers], [xdvi_cv_xaw_headers], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include #include #include #include #include #include ]])], [xdvi_cv_xaw_headers=yes], [xdvi_cv_xaw_headers=no])]) xdvi_have_xaw=$xdvi_cv_xaw_headers # if test "x$xdvi_have_xaw" = xyes; then _XDVI_CHECK_XAW_VERSION fi CPPFLAGS=$save_CPPFLAGS ]) # XDVI_CHECK_XAW_HEADERS # _XDVI_CHECK_XAW_VERSION # ----------------------- # Check Xaw version. m4_define([_XDVI_CHECK_XAW_VERSION], [AC_CHECK_MEMBER([SimpleClassPart.extension], [], [AC_DEFINE([HAVE_OLD_XAW], 1, [Define if you have an old version of the Xaw library])], [[ #include #include #include #include #include #include ]]) ]) # _XDVI_CHECK_XAW_VERSION # XDVI_CHECK_XAW_LIBRARY # ---------------------- # Check for Xaw library. # If found, set prog_extension and x_tool_libs, and define XAW. AC_DEFUN([XDVI_CHECK_XAW_LIBRARY], [AC_REQUIRE([XDVI_CHECK_XAW_HEADERS]) if test "x$xdvi_have_xaw" = xyes; then # First try without libXp AC_CHECK_LIB([Xaw], [XawInitializeWidgetSet], [x_tool_libs="-lXaw"], [# libXaw without libXp failed if test "x$x_xp_lib" = x; then xdvi_have_xaw=no else # Now try with libXp AC_CHECK_LIB([Xaw], [XawTextReplace], [x_tool_libs="-lXaw $x_xp_lib"], [xdvi_have_xaw=no], [$x_xp_lib $x_xmu_lib -lXt $X_PRE_LIBS $x_ext_lib $x_xpm_libs -lX11 $X_EXTRA_LIBS $XLFLAG]) fi], [$x_xmu_lib -lXt $X_PRE_LIBS $x_ext_lib $x_xpm_libs -lX11 $X_EXTRA_LIBS $XLFLAG]) fi if test "x$xdvi_have_xaw" = xyes; then prog_extension="xaw" AC_DEFINE([XAW], 1, [Define to use the Xaw toolkit.]) else AC_MSG_ERROR([Sorry, you will need at least the Xaw header/library files to compile xdvik.]) fi ]) # XDVI_CHECK_XAW_LIBRARY xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-func-working-vsnprintf.m40000664000175000017500000000254111174354211024356 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 2000 - 2009 Stefan Ulrich # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_FUNC_WORKING_VSNPRINTF # --------------------------- # Check for a working implementation of (v)snprintf() # which should either return a negative result or the size actually needed # (latter is C99 standard). AC_DEFUN([XDVI_FUNC_WORKING_VSNPRINTF], [AC_CACHE_CHECK([for a working implementation of (v)snprintf()], [xdvi_cv_func_good_vsnprintf], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #ifdef IRIX #define _XOPEN_SOURCE 500 #endif #include ]], [[char s[2]; int retval = snprintf(s, 2, "test"); if (retval > -1 && retval != 4) /* neither negative nor desired size, not OK */ return 1;]])], [xdvi_cv_func_good_vsnprintf=yes], [xdvi_cv_func_good_vsnprintf=no], [xdvi_cv_func_good_vsnprintf=no # safe value for cross-compiling])]) if test "x$xdvi_cv_func_good_vsnprintf" = xyes; then AC_DEFINE([HAVE_GOOD_VSNPRINTF], 1, [Define if the vsnprintf function works.]) fi ]) # XDVI_FUNC_WORKING_VSNPRINTF xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-find-xpm.m40000664000175000017500000001611311176327627021455 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 2001 - 2009 Marcin Dalecki # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_FIND_XPM # ------------- # Put Xpm include directory in xpm_includes, # put Xpm library directory in xpm_libraries, # define x_xpm_libs, # and add appropriate flags to X_CFLAGS and X_LIBS. AC_DEFUN([XDVI_FIND_XPM], [AC_REQUIRE([AC_PATH_XTRA]) AC_ARG_WITH([xpm], AS_HELP_STRING([--without-xpm], [Do not use the Xpm library (will disable the toolbar)]))[]dnl AC_ARG_WITH([xpm-includes], AS_HELP_STRING([--with-xpm-include=DIR], [Specify the location of Xpm include files]), [xpm_includes=$withval], [xpm_includes=])[]dnl AC_ARG_WITH([xpm-libraries], AS_HELP_STRING([--with-xpm-libdir=DIR], [Specify the location of Xpm libraries]), [xpm_libraries=$withval], [xpm_libraries=])[]dnl dnl Treat --without-xpm like dnl --without-xpm-includes --without-xpm-libraries. if test "x$with_xpm" = xno; then xpm_includes=no xpm_libraries=no fi AC_MSG_CHECKING([for Xpm]) # # Check the headers. # if test "x$xpm_includes" = x; then _XDVI_FIND_XPM_INCLUDES fi if test "x$xpm_includes" = xdefault; then AC_DEFINE([HAVE_X11_XPM_H], 1, [Define if you have the header file.]) elif test -f "$xpm_includes/X11/xpm.h"; then AC_DEFINE([HAVE_X11_XPM_H], 1) elif test -f "$xpm_includes/xpm.h"; then AC_DEFINE([HAVE_XPM_H], 1, [Define if you have the header file (not in X11, e.g. Solaris 5.8).]) fi # # Add Xpm definition to X_CFLAGS (and remember previous value) # xdvi_xpm_save_X_CFLAGS=$X_CFLAGS if test "x$xpm_includes" != xdefault \ && test "x$xpm_includes" != "x$x_includes" && test "x$xpm_includes" != xno then X_CFLAGS="-I$xpm_includes $X_CFLAGS" fi # # Check the libraries. # if test "x$xpm_libraries" = x; then _XDVI_FIND_XPM_LIBRARIES fi # # Report the results of headers and libraries. # xdvi_use_xpm=yes # # xpm_libraries_result=$xpm_libraries if test "x$xpm_libraries_result" = xdefault; then xpm_libraries_result="in default path" elif test "x$xpm_libraries_result" = xno; then xpm_libraries_result="(none)" xdvi_use_xpm=no fi # xpm_includes_result=$xpm_includes if test "x$xpm_includes_result" = xdefault; then xpm_includes_result="in default path" elif test "x$xpm_includes_result" = xno; then xpm_includes_result="(none)" xdvi_use_xpm=no fi # AC_MSG_RESULT([libraries $xpm_libraries_result, headers $xpm_includes_result]) # if test "x$xdvi_use_xpm" = xyes; then # # Add Xpm definition to X_LIBS # if test "x$xpm_libraries" != xdefault \ && test "x$xpm_libraries" != "x$x_libraries" && test "x$xpm_libraries" != xno then case "$X_LIBS" in *-R\ *) X_LIBS="-L$xpm_libraries -R $xpm_libraries $X_LIBS";; *-R*) X_LIBS="-L$xpm_libraries -R$xpm_libraries $X_LIBS";; *) X_LIBS="-L$xpm_libraries $X_LIBS";; esac fi # AC_DEFINE([USE_XPM], 1, [Define if you want to use the Xpm library]) x_xpm_libs="-lXpm" else # Restore previous X_CFLAGS X_CFLAGS=$xdvi_xpm_save_X_CFLAGS AC_DEFINE([USE_XPM], 0) x_xpm_libs= fi AC_SUBST([x_xpm_libs]) ]) # XDVI_FIND_XPM # _XDVI_FIND_XPM_INCLUDES # ----------------------- # Search the Xpm include files. # They can either be in (as in X11R6), which is dealt with # by AC_CHECK_HEADERS([X11/xpm.h]), # or in if installed locally; this is what this test is for. m4_define([_XDVI_FIND_XPM_INCLUDES], [AC_CACHE_VAL([xdvi_cv_xpm_includes], [xdvi_xpm_save_CFLAGS=$CFLAGS xdvi_xpm_save_CPPFLAGS=$CPPFLAGS # CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" # AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int a;]])], [# X11/xpm.h is in the standard search path. xdvi_cv_xpm_includes=default], [# X11/xpm.h is not in the standard search path. xdvi_cv_xpm_includes=no # Locate it and put its directory in `xpm_includes' # # /usr/include/Motif* are used on HP-UX (Motif). # /usr/include/X11* are used on HP-UX (X and Xaw). # /usr/dt is used on Solaris (Motif). # /usr/openwin is used on Solaris (X and Xaw). # Other directories are just guesses. for dir in "$x_includes" "${prefix}/include" /usr/include /usr/local/include \ /usr/X11/include /usr/X11R5/include /usr/X11R6/include \ /usr/include/Motif2.0 /usr/include/Motif1.2 /usr/include/Motif1.1 \ /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 \ /usr/dt/include /usr/openwin/include \ /usr/dt/*/include /opt/*/include /usr/include/Motif* \ "${prefix}"/*/include /usr/*/include /usr/local/*/include \ "${prefix}"/include/* /usr/include/* /usr/local/include/* do if test -f "$dir/X11/xpm.h"; then xdvi_cv_xpm_includes=$dir break elif test -f "$dir/xpm.h"; then xdvi_cv_xpm_includes=$dir break fi done]) # CFLAGS=$xdvi_xpm_save_CFLAGS CPPFLAGS=$xdvi_xpm_save_CPPFLAGS]) # xpm_includes=$xdvi_cv_xpm_includes ]) # _XDVI_FIND_XPM_INCLUDES # _XDVI_FIND_XPM_LIBRARIES # ------------------------ # Search the Xpm library. m4_define([_XDVI_FIND_XPM_LIBRARIES], [AC_CACHE_VAL([xdvi_cv_xpm_libraries], [xdvi_xpm_save_LIBS=$LIBS xdvi_xpm_save_CFLAGS=$CFLAGS xdvi_xpm_save_CPPFLAGS=$CPPFLAGS xdvi_xpm_save_LDFLAGS=$LDFLAGS # LIBS="$X_PRE_LIBS -lXpm -lXt -lX11 $X_EXTRA_LIBS $LIBS" CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" LDFLAGS="$X_LIBS $LDFLAGS" # # We use XtToolkitInitialize() here since it takes no arguments # and thus also works with a C++ compiler. AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include #include ]], [[XtToolkitInitialize();]])], [# libxpm.a is in the standard search path. xdvi_cv_xpm_libraries=default], [# libXpm.a is not in the standard search path. xdvi_cv_xpm_libraries=no # Locate it and put its directory in `xpm_libraries' # # /usr/lib/Motif* are used on HP-UX (Motif). # /usr/lib/X11* are used on HP-UX (X and Xpm). # /usr/dt is used on Solaris (Motif). # /usr/openwin is used on Solaris (X and Xpm). # Other directories are just guesses. for dir in "$x_libraries" "${prefix}/lib" /usr/lib /usr/local/lib \ /usr/lib/Motif2.0 /usr/lib/Motif1.2 /usr/lib/Motif1.1 \ /usr/lib/X11R6 /usr/lib/X11R5 /usr/lib/X11R4 /usr/lib/X11 \ /usr/dt/lib /usr/openwin/lib \ /usr/dt/*/lib /opt/*/lib /usr/lib/Motif* \ "${prefix}"/*/lib /usr/*/lib /usr/local/*/lib \ "${prefix}"/lib/* /usr/lib/* /usr/local/lib/* do if test -d "$dir" && test "`ls $dir/libXpm.* 2> /dev/null`" != ""; then xdvi_cv_xpm_libraries=$dir break fi done]) # LIBS=$xdvi_xpm_save_LIBS CFLAGS=$xdvi_xpm_save_CFLAGS CPPFLAGS=$xdvi_xpm_save_CPPFLAGS LDFLAGS=$xdvi_xpm_save_LDFLAGS]) # xpm_libraries="$xdvi_cv_xpm_libraries"]) # _XDVI_FIND_XPM_LIBRARIES xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-check-iconv.m40000664000175000017500000001064111376607274022125 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 2009, 2010 Peter Breitenlohner # Copyright (C) 2004 - 2009 Stefan Ulrich # ???? or maybe earlier Copyright by Paul Vojta ?? # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_CHECK_ICONV # ---------------- # Check for iconv(), , and for type of iconv() input argument. AC_DEFUN([XDVI_CHECK_ICONV], [ AC_ARG_WITH([iconv], [AS_HELP_STRING([--with-iconv], [Use an iconv library @<:@default=check@:>@])], [], [with_iconv=check])dnl dnl AC_ARG_WITH([iconv-include], AS_HELP_STRING([--with-iconv-include=DIR], [Specify the location of header]))[]dnl AC_ARG_WITH([iconv-libdir], AS_HELP_STRING([--with-iconv-libdir=DIR], [Specify the location of iconv (-liconv or -lrecode) library]))[]dnl AS_CASE([$with_iconv_include], [yes | no | ""], [iconv_includes=], [iconv_includes="-I$with_iconv_include"]) AS_CASE([$with_iconv_libdir], [yes | no | ""], [iconv_libpath=], [iconv_libpath="-L$with_iconv_libdir"]) dnl AS_IF([test "x$with_iconv" != xno], [xdvi_iconv_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$iconv_includes $CPPFLAGS" AC_CHECK_HEADERS([iconv.h]) # Check if -liconv or -lrecode is needed for iconv() _XDVI_ICONV_LIB if test "x$xdvi_cv_search_iconv" != xno; then if test "x$xdvi_cv_search_iconv" = "xnone required"; then iconv_libs= else iconv_libs=$xdvi_cv_search_iconv fi AC_DEFINE([HAVE_ICONV], 1, [Define to 1 if you have the `iconv' function.]) if test "x$ac_cv_header_iconv_h" = xyes; then _XDVI_ICONV_CHAR_PPTR_TYPE fi fi CPPFLAGS=$xdvi_iconv_save_CPPFLAGS ])dnl AC_SUBST([iconv_includes]) AC_SUBST([iconv_libpath]) AC_SUBST([iconv_libs]) ]) # XDVI_CHECK_ICONV # _XDVI_ICONV_LIB # --------------- # Check for library containing iconv(), could be -liconv or -lrecode. # Much like AC_SEARCH_LIBS([iconv], [iconv recode]), # but needs to '#include '. m4_define([_XDVI_ICONV_LIB], [AC_CACHE_CHECK([for library containing iconv], [xdvi_cv_search_iconv], [ xdvi_iconv_save_LDFLAGS=$LDFLAGS xdvi_iconv_save_LIBS=$LIBS LDFLAGS="$iconv_libpath $LDFLAGS" AC_LANG_CONFTEST([AC_LANG_PROGRAM([[#include #include ]], [[iconv_t cd = iconv_open("","");]])]) xdvi_cv_search_iconv=no for xdvi_lib in "" -liconv -lrecode; do LIBS="$xdvi_lib $xdvi_iconv_save_LIBS" AC_LINK_IFELSE([], [xdvi_cv_search_iconv=$xdvi_lib break]) done test "x$xdvi_cv_search_iconv" = x && xdvi_cv_search_iconv="none required" LDFLAGS=$xdvi_iconv_save_LDFLAGS LIBS=$xdvi_iconv_save_LIBS]) ]) # _XDVI_ICONV_LIB # _XDVI_ICONV_CHAR_PPTR_TYPE # -------------------------- # Check whether iconv takes a 'const char **' or a 'char **' input argument. # According to IEEE 1003.1, `char **' is correct, but e.g. librecode # uses `const char **'. # Inspired by Autoconf's AC_FUNC_SELECT_ARGTYPES we do this without the need # to run a test program or to use C++. m4_define([_XDVI_ICONV_CHAR_PPTR_TYPE], [AC_CACHE_CHECK([for iconv input type], [xdvi_cv_iconv_char_pptr_type], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ /* iconv() definitions may differ depending on following macros ... */ #ifdef __hpux /* On HP-UX 10.10 B and 20.10, compiling with _XOPEN_SOURCE + ..._EXTENDED * leads to poll() not realizing that a file descriptor is writable in psgs.c. */ # define _HPUX_SOURCE 1 #else # ifndef _XOPEN_SOURCE # define _XOPEN_SOURCE 600 # endif # define _XOPEN_SOURCE_EXTENDED 1 # define __EXTENSIONS__ 1 /* needed to get struct timeval on SunOS 5.5 */ # define _SVID_SOURCE 1 /* needed to get S_IFLNK in glibc */ # define _BSD_SOURCE 1 /* needed to get F_SETOWN in glibc-2.1.3 */ #endif #include ]], [[extern size_t iconv(iconv_t, char **, size_t *, char**, size_t*);]])], [xdvi_cv_iconv_char_pptr_type='char **'], [xdvi_cv_iconv_char_pptr_type='const char **'])]) AC_DEFINE_UNQUOTED([ICONV_CHAR_PPTR_TYPE], [$xdvi_cv_iconv_char_pptr_type], [Define the type of the iconv input string (char ** or const char **)]) ]) # _XDVI_ICONV_CHAR_PPTR_TYPE xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-sys-old-linux.m40000664000175000017500000000166611174354211022454 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 2001 - 2009 Paul Vojta # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_SYS_OLD_LINUX # ------------------ # Check for certain broken versions of Linux. AC_DEFUN([XDVI_SYS_OLD_LINUX], [AC_CACHE_CHECK([for certain old versions of Linux], [xdvi_cv_sys_old_linux], [AS_CASE(["`(uname -sr) 2>/dev/null`"], [["Linux 2."[01].* | "Linux 2.2."[0-8] | "Linux 2.2."[0-8]-*]], [xdvi_cv_sys_old_linux=yes], [xdvi_cv_sys_old_linux=no])]) if test "x$xdvi_cv_sys_old_linux" = xyes; then AC_DEFINE([FLAKY_SIGPOLL], 1, [Define if you are using Linux 2.1.xxx -- 2.2.8, or if you find it necessary.]) fi ]) # XDVI_SYS_OLD_LINUX xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-sys-streams.m40000664000175000017500000000166611174354211022217 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 1999 - 2009 Paul Vojta # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_SYS_STREAMS # ---------------- # Check for at-least-pretend Streams capability. AC_DEFUN([XDVI_SYS_STREAMS], [AC_CACHE_CHECK([for stropts.h and isastream()], [xdvi_cv_sys_streams], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[#ifndef I_SETSIG choke me #else isastream(0); #endif]])], [xdvi_cv_sys_streams=yes], [xdvi_cv_sys_streams=no])]) if test "x$xdvi_cv_sys_streams" = xyes; then AC_DEFINE([HAVE_STREAMS], 1, [Define if your system has STREAMS (and if X uses it).]) fi ]) # XDVI_SYS_STREAMS xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-check-langinfo.m40000664000175000017500000000251111175352220022562 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) ???? - 2009 Paul Vojta # and/or # Copyright (C) ???? - 2009 Stefan Ulrich # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_CHECK_LANGINFO # ------------------- # Check for nl_langinfo(), , and if nl_langinfo(CODESET) # is working. AC_DEFUN([XDVI_CHECK_LANGINFO], [AC_CHECK_FUNCS([nl_langinfo]) AC_CHECK_HEADERS([langinfo.h]) if test "x$ac_cv_func_nl_langinfo:$ac_cv_header_langinfo_h" = xyes:yes; then AC_CACHE_CHECK([if nl_langinfo(CODESET) is working], [xdvi_cv_nl_langinfo_codeset], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[char* cs = nl_langinfo(CODESET);]])], [xdvi_cv_nl_langinfo_codeset=yes], [xdvi_cv_nl_langinfo_codeset=no])]) AS_IF([test "x$xdvi_cv_nl_langinfo_codeset" = xyes], [AC_DEFINE([HAVE_WORKING_NL_LANGINFO_CODESET], 1, [Define if the CODESET argument to nl_langinfo works.])]) fi ]) # XDVI_CHECK_LANGINFO xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-linker-multiple-defns.m40000664000175000017500000000605211175352220024130 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 2002 - 2009 Paul Vojta # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_LINKER_MULTIPLE_DEFNS # -------------------------- # Check if the --allow-multiple-definition linker flag is # available (assuming that we need to use it if it is). # If it isn't, check if the linker accepts multiple definitions, # and if it doesn't, don't define LD_ALLOWS_MULTIPLE_DEFINITIONS. AC_DEFUN([XDVI_LINKER_MULTIPLE_DEFNS], [AC_CACHE_CHECK( [if linker supports multiple definitions and for required flags], [xdvi_cv_linker_multiple_defns], [xdvi_ld_save_LDFLAGS=$LDFLAGS LDFLAGS="-Xlinker --allow-multiple-definition" AC_LINK_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[void foo(void);]])], [xdvi_cv_linker_multiple_defns=$LDFLAGS], [xdvi_ld_save_LIBS=$LIBS xdvi_ld_save_CFLAGS=$CFLAGS xdvi_ld_save_CPPFLAGS=$CPPFLAGS LIBS="$X_PRE_LIBS -lXt -lX11 $X_EXTRA_LIBS $LIBS" CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" LDFLAGS="$X_LIBS $xdvi_ld_save_LDFLAGS" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include XtIntervalId XtAppAddTimeOut(XtAppContext app, unsigned long interval, XtTimerCallbackProc proc, XtPointer closure) { (void)app; (void)interval; (void)proc; (void)closure; return (XtIntervalId)0; }]], [[XtIntervalId i = 0; XtRemoveTimeOut(i);]])], [xdvi_cv_linker_multiple_defns="none required"], [xdvi_cv_linker_multiple_defns=unsupported]) LIBS=$xdvi_ld_save_LIBS CFLAGS=$xdvi_ld_save_CFLAGS CPPFLAGS=$xdvi_ld_save_CPPFLAGS]) LDFLAGS=$xdvi_ld_save_LDFLAGS]) x_linker_options="" AS_CASE([$xdvi_cv_linker_multiple_defns], ["none required"], [AC_DEFINE([LD_ALLOWS_MULTIPLE_DEFINITIONS], 1, [Define if your system allows multiple definitions of functions.])], [unsupported], [AC_MSG_WARN([Linker does not allow multiple definitions. ***************************************************************** * Warning: Your linker does not allow multiple definitions. * * This does not make xdvik unusable, but it will cause problems * * with event handling: Some widgets, e.g. the print log window, * * tooltips, statusline messages and hyperlink location markers * * will not be updated until the mouse is moved. * *****************************************************************])], [x_linker_options=$xdvi_cv_linker_multiple_defns AC_DEFINE([LD_ALLOWS_MULTIPLE_DEFINITIONS], 1)]) AC_SUBST([x_linker_options]) ]) # XDVI_LINKER_MULTIPLE_DEFNS xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-find-motif.m40000664000175000017500000002337511276240141021761 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 2001 - 2009 Marcin Dalecki # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_FIND_MOTIF # --------------- # Check for Motif libraries and headers. # Put Motif include directory in motif_include, # put Motif library directory in motif_libdir, # and add appropriate flags to X_CFLAGS and X_LIBS. # If default_toolkit is not `none', use Xaw as toolkit if Motif isn't found. AC_DEFUN([XDVI_FIND_MOTIF], [AC_REQUIRE([AC_PATH_XTRA]) AC_ARG_WITH([motif-include], AS_HELP_STRING([--with-motif-include=DIR], [Specify the location of Motif include files]), [motif_include=$withval], [motif_include=])[]dnl AC_ARG_WITH([motif-libdir], AS_HELP_STRING([--with-motif-libdir=DIR], [Specify the location of Motif libraries]), [motif_libdir=$withval], [motif_libdir=])[]dnl AC_MSG_CHECKING([for Motif]) # # Search the include files. # if test "x$motif_include" = x; then _XDVI_FIND_MOTIF_INCLUDES fi # # Add Motif definition to X_CFLAGS (and remember previous value) # xdvi_motif_save_X_CFLAGS=$X_CFLAGS if test "x$motif_include" != xdefault \ && test "x$motif_include" != "x$x_includes" && test "x$motif_include" != xno then X_CFLAGS="-I$motif_include $X_CFLAGS" fi # # Now for the libraries. # if test "x$motif_libdir" = x; then _XDVI_FIND_MOTIF_LIBRARIES fi # # Report the results of headers and libraries. # xdvi_have_motif=yes # motif_libdir_result=$motif_libdir if test "x$motif_libdir_result" = xdefault; then motif_libdir_result="in default path" elif test "x$motif_libdir_result" = xno; then motif_libdir_result="(none)" xdvi_have_motif=no fi # motif_include_result=$motif_include if test "x$motif_include_result" = xdefault; then motif_include_result="in default path" elif test "x$motif_include_result" = xno; then motif_include_result="(none)" xdvi_have_motif=no fi # AC_MSG_RESULT([libraries $motif_libdir_result, headers $motif_include_result]) # if test "x$xdvi_have_motif" = xyes; then # # Add Motif definition to X_LIBS # if test "x$motif_libdir" != xdefault \ && test "x$motif_libdir" != "x$x_libraries" && test "x$motif_libdir" != no then case "$X_LIBS" in *-R\ *) X_LIBS="-L$motif_libdir -R $motif_libdir $X_LIBS";; *-R*) X_LIBS="-L$motif_libdir -R$motif_libdir $X_LIBS";; *) X_LIBS="-L$motif_libdir $X_LIBS";; esac fi # prog_extension="motif" AC_DEFINE([MOTIF], 1, [Define to use the Motif toolkit.]) x_tool_libs="-lXm" if test "x$x_xp_lib" != x; then # check if libXm requires libXp _XDVI_CHECK_MOTIF_XP fi # now warn if we're using LessTif (see LESSTIF-BUGS for why ...) _XDVI_CHECK_LESSTIF # Check whether to compile for Motif with Xaw Panner. _XDVI_CHECK_PANNER elif test "x$default_toolkit" = xnone; then AC_MSG_ERROR([No Motif.]) else # Restore previous X_CFLAGS X_CFLAGS=$xdvi_motif_save_X_CFLAGS AC_MSG_NOTICE([No Motif, using Xaw.]) with_xdvi_x_toolkit="xaw" fi ]) # XDVI_FIND_MOTIF # _XDVI_FIND_MOTIF_INCLUDES # ------------------------- # Search the Xm include files. m4_define([_XDVI_FIND_MOTIF_INCLUDES], [AC_CACHE_VAL([xdvi_cv_motif_include], [xdvi_motif_save_CFLAGS=$CFLAGS xdvi_motif_save_CPPFLAGS=$CPPFLAGS # CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" # AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int a;]])], [# Xm/Xm.h is in the standard search path. xdvi_cv_motif_include=default], [# Xm/Xm.h is not in the standard search path. xdvi_cv_motif_include=no # Locate it and put its directory in `motif_include' # # /usr/include/Motif* are used on HP-UX (Motif). # /usr/include/X11* are used on HP-UX (X and Athena). # /usr/dt is used on Solaris (Motif). # /usr/openwin is used on Solaris (X and Athena). # Other directories are just guesses. for dir in "$x_includes" "${prefix}/include" /usr/include /usr/local/include \ /usr/include/Motif2.0 /usr/include/Motif1.2 /usr/include/Motif1.1 \ /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 \ /usr/dt/include /usr/openwin/include \ /usr/dt/*/include /opt/*/include /usr/include/Motif* \ "${prefix}"/*/include /usr/*/include /usr/local/*/include \ "${prefix}"/include/* /usr/include/* /usr/local/include/*; do if test -f "$dir/Xm/Xm.h"; then xdvi_cv_motif_include=$dir break fi done]) # CFLAGS=$xdvi_motif_save_CFLAGS CPPFLAGS=$xdvi_motif_save_CPPFLAGS]) motif_include=$xdvi_cv_motif_include ]) # _XDVI_FIND_MOTIF_INCLUDES # _XDVI_FIND_MOTIF_LIBRARIES # -------------------------- # Search the Xm library. m4_define([_XDVI_FIND_MOTIF_LIBRARIES], [AC_CACHE_VAL([xdvi_cv_motif_libdir], [xdvi_motif_save_LIBS=$LIBS xdvi_motif_save_CFLAGS=$CFLAGS xdvi_motif_save_CPPFLAGS=$CPPFLAGS xdvi_motif_save_LDFLAGS=$LDFLAGS # LIBS="$X_PRE_LIBS -lXm $x_xp_lib -lXt -lX11 $X_EXTRA_LIBS $LIBS" CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" LDFLAGS="$X_LIBS $LDFLAGS" # # We use XtToolkitInitialize() here since it takes no arguments # and thus also works with a C++ compiler. AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include #include ]], [[XtToolkitInitialize();]])], [# libXm.a is in the standard search path. xdvi_cv_motif_libdir=default], [# libXm.a is not in the standard search path. xdvi_cv_motif_libdir=no # Locate it and put its directory in `motif_libdir' # # /usr/lib/Motif* are used on HP-UX (Motif). # /usr/lib/X11* are used on HP-UX (X and Athena). # /usr/dt is used on Solaris (Motif). # /usr/lesstif is used on Linux (Lesstif). # /usr/openwin is used on Solaris (X and Athena). # Other directories are just guesses. for dir in "$x_libraries" "${prefix}/lib" /usr/lib /usr/local/lib \ /usr/lib/Motif2.0 /usr/lib/Motif1.2 /usr/lib/Motif1.1 \ /usr/lib/X11R6 /usr/lib/X11R5 /usr/lib/X11R4 /usr/lib/X11 \ /usr/dt/lib /usr/openwin/lib \ /usr/dt/*/lib /opt/*/lib /usr/lib/Motif* \ /usr/lesstif*/lib /usr/lib/Lesstif* \ "${prefix}"/*/lib /usr/*/lib /usr/local/*/lib \ "${prefix}"/lib/* /usr/lib/* /usr/local/lib/*; do if test -d "$dir" && test "`ls $dir/libXm.* 2> /dev/null`" != ""; then xdvi_cv_motif_libdir=$dir break fi done]) # LIBS=$xdvi_motif_save_LIBS CFLAGS=$xdvi_motif_save_CFLAGS CPPFLAGS=$xdvi_motif_save_CPPFLAGS LDFLAGS=$xdvi_motif_save_LDFLAGS]) # motif_libdir="$xdvi_cv_motif_libdir" ]) # _XDVI_FIND_MOTIF_LIBRARIES # _XDVI_CHECK_MOTIF_XP # -------------------- # Check if libXm (explicitly) requires libXp m4_define([_XDVI_CHECK_MOTIF_XP], [AC_CACHE_CHECK([if libXm requires libXp], [xdvi_cv_motif_xp], [xdvi_motif_save_LIBS=$LIBS xdvi_motif_save_CFLAGS=$CFLAGS xdvi_motif_save_CPPFLAGS=$CPPFLAGS xdvi_motif_save_LDFLAGS=$LDFLAGS # LIBS="$X_PRE_LIBS -lXm -lXt -lX11 $X_EXTRA_LIBS $LIBS" CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" LDFLAGS="$X_LIBS $LDFLAGS" # # We use XtToolkitInitialize() here since it takes no arguments # and thus also works with a C++ compiler. AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include #include ]], [[XtToolkitInitialize();]])], [xdvi_cv_motif_xp=no], [xdvi_cv_motif_xp=yes]) # LIBS=$xdvi_motif_save_LIBS CFLAGS=$xdvi_motif_save_CFLAGS CPPFLAGS=$xdvi_motif_save_CPPFLAGS LDFLAGS=$xdvi_motif_save_LDFLAGS]) if test "x$xdvi_cv_motif_xp" = xyes; then x_tool_libs="$x_tool_libs $x_xp_lib" fi ]) # _XDVI_CHECK_MOTIF_XP # _XDVI_CHECK_LESSTIF # ------------------- # Check if using LessTif and warn if so. m4_define([_XDVI_CHECK_LESSTIF], [AC_CACHE_CHECK([for LessTif], [xdvi_cv_using_lesstif], [save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $X_CFLAGS" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #include #include #include #include #include ]], [[const char *p = LesstifVERSION_STRING;]])], [xdvi_cv_using_lesstif=yes], [xdvi_cv_using_lesstif=no]) CPPFLAGS=$save_CPPFLAGS]) if test "x$xdvi_cv_using_lesstif" = xyes; then AC_MSG_WARN([LessTif header detected. ***************************************************************** * Warning: You are using LessTif instead of OpenMotif. * * Some GUI elements might be broken; please see the file * * * * texk/xdvik/LESSTIF-BUGS * * * * for more information. * *****************************************************************]) fi ]) # _XDVI_CHECK_LESSTIF # _XDVI_CHECK_PANNER # ------------------ # Check whether to compile for Motif with Xaw Panner. m4_define([_XDVI_CHECK_PANNER], [AC_CACHE_CHECK([whether to compile in panner (requires Xaw)], [xdvi_cv_use_xaw_panner], [save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $X_CFLAGS" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #include #include #include #include #include #include ]])], [xdvi_cv_use_xaw_panner=yes], [xdvi_cv_use_xaw_panner=no]) CPPFLAGS=$save_CPPFLAGS]) if test "x$xdvi_cv_use_xaw_panner" = xyes; then AC_DEFINE([USE_XAW_PANNER], 1, [Define to use Xaw panner.]) fi ]) # _XDVI_CHECK_PANNER xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-func-setsid-in-fork.m40000664000175000017500000000337311174354211023511 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 2002 - 2009 Paul Vojta # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_FUNC_SETSID_IN_VFORK # ------------------------- # Check for whether setsid() is allowed within vfork() # (Mac OS X 10.3 (Panther, 11/2003) is one O/S which does not allow this). AC_DEFUN([XDVI_FUNC_SETSID_IN_VFORK], [AS_IF([test "x$ac_cv_func_vfork_works" = xyes], [AC_CACHE_CHECK([for whether setsid() is allowed within vfork()], [xdvi_cv_setsid_in_vfork], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ /* Test adapted from Gnu autoconf */ /* Thanks to Paul Eggert for this test. */ #include #include #include #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_VFORK_H #include #endif]], [[ pid_t parent = getpid (); pid_t child; child = vfork (); if (child == 0) { if (setsid () == -1) _exit(1); _exit(0); } else { int status; while (wait(&status) != child) ; exit( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status ); }]])], [xdvi_cv_setsid_in_vfork=yes], [xdvi_cv_setsid_in_vfork=no], [xdvi_cv_setsid_in_vfork=no # safe value for cross-compiling])]) if test "x$xdvi_cv_setsid_in_vfork" = xyes; then AC_DEFINE([HAVE_GOOD_SETSID_VFORK], 1, [Define if your system allows setsid() within vfork().]) fi]) ]) # XDVI_FUNC_SETSID_IN_VFORK xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-c-bitmap-type.m40000664000175000017500000000343711174354211022376 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 1999 - 2009 Paul Vojta # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_C_BITMAP_TYPE # ------------------ # Determine integer type to use for bitmaps. # Uses AC_CHECK_SIZEOF(TYPE) and thus works when cross compiling. AC_DEFUN([XDVI_C_BITMAP_TYPE], [AC_CHECK_SIZEOF([unsigned long])[]dnl AC_CHECK_SIZEOF([unsigned int])[]dnl AC_CHECK_SIZEOF([unsigned short])[]dnl AC_CHECK_SIZEOF([unsigned char])[]dnl AC_MSG_CHECKING([for integer type to use in bitmaps]) AC_CACHE_VAL([xdvi_cv_bitmap_type], [AS_IF([(test $ac_cv_sizeof_unsigned_long = 4 || test $ac_cv_sizeof_unsigned_long = 2) \ && test $ac_cv_sizeof_unsigned_long != $ac_cv_sizeof_unsigned_int], [xdvi_cv_bitmap_type="BMTYPE=long BMBYTES=$ac_cv_sizeof_unsigned_long"], [test $ac_cv_sizeof_unsigned_int = 4 || test $ac_cv_sizeof_unsigned_int = 2], [xdvi_cv_bitmap_type="BMTYPE=int BMBYTES=$ac_cv_sizeof_unsigned_int"], [test $ac_cv_sizeof_unsigned_short = 4 || test $ac_cv_sizeof_unsigned_short = 2], [xdvi_cv_bitmap_type="BMTYPE=short BMBYTES=$ac_cv_sizeof_unsigned_short"], [xdvi_cv_bitmap_type="BMTYPE=char BMBYTES=$ac_cv_sizeof_unsigned_cher"])]) eval "$xdvi_cv_bitmap_type" AC_DEFINE_UNQUOTED([BMTYPE], [$BMTYPE], [Define to determine the integer type to be used in bitmaps. The type used will be "unsigned BMTYPE".]) AC_DEFINE_UNQUOTED([BMBYTES], [$BMBYTES], [Define to the length (in bytes) of type BMTYPE.]) AC_MSG_RESULT([unsigned $BMTYPE, size = $BMBYTES]) ]) # XDVI_C_BITMAP_TYPE xdvik-ja-22.84.16-j1.40/texk/xdvik/m4/xdvi-func-poll.m40000664000175000017500000000162111174354211021613 0ustar uwabamiuwabami# Autoconf macros for xdvik. # Copyright (C) 1999 - 2009 Paul Vojta # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # XDVI_FUNC_POLL # -------------- # Check for poll(). AC_DEFUN([XDVI_FUNC_POLL], [AC_CACHE_CHECK([for poll.h and poll()], [xdvi_cv_func_poll], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[poll((struct pollfd *) 0, 0, 0);]])], [xdvi_cv_func_poll=yes], [xdvi_cv_func_poll=no])]) if test "x$xdvi_cv_func_poll" = xyes; then AC_DEFINE([HAVE_POLL], 1, [Define if your system has and poll().]) else AC_CHECK_HEADERS([sys/select.h select.h]) fi ]) # XDVI_FUNC_POLL xdvik-ja-22.84.16-j1.40/texk/xdvik/my-snprintf.h0000664000175000017500000000261510363262237020632 0ustar uwabamiuwabami/*------------------------------------------------------------ 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. ------------------------------------------------------------*/ #ifndef MY_SNPRINTF_H_ #define MY_SNPRINTF_H_ #ifdef HAVE_SNPRINTF #define SNPRINTF snprintf #else #define SNPRINTF my_snprintf int SNPRINTF(char *str, size_t size, const char *format, ...); #endif /* HAVE_SNPRINTF */ #endif /* MY_VSNPRINTF_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/print-internal.c0000664000175000017500000006244111164427731021312 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 Paul Vojta and the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ /* * SU: Printing/saving backend code (all the non-GUI stuff), * adapted from non-k xdvi's popups.c. * * Implementation notes: * All inter-process communication happens in an asynchronous * fasion, so that the GUI remains responsive. This means that if * there are several processes in sequence (e.g. dvips invocation, * then ps2pdf invocation), the latter must be called by the child * watching procedure of the former (e.g. ps2pdf_exited by the * fork_process() callback in call_ps2pdf()), else we can't catch its * return status, do cleanup afterwards etc., because the code inside * the caller may be executed *before* the child has finished. (Note * e.g. how unlink()ing the temporary PS file is done inside * ps2pdf_exited() and not in the callers). This is the reason why we * often need to pass information to the subprocess via a data pointer. */ #include "xdvi-config.h" #include "xdvi.h" #include "dvisel.h" /* for select_pages_info struct */ #include "print-internal.h" #include "print-log.h" #include "search-internal.h" #include "events.h" #include "message-window.h" #include "util.h" #include "x_util.h" #include "string-utils.h" #include "my-snprintf.h" #include #include #include /* if POSIX O_NONBLOCK is not available, use O_NDELAY */ #if !defined(O_NONBLOCK) && defined(O_NDELAY) # define O_NONBLOCK O_NDELAY #endif #ifdef EWOULDBLOCK # ifdef EAGAIN # define AGAIN_CONDITION (errno == EWOULDBLOCK || errno == EAGAIN) # else # define AGAIN_CONDITION (errno == EWOULDBLOCK) # endif #else /* EWOULDBLOCK */ # ifdef EAGAIN # define AGAIN_CONDITION (errno == EAGAIN) # endif #endif /* EWOULDBLOCK */ #if HAVE_POLL # include # define XIO_IN POLLIN # define XIO_OUT POLLOUT #else # define XIO_IN 1 # define XIO_OUT 2 #endif /* HAVE_POLL */ static struct xchild print_child = {NULL, 0, True, "dvips", NULL, NULL, NULL }; static char *read_from_dvips(int, void *); static struct xio print_xio = { NULL, 0, XIO_IN, #if HAVE_POLL NULL, #endif read_from_dvips, NULL, /* write proc - not needed */ NULL /* data */ }; static void dvips_alarm(struct xtimer *this, void *data); static struct xtimer dvips_timer = {NULL, {0, 0}, XTM_DEFAULT, dvips_alarm, NULL #if XDVI_XT_TIMER_HACK , NULL, NULL #endif }; static int dvips_sig; /* SIGINT or SIGKILL */ static int dvips_status; static const int DVIPS_STAT_NONE = 0; static const int DVIPS_STAT_RUN = 1; static const int DVIPS_STAT_WAIT = 2; /* FIXME: implement this in terms of fork_process()! Currently it doesn't work since the DVI file and the output file are realized via redirecting stdin/stdout. This also obscures the log output (the I/O redirection isn't visible to users). TODO: Remove the detailed log output, and implement a progress window that only shows the page numbers. The detailed log should go to an `xdvi log output' page. */ static void fork_dvips(char **argv, struct save_or_print_info *info, childProcT proc) { int print_io[2]; int i; struct file_info *finfo = info->finfo; /* printlog_append(argv[0], strlen(argv[0])); */ FILE *fout = NULL; if (info->act == FILE_SAVE || info->print_target == TO_FILE) { /* printing to PS file, open file for writing */ const char *out_file; if (info->print_target == TO_FILE || info->fmt == FMT_PS) out_file = finfo->out_file; else out_file = finfo->tmp_ps_file; if ((fout = XFOPEN(out_file, "w")) == NULL) { popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Could not open %s for writing: %s.", out_file, strerror(errno)); return; } } printlog_popup(info); printlog_append_str(info, "Calling: `"); printlog_append_str(info, argv[0]); for (i = 1; argv[i] != NULL; i++) { printlog_append_str(info, " "); printlog_append_str(info, argv[i]); } printlog_append_str(info, "'\n"); if (xpipe(print_io) != 0) { perror("[xdvi] pipe"); return; } /* Fork process */ /* flush output buffers to avoid double buffering (i.e. data waiting in the output buffer being written twice, by the parent and the child) */ fflush(stderr); fflush(stdout); print_child.name = xstrdup(argv[0]); print_child.proc = proc; print_child.data = info; print_child.pid = fork(); if (print_child.pid == 0) { /* if child */ /* change into dir of DVI file so that included image files etc. are found */ (void)chdir(globals.dvi_file.dirname); /* make the input file pointer the STDIN of the dvips process */ if (info->page_selection == PAGE_MARKED) { /* printing selected pages from temporary file */ ASSERT(finfo->tmp_dvi_fp != NULL, "tmp fp mustn't be NULL!"); (void)dup2(fileno(finfo->tmp_dvi_fp), STDIN_FILENO); } else { /* printing from main or backup file */ (void)dup2(fileno(finfo->in_fp), STDIN_FILENO); } (void)lseek(0, 0, SEEK_SET); if (fout != NULL) { /* printing to file, make stdout of child go to fout */ (void)dup2(fileno(fout), STDOUT_FILENO); (void)close(fileno(fout)); } else { /* printing to printer, make stdout of child go to print_io[1] */ (void)dup2(print_io[1], STDOUT_FILENO); } /* make stderr of child go to print_io[1] */ (void)dup2(print_io[1], STDERR_FILENO); (void)close(print_io[1]); (void)close(print_io[0]); if (setsid() == -1) { /* so we can kill the process group */ perror("setsid"); fflush(stderr); _exit(1); } (void)execvp(*argv, argv); popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Execution of \"%s\" failed: %s.\n", *argv, strerror(errno)); fflush(stderr); _exit(1); } if (fout != NULL) fclose(fout); if (print_child.pid == -1) { /* error */ perror("[xdvi] vfork"); return; } set_chld(&print_child); dvips_sig = SIGINT; (void)close(print_io[1]); /* Set up file descriptor for non-blocking I/O */ prep_fd(print_io[0], True); print_xio.fd = print_io[0]; print_xio.data = info; set_io(&print_xio); dvips_status = DVIPS_STAT_RUN; /* running */ } /* * Create an argument list for dvips, using information from info * and X resources. Returns the result list in freshly allocated * memory. */ static char ** create_dvips_argv(const struct save_or_print_info *info, Boolean do_pdf) { const struct select_pages_info *pinfo = info->pinfo; size_t argv_len = 128; /* should be ample ... */ char **argv = xmalloc(argv_len * sizeof *argv); size_t idx = 0; const char *printer_options = info->printer_options; const char *dvips_options = info->dvips_options; char from_page[LENGTH_OF_INT]; char to_page[LENGTH_OF_INT]; TRACE_GUI((stderr, "dvips options: |%s|", dvips_options)); argv[idx++] = xstrdup(resource.dvips_path); if (dvips_options != NULL) { char **dvips_args = get_separated_list(dvips_options, " \t", True); /* this allocates dvips_args */ int i; for (i = 0; dvips_args[i] != NULL; i++) { argv[idx++] = dvips_args[i]; } free(dvips_args); } if (do_pdf) argv[idx++] = xstrdup("-Ppdf"); argv[idx++] = xstrdup("-f"); if (info->print_target == TO_PRINTER && printer_options != NULL) { /* printing to printer */ char **printer_args = get_separated_list(printer_options, " \t", True); /* this allocates printer_args */ int i; ASSERT(*printer_args != NULL, "args should contain at least the string \"lpr\""); argv[idx] = xstrdup("-o!"); argv[idx] = xstrcat(argv[idx], printer_args[0]); free(printer_args[0]); /* now append everything to the printer pipe command, so that dvips doesn't see it as an option */ for (i = 1; printer_args[i] != NULL; i++) { argv[idx] = xstrcat(argv[idx], " "); argv[idx] = xstrcat(argv[idx], printer_args[i]); free(printer_args[i]); } free(printer_args); idx++; } if (info->page_selection == PAGE_RANGE) { /* convert back from 0-based to 1-based, also taking globals.pageno_correct into accout * (which is 1 by default, so we need to add 2) */ argv[idx] = xstrdup("-p="); SNPRINTF(from_page, LENGTH_OF_INT, "%d", pinfo->from - globals.pageno_correct + 2); argv[idx] = xstrcat(argv[idx], from_page); idx++; argv[idx] = xstrdup("-l="); SNPRINTF(to_page, LENGTH_OF_INT, "%d", pinfo->to - globals.pageno_correct + 2); argv[idx] = xstrcat(argv[idx], to_page); idx++; } argv[idx] = NULL; /* terminate it */ ASSERT(idx <= argv_len, "Too many elements"); return argv; } /* Check if selecting pages worked, report error else */ static Boolean select_pages_report_error(const struct save_or_print_info *info) { if (info->pinfo->errflag == NO_ERROR) return False; popup_message(globals.widgets.top_level, MSG_INFO, NULL, "Could not save DVI file to %s: %s.", info->finfo->tmp_dvi_file, get_dvi_error(info->pinfo->errflag)); return True; } /* * Collect dvips output, appending to print log. * Currently return value is a dummy (NULL); TODO: return * the output, for later filtering. */ static char * read_from_dvips(int ignored, void *data) { int bytes; char line[80]; struct save_or_print_info *info = data; UNUSED(ignored); for (;;) { #ifndef MOTIF bytes = read(print_xio.fd, line, sizeof line); #else bytes = read(print_xio.fd, line, sizeof line - 1); #endif if (bytes < 0) { if (AGAIN_CONDITION) break; perror("xdvi: read_from_dvips"); break; } if (bytes == 0) break; else { #ifdef MOTIF line[bytes] = '\0'; #endif printlog_append(info, line, bytes); } } return NULL; /* TODO */ } /* * Report dvips exit status, and remove temporary DVI file if needed. */ static void dvips_exited(int exitval, struct xchild *child) { char str[128] = ""; int ms; struct save_or_print_info *info = (struct save_or_print_info *)child->data; read_from_dvips(0, info); clear_io(&print_xio); (void)close(print_xio.fd); if (WIFEXITED(exitval)) { if (WEXITSTATUS(exitval) == 0) { if (info->act == FILE_SAVE || info->print_target == TO_FILE) { printlog_append_str(info, "\nCreated Postscript file "); printlog_append_str(info, info->finfo->out_file); printlog_append_str(info, ".\n"); } else { printlog_append_str(info, "Done.\n"); } /* remove temporary DVI file if it exists */ if (info->finfo->tmp_dvi_file != NULL) { if (globals.debug & DBG_GUI) TRACE_GUI((stderr, "NOT removing temporary DVI file: |%s|", info->finfo->tmp_dvi_file)); else { if (info->finfo->tmp_dvi_fp != NULL) { fclose(info->finfo->tmp_dvi_fp); info->finfo->tmp_dvi_fp = NULL; } unlink(info->finfo->tmp_dvi_file); info->finfo->tmp_dvi_file = NULL; } } } else sprintf(str, "\nDvips returned exit code %d.\n", WEXITSTATUS(exitval)); } else if (WIFSIGNALED(exitval)) sprintf(str, "\nDvips terminated by signal %d.\n", WTERMSIG(exitval)); else sprintf(str, "\nDvips returned unknown status 0x%x.\n", exitval); ms = resource.dvips_hang; if (str[0] != '\0') { xdvi_bell(); ms = resource.dvips_fail_hang; printlog_append_str(info, str); } if (ms > 0) { dvips_timer.data = info; set_timer(&dvips_timer, ms); dvips_status = DVIPS_STAT_WAIT; } else { dvips_status = DVIPS_STAT_NONE; } printlog_enable_closebutton(info); } /* * Report pd2pdf exit status, and remove temporary PS file if needed. */ static void ps2pdf_exited(int status, struct xchild *this) { char *err_msg = NULL; int ms = resource.dvips_hang; struct save_or_print_info *info = (struct save_or_print_info *)this->data; /* if child exited with error and xio struct is available for child, print error text */ if (this->io != NULL && (WIFEXITED(status) != 0)) { if ((WEXITSTATUS(status) != 0) && (err_msg = (this->io->read_proc)(this->io->fd, NULL)) != NULL) { char buf[LENGTH_OF_INT]; SNPRINTF(buf, LENGTH_OF_INT, "%d", WEXITSTATUS(status)); ms = resource.dvips_fail_hang; xdvi_bell(); printlog_append_str(info, "\n\nError calling "); if (this->name != NULL) { printlog_append_str(info, "\""); printlog_append_str(info, this->name); printlog_append_str(info, "\" "); } printlog_append_str(info, "\nCommand exited with error code "); printlog_append_str(info, buf); printlog_append_str(info, ":\n"); printlog_append_str(info, err_msg); free(err_msg); } else { int retval; printlog_append_str(info, "\nCreated PDF file "); printlog_append_str(info, info->finfo->out_file); printlog_append_str(info, ".\n"); TRACE_FILES((stderr, "Removing temporary PS file: `%s'", info->finfo->tmp_ps_file)); retval = unlink(info->finfo->tmp_ps_file); if (retval != 0) { fprintf(stderr, "Could not unlink `%s': %s.\n", info->finfo->tmp_ps_file, strerror(errno)); } } } else { popup_message(globals.widgets.top_level, MSG_ERR, REPORT_XDVI_BUG_TEMPLATE, "Internal error: ps2pdf_exited() called while child still running?"); } if (ms > 0) { dvips_timer.data = info; set_timer(&dvips_timer, ms); dvips_status = DVIPS_STAT_WAIT; } else { dvips_status = DVIPS_STAT_NONE; } printlog_enable_closebutton(info); free(this->name); free(this->io); free(this); } static void call_ps2pdf(const char *path, const struct save_or_print_info *info) { const char *argv[5]; size_t idx = 0; argv[idx++] = path; argv[idx++] = info->finfo->tmp_ps_file; argv[idx++] = info->finfo->out_file; argv[idx++] = NULL; /* need to run this in globals.xdvi_dir again, since the dvips conversion directory globals.dvi_file.dirname may not be writable! */ if (!fork_process("ps2pdf", True, globals.cwd, ps2pdf_exited, (void *)info, (char **)argv)) { popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Couldn't fork %s process: %s\n", argv[0], strerror(errno)); } } static void dvips_ps2pdf(int exitval, struct xchild *child) { char str[128] = ""; int ms; struct save_or_print_info *info = (struct save_or_print_info *)child->data; read_from_dvips(0, info); clear_io(&print_xio); (void)close(print_xio.fd); if (WIFEXITED(exitval)) { if (WEXITSTATUS(exitval) == 0) { /* dvips ended OK; call ps2pdf: */ TRACE_GUI((stderr, "Created temporary PS file |%s|", info->finfo->tmp_ps_file)); printlog_append_str(info, "\nCalling "); printlog_append_str(info, resource.ps2pdf_path); printlog_append_str(info, " ..."); /* remove temporary DVI file if it exists */ if (info->finfo->tmp_dvi_file != NULL) { if (globals.debug & DBG_GUI) TRACE_GUI((stderr, "NOT removing temporary DVI file: |%s|", info->finfo->tmp_dvi_file)); else { if (info->finfo->tmp_dvi_fp != NULL) { fclose(info->finfo->tmp_dvi_fp); info->finfo->tmp_dvi_fp = NULL; } unlink(info->finfo->tmp_dvi_file); info->finfo->tmp_dvi_file = NULL; } } /* invoke ps2pdf conversion */ call_ps2pdf(resource.ps2pdf_path, info); } else sprintf(str, "\nPrint process returned exit code %d.\n", WEXITSTATUS(exitval)); } else if (WIFSIGNALED(exitval)) sprintf(str, "\nPrint process terminated by signal %d.\n", WTERMSIG(exitval)); else sprintf(str, "\nPrint process returned unknown status 0x%x.\n", exitval); /* enable close button only if dvips conversion already failed */ ms = resource.dvips_hang; if (str[0] != '\0') { xdvi_bell(); ms = resource.dvips_fail_hang; printlog_append_str(info, str); if (ms > 0) { dvips_timer.data = info; set_timer(&dvips_timer, ms); dvips_status = DVIPS_STAT_WAIT; } else { dvips_status = DVIPS_STAT_NONE; } printlog_enable_closebutton(info); } } static void dvips_alarm(struct xtimer *this, void *data) { struct save_or_print_info *info = (struct save_or_print_info *)data; UNUSED(this); printlog_popdown(info, False); dvips_status = DVIPS_STAT_NONE; } static void cb_dvips_keep(Widget w, XtPointer client_data, XtPointer call_data) { UNUSED(w); UNUSED(client_data); UNUSED(call_data); /* use negative value so that we don't loose the value itself */ TRACE_GUI((stderr, "toggling resource from %d to %d, %d to %d", resource.dvips_hang, -resource.dvips_hang, resource.dvips_fail_hang, -resource.dvips_fail_hang)); resource.dvips_hang = -resource.dvips_hang; resource.dvips_fail_hang = -resource.dvips_fail_hang; store_preference(NULL, "dvipsHangTime", "%d", resource.dvips_hang); store_preference(NULL, "dvipsFailHangTime", "%d", resource.dvips_fail_hang); if (dvips_status == DVIPS_STAT_WAIT) { dvips_status = DVIPS_STAT_NONE; cancel_timer(&dvips_timer); } } /* if user selects the window manager destroy button */ static void cb_dvips_destroy(Widget w, XtPointer client_data, XtPointer call_data) { struct save_or_print_info *info = (struct save_or_print_info *)client_data; UNUSED(w); UNUSED(call_data); if (dvips_status == DVIPS_STAT_RUN) { kill(print_child.pid, dvips_sig); dvips_sig = SIGKILL; printlog_append_str(info, "^C"); } if (dvips_status == DVIPS_STAT_WAIT) { dvips_status = DVIPS_STAT_NONE; cancel_timer(&dvips_timer); } printlog_reset(info); printlog_popdown(info, True); } static void cb_dvips_cancel(Widget w, XtPointer client_data, XtPointer call_data) { struct save_or_print_info *info = (struct save_or_print_info *)client_data; UNUSED(w); UNUSED(call_data); if (dvips_status != DVIPS_STAT_RUN) return; /* How did we get here? */ kill(print_child.pid, dvips_sig); dvips_sig = SIGKILL; printlog_append_str(info, "^C"); } static void cb_dvips_close(Widget w, XtPointer client_data, XtPointer call_data) { struct save_or_print_info *info = (struct save_or_print_info *)client_data; UNUSED(w); UNUSED(call_data); if (dvips_status == DVIPS_STAT_RUN) return; /* How did we get here? */ if (dvips_status == DVIPS_STAT_WAIT) { dvips_status = DVIPS_STAT_NONE; cancel_timer(&dvips_timer); } printlog_popdown(info, True); } void internal_save(struct save_or_print_info *info) { struct file_info *finfo = info->finfo; static struct callback_info cinfo = { cb_dvips_close, cb_dvips_cancel, cb_dvips_destroy, cb_dvips_keep }; int tmp_fd; char **argv = NULL; int i; childProcT dvips_exit_proc = dvips_exited; /* default procedure to call after fork_dvips() */ Boolean do_pdf = False; /* force `-Ppdf' for dvips? (used for ps2pdf conversion) */ ASSERT(info->fmt != FMT_NONE, "No valid output format selected!"); /* fprintf(stderr, "INTERNAL SAVE - format: %d; selection: %d\n", info->fmt, info->page_selection); */ info->callbacks = &cinfo; switch (info->fmt) { case FMT_DVI: /* here we first create a temporary file, and if that succeeded, move it to the final position */ select_pages(info); if (!select_pages_report_error(info)) { /* * ... else, move the temporary file to its final destination. For that, we * try the more efficient rename() first; if this fails, try copying the file * (rename() will e.g. fail if the tmp directory is on a different file * system). We could perhaps examine errno after the renaming attempt to * find out whether we need to do the copy attempt in the first place, but * that'd be rather error-prone ... */ ASSERT(finfo->tmp_dvi_file != NULL, "filename mustn't be NULL"); if (rename(finfo->tmp_dvi_file, finfo->out_file) != 0 && !copy_file(finfo->tmp_dvi_file, finfo->out_file)) { popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Creating %s failed: %s", finfo->out_file, strerror(errno)); } else { /* moving worked */ TRACE_GUI((stderr, "renamed %s to %s\n", finfo->tmp_dvi_file, finfo->out_file)); if (info->pinfo->warn_files.stack_len > 0) { /* do we need to warn user about referenced files? */ char *warn_files = xstrdup(""); size_t i; for (i = 0; i < info->pinfo->warn_files.stack_len; i++) { warn_files = xstrcat(warn_files, info->pinfo->warn_files.items[i].content); warn_files = xstrcat(warn_files, "\n"); } popup_message(globals.widgets.top_level, MSG_INFO, "The files listed in the message (probably images) are not part " "of the newly created DVI file; they are only referenced by that file. " "Therefore, if you want to distribute this file or use it on a different computer," "you will need to distribute all the referenced files, too.\n\n" "Tip: A better format for distributing files is Postscript or PDF. " "To create a Postscript file, use the `File->Print' menu, " "then select `Print to file' in the dialog window.", "Created %s.\n" "Please note that the following files are referenced by this file, " "and are needed for displaying or printing it correctly:\n%s\n", finfo->out_file, warn_files); free(warn_files); } else { /* char *ptr = strrchr(finfo->out_file, '/'); */ /* if (ptr == NULL) */ /* ptr = finfo->out_file; */ /* else */ /* ptr++; */ popup_message(globals.widgets.top_level, MSG_INFO, NULL, "Created DVI file:\n%s.", finfo->out_file); } if (info->finfo->tmp_dvi_fp != NULL) { fclose(info->finfo->tmp_dvi_fp); info->finfo->tmp_dvi_fp = NULL; } unlink(finfo->tmp_dvi_file); info->finfo->tmp_dvi_file = NULL; } } break; case FMT_PS2PDF: free(finfo->tmp_ps_file); finfo->tmp_ps_file = NULL; tmp_fd = xdvi_temp_fd(&(finfo->tmp_ps_file)); /* this allocates finfo->tmp_ps_file */ if (tmp_fd == -1) { popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Couldn't create temporary PS file for conversion to PDF: %s", strerror(errno)); return; } else { TRACE_GUI((stderr, "name of temporary PS file: |%s|", finfo->tmp_ps_file)); } dvips_exit_proc = dvips_ps2pdf; /* call ps2pdf conversion after dvips exited */ do_pdf = True; /* fall through */ case FMT_PS: if (info->page_selection == PAGE_MARKED) { /* want to save selected pages? */ ASSERT(info->pinfo->callback != NULL, "Callback musn't be NULL!"); ASSERT(finfo->tmp_dvi_fp != NULL, "Temporary file pointer musn't be NULL!"); ASSERT(finfo->tmp_dvi_file != NULL, "Temporary filename musn't be NULL!"); select_pages(info); } if (info->printlog == NULL) printlog_create(info, "Xdvik: Saving", "Automatically close this window after file has been saved"); else printlog_enable_cancelbutton(info); if ((argv = create_dvips_argv(info, do_pdf)) == NULL) { /* something went *really* wrong; assume user has already been warned about it */ return; } fork_dvips(argv, info, dvips_exit_proc); /* dellocate argv */ for (i = 0; argv[i] != NULL; i++) { free(argv[i]); } free(argv); break; case FMT_ISO_8859_1: case FMT_UTF8: if (search_extract_text(info)) { popup_message(globals.widgets.top_level, MSG_INFO, NULL, "Created text file %s.", finfo->out_file); } else { popup_message(globals.widgets.top_level, MSG_INFO, NULL, "Extracting text from DVI file failed!"); } break; case FMT_NONE: break; } } void internal_print(struct save_or_print_info *info) { static struct callback_info cinfo = { cb_dvips_close, cb_dvips_cancel, cb_dvips_destroy, cb_dvips_keep }; char **argv = NULL; int i; info->callbacks = &cinfo; if (info->page_selection == PAGE_MARKED) { /* want to print selected pages? */ ASSERT(info->pinfo->callback != NULL, "Callback musn't be NULL!"); ASSERT(info->finfo->tmp_dvi_fp != NULL, "Temporary file pointer musn't be NULL!"); ASSERT(info->finfo->tmp_dvi_file != NULL, "Temporary filename musn't be NULL!"); select_pages(info); } if (info->printlog == NULL) printlog_create(info, "Xdvik: Printing", "Automatically close this window when printing finishes"); else printlog_enable_cancelbutton(info); if ((argv = create_dvips_argv(info, False)) == NULL) { /* something went *really* wrong; assume user has already been warned about it */ return; } fork_dvips(argv, info, dvips_exited); /* dellocate argv */ for (i = 0; argv[i] != NULL; i++) { free(argv[i]); } free(argv); } xdvik-ja-22.84.16-j1.40/texk/xdvik/image-magick.c0000664000175000017500000011563611276240141020654 0ustar uwabamiuwabami/* Imagemagick support for xdvik, written by Zhang Linbo 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ /* TODO: 1. Specials other than 'psfile=' and 'em:graph' which include image files. [ NOTE SU: I consider this more or less done now with the backtick parsing ;-) ] 2. Use an XtWorkProc or similar to do some background pre-processing of image files before they are displayed. 3. Replace popen() by fork and explicit pipes, and make the use of xdvi_temp_fd safer. 4. PS figs are always clipped to the bbox defined in the special string, which is not what we want when clip=false. The problem can be partly solved by increasing the value of the PSBW macro, or we may get the correct bbox by reading the '%%BoundingBox' or '%%HiresBoundingBox' lines in the PS file and set the image geometry accordingly. 5. The code only(?) works with true color displays. 6. There's also work to do to respond to window events in load_image() and display_image() functions. */ #include #include "xdvi-config.h" #include "xdvi.h" #include "dvi-init.h" #include "events.h" #include "dvi-draw.h" #include "util.h" #include "special.h" #include "image-magick.h" #ifdef MAGICK /* entire file */ #ifndef MAGICK_RENDER_PS # define MAGICK_RENDER_PS 0 #endif #include "magick/api.h" #if MAGICK_VER_MAJOR > 5 || MAGICK_VER_MINOR >= 4 # include "magick/xwindow.h" /* IM >= 5.4 */ #else # include "magick/xwindows.h" /* IM <= 5.3 */ #endif #if MAGICK_VER_MAJOR > 5 || MAGICK_VER_MINOR >= 4 /* >= 5.4 */ # define CATCH_EXCEPTION(e) do { \ if (e.severity != UndefinedException) CatchException(&e); } while (0) #elif MAGICK_VER_MINOR >= 3 /* 5.3 */ # define CATCH_EXCEPTION(e) if (image == NULL) \ MagickWarning(e.severity, e.reason, e.description); #else /* <= 5.2 (no check) */ # define CATCH_EXCEPTION(e) if (image == NULL) \ MagickWarning(e.severity, e.message, e.qualifier); #endif #if 0 #define CATCH_EXCEPTION(e) /* do nothing */ #endif #ifndef False # define False 0 #endif #ifndef True # define True 1 #endif #define TWOPI (2*3.141592653589793) static double ROUND_tmp; #define ROUND(x) ( (ROUND_tmp=(x)) >= 0 ? (long)(ROUND_tmp + 0.5) : \ - (long)(- ROUND_tmp + 0.5) ) static void showtime(const char *msg) { if (globals.debug & DBG_PS) { static double time0 = -1; double time; struct timeval tv; gettimeofday(&tv, (struct timezone *) 0); time = tv.tv_sec + (double) tv.tv_usec * 1e-6; if (time0 < 0) time0 = time; fprintf(stderr, " %-40s %0.4f\n", msg, time - time0); } } #define DPI ( resource.pixels_per_inch*0.001*magnification/mane.shrinkfactor ) typedef struct XDviImageInfo { Boolean clip; int rwi, rhi, angle; double llx, lly, urx, ury; char filename[MaxTextExtent]; } XDviImageInfo; typedef struct { XDviImageInfo info; XImage *ximage; /* ximage */ unsigned long bgpixel; /* background pixel */ int xoff, yoff; /* offsets in pixels */ } XDviImage; static size_t cache_size = 0; /* default value for cache_limit (16MB), it can be specified with the * "-magick_cache size" option */ static size_t cache_limit = 16 * 1024 * 1024; static int ncached = 0; static XDviImage *cache = NULL; static char *magick_tmp; static double current_dpi = -1; /* Input image types */ enum { TYPE_UNKNOWN, /* unknown */ TYPE_CONVERT, /* `convert ... */ }; static int image_type; /* type of current input image */ static void cleanup(void) { if (magick_tmp != NULL) unlink(magick_tmp); } static void free_ximage(XImage * ximage) { if (ximage == NULL) return; if (ximage->data != NULL) { free(ximage->data); ximage->data = NULL; } XDestroyImage(ximage); } static void clear_cache(void) { XDviImage *c; if (!ncached) return; for (c = cache; c < cache + ncached; c++) free_ximage(c->ximage); free(cache); ncached = 0; cache = NULL; cache_size = 0; } static void parse_backtick(char *fn) { char *p, *q, *r, c; if (fn[0] != '`') return; if (globals.debug & DBG_PS) fprintf(stderr, "Magick: parsing backtick command |%s|\n", fn); #ifdef __GNUC__ #warning FIXME: add code to execute the cmd then load the output file, \ if '-allowshell' is effective and the user requests it \ somehow (slow but reliable). #endif fn[0] = '\0'; p = fn + 1; /* Skip 'env' and 'VAR=value' */ do { while (isspace((int)*p)) ++p; q = p; while (*q != '\0' && !isspace((int)*q)) ++q; if (*q == '\0' || q <= p) return; if (((r = strchr(p, '=')) == NULL || r >= q) && (!isspace((int)*q) || strncmp(p, "env", 3))) break; p = q; } while (1); /* Now [p ... q-1] is the command name */ if (q - p == 7 && !memcmp(p, "convert", 7)) image_type = TYPE_CONVERT; else image_type = TYPE_UNKNOWN; p = q; do { while (isspace((int)*p)) ++p; q = p; if (*q == '`' || *q == '\'' || *q == '"') { c = *p; ++q; while (*q != '\0' && *q != c) q++; if (*q != '\0') q++; } else { while (*q != '\0' && !isspace((int)*q)) q++; } #ifdef __GNUC__ #warning FIXME: check for some cmdline options break; #endif } while (1); *q = '\0'; if (globals.debug & DBG_PS) fprintf(stderr, "Magick: filename=|%s|\n", p); /* check for the case `kpsewhich -n ... #1` */ if (*p == '`') { #if 0 /* WARNING: unsafe! */ FILE *pipe; if (globals.debug & DBG_PS) fprintf(stderr, "Magick: executing %s\n", p); if (*(--q) == '`') *q = '\0'; if ((pipe = popen(p + 1, "r")) == NULL) return; fscanf(pipe, "%s", fn); pclose(pipe); return; #else if (memcmp(++p, "kpsewhich", sizeof("kpsewhich") - 1)) return; #ifdef __GNUC__ #warning FIXME: better make KPSE library call here. #endif if (*(--q) == '`') --q; while (q >= p && isspace((int)*q)) --q; if (q < p) return; *(q + 1) = '\0'; while (q >= p && !isspace((int)*q)) --q; p = q + 1; #endif } strcpy(fn, p); } static Boolean imagick_eps_to_jpeg(const char *fullpath, unsigned long *columns, unsigned long *rows, XDviImage *img, PixelPacket *bgcolor, double xdpi, double ydpi) { size_t size; #ifdef __GNUC__ #warning FIXME: security (check 'allowshell'?), backticks, pathname canonicalization, /* note SU: better use fork()/exec() here, popen() is too unsafe. */ #endif static char *cmdline = NULL; static size_t cmdline_size = 0; static char *fmt = "%s -q -dBATCH -dMaxBitmap=300000000 " "-dNOPAUSE -dNOSAFER -sDEVICE=jpeg " "-dTextAlphaBits=4 -dGraphicsAlphaBits=4 " "-g%ldx%ld -r%0.4fx%0.4f -sOutputFile=%s - -c quit"; static const char strsafe[] = "{ << /PermitFileReading [ (*) ] /PermitFileWriting [ ] /PermitFileControl [ ] " ">> setuserparams .locksafe " "} stopped pop\n"; FILE *pipe; showtime("PS/EPS -> JPEG:"); /* Add a border to the drawing box (PSBW=border width in bp) */ #define PSBW 1 *columns += ROUND(2 * PSBW / 72.0 * xdpi); *rows += ROUND(2 * PSBW / 72.0 * ydpi); img->xoff = ROUND(PSBW / 72.0 * xdpi); img->yoff = -ROUND(PSBW / 72.0 * ydpi); size = strlen(fmt) + 25 * 2 + 10 * 2 + strlen(magick_tmp) + strlen(resource.gs_path) + 1; if (size > cmdline_size) { cmdline_size = size; cmdline = xrealloc(cmdline, cmdline_size); } unlink(magick_tmp); sprintf(cmdline, fmt, resource.gs_path, *columns, *rows, xdpi, ydpi, magick_tmp); if ((pipe = popen(cmdline, "w")) == NULL) { fprintf(stderr, "%s: Cannot execute %s, ignoring image %s.\n", globals.program_name, resource.gs_path, fullpath); return False; } #define ColorToPixelPacket(c) ((c*((1L<<(QuantumDepth))-1L)+32768L)/65535L) #define UnifiedColorValue(c) ((c)/(double)((1L<<(QuantumDepth))-1L)) #ifdef __GNUC__ #warning FIXME: how to control roundoff error which may produce a \ different backgroung pixel in the output image? #endif #if COLOR bgcolor->red = ColorToPixelPacket(bg_current->color.r); bgcolor->green = ColorToPixelPacket(bg_current->color.g); bgcolor->blue = ColorToPixelPacket(bg_current->color.b); #else bgcolor->red = bgcolor->green = bgcolor->blue = ColorToPixelPacket(65535); #endif bgcolor->opacity = (1L << QuantumDepth) - 1L; #ifdef __GNUC__ #warning FIXME: how to set bg color within gs (instead of filling the bbox) ? #endif if (resource.gs_safer) { fprintf(pipe, strsafe); } /* fill PS paper with background color */ fprintf(pipe, "newpath -5 -5 moveto %f 0 rlineto " "0 %f rlineto %f 0 rlineto 0 %f rlineto " "closepath %f %f %f setrgbcolor fill\n", img->info.urx - img->info.llx + 2 * (PSBW + 5), img->info.ury - img->info.lly + 2 * (PSBW + 5), -(img->info.urx - img->info.llx + 2 * (PSBW + 5)), -(img->info.ury - img->info.lly + 2 * (PSBW + 5)), UnifiedColorValue(bgcolor->red), UnifiedColorValue(bgcolor->green), UnifiedColorValue(bgcolor->blue)); /* shift PS coordinates */ fprintf(pipe, "%f %f translate\n", -img->info.llx + PSBW, -img->info.lly + PSBW); if (globals.debug & DBG_PS) fprintf(stderr, " clip=%s\n", img->info.clip ? "yes" : "no"); if (img->info.clip) { fprintf(pipe, "newpath %f %f moveto %f 0 rlineto 0 %f rlineto " "%f 0 rlineto 0 %f rlineto closepath clip\n", img->info.llx, img->info.lly, img->info.urx - img->info.llx, img->info.ury - img->info.lly, -(img->info.urx - img->info.llx), -(img->info.ury - img->info.lly)); } fprintf(pipe, "%f %f moveto\n", img->info.llx, img->info.lly); fprintf(pipe, "(%s) run showpage\n", fullpath); pclose(pipe); return True; } static Image * rotate_image(XDviImage *img, Image *image, ExceptionInfo exception) { Image *tmp_image; unsigned long w = image->columns, h = image->rows; double sin_a = sin(img->info.angle * (TWOPI / 360)); double cos_a = cos(img->info.angle * (TWOPI / 360)); if (globals.debug & DBG_PS) fprintf(stderr, "\t rotating image by %d degrees\n", img->info.angle); /* adjust xoff, yoff, assuming (0,0) the origin of rotation */ if (img->xoff || img->yoff) { double a, b; a = img->xoff * cos_a + img->yoff * sin_a; b = -img->xoff * sin_a + img->yoff * cos_a; img->xoff = ROUND(a); img->yoff = ROUND(b); } showtime("RotateImage:"); tmp_image = RotateImage(image, -(double)img->info.angle, &exception); DestroyImage(image); image = tmp_image; CATCH_EXCEPTION(exception); if (image == NULL) return NULL; /* * _______________________________________ * | * | * | * * | * | * * | * | * * | * | * * | * | * * | * | * * | * | * * | * | * * | * |* *| * | * * | * | * * | * | * * | * | * * | * | * * | * | * * | * | * * | * | * * | * | O (origin) | * O-------------------------------------- * (lower-left corner of image box after rotation) */ if (img->info.angle <= 90) { img->xoff += ROUND(h * sin_a); } else if (img->info.angle <= 180) { img->xoff += ROUND(h * sin_a - w * cos_a); img->yoff += ROUND(h * cos_a); } else if (img->info.angle <= 270) { img->xoff -= ROUND(w * cos_a); img->yoff += ROUND(w * sin_a + h * cos_a); } else { img->yoff += ROUND(w * sin_a); } return image; } static Image * crop_shift_image(XDviImage *img, Image *image, unsigned long *columns, unsigned long *rows, double xscale, double yscale, ExceptionInfo exception) { /* ZLB: the code below works for the case where the BoundingBox * of the PS figure generated by the shell command is (0 0 w h), * where w and h are the pixel width and height of the input image. * (this is true for the program 'convert' without options). * The image should then be cropped or/and shifted depending * on the value of 'clip' */ int w = image->columns, h = image->rows; if (globals.debug & DBG_PS) fprintf(stderr, "Magick: type of input image = CONVERT\n"); if (!img->info.clip) { /* We only need to shift the image */ img->xoff = +ROUND(xscale * DPI * img->info.llx / 72.0); img->yoff = -ROUND(yscale * DPI * img->info.lly / 72.0); *columns = ROUND(xscale * DPI * w / 72.0); *rows = ROUND(yscale * DPI * h / 72.0); } else { int llx = ROUND(img->info.llx); int lly = ROUND(img->info.lly); int urx = ROUND(img->info.urx); int ury = ROUND(img->info.ury); if (llx < 0) { img->xoff = +ROUND(xscale * DPI * llx / 72.0); llx = 0; } if (lly < 0) { img->yoff = -ROUND(yscale * DPI * lly / 72.0); lly = 0; } if (urx > w) urx = w; if (ury > h) ury = h; if ((urx - llx) < 1 || (urx - llx) < 1) { DestroyImage(image); return NULL; } if (llx != 0 || lly != 0 || urx != w || ury != h) { /* Crop the image */ Image *tmp_image; RectangleInfo geo; geo.width = urx - llx; geo.height = ury - lly; geo.x = llx; geo.y = h - ury; if (globals.debug & DBG_PS) fprintf(stderr, "\t cropping image (%d %d %d %d)\n", llx, lly, urx, ury); showtime("CropImage:"); tmp_image = CropImage(image, &geo, &exception); DestroyImage(image); image = tmp_image; CATCH_EXCEPTION(exception); if (image == NULL) return NULL; /* error cropping image */ } *columns = ROUND(xscale * DPI * (urx - llx) / 72.0); *rows = ROUND(yscale * DPI * (ury - lly) / 72.0); } return image; } /* parse and return the `magick_cache' resource size_str */ static long parse_cache_setting(const char *size_str) { char *p; long size = strtol(size_str, &p, 0); switch (*p) { case 'g': case 'G': size *= 1024; /* fall through */ case 'm': case 'M': size *= 1024; /* fall through */ case 'k': case 'K': size *= 1024; break; default: if (*p != '\0') { fprintf(stderr, "Magick: invalid suffix (%c) in " "magick_cache option\n", *p); } } return size; } static XDviImage * load_image(XDviImageInfo *info) { static ExceptionInfo exception; static ImageInfo *image_info; static XVisualInfo visual_info; static XStandardColormap map_info; static Boolean initialized = False; static Boolean disabled = False; static XDviImage img = { {False, 0, 0, 0, 0, 0, 0, 0, ""}, NULL, 0, 0, 0 }; Image *image, *tmp_image; PixelPacket *pp; double xscale, yscale, xdpi, ydpi; int n; unsigned int x, y; unsigned long columns, rows; char density[40]; size_t size; char *fn = info->filename; XDviImage *c; PixelPacket bgcolor; struct stat statbuf; char *path, *fullpath; char canonical_path[MAXPATHLEN + 1]; if (disabled) return NULL; parse_backtick(info->filename); if (info->filename[0] == '\0') { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: skipping malformed backtick command.\n"); return NULL; } else { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: filename=|%s|\n", info->filename); } img.info = *info; if (globals.debug & DBG_PS) fprintf(stderr, "Magick: load_image: fn=%s\n", fn); /* check for changes in mag/shrink/resolution */ if (fabs(current_dpi - DPI) > 1e-4) { current_dpi = DPI; clear_cache(); } /* look it up in the cache */ if (ncached) { for (c = cache; c < cache + ncached; c++) { if (memcmp(&c->info, info, sizeof *info)) continue; if (globals.debug & DBG_PS) fprintf(stderr, " Image found in cache.\n"); return c; } } if (!initialized) { magick_tmp = NULL; if ((n = xdvi_temp_fd(&magick_tmp)) == -1) { fprintf(stderr, "Magick: cannot create tmp filename, disabled.\n"); disabled = True; return NULL; } /* FIXME: mustn't close filedescriptor returned by xdvi_temp_fd(), else we have a race condition again; see e.g. http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/avoid-race.html */ close(n); unlink(magick_tmp); atexit(cleanup); /* remove magick_tmp at exit. */ showtime("Initializing load_image:"); InitializeMagick("xdvi.bin"); GetExceptionInfo(&exception); image_info = CloneImageInfo((ImageInfo *) NULL); if (!XMatchVisualInfo(DISP, XScreenNumberOfScreen(SCRN), G_depth, G_visual->class, &visual_info)) { fprintf(stderr, "Magick: can't get visual info, image disabled.\n"); disabled = True; return NULL; } if (resource.magick_cache != NULL) { cache_limit = parse_cache_setting(resource.magick_cache); if (globals.debug & DBG_PS) fprintf(stderr, " Setting magick_cache to %lu\n", (unsigned long)cache_limit); } initialized = True; } xscale = info->rwi / (double) ((int) (10 * (info->urx - info->llx) + .5)); yscale = info->rhi / (double) ((int) (10 * (info->ury - info->lly) + .5)); xdpi = xscale * DPI; ydpi = yscale * DPI; /* Compute scaled size of the image */ columns = ROUND(DPI * info->rwi * 0.1 / 72); rows = ROUND(DPI * info->rhi * 0.1 / 72); if (globals.debug & DBG_PS) fprintf(stderr, "\tscale=%0.2fx%0.2f, dpi=%0.2fx%0.2f, size=%ldx%ld\n", xscale, yscale, xdpi, ydpi, columns, rows); /* expand and canonicalize path name */ path = find_file(fn, &statbuf, kpse_pict_format); if (path != NULL) { fullpath = REALPATH(path, canonical_path); if (fullpath == NULL) { XDVI_WARNING((stderr, "Couldn't canonicalize %s to full path - returning unexpanded.", path)); fullpath = path; } else { free(path); } } else { fprintf(stderr, "%s: %s:%d: Can't find image file %s!\n", globals.program_name, __FILE__, __LINE__, fn); return NULL; } /* If the file is PS/EPS transform it to JPEG first (faster) */ n = strlen(fullpath); if ((n >= 3 && !memicmp(fullpath + n - 3, ".ps", 3)) || (n >= 4 && !memicmp(fullpath + n - 4, ".eps", 4))) { if (!imagick_eps_to_jpeg(fullpath, &columns, &rows, &img, &bgcolor, xdpi, ydpi)) { return NULL; } /* Should we append the 'JPEG:' prefix to the filename to help * ImageMagick to identify the file format? */ fullpath = magick_tmp; } else { img.xoff = img.yoff = 0; } strcpy(image_info->filename, fullpath); showtime("ReadImage:"); if (fullpath == magick_tmp) { /* seems 'density' only affects image size of PS/EPS files */ sprintf(density, "%0.2fx%0.2f", xdpi, ydpi); image_info->density = density; image_info->units = PixelsPerInchResolution; } image = ReadImage(image_info, &exception); CATCH_EXCEPTION(exception); unlink(magick_tmp); if (image == NULL) /* error loading image */ return NULL; /* Set background color for PS/EPS fig */ if (fullpath == magick_tmp) /* input is PS */ image->background_color = bgcolor; if (globals.debug & DBG_PS) { int i = image->units; fprintf(stderr, "\t image size = %ldx%ld\n", image->columns, image->rows); fprintf(stderr, "\t image resolution = %0.2fx%0.2f (units=%s)\n", image->x_resolution, image->y_resolution, i == UndefinedResolution ? "???" : i == PixelsPerInchResolution ? "PPI" : "PPCM"); } if (fullpath != magick_tmp) { /* non PS image */ /* Note: (info->llx info->lly info->urx info->ury) should be * regarded as the viewport */ if (image_type == TYPE_CONVERT) { image = crop_shift_image(&img, image, &columns, &rows, xscale, yscale, exception); } else { /* Do nothing. The image will be scaled to the size of the bbox. * ZLB: the output will be identical to dvips iff the bbox of * the PS figure generated by the shell command is equal to * (info->llx info->lly info->urx info->ury). * (this is true if the bbox set via 'bb', 'viewport', etc., * is equal to the real bbox of the PS figure) */ } if (columns != image->columns || rows != image->rows) { /* Scale image */ if (globals.debug & DBG_PS) { fprintf(stderr, "\t scaling image %ldx%ld -> %ldx%ld\n", image->columns, image->rows, columns, rows); } showtime("ScaleImage:"); tmp_image = ScaleImage(image, columns, rows, &exception); DestroyImage(image); image = tmp_image; CATCH_EXCEPTION(exception); if (image == NULL) return NULL; /* error resizing image */ } } /* rotate image */ if (info->angle) { image = rotate_image(&img, image, exception); } #if 0 DescribeImage(image, stdout, 1 /* verbosity */ ); DisplayImages(image_info, image); #endif #define XStandardPixel(map,color,dx) (unsigned long) (map.base_pixel + \ (((color).red * map.red_max + (1L << (dx - 1L))) / ((1L << dx) - 1L)) * map.red_mult + \ (((color).green * map.green_max + (1L << (dx - 1L))) / ((1L << dx) - 1L)) * map.green_mult + \ (((color).blue * map.blue_max + (1L << (dx - 1L))) / ((1L << dx) - 1L)) * map.blue_mult) img.bgpixel = XStandardPixel(map_info, image->background_color, 16); #undef XStandardPixel if (img.ximage != NULL) { free_ximage(img.ximage); img.ximage = NULL; } /* Transform to XImage */ pp = GetImagePixels(image, 0, 0, image->columns, image->rows); img.ximage = XCreateImage(DISP, G_visual, G_depth, ZPixmap, 0, NULL, image->columns, image->rows, BMBITS, 0); if (img.ximage == NULL) return NULL; size = img.ximage->bytes_per_line * img.ximage->height; img.ximage->data = malloc(size ? size : 1); /* NOTE: no xmalloc! */ if (img.ximage->data == NULL) { fprintf(stderr, "Magick: cannot allocate memory for ximage data.\n"); XDestroyImage(img.ximage); img.ximage = NULL; return NULL; } for (y = 0; y < image->rows; y++) { for (x = 0; x < image->columns; x++, pp++) { struct rgb color; color.r = USHRT_MAX * pp->red / MaxRGB; color.g = USHRT_MAX * pp->green / MaxRGB; color.b = USHRT_MAX * pp->blue / MaxRGB; XPutPixel(img.ximage, x, y, alloc_color(&color, img.bgpixel)); } } DestroyImage(image); size += sizeof(XDviImage) + sizeof(XImage); if (cache_size + size > cache_limit) { if (globals.debug & DBG_PS) fprintf(stderr, " image not cached (cache limit).\n"); return &img; } c = realloc(cache, sizeof(XDviImage) * (ncached + 1)); /* NOTE: no xrealloc! */ if (c == NULL) { if (globals.debug & DBG_PS) fprintf(stderr, " image not cached (cache alloc).\n"); return &img; } cache_size += size; cache = c; c = cache + (ncached++); *c = img; img.ximage = NULL; /* so next call won't delete this ximage */ if (globals.debug & DBG_PS) fprintf(stderr, " image cached (cache_size=%uKB, limit=%uKB).\n", cache_size / 1024, cache_limit / 1024); #if 0 DestroyImageInfo(image_info); DestroyExceptionInfo(&exception); DestroyMagick(); #endif return c; } static void display_image(XDviImage * img, int xul, int yul, const struct window_expose_info *expose, const GC gc) { if (globals.debug & DBG_PS) fprintf(stderr, " display_image: pos=%d, %d\n", xul, yul); xul -= img->xoff; yul -= img->yoff; #if 0 XPutImage(DISP, mane.win, globals.gc.copy, img->ximage, 0, 0, xul, yul - img->ximage.height + 1, img->ximage->width, img->ximage->height); #else /* Try to make background pixels transparent */ { XImage *scr; int x0 = xul; int y0 = yul - img->ximage->height + 1; int w = img->ximage->width; int h = img->ximage->height; int xoff = 0; int yoff = 0; int x, y; if (x0 + w <= expose->min_x || x0 >= expose->max_x || y0 + h <= expose->min_y || y0 >= expose->max_y) return; if (x0 < expose->min_x) { xoff = expose->min_x - x0; x0 = expose->min_x; w -= xoff; } if (x0 + w > expose->max_x) w = expose->max_x - x0 + 0; if (y0 < expose->min_y) { yoff = expose->min_y - y0; y0 = expose->min_y; h -= yoff; } if (y0 + h > expose->max_y) h = expose->max_y - y0 + 0; { /* Need to double check the bounds here, because redraw_page() in * events.c may set larger bounding box (expose->min_x, expose->min_y, etc.) * than actual viewport causing 'BadMatch' error in XGetImage(). * * Here we clip the rectangle w*h+x0+y0 with the root window. */ XWindowAttributes a; Status status; Window child; status = XGetWindowAttributes(DISP, mane.win, &a); if (!status || a.map_state != IsViewable) return; XTranslateCoordinates(DISP, mane.win, a.root, x0, y0, &x, &y, &child); XGetWindowAttributes(DISP, a.root, &a); if (x + w <= a.x || x >= a.x + a.width || y + h <= a.y || y >= a.y + a.height) return; if (x < a.x) { x0 += a.x - x; xoff += a.x - x; w -= a.x - x; x = a.x; } if (x + w > a.x + a.width) w = a.x + a.width - x; if (y < a.y) { y0 += a.y - y; yoff += a.y - y; h -= a.y - y; y = a.y; } if (y + h > a.y + a.height) h = a.y + a.height - y; #if 0 XDrawLine(DISP, mane.win, gc, x0, y0, x0 + w - 1, y0); XDrawLine(DISP, mane.win, gc, x0 + w - 1, y0, x0 + w - 1, y0 + h - 1); XDrawLine(DISP, mane.win, gc, x0 + w - 1, y0 + h - 1, x0, y0 + h - 1); XDrawLine(DISP, mane.win, gc, x0, y0 + h - 1, x0, y0); XDrawLine(DISP, mane.win, gc, x0, y0, x0 + w - 1, y0 + h - 1); XDrawLine(DISP, mane.win, gc, x0 + w - 1, y0, x0, y0 + h - 1); XDrawLine(DISP, mane.win, gc, expose->min_x, expose->min_y, expose->max_x, expose->min_y); XDrawLine(DISP, mane.win, gc, expose->max_x, expose->min_y, expose->max_x, expose->max_y); XDrawLine(DISP, mane.win, gc, expose->max_x, expose->max_y, expose->min_x, expose->max_y); XDrawLine(DISP, mane.win, gc, expose->min_x, expose->max_y, expose->min_x, expose->min_y); XDrawLine(DISP, mane.win, gc, expose->max_x, expose->max_y, expose->min_x, expose->min_y); XDrawLine(DISP, mane.win, gc, expose->min_x, expose->max_y, expose->max_x, expose->min_y); #endif } #ifdef __GNUC__ #warning FIXME: GetImage may still produce 'BadMatch' when dragging \ the window around (toward outside of the desktop). #endif scr = XGetImage(DISP, mane.win, x0, y0, w, h, AllPlanes, ZPixmap); #warning FIXME: the loops are only a quick hack and are slow. for (y = 0; y < h; y++) for (x = 0; x < w; x++) { unsigned long pixel = 0; pixel = XGetPixel(img->ximage, x + xoff, y + yoff); if (pixel == img->bgpixel) continue; XPutPixel(scr, x, y, pixel); } XPutImage(DISP, mane.win, globals.gc.copy, scr, 0, 0, x0, y0, w, h); XDestroyImage(scr); } #endif showtime(" Done."); } static void render_image_file(XDviImageInfo *info, int x, int y) { XDviImage *im = NULL; int w, h; if (globals.debug & DBG_PS) fprintf(stderr, "Magick: render_image_file: pos=(%d,%d)\n", x, y); #ifdef __GNUC__ #warning FIXME: immediate return if image not exposed. #endif if (!INSIDE_MANE_WIN) return; info->angle = bbox_angle >= 0 ? bbox_angle % 360 : 360 - (-bbox_angle) % 360; if (globals.debug & DBG_PS) fprintf(stderr, "Magick: render_image_file: angle=%d\n", info->angle); if (resource.postscript && (im = load_image(info)) != NULL) display_image(im, x, y, &globals.win_expose, globals.gc.rule); if (im != NULL && resource.postscript == 1) return; /* Draw bbox of the image */ w = ROUND(DPI * info->rwi / 720.0); h = ROUND(DPI * info->rhi / 720.0); if (globals.debug & DBG_PS) fprintf(stderr, "Magick: render_image_file: box=%dx%d+%d+%d\n", w, h, x, y - h + 1); if (!info->angle) { XDrawRectangle(DISP, currwin.win, globals.gc.high, x, y - h + 1, w, h); } else { #if 1 bbox_valid = True; bbox_width = w; bbox_height = bbox_voffset = h; save_bbox(); bbox_valid = False; #else /* code borrowed from special.c:draw_bbox() */ double sin_a = sin(info->angle * (TWOPI / 360)); double cos_a = cos(info->angle * (TWOPI / 360)); double a, b, c, d; a = cos_a * (w-1); b = -sin_a * (w-1); c = -sin_a * (h-1); d = -cos_a * (h-1); XDrawLine(DISP, currwin.win, globals.gc.high, x, y, x + ROUND(a), y + ROUND(b)); XDrawLine(DISP, currwin.win, globals.gc.high, x + ROUND(a), y + ROUND(b), x + ROUND(a + c), y + ROUND(b + d)); XDrawLine(DISP, currwin.win, globals.gc.high, x + ROUND(a + c), y + ROUND(b + d), x + ROUND(c), y + ROUND(d)); XDrawLine(DISP, currwin.win, globals.gc.high, x + ROUND(c), y + ROUND(d), x, y); #endif } } #if !MAGICK_RENDER_PS static Boolean is_ps(char *fn) { int l; char *p; if (strchr(fn, '`') != NULL) return False; l = strlen(fn); p = fn + l - 1; while (p > fn && *p != '.' && *p != '/') p--; l -= p - fn; if (*p == '.' && ((l >= 3 && !memicmp(p, ".ps", 3)) || (l >= 4 && !memicmp(p, ".eps", 4)))) { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: passing PS/EPS file to psgs.c\n"); return True; } return False; } #endif /* Process EPSF specials */ static Boolean epsf_special(char *cp) { char *filename; unsigned filename_len; char *p; int n; unsigned long flags = 0, u; double rwi, rhi; enum { LLX, LLY, URX, URY, RWI, RHI, HSIZE, VSIZE, HOFFSET, VOFFSET, HSCALE, VSCALE, ANGLE }; XDviImageInfo info; struct { double val; const char *key; long mask; } key_info[] = { { 0, "llx", 0x0001 }, { 0, "lly", 0x0002 }, { 0, "urx", 0x0004 }, { 0, "ury", 0x0008 }, { 0, "rwi", 0x0010 }, { 0, "rhi", 0x0020 }, { 0, "hsize", 0x0040 }, { 0, "vsize", 0x0080 }, { 0, "hoffset", 0x0100 }, { 0, "voffset", 0x0200 }, { 0, "hscale", 0x0400 }, { 0, "vscale", 0x0800 }, { 0, "angle", 0x1000 }, }; memset(&info, 0, sizeof info); /* for validating memcmp(&info, ... */ filename = cp; if (*cp == '\'' || *cp == '"') { do ++cp; while (*cp != '\0' && *cp != *filename); filename_len = cp - filename - 1; if (*cp == *filename) ++cp; ++filename; } else { while (*cp != '\0' && !isspace((int)*cp)) ++cp; filename_len = cp - filename; } if (filename_len + 1 > MaxTextExtent) { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: filename too long, passing to psgs.c\n"); return False; } memcpy(info.filename, filename, filename_len); /* no need to terminate because of memset(...) above */ if (globals.debug & DBG_PS) fprintf(stderr, "Magick: epsf_special: filename = '%s'\n", info.filename); #if !MAGICK_RENDER_PS if (is_ps(info.filename)) return False; #endif /* Scan for EPSF keywords */ while (*cp != '\0') { while (isspace((int)*cp)) ++cp; p = cp; while (*p != '=' && !isspace((int)*p) && *p != '\0') p++; n = p - cp; if (!n) break; if (*p == '=') ++p; while (isspace((int)*p)) ++p; if (!memcmp(cp, "clip", n)) { /* this is the only key without value */ info.clip = True; } else { size_t i; Boolean found = False; for (i = 0; !found && i < XtNumber(key_info); i++) { if (memicmp(cp, key_info[i].key, n) == 0) { if (sscanf(p, "%lf", &(key_info[i].val)) == 1) { flags |= key_info[i].mask; while (!isspace((int)*p) && *p != '\0') ++p; found = True; } else { fprintf(stderr, "Magick: invalid value for %s\n", key_info[i].key); return False; } } } if (!found) { i = *(cp + n); *(cp + n) = '\0'; fprintf(stderr,"Magick: ignoring unknown EPSF key \"%s\".\n", cp); *(cp + n) = i; /* skip '=...' */ while (*p != '\0' && !isspace((int)*p)) ++p; } } cp = p; } if (globals.debug & DBG_PS) fprintf(stderr, "Magick: epsf_special: flags = 0x%lx\n", flags); /* only accept the special when llx, lly, urx, ury are properly defined */ u = key_info[LLX].mask | key_info[LLY].mask | key_info[URX].mask | key_info[URY].mask; if ((flags & u) != u) return False; #ifdef __GNUC__ #warning keywords to handle: [hv]size, [hv]offset, [hv]scale, angle \ (ZLB: not used by the graphicx/graphics packages) #endif if (flags & (key_info[HSIZE].mask | key_info[VSIZE].mask | key_info[HOFFSET].mask | key_info[VOFFSET].mask | key_info[HSCALE].mask | key_info[VSCALE].mask | key_info[ANGLE].mask)) fprintf(stderr, "Magick: warning: EPSF keywords '[hv]size', " "'[hv]offset', '[hv]scale', and 'angle' are not " "implemented.\n"); info.urx = key_info[URX].val; info.ury = key_info[URY].val; info.llx = key_info[LLX].val; info.lly = key_info[LLY].val; rwi = key_info[RWI].val; rhi = key_info[RHI].val; if (globals.debug & DBG_PS) fprintf(stderr, "Magick: epsf_special: llx=%0.2f, lly=%0.2f, " "urx=%0.2f, ury=%0.2f\n", info.llx, info.lly, info.urx, info.ury); if (info.urx - info.llx < 1 || info.ury - info.lly < 1) return False; if (info.urx - info.llx > 1e+4 || info.ury - info.lly > 1e+4) return False; if (fabs(info.llx) > 1e+10 || fabs(info.lly) > 1e+10) return False; if (!(flags & (key_info[RWI].mask | key_info[RHI].mask))) { /* both rwi and rhi undefined */ rwi = 10 * (info.urx - info.llx); rhi = 10 * (info.ury - info.lly); } else if (!(flags & key_info[RWI].mask)) { /* rwi undefined, rhi defined */ rwi = rhi * (info.urx - info.llx) / (info.ury - info.lly); } else if (!(flags & key_info[RHI].mask)) { /* rhi undefined, rwi defined */ rhi = rwi * (info.ury - info.lly) / (info.urx - info.llx); } if (globals.debug & DBG_PS) fprintf(stderr, "Magick: epsf_special: rwi=%f, rhi=%f\n", rwi, rhi); if (rwi < 1 || rhi < 1) return False; /* We don't want IM to process large images (>16MB) */ if (DPI * rwi / 720 * DPI * rhi / 720 * G_depth / 8 / 1024 / 1024 > 16) { p = filename + (n = filename_len); if ((n >= 3 && !memicmp(p - 3, ".ps", 3)) || (n >= 4 && !memicmp(p - 4, ".eps", 4))) { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: image too large, passing to psgs.c\n"); return False; } else { /* don't pass non-PS files to psgs.c */ if (globals.debug & DBG_PS) fprintf(stderr, "Magick: image too large, ignored.\n"); return True; } } info.rwi = ROUND(rwi); info.rhi = ROUND(rhi); render_image_file(&info, PXL_H - currwin.base_x, PXL_V - currwin.base_y); return True; } static char * emgraph_get_dimen(char *cp, double *v) { char *p; typedef struct { int name_len; char *name; double factor; } Unit; Unit *u; /* table for converting an arbitrary unit to bp */ #define UNIT(u) sizeof(u)-1, u static Unit units[] = { { UNIT("bp"), 1.0 }, { UNIT("in"), 72.0 }, { UNIT("cm"), 72.0 / 2.54 }, { UNIT("mm"), 72.0 / 2.54 * 0.1 }, { UNIT("pt"), 72.0 / 72.27 }, { UNIT("sp"), 72.0 / 72.27 / 65536.0 }, { UNIT("pc"), 12.0 * 72.0 / 72.27 }, { UNIT("dd"), 1238.0 / 1157.0 * 72.0 / 72.27 }, { UNIT("cc"), 12.0 * 1238.0 / 1157.0 * 72.0 / 72.27 } }; *v = strtod(cp, &p); if (p == NULL) { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: can't get dimension, image ignored.\n"); return NULL; } while (isspace((int)*p)) ++p; for (u = units; u < units + XtNumber(units); u++) if (!memicmp(p, u->name, u->name_len)) break; if (u >= units + XtNumber(units)) { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: unknown unit, image ignored.\n"); return NULL; } *v *= u->factor; if (globals.debug & DBG_PS) fprintf(stderr, "Magick: unit=%s, len=%d, factor=%0.4f, value=%0.4f\n", u->name, u->name_len, u->factor, *v); if (*v < 0.01 || *v > 10000) { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: invalid dimension, image ignored.\n"); return NULL; } return p + u->name_len; } static Boolean emgraph_special(char *cp) { char *p; double w, h; XDviImageInfo info; memset(&info, 0, sizeof info); /* get filename */ while (isspace((int)*cp)) ++cp; p = cp; while (!isspace((int)*p) && *p != '\0' && *p != ',') ++p; if ((unsigned)(p - cp) >= sizeof info.filename) { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: filename too long, image ignored.\n"); return False; } if (p <= cp) { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: empty filename, image ignored.\n"); return False; } memcpy(info.filename, cp, p - cp); /* no need to terminate because of memset(...) above */ if (globals.debug & DBG_PS) fprintf(stderr, "Magick: emgraph_special: filename = '%s'\n", info.filename); #if !MAGICK_RENDER_PS if (is_ps(info.filename)) return False; #endif cp = p; /* get width */ if ((cp = strchr(cp, ',')) == NULL) { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: width undefined, image ignored.\n"); return False; } if ((cp = emgraph_get_dimen(++cp, &w)) == NULL) return False; /* get height */ if ((cp = strchr(cp, ',')) == NULL) { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: height undefined, image ignored.\n"); return False; } if ((cp = emgraph_get_dimen(++cp, &h)) == NULL) return False; if (globals.debug & DBG_PS) fprintf(stderr, "Magick: filename=\"%s\", width=%0.2f, height=%0.2f\n", info.filename, w, h); info.llx = info.lly = 0; info.urx = w; info.ury = h; info.rwi = ROUND(10 * w); info.rhi = ROUND(10 * h); if (info.rwi < 1 || info.rhi < 1) return False; render_image_file(&info, PXL_H - currwin.base_x, PXL_V - currwin.base_y + ROUND(h / 72 * DPI) - 1); return True; } /* Filter specials. Returns True if the special has been processed * by ImageMagick, False otherwise. */ Boolean Magick_parse_special(char *cp) { switch (*cp) { case 'p': case 'P': if (!memicmp(cp, "psfile", 6)) { if (globals.debug & DBG_PS) fprintf(stderr, "Magick: parsing string |%s|\n", cp); cp += 6; while (isspace((int)*cp)) ++cp; if (*cp != '=') return False; do ++cp; while (isspace((int)*cp)); return epsf_special(cp); } break; case 'e': case 'E': if (!memicmp(cp, "em:", 3)) { cp += 3; while (isspace((int)*cp)) ++cp; if (memicmp(cp, "graph", 5)) return False; cp += 5; if (globals.debug & DBG_PS) fprintf(stderr, "Magick: parsing string |em:graph %s|\n", cp); return emgraph_special(cp); } break; } return False; } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* MAGICK */ xdvik-ja-22.84.16-j1.40/texk/xdvik/texmf-alt/0000775000175000017500000000000011730170101020053 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/texk/xdvik/texmf-alt/xdvi.cfg0000664000175000017500000000643710363262237021535 0ustar uwabamiuwabami% original xdvi.cfg -- Configuration file for the Type1 rendering module of xdvi. % (If you change or delete `original' in the first line of this file, % new xdvik installations won't overwrite this file.) % % Lines starting with `%' are comments. % % Version 1.0 for xdvik-22.x and teTeX < 1.0 or non-teTeX installations, % 2003/02/28 % % Original version by Nicolai Langfeldt 2001/06/05 % NOTE TO TETEX USERS: For teTeX >= v1.0, use the file texmf/xdvi.cfg % instead. That file uses ps2pk.map which will automatically be updated % by teTeX's `updmap' script; by contrast, the map files listed in Section 2 % below need to be maintained manually. % =============== Section 1: Encodings =============== % % Here we list all the encodings we want xdvi to recognize as an % "implied" encoding. This means that ptmr8r will be recognized as % ptmr encoded with 8r and ptmr8y as ptmr encoded with 8y. If the font file % we want to encode with 8r is named ptmr8a, however, this must be listed in % the map file entry. % NOTE: the enc files used by xdvi are similar to those used by dvips, % whith the important exception that xdvi _cannot_ parse postscript, % so the vectors mustn't require postscript execution. % Suffix Encoding name Defined by this file enc 8r TeXBase1Encoding 8r.enc enc 8c CorkEncoding cork.enc enc 8y TeXnANSIEncoding texnansi.enc % =============== Section 2: Map files =============== % % A font map file is a mapping of TeX font names (and encodings) to % Postscript Type1 font names, similar to dvips' psfonts.map. See the % dvips documentation for more information about the font map file % format, and the file `README.t1fonts' in the xdvik source % distribution for information on the differences between dvips and % xdvik font maps. % % Multiple map files are allowed. If a font entry is found in several % files, later entries will override earlier ones (and a warning % will be printed to stderr). % % The .map files listed below here are ones found in teTeX <= 1.0. % xdvifont.map is a edited digest of psfonts.map for use with xdvi dvipsmap xdvifont.map % Users of teTeX-1.0 should use the following combination of map files: %dvipsmap psfonts.map %dvipsmap ps2pk.map % Otherwise, you can add any of the following maps, depending on % whether you have the respective fonts. % We can use these un-modified: dvipsmap marvosym.map dvipsmap xypic.map % If you applied t1mapper to the Charter fonts (they are in gs) % you want this: dvipsmap charter2.map % otherwise you want this: % dvipsmap charter.map % Lucida fonts. Possibly unsuitabe. Much of these are wrong if % t1mapper was applied to the fonts. Some of the lines describing % fonts with modified slant or width will need editing if t1mapper was % applied. If t1mapper was not applied they are both needed: % dvipsmap lucidabr.map % dvipsmap utopia.map % "real" bakoma instead of interpolated bsr % dvipsmap bakomaextra.map % this one *or* the previous one. Not both! % dvipsmap bsr-missing-interpolated.map % Various symbol/calligraphic fonts % dvipsmap hoekwater.map % The following files are never needed: mathtime.map (partly trivial, % partly unsuitable, the rest is in xdvifont.map); acrobat.map, % lw35extra.map (t1mapper should have taken care of this); psfonts.map % (see above); cs.map, omega.map, bsr.map (no map files needed for these). xdvik-ja-22.84.16-j1.40/texk/xdvik/texmf-alt/lucida.map0000664000175000017500000001617310363262237022040 0ustar uwabamiuwabami% lucida.map % Mappings of lucida fonts for xdvi. % % I have not looked at this file in disgust - janl 21/2/1999 % % If t1mapper has been used on the lucida fonts then most of these are % quite redundant. hlcbot8r LucidaTypewriterBoldOblique "TeXBase1Encoding ReEncodeFont" <8r.enc = 1.0 or TeXLive >= 6b should use the files in ../texmf/ instead. Installation: The `make install' target doesn't install these files, so you'll need to install them manually. Copy all files into the directory TEXMFMAIN/xdvi where TEXMF is your main texmf tree. Use e.g.: kpsewhich --expand-path='$TEXMFMAIN' to locate this directory. Make sure the XDVIINPUTS variable (set either in the xdvi shell wrapper or in your shell) contains this directory, e.g. by setting: export XDVIINPUTS='.;$TEXMF/{xdvi,dvips//}' Some map files might also be located in the directory TEXMFMAIN/dvips/config; setting XDVIINPUTS like above should find these as well. Please consult the file README.t1fonts if you experience problems with your Type1 font setup. xdvik-ja-22.84.16-j1.40/texk/xdvik/texmf-alt/marvosym.map0000664000175000017500000000017410363262237022446 0ustar uwabamiuwabamifmvr8x Martin_Vogels_Symbole #include #if HAVE_SYS_WAIT_H # include #endif #ifndef WIFEXITED # define WIFEXITED(status) (((status) & 255) == 0) #endif #ifndef WEXITSTATUS # define WEXITSTATUS(status) ((unsigned)(status) >> 8) #endif #ifndef WIFSIGNALED # ifndef WIFSTOPPED # define WIFSTOPPED(status) (((status) & 0xff) == 0x7f) # endif # define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status)) #endif #ifndef WTERMSIG # define WTERMSIG(status) ((status) & 0x7f) #endif /* if POSIX O_NONBLOCK is not available, use O_NDELAY */ #if !defined(O_NONBLOCK) && defined(O_NDELAY) # define O_NONBLOCK O_NDELAY #endif #ifdef EWOULDBLOCK # ifdef EAGAIN # define AGAIN_CONDITION (errno == EWOULDBLOCK || errno == EAGAIN) # else # define AGAIN_CONDITION (errno == EWOULDBLOCK) # endif #else /* EWOULDBLOCK */ # ifdef EAGAIN # define AGAIN_CONDITION (errno == EAGAIN) # endif #endif /* EWOULDBLOCK */ #if HAVE_POLL # include # define XIO_IN POLLIN # define XIO_OUT POLLOUT #else # define XIO_IN 1 # define XIO_OUT 2 #endif /* HAVE_POLL */ #if 0 static int mktexpk_io[2]; static struct xchild mktexpk_child = { NULL, 0, True, "font creation", NULL, NULL, mktexpk_ended }; static char *read_from_mktexpk(int ignored); static void write_to_mktexpk(int ignored); static struct xio mktexpk_xio = { NULL, 0, XIO_IN, #if HAVE_POLL NULL, #endif read_from_mktexpk, NULL, NULL}; static void mktexpk_ended(int status, struct xchild *this) { char str[1024] = ""; char *err_msg = NULL; fprintf(stderr, "------- MKTEXPK_ENDED!\n"); if (this->io != NULL && WIFEXITED(status)) { err_msg = (this->io->read_proc)(this->io->fd, NULL); SNPRINTF(str, 1024, "\nProcess `%s' returned exit code %d.\n", this->name, WEXITSTATUS(status)); str[1024 - 1] = '\0'; printlog_append_str(str); if (err_msg != NULL) { fprintf(stderr, "FROM MKTEXPK: |%s|\n", err_msg); printlog_append_str(err_msg); } } printlog_enable_closebutton(); /* free(this->name); */ /* free(this->io); */ /* free(this); */ read_from_mktexpk(0); clear_io(this->io); (void)close(mktexpk_xio.fd); if (WIFEXITED(status)) { if (WEXITSTATUS(status) == 0) { printlog_append("Done.\n", strlen("Done.\n")); } else sprintf(str, "\nPrint process returned exit code %d.\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) sprintf(str, "\nPrint process terminated by signal %d.\n", WTERMSIG(status)); else sprintf(str, "\nPrint process returned unknown status 0x%x.\n", status); } static char * read_from_mktexpk(int fd) { int bytes; char line[80]; char *buf; fprintf(stderr, "------- READ_FROM_MKTEXPK!\n"); for (;;) { #ifndef MOTIF bytes = read(fd, line, sizeof line); #else bytes = read(fd, line, sizeof line - 1); #endif if (bytes < 0) { if (AGAIN_CONDITION) break; perror("xdvi: read_from_mktexpk"); break; } if (bytes == 0) break; else { #ifdef MOTIF line[bytes] = '\0'; #endif fprintf(stderr, "------- READ_FROM_MKTEXPK:|%s|\n", line); printlog_append(line, bytes); } } buf = xmalloc(bytes + 1); memcpy(buf, line, bytes); buf[bytes] = '\0'; return buf; } static void write_to_mktexpk(int ignored) { UNUSED(ignored); return; } #endif /* 0 */ #if DELAYED_MKTEXPK /* hash table for names of missing fonts, and their indexes */ static hashTableT missing_font_hash; /* counters for missing fonts */ static int missing_font_ctr = 0; static int missing_font_curr = 0; static const char *const dummy_font_value = ""; /* used as value in hash table of missing fonts ... */ /* static char **all_fonts = NULL; */ /* static size_t all_fonts_size = 0; */ void reset_missing_font_count(void) { missing_font_ctr = missing_font_curr = 0; } /* Register font `fname' at size `dpi' as a font for which we'll need * to create a PK file */ static void add_missing_font(const char *fname, int dpi) { char *buf = NULL; if (missing_font_hash.size == 0) { missing_font_hash = hash_create(197); } /* font name (hash key) needs to be dynamically allocated here */ buf = xmalloc(strlen(fname) + strlen(" at ") + LENGTH_OF_INT + 1); sprintf(buf, "%s at %d", fname, dpi); if (hash_lookup(missing_font_hash, buf) == NULL) { missing_font_ctr++; hash_insert(&missing_font_hash, buf, dummy_font_value); } } /* Check if font `fname' at size `dpi' is in the hash of fonts for which * we need to create a PK file. If it is, return its index (>= 0) and delete * it from the hash table; else, return -1. */ static Boolean get_and_remove_missing_font(const char *fname, int dpi) { char buf[1024]; if (missing_font_hash.size == 0) return False; SNPRINTF(buf, 1024, "%s at %d", fname, dpi); buf[1023] = '\0'; if (hash_lookup(missing_font_hash, buf) == NULL) { return False; } hash_remove(&missing_font_hash, buf, dummy_font_value); return True; } static Boolean message_font_creation(const char *fname, int dpi) { if (get_and_remove_missing_font(fname, dpi)) { missing_font_curr++; statusline_info(STATUS_MEDIUM, "Creating PK font: %s at %d dpi (%d of %d) ...", fname, dpi, missing_font_curr, missing_font_ctr); force_statusline_update(); return True; } return False; } #endif /* DELAYED_MKTEXPK */ FILE * font_open( #if DELAYED_MKTEXPK Boolean load_font_now, #endif struct font *fontp, const char **font_ret, int *dpi_ret, #ifdef T1LIB int *t1id, #endif Boolean use_t1lib) { char *name; kpse_glyph_file_type file_ret; #if DELAYED_MKTEXPK Boolean message_done = False; Boolean need_statusline_update = False; #endif /* defaults in case of success; filename_ret will be non-NULL iff the fallback font is used. */ *font_ret = NULL; /* filename_ret is NULL iff a T1 version of a font has been used */ fontp->filename = NULL; *dpi_ret = fontp->fsize; if (resource.omega) { /* for omega, first try 16-bit ovf's, then 8-bit vf's. */ name = kpse_find_ovf(fontp->fontname); if (name == NULL) name = kpse_find_vf(fontp->fontname); } else { name = kpse_find_vf(fontp->fontname); } #ifdef T1LIB if (resource.t1lib) { *t1id = -1; } #endif /* T1LIB */ if (name) { /* found a vf font */ /* pretend it has the expected dpi value, else caller will complain */ *dpi_ret = fontp->fsize; fontp->filename = name; return XFOPEN(name, FOPEN_R_MODE); } #ifdef T1LIB if (resource.t1lib && use_t1lib #if DELAYED_MKTEXPK && load_font_now #endif ) { /* First attempt: T1 font of correct size * (for delayed_mtkexpk, only when scanning postamble for the first time) */ *t1id = find_T1_font(fontp->fontname); if (*t1id >= 0) { TRACE_T1((stderr, "found T1 font %s", fontp->fontname)); return NULL; } TRACE_T1((stderr, "T1 version of font %s not found, trying pixel version next, then fallback", fontp->fontname)); } #endif /* T1LIB */ /* TODO: Probably a better approach would be as follows: 1. Read the postamble to get all font definitions. Then, set: kpse_set_program_enabled(kpse_any_glyph_format, False, kpse_src_compile); and run load_font() on all of the fonts, with an array in which to save the names that don't exist (that returned NULL). 2. Run load_font() again on the fonts that didn't exist in step (1) and display the output in a window. This somehow needs to be fork()ed so that the window itself remains responsive. (Maybe it's easier to call mktexpk directly on the command-line?) _________________________________________________________ | | | Xdvi is creating fonts, please be patient ... | | | | Font xyz (n of m) | | | | Errors: 0 [ Show Details ... ] | | | | [ ... some progress meter or busy indicator ... ] | | | | | | [ Exit xdvi ] [ Help ] | | | --------------------------------------------------------- This window can be shown before the main window is opened. */ /* Second try: PK/GF/... font within allowable size range */ /* NOTE SU: The problem with this is that it will already use the PK version of the fallback font (e.g. cmr10.600pk) if the PK version exists, so the Type1 version of the fallback won't get used at all. But maybe this isn't that severe, given that the font is grossly wrong anyway. */ #if DELAYED_MKTEXPK if (load_font_now) { fprintf(stderr, "loading font now\n"); if (message_font_creation(fontp->fontname, (int)(fontp->fsize + 0.5))) { message_done = True; name = kpse_find_glyph(fontp->fontname, (unsigned)(fontp->fsize + .5), kpse_any_glyph_format, &file_ret); } else { kpse_set_program_enabled(kpse_any_glyph_format, False, kpse_src_compile); name = kpse_find_glyph(fontp->fontname, (unsigned)(fontp->fsize + .5), kpse_any_glyph_format, &file_ret); /* no success if either name is NULL or the filename returned in file_ret is a different font */ #if 1 /* ??? Bug with tex/test2.tex if cmbr exists but cmr doesn't ??? */ fprintf(stderr, "creating %s\n", fontp->fontname); if (!name || strcmp(file_ret.name, fontp->fontname) != 0) { statusline_info(STATUS_MEDIUM, "Creating PK font: %s at %d dpi ...", fontp->fontname, (int)(fontp->fsize + 0.5)); need_statusline_update = True; force_statusline_update(); kpse_set_program_enabled(kpse_any_glyph_format, resource.makepk, kpse_src_compile); name = kpse_find_glyph(fontp->fontname, (unsigned)(fontp->fsize + .5), kpse_any_glyph_format, &file_ret); } #endif } } else { name = kpse_find_glyph(fontp->fontname, (unsigned)(fontp->fsize + .5), kpse_any_glyph_format, &file_ret); } #else /* DELAYED_MKTEXPK */ name = kpse_find_glyph(fontp->fontname, (unsigned)(fontp->fsize + .5), kpse_any_glyph_format, &file_ret); #endif /* DELAYED_MKTEXPK */ if (name) { /* success */ #if DELAYED_MKTEXPK if (need_statusline_update) { statusline_info(STATUS_SHORT, "Creating PK font: %s at %d dpi ... done", fontp->fontname, (int)(fontp->fsize + 0.5)); force_statusline_update(); } #endif *dpi_ret = file_ret.dpi; fontp->filename = name; *font_ret = file_ret.name; TRACE_T1((stderr, "Found pixel version: %s at %d dpi", file_ret.name, *dpi_ret)); #if DELAYED_MKTEXPK if (message_done) { statusline_append(STATUS_VERYSHORT, "DUMMY", /* append text, don't overwrite */ "done."); force_statusline_update(); } #endif return XFOPEN(name, FOPEN_R_MODE); } #if DELAYED_MKTEXPK else if (!load_font_now) { add_missing_font(fontp->fontname, (int)(fontp->fsize + 0.5)); return NULL; } #endif else if (resource.alt_font != NULL) { /* The strange thing about kpse_find_glyph() is that it won't create a PK version of alt_font if it doesn't already exist. So we invoke it explicitly a second time for that one. */ TRACE_T1((stderr, "Trying fallback")); #ifdef T1LIB if (resource.t1lib #if DELAYED_MKTEXPK && load_font_now #endif ) { /* Third attempt: T1 version of fallback font */ *t1id = find_T1_font(resource.alt_font); if (*t1id >= 0) { TRACE_T1((stderr, "found fallback font for %s: %s", fontp->fontname, resource.alt_font)); *font_ret = xstrdup(resource.alt_font); return NULL; } TRACE_T1((stderr, "Type1 version of fallback font %s not found, trying pixel version", resource.alt_font)); } #endif /* T1LIB */ /* Forth attempt: PK version of fallback font */ name = kpse_find_glyph(resource.alt_font, (unsigned)(fontp->fsize + .5), kpse_any_glyph_format, &file_ret); if (name) { /* success */ TRACE_T1((stderr, "Success for PK version of fallback")); *dpi_ret = file_ret.dpi; fontp->filename = name; *font_ret = xstrdup(resource.alt_font); return XFOPEN(name, FOPEN_R_MODE); } else { TRACE_T1((stderr, "Failure for PK version of fallback")); } } /* all other cases are failure */ TRACE_T1((stderr, "Failure")); return NULL; } xdvik-ja-22.84.16-j1.40/texk/xdvik/xdvi-debug.h0000664000175000017500000001553310363262237020405 0ustar uwabamiuwabami#ifndef XDVI_DEBUG_H_ #define XDVI_DEBUG_H_ /* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ /* debugging flags and macros */ #include "xdvi-config.h" #include "xdvi.h" #include "version.h" #if HAVE_STRINGIZE #ifdef NDEBUG /* for production code, a failed ASSERT(x) just prints out a warning; else it aborts and dumps core. */ #define ASSERT(x, y) do { \ if(!(x)) { \ fprintf(stderr, \ "************************************************************\n" \ "XDvi %s: Failed assertion:\n%s:%d: \"%s\": %s\n" \ "Please report this as a bug to:\n" \ "http://sourceforge.net/tracker/?group_id=23164&atid=377580\n" \ "************************************************************\n", \ XDVI_VERSION_INFO, __FILE__, __LINE__, #x, y); \ } } while (0) #else /* NDEBUG */ #define ASSERT(x, y) do { \ if(!(x)) { \ fprintf(stderr, \ "\n************************************************************\n" \ "XDvi %s: Failed assertion:\n%s:%d: \"%s\": %s\n" \ "Aborting now. Please report this as a bug to:\n" \ "http://sourceforge.net/tracker/?group_id=23164&atid=377580\n" \ "If a core dump has been produced, please invoke:\n" \ "gdb %s core\nThen type \"bt\", " \ "and include the resulting output in your bug report.\n" \ "************************************************************\n", \ XDVI_VERSION_INFO, __FILE__, __LINE__, #x, y, globals.program_name); \ do_abort(); \ } } while (0) #endif /* NDEBUG */ #else /* HAVE_STRINGIZE */ #define ASSERT(x, y) /* as nothing */ #endif /* for temporary debugging statements */ /* #define MYDEBUG 1 */ #ifdef MYDEBUG # define MYTRACE(X) do { \ fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \ fprintf X; \ fprintf(stderr, "\n"); \ } while(0) #else # define MYTRACE(X) #endif /* NOTE: keep these in sync with the debug_string_options array in util.c! */ #define DBG_BITMAP 1 #define DBG_DVI 2 #define DBG_PK 4 #define DBG_BATCH 8 #define DBG_EVENT 16 #define DBG_PS 32 /* start of kpathsea debugging options */ #define DBG_STAT 64 #define DBG_HASH 128 #define DBG_OPEN 256 #define DBG_PATHS 512 #define DBG_EXPAND 1024 #define DBG_SEARCH 2048 #define DBG_KPATHSEA 4032 /* handy abbrev */ /* end of kpathsea debugging options */ #define DBG_HTEX 4096 #define DBG_SRC_SPECIALS 8192 #define DBG_CLIENT 16384 #define DBG_T1 32768 #define DBG_T1_VERBOSE 65536 #define DBG_GUI 131072 #define DBG_FIND 262144 #define DBG_FILES 524288 #define DBG_ALL (~DBG_BATCH) /* a mapping of numerical options to descriptive strings, defined in util.c */ struct debug_string_options { int bitmap; const char *description; const char *help_formatting; }; /* */ #if 0 /* we don't want this defined for NDEBUG, since the tracing macros are pretty useful also for users reporting bugs etc.; so we enable them always. */ #define TRACE_HTEX(X) #define TRACE_SRC(X) #define TRACE_CLIENT(X) #define TRACE_T1(X) #define TRACE_T1_VERBOSE(X) #define TRACE_GUI(X) #define TRACE_EVENTS(X) #define TRACE_FIND(X) #define TRACE_FILES(X) #else /* 0 */ /* * Note that the argument to these macros is always ((stderr, "...")). * We could also have * TRACE_SRC(("...")); * and invoke a function, but then gcc (3.1) won't be able to check * inconsistencies between conversion specifiers and arguments any * more, and that's a real killer IMHO. */ #define TRACE_HTEX(X) \ do { \ if (globals.debug & DBG_HTEX) { \ fprintf(stderr, "%s:%d: HTEX: ", __FILE__, __LINE__); \ fprintf X; \ fprintf(stderr, "\n"); \ } \ } while(0) #define TRACE_SRC(X) \ do { \ if (globals.debug & DBG_SRC_SPECIALS) { \ fprintf(stderr, "%s:%d: SRC: ", __FILE__, __LINE__); \ fprintf X; \ fprintf(stderr, "\n"); \ } \ } while(0) #define TRACE_CLIENT(X) \ do { \ if (globals.debug & DBG_CLIENT) { \ fprintf(stderr, "%s:%d: CLIENT: ", __FILE__, __LINE__); \ fprintf X; \ fprintf(stderr, "\n"); \ } \ } while(0) #define TRACE_T1(X) \ do { \ if (globals.debug & DBG_T1) { \ fprintf(stderr, "%s:%d: T1: ", __FILE__, __LINE__); \ fprintf X; \ fprintf(stderr, "\n"); \ } \ } while(0) #define TRACE_T1_VERBOSE(X) \ do { \ if (globals.debug & DBG_T1_VERBOSE) { \ fprintf(stderr, "%s:%d: T1_VERBOSE: ", __FILE__, __LINE__); \ fprintf X; \ fprintf(stderr, "\n"); \ } \ } while(0) #define TRACE_GUI(X) \ do { \ if (globals.debug & DBG_GUI) { \ fprintf(stderr, "%s:%d: GUI: ", __FILE__, __LINE__); \ fprintf X; \ fprintf(stderr, "\n"); \ } \ } while(0) #define TRACE_EVENTS(X) \ do { \ if (globals.debug & DBG_EVENT) { \ fprintf(stderr, "%s:%d: EVENT: ", __FILE__, __LINE__); \ fprintf X; \ fprintf(stderr, "\n"); \ } \ } while(0) #define TRACE_FIND(X) \ do { \ if (globals.debug & DBG_FIND) { \ fprintf(stderr, "%s:%d: FIND: ", __FILE__, __LINE__); \ fprintf X; \ fprintf(stderr, "\n"); \ } \ } while(0) #define TRACE_FILES(X) \ do { \ if (globals.debug & DBG_FILES) { \ fprintf(stderr, "%s:%d: FILES: ", __FILE__, __LINE__); \ fprintf X; \ fprintf(stderr, "\n"); \ } \ } while(0) #endif /* 0 */ #endif /* XDVI_DEBUG_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/dvi-init.h0000664000175000017500000001640211032450154020055 0ustar uwabamiuwabami/* * Copyright (c) 1990-2004 Paul Vojta and the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef DVI_INIT_H_ #define DVI_INIT_H_ #include "xdvi-config.h" #include "xdvi.h" typedef enum { NO_ERROR = 0, WRONG_DVI_VERSION, DVI_CORRUPTED, NOT_A_DVI_FILE, POSTAMBLE_NO_POST, POSTAMBLE_NO_MATCH, POSTAMBLE_NON_FNTDEF, NOT_ALL_PIXEL_FILES_FOUND, NO_BOP_AT_PAGEDESC, FILE_HAS_ZERO_SIZE, FILE_DOESNT_EXIST, FILE_IS_DIRECTORY, PS_CONVERSION_FAILED, PDF_CONVERSION_FAILED, UNKNOWN_ERROR } dviErrFlagT; extern const char *get_dvi_error(dviErrFlagT flag); extern Boolean internal_open_dvi(const char *path, dviErrFlagT *errmsg, #if DELAYED_MKTEXPK Boolean read_fonts, Boolean initialize_fonts #else Boolean load_fonts #endif ); extern char *open_dvi_file_wrapper(const char *filename, Boolean from_command_line, Boolean open_new_instance, Boolean *tried_dvi_ext, Boolean from_file_history); extern char *get_tmp_dvi_name(void); /* font stuff */ /* * Bitmap structure for raster ops. */ struct bitmap { unsigned short w, h; /* width and height in pixels */ short bytes_wide; /* scan line width in bytes */ char *bits; /* pointer to the bits */ }; /* * Per-character information. * There is one of these for each character in a font (raster fonts only). * All fields are filled in at font definition time, * except for the bitmap, which is "faulted in" * when the character is first referenced. */ struct glyph { long addr; /* address of bitmap in font file */ long dvi_adv; /* DVI units to move reference point */ short x, y; /* x and y offset in pixels */ struct bitmap bitmap; /* bitmap for character */ short x2, y2; /* x and y offset in pixels for shrunken bitmap */ #if GREY # if COLOR struct fgrec *fg; /* fgrec for which these pixmaps are valid */ # endif /* `2' means `shrunken' here */ XImage *image2; /* shrunken pixmap for antialiased character */ char *pixmap2; /* image data pointer for image2 */ char *pixmap2_gc2; /* separate image data for drawing image to globals.gc.fore2 */ #endif /* GREY */ struct bitmap bitmap2; /* shrunken bitmap for character */ }; /* * Per character information for virtual fonts */ struct macro { ubyte *pos; /* address of first byte of macro */ ubyte *end; /* address of last+1 byte */ long dvi_adv; /* DVI units to move reference point */ Boolean free_me; /* if free(pos) should be called when */ /* freeing space */ }; /* * The layout of a font information block. * There is one of these for every loaded font or magnification thereof. * Duplicates are eliminated: this is necessary because of possible recursion * in virtual fonts. * * Also note the strange units. The design size is in 1/2^20 point * units (also called micro-points), and the individual character widths * are in the TFM file in 1/2^20 ems units, i.e., relative to the design size. * * We then change the sizes to SPELL units (unshrunk pixel / 2^16). */ #define NOMAGSTP (-29999) #define FONT_IN_USE 1 /* used for housekeeping */ #define FONT_LOADED 2 /* if font file has been read */ #define FONT_VIRTUAL 4 /* if font is virtual */ /* forward declarations */ struct font; struct tn; typedef void (*read_char_proc) (struct font *, wide_ubyte); struct font { struct font *next; /* link to next font info block */ char *fontname; /* name of font */ float fsize; /* size information (dots per inch) */ int magstepval; /* magstep number * two, or NOMAGSTP */ FILE *file; /* open font file or NULL */ char *filename; /* name of font file */ long checksum; /* checksum */ unsigned short timestamp; /* for LRU management of fonts */ ubyte flags; /* flags byte (see values below) */ wide_ubyte maxchar; /* largest character code */ double dimconv; /* size conversion factor */ set_char_proc set_char_p; /* proc used to set char */ /* these fields are used by (loaded) raster fonts */ read_char_proc read_char; /* function to read bitmap */ struct glyph *glyph; /* these fields are used by (loaded) virtual fonts */ struct font **vf_table; /* list of fonts used by this vf */ struct tn *vf_chain; /* ditto, if TeXnumber >= VFTABLELEN */ struct font *first_font; /* first font defined */ struct macro *macro; /* These were added for t1 use */ int t1id; long scale; }; struct tn { struct tn *next; /* link to next TeXnumber info block */ unsigned long TeXnumber; /* font number (in DVI file) */ struct font *fontp; /* pointer to the rest of the info */ }; extern void reset_fonts(void); #if COLOR extern void reset_colors(void); extern void full_reset_colors(void); #endif extern void realloc_font(struct font *, wide_ubyte); extern void realloc_virtual_font(struct font *, wide_ubyte); extern Boolean load_font(struct font *, Boolean use_t1lib #if DELAYED_MKTEXPK , Boolean load_font_now #endif ); extern struct font *define_font( #if DELAYED_MKTEXPK Boolean read_fonts, Boolean initialize_fonts, #else Boolean load_font_now, #endif FILE *, wide_ubyte, struct font *, struct font **, unsigned int, struct tn **, Boolean *not_found_flag); extern void init_page(void); extern void form_dvi_property(void); extern Boolean dvi_file_changed(void); extern Boolean load_dvi_file( #if !DELAYED_MKTEXPK Boolean load_fonts, #endif dviErrFlagT *errflag); extern void read_PK_index(struct font *, wide_bool); extern void read_GF_index(struct font *, wide_bool); extern unsigned long read_VF_index(struct font *, wide_bool); extern Boolean set_paper_type(const char *arg); extern Boolean find_postamble(FILE *fp, dviErrFlagT *errflag); extern Boolean read_postamble(FILE *fp, dviErrFlagT *errflag, #if DELAYED_MKTEXPK Boolean read_fonts, Boolean initialize_fonts #else Boolean load_fonts #endif ); extern void close_old_filep(void); extern Boolean process_preamble(FILE *fp, dviErrFlagT *errflag); extern FILE *file_exists(const char *path, dviErrFlagT *errflag); extern char *find_dvi_file(const char *filename, Boolean *tried_dvi_ext, Boolean from_file_history); #endif /* DVI_INIT_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/string-utils.c0000664000175000017500000004773611032450154021007 0ustar uwabamiuwabami/* * miscellaneous string utility functions * * Copyright (c) 2001-2004 the xdvik development team * * 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ /* #define MYDEBUG 1 */ #include #include #include #include #include "xdvi-config.h" #include "xdvi.h" #include "string-utils.h" #include "util.h" /*------------------------------------------------------------ * str_is_prefix * * Purpose: * Return True if is a prefix of , else False. * * If `case_sensitive' is set to False, it performs matching * in a case-insensitive manner; in that case, str1 should * be lowercase. *------------------------------------------------------------*/ Boolean str_is_prefix(const char *str1, const char *str2, Boolean case_sensitive) { int i; for (i = 0; *str1 != '\0' && *str2 != '\0'; i++) { if ((case_sensitive && *str1 != *str2) || (!case_sensitive && *str1 != tolower((int)*str2))) return False; str1++; str2++; } return *str1 == '\0'; } /*------------------------------------------------------------ * str_is_suffix * * Purpose: * Return True if str1 is a suffix of str2, else False. * E.g. returns true if str1 = ".tex", str2 = "test.tex". * * If `case_sensitive' is set to False, it performs matching * in a case-insensitive manner; in that case, str1 should * be lowercase. *------------------------------------------------------------*/ Boolean str_is_suffix(const char *str1, const char *str2, Boolean case_sensitive) { int len1 = strlen(str1); int len2 = strlen(str2); while (len2 > len1) { str2++; len2--; } if (case_sensitive) return strcmp(str1, str2) == 0; else /* also compare terminating 0; second string is assumed to be all-lowercase! */ return memicmp(str2, str1, len1 + 1) == 0; } /* * Like strstr(), but does case-insensitive matching: Brute-force algorithm * to find the first occurrence of subsrtring `needle' (which should be all-lowercase) * in string `haystack', ignoring case in (i.e. lowercasing) haystack. The terminating * '\0' characters are not compared. * Returns a pointer to the beginning of the substring if found, NULL else. * * This code was derived from public domain code (Stristr.c on www.snippets.org). * Currently unused. */ char * my_stristr(const char *haystack, const char *needle) { const char *curr; for (curr = haystack; *curr != '\0'; curr++) { const char *ptr1, *ptr2; /* search for first character */ for (; ((*curr != '\0') && (tolower((int)*curr) != *needle)); curr++) { ; } if (*curr == '\0') /* not found */ return NULL; /* now compare other characters */ ptr1 = needle; ptr2 = curr; while (tolower((int)*ptr2) == *ptr1) { ptr2++; ptr1++; /* success if at end of needle */ if (*ptr1 == '\0') return (char *)curr; } } return NULL; } /* expand filename to include full path name; returns result in a freshly allocated string. */ char * expand_filename(const char *filename, expandPathTypeT type) { char *path_name = NULL; if (*filename == '/') /* already an absolute path */ return xstrdup(filename); if (type == USE_CWD_PATH) { size_t path_name_len = 512; size_t len = strlen(filename) + 1; /* append to cwd if it's not already a full path */ if (filename[0] != '/') { for (;;) { char *tmp; path_name = xrealloc(path_name, path_name_len); if ((tmp = getcwd(path_name, path_name_len)) == NULL && errno == ERANGE) { path_name_len *= 2; } else { path_name = tmp; break; } } len += strlen(path_name) + 1; /* 1 for '/' */ path_name = xrealloc(path_name, len); strcat(path_name, "/"); strcat(path_name, filename); } TRACE_HTEX((stderr, "Expanding filename |%s| with CWD gives |%s|", filename, path_name == NULL ? "" : path_name)); return path_name ? path_name : xstrdup(filename); } else { ASSERT(globals.dvi_file.dirname != NULL, "globals.dvi_file.dirname should have been initialized before"); path_name = xstrdup(globals.dvi_file.dirname); path_name = xstrcat(path_name, filename); TRACE_HTEX((stderr, "Expanding filename |%s| with globals.dvi_file.dirname |%s| gives |%s|", filename, globals.dvi_file.dirname, path_name)); return path_name; } } /* expand filename to include `.dvi' extension and full path name; returns malloc()ed string (caller is responsible for free()ing). */ char * filename_append_dvi(const char *filename) { char *expanded_filename = NULL; const char *orig_filename = filename; size_t len; char *p; /* skip over `file:' prefix if present */ if (str_is_prefix("file:", filename, True)) { filename += strlen("file:"); if (str_is_prefix("//", filename, True)) { /* is there a hostname following? */ char *tmp = strchr(filename+2, '/'); /* skip over host name */ if (tmp == NULL) { XDVI_WARNING((stderr, "Malformed hostname part in filename `%s'; not expanding file name", orig_filename)); } else { /* deal with multiple `//' after "file://localhost"; while the RFC seems to suggest that file://localhost/foo/bar defines a path `foo/bar', most browsers (and actually, also libwww) will treat this path as absolute: `/foo/bar'. So we treat file://localhost//foo/bar and file://localhost/foo/bar as equivalent. */ while (*(tmp+1) == '/') tmp++; filename = tmp; } } } len = strlen(filename) + 5; /* 5 in case we need to add `.dvi\0' */ expanded_filename = xmalloc(len); strcpy(expanded_filename, filename); /* Append ".dvi" extension if no extension is present. Only look at the filename part when trying to find a `.'. */ if ((p = strrchr(expanded_filename, '/')) == NULL) { p = expanded_filename; } if ((p = strrchr(p, '.')) == NULL) { TRACE_HTEX((stderr, "appending .dvi extension to filename |%s|", expanded_filename)); strcat(expanded_filename, ".dvi"); } return expanded_filename; } char * expand_filename_append_dvi(const char *filename, expandPathTypeT type, Boolean must_exist) { char canonical_path[MAXPATHLEN + 1]; char *normalized_fname = filename_append_dvi(filename); char *expanded_fname = expand_filename(normalized_fname, type); if (must_exist) { char *canonical_name = REALPATH(expanded_fname, canonical_path); free(normalized_fname); free(expanded_fname); return xstrdup(canonical_name); } else { free(normalized_fname); return expanded_fname; } } char * format_arg(const char *fmt, const char *arg, int *match) { char *tmp = xmalloc(strlen(fmt) + strlen(arg) + 1); if (strchr(fmt, '%') != NULL) { sprintf(tmp, fmt, arg); *match = 1; } else { strcpy(tmp, fmt); /* NOTE: don't reset *match to 0, leave that to caller */ } return tmp; } /* escape single `%' characters in arg and return newly allocated string */ char * escape_format_arg(const char *arg) { char *ret, *ptr; ASSERT(arg != NULL, ""); ret = xmalloc(strlen(arg) * 2 + 1); /* more than enuff */ ptr = ret; while (*arg != '\0') { /* need to escape? */ if (*arg == '%') { /* && (ptr == ret || (ptr > ret && *(arg - 1) != '%'))) { */ *ptr++ = '%'; } *ptr++ = *arg++; } *ptr = '\0'; /* trim return buffer */ return xrealloc(ret, strlen(ret) + 1); } char * unquote_arg(const char *fmt, const char *arg, int *match, int *len) { char *ptr; char c; c = fmt[0]; fmt++; if ((ptr = strchr(fmt, c)) != NULL) { *ptr++ = '\0'; while (*ptr == ' ' || *ptr == '\t') { ptr++; } *len = ptr - fmt; return format_arg(fmt, arg, match); } else { *len = strlen(fmt); XDVI_WARNING((stderr, "Ignoring lonesome quote in string %s", fmt - 1)); return format_arg(fmt, arg, match); } } /* Chop `source' into chunks separated by `sep', and save these * to newly allocated return list. The end of the list is indicated * by a NULL element (i.e. the returned list will always contain at * least 1 element). The caller is responsible for free()ing the returned * list. * * If `do_unquote' is True, separators inside single or double quotation marks will not be * treated as boundaries. The quotation marks surrounding the chunk will be removed * as well in that case. */ char ** get_separated_list(const char *source, const char *sep, Boolean do_unquote) { /* allocate at least list of size 1, for NULL termination below */ char **chunks = xmalloc(sizeof *chunks); const char *b_ptr, *e_ptr; size_t i = 0; b_ptr = source; while (*b_ptr != '\0' && strchr(sep, *b_ptr) != NULL) b_ptr++; for (i = 0; *b_ptr != '\0'; i++) { char *quote; char quotechar = 0; size_t len, chunk_len, alloc_len = 0; if ((len = strcspn(b_ptr, sep)) == 0) /* at end */ break; /* check for quoted chunk, in which case we don't want to treat spaces as chunk separators */ if (do_unquote && (quote = strchr("'\"", *b_ptr)) != NULL) { const char *curr = b_ptr + 1; quotechar = *quote; for (;;) { /* find end of quote */ char *maybe_end = strchr(curr, quotechar); if (maybe_end != NULL) { if (maybe_end - curr > 0 && *(maybe_end - 1) == '\\') { /* escaped quote */ curr = ++maybe_end; } else { /* found */ b_ptr++; len = maybe_end - b_ptr; break; } } else { /* not found end - warn, and forget about this quote */ XDVI_WARNING((stderr, "Unmatched quote character in string `%s'", b_ptr)); break; } } } e_ptr = b_ptr + len; chunk_len = e_ptr - b_ptr; while (i + 1 >= alloc_len) { alloc_len++; } chunks = xrealloc(chunks, alloc_len * sizeof *chunks); chunks[i] = xmalloc(chunk_len + 1); memcpy(chunks[i], b_ptr, chunk_len); chunks[i][chunk_len] = '\0'; /* skip trailing quotechar and spaces */ b_ptr = e_ptr; if (do_unquote && quotechar != 0 && *b_ptr == quotechar) b_ptr++; while (*b_ptr != '\0' && strchr(sep, *b_ptr) != NULL) b_ptr++; } /* terminate list with NULL element */ chunks[i] = NULL; return chunks; } const char * find_format_str(const char *input, const char *fmt) { const char *ptr = input; while ((ptr = strstr(ptr, fmt)) != NULL) { if (ptr > input && *(ptr - 1) == '\\') { ptr++; continue; } else return ptr; } return NULL; } /* return directory component of `path', or NULL if path is a filename only */ char * get_dir_component(const char *path) { char *ret = NULL; char *p; if ((p = strrchr(path, '/')) != NULL) { /* copy, chop off filename (but not the '/') */ ret = xstrdup(path); *(ret + (p - path) + 1) = '\0'; TRACE_CLIENT((stderr, "get_dir_component of |%s| is |%s|\n", path, ret)); } return ret; } /* If `src' is an absolute path, compare it with `target', ignoring `.tex' extension in both strings. Else, compare the concatenation of `src' with `dvi_path' and `target', in the same way. Since efficiency is a concern here, we don't copy any strings; instead, we loop through `src' and `target' from the end of both strings (which makes expanding `../' easier, and will terminate earlier for non-equal files), replacing `src' with `dvi_path' when dropping off the beginning of `src'. */ Boolean src_compare(const char *src, int src_len, const char *target, const char *dvi_path, size_t dvi_path_len) { int i, j; Boolean matched = True; /* This macro sets the `src' pointer to `dvi_path' after having dropped off the beginning of src, or returns False if dvi_path is NULL (which either means that `src' was an absolute path, or that the dvi_path has been used up already). */ #define CHK_USE_DIR(i) \ if (i == -1) { \ if (dvi_path == NULL) /* already done */ \ return False; \ src = dvi_path; \ dvi_path = NULL; \ i = dvi_path_len - 1; \ MYTRACE((stderr, "swapped, now using: |%s| of len %d", src, i)); \ } /* ignore path in both filenames if one of them does not contain a path */ { char *src_p = strrchr(src, '/'); char *target_p = strrchr(target, '/'); if (src_p == NULL) { dvi_path = NULL; if (target_p != NULL) target = target_p + 1; } if (target_p == NULL) { dvi_path = NULL; if (src_p != NULL) src = src_p + 1; } } /* don't prepend dvi_path if src is absolute */ if (*src == '/') { dvi_path = NULL; } /* skip `.tex' suffix in strings if present */ i = src_len; MYTRACE((stderr, "len of |%s| %d", src, i)); if (i >= 4 && strcmp(src + (i - 4), ".tex") == 0) { MYTRACE((stderr, "src |%s| has .tex suffix!", src)); i -= 4; } j = strlen(target); MYTRACE((stderr, "len of |%s| %d", target, j)); if (j >= 4 && strcmp(target + (j - 4), ".tex") == 0) { MYTRACE((stderr, "target |%s| has .tex suffix!", target)); j -= 4; } /* start with index of last char */ i--; j--; while (i >= 0 && j >= 0) { int skip_dirs = 0; /* fprintf(stderr, "check: %d[%c]\n", i, src[i]); */ while (src[i] == '.' && src[i + 1] == '/') { /* normalize `../' and `./' */ MYTRACE((stderr, "check2: %d[%c]", i, src[i])); if (i >= 2 && src[i - 1] == '.' && src[i - 2] == '/') { MYTRACE((stderr, "case /..")); i -= 3; skip_dirs++; } else if (i == 1) { /* `../' or `/./' at start of src */ if (src[0] == '.') { /* `../' */ MYTRACE((stderr, "../ at start")); i -= 2; skip_dirs++; } else if (src[0] == '/') { /* `/./' */ MYTRACE((stderr, "/./ at start")); i -= 1; } else /* something else */ break; } else if (i == 0 || (i > 1 && src[i - 1] == '/')) { /* ./ at start, or /./ somewhere */ i -= 1; } else /* might be `abc./' or `abc../' (strange but legal) */ break; CHK_USE_DIR(i); while (i >= 0 && src[i] == '/') i--; CHK_USE_DIR(i); while (src[i] != '.' && skip_dirs-- > 0) { /* unless there are subsequent `../' */ /* skip directories backwards */ while (i >= 0 && src[i] != '/') { MYTRACE((stderr, "non-slash: %d,%c", i, src[i])); i--; } CHK_USE_DIR(i); while (i >= 0 && src[i] == '/') { MYTRACE((stderr, "slash: %d,%c", i, src[i])); i--; } CHK_USE_DIR(i); MYTRACE((stderr, "skipped backwards: %d,%c", i, src[i])); } } /* skip multiple '/'. No need to fall off the beginning of src and use CHK_USE_DIR() here, since with (multiple) '/' at the beginning, src must be an absolute path. */ while (i > 0 && src[i] == '/' && src[i - 1] == '/') { i--; } MYTRACE((stderr, "comparing: %d[%c] - %d[%c]", i, src[i], j, target[j])); if (src[i] != target[j]) { matched = False; break; } if (i == 0 && j == 0) /* at start of both strings */ break; i--; j--; CHK_USE_DIR(i); } if (i != 0 || j != 0) /* not at start of both strings, no match */ return False; else return matched; #undef CHK_USE_DIR } /* Contributed by ZLB: Return a canonicalized version of path (with `../' and `./' resolved and `//' reduced to '/') in a freshly malloc()ed buffer, which the caller is responsible for free()ing. Cannot fail. */ char * canonicalize_path(const char *path) { char *p, *q, *start; char c; size_t len = strlen(path); assert(path != NULL); assert(*path == '/'); start = q = p = xstrdup(path); /* len is the length of string */ while (p < start + len) { if ((c = p[1]) == '/') { /* remove multiple '/' in pathname */ memmove(p + 1, p + 2, len - (p + 2 - start) + 1); len--; continue; } else if (c == '.') { if ((c = p[2]) == '/') { /* p = '/.' in pathname */ memmove(p + 1, p + 3, len - (p + 3 - start) + 1); len -= 2; continue; } else if (c == '.' && ((c = p[3]) == '/' || c == '\0')) { /* p == "/.." */ memmove(q, p + 3, len - (p + 3 - start) + 1); len -= (p - q) + 3; p = q; /* check if the new dirname at p is "//" or './' or '../' */ if ((c = p[1]) == '/') continue; else if (c == '.') { if ((c = p[2]) == '/') continue; else if (c == '.' && ((c = p[3]) == '/' || c == '\0')) { while (--q >= start && *q != '/'); if (q < start) q = start; continue; } } } } /* search next '/' */ q = p; while (++p <= start + len && *p != '/'); } return start; } /* Escape all of the following characters in str: ` \ ; ( ) making it safe to pass str to a shell. Return result in a newly allocated string, which the caller is responsible to free() after use. */ char * shell_escape_string(const char *str) { size_t len = strlen(str); char *new_str = xmalloc(len * 2 + 1); /* safe amount, since each char will be doubled at most */ const char *src_ptr = str; char *target_ptr = new_str; while (*src_ptr != '\0') { if (*src_ptr == '\\' || *src_ptr == '`' || *src_ptr == '(' || *src_ptr == ')' || *src_ptr == ';') { #if 0 /* only if not yet escaped? */ && (src_ptr == str || (src_ptr > str && *(src_ptr - 1) != '\\'))) { #endif *target_ptr++ = '\\'; } *target_ptr++ = *src_ptr++; } *target_ptr = '\0'; /* terminate */ return new_str; } /* Get a pointer to the extension of the filename 'fname' (ie. into the existing string), or NULL if fname doens't have an extension. */ const char * get_extension(const char *fname) { char *sep, *tmp; /* does filename have a directory component? If so, be careful with dots within this component. */ if ((sep = strrchr(fname, '/')) != NULL) { tmp = sep; if ((sep = strrchr(tmp, '.')) != NULL) { return sep; } else { return NULL; } } else if ((sep = strrchr(fname, '.')) != NULL) { return sep; } else { return NULL; } } void replace_extension(const char *fname, const char *extension, char *buf, size_t buf_len) { char *sep; if ((sep = strrchr(fname, '.')) != NULL) { size_t len = strlen(extension); if (len + (sep - fname) > buf_len) return; strncpy(buf, fname, sep - fname); strcpy(buf + (sep - fname), extension); } return; } #if 0 /* * Estimate the string length needed for %p conversion. Currently unused, * since we use the more general VSNPRINTF() approach. */ #define PTR_CONVERSION_LEN_GUESS sizeof(void *) * CHAR_BIT #endif /* * Return a formatted string in newly allocated memory. */ char * get_string_va(const char *fmt, ...) { char *buf = NULL; XDVI_GET_STRING_ARGP(buf, fmt); return buf; } /* Wrapper for atof() for strtod()-like error checking, * with an XDVI_WARNING if the conversion of wasn't complete. */ double my_atof(const char *str) { char *ptr; double f; f = strtod(str, (char **)&ptr); if (*ptr != '\0') { XDVI_WARNING((stderr, "strtod: incomplete conversion of %s to %f", str, f)); } return f; } /* return length of a string representation of the integer n */ int length_of_int(int n) { int ret = 1; if (n < 0) { ret++; n *= -1; } while (n >= 10) { n /= 10; ret++; } return ret; } Boolean is_spaces_only(const char *ptr) { for (; *ptr; ptr++) { if (!isspace((int)*ptr)) return False; } return True; } xdvik-ja-22.84.16-j1.40/texk/xdvik/read-mapfile.h0000664000175000017500000000235110363262237020667 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef DVIPS_H_ #define DVIPS_H_ extern Boolean read_map_file(char *filename); #endif /* DVIPS_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/c-openmx.h0000664000175000017500000000225110363262237020066 0ustar uwabamiuwabami/* c-openmx.h: define OPEN_MAX, the maximum number of open files a process can have. Possibly dynamically determined. Copyright (C) 1993 Karl Berry. 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, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef C_OPENMX_H_ #define C_OPENMX_H_ #include "kpathsea/c-limits.h" #ifndef OPEN_MAX #ifdef _SC_OPEN_MAX #define OPEN_MAX sysconf (_SC_OPEN_MAX) #else /* no SC_OPEN_MAX */ #ifdef NOFILE #define OPEN_MAX NOFILE #else /* no NOFILE */ #define OPEN_MAX 24 /* The POSIX minimum. */ #endif /* no NOFILE */ #endif /* no _SC_OPEN_MAX */ #endif /* no OPEN_MAX */ #endif /* not C_OPENMX_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/encodings.h0000664000175000017500000000454111032450154020304 0ustar uwabamiuwabami/* * Copyright (c) 2003-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef ENCODINGS_H_ #define ENCODINGS_H_ #include "xdvi-config.h" #include "xdvi.h" struct adobe2unicode { const char *adobe_name; uint32_t unicode; }; struct unicode2adobe { uint32_t unicode; const char *adobe_name; }; extern uint32_t get_accented_glyph(uint32_t accent, uint32_t base_glyph); extern const char *unicode2adobe_name(uint32_t unicode); extern uint32_t adobe2unicode_name(const char *adobe_name); extern uint32_t guess_encoding(wide_ubyte ch, const char *fontname, char *retbuf); extern const char *expand_ligature(uint32_t unicode); extern const char *search_normalize_chars(uint32_t unicode); extern Boolean utf8_lowercase(char *utf8); extern int utf8_to_ucs4(const char *utf8, uint32_t *ucs4, size_t len); extern void ucs4_to_utf8(uint32_t ucs4, char *utf8, size_t *len, Boolean do_lowercase); extern unsigned char utf8_to_iso_8859_1(const char *utf8, size_t *len); extern char *str_utf8_to_iso_8859_1(const char *utf8); extern void iso_8859_1_to_utf8(unsigned char iso_8859_1, char *utf8, size_t *len); extern int str_iso_8859_1_to_utf8(const char *latin1, char *utf8, size_t len); extern Boolean is_hyphenchar(uint32_t unicode); extern Boolean is_ideograph(uint32_t unicode); #endif /* ENCODINGS_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/0000775000175000017500000000000011730170101017633 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/xdvi16x16.xpm0000664000175000017500000000307510363262237022063 0ustar uwabamiuwabami/* XPM */ static const char * xdvi16x16_xpm[] = { "16 16 81 1", " c None", ". c #616060", "+ c #161311", "@ c #7B7A7B", "# c #0F0C0A", "$ c #6F7178", "% c #FFD549", "& c #D39A2D", "* c #C4BBB6", "= c #000006", "- c #6B6D72", "; c #7C5A20", "> c #8B621A", ", c #D79C2E", "' c #FFCC41", ") c #DCD0BF", "! c #D8D1C9", "~ c #FFFFFF", "{ c #FCB529", "] c #DA9E2E", "^ c #CE9834", "/ c #8C5B0B", "( c #96702C", "_ c #626874", ": c #D3B276", "< c #F4B73C", "[ c #FDBF42", "} c #8B6727", "| c #C5A469", "1 c #AD915D", "2 c #D19F3C", "3 c #D7A542", "4 c #FFC640", "5 c #7E4C00", "6 c #CBA153", "7 c #ECB03B", "8 c #F4BB48", "9 c #FFC54A", "0 c #785A2B", "a c #CCA25E", "b c #A8874E", "c c #FABD41", "d c #CEA55A", "e c #845E1D", "f c #D8A23D", "g c #F5BB48", "h c #DBA339", "i c #DEA53A", "j c #EBB345", "k c #856226", "l c #A28352", "m c #F3B63C", "n c #F9BF4B", "o c #EAB345", "p c #382205", "q c #785820", "r c #DEA539", "s c #987C51", "t c #8C6625", "u c #F9BA3D", "v c #9B8769", "w c #FFD049", "x c #8E6826", "y c #BA8A30", "z c #D9A139", "A c #A77C2D", "B c #F8BB41", "C c #FDC24C", "D c #FFC646", "E c #FFBF40", "F c #6E5128", "G c #FEC24C", "H c #707279", "I c #5E6678", "J c #596276", "K c #482E09", "L c #AD894C", "M c #777777", "N c #090503", "O c #04050A", "P c #636976", ".+++. .+.", " @###$%% & *=- ", " @##=;>,';&=;) ", " @#=!~{;]%^%/(", " _#!=~~:<;[} ", " |12345~=678;90", " a%b%%ccdefghi;j", " %k%lmccggg8;gn;", " opqrsccctc;8;uv", " wxyccccxccz;n;j", " wyAxAyccBC8;n;", " '''wDEEFp%G;j", " H=I hJ==K%;L", " MNM @#O=P ", ".NM @###.", "+. .+++"}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/toolbar2.xpm0000664000175000017500000001770011276240141022121 0ustar uwabamiuwabami/* XPM */ static const char * tools2_xpm[] = { /* width height colors colordepth */ " 378 18 15 1 0 0", " m none c None", ". m white c red", "+ m black c #000000", "$ m none c #ADADAD", "% m black c #232323", "& m none c #FFFFFF", ", m none c #DEDEDE", "' m black c #13A706", "k m black c #737373", "t m none c #636363", "w m black c #125006", "N m none c #C9C9C9", "O m none c #949494", "` m none c #404040", "Y m none c #303030", /* pixels */ /* ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** */ " ", " ++++++++ YY YY ++++++++ ", " +++++++++ t+++t $++++$ $++++$ .... +&&&&&+&+ kkk &$Y &$Y $%%%%$ +&&&&&&+ ttttt ", " +&&&&&&+&+ t++++++ $+,,,,+$ $+,,,,+$ '' '' ........ +&&&&&+&&+ k , `YY `YY $%%%%%%$ +&&&&&&+ +++++ t+++t ", " +&&&&&&+&&+ +++t t+ %% $% $% %$ %$ %% +,,& ,,+ +,,& ,,+ ''' ''' .......... +&&&&&++++ ,,, ......... %%%%%%%%% %%%%%%%%% %%%%%%%%% kkk Y$kkk %%$ $%% ' +&&&&&&+ t++t ++ ", " +&&&&&&++++ t++t +t %% $%% $%% %%$ %%$ %% +,,&&,,+ +,,&&,,+ '''' '''' ...&....&... +&&&&&&&&+ kkk kYYYYkYkYYYY` %% %% ''+&&&&&&+ ++++ t++t ", " +++&&&&&&&&&+++ +++ %% $%%% $%%% %%%$ %%%$ %% +,,,,,,+ +,,,,,,+ '''''''' ''''''''' ..&&&..&&&.. ++&&&&&&&&++ k , k$&&$k$k`k&&$k` %% $%% '''&&&++&+ t+tt+t + + ", " +,+&&&&&&&&&+k+ +++++++ + %% $%%%% $%%%% %%%%$ %%%%$ %% +,,,,,,+ +,,,,,,+ '''''''''w '''''''''' ....&&&&&&.... +$+&&&&&&&&+k+t %%%%%%%%% ,,, ......... %%%%%%%%% %%%%%%%%% `&&&$k&$`&&&$kY $%%$ ''''''''''&&++&+ ++ ++ t+ +t ", "+++++++++++++,+k+ +++++ +++ %% $%%%%% $%%%%% %%%%%$ %%%%%$ %% $+,,,,+k $+,,,,+k ''''''''''w ''''''''''' .....&&&&..... ++++++++++++$k+t kkk kkk `&$$kk```k&&$kY $%%$ '''''''''''&&&&+ t+t t+t +t t+ ", "+$&&&&&&&&&&&++k+ +++ +++++ %% $%%%%% $%%%%% %%%%%$ %%%%%$ %% $++++k++ $++++k++ ''''''''''w ''''''''''w .....&&&&..... +&&&&&&&&&&&&&,k+ k , k , `&``YY&$k```kkY %%$ ''''''''''w&&&&+ ++++++++ t+++++++ ", "$+,$$$$$$$$$$k+k+ + +++++++ %% $%%%% $%%%% %%%%$ %%%%$ %% %% +++ +++ '''''''''w '''''''''w ....&&&&&&.... +&$$$$$$$$$$$$$k+ ,,, ......... %%%%%%%%% ,,, ......... %%%%%%%%% `&$kY ``$`&$kY %% wwwwww'''w&&&&&+ t+tttttt+t +t t+ ", " +$,$$$$$$$$$$+k+ +++ %% $%%% $%%% %%%$ %%%$ %% %% ++% ++% ''''wwwww wwwww'''w ..&&&..&&&.. +&kkkkkkkkkkkk$k+ kkk `&$kY `&$kY %% ''w&&&&&&+ +t t+ t+ +t ", " $+,$$$$$$$$$$k++ t+ t++t %% $%% $%% %%$ %%$ %% %%%%%% %% %%%%%% %% '''w '''w ...&....&... +&k++++++++++&$k+ k , `&$kY `&$kY 'w+&&&&&&+ ++t t++k +t t+ ", " +$,$$$$$$$$$$++ +t t+++ %% $% $% %$ %$ %% %%%%%% %%%%%% ''w ''w .......... +&&&&&&&&&&&&&$k+ %%%%%%%%% ,,, ......... %%%%%%%%% %%%%%%%%% `kk`Y `kk`Y w +&&&&&$+ t++++ t++++ t++++ t++++ ", " +$kkkkkkkkkkk+ ++++++t %% 'w 'w ........ +Okkkkkkkkkkkkk++ `&$kY `&$kY %% +&&&N$O+ ", " ++++++++++++++ t+++t %% .... +++++++++++++++ ````` ````` %% +&N$Okt+ ", " ++++++++ ", " "}; /* ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** */ xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/toolbar.xpm0000664000175000017500000001774611276240141022051 0ustar uwabamiuwabami/* XPM */ static const char * toolbar_xpm[] = { /* width height colors colordepth */ " 378 18 16 1 0 0", " s none c None", ". m white c red", "+ m black c #000000", "$ m none c #ADADAD", "% m black c #232323", "& m none c #FFFFFF", ": m black c #FFFFFF", ", m none c #DEDEDE", "y m black c #DEDEDE", "' m black c #13A706", "t s bottomShadowColor c #636363", "w m black c #125006", "N m none c #C9C9C9", "O m none c #949494", "` m none c #404040", "Y m none c #303030", /* pixels */ /* ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** */ " ", " ++++++++ YY YY ++++++++ ", " +++++++++ t+++t ++++ ++++ .... +&&&&&+&+ ttt &$Y &$Y $%%%%$ +&&&&&&+ ttttt ", " +&&&&&&+&+ t++++++ %% % % % % %% +,,,,+ +,,,,+ + + ........ +&&&&&+&&+ t , `YY `YY $%%%%%%$ +&&&&&&+ +++++ t+++t ", " +&&&&&&+&&+ +++t t+ %% %% %% %% %% %% +,,&,,,+ +,,&,,,+ ++ ++ .......... +&&&&&++++ ,,, ......... %%%%%%%%% %%%%%%%%% %%%%%%%%% ttt Y$ttt %%$ $%% ' +&&&&&&+ t++t ++ ", " +&&&&&&++++ t++t +t %% %%% %%% %%% %%% %% +,,&&,,+ +,,&&,,+ +:+ +:+ ...&....&... +&&&&&&&&+ ttt tYYYYtYtYYYY` %% %% ''+&&&&&&+ ++++ t++t ", " +++&&&&&&&&&+++ +++ %% %%%% %%%% %%%% %%%% %% +,,,,,,+ +,,,,,,+ +++ +::++++++++++++++:y+ +++ ..&&&..&&&.. ++&&&&&&&&++ t , t$&&$t$t`t&&$t` %% $%% '''&&&++&+ t+tt+t + + ", " +,+&&&&&&&&&+t+ +++++++ + %% %%%%% %%%%% %%%%% %%%%% %% +,,,,,,+ +,,,,,,+ +$&$+ +:yy::::::++:::::::yy+ +$&$+ ....&&&&&&.... +$+&&&&&&&&+t+t %%%%%%%%% ,,, ......... %%%%%%%%% %%%%%%%%% `&&&$t&$`&&&$tY $%%$ ''''''''''&&++&+ ++ ++ t+ +t ", "+++++++++++++,+t+ +++++ +++ %% %%%%%% %%%%%% %%%%%% %%%%%% %% +,,,,+t +,,,,+t +&&$+ +:yyyyyyyyy++:yyyyyyyyy+ +&&$+ .....&&&&..... ++++++++++++$t+t ttt ttt `&$$tt```t&&$tY $%%$ '''''''''''&&&&+ t+t t+t +t t+ ", "+$&&&&&&&&&&&++t+ +++ +++++ %% %%%%% %%%%% %%%%% %%%%% %% ++++t++ ++++t++ +$$$+ +yyyyyyyyy++:yyyyyyyy+ +$$$+ .....&&&&..... +&&&&&&&&&&&&&,t+ t , t , `&``YY&$t```ttY %%$ ''''''''''w&&&&+ ++++++++ t+++++++ ", " +,$$$$$$$$$$t+t+ + +++++++ %% %%%% %%%% %%%% %%%% %% %% +++ +++ +++ +yy++++++++++++++yy+ +++ ....&&&&&&.... +&$$$$$$$$$$$$$t+ ,,, ......... %%%%%%%%% ,,, ......... %%%%%%%%% `&$tY ``$`&$tY %% wwwwww'''w&&&&&+ t+tttttt+t +t t+ ", " +$,$$$$$$$$$$+t+ +++ %% %%% %%% %%% %%% %% %% ++% ++% +y+ +y+ ..&&&..&&&.. +&tttttttttttt$t+ ttt `&$tY `&$tY %% ''w&&&&&&+ +t t+ t+ +t ", " +,$$$$$$$$$$t++ t+ t++t %% %% %% %% %% %% %%%%%% %% %%%%%% %% ++ ++ ...&....&... +&t++++++++++&$t+ t , `&$tY `&$tY 'w+&&&&&&+ ++t t++t +t t+ ", " +$,$$$$$$$$$$++ +t t+++ %% % % % % %% %%%%%% %%%%%% + + .......... +&&&&&&&&&&&&&$t+ %%%%%%%%% ,,, ......... %%%%%%%%% %%%%%%%%% `tt`Y `tt`Y w +&&&&&$+ t++++ t++++ t++++ t++++ ", " +$ttttttttttt+ ++++++t %% ........ +Ottttttttttttt++ `&$tY `&$tY %% +&&&N$O+ ", " ++++++++++++++ t+++t %% .... +++++++++++++++ ````` ````` %% +&N$Ott+ ", " ++++++++ ", " "}; /* ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** */ xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/fist.xbm0000664000175000017500000000043410363262237021326 0ustar uwabamiuwabami#define fist_width 16 #define fist_height 16 static unsigned char fist_bits[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xf2, 0x0f, 0xd0, 0x0f, 0xc0, 0x0b, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xe0, 0x07, 0xe0, 0x0f, 0xf0, 0x1f, 0xf0, 0x1f, 0xf0}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/magglass_mask.xbm0000664000175000017500000000104210363262237023166 0ustar uwabamiuwabami#define magglass_mask_width 20 #define magglass_mask_height 20 #define magglass_mask_x_hot 7 #define magglass_mask_y_hot 7 static unsigned char magglass_mask_bits[] = { 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0xf8, 0x0f, 0x00, 0x1c, 0x1f, 0x00, 0x0c, 0x1c, 0x00, 0x06, 0x38, 0x00, 0x06, 0x38, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x0c, 0x18, 0x00, 0x1c, 0x3c, 0x00, 0xf8, 0x7f, 0x00, 0xe0, 0xfb, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 }; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/hand_mask.xbm0000664000175000017500000000045310363262237022307 0ustar uwabamiuwabami#define hand_mask_width 16 #define hand_mask_height 16 static unsigned char hand_mask_bits[] = { 0x00, 0x00, 0x80, 0x01, 0xd8, 0x0f, 0xfc, 0x1f, 0xfc, 0x5f, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x7f, 0xfc, 0x7f, 0xfc, 0x3f, 0xf8, 0x3f, 0xf0, 0x1f, 0xe0, 0x1f}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/time16.xbm0000664000175000017500000000052310363262237021465 0ustar uwabamiuwabami#define time16_width 16 #define time16_height 16 #define time16_x_hot 7 #define time16_y_hot 7 static unsigned char time16_bits[] = { 0x00, 0x00, 0xfe, 0x7f, 0x14, 0x28, 0x14, 0x28, 0x14, 0x28, 0xe4, 0x27, 0xc4, 0x23, 0x84, 0x21, 0x84, 0x21, 0x44, 0x22, 0x24, 0x24, 0x94, 0x29, 0xd4, 0x2b, 0xf4, 0x2f, 0xfe, 0x7f, 0x00, 0x00}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/fist_mask.xbm0000664000175000017500000000045310363262237022342 0ustar uwabamiuwabami#define fist_mask_width 16 #define fist_mask_height 16 static unsigned char fist_mask_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x0d, 0xf8, 0x3f, 0xf8, 0x7f, 0xfc, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x3f, 0xfc, 0x3f, 0xf8, 0x1f, 0xf0, 0x1f, 0xf0, 0x1f}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/drag_vert_mask.xbm0000664000175000017500000000043410363262237023351 0ustar uwabamiuwabami#define drag_vert_mask_width 7 #define drag_vert_mask_height 17 #define drag_vert_mask_x_hot 3 #define drag_vert_mask_y_hot 8 static unsigned char drag_vert_mask_bits[] = { 0x08, 0x1c, 0x3e, 0x7f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x7f, 0x3e, 0x1c, 0x08}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/time16_mask.xbm0000664000175000017500000000046410363262237022504 0ustar uwabamiuwabami#define time16_mask_width 16 #define time16_mask_height 16 static unsigned char time16_mask_bits[] = { 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xf6, 0x6f, 0xe6, 0x67, 0xc6, 0x63, 0xc6, 0x63, 0xe6, 0x67, 0xf6, 0x6f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/drag_omni.xbm0000664000175000017500000000073410363262237022323 0ustar uwabamiuwabami#define drag_omni_width 17 #define drag_omni_height 17 #define drag_omni_x_hot 8 #define drag_omni_y_hot 8 static unsigned char drag_omni_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x03, 0x00, 0x40, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x08, 0x21, 0x00, 0x04, 0x41, 0x00, 0xfe, 0xff, 0x00, 0x04, 0x41, 0x00, 0x08, 0x21, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x40, 0x05, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/drag_horiz_mask.xbm0000664000175000017500000000047210363262237023526 0ustar uwabamiuwabami#define drag_horiz_mask_width 17 #define drag_horiz_mask_height 7 #define drag_horiz_mask_x_hot 8 #define drag_horiz_mask_y_hot 3 static unsigned char drag_horiz_mask_bits[] = { 0x08, 0x20, 0x00, 0x0c, 0x60, 0x00, 0xfe, 0xff, 0x00, 0xff, 0xff, 0x01, 0xfe, 0xff, 0x00, 0x0c, 0x60, 0x00, 0x08, 0x20, 0x00}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/magglass.xbm0000664000175000017500000000101110363262237022147 0ustar uwabamiuwabami#define magglass_width 20 #define magglass_height 20 #define magglass_x_hot 7 #define magglass_y_hot 7 static unsigned char magglass_bits[] = { 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x18, 0x0c, 0x00, 0x04, 0x13, 0x00, 0x04, 0x14, 0x00, 0x02, 0x28, 0x00, 0x02, 0x28, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x04, 0x38, 0x00, 0x18, 0x6c, 0x00, 0xe0, 0xdb, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x60, 0x03, 0x00, 0xc0, 0x06, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 }; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/xdvi32x32.xpm0000664000175000017500000000275210363262237022060 0ustar uwabamiuwabami/* XPM */ static const char * xdvi32x32_xpm[] = { "32 32 20 1", " c None", ". c #767A87", "X c #030203", "o c #626162", "O c #2F1C0F", "+ c #160807", "@ c #4D310F", "# c #FDCB4F", "$ c #FEE75B", "% c #EFB647", "& c #94681D", "* c #775117", "= c #DCA234", "- c #FEFEFE", "; c #B0A799", ": c #937B54", "> c #B4852E", ", c #A48B69", "< c #D8D3CA", "1 c #D8A847", " .XXXXXXX. .XXXo ", " OXXXXXX+ @@@ .OXXO ", " +XXXXXX.@###O X X oXXX ", " XXXXXXX.#+##@O$@%O&.XXX. ", " .XXXXXXX%&+#&##O#O#*O+@ ", " OXXXXXX&@&###O#O##O&#++ & ", " XXXXXXX@@@##%###O####+&=@", " XXXXX@--;@:@=#O##&O#+@%>", " XXXX@--;:&--@=##&+##+#X ", " **:,@-XX;----@#*X##X&#O*", " ,&######=@+&--<<-@##%#X&#O& ", " ,##########=@--++@=######+#&O", " o&#>##>######=@-OO=####+++&&#&", " #@&#>###@####%=@@==#######$++@", " #*X&#@>@#################++#$@", " ##X@@@###############%++###+% ", " #@##@>@##############*+++##O ", " *@#############+###O####@O@* ", " ##+###########+#####+++###O&+", " ###++#######++###+&###++###=&", " &###+++++++#####%+++##++++&@", " ,#############O%%##+#####& ", " >*&#%1#%#%#==1@%%%%+#&+%#O", " .+X&%=>=*= O@@+%+##+#+@& ", " OXX+.,= % XXX@X&#+##+= ", " oXXX. XXXX>#+&#+=*", " .X+X. o+XXO+X;@& ", " XXXo OXXXXXX ", " XXXO XXXX+Xo ", " oXXX o+XXXXX ", " .XXX. XX+XXX+ ", " .XXXo XXXXXXo "}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/drag_horiz.xbm0000664000175000017500000000044110363262237022507 0ustar uwabamiuwabami#define drag_horiz_width 17 #define drag_horiz_height 7 #define drag_horiz_x_hot 8 #define drag_horiz_y_hot 3 static unsigned char drag_horiz_bits[] = { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x04, 0x40, 0x00, 0xfe, 0xff, 0x00, 0x04, 0x40, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/drag_vert.xbm0000664000175000017500000000040310363262237022332 0ustar uwabamiuwabami#define drag_vert_width 7 #define drag_vert_height 17 #define drag_vert_x_hot 3 #define drag_vert_y_hot 8 static unsigned char drag_vert_bits[] = { 0x00, 0x08, 0x1c, 0x2a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x2a, 0x1c, 0x08, 0x00}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/hand.xbm0000664000175000017500000000043410363262237021273 0ustar uwabamiuwabami#define hand_width 16 #define hand_height 16 static unsigned char hand_bits[] = { 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x67, 0xf2, 0x67, 0xf2, 0x4f, 0xb2, 0x4f, 0x92, 0x1f, 0x90, 0x19, 0x80, 0x11, 0xc0, 0x03, 0xc0, 0x07, 0xc0, 0x07, 0xe0, 0x0f, 0xe0, 0x1f, 0xf0, 0x3f, 0xf0}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/drag_omni_mask.xbm0000664000175000017500000000076510363262237023342 0ustar uwabamiuwabami#define drag_omni_mask_width 17 #define drag_omni_mask_height 17 #define drag_omni_mask_x_hot 8 #define drag_omni_mask_y_hot 8 static unsigned char drag_omni_mask_bits[] = { 0x00, 0x01, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x07, 0x00, 0xe0, 0x0f, 0x00, 0x80, 0x03, 0x00, 0x88, 0x23, 0x00, 0x8c, 0x63, 0x00, 0xfe, 0xff, 0x00, 0xff, 0xff, 0x01, 0xfe, 0xff, 0x00, 0x8c, 0x63, 0x00, 0x88, 0x23, 0x00, 0x80, 0x03, 0x00, 0xe0, 0x0f, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x00}; xdvik-ja-22.84.16-j1.40/texk/xdvik/pixmaps/xdvi48x48.xpm0000664000175000017500000000601310363262237022070 0ustar uwabamiuwabami/* XPM */ static const char * xdvi48x48_xpm[] = { "48 48 35 1", " c None", ". c #848484", "+ c #080808", "@ c #343434", "# c #808080", "$ c #3C3B3C", "% c #7D7D7D", "& c #505050", "* c #946924", "= c #FDC54E", "- c #523611", "; c #2F261C", "> c #6D4E1E", ", c #665641", "' c #EBB345", ") c #9F896C", "! c #B78833", "~ c #626262", "{ c #A9A5A2", "] c #FEFEFE", "^ c #DAD6D1", "/ c #D7A03A", "( c #C7BFB5", "_ c #493415", ": c #64471A", "< c #E9B345", "[ c #8D7757", "} c #696159", "| c #EFEEEE", "1 c #8F7C5A", "2 c #65513A", "3 c #9C9C9B", "4 c #D59E39", "5 c #444444", "6 c #4C4C4C", ".+++++++++++@ @++@ ", " #++++++++++++ +++$ ", " $+++++++++++@ @+++ ", " @+++++++++++% +++++ ++ ++ &+++ ", " ++++++++++++ +*===+ +==+ +==+ -.+++. ", " +++++++++++@ +==;>=+===+ +==++++++, ", " #+++++++++++& +'>;==+===+==+=+==+=+ ++ ", " @+++++++++++ +'*>=+==+==+==+=+'+++''+ ", " ++++++++++++ )+========+==+===-''+''+ ", " +++++++++++@ ----!========+===-=+''+'+ ", " @+++++++++++~-{]]^-=/========!-=++++='+ ", " +++++++++++-{]]]]-)---!======!+!''*++ ", " ++++++++++-]);](-(]]^-!====!+=====+- ", " +++++;-->-];;)-^]]]]^-===/+==*-*=+=+ ", " *-_:!/===<-^(--^]]]]]]-===+=!>++/=+'+ ", " **==========!---[]]]^^](-=====+++!=+''+ ", " *==============/*}]]^;;|-/===/+-!==+!++* ", " *==**/===========/-^]^;;}-=========+!'''- ", " *+=*===============!-^]^^-======++++!=+'='-", " ='+===*/============/----==============+++ ", " !*--=*====+*/=====================++++===+}", " ''>+>===++/==========================++===+", " '''++++>=======================++=====+=++ ", " '*-*+''++======================+++====+ ", " +'*==++''+!======================+++===+ ", " =;+====+!============-==============++=++ ", " /==+================-+=====+++========+=> ", " !==+==============-+========+++=======++}", " ===+-/==========-+======+====+++======+ ", " !===>++*======-+-=======-+======++++=+ ", " !=====++++++++=====-=====+++======++= ", " !=================+======++======++- ", " 1#/============+-====+==+++======+ ", " .+++/=/====++++++++==+====+==-==+2 ", " .+++@>=>=-=- @++++'-==+===+===-=+ ", " @+++3[>->4- @++++'-=+===+===-=+ ", " ~+++. +++++===++==+===-=+ ", " .+++# ++++++==++++===-+ ", " +++5 #+++++++++++++++ ", " @+++. @++++++++++- ", " 6+++ +++++++++++& ", " .+++# +++++++++++. ", " +++# @+++++++++++ ", " +++5 +++++++++++@ ", " @+++. +++++++++++~ ", " 6+++. +++++++++++# ", " #+++# +++++++++++& ", " +++++++++++."}; xdvik-ja-22.84.16-j1.40/texk/xdvik/psdps.c0000664000175000017500000005301211276240141017457 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1994-2004 Paul Vojta 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. NOTES: This code was originally written by Ricardo Telichevesky (ricardo@rle-vlsi-mit.edu) and Luis Miguel Silveira (lms@rle-vlsi-mit.edu). It was largely influenced by similar code in the SeeTeX/XTeX package by Dirk Grunwald (grunwald@colorado.edu). \*========================================================================*/ #ifdef PS_DPS /* entire file */ #include #include #include #include #include #include #include #include #include "xdvi-config.h" #include "special.h" #include "util.h" #include "xdvi.h" #ifdef X_NOT_STDC_ENV extern int errno; #endif #if defined(sun) || defined(__sun) #ifndef SUNHACK #define SUNHACK 1 #endif #endif #include "dvi-init.h" #include "dvi-draw.h" #include "events.h" /* * This string reads chunks (delimited by %%xdvimark). * The first character of a chunk tells whether a given chunk * is to be done within save/restore or not. * The `H' at the end tells it that the first group is a * header; i.e., no save/restore. */ #if !SUNHACK static char preamble[] = "/xdvi$line 81 string def " "/xdvi$run {{$error null ne {$error /newerror false put}if " " currentfile cvx stopped " " $error null eq {false} {$error /newerror get} ifelse and " " {handleerror} if} stopped pop} def " "/xdvi$dslen countdictstack def " "{currentfile read not {exit} if 72 eq " " {xdvi$run} " " {/xdvi$sav save def xdvi$run " " clear countdictstack xdvi$dslen sub {end} repeat xdvi$sav restore} " " ifelse " " {(%%xdvimark) currentfile xdvi$line {readline} stopped " " {clear} {pop eq {exit} if} ifelse }loop " " (xdvi$Ack\n) print flush " "}loop\nH"; #else /* SUNHACK */ static char preamble[] = "/xdvi$line 81 string def " "/xdvi$run {{$error null ne {$error /newerror false put}if " "currentfile cvx stopped " "$error null eq {false} {$error /newerror get} ifelse and " "{handleerror} if} stopped pop} def " "/xdvi$dslen countdictstack def " "/xdvi$ack {{(%%xdvimark) currentfile xdvi$line {readline} stopped " " {clear} {pop eq {exit} if} ifelse }loop " " (xdvi$Ack\n) print flush} bind def " "errordict begin /interrupt{(xdvi$Int\n) print flush stop}bind def " "end " "{{currentfile read not {exit} if 72 eq " " {xdvi$run} " " {/xdvi$sav save def xdvi$run " " clear countdictstack xdvi$dslen sub {end} repeat xdvi$sav restore} " " ifelse " " xdvi$ack " " }loop " "xdvi$ack " "}loop\nH"; #endif /* SUNHACK */ extern const char psheader[]; extern unsigned psheaderlen; /* global procedures (besides initDPS) */ static void toggleDPS(int flag); static void destroyDPS(void); static void interruptDPS(void); static void endpageDPS(void); static void drawbeginDPS(int, int, const char *); static void drawbeginDPS_box(int, int, const char *); static void drawrawDPS(const char *); static void drawfileDPS(const char *, FILE *); static void drawendDPS(const char *); static void beginheaderDPS(void); static void endheaderDPS(void); static void newdocDPS(void); static struct psprocs dps_procs = { /* toggle */ toggleDPS, /* destroy */ destroyDPS, /* interrupt */ interruptDPS, /* endpage */ endpageDPS, /* drawbegin */ drawbeginDPS, /* drawraw */ drawrawDPS, /* drawfile */ drawfileDPS, /* drawend */ drawendDPS, /* beginheader */ beginheaderDPS, /* endheader */ endheaderDPS, /* newdoc */ newdocDPS }; #define DPS_MASK_NORMAL EV_GE_NEWPAGE #define DPS_MASK_HEADER EV_GE_PS_TOGGLE #define DPS_MASK_INIT (EV_GE_TERM | EV_PS_TOGGLE) static DPSContext DPS_ctx = NULL; static DPSSpace DPS_space = NULL; static unsigned long DPS_mag; /* magnification currently in use */ static int DPS_shrink; /* shrink factor currently in use */ static Boolean DPS_active; /* if we've started a page */ static int DPS_pending; /* number of ack's we're expecting */ static Boolean DPS_in_header; /* if we're sending a header */ static Boolean DPS_in_doc; /* if we've sent header information */ static int DPS_ev_mask = DPS_MASK_NORMAL; /* events for which we'll stop */ #if 0 static void DPSErrorProcHandler(void); #else #define DPSErrorProcHandler DPSDefaultErrorProc #endif static char ackstr[] = "xdvi$Ack\n"; #if SUNHACK static char intstr[] = "xdvi$Int\n"; static char intstr2[] = "xdvi$In2\n"; #endif #define LINELEN 81 #define BUFLEN (LINELEN + sizeof ackstr) static char line[BUFLEN + 1]; static char *linepos = line; static void TextProc(DPSContext ctxt, char *buf, unsigned long count) { unsigned long i; char *p; char *p0; UNUSED(ctxt); while (count > 0) { i = line + BUFLEN - linepos; if (i > count) i = count; (void)bcopy(buf, linepos, i); linepos += i; buf += i; count -= i; p0 = line; for (;;) { if (p0 >= linepos) { linepos = line; break; } p = memchr(p0, '\n', linepos - p0); if (p == NULL) { if (p0 != line) { (void)bcopy(p0, line, linepos - p0); linepos -= p0 - line; } else if (linepos == line + BUFLEN) { char c; c = line[LINELEN]; line[LINELEN] = '\0'; printf("DPS: %s\n", line); line[LINELEN] = c; linepos -= LINELEN; (void)bcopy(line + LINELEN, line, linepos - line); } break; } if (p >= p0 + 8 && memcmp(p - 8, ackstr, 9) == 0) { --DPS_pending; if (DPS_pending == 0) globals.ev.flags |= EV_ACK; if (globals.debug & DBG_PS) printf("Got DPS ack; %d pending.\n", DPS_pending); ++p; (void)bcopy(p, p - 9, linepos - p); linepos -= 9; continue; } #if SUNHACK if (p >= p0 + 8 && memcmp(p - 8, intstr, 9) == 0) { if (globals.debug & DBG_PS) puts("Got DPS int."); ++p; (void)bcopy(p, p - 9, linepos - p); linepos -= 9; globals.ev.flags |= EV_ACK; continue; } if (p >= p0 + 8 && memcmp(p - 8, intstr2, 9) == 0) { if (globals.debug & DBG_PS) puts("Got DPS int 2."); ++p; (void)bcopy(p, p - 9, linepos - p); linepos -= 9; DPS_pending = 3; continue; } #endif /* SUNHACK */ *p = '\0'; printf("DPS: %s\n", p0); p0 = p + 1; } } } /*---------------------------------------------------------------------------* waitack() Arguments: none. Returns: (void) Description: Waits until the requisite number of acknowledgements has been received from the context. +----------------------------------------------------------------------------*/ #if SUNHACK static void DPS_alarm(struct xtimer *this, void *data); static struct xtimer DPS_timer = {NULL, {0, 0}, XTM_DEFAULT, DPS_alarm, NULL #if XDVI_XT_TIMER_HACK , NULL, NULL #endif }; static Boolean DPS_timer_set; static void DPS_alarm(struct xtimer *this, void *data) { UNUSED(this); UNUSED(data); if (globals.debug & DBG_PS) puts("Received DPS alarm"); DPS_timer_set = False; globals.ev.flags |= EV_ACK; } #endif /* SUNHACK */ static void waitack(void) { if (DPS_pending <= 0) return; DPSFlushContext(DPS_ctx); if (read_events(DPS_ev_mask | EV_ACK) & EV_ACK) { globals.ev.flags &= ~EV_ACK; return; } if (globals.debug & DBG_PS) printf("Interrupting DPS in waitack(); code is now %d %x\n", XDPSGetContextStatus(DPS_ctx), globals.ev.flags); DPS_active = DPS_in_header = DPS_in_doc = False; DPS_ev_mask = DPS_MASK_NORMAL; /* * I would really like to use DPSInterruptContext() here, but (at least * on an RS6000) I can't get it to work. */ #if SUNHACK /* * On the other hand, under OpenWindows 3.3 (at least), destroying and * re-creating contexts has a nasty habit of crashing the server. */ DPS_pending = 32767; DPSInterruptContext(DPS_ctx); DPSFlushContext(DPS_ctx); (void) read_events(EV_GE_TERM | EV_ACK); globals.ev.flags &= ~EV_ACK; XSync(DISP, False); DPSPrintf(DPS_ctx, " stop\n%%%%xdvimark\n stop\n%%%%xdvimark\n"); DPSPrintf(DPS_ctx, " (xdvi$In2\n) print flush stop\n%%%%xdvimark\n"); DPSPrintf(DPS_ctx, " stop\n%%%%xdvimark\n stop\n%%%%xdvimark\n"); DPSFlushContext(DPS_ctx); if (globals.debug & DBG_PS) puts("Setting DPS timer"); DPS_timer_set = True; set_timer(&DPS_timer, 500); (void) read_events(EV_GE_TERM | EV_ACK); globals.ev.flags &= ~EV_ACK; if (DPS_pending <= 0) { if (DPS_timer_set) { cancel_timer(&DPS_timer); } return; } /* * However, under Solaris 2.6 (at least), sometimes interrupting the * context leaves it in an uncommunicative state, so destruction * is the only alternative. */ if (globals.debug & DBG_PS) puts("Plan B: Destroying DPS context"); #endif /* SUNHACK */ DPSDestroyContext(DPS_ctx); DPS_ctx = NULL; DPS_pending = 0; } /*---------------------------------------------------------------------------* initDPS() Arguments: (none) Returns: (void) Side-Effects: DPS_ctx may be set as well as other static variables. Description: Initializes variables from the application main loop. Checks to see if a connection to the DPS server can be opened. +----------------------------------------------------------------------------*/ static int get_shift(Pixel mask) { int k; for (k = 0; (mask & 1) == 0; ++k) mask >>= 1; return k; } Boolean initDPS(void) { /* Try to create a context */ #if GREY if (G_colormap == DefaultColormapOfScreen(SCRN)) DPS_ctx = XDPSCreateSimpleContext(DISP, mane.win, globals.gc.copy, 0, 0, TextProc, DPSDefaultErrorProc, NULL); else { static XStandardColormap *ccube = NULL; static XStandardColormap *grayramp = NULL; int shift; if (grayramp == NULL) { grayramp = XAllocStandardColormap(); if (grayramp == NULL) return False; } if (ccube == NULL) { ccube = XAllocStandardColormap(); if (ccube == NULL) return False; } shift = get_shift(G_visual->red_mask); ccube->red_max = G_visual->red_mask >> shift; ccube->red_mult = 1 << shift; shift = get_shift(G_visual->green_mask); ccube->green_max = G_visual->green_mask >> shift; ccube->green_mult = 1 << shift; shift = get_shift(G_visual->blue_mask); ccube->blue_max = G_visual->blue_mask >> shift; ccube->blue_mult = 1 << shift; grayramp->red_max = ccube->red_max & ccube->green_max & ccube->blue_max; grayramp->red_mult = ccube->red_mult + ccube->green_mult + ccube->blue_mult; ccube->colormap = grayramp->colormap = G_colormap; ccube->visualid = grayramp->visualid = G_visual->visualid; DPS_ctx = XDPSCreateContext(DISP, mane.win, globals.gc.copy, 0, 0, 0, grayramp, ccube, /* actual */ (ccube->red_max + 1) * (ccube->green_max + 1) * (ccube->blue_max + 1), TextProc, DPSDefaultErrorProc, NULL); } #else /* not GREY */ DPS_ctx = XDPSCreateSimpleContext(DISP, mane.win, globals.gc.copy, 0, 0, TextProc, DPSDefaultErrorProc, NULL); #endif /* not GREY */ if (DPS_ctx == NULL) return False; DPS_mag = DPS_shrink = -1; DPS_active = False; DPS_pending = 1; DPS_space = DPSSpaceFromContext(DPS_ctx); DPSWritePostScript(DPS_ctx, preamble, (sizeof preamble) - 1); DPSWritePostScript(DPS_ctx, (char *)psheader, psheaderlen); DPSPrintf(DPS_ctx, "matrix setmatrix stop\n%%%%xdvimark\n"); DPSFlushContext(DPS_ctx); psp = dps_procs; return True; } /*---------------------------------------------------------------------------* toggleDPS(int flag) Arguments: flag for toggling PostScript Returns: (void) Side-Effects: psp.drawbegin is changed. Description: Used to toggle the rendering of PostScript by the DPS server This routine may be called from within read_events(). +----------------------------------------------------------------------------*/ static void toggleDPS(int flag) { if (globals.debug & DBG_PS) fprintf(stderr, "Toggling DPS to %d", flag); switch (flag) { case 0: psp.drawbegin = drawbegin_none; break; case 1: psp.drawbegin = drawbeginDPS; break; default: psp.drawbegin = drawbeginDPS_box; break; } } /*---------------------------------------------------------------------------* destroyDPS() Arguments: none Returns: (void) Side-Effects: the context is nulled out and destroyed. Description: Close the connection to the DPS server; used when rendering is terminated in any way. +----------------------------------------------------------------------------*/ static void destroyDPS(void) { if (globals.debug & DBG_PS) puts("Calling destroyDPS()"); if (linepos > line) { *linepos = '\0'; printf("DPS: %s\n", line); } if (DPS_space != NULL) DPSDestroySpace(DPS_space); psp = no_ps_procs; scanned_page = scanned_page_ps = scanned_page_reset; } /*---------------------------------------------------------------------------* interruptDPS() Arguments: none Returns: (void) Side-Effects: the context may be nulled out and destroyed. Description: Close the connection to the DPS server; used when rendering is terminated because of an interruption in the viewing of the current page. +----------------------------------------------------------------------------*/ static void interruptDPS(void) { if (globals.debug & DBG_PS) puts("Running interruptDPS()"); if (DPS_pending <= 0) return; /* nothing to do */ if (DPS_active) { DPSPrintf(DPS_ctx, "stop\n%%%%xdvimark\n"); DPS_active = False; } waitack(); } /*---------------------------------------------------------------------------* endpageDPS() Arguments: none Returns: (void) Side-Effects: the DPS_active variable is cleared. Description: Should be called at the end of a page to end this chunk for the DPS server. +----------------------------------------------------------------------------*/ static void endpageDPS(void) { if (DPS_active) { if (globals.debug & DBG_PS) puts("Endpage sent to context"); DPSPrintf(DPS_ctx, "stop\n%%%%xdvimark\n"); DPS_active = False; waitack(); } } /* * checkDPS - Check that the DPS interpreter is still running. * Return True for success, False for failure. */ static Boolean checkDPS(void) { /* static char faulty_display_vs[] * ="DECWINDOWS DigitalEquipmentCorporation UWS4.2LA"; */ if (DPS_ctx == NULL) { DPS_ctx = XDPSCreateSimpleContext(DISP, mane.win, globals.gc.copy, 0, 0, TextProc, DPSErrorProcHandler, DPS_space); if (DPS_ctx == NULL) { psp = no_ps_procs; draw_bbox(); return False; } DPSWritePostScript(DPS_ctx, preamble, (sizeof preamble) - 1); /* it already has psheader */ DPSPrintf(DPS_ctx, "matrix setmatrix stop\n%%%%xdvimark\n"); DPS_mag = DPS_shrink = -1; DPS_active = False; DPS_pending = 1; } return True; } /*---------------------------------------------------------------------------* drawbeginDPS () Arguments: xul, yul - coordinates of the upper left corner of the figure cp - string with the bounding box line data Returns: (void) Side-Effects: DPS_ctx is set is set and connection to DPS server is opened. Description: Opens a connection to the DPS server and send in the preamble and the bounding box information after correctly computing resolution factors. In case no rendering is to be done, outlines the figure. An outline is also generated whenever the a context cannot be allocated +----------------------------------------------------------------------------*/ static void drawbeginDPS(int xul, int yul, const char *cp) { if (globals.debug & DBG_PS) printf("Begin drawing at xul= %d, yul= %d.\n", xul, yul); if (!checkDPS()) return; if (!DPS_active) { /* send initialization to context */ if (magnification != DPS_mag) { DPSPrintf(DPS_ctx, "H TeXDict begin /DVImag %d 1000 div def " "end stop\n%%%%xdvimark\n", DPS_mag = magnification); ++DPS_pending; } if (mane.shrinkfactor != DPS_shrink) { DPSPrintf(DPS_ctx, "H TeXDict begin %d %d div dup " "/Resolution X /VResolution X " "end stop\n%%%%xdvimark\n", resource.pixels_per_inch, DPS_shrink = mane.shrinkfactor); ++DPS_pending; } DPSPrintf(DPS_ctx, " TeXDict begin\n"); DPS_active = True; ++DPS_pending; } if (globals.ev.flags & DPS_MASK_NORMAL) longjmp(globals.ev.canit, 1); DPSPrintf(DPS_ctx, "%d %d moveto\n", xul, yul); DPSPrintf(DPS_ctx, "%s\n", cp); } static void drawbeginDPS_box(int xul, int yul, const char *cp) { drawbeginDPS(xul, yul, cp); draw_bbox(); } /*---------------------------------------------------------------------------* drawrawDPS() Arguments: cp - the raw string to be sent to the postscript interpreter Returns: (void) Side-Effects: (none) Description: If there is a valid postscript context, just send the string to the interpreter, else leave. +----------------------------------------------------------------------------*/ static void drawrawDPS(const char *cp) { if (!DPS_active || (globals.ev.flags & DPS_ev_mask)) return; if (globals.debug & DBG_PS) printf("Sending raw PS to context: %s\n", cp); DPSPrintf(DPS_ctx, "%s\n", cp); } /*---------------------------------------------------------------------------* drawfileDPS() Arguments: cp - string with the postscript file pathname psfile - opened file pointer Returns: (void) Side-Effects: none Description: Postscript file containing the figure is opened and sent to the DPS server. +----------------------------------------------------------------------------*/ static void drawfileDPS(const char *cp, FILE *psfile) { char buffer[1025]; int blen; if (DPS_active && !(read_events(EV_NOWAIT) & DPS_ev_mask)) { if (globals.debug & DBG_PS) printf("sending file %s\n", cp); for (;;) { blen = fread(buffer, sizeof(char), 1024, psfile); if (blen == 0) break; DPSWritePostScript(DPS_ctx, buffer, blen); if (read_events(EV_NOWAIT) & DPS_ev_mask) { /* ||| stop at a good place */ if (globals.debug & DBG_PS) puts("Interrupting in drawfileDPS"); break; } } } fclose(psfile); if (globals.ev.flags & DPS_ev_mask) longjmp(globals.ev.canit, 1); } /*---------------------------------------------------------------------------* drawendDPS() Arguments: cp - string with indication of the end of the special Returns: (void) Side-Effects: none Description: Sends the indication of end of the figure PostScript code. +----------------------------------------------------------------------------*/ static void drawendDPS(const char *cp) { if (!DPS_active || (globals.ev.flags & DPS_MASK_NORMAL)) return; if (globals.debug & DBG_PS) printf("End PS: %s\n", cp); DPSPrintf(DPS_ctx, "%s\n", cp); } /*---------------------------------------------------------------------------* beginheaderDPS() Arguments: none Returns: (void) Description: Prepares the PostScript interpreter for receipt of header code. +----------------------------------------------------------------------------*/ static void beginheaderDPS(void) { if (globals.ev.flags & DPS_MASK_HEADER || !checkDPS()) return; if (globals.debug & DBG_PS) puts("Running beginheaderDPS()"); if (DPS_active) { if (!DPS_in_header) XDVI_FATAL((stderr, "Internal error in beginheaderDPS().")); return; } DPS_in_header = True; DPS_ev_mask = DPS_MASK_HEADER; if (DPS_in_doc) DPSPrintf(DPS_ctx, "H"); else { DPSPrintf(DPS_ctx, "Hsave /xdvi$doc exch def\n"); DPS_in_doc = True; } DPS_active = True; ++DPS_pending; } /*---------------------------------------------------------------------------* endheaderDPS() Arguments: none Returns: (void) Description: Prepares the PostScript interpreter for receipt of header code. +----------------------------------------------------------------------------*/ static void endheaderDPS(void) { if (globals.debug & DBG_PS) puts("Running endheaderDPS()"); if (DPS_active) { DPSPrintf(DPS_ctx, "stop\n%%%%xdvimark\n"); DPS_active = False; waitack(); DPS_in_header = False; DPS_ev_mask = DPS_MASK_NORMAL; } } /*---------------------------------------------------------------------------* newdocDPS() Arguments: none Returns: (void) Description: Clears out headers stored from the previous document. +----------------------------------------------------------------------------*/ static void newdocDPS(void) { if (globals.debug & DBG_PS) puts("Running newdocDPS()"); if (DPS_in_doc) { DPSPrintf(DPS_ctx, "H xdvi$doc restore stop\n%%%%xdvimark\n"); ++DPS_pending; DPS_mag = DPS_shrink = -1; DPS_in_doc = False; } } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* PS_DPS */ xdvik-ja-22.84.16-j1.40/texk/xdvik/translations.h0000664000175000017500000003647111164427731021076 0ustar uwabamiuwabami/* key translations */ #include "c-auto.h" #include "xdvi.h" #include "version.h" static const char base_key_translations[] = /* note: more specific key bindings must always come first (i.e. `alt ctrl' before `ctrl' before unmodified) `:' at start of description means that case matters */ "0: digit(0)\n" "1: digit(1)\n" "2: digit(2)\n" "3: digit(3)\n" "4: digit(4)\n" "5: digit(5)\n" "6: digit(6)\n" "7: digit(7)\n" "8: digit(8)\n" "9: digit(9)\n" ": motion()\n" "Ctrl]: pagehistory-delete-forward()\n" "Ctrl[: pagehistory-delete-backward()\n" /* it seems the following is needed for compatibility with german, french, italian, spanish and other keyboards that have [, ] on right Alt key? */ "Ctrl Mod2]: pagehistory-delete-forward()\n" "Ctrl Mod2[: pagehistory-delete-backward()\n" "Mod2]: pagehistory-forward()\n" "Mod2[: pagehistory-back()\n" "]: pagehistory-forward()\n" "[: pagehistory-back()\n" "Alt Ctrl+: change-density(10)\n" /* case insensitive, otherwise too hard to type */ ":Alt Ctrl-: change-density(-10)\n" "Ctrl+: set-shrink-factor(+)\n" /* case insensitive, otherwise too hard to type */ ":Ctrl-: set-shrink-factor(-)\n" ":-: minus()\n" ":?: help()\n" /* ":/: incremental-find()\n" */ ":>: goto-page()\n" ":<: goto-page(1)\n" ":^: home()\n" "space: unpause-or-next()\n" ":B: htex-back()\n" ":b: back-page()\n" /* removed, redundant and gets in the way ":Ctrlc: quit()\n" */ #if COLOR ":C: set-color()\n" #endif ":c: center()\n" /* removed, redundant and gets in the way ":Ctrld: quit()\n" */ ":D: toggle-grid-mode()\n" ":d: down()\n" "Ctrlf: find()\n" ":F: htex-forward()\n" ":~Altf: forward-page()\n" "Ctrlg: find-next()\n" #ifdef GREY ":G: set-greyscaling()\n" #endif ":g: goto-page()\n" "Ctrlh: back-page()\n" ":~Alth: help()\n" ":i: htex-anchorinfo()\n" "Ctrlj: forward-page()\n" ":k: set-keep-flag()\n" "Ctrll: fullscreen()\n" ":l: left()\n" "Ctrlm: switch-mode()\n" ":M: set-margins()\n" ":~Altm: toggle-mark()\n" "~Alt Ctrln: toggle-mark()forward-page()\n" ":~Altn: forward-page()\n" "Ctrlo: select-dvi-file()\n" ":~Alto: ruler-snap-origin()\n" /* this used to be show-display-attributes() - use the output of `-debug PK' instead */ "Ctrlp: print()\n" ":P: declare-page-number()\n" ":p: back-page()\n" ":q: quit()\n" "Ctrlr: forward-page(0)\n" /* redraw page */ ":R: reread-dvi-file()\n" ":r: right()\n" "Ctrls: save()\n" ":S: set-density()\n" ":s: set-shrink-factor()\n" ":T: use-tex-pages(toggle)\n" ":t: switch-magnifier-units()\n" "Ctrlu: back-page()toggle-mark()\n" ":u: up()\n" "Ctrlv: show-source-specials()\n" #ifdef PS_GS ":V: set-gs-alpha()\n" #endif /* PS_GS */ #ifdef PS ":v: set-ps()\n" #endif "Ctrlx: source-what-special()\n" ":x: set-expert-mode()\n" #ifdef VMS "~Alt Ctrlz: quit()\n" #endif "Return: forward-page()\n" "Delete: up-or-previous()\n" "BackSpace: back-page()\n" #ifdef MOTIF "osfDelete: up-or-previous()\n" "osfBackSpace: back-page()\n" "CtrlosfBeginLine: goto-page(1)\n" "CtrlosfEndLine: goto-page()\n" "osfBeginLine: home-or-top()\n" "osfEndLine: end-or-bottom()\n" "osfLeft: left(0.015)\n" "osfUp: up(0.015)\n" "osfRight: right(0.015)\n" "osfDown: down(0.015)\n" "osfPageUp: back-page()\n" "osfPageDown: forward-page()\n" "osfCancel: discard-number()\n" #else "CtrlHome: goto-page(1)\n" "CtrlEnd: goto-page()\n" "Home: home-or-top()\n" "End: end-or-bottom()\n" "Left: left(0.015)\n" "Up: up(0.015)\n" "Right: right(0.015)\n" "Down: down(0.015)\n" "Prior: back-page()\n" "Next: forward-page()\n" "Escape: discard-number()\n" #endif #ifdef XK_KP_Left "~@Num_LockKP_Home:home()\n" "~@Num_LockKP_Left:left(0.015)\n" "~@Num_LockKP_Begin:center()\n" "~@Num_LockKP_Up:up(0.015)\n" "~@Num_LockKP_Right:right(0.015)\n" "~@Num_LockKP_Down:down(0.015)\n" "~@Num_LockKP_Prior:back-page()\n" "~@Num_LockKP_Next:forward-page()\n" "KP_Enter:forward-page()\n" "KP_Delete:up-or-previous()\n" "KP_1:digit(1)\n" "KP_2:digit(2)\n" "KP_3:digit(3)\n" "KP_4:digit(4)\n" "KP_5:digit(5)\n" "KP_6:digit(6)\n" "KP_7:digit(7)\n" "KP_8:digit(8)\n" "KP_9:digit(9)\n" "KP_0:digit(0)\n" #endif ""; static const char base_mouse_translations[] = ":release()\n" "Shift: mouse-modes(\"drag(+)\")\n" "Shift: mouse-modes(\"drag(|)\")\n" "Shift: mouse-modes(\"drag(-)\")\n" "Ctrl: mouse-modes(\"source-special()\", \"source-special()\", \"source-special()\")\n" ": mouse-modes(\"do-href()magnifier(*2)\", \"text-selection()\", \"ruler()\")\n" ": mouse-modes(\"do-href-newwindow()magnifier(*2)\", \"text-selection()\", \"ruler()\")\n" ": mouse-modes(\"magnifier(*3)\")\n" ": mouse-modes(\"wheel(-0.2)\")\n" ": mouse-modes(\"wheel(0.2)\")\n" ""; /* #if defined(NEW_MENU_CREATION) || defined(MOTIF) */ /* BNF-like Syntax of the entries: entry ::= entry-line `\n' ( entry )* entry-line ::= menu-spec `:' button-type `:' mnemonic `:' action menu-spec ::= menu-name ( `>' menu-name )* menu-name ::= menu-title `|' accelerator menu-title ::= String mnemonic ::= | String action ::= | String accelerator ::= `A'|`B'|`C'|...|`a'|`b'|`c'|... button-type ::= `PUSH' | `RADIO' | `CHECK' | `SEP' Notes: - In entry-line, every occurrence of `:' that's not a separator has to be escaped like this: `\:'; similar for `>' in menu-spec and `|' in menu-title. - Every `>' in menu-spec creates a submenu for the corresponding menu. - mnemonic is the key binding for the action, displayed as mnemonic string in the Motif menus (not yet in the Xaw version, since Xaw doesn't provide for such mnemonics). - accelerator is the Motif menu accelerator key. */ static const char default_menu_config[] = "File|F > Open ...|O :PUSH :Ctrl-o :select-dvi-file()\n" "File|F > Open Recent|R :PUSH : :recent-files()\n" "File|F > Reload|l :PUSH :R :reread-dvi-file()\n" "File|F :SEP ::\n" "File|F > Find ...|F :PUSH :Ctrl-f :find()\n" "File|F > Find Next ...|N :PUSH :Ctrl-g :find-next()\n" "File|F :SEP ::\n" "File|F > Print ...|P :PUSH :Ctrl-p :print()\n" "File|F > Save As ...|S :PUSH :Ctrl-s :save()\n" "File|F :SEP ::\n" "File|F > Quit|Q :PUSH :q :quit()\n" /* ========== */ "Navigate|N > Page-10| :PUSH :10 p :back-page(10)\n" "Navigate|N > Page-5| :PUSH :5 p :back-page(5)\n" "Navigate|N > Prev|P :PUSH :p :back-page(1)\n" "Navigate|N > Next|N :PUSH :n :forward-page(1)\n" "Navigate|N > Page+5| :PUSH :5 n :forward-page(5)\n" "Navigate|N > Page+10| :PUSH :10 n :forward-page(10)\n" "Navigate|N :SEP ::\n" "Navigate|N > First Page|F :PUSH :1 g :goto-page(1)\n" "Navigate|N > Last Page|L :PUSH :g :goto-page()\n" "Navigate|N :SEP ::\n" "Navigate|N > Page History Back| :PUSH :[ :pagehistory-back()\n" "Navigate|N > Page History Forward| :PUSH :] :pagehistory-forward()\n" /* "Navigate|N :SEP ::\n" */ /* "Navigate|N > Clear Page History| :PUSH : :pagehistory-clear()\n" */ "Navigate|N :SEP ::\n" "Navigate|N > Back Hyperlink|B :PUSH :B :htex-back()\n" "Navigate|N > Forward Hyperlink|F :PUSH :F :htex-forward()\n" /* ========== */ #ifdef MOTIF /* Motif zoom buttons are more verbose to emphasise the accelerator */ "Zoom|Z > Shrink by 1|1 :RADIO :1 s :set-shrink-factor(1)\n" "Zoom|Z > Shrink by 2|2 :RADIO :2 s :set-shrink-factor(2)\n" "Zoom|Z > Shrink by 3|3 :RADIO :3 s :set-shrink-factor(3)\n" "Zoom|Z > Shrink by 4|4 :RADIO :4 s :set-shrink-factor(4)\n" "Zoom|Z > Shrink by 5|5 :RADIO :5 s :set-shrink-factor(5)\n" "Zoom|Z > Shrink by 6|6 :RADIO :6 s :set-shrink-factor(6)\n" "Zoom|Z > Shrink by 7|7 :RADIO :7 s :set-shrink-factor(7)\n" "Zoom|Z > Shrink by 8|8 :RADIO :8 s :set-shrink-factor(8)\n" "Zoom|Z > Shrink by 9|9 :RADIO :9 s :set-shrink-factor(9)\n" #else "Zoom|Z > 1|1 :RADIO :1 s :set-shrink-factor(1)\n" "Zoom|Z > 2|2 :RADIO :2 s :set-shrink-factor(2)\n" "Zoom|Z > 3|3 :RADIO :3 s :set-shrink-factor(3)\n" "Zoom|Z > 4|4 :RADIO :4 s :set-shrink-factor(4)\n" "Zoom|Z > 5|5 :RADIO :5 s :set-shrink-factor(5)\n" "Zoom|Z > 6|6 :RADIO :6 s :set-shrink-factor(6)\n" "Zoom|Z > 7|7 :RADIO :7 s :set-shrink-factor(7)\n" "Zoom|Z > 8|8 :RADIO :8 s :set-shrink-factor(8)\n" "Zoom|Z > 9|9 :RADIO :9 s :set-shrink-factor(9)\n" #endif "Zoom|Z :SEP ::\n" "Zoom|Z > Fit in Window|F :PUSH :s :set-shrink-factor(a)\n" "Zoom|Z :SEP ::\n" "Zoom|Z > Zoom In|I :PUSH :Ctrl-+ :set-shrink-factor(+)\n" "Zoom|Z > Zoom Out|O :PUSH :Ctrl-- :set-shrink-factor(-)\n" /* ========== */ "Mark|M > Mark All Pages|M :PUSH :-1 m :toggle-mark(-1)\n" "Mark|M > Unmark All Pages|U :PUSH :0 m :toggle-mark(0)\n" "Mark|M :SEP ::\n" "Mark|M > Toggle Odd Pages|O :PUSH :1 m :toggle-mark(1)\n" "Mark|M > Toggle Even Pages|E :PUSH :2 m :toggle-mark(2)\n" "Mark|M > Toggle Current Page|C :PUSH :m :toggle-mark()\n" #ifndef MOTIF /* special `Modes' menu for Xaw */ "Modes|M > Magnifier|M :RADIO :Ctrl-m :switch-mode(0)\n" "Modes|M > Text Selection|T :RADIO :Ctrl-m :switch-mode(1)\n" "Modes|M > Ruler|R :RADIO :Ctrl-m :switch-mode(2)\n" #endif /* ========== */ "Options|O > Keep Position|K :CHECK :k :set-keep-flag(toggle)\n" "Options|O > Use TeX Page Numbers|T :CHECK :T :use-tex-pages(toggle)\n" "Options|O :SEP ::\n" /* ---------- */ #ifdef MOTIF /* nested menus are used in Motif only */ #if 0 /* TODO: implement setting paper size at runtime */ "Options|O > Paper|a > US letter|U :RADIO : :set-papersize(us)\n" "Options|O > Paper|a > Legal|L :RADIO : :set-papersize(legal)\n" "Options|O > Paper|a > Foolscap|F :RADIO : :set-papersize(foolscap)\n" "Options|O > Paper|a > A1|1 :RADIO : :set-papersize(a1)\n" "Options|O > Paper|a > A2|2 :RADIO : :set-papersize(a2)\n" "Options|O > Paper|a > A3|3 :RADIO : :set-papersize(a3)\n" "Options|O > Paper|a > A4|4 :RADIO : :set-papersize(a4)\n" "Options|O > Paper|a > A5|5 :RADIO : :set-papersize(a5)\n" "Options|O > Paper|a > A6|5 :RADIO : :set-papersize(a6)\n" "Options|O > Paper|a > A7|7 :RADIO : :set-papersize(a7)\n" /* Note: the b* and c* DIN sizes are too rarely used to be exposed here; people can still customize the Menu if they really need them. */ "Options|O > Paper|a :SEP ::\n" "Options|O > Paper|a > Landscape|L :CHECK : :set-paper-landscape(toggle)\n" #endif /* 0 */ /* ---------- */ # if PS "Options|O > Postscript|o > Show PS|S :RADIO :1 v :set-ps(1)\n" "Options|O > Postscript|o > Show PS and Bounding Boxes|B :RADIO :2 v :set-ps(2)\n" "Options|O > Postscript|o > Show Bounding Boxes Only|O :RADIO :0 v :set-ps(0)\n" # ifdef GS_PS "Options|O > Postscript|o :SEP ::\n" "Options|O > Postscript|o > Use PS Anti-Aliasing|A :CHECK :V :set-gs-alpha(toggle)\n" # endif # endif /* ---------- */ "Options|O > Mouse Mode|M > Magnifier|M :RADIO :0 Ctrl-m :switch-mode(0)\n" "Options|O > Mouse Mode|M > Text Selection|T :RADIO :1 Ctrl-m :switch-mode(1)\n" "Options|O > Mouse Mode|M > Ruler|R :RADIO :2 Ctrl-m :switch-mode(2)\n" "Options|O :SEP ::\n" "Options|O > Preferences ...|P :PUSH : :prefs-dialog()\n" #else "Options|O > Show PS|S :RADIO :1 v :set-ps(1)\n" "Options|O > Show PS and Bounding Boxes|B :RADIO :2 v :set-ps(2)\n" "Options|O > Show Bounding Boxes Only|O :RADIO :0 v :set-ps(0)\n" "Options|O :SEP ::\n" "Options|O > Use PS Anti-Aliasing|A :CHECK :V :set-gs-alpha(toggle)\n" "Options|O :SEP ::\n" "Options|O > Fonts Darker|D :PUSH :Alt-Ctrl-+:change-density(5)\n" "Options|O > Fonts Lighter|L :PUSH :Alt-Ctrl--:change-density(-5)\n" #endif /* MOTIF */ /* ========== */ "Help|H > Introduction ...|I :PUSH : :help(Introduction)\n" "Help|H > Page Motion ...|P :PUSH : :help(Page Motion)\n" "Help|H > Other Commands ...|O :PUSH : :help(Other Commands)\n" "Help|H > Hyperlinks ...|H :PUSH : :help(Hyperlinks)\n" "Help|H > Mouse Buttons ...|M :PUSH : :help(Mouse Buttons)\n" "Help|H > Mouse Modes ...|d :PUSH : :help(Mouse Modes)\n" "Help|H > String Search ...|e :PUSH : :help(String Search)\n" "Help|H > Printing and Saving ...|S :PUSH : :help(Printing and Saving)\n" "Help|H > Source Specials ...|r :PUSH : :help(Source Specials)\n" "Help|H :SEP ::\n" "Help|H > New Features in this Version|F:PUSH::load-url(http\\://xdvi.sourceforge.net/releases.html#" XDVI_VERSION ")\n" "Help|H > Submit a Bug Report|B :PUSH ::load-url(http\\://sourceforge.net/tracker/?func=add&group_id=23164&atid=377580)\n" ""; static const char default_toolbar_translations[] = /* index statusline-text tooltip action */ "SPACER(5)\n" "0: Open a new file (Key\\: Ctrl-o): Open file: select-dvi-file()\n" "SPACER(10)\n" "1: Reload this file (Key\\: R): Reload file: reread-dvi-file()\n" "SPACER(10)\n" "2: Go to the first page of this file (Key\\: 1g): First page: goto-page(1)\n" "3: Go to the previous page of this file (Key\\: p): Previous page: back-page(1)\n" "4: Go to the next page of this file (Key\\: n): Next page: forward-page(1)\n" "5: Go to the last page of this file (Key\\: g): Last page: goto-page(e)\n" "SPACER(10)\n" "8: Back to previous page in history (Key\\: [): Page History back: pagehistory-back()\n" "9: Forward to next page in history (Key\\: ]): Page History forward: pagehistory-forward()\n" "SPACER(10)\n" "6: Zoom in (Key\\: Ctrl-+): Zoom in: set-shrink-factor(+)\n" "7: Zoom out (Key\\: Ctrl--): Zoom out: set-shrink-factor(-)\n" "SPACER(10)\n" "11:Print this DVI file:Print:print()\n" "SPACER(10)\n" "16:Find in DVI file (Key\\: Ctrl-f): Find in file: find()\n" "SPACER(10)\n" "12:Toggle marks of odd pages (Key\\: 1m): Toggle odd pages: toggle-mark(1)\n" "13:Toggle marks of even pages (Key\\: 2m): Toggle even pages: toggle-mark(2)\n" "14:Toggle mark of current page (Key\\: 2m): Toggle current page: toggle-mark()\n" "15:Unmark all pages (Key\\: 0m): Unmark all pages: toggle-mark(0)\n" "SPACER(10)\n" "19:Display fonts darker (Key\\: Alt-Ctrl-+): Fonts darker: change-density(5)\n" "20:Display fonts lighter (Key\\: Alt-Ctrl--): Fonts lighter: change-density(-5)\n" ""; xdvik-ja-22.84.16-j1.40/texk/xdvik/dl_list.c0000664000175000017500000000676011032450154017765 0ustar uwabamiuwabami#include "dl_list.h" size_t dl_list_len(struct dl_list *list) { size_t len = 0; struct dl_list *ptr; for (ptr = list; ptr != NULL; ptr = ptr->next, len++) { ; } return len; } /* Insert item to the list and return the result. */ struct dl_list * dl_list_insert(struct dl_list *list, void *item) { struct dl_list *new_elem = xmalloc(sizeof *new_elem); new_elem->item = item; new_elem->next = NULL; new_elem->prev = NULL; if (list == NULL) { list = new_elem; } else { /* append after current position */ struct dl_list *ptr = list; new_elem->next = ptr->next; new_elem->prev = ptr; if (ptr->next != NULL) ptr->next->prev = new_elem; ptr->next = new_elem; } return new_elem; } /* Return head of the list. */ struct dl_list * dl_list_head(struct dl_list *list) { for (; list != NULL && list->prev != NULL; list = list->prev) { ; } return list; } /* Put a new item at the front of the list (current front is passed in first argument) and return its position. */ struct dl_list * dl_list_push_front(struct dl_list *list, void *item) { struct dl_list *new_elem = xmalloc(sizeof *new_elem); new_elem->item = item; new_elem->next = NULL; new_elem->prev = NULL; if (list != NULL) { /* prepend to current position */ new_elem->next = list; list->prev = new_elem; } return new_elem; } /* Truncate list so that current pointer is the last element. */ struct dl_list * dl_list_truncate(struct dl_list *list) { struct dl_list *ptr = list->next; struct dl_list *save; list->next = NULL; while (ptr != NULL) { save = ptr->next; free(ptr); ptr = save; } return list; } /* Truncate list at the head (i.e. remove the first element from it - head must be passed to this list), and return the result. */ struct dl_list * dl_list_truncate_head(struct dl_list *list) { struct dl_list *ptr = list->next; if (list->next != NULL) list->next->prev = NULL; free(list); return ptr; } /* If the item pointed to by *list isn't the head of the list, remove it, set *list to the previous item, and return True. Else return False. */ Boolean dl_list_remove_item(struct dl_list **list) { struct dl_list *ptr = *list; /* item to remove */ if (ptr->prev == NULL) return False; ptr->prev->next = ptr->next; if (ptr->next != NULL) ptr->next->prev = ptr->prev; /* update list */ *list = (*list)->prev; /* remove item */ free(ptr); return True; } void dl_list_apply(struct dl_list *list, void (*func)(const void *item)) { struct dl_list *ptr; for (ptr = list; ptr != NULL; ptr = ptr->next) { func(ptr->item); } } /* Remove all items matching compare_func() from list. Must be called with a pointer to the head of the list, which is also returned. Returns the number of removed items in `count'. */ struct dl_list * dl_list_remove(struct dl_list *list, const void *item, int *count, void **removed_item, Boolean (*compare_func)(const void *item1, const void *item2)) { struct dl_list *ptr = list; while (ptr != NULL) { struct dl_list *next = ptr->next; if (compare_func(ptr->item, item)) { /* match */ *removed_item = ptr->item; (*count)++; if (ptr->prev != NULL) { ptr->prev->next = ptr->next; } else { /* removed first element */ list = list->next; } if (ptr->next != NULL) ptr->next->prev = ptr->prev; free(ptr); ptr = NULL; } ptr = next; } return list; } xdvik-ja-22.84.16-j1.40/texk/xdvik/vf.c0000664000175000017500000001265411032450154016745 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1992-2004 Paul Vojta 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. \*========================================================================*/ /* * VF font reading routines. * Public routine is read_index---because virtual characters are presumed * to be short, we read the whole virtual font in at once, instead of * faulting in characters as needed. */ #include "xdvi-config.h" #include "dvi.h" #include "xdvi.h" #include "util.h" #include "dvi-init.h" #include "dvi-draw.h" #define LONG_CHAR 242 /* * These are parameters which determine whether macros are combined for * storage allocation purposes. Small macros ( <= VF_PARM_1 bytes) are * combined into chunks of size VF_PARM_2. */ #ifndef VF_PARM_1 #define VF_PARM_1 20 #endif #ifndef VF_PARM_2 #define VF_PARM_2 256 #endif /* * The main routine */ unsigned long read_VF_index(struct font *fontp, wide_bool hushcs) { FILE *VF_file = fontp->file; ubyte cmnd; ubyte *avail, *availend; /* available space for macros */ long checksum; struct macro *newmacro; unsigned long maxcc = 0; Boolean dummy_success = False; fontp->read_char = NULL; fontp->flags |= FONT_VIRTUAL; fontp->set_char_p = set_vf_char; if (globals.debug & DBG_PK) printf("Reading VF file %s\n", fontp->filename); /* * Read preamble. */ fseek(VF_file, (long)get_byte(VF_file), SEEK_CUR); /* skip comment */ checksum = get_bytes(VF_file, 4); if (checksum != fontp->checksum && checksum != 0 && fontp->checksum != 0 && !hushcs) XDVI_WARNING((stderr, "Checksum mismatch (dvi = %lu, vf = %lu) in font file %s", fontp->checksum, checksum, fontp->filename)); (void)get_bytes(VF_file, 4); /* skip design size */ /* * Read the fonts. */ fontp->vf_table = xmalloc(VFTABLELEN * sizeof(struct font *)); memset((char *)fontp->vf_table, 0, VFTABLELEN * sizeof(struct font *)); fontp->vf_chain = NULL; fontp->first_font = NULL; while ((cmnd = get_byte(VF_file)) >= FNTDEF1 && cmnd <= FNTDEF4) { struct font *newfontp = define_font(True, #if DELAYED_MKTEXPK True, #endif VF_file, cmnd, fontp, fontp->vf_table, VFTABLELEN, &fontp->vf_chain, &dummy_success); if (fontp->first_font == NULL) fontp->first_font = newfontp; } /* * Prepare macro array. */ if (resource.omega) { fontp->maxchar = 65535; fontp->macro = xmalloc(65536 * sizeof(struct macro)); memset((char *)fontp->macro, 0, 65536 * sizeof(struct macro)); } else { fontp->macro = xmalloc(256 * sizeof(struct macro)); memset((char *)fontp->macro, 0, 256 * sizeof(struct macro)); } /* * Read macros. */ avail = availend = NULL; for (; cmnd <= LONG_CHAR; cmnd = get_byte(VF_file)) { struct macro *m; int len; unsigned long cc; long width; if (cmnd == LONG_CHAR) { /* long form packet */ len = get_bytes(VF_file, 4); cc = get_bytes(VF_file, 4); width = get_bytes(VF_file, 4); if ((resource.omega && cc >= 65536) || (!resource.omega && cc >= 256)) { XDVI_WARNING((stderr, "Virtual character %lu in font %s ignored.", cc, fontp->fontname)); fseek(VF_file, (long)len, SEEK_CUR); continue; } } else { /* short form packet */ len = cmnd; cc = get_byte(VF_file); width = get_bytes(VF_file, 3); } if (resource.omega) { maxcc = (cc > maxcc) ? cc : maxcc; } m = &fontp->macro[cc]; m->dvi_adv = width * fontp->dimconv; if (len > 0) { if (len <= availend - avail) { m->pos = avail; avail += len; } else { m->free_me = True; if (len <= VF_PARM_1) { m->pos = avail = xmalloc(VF_PARM_2); availend = avail + VF_PARM_2; avail += len; } else m->pos = xmalloc((unsigned)len); } (void)fread((char *)m->pos, 1, len, VF_file); m->end = m->pos + len; } if (globals.debug & DBG_PK) printf("Read VF macro for character %lu; dy = %ld, length = %d\n", cc, m->dvi_adv, len); } if (cmnd != POST) XDVI_FATAL((stderr, "Wrong command byte found in VF macro list: %d", cmnd)); fclose(VF_file); fontp->file = NULL; if (resource.omega) { size_t i; newmacro = xmalloc((maxcc + 1) * sizeof(struct macro)); for (i = 0; i <= maxcc; i++) { newmacro[i] = fontp->macro[i]; } free(fontp->macro); fontp->macro = newmacro; fontp->maxchar = maxcc; return maxcc; } else return 0; /* dummy */ } xdvik-ja-22.84.16-j1.40/texk/xdvik/FAQ0000664000175000017500000002346010363262237016526 0ustar uwabamiuwabamiThis is an adapted version of Paul Vojta's FAQ for (non-k) xdvi, which is available from . This file answers the following questions about installing xdvi: 1. Why do I get the message, ``Caution: overstrike characters may be incorrect'' when running netscape and xdvi simultaneously, and why does the screen output look so grainy? 2. I have font files cmr10.tfm, etc. Why can't xdvi use them? 3. I can't seem to set the font path correctly. Can you help me? 4. Whenever I run xdvi, it prints out things like: - mktexpk --mfmode cx --bdpi 300 --mag 'magstep(0)' --dpi 300 cmr7 '>&3' mktexpk: /var/cache/fonts/pk/cx/public/cm/cmr7.300pk already exists. Why is this? 5. Why can't xdvi correctly display metapost files containing text? 6. Why do I get weird vertical color stripes when using xdvi on my S3 Virge video card? 7. What does the message "gs: No such file or directory" mean, and why does xdvi need to call ghostscript? 8. I am using gs 5.50 to render PostScript figures, and I find that sometimes characters appear on the wrong page. Why is that? 9. I am using gs 3.33 to render PostScript figures, but find that it cuts some off below or to the right of a certain point, and others are omitted entirely. 10. I am trying to display PostScript specials with -DPS_GS, but instead I get the message `gs: gs: Malformed ghostview color property.' 11. What is this "_get_wmShellWidgetClass undefined" error? Last modified: 2002/08/23 ---------- 1. Why do I get the message, ``Caution: overstrike characters may be incorrect'' when running netscape and xdvi simultaneously, and why does the screen output look so grainy? This is because your video setup has only a limited number (typically 256) of different colors that can be displayed at any given time, and netscape is using most of them. There are several ways around this problem: o Start xdvi before netscape. This should eliminate the problem for that copy of xdvi (only). o Invoke netscape via "netscape -ncols 130" This limits netscape's color usage to 130. Other numbers may be used as well. o Invoke netscape via "netscape -install" This causes netscape to run with its own colormap. A disadvantage of this approach is that netscape's colors will be bizarre when the cursor is outside netscape's window, and conversely all other colors on the screen will look funny when the cursor is in the netscape window. The screen output looks so grainy because xdvi is not able to use its anti-aliasing features without enough colors. ---------- 2. I have font files cmr10.tfm, etc. Why can't xdvi use them? tfm files contain only minimal information about the characters in a font: just the height, width, depth, and kerning and ligature information. To obtain information about the shapes of the characters, xdvi needs pk, gf or pfb files. (pxl files also contain this information, but are obsolete. There are utilities to convert them to pk files though.) ---------- 3. I can't seem to set the font path correctly. Can you help me? Try xdvi -debug 4000 file.dvi to find out where xdvi is looking for the fonts. ---------- 4. Whenever I run xdvi, it prints out things like: - mktexpk --mfmode cx --bdpi 300 --mag 'magstep(0)' --dpi 300 cmr7 '>&3' mktexpk: /var/cache/fonts/pk/cx/public/cm/cmr7.300pk already exists. Why is this? It means either that: (1) Your ls-R database is not up to date (fix this by running texhash), or (2) Your font path is not set correctly (see #3, above). ---------- 5. Why can't xdvi correctly display metapost files containing text? The problem is that the PS files created by MP are (normally) not self-contained. xdvi delegates the display of PS files to ghostscript, which fails to handle those files. A solution is to instruct MP to create true EPS files, by including prologues:=2; at the top of the document. If you have the CM postscript fonts installed so that ghostscript can find them, you can continue to use the CM fonts, otherwise you'll have to switch to Times or such for the illustrations. Switching the fonts can be done setting 'defaultfont' to something like "ptmr8r" (for Times). For the TeX material in 'btex .. etex' blocks, it is best to set up the fonts once in a 'verbatimtex .. etex' block. (And same for LaTeX of course.) This answer courtesy of Olaf Weber. ---------- 6. Why do I get weird vertical color stripes when using xdvi on my S3 Virge video card? This is a bug in the XF86_S3V X server. It has been reported to XFree86. The response from them is that the XF86_S3V server is being phased out and that users should use the XF86_SVGA server instead (which also, as of XFree86 3.3.3, supports the S3 Virge chipset). ---------- 7. What does the message "gs: No such file or directory" mean, and why does xdvi need to call ghostscript? The message "gs: No such file or directory" means that xdvi needs to call ghostscript, but does not find it on your system. Ghostscript is a program used for rendering PostScript. It is needed by xdvi (1) for displaying PostScript specials in documents, and (2) for rendering PostScript fonts occurring in documents. In the latter case, xdvi calls a script (usually named mktexpk) which in turn calls the program gsftopk to render the font in a form usable by xdvi. ---------- 8. I am using gs 5.50 to render PostScript figures, and I find that sometimes characters appear on the wrong page. Why is that? This is a bug in ghostscript 5.50. The following patch will fix it: *** gdevx.c.orig Fri Jul 17 07:31:27 1998 --- gdevx.c Sat Oct 17 23:42:50 1998 *************** *** 59,65 **** ((gx_device_X *)(dev))->up_area = 0,\ ((gx_device_X *)(dev))->up_count = 0 #define update_flush(dev)\ ! if ( ((gx_device_X *)(dev))->up_area != 0 ) update_do_flush(dev) private void update_do_flush(P1(gx_device *)); #define flush_text(dev)\ --- 59,66 ---- ((gx_device_X *)(dev))->up_area = 0,\ ((gx_device_X *)(dev))->up_count = 0 #define update_flush(dev)\ ! if ( ((gx_device_X *)(dev))->up_area != 0 || IN_TEXT((gx_device_X *)(dev)) )\ ! update_do_flush(dev) private void update_do_flush(P1(gx_device *)); #define flush_text(dev)\ ---------- 9. I am using gs 3.33 to render PostScript figures, but find that it cuts some off below or to the right of a certain point, and others are omitted entirely. You should apply the following patch. This will also fix similar errors with ghostview. This patch supersedes a previous patch I have suggested to some people. *** gdevxini.c.orig Sun Nov 6 13:46:42 1994 --- gdevxini.c Mon Jun 5 15:40:18 1995 *************** *** 319,344 **** /* The following sets the imageable area according to the */ /* bounding box and margins sent by ghostview. */ ! { float m[4]; ! m[0] = (llx - left_margin) / 72.0; /* left */ ! m[1] = (lly - bottom_margin) / 72.0; /* bottom */ ! m[2] = xdev->width / xdev->x_pixels_per_inch - ! (urx + right_margin) / 72.0; /* right */ ! m[3] = xdev->height / xdev->y_pixels_per_inch - ! (ury + top_margin) / 72.0; /* top */ ! ! /****** ! ****** For reasons I don't understand, ! ****** we have to set the margins to zero here ! ****** in order for Ghostview to do landscape display right. ! ******/ ! #if 0 ! m[0] = m[1] = m[2] = m[3] = 0; ! #endif ! ! gx_device_set_margins((gx_device *)xdev, m, false); ! } ! } else if (xdev->pwin == (Window)None) { eprintf("gs: Cannot get ghostview property.\n"); exit(1); --- 319,329 ---- /* The following sets the imageable area according to the */ /* bounding box and margins sent by ghostview. */ ! xdev->ImagingBBox[0] = llx - left_margin; ! xdev->ImagingBBox[1] = lly - bottom_margin; ! xdev->ImagingBBox[2] = urx + right_margin; ! xdev->ImagingBBox[3] = ury + top_margin; ! xdev->ImagingBBox_set = true; } else if (xdev->pwin == (Window)None) { eprintf("gs: Cannot get ghostview property.\n"); exit(1); ---------- 10. I am trying to display PostScript specials with -DPS_GS, but instead I get the message `gs: gs: Malformed ghostview color property.' xdvi needs at least version 2.6.2 of ghostscript. It will also run with ghostscript 2.6.1, provided you have applied fixes 1-4. This particular error message means that you are running gs 2.6.1 without fixes 1-4. Probably you should get a newer version of ghostscript. ---------- 11. What is this "_get_wmShellWidgetClass undefined" error? In SunOS 4.1.2 Sun fixed a shared-library bug in ld which conflicts with the way X builds the shared Xmu library, causing these symbols, notably, to be undefined when building some X11 clients on SunOS 4.1.[23]: _get_wmShellWidgetClass _get_applicationShellWidgetClass Compiling "-Bstatic -lXmu -Bdynamic" is overkill; be sure to set OSTeenyVersion correctly in the config/sun.cf file and rebuild X11R5. To solve the problem if you are using OpenWindows 3.0 (X11R4-based Xt), please contact your local Sun office and request the following patches: Patch i.d. Description 100512-02 4.1.x OpenWindows 3.0 libXt Jumbo patch 100573-04 OpenWindows 3.0: xstdcmap fails to set XStandardColomap for 24-bit machines [this also fixes bug 1087332, "With patched ld and libc, customer is getting undefined symbols"] [Greg Earle, earle@Sun.COM; 7/92] A source patch for use with the X11R4 libraries was developed by Conrad Kimball (cek@sdc.boeing.com); it retrofits into R4 some fixes made in R5 to get around this problem. The patch is on ftp.x.org in [1/93] contrib/X11R4_sunos4.1.2_patch_version3.Z xdvik-ja-22.84.16-j1.40/texk/xdvik/image-magick.h0000664000175000017500000000251610363262237020657 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef IMAGE_MAGICK_H_ #define IMAGE_MAGICK_H_ #include "xdvi-config.h" #include "xdvi.h" #ifdef MAGICK extern Boolean Magick_parse_special(char *cp); #endif /* MAGICK */ #endif /* IMAGE_MAGICK_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/psdps.h0000664000175000017500000000233110363262237017470 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef PSDPS_H_ #define PSDPS_H_ extern Boolean initDPS(void); #endif /* PSDPS_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/README.t1fonts0000664000175000017500000002131310363262237020444 0ustar uwabamiuwabami README for using Postscript Type1 fonts with xdvik ================================================== Starting from version 22.39, xdvik supports direct display of Postscript Type1 fonts via t1lib. Unlike the bitmapped TeX PK fonts that xdvik used to depend upon, Type1 fonts only need to be stored in one size on disk. This means no more waiting for mktexpk runs when viewing DVI files with previously unused fonts or at a different resolution, less hassle with temporary directories filling up with PK files, etc. To be able to support Type1 fonts, xdvi needs a xdvi.cfg file. The standard `make install' process will copy the file from texmf/xdvi.cfg which is suitable for recent teTeX distributions (starting from teTeX >= 1.0). (If the file exists already and has been modified from the original, the modified file will not be overwritten). Apart from the section `Debugging your font setup', this README contains mostly instructions for versions of teTeX older than 1.0.x or non-teTeX systems; users of teTeX >= 1.0.x should ignore these instructions, and only consult the `Debugging' section in case of problems with the Type1 fonts setup. Note that xdvi can always use a TeX bitmap (PK) font as a fallback (produced via mktexpk, which in turn invokes ps2pk or gsftopk), so it's not vital that xdvi is configured for Type1 fonts. However, for the reasons mentioned above, setting up xdvi properly for Type1 fonts is usually preferable. ========================================================== Instructions for users of older teTeX versions (< 1.0), or non-teTeX systems: ========================================================== Xdvi needs to load all Type1 fonts from disk, which means that it (just like dvips) needs to translate the TeX names for fonts to filenames, load encoding vectors according to map files and so on. But unlike dvips, which produces Postscript code for printers with built-in fonts, xdvi has _no_ builtin fonts, and thus cannot share all font maps with dvips. The main difference is that fontmaps for xdvi always need to contain the name of a `real' Type1 font file (a .pfa or .pfb file) at the end of the line, e.g. `utmr8a.pfb' in the following case: ptmr8r NimbusRomNo9L-Regu "TeXBase1Encoding ReEncodeFont" <8r.enc = 1.0 or TeXLive >= 6b. Users of older systems can use the `t1mapper' script to copy/symlink the required files to a directory where xdvi can find them; please see the file README.t1mapper and the manual page of t1mapper for more information. =================== Fontmap file format =================== In principle Xdvi only accepts a subset of the fontmaps used by dvips and pdftex. In practice the restrictions are not very restraining. For a description of the font map file syntax, see the `psfonts.map' section of the dvips manual (dvips.{texi,dvi,pdf}). Xdvi accepts fontmaps that obey these rules: 1. The vector files must have a .enc extention or be included by the <[ ... syntax in the fontmap. Encoding is optional. The ReEncodeFont keyword and its argument is tolerated, but it is _ignored_. xdvi looks for a &1 | grep xyz.map For a successful search, the end of the grep'ed output should look like this: kdebug:fopen(/some/paht/xyz.map, r) => 0x81cccd8 If the search is not successful, look at the debugging output in more detail, checking which variable settings contribute to the path where a file is searched. 3. Make sure that xdvi finds the Type1 versions of your fonts. E.g. if your texmf tree is located in /usr/local/share/texmf, for a minimal LaTeX file like \documentclass{minimal} \begin{document}test\end{document} the command $ xdvi -debug 3968 ~/test.dvi 2>&1 | grep cmr10.pfb should contain a line at the bottom that looks similar to this: kdebug:search(cmr10.pfb) => /usr/local/share/texmf/fonts/type1/bluesky/cm/cmr10.pfb Check the settings of TEXMFMAIN, TEXMF and T1FONTS in your texmf.cnf file if this doesn't work. See also kpathsea.dvi and TETEXDOC.dvi for more information on the how kpathsea works. Some common sources of problems: - You have several texmf.cnf files on your system, and xdvi isn't using the one you expect. Use the following command to find out which: $ xdvi -debug 3968 ~/test.dvi 2>&1 | grep texmf.cnf | grep fopen - The SELFAUTO... variables are used to define one of the TEXMF or XDVIINPUTS variables in texmf.cnf, but xdvi.bin hasn't been installed in a path that is compatible with SELFAUTO.... For example, if your texmf tree is /usr/share/texmf/web2c/ and the search path contains {$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}: then xdvi.bin should be contained 2 directories below /usr, e.g. in /usr/local/bin/xdvi.bin. ($SELFAUTOPARENT is a misnomer in that it actually denotes the grand-parent of the current directory, i.e. 2 levels up in the directory hierarchy). As a fix, either set XDVIINPUTS in your shell environment, or install xdvi.bin in its proper place. xdvik-ja-22.84.16-j1.40/texk/xdvik/xdvi-config.h0000664000175000017500000000155710363262237020565 0ustar uwabamiuwabami/* xdvi-config.h: master configuration file, included first by all compilable source files (not headers). */ #ifndef CONFIG_H_ #define CONFIG_H_ /* Some xdvi options we want by default. */ #define USE_PK #define USE_GF #define MAKEPK /* all others are defined in this file */ #include "c-auto.h" #ifndef HAVE_VPRINTF #ifdef HAVE_DOPRNT #define vfprintf(stream, message, args) _doprnt(message, args, stream) /* If we have neither, should fall back to fprintf with fixed args. */ #endif #endif /* XPM is used for the toolbar buttons and in xicon.c */ #if USE_XPM # if defined(HAVE_X11_XPM_H) || defined(HAVE_XM_XPMP_H) || defined(HAVE_XPM_H) # define HAVE_XPM 1 # else # define HAVE_XPM 0 # endif #endif /* enable X server info output */ #define XSERVER_INFO 1 /* change this to 1 when #470325 is fixed */ #define FIXED_FLUSHING_PAGING 0 #endif /* not CONFIG_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/util.h0000664000175000017500000001650311032450154017311 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef UTIL_H_ #define UTIL_H_ #include #include "xdvi-config.h" #include "version.h" #include "kpathsea/c-stat.h" #include "kpathsea/hash.h" #include "kpathsea/tex-file.h" #if HAVE_POLL # include # define XIO_IN POLLIN # define XIO_OUT POLLOUT #else # if HAVE_SYS_SELECT_H # include # else # if HAVE_SELECT_H # include # endif # endif # define XIO_IN 1 # define XIO_OUT 2 #endif #include "events.h" /* for child proc stuff */ FILE *try_fopen(const char *fname, const char *mode); FILE *try_fdopen(int fd, const char *mode); int try_open(const char *fname, int flags); int try_open_mode(const char *fname, int flags, mode_t mode); extern int xdvi_temp_fd(char **tempfilename); extern void xdvi_assert(const char *version, const char *filename, int lineno, Boolean condition, const char *fmt, ...); typedef void (*child_exited_proc)(int status, struct xchild *this); extern void handle_child_exit(int status, struct xchild *this); extern char *read_child_error(int fd, void *data); extern Boolean fork_process(const char *file, Boolean redirect_stdout, const char *dirname, childProcT exit_proc, void *data, char *const argv[]); extern void prep_fd(int fd, wide_bool noblock); struct bitmap; /* forward declaration */ extern void alloc_bitmap(struct bitmap *); extern char *my_realpath(const char *path, char *real); #ifdef HAVE_REALPATH #include # define REALPATH realpath #else # define REALPATH my_realpath #endif char *expand_homedir(const char *path); void set_dvi_name_expand(const char *new_filename); void set_dvi_name(char *new_filename); FILE *XFOPEN(const char *path, const char *mode); #ifndef HAVE_MEMICMP extern int memicmp(const char *, const char *, size_t); #endif /* NOTE: all of the following are already defined by kpathsea. */ /* extern void *xmalloc(unsigned); */ /* extern void *xrealloc(void *, unsigned); */ /* extern char *xstrdup(const char *); */ /* extern char *xmemdump(const char *, size_t); */ /* extern void xputenv(const char *, const char *); */ /* like xstrdup, but only copy len characters and zero-terminate at next index (allocates len+1 characters) */ extern char *xstrndup(const char *str, size_t len); extern char *xt_strdup(const char *); /* like xstrdup, but with XtMalloc() */ extern char *xstrcat(char *str1, const char *str2); extern int xpipe(int *); extern void close_a_file(void); extern unsigned long get_bytes(FILE *, int); extern long get_lbytes(FILE *, int); extern void xdvi_exit(int); extern void do_abort(void); /* various levels of warning/error messages */ extern void xdvi_info(const char *fmt, ...); extern void xdvi_warning(const char *fmt, ...); extern void xdvi_error(const char *fmt, ...); extern void xdvi_fatal(const char *fmt, ...); extern void xdvi_abort(const char *fmt, ...); extern Boolean pointerlocate(int *, int *); extern unsigned long parse_debugging_string(const char *arg); extern unsigned long parse_debugging_option(const char *ptr); extern int get_avg_font_width(XFontStruct *font); extern char **split_line(const char *line, char sep, size_t begin, size_t end, size_t *ret_items); extern char *find_file(const char *filename, struct stat *statbuf, kpse_file_format_type pathinfo); extern char **src_format_arguments(char **argv, const char *filename, int lineno, int colno); /* hashtable wrapper functions, mostly used by dvi-draw.c to map filenames to integers. This uses the hashtable implementation from kpathsea, which is reasonably fast. */ /* We use this dummy wrapper stuct, which we cast to void *, to get integer values into/from the hashtable (natively, kpahtsea only supports string values). */ struct str_int_hash_item { int value; }; typedef hash_table_type hashTableT; /* from kpathsea */ extern Boolean find_str_int_hash(hashTableT *hashtable, const char *key, size_t *val); extern void put_str_int_hash(hashTableT *hashtable, const char *key, size_t val); extern Boolean copy_file(const char *from, const char *to); extern Boolean copy_fp(FILE *in, FILE *out); extern const char *get_text_encoding(void); extern char *iconv_convert_string(const char *from_enc, const char *to_enc, const char *str); extern void xdvi_bell(void); /* Various error reporting macros. The reasons why these are macros are: - possibility to use __FILE__, __LINE__ - (more importantly:) gcc can't do type checking on generic vararg macros, but does so for the printf() functions. */ /* * Print an informative message to stdout, * unless the resource `hush_stdout' is set. */ #define XDVI_INFO(X) do { \ fprintf(stdout, "%s: Info: ", globals.program_name); \ fflush(stdout); /* in case following goes to stderr accidentally ... */ \ fprintf X; \ fprintf(stdout, "\n"); \ fflush(stdout); /* to make sure it doesn't get intermingled with stderr */ \ } while(0) /* * Print a warning message to stderr. * This can't be shut off by `hush_stdout'. */ #define XDVI_WARNING(X) do { \ fprintf(stderr, "%s: Warning: ", globals.program_name); \ fprintf X; \ fprintf(stderr, "\n"); \ } while(0) /* * Print an un-typed message to stderr, without starting a newline. * This can't be shut off by `hush_stdout'. */ #define XDVI_MSG(X) do { \ fprintf(stderr, "%s: ", globals.program_name); \ fprintf X; \ } while(0) /* * Print an error message to stderr. * This can't be shut off by `hush_stdout'. */ #define XDVI_ERROR(X) do { \ fprintf(stderr, "%s: Error: ", globals.program_name); \ fprintf X; \ fprintf(stderr, "\n"); \ } while(0) /* * Print an error message and quit. Use this only with extreme care, * if recovery is really impossible! */ #define XDVI_FATAL(X) do { \ fprintf(stderr, "%s: Fatal error: ", globals.program_name); \ fprintf X; \ fprintf(stderr, "\n"); \ xdvi_exit(EXIT_FAILURE); \ } while(0) /* * Print an error message and abort. Use this instead of assertions * if you want to give a more informative message. */ #define XDVI_ABORT(X) do { \ fprintf(stderr, "%s %s: %s:%d: Shouldn't happen: ", \ globals.program_name, \ XDVI_VERSION_INFO, \ __FILE__, __LINE__); \ fprintf X; \ fprintf(stderr, "\n"); \ do_abort(); \ } while(0) #endif /* UTIL_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/Makefile.am0000664000175000017500000001277011667425641020242 0ustar uwabamiuwabami## Makefile.am for the TeX Live subdirectory texk/xdvik/ ## ## Copyright (C) 2009, 2011 Peter Breitenlohner ## You may freely use, modify and/or distribute this file. ## ACLOCAL_AMFLAGS = -I ../../m4 -I m4 AM_CFLAGS = $(WARNING_CFLAGS) SUBDIRS = squeeze . tests include common.am INCLUDES = -I$(srcdir)/gui $(common_includes) ## The object files created from ./*.c and gui/*.c are used for both ## ./xdvi-bin and tests/run_tests. ## In order not to compile them twice, we put them into a library. noinst_LIBRARIES = libxdvi.a nodist_libxdvi_a_SOURCES = psheader.c libxdvi_a_SOURCES = \ alloc-debug.h \ browser.c \ browser.h \ c-openmx.h \ dl_list.c \ dl_list.h \ dvi-draw.c \ dvi-draw.h \ dvi-init.c \ dvi-init.h \ dvi.h \ dvisel.c \ dvisel.h \ encodings.c \ encodings.h \ events.c \ events.h \ exit-handlers.c \ exit-handlers.h \ filehist.c \ filehist.h \ font-open.c \ font-open.h \ gf.c \ hypertex.c \ hypertex.h \ image-magick.c \ image-magick.h \ mime.c \ mime.h \ my-snprintf.c \ my-snprintf.h \ my-vsnprintf.c \ my-vsnprintf.h \ pagehist.c \ pagehist.h \ pk.c \ print-internal.c \ print-internal.h \ psdps.c \ psdps.h \ psgs.c \ psgs.h \ psnews.c \ psnews.h \ read-mapfile.c \ read-mapfile.h \ search-internal.c \ search-internal.h \ special.c \ special.h \ string-utils.c \ string-utils.h \ string_list.c \ string_list.h \ tfmload.c \ tfmload.h \ translations.h \ util.c \ util.h \ version.h \ vf.c \ x_util.c \ x_util.h \ xdvi.c \ xdvi-config.h \ xdvi-debug.h \ xserver-info.c \ xdvi.h \ xserver-info.h ## We cannot easily use two different libraries due to the mutual ## dependencies between routines in ./*.c and gui/*.c. libxdvi_a_SOURCES += \ gui/Panner.c \ gui/Panner.h \ gui/PannerP.h \ gui/Tip.c \ gui/Tip.h \ gui/TipP.h \ gui/help-window.c \ gui/help-window.h \ gui/mag.c \ gui/mag.h \ gui/menu.c \ gui/menu.h \ gui/message-window.c \ gui/message-window.h \ gui/pagesel.c \ gui/pagesel.h \ gui/print-dialog.c \ gui/print-dialog.h \ gui/print-log.c \ gui/print-log.h \ gui/search-dialog.c \ gui/search-dialog.h \ gui/selection.c \ gui/selection.h \ gui/sfDir.c \ gui/sfDir.h \ gui/sfDraw.c \ gui/sfDraw.h \ gui/sfPath.c \ gui/sfPath.h \ gui/sfSelFile.c \ gui/sfSelFile.h \ gui/sfinternal.h \ gui/statusline.c \ gui/statusline.h \ gui/topic-window.c \ gui/topic-window.h \ gui/xaw_bitmaps.c \ gui/xaw_bitmaps.h \ gui/xaw_menu.c \ gui/xaw_menu.h \ gui/xicon.c \ gui/xicon.h \ gui/xlwradio.c \ gui/xlwradio.h \ gui/xlwradioP.h \ gui/xm_colorsel.c \ gui/xm_colorsel.h \ gui/xm_filesel.c \ gui/xm_menu.c \ gui/xm_menu.h \ gui/xm_prefs.c \ gui/xm_prefs.h \ gui/xm_prefsP.h \ gui/xm_prefs_appearance.c \ gui/xm_prefs_appearance.h \ gui/xm_prefs_fonts.c \ gui/xm_prefs_fonts.h \ gui/xm_prefs_helpers.c \ gui/xm_prefs_helpers.h \ gui/xm_prefs_page.c \ gui/xm_prefs_page.h \ gui/xm_prefs_scroll.c \ gui/xm_prefs_scroll.h \ gui/xm_toolbar.c \ gui/xm_toolbar.h $(libxdvi_a_OBJECTS): config.force config.force: $(common_dependencies) echo timestamp >config.force $(SHELL) ./config.status --recheck DISTCLEANFILES = config.force bin_SCRIPTS = xdvi bin_PROGRAMS = xdvi-bin xdvi_bin_SOURCES = main.c $(xdvi_bin_OBJECTS): libxdvi.a $(common_dependencies) LDADD = libxdvi.a $(common_ldadd) # When cross-compiling, EXEEXT for the build and hosts system may differ. # Thus we depend on the auxiliary file squeeze/stamp-squeeze. psheader.c: psheader.txt squeeze/stamp-squeeze squeeze/squeeze $(srcdir)/psheader.txt $@ squeeze/stamp-squeeze: cd squeeze && $(MAKE) $(AM_MAKEFLAGS) stamp-squeeze EXTRA_DIST = psheader.txt CLEANFILES = psheader.c nodist_man1_MANS = xdvi.1 xdvi.1: xdvi.1.in sedscript sed -f sedscript <$(srcdir)/xdvi.1.in >$@ sedscript: mksedscript CHANGES Makefile c-auto.h $(SHELL) $(srcdir)/mksedscript $(srcdir) $(DEFS) $(PS_DEF) >$@ EXTRA_DIST += mksedscript xdvi.1.in CLEANFILES += sedscript xdvi.1 xdvidir = $(datarootdir)/texmf/xdvi dist_xdvi_DATA = texmf/XDvi pixmapdir = $(datarootdir)/texmf/xdvi/pixmap dist_pixmap_DATA = pixmaps/toolbar.xpm pixmaps/toolbar2.xpm dist_noinst_DATA = texmf/xdvi.cfg install-data-hook: @if grep "original xdvi.cfg --" "$(DESTDIR)$(xdvidir)/xdvi.cfg" >/dev/null 2>&1 \ || test ! -r "$(DESTDIR)$(xdvidir)/xdvi.cfg"; then \ echo " $(INSTALL_DATA) '$(srcdir)/texmf/xdvi.cfg' '$(DESTDIR)$(xdvidir)/xdvi.cfg'"; \ $(INSTALL_DATA) "$(srcdir)/texmf/xdvi.cfg" "$(DESTDIR)$(xdvidir)/xdvi.cfg"; \ else :; fi uninstall-hook: @if grep "original xdvi.cfg --" "$(DESTDIR)$(xdvidir)/xdvi.cfg" >/dev/null 2>&1 \ || test ! -r "$(DESTDIR)$(xdvidir)/xdvi.cfg"; then \ echo " rm -f '$(DESTDIR)$(xdvidir)/xdvi.cfg'"; \ rm -f "$(DESTDIR)$(xdvidir)/xdvi.cfg"; \ else :; fi ## Not used ## EXTRA_DIST += \ BUGS \ CHANGES \ ChangeLog.TL \ FAQ \ LESSTIF-BUGS \ README.t1fonts \ README.t1mapper \ pixmaps/drag_horiz.xbm \ pixmaps/drag_horiz_mask.xbm \ pixmaps/drag_omni.xbm \ pixmaps/drag_omni_mask.xbm \ pixmaps/drag_vert.xbm \ pixmaps/drag_vert_mask.xbm \ pixmaps/fist.xbm \ pixmaps/fist_mask.xbm \ pixmaps/hand.xbm \ pixmaps/hand_mask.xbm \ pixmaps/magglass.xbm \ pixmaps/magglass_mask.xbm \ pixmaps/time16.xbm \ pixmaps/time16_mask.xbm \ pixmaps/xdvi16x16.xpm \ pixmaps/xdvi32x32.xpm \ pixmaps/xdvi48x48.xpm \ t1mapper \ t1mapper.1 \ texmf-alt/README \ texmf-alt/charter2.map \ texmf-alt/lucida.map \ texmf-alt/marvosym.map \ texmf-alt/xdvi.cfg \ texmf-alt/xdvifont.map \ texmf-alt/xypic.map \ xdvi-search.el \ xdvi.icon \ xdvizilla \ xdvizilla.1 xdvik-ja-22.84.16-j1.40/texk/xdvik/util.c0000664000175000017500000013520111730166030017303 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1990-2004 Paul Vojta and others 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. NOTE: xdvi is based on prior work, as noted in the modification history in xdvi.c. \*========================================================================*/ #include "xdvi-config.h" #include /* ZLB: must be before sys/socket.h for IRIX 5.3 */ #include #include /* this defines FASYNC */ #include /* this defines SIOCSPGRP and FIOASYNC */ #include /* this defines WIFEXITED and WEXITSTATUS */ #include "xdvi.h" #include "hypertex.h" #include "dvi-init.h" #include "special.h" #include "string-utils.h" #include "kpathsea/tex-file.h" #include "events.h" #include "util.h" #include "x_util.h" #include "message-window.h" #include "search-internal.h" #include "encodings.h" #include "filehist.h" #include "exit-handlers.h" #include "xm_prefs.h" /* for preferences_changed() */ #include #ifndef HAVE_MEMICMP #include #endif #ifdef VMS #include #endif /* VMS */ #ifdef X_NOT_STDC_ENV extern int errno; extern void *malloc(); extern void *realloc(); #endif #ifdef DOPRNT /* define this if vfprintf gives you trouble */ #define vfprintf(stream, message, args) _doprnt(message, args, stream) #endif #ifdef VMS #include #endif /* VMS */ #ifdef X_NOT_STDC_ENV extern int errno; extern void *malloc(); extern void *realloc(); #endif /* if POSIX O_NONBLOCK is not available, use O_NDELAY */ #if !defined O_NONBLOCK && defined O_NDELAY # define O_NONBLOCK O_NDELAY #endif /* Linux prefers O_ASYNC over FASYNC; SGI IRIX does the opposite. */ #if !defined(FASYNC) && defined(O_ASYNC) # define FASYNC O_ASYNC #endif #if !defined(FLAKY_SIGPOLL) && !HAVE_STREAMS && !defined(FASYNC) # if !defined(SIOCSPGRP) || !defined(FIOASYNC) # define FLAKY_SIGPOLL 1 # endif #endif #if !FLAKY_SIGPOLL && HAVE_STREAMS # include # ifndef S_RDNORM # define S_RDNORM S_INPUT # endif # ifndef S_RDBAND # define S_RDBAND 0 # endif # ifndef S_HANGUP # define S_HANGUP 0 # endif # ifndef S_WRNORM # define S_WRNORM S_OUTPUT # endif #endif /* not FLAKY_SIGPOLL && HAVE_STREAMS */ #include #include #include #include #ifndef MAXSYMLINKS /* Workaround for Linux libc 4.x/5.x */ #define MAXSYMLINKS 5 #endif #if HAVE_ICONV_H #include #endif #include #if USE_LANGINFO #include #endif #define BUF_SIZE 1024 void xdvi_assert(const char *version, const char *filename, int lineno, Boolean condition, const char *fmt, ...) { if (!(condition)) { va_list argp; fprintf(stderr, "\n************************************************************\n" "XDvi %s: Failed assertion:\n%s:%d: ", version, filename, lineno); va_start(argp, fmt); (void)vfprintf(stderr, fmt, argp); va_end(argp); #ifdef NDEBUG fprintf(stderr, "\nAborting now. Please report this as a bug to:\n" "http://sourceforge.net/tracker/?group_id=23164&atid=377580\n" "If a core dump has been produced, please invoke:\n" "gdb %s core\nThen type \"bt\", " "and include the resulting output in your bug report.\n" "************************************************************\n", globals.program_name); do_abort(); #else fprintf(stderr, "\nPlease report this as a bug to:\n" "http://sourceforge.net/tracker/?group_id=23164&atid=377580\n" "************************************************************\n"); #endif } } void xdvi_bell(void) { if (!resource.hush_bell) { XBell(DISP, 0); } } /* NOTE: keep this table in sync with the #defines in xdvi-debug.h! */ struct debug_string_options debug_options[] = { { DBG_BITMAP, "bitmap", ", " }, { DBG_DVI, "dvi", ", " }, { DBG_PK, "pk", ", " }, { DBG_BATCH, "batch", ", " }, { DBG_EVENT, "events", ", " }, { DBG_PS, "ps", ",\n"}, { DBG_STAT, "stat", ", " }, { DBG_HASH, "hash", ", " }, { DBG_OPEN, "open", ", " }, { DBG_PATHS, "paths", ", " }, { DBG_EXPAND, "expand", ", " }, { DBG_SEARCH, "search", ", " }, { DBG_KPATHSEA, "kpathsea", ",\n"}, { DBG_HTEX, "htex", ", " }, { DBG_SRC_SPECIALS,"src", ", " }, { DBG_CLIENT, "client", ", " }, { DBG_T1, "t1", ", " }, { DBG_T1_VERBOSE, "t1_verbose", ",\n"}, { DBG_GUI, "gui", ", " }, { DBG_FIND, "find", ", " }, { DBG_FILES, "files", ", " }, { DBG_ALL, "all", "\n" }, /* end marker */ { 0, NULL, NULL } }; /* * General utility routines. */ /* * 2-step fopen using close_a_file() if first opening attempt fails with * `too many open files'. */ FILE * try_fopen(const char *fname, const char *mode) { FILE *fp = fopen(fname, mode); if (fp == NULL && (errno == EMFILE || errno == ENFILE)) { close_a_file(); fp = fopen(fname, mode); } return fp; } /* * Like try_fopen(), for fdopen(). */ FILE * try_fdopen(int fd, const char *mode) { FILE *fp = fdopen(fd, mode); if (fp == NULL && (errno == EMFILE || errno == ENFILE)) { close_a_file(); fp = fdopen(fd, mode); } return fp; } /* * Like try_fopen(), for open(). */ int try_open(const char *fname, int flags) { int fd = open(fname, flags); if (fd < 0 && (errno == EMFILE || errno == ENFILE)) { close_a_file(); fd = open(fname, flags); } return fd; } /* * Like try_fopen(), for open() with 3 arguments. */ int try_open_mode(const char *fname, int flags, mode_t mode) { int fd = open(fname, flags, mode); if (fd < 0 && (errno == EMFILE || errno == ENFILE)) { close_a_file(); fd = open(fname, flags, mode); } return fd; } /* * This routine should be used for all exits. (SU: This is different * from non-k xdvi, where it's only used for `non-early' exits; all * routines called here should be aware of their own state and either * perform cleanup or just return, unless xdvi_exit() itself checks for * the status). */ void xdvi_exit(int status) { /* do the following only if the window has been opened: */ if (globals.widgets.top_level != 0 && XtIsRealized(globals.widgets.top_level)) { char *filehist; file_history_set_page(current_page); filehist = file_history_get_list(); store_preference(NULL, "fileHistory", "%s", filehist); free(filehist); #if MOTIF if (preferences_changed()) { return; } /* else { */ /* fprintf(stderr, "Preferences not changed.\n"); */ /* } */ #endif /* try to save user preferences, unless we're exiting with an error */ if (status == EXIT_SUCCESS && !save_user_preferences(True)) return; /* Clean up the "xdvi windows" property in the root window. */ update_window_property(XtWindow(globals.widgets.top_level), False); } #if PS ps_destroy(); #endif call_exit_handlers(); exit(status); } /* * invoked on SIGSEGV: try to stop gs before aborting, to prevent gs * running on with 100% CPU consumption - this can be annoying during * testing. We'd also like to clean up the "xdvi windows" property in * the root window, but it might be already too late to talk to the * X server here (the code can also be triggered by X errors). */ void do_abort(void) { #if PS ps_destroy(); #endif /* if (globals.widgets.top_level) */ /* exit_clean_windows(); */ abort(); } /* Expand leading ~ or ~user in path to the actual homedirectory of the user. Returns either NULL if unsuccessful, or result in freshly allocated string. Bugs: ~user doesn't work with NIS/yellow pages. */ char * expand_homedir(const char *path) { char *resolved = NULL; const char *orig_path = path; UNUSED(orig_path); /* if HAVE_GETPWNAM or HAVE_GETPWUID && HAVE_GETUID */ if (path == NULL) return NULL; /* if path doesn't start with ~, just return a copy of path */ if (*path != '~') return xstrdup(path); /* expand ~/ or ~user */ path++; if (*path == '/') { /* expand `~/' to `$HOME/' */ char *homedir = getenv("HOME"); if (homedir != NULL) { resolved = xstrdup(homedir); resolved = xstrcat(resolved, path); } else { #if defined(HAVE_GETPWUID) && defined(HAVE_GETUID) /* homedir not set */ struct passwd *entry = getpwuid(getuid()); if (entry != NULL) { homedir = entry->pw_dir; if (homedir != NULL) { resolved = xstrdup(homedir); resolved = xstrcat(resolved, path); } else { XDVI_ERROR((stderr, "getpwnam returned NULL for entry->pw_dir: %s", strerror(errno))); return NULL; } } else { XDVI_ERROR((stderr, "getpwnam failed: %s", strerror(errno))); return NULL; } #else popup_message(globals.widgets.top_level, MSG_WARN, NULL, "$HOME not set, and getpwuid() or getuid() not supported - could not expand \"%s\".", orig_path); return NULL; #endif } TRACE_GUI((stderr, "resolved: |%s|", resolved)); return resolved; } else { /* ~user -> try getpwnam() to get homedir */ #ifdef HAVE_GETPWNAM struct passwd *entry; char *separator = strchr(path, '/'); char *homedir; TRACE_GUI((stderr, "separator is: |%s|, len of username: %d", separator, (int)(separator - path))); if (separator == NULL) return NULL; resolved = xmalloc(separator - path + 1); memcpy(resolved, path, separator - path); resolved[separator - path] = '\0'; TRACE_GUI((stderr, "username is: |%s|", resolved)); entry = getpwnam(resolved); if (entry == NULL) { XDVI_ERROR((stderr, "getpwnam failed: %s", strerror(errno))); return NULL; } TRACE_GUI((stderr, "homedir of user is: |%s|", entry->pw_dir)); homedir = entry->pw_dir; free(resolved); resolved = xstrdup(homedir); resolved = xstrcat(resolved, path + (separator - path)); TRACE_GUI((stderr, "resolved: |%s|", resolved)); return resolved; #else popup_message(globals.widgets.top_level, MSG_WARN, NULL, "Expanding \"%s\" failed: This platform doesn't support getpwnam().", orig_path); return NULL; #endif } } /* realpath implementation if no implementation available. Try to canonicalize path, removing `~', `.' and `..' and expanding symlinks. Adopted from wu-ftpd's fb_realpath (in realpath.c), but without the seteuid(0) stuff (which we don't need, since we never change into directories or read files the user has no permissions for), and without the ugly goto(). Special care has been taken to avoid buffer overflows (e.g. this version is not affected by http://isec.pl/vulnerabilities/isec-0011-wu-ftpd.txt). `resolved' should be a buffer of size MAXPATHLEN. */ char * my_realpath(const char *path, char *resolved) { struct stat sb; int n; /* char *p, *q, *tmp; */ char *base; char tmpbuf[MAXPATHLEN]; int symlinks = 0; #ifdef HAVE_FCHDIR int fd; #else char cwd[MAXPATHLEN]; #endif /* Save cwd for going back later */ #ifdef HAVE_FCHDIR if ((fd = try_open(".", O_RDONLY)) < 0) return NULL; #else /* HAVE_FCHDIR */ if ( # ifdef HAVE_GETCWD getcwd(cwd, MAXPATHLEN) # else getwd(cwd) # endif == NULL) return NULL; #endif /* HAVE_FCHDIR */ if (strlen(path) + 1 > MAXPATHLEN) { errno = ENAMETOOLONG; return NULL; } strcpy(resolved, path); for (;;) { /* loop for resolving symlinks in base name */ /* get base name and dir name components */ char *p = strrchr(resolved, '/'); if (p != NULL) { base = p + 1; if (p == resolved) { /* resolved is in root dir; this must be treated as a special case, since we can't chop off at `/'; instead, just use the `/': */ p = "/"; } else { /* not in root dir; chop off path name at slash */ while (p > resolved && *p == '/') /* for multiple trailing slashes */ p--; *(p + 1) = '\0'; p = resolved; } /* change into that dir */ if (chdir(p) != 0) break; } else /* no directory component */ base = resolved; /* resolve symlinks or directory names (not used in our case) in basename */ if (*base != '\0') { if ( #ifdef HAVE_LSTAT lstat(base, &sb) #else stat(base, &sb) #endif == 0) { #ifdef HAVE_LSTAT if (S_ISLNK(sb.st_mode)) { /* if it's a symlink, iterate for what it links to */ if (++symlinks > MAXSYMLINKS) { errno = ELOOP; break; } if ((n = readlink(base, resolved, MAXPATHLEN)) < 0) break; resolved[n] = '\0'; continue; } #endif /* HAVE_LSTAT */ if (S_ISDIR(sb.st_mode)) { /* if it's a directory, go there */ if (chdir(base) != 0) break; base = ""; } } } /* Now get full pathname of current directory and concatenate it with saved copy of base name */ strcpy(tmpbuf, base); /* cannot overrun, since strlen(base) <= strlen(path) < MAXPATHLEN */ if ( #ifdef HAVE_GETCWD getcwd(resolved, MAXPATHLEN) #else getwd(resolved) #endif == NULL) break; /* need to append a slash if resolved is not the root dir */ if (!(resolved[0] == '/' && resolved[1] == '\0')) { if (strlen(resolved) + 2 > MAXPATHLEN) { errno = ENAMETOOLONG; break; } strcat(resolved, "/"); } if (*tmpbuf) { if (strlen(resolved) + strlen(tmpbuf) + 1 > MAXPATHLEN) { errno = ENAMETOOLONG; break; } strcat(resolved, tmpbuf); } /* go back to where we came from */ #ifdef HAVE_FCHDIR (void)fchdir(fd); close(fd); #else (void)chdir(cwd); #endif return resolved; } /* arrive here in case of error: go back to where we came from, and return NULL */ #ifdef HAVE_FCHDIR (void)fchdir(fd); close(fd); #else (void)chdir(cwd); #endif return NULL; } #ifndef KPATHSEA /* * Either (re)allocate storage or fail with explanation. */ void * xmalloc(unsigned size) { void *mem = malloc(size); if (mem == NULL) XDVI_FATAL((stderr, "Out of memory (allocating %u bytes).", size)); return mem; } void * xrealloc(void *where, unsigned size) { void *mem = realloc(where, size); if (mem == NULL) XDVI_FATAL((stderr, "Out of memory (reallocating %u bytes).", size)); return mem; } /* * Allocate a new string. */ char * xstrdup(const char *str) { size_t len; char *new; ASSERT(fprintf(stderr, "Test assertion!\n") && 1 == 0); ASSERT(str != NULL, ""); len = strlen(str) + 1; new = xmalloc(len); memcpy(new, str, len); return new; } /* * Allocate a new string. The second argument is the length. */ char * xmemdup(const char *str, size_t len) { char *new; new = xmalloc(len); memcpy(new, str, len); return new; } #endif /* not KPATHSEA */ /* like xstrdup(), but with XtMalloc() */ char * xt_strdup(const char *ptr) { char *ret = XtMalloc(strlen(ptr) + 1); return strcpy(ret, ptr); } /* * Append str2 to str1, reallocating str1 as neccessary. * Note that this modifies str1, so if you want a clean * new copy, use xstrdup() first, then xstrcat(). * str1 should be either NULL, or a valid char * that has * previously been malloc()ed. */ char * xstrcat(char *str1, const char *str2) { size_t len1 = (str1 == NULL) ? 0 : strlen(str1); size_t len2 = strlen(str2) + 1; str1 = xrealloc(str1, len1 + len2); memcpy(str1 + len1, str2, len2); return str1; } /* * Allocate bitmap for given font and character */ void alloc_bitmap(struct bitmap *bitmap) { unsigned int size; /* fprintf(stderr, "allocating bitmap of size %u x %u\n", bitmap->w, bitmap->h); */ /* width must be multiple of bits for raster_op */ bitmap->bytes_wide = ROUNDUP((int)bitmap->w, BMBITS) * BMBYTES; size = bitmap->bytes_wide * bitmap->h; bitmap->bits = xmalloc(size != 0 ? size : 1); } #ifndef HAVE_MEMICMP /* * Case-insensitive version of memcmp(). This code assumes that the second * argument (i.e. what is being compared with) is lower case. */ int memicmp(const char *s1, const char *s2, size_t n) { while (n > 0) { int i = tolower((int)*s1) - *s2; if (i != 0) return i; ++s1; ++s2; --n; } return 0; } #endif /* HAVE_MEMICMP */ /* * Try to close the pixel file for the least recently used font. * Invoked when we've run out of file descriptors. */ void close_a_file(void) { struct font *fontp; unsigned short oldest = USHRT_MAX; struct font *f = NULL; if (globals.debug & DBG_OPEN) puts("Calling close_a_file()."); for (fontp = font_head; fontp != NULL; fontp = fontp->next) { if (fontp->file != NULL && fontp->timestamp <= oldest) { f = fontp; oldest = fontp->timestamp; } } /* fprintf(stderr, "oldest = %u\n", oldest); */ if (f == NULL) XDVI_FATAL((stderr, "Can't find an open pixel file to close")); fclose(f->file); f->file = NULL; } /* * Open a file in the given mode. We use XFOPEN since xfopen is already * usurpated by kpathsea's xfopen.c, which just exits rather ungracefully * if it detects a NULL return value; most certainly NOT what we want here. */ FILE * XFOPEN(const char *path, const char *mode) { FILE *fp = NULL; #ifdef TESTING_OPEN_FILES fprintf(stderr, "trying to open |%s|\n", path); #endif if ((fp = try_fopen(path, mode)) == NULL && (errno == EMFILE || errno == ENFILE)) { XDVI_FATAL((stderr, "too many open files")); } return fp; } /* * Create a pipe, closing a file if necessary. * We use socketpair() instead of pipe() because several operating * systems don't support SIGPOLL/SIGIO on pipes: * SGI IRIX 6.5 F_SETOWN not implemented * Linux 2.4.2 Not supported */ int xpipe(int *fd) { int retval; for (;;) { retval = socketpair(AF_UNIX, SOCK_STREAM, 0, fd); if (retval == 0) { /* success */ break; } if ((errno != EMFILE && errno != ENFILE)) { /* failed, but not because of too many files */ break; } close_a_file(); } return retval; } /* * * Read size bytes from the FILE fp, constructing them into a * signed/unsigned integer. * */ unsigned long get_bytes(FILE *fp, int size) { long x = 0; while (size--) x = (x << 8) | get_byte(fp); return x; } long get_lbytes(FILE *fp, int size) { long x; #if __STDC__ x = (signed char)getc(fp); #else x = (unsigned char)getc(fp); if (x & 0x80) x -= 0x100; #endif while (--size) x = (x << 8) | get_byte(fp); return x; } /* * Create a temporary file and return its fd. Also put its filename * in str. Create str if it's NULL. */ #ifndef P_tmpdir #define P_tmpdir "/tmp" #endif static const char tmp_suffix[] = "/xdvi-XXXXXX"; int xdvi_temp_fd(char **str) { int fd; char *p; size_t len; static const char *template = NULL; #if !HAVE_MKSTEMP static unsigned long seed; static char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._"; char *p1; #endif if (*str != NULL) { p = *str; /* O_EXCL is there for security (if root runs xdvi) */ if (!((fd = try_open_mode(p, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1 && errno == EEXIST)) return fd; #if HAVE_MKSTEMP memcpy(p + strlen(p) - 6, "XXXXXX", 6); #endif } else { if (template == NULL) { const char *ourdir; ourdir = getenv("TMPDIR"); if (ourdir == NULL || access(ourdir, W_OK) < 0) { ourdir = P_tmpdir; if (access(ourdir, W_OK) < 0) ourdir = "."; } len = strlen(ourdir); if (len > 0 && ourdir[len - 1] == '/') --len; template = p = xmalloc(len + sizeof tmp_suffix); memcpy(p, ourdir, len); memcpy(p + len, tmp_suffix, sizeof tmp_suffix); #if !HAVE_MKSTEMP seed = 123456789 * time(NULL) + 987654321 * getpid(); #endif } *str = p = xstrdup(template); } #if HAVE_MKSTEMP fd = mkstemp(p); if (fd == -1 && (errno == EMFILE || errno == ENFILE)) { close_a_file(); memcpy(p + strlen(p) - 6, "XXXXXX", 6); fd = mkstemp(p); } #else p1 = p + strlen(p) - 6; for (;;) { unsigned long s = ++seed; char *p2; for (p2 = p1 + 5; p2 >= p1; --p2) { *p2 = letters[s & 63]; s >>= 6; } if (!((fd = try_open_mode(p, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1 && errno == EEXIST)) break; } #endif return fd; } /* print a GUI error message for childs that exited with an errorcode */ void handle_child_exit(int status, struct xchild *this) { char *err_msg = NULL; /* if child exited with error and xio struct is available for child, print error text */ if (this->io != NULL && (WIFEXITED(status) != 0) && (WEXITSTATUS(status) != 0) && (err_msg = (this->io->read_proc)(this->io->fd, NULL)) != NULL) { if (this->name == NULL) { popup_message(globals.widgets.top_level, MSG_WARN, NULL, err_msg[0] == '\0' ? "An unknown error occurred" : err_msg); } else { popup_message(globals.widgets.top_level, MSG_WARN, "Xdvi tries to collect all messages from STDERR. " "When no useful error message is available " "(e.g. because the program has written to STDOUT instead), " "try to run the command again from the command line " "to find out what the problem was.", "Command \"%s\" exited with error code %d\n%s\n", this->name, WEXITSTATUS(status), err_msg); } free(err_msg); } free(this->name); free(this->io); free(this); } static void dummy_write_proc(int fd, void *data) { UNUSED(fd); UNUSED(data); fprintf(stderr, "============== dummy_write_proc called for fd %d\n", fd); } /* * read what child printed to fd (should be set up to be stderr). * Allocates and returns error text; caller is responsible for free()ing it * afterwards. */ char * read_child_error(int fd, void *data) { int bytes = 0, buf_old_size = 0, buf_new_size = 0; char tmp_buf[BUF_SIZE]; char *err_buf = xstrdup(""); char *ret; UNUSED(data); /* collect stderr messages into err_buf */ while ((bytes = read(fd, tmp_buf, BUF_SIZE - 1)) > 0) { buf_old_size = buf_new_size; buf_new_size += bytes; err_buf = xrealloc(err_buf, buf_new_size + 1); memcpy(err_buf + buf_old_size, tmp_buf, buf_new_size - buf_old_size); err_buf[buf_new_size] = '\0'; } close(fd); ret = escape_format_arg(err_buf); /* this allocates ret */ free(err_buf); return ret; } /* * Fork a child process. If exit_proc is NULL, the process' error messages * will be collected and a window popped up for GUI display. If exit_proc * is non-NULL, it should be a function that does something reasonable * with the error messages itself. It should also free the xchild struct. * * If dirname != NULL, the child will chdir into dirname before running the * command. */ Boolean fork_process(const char *proc_name, Boolean redirect_stdout, const char *dirname, childProcT exit_proc, void *data, char *const argv[]) { int i, pid; struct xchild *my_child = xmalloc(sizeof *my_child); struct xio *my_io = xmalloc(sizeof *my_io); int err_pipe[2]; char *volatile buf = xstrdup(""); for (i = 0; argv[i] != NULL; i++) { TRACE_GUI((stderr, "argv: |%s|", argv[i])); buf = xstrcat(buf, argv[i]); buf = xstrcat(buf, " "); } if (i > 0) buf[strlen(buf) - 1] = '\0'; /* chop off trailing space */ TRACE_GUI((stderr, "forking: |%s|", buf)); /* flush output buffers to avoid double buffering (i.e. data waiting in the output buffer being written twice, by the parent and the child) */ fflush(stdout); fflush(stderr); if (pipe(err_pipe) < 0) { XDVI_FATAL((stderr, "pipe error")); } switch (pid = vfork()) { case -1: /* forking error */ perror("vfork"); close(err_pipe[0]); close(err_pipe[1]); return False; case 0: /* child */ if (dirname != NULL) (void)chdir(dirname); if (globals.debug & DBG_FILES) { char path[MAXPATHLEN]; (void)getcwd(path, MAXPATHLEN); fprintf(stderr, "Directory of running `%s': `%s'\n", proc_name, path); } /* FIXME: There's a bug which prevents this from working with xdvi as child: Whenever xdvi tries to print to stderr, this will hang the child forever. Closing all other file descriptors, as in the #if TRY_FIX regions, seems to fix this, but it also loses all output ... */ #if TRY_FIX close(0); close(1); #endif /* TRY_FIX */ close(err_pipe[0]); /* no reading from stderr */ /* redirect writing to stderr */ if (dup2(err_pipe[1], STDERR_FILENO) != STDERR_FILENO) { perror("dup2 for stderr"); _exit(EXIT_FAILURE); return False; /* make compiler happy */ } if (redirect_stdout) { /* also redirect writing to stdout */ if (dup2(err_pipe[1], STDOUT_FILENO) != STDOUT_FILENO) { perror("dup2 for stdout"); _exit(EXIT_FAILURE); return False; /* make compiler happy */ } } #if TRY_FIX /* close all remaining descriptors */ i = 2; while (i < 256 /* TODO: better handling of OPEN_MAX; see Stevens p. 43 */) { close(i++); } #endif /* TRY_FIX */ execvp(proc_name, argv); /* arrive here only if execvp failed */ fprintf(stderr, "%s: Execution of %s failed.\n", globals.program_name, proc_name); fflush(stderr); close(err_pipe[1]); _exit(EXIT_FAILURE); return False; /* make compiler happy */ default: /* parent */ close(err_pipe[1]); /* no writing to stderr */ my_io->next = NULL; my_io->fd = err_pipe[0]; my_io->xio_events = XIO_IN; #if HAVE_POLL my_io->pfd = NULL; #endif my_io->read_proc = read_child_error; my_io->write_proc = dummy_write_proc; my_io->data = data; my_child->next = NULL; my_child->pid = pid; my_child->name = buf; my_child->data = data; if (exit_proc == NULL) { /* use default exit procedure */ my_child->proc = handle_child_exit; } else { my_child->proc = exit_proc; } my_child->io = my_io; set_chld(my_child); return True; } } /* * Prepare the file descriptor to generate SIGPOLL/SIGIO events. * If called with a True argument, set it up for non-blocking I/O. */ void prep_fd(int fd, wide_bool noblock) { /* Set file descriptor for non-blocking I/O */ if (noblock) (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK); #if !FLAKY_SIGPOLL # if HAVE_STREAMS if (isastream(fd) > 0) { if (ioctl(fd, I_SETSIG, S_RDNORM | S_RDBAND | S_HANGUP | S_WRNORM) == -1) perror("xdvi: ioctl I_SETSIG"); } else # endif { # ifdef FASYNC if (fcntl(fd, F_SETOWN, getpid()) == -1) perror("xdvi: fcntl F_SETOWN"); if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | FASYNC) == -1) perror("xdvi: fcntl F_SETFL"); # elif defined SIOCSPGRP && defined FIOASYNC /* For HP-UX B.10.10 and maybe others. See "man 7 socket". */ int arg; arg = getpid(); if (ioctl(fd, SIOCSPGRP, &arg) == -1) perror("xdvi: ioctl SIOCSPGRP"); arg = 1; if (ioctl(fd, FIOASYNC, &arg) == -1) perror("xdvi: ioctl FIOASYNC"); # endif } #endif /* not FLAKY_SIGPOLL */ } /* APS Pointer locator: */ /* Return screen positions */ Boolean pointerlocate(int *xpos, int *ypos) { Window root, child; int root_x, root_y; unsigned int keys_buttons; if (!XtIsRealized(globals.widgets.top_level)) return False; return XQueryPointer(DISP, mane.win, &root, &child, &root_x, &root_y, xpos, ypos, &keys_buttons); } unsigned long parse_debugging_string(const char *arg) { int retval = 0; const char *curr, *last; size_t i; curr = last = arg; while (curr != '\0') { Boolean matched = False; while (isspace((int)*curr)) curr++; for (i = 0; debug_options[i].description != NULL; i++) { size_t curr_opt_len = strlen(debug_options[i].description); /* Should we match on length of passed argument, to allow for abbreviations? */ if (memicmp(curr, debug_options[i].description, curr_opt_len) == 0 && (curr[curr_opt_len] == '\0' || curr[curr_opt_len] == ',' || isspace((int)curr[curr_opt_len]))) { matched = True; retval |= debug_options[i].bitmap; fprintf(stderr, "Debugging option: \"%s\" = \"%s\", debug: %d\n", curr, debug_options[i].description, retval); } } if (!matched) { char *tempstr = xstrdup(curr); char *test; if ((test = strchr(curr, ',')) != NULL) { *test = '\0'; } XDVI_WARNING((stderr, "Ignoring unknown debugging option \"%s\". Valid options are:\n", tempstr)); for (i = 0; debug_options[i].description != NULL; i++) { fprintf(stderr, "`%s'%s", debug_options[i].description, debug_options[i].help_formatting); } fprintf(stderr, "\n"); free(tempstr); } curr = strchr(curr, ','); if (curr != NULL) curr++; } return retval; } unsigned long parse_debugging_option(const char *ptr) { if (ptr == NULL) return 0L; else if (isdigit((int)*ptr)) { if (resource.debug_arg == NULL) return DBG_ALL; /* per default debug everything */ else return strtol(resource.debug_arg, (char **)NULL, 10); } else if (*ptr == '-') return DBG_ALL; else return parse_debugging_string(ptr); } /* determine average width of a font */ int get_avg_font_width(XFontStruct *font) { int width; assert(font != NULL); width = font->max_bounds.width + font->min_bounds.width / 2; if (width == 0) { /* if min_bounds.width = -max_bounds.width, we probably have a scalable TT font; try to determine its actual width by measuring the letter `x': */ width = XTextWidth(font, "x", 1); } if (width == 0) { /* last resort */ width = font->max_bounds.width / 2; } return width; } /* Splits LINE from BEGIN to END (not neccessarily null-terminated) into items separated by SEP, removes leading or trailing whitespace, and saves the items as newly allocated char*s into the return array. Returns the number of items that have been saved as RET_ITEMS. Empty entries are returned as such, i.e. both `abc:' and `abc: ' return RET_ITEMS = 2 and "" as second entry. */ char ** split_line(const char *line, char sep, size_t begin, size_t end, size_t *ret_items) { const char *c_ptr = line + begin; const char *e_ptr = line + end; const char *test_end; size_t result_cnt = 0; size_t alloc_len = 0; size_t len; const size_t ALLOC_STEP = 8; char **result_arr = NULL; /* create new result item, resizing result_arr as needed * (an empty string will coun1 as 1 item: "") */ while (result_cnt + 1 >= alloc_len) { alloc_len += ALLOC_STEP; result_arr = xrealloc(result_arr, alloc_len * sizeof *result_arr); } while (c_ptr <= e_ptr) { /* skip leading whitespace */ while (c_ptr < e_ptr && isspace((int)*c_ptr)) { c_ptr++; } /* find end of current elem, which is either the separator or out of range */ test_end = strchr(c_ptr, sep); /* skip escaped separators */ while (test_end != NULL && test_end <= e_ptr) { if (test_end > c_ptr && *(test_end - 1) == '\\') { test_end = strchr(test_end + 1, sep); } else break; } /* if nothing found, use e_ptr */ if (test_end == NULL || test_end > e_ptr) { test_end = e_ptr; } len = test_end - c_ptr; /* skip trailing whitespace */ while (len > 0 && isspace((int)c_ptr[len - 1])) { len--; } result_arr[result_cnt] = xmalloc(len + 1); /* copy into result item, skipping the escape '\\' characters */ { size_t i = 0, j = 0; while (i < len) { if (c_ptr[i] == '\\' && c_ptr[i + 1] == sep) /* i + 1 is safe since (i < len) */ i++; result_arr[result_cnt][j++] = c_ptr[i++]; } result_arr[result_cnt][j] = '\0'; } result_cnt++; /* skip to next item */ c_ptr = test_end + 1; } result_arr[result_cnt] = NULL; /* null-terminate return array, just to be safe */ *ret_items = result_cnt; return result_arr; } /*------------------------------------------------------------ * find_file * * Arguments: * filename - absolute or relative file name * statbuf - buffer to stat filename * pathinfo - kpse_file_format_type, only used if a kpathsearch for the * file is performed. * See kpathsea/tex-file.h for a list of possible values. * * Returns: * expanded filename * * Purpose: * Find a file name corresponding to , possibly * expanding it to a full path name; checks if the file * exists by stat()ing it; returns NULL if nothing has * been found, else the expanded filename in fresh memory. * *------------------------------------------------------------*/ char * find_file(const char *filename, struct stat *statbuf, kpse_file_format_type pathinfo) { char *tmp; char *pathname; TRACE_SRC((stderr, "checking filename \"%s\"", filename)); /* * case 1: * try absolute filename */ if (filename[0] == '/') { if (stat(filename, statbuf) == 0) { TRACE_SRC((stderr, "Found absolute filename \"%s\"", filename)); return xstrdup(filename); } else { TRACE_SRC((stderr, "Can't stat absolute filename \"%s\"\n", filename)); return NULL; } } /* * case 2: * prepend filename with dir component from the `main' xdvi file (globals.dvi_file.dirname). * This works for both * /absolute/path/ + filename * and * /absolute/path/ + relative/path/filename */ ASSERT(globals.dvi_file.dirname != NULL, "globals.dvi_file.dirname should have been initialized"); pathname = xstrdup(globals.dvi_file.dirname); pathname = xstrcat(pathname, filename); TRACE_SRC((stderr, "Trying globals.dvi_file.dirname: \"%s\"", pathname)); if (stat(pathname, statbuf) == 0) { return pathname; } /* * case 3: * try current directory; if it's a match, expand to full (but uncanonicalized) path name. */ if (stat(filename, statbuf) == 0) { TRACE_SRC((stderr, "Found file \"%s\" in current dir", filename)); free(pathname); return expand_filename(filename, USE_CWD_PATH); } /* * case 4a: * try a kpathsea search for filename, from globals.dvi_file.dirname */ { #ifdef HAVE_FCHDIR int fd; #else char cwd[MAXPATHLEN]; #endif /* Save cwd for going back later */ if ( #ifdef HAVE_FCHDIR (fd = try_open(".", O_RDONLY)) >= 0 #else /* HAVE_FCHDIR */ # ifdef HAVE_GETCWD getcwd(cwd, MAXPATHLEN) # else getwd(cwd) # endif != NULL #endif /* HAVE_FCHDIR */ ) { if (chdir(globals.dvi_file.dirname) == 0) { TRACE_SRC((stderr, "trying kpathsearch for filename \"%s\" from %s", filename, globals.dvi_file.dirname)); tmp = kpse_find_file(filename, pathinfo, True); if (tmp != NULL && stat(tmp, statbuf) == 0) { free(pathname); /* go back to where we came from */ #ifdef HAVE_FCHDIR (void)fchdir(fd); close(fd); #else (void)chdir(cwd); #endif if (tmp[0] == '/') { /* is it an absolute path? */ pathname = xstrdup(tmp); } else { pathname = xstrdup(globals.dvi_file.dirname); pathname = xstrcat(pathname, tmp); } TRACE_SRC((stderr, "Found file: `%s'", pathname)); free(tmp); return pathname; } } else { /* * case 4b: * couldn't change to globals.dvi_file.dirname - try a kpathsea search from CWD */ TRACE_SRC((stderr, "trying kpathsearch for filename \"%s\" from CWD", filename)); tmp = kpse_find_file(filename, pathinfo, True); if (tmp != NULL && stat(tmp, statbuf) == 0) { TRACE_SRC((stderr, "Found file: `%s'", tmp)); free(pathname); return tmp; } } } } /* * case 5: * try a kpathsea search for pathname */ TRACE_SRC((stderr, "trying kpathsearch for pathname \"%s\"", pathname)); tmp = kpse_find_file(pathname, pathinfo, True); if (tmp != NULL && stat(tmp, statbuf) == 0) { TRACE_SRC((stderr, "Found file: `%s'", tmp)); free(pathname); return tmp; } /* not found */ free(pathname); free(tmp); errno = 0; return NULL; } /* Hashtable functions The purpose of these is to wrap kpathsea's rather strange hash functions that can be used to store 2 type of values: char *, and long, where the latter is interpreted as char *. (See kpathsea/dir.c for an example of where this is used). !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BUG ALERT: Note however that a long value may never be removed from the hash table with hash_delete(), since it would do a strcmp() on the long interpreted as a pointer! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! We can't use a different approach (like using a void *) since the debugging ouput of kpathsea relies on printing the value either as char * or long (depending on the value of the global flag `kpse_debug_hash_lookup_int'). */ /* If key is in hashtable, return True and the integer value in val; else return False (and leave val untouched). */ Boolean find_str_int_hash(hashTableT *hashtable, const char *key, size_t *val) { string *ret; #ifdef KPSE_DEBUG if (KPSE_DEBUG_P (KPSE_DEBUG_HASH)) kpse_debug_hash_lookup_int = True; #endif ret = hash_lookup(*hashtable, key); #ifdef KPSE_DEBUG if (KPSE_DEBUG_P (KPSE_DEBUG_HASH)) kpse_debug_hash_lookup_int = False; #endif if (ret != NULL) { long l = (long)*ret; *val = (size_t)l; return True; } return False; } /* Insert key-value pair into hashtable. Note that the key is *not* copied (i.e. it is expected that is had been allocated somewhere else, and persists throughout the program). */ void put_str_int_hash(hashTableT *hashtable, const char *key, size_t val) { long ptr = (long)val; hash_insert(hashtable, key, (const string)ptr); } /* set globals.dvi_name, globals.dvi_file.dirname and globals.dvi_file.dirlen */ void set_dvi_name_expand(const char *new_filename) { ASSERT(new_filename != NULL, ""); free(globals.dvi_name); globals.dvi_name = expand_filename_append_dvi(new_filename, USE_CWD_PATH, True); free(globals.dvi_file.dirname); globals.dvi_file.dirname = get_dir_component(globals.dvi_name); ASSERT(globals.dvi_file.dirname != NULL, "dvi_name should be a path with dir component"); globals.dvi_file.dirlen = strlen(globals.dvi_file.dirname); } /* set globals.dvi_name, globals.dvi_file.dirname and globals.dvi_file.dirlen In contrast to previous function, input filename is not copied. */ void set_dvi_name(char *new_filename) { ASSERT(new_filename != NULL, ""); free(globals.dvi_name); globals.dvi_name = new_filename; free(globals.dvi_file.dirname); globals.dvi_file.dirname = get_dir_component(globals.dvi_name); ASSERT(globals.dvi_file.dirname != NULL, "dvi_name should be a path with dir component"); globals.dvi_file.dirlen = strlen(globals.dvi_file.dirname); } /* * Copy the file pointer `in' to the file pointer `out'. Return True * if successful, False else (in which case caller should examine * errno to find the error). * The caller is responsible for closing the files. */ Boolean copy_fp(FILE *in, FILE *out) { #define TMP_BUF_SIZE 4 * 1024 char buf[TMP_BUF_SIZE]; while (feof(in) == 0) { size_t bytes_in, bytes_out; bytes_in = fread(buf, 1, TMP_BUF_SIZE, in); if (bytes_in < TMP_BUF_SIZE && !feof(in)) return False; bytes_out = fwrite(buf, 1, bytes_in, out); /* fprintf(stderr, "read %d, wrote %d bytes\n", bytes_in, bytes_out); */ if (bytes_out < bytes_in) return False; } return True; #undef TMP_BUF_SIZE } /* * Copy a file from `from_path' to `to'. Return True if successful, False else * (in which case caller should examine errno to find the error). */ Boolean copy_file(const char *from_path, const char *to_path) { FILE *from_fp; FILE *to_fp; Boolean retval; if ((from_fp = try_fopen(from_path, "rb")) == NULL) { XDVI_ERROR((stderr, "opening %s for reading failed: %s", from_path, strerror(errno))); return False; } if ((to_fp = try_fopen(to_path, "wb")) == NULL) { XDVI_ERROR((stderr, "opening %s for writing failed: %s", to_path, strerror(errno))); return False; } retval = copy_fp(from_fp, to_fp); fclose(from_fp); fclose(to_fp); return retval; } const char * get_text_encoding(void) { const char *text_encoding = NULL; /* if resource.text_encoding isn't set, use nl_langinfo() if langinfo is available */ if (resource.text_encoding == NULL) { #if USE_LANGINFO if (globals.orig_locale == NULL) { XDVI_ERROR((stderr, "Call to setlocale() returned NULL; assuming ISO-8859-1 charset.")); text_encoding = "ISO-8859-1"; } else { if (strcmp(globals.orig_locale, "C") == 0 || strcmp(globals.orig_locale, "POSIX") == 0) { /* nl_langinfo returns rather strange values for these ... */ text_encoding = "ISO-8859-1"; TRACE_FIND((stderr, "Assuming |%s| for locale |%s|", text_encoding, globals.orig_locale)); } else { text_encoding = nl_langinfo(CODESET); TRACE_FIND((stderr, "nl_langinfo returned: |%s| for locale |%s|", text_encoding, globals.orig_locale)); } } #else XDVI_WARNING((stderr, "nl_langinfo() not available on this platform, " "and XDvi.textEncoding resource not set; using default " "encoding ISO-8859-1.")); text_encoding = "ISO-8859-1"; #endif } else { text_encoding = resource.text_encoding; } return text_encoding; } char * iconv_convert_string(const char *from_enc, const char *to_enc, const char *str) { static Boolean have_warned = False; #if HAVE_ICONV_H size_t input_len = strlen(str); size_t conv_len = input_len * 4 + 1; /* worst case ... */ int conv_len_save = conv_len; char *conv_buf = xmalloc(conv_len); const char *in_ptr = str; const char *out_ptr = conv_buf; iconv_t conv_desc = iconv_open(to_enc, from_enc); if (conv_desc == (iconv_t)(-1)) { if (!have_warned) { popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"), MSG_ERR, NULL, "iconv_open() error: Encoding \"%s\" is not supported by this version of iconv.\n" "Please check the output of \"iconv -l\" and set the X resource\n" "\"XDvi.textEncoding\" to an appropriate value.", from_enc); have_warned = True; } free(conv_buf); return NULL; } TRACE_FIND((stderr, "iconv_convert_string: from `%s', to `%s'", from_enc, to_enc)); if (iconv(conv_desc, (iconv_char_pptrT)&in_ptr, &input_len, (char **)&out_ptr, &conv_len) == (size_t)(-1)) { popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"), MSG_ERR, NULL, "iconv_convert_string(): Could not convert %s to %s: %s.", from_enc, to_enc, strerror(errno)); iconv_close(conv_desc); free(conv_buf); return NULL; } iconv_close(conv_desc); conv_len = conv_len_save - conv_len; conv_buf[conv_len] = '\0'; TRACE_FIND((stderr, "after iconv conversion: |%s| %lu bytes\n", conv_buf, (unsigned long)conv_len)); return conv_buf; #else /* HAVE_ICONV_H */ UNUSED(from_enc); UNUSED(to_enc); UNUSED(str); /* no iconv available */ if (!have_warned) { popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"), MSG_ERR, "You can either set the \"LANG\" environment variable or the X resource " "\"XDvi.textEncoding\" to make xdvi use a different language/encoding setting.\n" "Without iconv, only the encodings ISO-8859-1 and UTF-8 are supported. " "For real iconv support, you will need to install the iconv library " "and recompile xdvik.", "Cannot convert from %s to UTF-8 without iconv support compiled in."); have_warned = True; } return NULL; #endif /* HAVE_ICONV_H */ } /* Replace (pseudo-)format arguments in NULL-terminated argv list as follows: * %f -> filename, %l -> linenumber, %c -> column number. * If %f or %l are not specified, they are appended as %f and +%l. * If colno == 0, no %c argument is provided. */ char ** src_format_arguments(char **argv, const char *filename, int lineno, int colno) { size_t i; Boolean found_filename = False; Boolean found_lineno = False; for (i = 0; argv[i] != NULL; i++) { char *ptr, *curr = argv[i]; while ((ptr = strchr(curr, '%')) != NULL) { char *p1; if ((p1 = strchr("flc", ptr[1])) != NULL) { /* we have a formatting char */ char digit_arg[LENGTH_OF_INT]; const char *new_elem = NULL; /* remember offsets and lengths */ size_t l_init = ptr - argv[i]; size_t l_rest = strlen(ptr + 2) + 1; size_t l_mid; if (*p1 == 'f') { found_filename = True; new_elem = filename; } else if (*p1 == 'l') { found_lineno = True; sprintf(digit_arg, "%d", lineno); new_elem = digit_arg; } else if (*p1 == 'c') { sprintf(digit_arg, "%d", colno); new_elem = digit_arg; } l_mid = strlen(new_elem); argv[i] = xrealloc(argv[i], strlen(argv[i]) + l_mid + 1); curr = argv[i] + l_init; /* need to reinitialize it because of realloc */ memmove(curr + l_mid, curr + 2, l_rest); memcpy(curr, new_elem, l_mid); curr += l_mid; } else if (ptr[1] == '%') { /* escaped %, skip both */ curr = ptr + 2; } else { curr = ptr + 1; } } } /* append line number and file name arguments if they were not specified */ if (!found_lineno) { i++; argv = xrealloc(argv, (i + 1) * sizeof *argv); argv[i - 1] = xmalloc(LENGTH_OF_INT + 2); sprintf(argv[i - 1], "+%d", lineno); argv[i] = NULL; } if (!found_filename) { i++; argv = xrealloc(argv, (i + 1) * sizeof *argv); argv[i - 1] = xstrdup(filename); argv[i] = NULL; } return argv; } char * xstrndup(const char *str, size_t len) { char *new_str = xmalloc(len + 1); memcpy(new_str, str, len); new_str[len] = '\0'; return new_str; } #if 0 /* * Search integer array of length for for . * Return the index of the item, or the index of the next smaller item * if there's no exact match. (That we want the latter is the * reason why we can't use bsearch()). */ int binary_search(int *arr, int arr_len, int item) { int lower = -1; int upper = arr_len; int mid; ASSERT(arr_len >= 1, "binary_search expects arrays of length >= 1"); do { mid = (lower + upper) / 2; if (item > arr[mid]) lower = mid; else if (item < arr[mid]) upper = mid; else /* exact match */ return mid; } while (upper - lower > 1); /* no exact match, return next lower item */ if (mid > 0 && arr[mid] > item) return mid - 1; else return mid; } #endif /* 0 */ xdvik-ja-22.84.16-j1.40/texk/xdvik/README.t1mapper0000664000175000017500000001670210363262237020605 0ustar uwabamiuwabami README for t1mapper =================== T1mapper is a utility for mapping/copying PostScript(tm) Type1 fonts from various sources (e.g. an existing ghostscript installation) into the texmf source tree to make them available for xdvik. The instructions in this README do not apply to users of recent teTeX (teTeX-beta or teTeX >= 1.0) or TeXLive (>= 6b) distributions; these already contain the required fonts within the texmf tree. For general information on the use of t1fonts with xdvik, please see the file README.t1fonts. T1mapper is written in Perl, and it should make it rather easy to install type1 fonts in a way such that xdvik can use them. The manual page of t1mapper(1) gives a short command overview, and the following sections describe the font installation in more detail. 1. Installing the "standard" postscript fonts Have gs (ghostscript) version >= 4.x installed (or downloaded and unpacked), including both font packages ('std' and 'other'). If you have gs on your machine already you can check what version you have with the command 'gs -help'; this also tells you where the installed gs stores its fonts. Find the Fontmap file and the fonts. If you can't find them, pretend you don't have them and follow the instructions in the next paragraph. If you don't have gs installed you need to get it and and the font packages. A likely source of a recent ghostscript is http://sourceforge.net/projects/ghostscript/ http://www.gnu.org/software/ghostscript/ghostscript.html You'll need to download the 2 font directories (`std' and `other') and the source package. From the latter, t1mapper only needs the file 'Fontmap' or 'Fontmap.GS'. Install the files somewhere, e.g. to /usr/local/share/ghostscript/fonts. If you wonder about the contents of the Ghostscript font packages, and their relation to the "real" type1 fonts used in printers, please look at the GS docs. Decide where to install the font files for xdvi; /usr/local/teTeX/share/texmf/fonts/type1/gs is a likely place. Now run t1mapper (probably as root) to install the fonts: t1mapper -lns -gs /usr/local/share/ghostscript/5.50/Fontmap \ /usr/local/share/ghostscript/fonts \ /usr/local/teTeX/share/texmf/fonts/type1/gs Notes: - For the meaning of -lns -gs and other t1mapper options, see below. - If you unpacked the gs packages and installed them by hand, please correct the Fontmap path. - The directory /usr/local/teTeX/share/texmf/fonts/type1/gs will be created if it does not already exist. - With ghostscript >= 6.51, `Fontmap' is only a wrapper for `Fontmap.GS'. Use `Fontmap.GS' instead of `Fontmap' in the invocation of t1mapper. In some versions of Linux, such as Red Hat Linux 7.x, the files have been split into two directories. Listing the contents of the gs related font packages reveals that they have been put in both /usr/share/fonts/default/ghostscript and /usr/share/fonts/default/Type1. If you use such a distribution, this might be the commands to use: t1mapper -lns -gs /usr/share/ghostscript/5.50/Fontmap \ /usr/share/fonts/default/ghostscript \ /usr/share/texmf/fonts/type1/gs t1mapper -lns -gs /usr/share/ghostscript/5.50/Fontmap \ /usr/share/fonts/default/Type1 \ /usr/share/texmf/fonts/type1/gs When the command is complete, all the fonts gs knows about will have been copied to /usr/local/teTeX/share/texmf/fonts/type1/gs. This will give you the standard PostScript fonts as well as some others. 2. Installing Other Postscript Fonts If you already have some type1 fonts (other than the ones from ghostscript), you might want to add them as well. Some sites have extensive postscript font collections. All these fonts can be used. Additionaly, if you use a machine with a comercial Unix version (such as IRIX, Solaris, AIX, HP-UX, ...) it is quite likely that some type1 fonts are installed on the machine. These can be used by ghostscript and xdvi. If you don't know where they are search for filenames such as '*.pfa', '*.pfb', and 'Times-Roman*' and you should be able to find them. To add the fonts found on a Solaris machine, use this command: t1mapper -lns /usr/local/teTeX/share/texmf/fonts/type1/gs \ /usr/openwin/lib/X11/fonts/Type1/*.pfa Run the command on all the type1 fonts you want to be able to use in xdvi. Notes: - Do not run t1mapper on the TeX type1 fonts (cm* and so on). - Fonts from the `Lucida' family have a rather difficult structure and might be difficult to install. Please see the files xdvi.cfg and lucida.map. Copying/linking them all to the same directory will ensure that only one version of each font is available to xdvi. t1mapper will remove any font version already available in the target directory before moving a font there. The -lns option will cause t1mapper to symlink the fonts instead of copying them, saving a good deal of disk space. Here's a quick summary of the options that can be used to customize what t1mapper does with the files: -cp copy the font files, this is the default and will always work and never break down on you. -ln make hard links, this requires all the fonts to be on the same disk. -lns make symbolic links, this requires that you do not remove the fonts linked, or xdvi will not be able to use them anymore. -lnlns attempt hard-link first, if it fails make symbolic link. -lncp attempt hard-link first, if it fails copy the file. This is a way to save some diskspace if possible, with no risk of files disapearing. 3. AFM files AFM files are not needed by xdvik. TFM files have more accurate width data and *must* be used to get correct alignment. 4a. Standard TeX fonts in postscript version If you don't have cmr10.pfb, i.e., the type1 version of the traditional TeX fonts you need to get them from CTAN, e.g., ftp.tex.ac.uk:/tex-archive/fonts/cm/ps-type1/bluesky/pfb/. Just drop them in a texmf directory, such as fonts/type1/bluesky/cm/. No further configuration should be needed to use these fonts. 4b. AMS TeX fonts in postscript version Additionaly, get /tex-archive/fonts/amsfonts/ps-type1/amsps-unix.tar.gz and install the pfb files in fonts/type1/bluesky/ams. 4c. More TeX fonts in postscript version There are some more type1 fonts in /tex-archive/fonts/cm/ps-type1/bakoma/pfb. As with the bluesky fonts drop them in a directory, such as fonts/type1/bakoma. There is a large overlap between the bakoma and bluesky fonts, you can save some confusion and diskspace by removing the bakoma fonts that have bluesky equivalents. (Side note: There are licensing restrictions on the use of the bakoma fonts which might prevent you from using them; one of them being the inclusion in finished documents. However, DVI files are not `finished' documents in this sense, since they don't contain the font shapes themselves; instead, xdvi needs to locate the fonts on disk.) If you do not want dvips to use the bakoma fonts, make sure that they are not referenced in any of the dvips fontmaps. 5. Xdvi config files If you did not do 'make install' you will want to copy texk/xdvik/texmf/* from the source distribution into /usr/local/teTeX/share/texmf/xdvi. This copies some important configuration files describing encoding vectors and fonts to xdvi (see above). 6. Almost finished All the font files are now where they should be. If you use a file database it's time to update it. TeTeX users run 'texhash' to obtain this effect. Xdvi can now find all the nice files and will not need pk versions of all those fonts. If you experience problems, please see the section `Debugging your font setup' in the file README.t1fonts. xdvik-ja-22.84.16-j1.40/texk/xdvik/pk.c0000664000175000017500000002352611164427731016757 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1990-2004 Paul Vojta 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. NOTE: xdvi is based on prior work, as noted in the modification history in xdvi.c. \*========================================================================*/ /* * PK font reading routines. * Public routines are read_PK_index and read_PK_char. */ #include "xdvi-config.h" #include "xdvi.h" #include "dvi-init.h" #include "util.h" #define PK_ID 89 #define PK_CMD_START 240 #define PK_X1 240 #define PK_X2 241 #define PK_X3 242 #define PK_X4 243 #define PK_Y 244 #define PK_POST 245 #define PK_NOOP 246 #define PK_PRE 247 static int PK_flag_byte; static unsigned PK_input_byte; static int PK_bitpos; static int PK_dyn_f; static int PK_repeat_count; static int PK_get_nyb(FILE *fp) { unsigned temp; if (PK_bitpos < 0) { PK_input_byte = get_byte(fp); PK_bitpos = 4; } temp = PK_input_byte >> PK_bitpos; PK_bitpos -= 4; return (temp & 0xf); } static int PK_packed_num(FILE *fp) { int i, j; if ((i = PK_get_nyb(fp)) == 0) { do { j = PK_get_nyb(fp); ++i; } while (j == 0); while (i > 0) { j = (j << 4) | PK_get_nyb(fp); --i; } return (j - 15 + ((13 - PK_dyn_f) << 4) + PK_dyn_f); } else { if (i <= PK_dyn_f) return i; if (i < 14) return (((i - PK_dyn_f - 1) << 4) + PK_get_nyb(fp) + PK_dyn_f + 1); if (i == 14) PK_repeat_count = PK_packed_num(fp); else PK_repeat_count = 1; return PK_packed_num(fp); } } static void PK_skip_specials(struct font *fontp) { int i, j; FILE *fp = fontp->file; do { PK_flag_byte = get_byte(fp); if (PK_flag_byte >= PK_CMD_START) { switch (PK_flag_byte) { case PK_X1: case PK_X2: case PK_X3: case PK_X4: i = 0; for (j = PK_CMD_START; j <= PK_flag_byte; ++j) i = (i << 8) | get_byte(fp); while (i--) (void)get_byte(fp); break; case PK_Y: (void)get_bytes(fp, 4); case PK_POST: case PK_NOOP: break; default: XDVI_FATAL((stderr, "Unexpected %d in PK file %s", PK_flag_byte, fontp->filename)); break; } } } while (PK_flag_byte != PK_POST && PK_flag_byte >= PK_CMD_START); } /* * Public routines */ static void read_PK_char(struct font *fontp, wide_ubyte ch) { int i, j; int n; int row_bit_pos; Boolean paint_switch; bmUnitT *cp; struct glyph *g; FILE *fp = fontp->file; long fpwidth; bmUnitT word = 0; int word_weight, bytes_wide; int rows_left, h_bit, count; g = &fontp->glyph[ch]; PK_flag_byte = g->x2; PK_dyn_f = PK_flag_byte >> 4; paint_switch = ((PK_flag_byte & 8) != 0); PK_flag_byte &= 0x7; if (PK_flag_byte == 7) n = 4; else if (PK_flag_byte > 3) n = 2; else n = 1; if (globals.debug & DBG_PK) printf("loading pk char %d, char type %d ", ch, n); /* * now read rest of character preamble */ if (n != 4) fpwidth = get_bytes(fp, 3); else { fpwidth = get_lbytes(fp, 4); (void)get_bytes(fp, 4); /* horizontal escapement */ } (void)get_bytes(fp, n); /* vertical escapement */ { unsigned long w, h; w = get_bytes(fp, n); h = get_bytes(fp, n); /* bitmap.w and bitmap.h are of type `unsigned short', so check for possible overflow here. USHRT_MAX should be sufficient, since a character of 30pt at 1200dpi requires about 560 x 560 pixels; and the maximum bitmap of size USHRT_MAX * USHRT_MAX would consume USHRT_MAX * USHRT_MAX / 8 bytes ~= 530MB of RAM (per character/font!) */ if (w > USHRT_MAX || h > USHRT_MAX) XDVI_FATAL((stderr, "Character %d too large (%ld x %ld, max is %d x %d) in file %s", ch, w, h, USHRT_MAX, USHRT_MAX, fontp->fontname)); g->bitmap.w = w; g->bitmap.h = h; } g->x = get_lbytes(fp, n); g->y = get_lbytes(fp, n); g->dvi_adv = fontp->dimconv * fpwidth; if (globals.debug & DBG_PK) { if (g->bitmap.w != 0) printf(", size=%dx%d, dvi_adv=%ld", g->bitmap.w, g->bitmap.h, g->dvi_adv); putchar('\n'); } alloc_bitmap(&g->bitmap); cp = (bmUnitT *) g->bitmap.bits; /* * read character data into *cp */ bytes_wide = ROUNDUP((int)g->bitmap.w, BMBITS) * BMBYTES; PK_bitpos = -1; if (PK_dyn_f == 14) { /* get raster by bits */ memset(g->bitmap.bits, 0, (int)g->bitmap.h * bytes_wide); for (i = 0; i < (int)g->bitmap.h; i++) { /* get all rows */ cp = ADD(g->bitmap.bits, i * bytes_wide); #ifndef WORDS_BIGENDIAN row_bit_pos = -1; #else row_bit_pos = BMBITS; #endif for (j = 0; j < (int)g->bitmap.w; j++) { /* get one row */ if (--PK_bitpos < 0) { word = get_byte(fp); PK_bitpos = 7; } #ifndef WORDS_BIGENDIAN if (++row_bit_pos >= BMBITS) { cp++; row_bit_pos = 0; } #else if (--row_bit_pos < 0) { cp++; row_bit_pos = BMBITS - 1; } #endif if (word & (1 << PK_bitpos)) *cp |= 1 << row_bit_pos; } } } else { /* get packed raster */ rows_left = g->bitmap.h; h_bit = g->bitmap.w; PK_repeat_count = 0; word_weight = BMBITS; word = 0; while (rows_left > 0) { count = PK_packed_num(fp); while (count > 0) { if (count < word_weight && count < h_bit) { #ifndef WORDS_BIGENDIAN if (paint_switch) word |= bit_masks[count] << (BMBITS - word_weight); #endif h_bit -= count; word_weight -= count; #ifdef WORDS_BIGENDIAN if (paint_switch) word |= bit_masks[count] << word_weight; #endif count = 0; } else if (count >= h_bit && h_bit <= word_weight) { if (paint_switch) word |= bit_masks[h_bit] << #ifndef WORDS_BIGENDIAN (BMBITS - word_weight); #else (word_weight - h_bit); #endif *cp++ = word; /* "output" row(s) */ for (i = PK_repeat_count * bytes_wide / BMBYTES; i > 0; --i) { *cp = *SUB(cp, bytes_wide); ++cp; } rows_left -= PK_repeat_count + 1; PK_repeat_count = 0; word = 0; word_weight = BMBITS; count -= h_bit; h_bit = g->bitmap.w; } else { if (paint_switch) #ifndef WORDS_BIGENDIAN word |= bit_masks[word_weight] << (BMBITS - word_weight); #else word |= bit_masks[word_weight]; #endif *cp++ = word; word = 0; count -= word_weight; h_bit -= word_weight; word_weight = BMBITS; } } paint_switch = 1 - paint_switch; } if (cp != ((bmUnitT *) (g->bitmap.bits + bytes_wide * g->bitmap.h))) XDVI_FATAL((stderr, "Wrong number of bits stored: char. %d, font %s", ch, fontp->fontname)); if (rows_left != 0 || h_bit != g->bitmap.w) XDVI_FATAL((stderr, "Bad pk file (%s), too many bits", fontp->fontname)); } } void read_PK_index(struct font *fontp, wide_bool hushcs) { int hppp, vppp; long checksum; fontp->read_char = read_PK_char; if (globals.debug & DBG_PK) printf("Reading PK pixel file %s\n", fontp->filename); fseek(fontp->file, (long)get_byte(fontp->file), SEEK_CUR); /* skip comment */ (void)get_bytes(fontp->file, 4); /* skip design size */ checksum = get_bytes(fontp->file, 4); if (checksum != fontp->checksum && checksum != 0 && fontp->checksum != 0 && !hushcs) XDVI_WARNING((stderr, "Checksum mismatch (dvi = %lu, pk = %lu) in font file %s", fontp->checksum, checksum, fontp->filename)); hppp = get_lbytes(fontp->file, 4); vppp = get_lbytes(fontp->file, 4); if (hppp != vppp && (globals.debug & DBG_PK)) printf("Font has non-square aspect ratio %d:%d\n", vppp, hppp); /* * Prepare glyph array. */ fontp->glyph = xmalloc(256 * sizeof(struct glyph)); memset((char *)fontp->glyph, 0, 256 * sizeof(struct glyph)); /* * Read glyph directory (really a whole pass over the file). */ for (;;) { int bytes_left, flag_low_bits; unsigned int ch; PK_skip_specials(fontp); if (PK_flag_byte == PK_POST) break; flag_low_bits = PK_flag_byte & 0x7; if (flag_low_bits == 7) { bytes_left = get_bytes(fontp->file, 4); ch = get_bytes(fontp->file, 4); } else if (flag_low_bits > 3) { bytes_left = ((flag_low_bits - 4) << 16) + get_bytes(fontp->file, 2); ch = get_byte(fontp->file); } else { bytes_left = (flag_low_bits << 8) + get_byte(fontp->file); ch = get_byte(fontp->file); } fontp->glyph[ch].addr = ftell(fontp->file); fontp->glyph[ch].x2 = PK_flag_byte; #ifdef linux # ifndef SHORTSEEK # define SHORTSEEK 2048 # endif /* A bug in Linux libc (as of 18oct94) makes a short read faster than a short forward seek. Totally non-intuitive. */ if (bytes_left > 0 && bytes_left < SHORTSEEK) { char *dummy = xmalloc(bytes_left); (void)fread(dummy, 1, bytes_left, fontp->file); free(dummy); } else /* seek backward, or long forward */ #endif /* linux */ fseek(fontp->file, (long)bytes_left, SEEK_CUR); if (globals.debug & DBG_PK) printf("Scanning pk char %u, at %ld.\n", ch, fontp->glyph[ch].addr); } } xdvik-ja-22.84.16-j1.40/texk/xdvik/my-vsnprintf.h0000664000175000017500000000345611032450154021013 0ustar uwabamiuwabami/*------------------------------------------------------------ written by S. Ulrich (ulrich@cis.uni-muenchen.de) 2001/02/25 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. ------------------------------------------------------------*/ #ifndef MY_VSNPRINTF_H__ #define MY_VSNPRINTF_H__ #include "xdvi-config.h" #include "xdvi.h" #if HAVE_VSNPRINTF && HAVE_GOOD_VSNPRINTF #include #include #define VSNPRINTF(buf, len, format, args) vsnprintf(buf, len, format, args) #else /* HAVE_VSNPRINTF && HAVE_GOOD_VSNPRINTF */ #include /* for pipe() */ #include "util.h" /* for xpipe() etc. */ extern int my_vsnprintf(char *, size_t, const char *, va_list); #define VSNPRINTF(buf, len, format, args) my_vsnprintf(buf, len, format, args) #endif /* HAVE_VSNPRINTF && HAVE_GOOD_VSNPRINTF */ #endif /* MY_VSNPRINTF_H__ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/xdvi.c0000664000175000017500000031565611032450154017314 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1990-2004 Paul Vojta and others 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. NOTE: xdvi is based on prior work as noted in the modification history, below. \*========================================================================*/ /* * DVI previewer for X. * * Eric Cooper, CMU, September 1985. * * Code derived from dvi-imagen.c. * * Modification history: * 1/1986 Modified for X.10 --Bob Scheifler, MIT LCS. * 7/1988 Modified for X.11 --Mark Eichin, MIT * 12/1988 Added 'R' option, toolkit, magnifying glass * --Paul Vojta, UC Berkeley. * 2/1989 Added tpic support --Jeffrey Lee, U of Toronto * 4/1989 Modified for System V --Donald Richardson, Clarkson Univ. * 3/1990 Added VMS support --Scott Allendorf, U of Iowa * 7/1990 Added reflection mode --Michael Pak, Hebrew U of Jerusalem * 1/1992 Added greyscale code --Till Brychcy, Techn. Univ. Muenchen * and Lee Hetherington, MIT * 7/1992 Added extra menu buttons--Nelson H. F. Beebe * 4/1994 Added DPS support, bounding box * --Ricardo Telichevesky * and Luis Miguel Silveira, MIT RLE. * 2/1995 Added rulers support --Nelson H. F. Beebe * 1/2001 Added source specials --including ideas from Stefan Ulrich, * U Munich * * Compilation options: * * VMS compile for VMS * WORDS_BIGENDIAN store bitmaps internally with most significant bit first * BMTYPE store bitmaps in unsigned BMTYPE * BMBYTES sizeof(unsigned BMTYPE) * ALTFONT default for -altfont option * SHRINK default for -s option (shrink factor) * MFMODE default for -mfmode option * A4 use European size paper, and change default dimension to cm * TEXXET support reflection dvi codes (right-to-left typesetting) * GREY use grey levels to shrink fonts * PS_GS use Ghostscript to render pictures/bounding boxes * PS_DPS use display postscript to render pictures/bounding boxes * PS_NEWS use the NeWS server to render pictures/bounding boxes * GS_PATH path to call the Ghostscript interpreter by * MAGICK use ImageMagick to render (external) image files */ #include "xdvi-config.h" #include "xdvi.h" #include "version.h" /* Xlib and Xutil are already included */ #include #include #include #include #include /* needed for def. of XtNiconX */ #ifdef HAVE_X11_XMU_EDITRES_H # include #endif /* to allow one common dependency file for Xaw/Motif, we always include all the headers and have #ifdef MOTIF tests inside the headers. */ #if defined(NEW_MENU_CREATION) || defined(MOTIF) #include "menu.h" #else #include "xm_menu.h" #include "xaw_menu.h" #endif /* NEW_MENU_CREATION */ #include "xm_toolbar.h" #ifdef T1LIB #include "t1lib.h" #endif /* T1LIB */ #ifdef MOTIF # include # include # include # include # include # include # include # include # include # include # include # include # include # include # ifdef MOTIF11 /* FIXME: We'll probably need a config check for this? */ /* used to set up XmStrings */ XmStringCharSet G_charset = (XmStringCharSet)XmSTRING_DEFAULT_CHARSET; # else XmStringCharSet G_charset = XmFONTLIST_DEFAULT_TAG; # endif #else /* MOTIF */ # include # include # include # include # include # include # include # include # include #endif /* MOTIF */ #include #include #include #include "xserver-info.h" #include "kpathsea/c-fopen.h" #include "kpathsea/c-pathch.h" #include "kpathsea/c-stat.h" #include "kpathsea/progname.h" #include "kpathsea/tex-file.h" #include "kpathsea/tex-hush.h" #include "kpathsea/tex-make.h" #include "string-utils.h" #include "kpathsea/c-errno.h" #include "translations.h" #include "dvi-init.h" #include "c-openmx.h" #include "xicon.h" #include "x_util.h" #include "message-window.h" #include "events.h" #include "mag.h" #include "pagesel.h" #include "dvi-draw.h" #include "statusline.h" #include "util.h" #include "hypertex.h" #include "xaw_menu.h" #include "xdvi-debug.h" #include "pagehist.h" #include "filehist.h" #include "print-internal.h" #include "exit-handlers.h" #include "xm_prefsP.h" /* for Xdvi_PREFS_BROWSER_DEFAULTS and Xdvi_PREFS_EDITOR_DEFAULTS */ #ifdef VMS # include "pixmaps/hand.xbm" # include "pixmaps/hand_mask.xbm" #endif #include "pixmaps/magglass.xbm" #include "pixmaps/magglass_mask.xbm" #ifdef DEBUG #include unsigned long time_start=0, time_end=0; #endif #ifdef MOTIF #include #else /* MOTIF */ /* need to fake it */ /* bit definitions for MwmHints.flags */ #define MWM_HINTS_FUNCTIONS (1L << 0) #define MWM_HINTS_DECORATIONS (1L << 1) #define MWM_HINTS_INPUT_MODE (1L << 2) #define MWM_HINTS_STATUS (1L << 3) /* bit definitions for MwmHints.decorations */ #define MWM_DECOR_ALL (1L << 0) #define MWM_DECOR_BORDER (1L << 1) #define MWM_DECOR_RESIZEH (1L << 2) #define MWM_DECOR_TITLE (1L << 3) #define MWM_DECOR_MENU (1L << 4) #define MWM_DECOR_MINIMIZE (1L << 5) #define MWM_DECOR_MAXIMIZE (1L << 6) struct PropMotifWmHints { unsigned long flags; unsigned long functions; unsigned long decorations; long inputMode; unsigned long status; }; #define PROP_MOTIF_WM_HINTS_ELEMENTS 5 #endif /* MOTIF */ char *dvi_property; /* for setting in window */ size_t dvi_property_length; /* length of above, for efficiency */ XImage *G_image; int G_backing_store; Display *DISP; Screen *SCRN; XtAccelerators G_accels_cr; #ifdef GREY Visual *G_visual; unsigned int G_depth; Colormap G_colormap; #else # define G_depth (unsigned int) DefaultDepthOfScreen(SCRN) # define G_visual DefaultVisualOfScreen(SCRN) # define G_colormap DefaultColormapOfScreen(SCRN) #endif /* global widgets */ #if defined(MOTIF) Widget page_list, page_list_scroll; #if USE_XAW_PANNER #include "Panner.h" Widget panner; static Dimension g_save_shadow_thickness; #endif #endif static Atom mainDeleteWindow; #ifndef MOTIF static Atom wmProtocols; static void handle_delete_message(Widget widget, XtPointer closure, XEvent *event, Boolean *cont) { UNUSED(cont); UNUSED(widget); ASSERT(closure == NULL, "handle_delete_message doesn't accept a non-NULL closure argument"); if (event->type == ClientMessage && event->xclient.message_type == wmProtocols && (unsigned)(event->xclient.data.l[0]) == mainDeleteWindow) { /* non-k xdvi also evaluates closure, but we don't, since it's a function pointer which isn't convertible to void * in ANSI C */ xdvi_exit(EXIT_SUCCESS); } } #endif #ifdef TEST_SCROLLING #warning ========== compiling with TEST_SCROLLING ========== #endif /* for measuring distance from the ruler */ int g_ruler_pos_x, g_ruler_pos_y; Boolean ignore_papersize_specials = False; #ifndef ALTFONT # define ALTFONT "cmr10" #endif #ifndef SHRINK # define SHRINK 8 #endif #ifndef MFMODE # define MFMODE NULL #endif #undef MKTEXPK #define MKTEXPK MAKEPK #if defined(PS_GS) && !defined(GS_PATH) # define GS_PATH "gs" #endif static Dimension bwidth = 2; struct x_resources resource; struct program_globals globals; /* color of cursor */ static XColor m_cursor_color; struct WindowRec mane = { (Window) 0, 1, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0 }; /* currwin is temporary storage except for within redraw() */ struct WindowRec currwin = { (Window) 0, 1, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0 }; #define offset(field) XtOffsetOf(struct x_resources, field) static int base_tick_length = 4; static char XtRBool3[] = "Bool3"; /* resource for Bool3 */ static XtResource application_resources[] = { {"regression", "Regression", XtRBoolean, sizeof(Boolean), offset(regression), XtRString, "false"}, {"geometry", "Geometry", XtRString, sizeof(char *), offset(geometry), XtRString, (XtPointer) NULL}, {"windowSize", "WindowSize", XtRString, sizeof(char *), offset(windowsize), XtRString, (XtPointer) NULL}, {"rememberWindowSize", "RememberWindowSize", XtRBoolean, sizeof(Boolean), offset(remember_windowsize), XtRString, "false"}, /* used to check whether app-defaults file is out of sync. Initialize to a low default value (one before the resource was introduced) */ {"appDefaultsFileVersion", "AppDefaultsFileVersion", XtRInt, sizeof(int), offset(app_defaults_fileversion), XtRImmediate, (XtPointer)20030302 }, {"shrinkFactor", "ShrinkFactor", XtRInt, sizeof(int), offset(shrinkfactor), XtRImmediate, (XtPointer) SHRINK}, {"delayRulers", "DelayRulers", XtRBoolean, sizeof(Boolean), offset(delay_rulers), XtRString, "true"}, {"useTeXPages", "UseTeXPages", XtRBoolean, sizeof(Boolean), offset(use_tex_pages), XtRString, "false"}, {"densityPercent", "DensityPercent", XtRInt, sizeof(int), offset(density), XtRString, "40"}, {"omega", "Omega", XtRBoolean, sizeof(Boolean), offset(omega), XtRString, "true"}, {"mainTranslations", "MainTranslations", XtRString, sizeof(char *), offset(main_translations), XtRString, (XtPointer) NULL}, {"mouseTranslations", "MouseTranslations", XtRString, sizeof(char *), offset(mouse_translations), XtRString, (XtPointer) NULL }, {"wheelUnit", "WheelUnit", XtRInt, sizeof(int), offset(wheel_unit), XtRImmediate, (XtPointer) 80}, {"mouseMode", "MouseMode", XtRInt, sizeof(int), offset(mouse_mode), XtRImmediate, (XtPointer) MOUSE_MODE1 }, {"mouseMode1Name", "MouseMode1Name", XtRString, sizeof(char *), offset(mouse_mode1_name), XtRString, (XtPointer) "Magnifier"}, {"mouseMode1Description", "MouseMode1Description", XtRString, sizeof(char *), offset(mouse_mode1_description), XtRString, (XtPointer) "click to enlarge text"}, {"mouseMode1Cursor", "MouseMode1Cursor", XtRInt, sizeof(int), offset(mouse_mode1_cursor), XtRImmediate, (XtPointer) -1}, {"mouseMode2Name", "MouseMode2Name", XtRString, sizeof(char *), offset(mouse_mode2_name), XtRString, (XtPointer) "Text Selection"}, {"mouseMode2Description", "MouseMode2Description", XtRString, sizeof(char *), offset(mouse_mode2_description), XtRString, (XtPointer) "click and drag to select a region of text"}, {"mouseMode2Cursor", "MouseMode2Cursor", XtRInt, sizeof(int), offset(mouse_mode2_cursor), XtRImmediate, (XtPointer) XC_cross }, {"mouseMode3Name", "MouseMode3Name", XtRString, sizeof(char *), offset(mouse_mode3_name), XtRString, (XtPointer) "Ruler"}, {"mouseMode3Description", "MouseMode3Description", XtRString, sizeof(char *), offset(mouse_mode3_description), XtRString, (XtPointer) "click and drag to set/move ruler"}, {"mouseMode3Cursor", "MouseMode3Cursor", XtRInt, sizeof(int), offset(mouse_mode3_cursor), XtRImmediate, (XtPointer) XC_crosshair }, #ifdef GREY {"gamma", "Gamma", XtRFloat, sizeof(float), offset(gamma), XtRString, "1"}, /* {"invertedFactor", "InvertedFactor", XtRFloat, sizeof(float), */ /* offset(inverted_factor), XtRString, "3.0"}, */ #endif {"pixelsPerInch", "PixelsPerInch", XtRInt, sizeof(int), offset(pixels_per_inch), XtRImmediate, (XtPointer) BDPI}, {"sideMargin", "Margin", XtRString, sizeof(char *), offset(sidemargin), XtRString, (XtPointer) NULL}, {"tickLength", "TickLength", XtRInt, sizeof(int), offset(tick_length), XtRInt, (XtPointer) &base_tick_length}, {"tickUnits", "TickUnits", XtRString, sizeof(char *), offset(tick_units), XtRString, "mm"}, {"topMargin", "Margin", XtRString, sizeof(char *), offset(topmargin), XtRString, (XtPointer) NULL}, {"xOffset", "Offset", XtRString, sizeof(char *), offset(xoffset), XtRString, (XtPointer) NULL}, {"yOffset", "Offset", XtRString, sizeof(char *), offset(yoffset), XtRString, (XtPointer) NULL}, {"useCurrentOffset", "UseCurrentOffset", XtRBoolean, sizeof(Boolean), offset(use_current_offset), XtRString, "False" }, {"paper", "Paper", XtRString, sizeof(char *), offset(paper), XtRString, (XtPointer) DEFAULT_PAPER}, {"paperLandscape", "PaperLandscape", XtRBoolean, sizeof(Boolean), offset(paper_landscape), XtRString, "false"}, {"altFont", "AltFont", XtRString, sizeof(char *), offset(alt_font), XtRString, (XtPointer) ALTFONT}, {"makePk", "MakePk", XtRBoolean, sizeof(Boolean), offset(makepk), XtRString, #ifdef MAKE_TEX_PK_BY_DEFAULT "true" #else "false" #endif }, {"mfMode", "MfMode", XtRString, sizeof(char *), offset(mfmode), XtRString, MFMODE}, {"editor", "Editor", XtRString, sizeof(char *), offset(editor), XtRString, (XtPointer) NULL}, #ifdef T1LIB {"t1lib", "T1lib", XtRBoolean, sizeof(Boolean), offset(t1lib), XtRString, "true"}, #endif {"sourcePosition", "SourcePosition", XtRString, sizeof(char *), offset(src_pos), XtRString, (XtPointer) NULL}, {"findString", "FindString", XtRString, sizeof(char *), offset(find_string), XtRString, (XtPointer) NULL}, {"textEncoding", "TextEncoding", XtRString, sizeof(char *), offset(text_encoding), XtRString, (XtPointer) NULL}, {"fork", "Fork", XtRBoolean, sizeof(Boolean), offset(src_fork), XtRString, "true"}, #ifdef RGB_ANTI_ALIASING {"subPixels", "SubPixels", XtRString, sizeof(char *), offset(sub_pixels), XtRString, "Unknown"}, #endif {"noFileArgUseHistory", "NoFileArgUseHistory", XtRBoolean, sizeof(Boolean), offset(no_file_arg_use_history), XtRString, "true"}, {"fileHistory", "FileHistory", XtRString, sizeof(char *), offset(file_history), XtRString, (XtPointer) NULL}, {"fileHistorySize", "FileHistorySize", XtRInt, sizeof(int), offset(file_history_size), XtRImmediate, (XtPointer)20}, {"unique", "Unique", XtRBoolean, sizeof(Boolean), offset(unique), XtRString, "false"}, {"listFonts", "ListFonts", XtRBoolean, sizeof(Boolean), offset(list_fonts), XtRString, "false"}, {"reverseVideo", "ReverseVideo", XtRBoolean, sizeof(Boolean), offset(reverse), XtRString, "false"}, {"warnSpecials", "WarnSpecials", XtRBoolean, sizeof(Boolean), offset(warn_spec), XtRString, "false"}, {"hush", "Hush", XtRBoolean, sizeof(Boolean), offset(hush), XtRString, "false"}, {"hushLostChars", "HushLostChars", XtRBoolean, sizeof(Boolean), offset(hush_chars), XtRString, "false"}, {"hushChecksums", "HushChecksums", XtRBoolean, sizeof(Boolean), offset(hush_chk), XtRString, "false"}, {"hushStdout", "HushStdout", XtRBoolean, sizeof(Boolean), offset(hush_stdout), XtRString, "false"}, {"hushBell", "HushBell", XtRBoolean, sizeof(Boolean), offset(hush_bell), XtRString, "false"}, {"safer", "Safer", XtRBoolean, sizeof(Boolean), offset(safer), XtRString, "false"}, #ifdef VMS {"foreground", "Foreground", XtRString, sizeof(char *), offset(fore_color), XtRString, (XtPointer) NULL}, {"background", "Background", XtRString, sizeof(char *), offset(back_color), XtRString, (XtPointer) NULL}, #endif {"iconGeometry", "IconGeometry", XtRString, sizeof(char *), offset(icon_geometry), XtRString, (XtPointer) NULL}, {"keepPosition", "KeepPosition", XtRBoolean, sizeof(Boolean), offset(keep_flag), XtRString, "false"}, #ifdef PS {"postscript", "Postscript", XtRInt, sizeof(int), offset(postscript), XtRImmediate, (XtPointer)1}, {"allowShell", "AllowShell", XtRBoolean, sizeof(Boolean), offset(allow_shell), XtRString, "false"}, # ifdef PS_DPS {"dps", "DPS", XtRBoolean, sizeof(Boolean), offset(useDPS), XtRString, "true"}, # endif # ifdef PS_NEWS {"news", "News", XtRBoolean, sizeof(Boolean), offset(useNeWS), XtRString, "true"}, # endif # ifdef PS_GS {"ghostscript", "Ghostscript", XtRBoolean, sizeof(Boolean), offset(useGS), XtRString, "true"}, {"gsSafer", "Safer", XtRBoolean, sizeof(Boolean), offset(gs_safer), XtRString, "true"}, {"gsAlpha", "Alpha", XtRBoolean, sizeof(Boolean), offset(gs_alpha), XtRString, "false"}, {"interpreter", "Interpreter", XtRString, sizeof(char *), offset(gs_path), XtRString, (XtPointer) GS_PATH}, {"palette", "Palette", XtRString, sizeof(char *), offset(gs_palette), XtRString, (XtPointer) "Color"}, {"gsTimeout", "GSTimeout", XtRInt, sizeof(int), offset(gs_timeout), XtRImmediate, (XtPointer)3000}, # endif /* PS_GS */ # ifdef MAGICK {"magick", "ImageMagick", XtRBoolean, sizeof(Boolean), offset(useMAGICK), XtRString, "true"}, {"magick_cache", "MagickCache", XtRString, sizeof(char *), offset(magick_cache), XtRString, (XtPointer) NULL}, # endif #endif /* PS */ {"prescan", "Prescan", XtRBoolean, sizeof(Boolean), offset(prescan), XtRString, "true"}, {"tempFile", "TempFile", XtRBoolean, sizeof(Boolean), offset(use_temp_fp), XtRString, "true"}, {"copy", "Copy", XtRBoolean, sizeof(Boolean), offset(copy), XtRString, "false"}, {"thorough", "Thorough", XtRBoolean, sizeof(Boolean), offset(thorough), XtRString, "false"}, {"fullscreen", "Fullscreen", XtRBoolean, sizeof(Boolean), offset(fullscreen), XtRString, "false"}, {"pause", "Pause", XtRBoolean, sizeof(Boolean), offset(pause), XtRString, "false"}, {"pauseSpecial", "PauseSpecial", XtRString, sizeof(char *), offset(pause_special), XtRString, (XtPointer)"xdvi:pause"}, {"debugLevel", "DebugLevel", XtRString, sizeof(char *), offset(debug_arg), XtRString, (XtPointer) NULL}, {"menuTranslations", "MenuTranslations", XtRString, sizeof(char *), offset(menu_translations), XtRString, (XtPointer) default_menu_config}, {"watchFile", "WatchFile", XtRFloat, sizeof(float), offset(watch_file), XtRString, "0"}, {"expert", "Expert", XtRBoolean, sizeof(Boolean), offset(expert), XtRString, (XtPointer) NULL}, {"expertMode", "ExpertMode", XtRInt, sizeof(int), offset(expert_mode), XtRImmediate, (XtPointer)31 /* everything on */ }, #ifndef MOTIF {"buttonSideSpacing", "ButtonSpacing", XtRDimension, sizeof(Dimension), offset(btn_side_spacing), XtRImmediate, (XtPointer) 8}, {"buttonTopSpacing", "ButtonSpacing", XtRDimension, sizeof(Dimension), offset(btn_top_spacing), XtRImmediate, (XtPointer) 16}, {"buttonBetweenSpacing", "ButtonSpacing", XtRDimension, sizeof(Dimension), offset(btn_between_spacing), XtRImmediate, (XtPointer) 8}, /* only used if menus consist of buttons only */ {"buttonBetweenExtra", "ButtonSpacing", XtRDimension, sizeof(Dimension), offset(btn_between_extra), XtRImmediate, (XtPointer)16}, {"buttonBorderWidth", "BorderWidth", XtRDimension, sizeof(Dimension), offset(btn_border_width), XtRImmediate, (XtPointer) 1}, #endif /* MOTIF */ {"statusline", "Statusline", XtRBoolean, sizeof(Boolean), offset(statusline), XtRString, (XtPointer) NULL}, #ifdef MOTIF {"toolbarTranslations", "ToolbarTranslations", XtRString, sizeof(char *), offset(toolbar_translations), XtRString, (XtPointer) default_toolbar_translations}, {"toolbarPixmapFile", "ToolbarPixmapFile", XtRString, sizeof(char *), offset(toolbar_pixmap_file), XtRString, (XtPointer) "toolbar.xpm"}, {"toolbarButtonsRaised", "ToolbarButtonsRaised", XtRBoolean, sizeof(Boolean), offset(toolbar_buttons_raised), XtRString, "True"}, {"tooltipsInStatusline", "TooltipsInStatusline", XtRBoolean, sizeof(Boolean), offset(tooltips_in_statusline), XtRString, "True"}, {"showTooltips", "ShowTooltips", XtRBoolean, sizeof(Boolean), offset(show_tooltips), XtRString, "True"}, #endif /* MOTIF */ {"pageListHighlightCurrent", "PageListHighlightCurrent", XtRBoolean, sizeof(Boolean), offset(pagelist_highlight_current), XtRString, "True"}, {"pageListWidth", "PageListWidth", XtRDimension, sizeof(Dimension), offset(pagelist_width), XtRImmediate, (XtPointer) 80}, {"magnifierSize1", "MagnifierSize", XtRString, sizeof(char *), offset(mg_arg[0]), XtRString, (XtPointer) NULL}, {"magnifierSize2", "MagnifierSize", XtRString, sizeof(char *), offset(mg_arg[1]), XtRString, (XtPointer) NULL}, {"magnifierSize3", "MagnifierSize", XtRString, sizeof(char *), offset(mg_arg[2]), XtRString, (XtPointer) NULL}, {"magnifierSize4", "MagnifierSize", XtRString, sizeof(char *), offset(mg_arg[3]), XtRString, (XtPointer) NULL}, {"magnifierSize5", "MagnifierSize", XtRString, sizeof(char *), offset(mg_arg[4]), XtRString, (XtPointer) NULL}, #if COLOR {"color", "Color", XtRBoolean, sizeof(Boolean), offset(use_color), XtRString, "true"}, #endif /* COLOR */ {"dvipsPath", "DvipsPath", XtRString, sizeof(char *), offset(dvips_path), XtRString, (XtPointer)DEFAULT_DVIPS_PATH}, {"ps2pdfPath", "Ps2PdfPath", XtRString, sizeof(char *), offset(ps2pdf_path), XtRString, (XtPointer)DEFAULT_PS2PDF_PATH}, {"dvipsHangTime", "DvipsHangTime", XtRInt, sizeof(int), offset(dvips_hang), XtRImmediate, (XtPointer) -1500}, {"dvipsFailHangTime", "DvipsFailHangTime", XtRInt, sizeof(int), offset(dvips_fail_hang), XtRImmediate, (XtPointer) -5000}, {"dvipsPrinterString", "DvipsPrinterString", XtRString, sizeof(char *), offset(dvips_printer_str), XtRString, (XtPointer)NULL}, {"dvipsOptionsString", "DvipsOptionsString", XtRString, sizeof(char *), offset(dvips_options_str), XtRString, (XtPointer)NULL}, {"defaultSavingFormat", "DefaultSavingFormat", XtRInt, sizeof(int), offset(default_saving_format), XtRImmediate, (XtPointer)0}, {"defaultPrintingTarget", "DefaultPrintingTarget", XtRInt, sizeof(int), offset(default_printing_target), XtRImmediate, (XtPointer)1}, #ifdef GREY {"grey", "Grey", XtRBoolean, sizeof(Boolean), offset(use_grey), XtRString, "true"}, {"install", "Install", XtRBool3, sizeof(Bool3), offset(install), XtRString, "maybe"}, #endif /* GREY */ {"matchInverted", "MatchInverted", XtRBoolean, sizeof(Boolean), offset(match_highlight_inverted), XtRString, "true"}, {"ruleColor", "RuleColor", XtRPixel, sizeof(Pixel), offset(rule_pixel), XtRPixel, (XtPointer) &resource.rule_pixel}, {"ruleColor", "RuleColor", XtRString, sizeof(char *), offset(rule_color), XtRString, (XtPointer) NULL}, /* linkStyle: style for presenting links: link_style is a bitsmask `xy' with x = color, y = underline, viz.: 0: no highlighting at all 1: underline with linkColor 2: no underlining, text with linkColor 3: underlining and text with linkColor */ {"linkStyle", "LinkStyle", XtRInt, sizeof(int), offset(link_style), XtRImmediate, (XtPointer) 3}, {"linkColor", "LinkColor", XtRString, sizeof(char *), offset(link_color), XtRString, (XtPointer)LINK_COLOR_FALLBACK}, {"visitedLinkColor", "VisitedLinkColor", XtRString, sizeof(char *), offset(visited_link_color), XtRString, (XtPointer)VISITED_LINK_COLOR_FALLBACK}, {"wwwBrowser", "WWWBrowser", XtRString, sizeof(char *), offset(browser), XtRString, (XtPointer) NULL}, #ifdef MOTIF {"prefsBrowserList", "PrefsBrowserList", XtRString, sizeof(char *), offset(prefs_browser_list), XtRString, (XtPointer)Xdvi_PREFS_BROWSER_DEFAULTS }, {"prefsEditorList", "PrefsEditorList", XtRString, sizeof(char *), offset(prefs_editor_list), XtRString, (XtPointer)Xdvi_PREFS_EDITOR_DEFAULTS }, # if USE_COMBOBOX {"searchHistory", "SearchHistory", XtRString, sizeof(char *), offset(search_history), XtRString, (XtPointer)NULL }, {"searchHistorySize", "SearchHistorySize", XtRInt, sizeof(int), offset(search_history_size), XtRImmediate, (XtPointer)20}, # endif #endif /* defaults for unknown mime types */ {"unknownMimeSuffix", "UnknownMimeSuffix", XtRString, sizeof(char *), offset(unknown_mime_suffix), XtRString, "application/x-unknown"}, {"noMimeSuffix", "NoMimeSuffix", XtRString, sizeof(char *), offset(no_mime_suffix), XtRString, "application/x-unknown"}, {"anchorPosition", "AnchorPosition", XtRString, sizeof(char *), offset(anchor_pos), XtRString, (XtPointer) NULL}, /* bitmask for current search window settings; only used internally! */ {"searchWindowDefaults", "SearchWindowDefaults", XtRInt, sizeof(int), offset(search_window_defaults), XtRImmediate, (XtPointer)0}, /* whether to open file in new window from file selector (only for DVI files) */ {"fileselOpenNewWindow", "FileselOpenNewWindow", XtRBoolean, sizeof(Boolean), offset(filesel_open_new_window), XtRString, "False"}, /* resources for help text */ {"helpGeneral", "HelpGeneral", XtRString, sizeof(char *), offset(help_general), XtRString, NULL}, {"helpHypertex", "HelpHypertex", XtRString, sizeof(char *), offset(help_hypertex), XtRString, NULL}, {"helpOthercommands", "HelpOthercommands", XtRString, sizeof(char *), offset(help_othercommands), XtRString, NULL}, {"helpMarking", "HelpMarking", XtRString, sizeof(char *), offset(help_marking), XtRString, NULL}, {"helpPagemotion", "HelpPagemotion", XtRString, sizeof(char *), offset(help_pagemotion), XtRString, NULL}, {"helpMousebuttons", "HelpMousebuttons", XtRString, sizeof(char *), offset(help_mousebuttons), XtRString, NULL}, {"helpModes", "HelpModes", XtRString, sizeof(char *), offset(help_modes), XtRString, NULL}, {"helpSearch", "HelpSearch", XtRString, sizeof(char *), offset(help_search), XtRString, NULL}, {"helpSourcespecials", "HelpSoucespecials", XtRString, sizeof(char *), offset(help_sourcespecials), XtRString, NULL}, #ifdef GREY {"pageHistorySize", "PageHistorySize", XtRInt, sizeof(int), offset(page_history_size), XtRImmediate, (XtPointer)1000}, }; static XtResource app_pixel_resources[] = { /* get these later */ #endif /* GREY */ {"foreground", "Foreground", XtRPixel, sizeof(Pixel), offset(fore_Pixel), XtRString, XtDefaultForeground}, {"background", "Background", XtRPixel, sizeof(Pixel), offset(back_Pixel), XtRString, XtDefaultBackground}, /* {"borderColor", "BorderColor", XtRPixel, sizeof(Pixel), */ /* offset(brdr_Pixel), XtRPixel, (XtPointer) &resource.fore_Pixel}, */ {"highlight", "Highlight", XtRPixel, sizeof(Pixel), offset(hl_Pixel), XtRPixel, (XtPointer) &resource.fore_Pixel}, {"cursorColor", "CursorColor", XtRPixel, sizeof(Pixel), offset(cr_Pixel), XtRImmediate, (XtPointer)ULONG_MAX}, }; #undef offset #ifndef MOTIF # ifdef NOQUERY # define drawWidgetClass widgetClass # else static XtGeometryResult QueryGeometry(Widget w, XtWidgetGeometry *constraints, XtWidgetGeometry *reply) { UNUSED(w); UNUSED(constraints); reply->request_mode = CWWidth | CWHeight; reply->width = globals.page.w; reply->height = globals.page.h; return XtGeometryAlmost; } # include # include /* if the following gives you trouble, just compile with -DNOQUERY */ static WidgetClassRec drawingWidgetClass = { { /* superclass */ &widgetClassRec, /* class_name */ "Draw", /* widget_size */ sizeof(WidgetRec), /* class_initialize */ NULL, /* class_part_initialize */ NULL, /* class_inited */ FALSE, /* initialize */ NULL, /* initialize_hook */ NULL, /* realize */ XtInheritRealize, /* actions */ NULL, /* num_actions */ 0, /* resources */ NULL, /* num_resources */ 0, /* xrm_class */ NULLQUARK, /* compress_motion */ FALSE, /* compress_exposure */ TRUE, /* compress_enterleave */ FALSE, /* visible_interest */ FALSE, /* destroy */ NULL, /* resize */ XtInheritResize, /* expose */ XtInheritExpose, /* set_values */ NULL, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ XtInheritAcceptFocus, /* version */ XtVersion, /* callback_offsets */ NULL, /* tm_table */ XtInheritTranslations, /* query_geometry */ QueryGeometry, /* display_accelerator */ XtInheritDisplayAccelerator, /* extension */ NULL } }; # define drawWidgetClass &drawingWidgetClass # endif /* NOQUERY */ #endif /* not MOTIF */ int atopix(const char *arg, Boolean allow_minus) { int len = strlen(arg); const char *arg_end = arg; char tmp[11]; double factor; if (allow_minus && *arg_end == '-') ++arg_end; while ((*arg_end >= '0' && *arg_end <= '9') || *arg_end == '.') if (arg_end >= arg + XtNumber(tmp) - 1) return 0; else ++arg_end; memcpy(tmp, arg, arg_end - arg); tmp[arg_end - arg] = '\0'; #if A4 factor = 1.0 / 2.54; /* cm */ #else factor = 1.0; /* inches */ #endif if (len > 2) switch (arg[len - 2] << 8 | arg[len - 1]) { #if A4 case 'i' << 8 | 'n': factor = 1.0; break; #else case 'c' << 8 | 'm': factor = 1.0 / 2.54; break; #endif case 'm' << 8 | 'm': factor = 1.0 / 25.4; break; case 'p' << 8 | 't': factor = 1.0 / 72.27; break; case 'p' << 8 | 'c': factor = 12.0 / 72.27; break; case 'b' << 8 | 'p': factor = 1.0 / 72.0; break; case 'd' << 8 | 'd': factor = 1238.0 / 1157.0 / 72.27; break; case 'c' << 8 | 'c': factor = 12 * 1238.0 / 1157.0 / 72.27; break; case 's' << 8 | 'p': factor = 1.0 / 72.27 / 65536; break; } return factor * atof(tmp) * resource.pixels_per_inch + 0.5; } #if CHECK_APP_FILEVERSION static void check_app_defaults_fileversion(void) { /* update this when new essential resources are introduced */ static const int required_version = 20030303; if (resource.app_defaults_fileversion < required_version) { const char *filename = kpse_find_file("XDvi", kpse_program_text_format, 0); if (filename == NULL) filename = "XDvi"; fprintf(stderr, "filename: %d\n", resource.app_defaults_fileversion); popup_message(globals.widgets.top_level, MSG_WARN, NULL, "Your application defaults file `%s' is outdated. " "This version of xdvi requires a file " "with date >= %d. Your file is older, or doesn't have a date.\n" "Please obtain a new version of the file `XDvi', e.g. from:\n" "http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/xdvi/xdvik/texk/xdvik/texmf/\n" "and copy it to a directory in your $XDVIINPUTS path.", filename, required_version); } } #endif #ifdef GREY static Arg temp_args1[] = { {XtNdepth, (XtArgVal) 0}, {XtNvisual, (XtArgVal) 0}, {XtNcolormap, (XtArgVal) 0}, }; /* * Alternate routine to convert color name to Pixel (needed to substitute * "black" or "white" for BlackPixelOfScreen, etc., since a different visual * and colormap are in use). */ static Boolean XdviCvtStringToPixel(Display *dpy, XrmValuePtr args, Cardinal *num_args, XrmValuePtr fromVal, XrmValuePtr toVal, XtPointer *closure_ret) { XrmValue replacement_val; Boolean default_is_fg; if ((strcmp((String) fromVal->addr, XtDefaultForeground) == 0 && (default_is_fg = True, True)) || (strcmp((String) fromVal->addr, XtDefaultBackground) == 0 && ((default_is_fg = False), True))) { replacement_val.size = sizeof(String); replacement_val.addr = (default_is_fg == resource.reverse) ? "white" : "black"; fromVal = &replacement_val; } return XtCvtStringToPixel(dpy, args, num_args, fromVal, toVal, closure_ret); } #endif /* * Set the `sourceposition' propery of the window `w' to `source_str'. * This is usually done in `client' mode to notify the instance of * xdvi running in window `w' to start a forward search. After this, * the client usually exits normally. */ static void set_sourceposition_property(const char *source_str, Window win) { /* parse the special in order to expand the filename */ struct src_parsed_special data; char *new_special = NULL; char *expanded_filename = NULL; data.filename_len = 0; data.filename = NULL; src_parse(source_str, strlen(source_str), &data); if (data.filename_len == 0) { /* can't give a GUI warning in `client' mode - just exit with error */ XDVI_FATAL((stderr, "Filename missing in -sourceposition argument (%s)!", source_str)); } TRACE_CLIENT((stderr, "got data: line %d, col %d, file |%s|, len %lu\n", data.line, data.col, data.filename, (unsigned long)data.filename_len)); /* expand -sourceposition argument if it contains a path component. We don't use REALPATH here, because `tex -src' doesn't expand symlinks either. Instead, use canonicalize_path() to expand `../' and './' manually. */ if (strchr(data.filename, '/') != NULL && (expanded_filename = expand_filename(data.filename, USE_CWD_PATH)) != NULL) { char *tmp = canonicalize_path(expanded_filename); free(data.filename); free(expanded_filename); expanded_filename = tmp; } else expanded_filename = data.filename; TRACE_CLIENT((stderr, "expanded1: |%s|\n", expanded_filename)); new_special = xmalloc(2 * LENGTH_OF_INT + 2 /* 2 for `:' and separating space */ + strlen(expanded_filename) + 1); sprintf(new_special, "%d:%d %s", data.line, data.col, expanded_filename); free(expanded_filename); TRACE_CLIENT((stderr, "matched!")); set_string_property(new_special, atom_src_goto(), win); free(new_special); set_string_property("", atom_raise(), win); } static void set_stringsearch_property(const char *str, Window win) { set_string_property(str, atom_find_string(), win); set_string_property("", atom_raise(), win); } /* Translation of valid paper types to dimensions, which are used internally. The newline characters are a hack to format the list neatly for error messages. A* series measures are taken from http://www.cl.cam.ac.uk/~mgk25/iso-paper.html */ static const char *paper_types[] = { "us", "8.5x11in", "letter", "8.5x11in", /* dvips compatibility */ "ledger", "17x11in", /* dvips compatibility */ "tabloid", "11x17in", /* dvips compatibility */ "usr", "11x8.5in", "legal", "8.5x14in", "legalr", "14x8.5in", "foolscap", "13.5x17.0in", /* ??? */ "foolscapr", "17.0x13.5in", "", "0", /* ISO `A' formats, Portrait */ "a0", "841x1189mm", "a1", "594x841mm", "a2", "420x594mm", "a3", "297x420mm", "a4", "210x297mm", "a5", "148x210mm", "a6", "105x148mm", "a7", "74x105mm", "a8", "52x74mm", "a9", "37x52mm", "a10","26x37mm", "", "0", /* ISO `A' formats, Landscape */ "a0r", "1189x841mm", "a1r", "841x594mm", "a2r", "594x420mm", "a3r", "420x297mm", "a4r", "297x210mm", "a5r", "210x148mm", "a6r", "148x105mm", "a7r", "105x74mm", "a8r", "74x52mm", "a9r", "52x37mm", "a10r","37x26mm", "", "0", /* ISO `B' formats, Portrait */ "b0", "1000x1414mm", "b1", "707x1000mm", "b2", "500x707mm", "b3", "353x500mm", "b4", "250x353mm", "b5", "176x250mm", "b6", "125x176mm", "b7", "88x125mm", "b8", "62x88mm", "b9", "44x62mm", "b10","31x44mm", "", "0", /* ISO `B' formats, Landscape */ "b0r", "1414x1000mm", "b1r", "1000x707mm", "b2r", "707x500mm", "b3r", "500x353mm", "b4r", "353x250mm", "b5r", "250x176mm", "b6r", "176x125mm", "b7r", "125x88mm", "b8r", "88x62mm", "b9r", "62x44mm", "b10r","44x31mm", "", "0", /* ISO `C' formats, Portrait */ "c0", "917x1297mm", "c1", "648x917mm", "c2", "458x648mm", "c3", "324x458mm", "c4", "229x324mm", "c5", "162x229mm", "c6", "114x162mm", "c7", "81x114mm", "c8", "57x81mm", "c9", "40x57mm", "c10","28x40mm", "", "0", /* ISO `C' formats, Landscape */ "c0r", "1297x917mm", "c1r", "917x648mm", "c2r", "648x458mm", "c3r", "458x324mm", "c4r", "324x229mm", "c5r", "229x162mm", "c6r", "162x114mm", "c7r", "114x81mm", "c8r", "81x57mm", "c9r", "57x40mm", "c10r","40x28mm", }; /* access methods for paper_types */ const char **get_paper_types(void) { return paper_types; } size_t get_paper_types_size(void) { return XtNumber(paper_types); } /* Set the icon name and title name standard properties on `globals.widgets.top_level'. * We use the basename of the DVI file (without the .dvi), so different xdvi * invocations can be distinguished, yet do not use up too much real estate. * * This function returns freshly allocated memory in *icon_name and *title_name * which the caller is responsible for free()ing again. */ void get_icon_and_title(const char *filename, char **icon_name, char **title_name) { /* Use basename of DVI file for name in icon and title. */ const char *ptr; char *ptr2; /* SU 2000/12/16: added page number information */ const char *const title_name_fmt = "%s: %s (%d page%s)"; MYTRACE((stderr, "get_icon_and_title called with: |%s|", filename)); ptr = strrchr(filename, '/'); if (ptr != NULL) ++ptr; else { ptr = filename; } /* * Remove the `file:' prefix from the icon name; since some windowmanagers * only display a prefix in window lists etc., it's more significant this * way. */ if (memcmp(ptr, "file:", 5) == 0) { ptr += 5; } *icon_name = xstrdup(ptr); MYTRACE((stderr, "before chopping: icon_name: |%s|", *icon_name)); if ((ptr2 = strstr(*icon_name, ".dvi")) != NULL) { /* chop off .dvi extension */ *ptr2 = '\0'; } MYTRACE((stderr, "after chopping: icon_name: |%s|", *icon_name)); *title_name = xmalloc(strlen(title_name_fmt) + strlen(XDVIK_PROGNAME) + strlen(*icon_name) + LENGTH_OF_INT + 2); /* 2 for additional plural `s' */ MYTRACE((stderr, "total_pages: %d", total_pages)); sprintf(*title_name, title_name_fmt, XDVIK_PROGNAME, *icon_name, total_pages, (total_pages > 1) ? "s" : ""); MYTRACE((stderr, "title_name, icon_name: |%s|%s|", *title_name, *icon_name)); } void set_icon_and_title(const char *icon_name, const char *title_name) { if (!XtIsRealized(globals.widgets.top_level)) { MYTRACE((stderr, "set_icon_and_title: returning")); return; } XtVaSetValues(globals.widgets.top_level, XtNtitle, (XtArgVal) title_name, XtNiconName, (XtArgVal) icon_name, NULL); XSetStandardProperties(DISP, XtWindow(globals.widgets.top_level), title_name, icon_name, (Pixmap) 0, NULL, 0, NULL); } static void get_window_constraints(XtWidgetGeometry *reply, Dimension screen_w, Dimension screen_h, int *add_h) { XtWidgetGeometry constraints; constraints.request_mode = reply->request_mode = 0; /* fprintf(stderr, "setting constraints.width to %d\n", globals.page.w); */ constraints.width = globals.page.w; if (globals.page.w > screen_w) { constraints.request_mode |= CWWidth; constraints.width = screen_w; } /* fprintf(stderr, "setting constraints.height to %d; screen_h = %d\n", globals.page.h, screen_h); */ constraints.height = globals.page.h; if (constraints.height > screen_h) { constraints.request_mode |= CWHeight; constraints.height = screen_h; } if (constraints.request_mode != 0 && constraints.request_mode != (CWWidth | CWHeight)) { #ifdef MOTIF (void)XtQueryGeometry(globals.widgets.main_window, &constraints, reply); #else (void)XtQueryGeometry(globals.widgets.vport_widget, &constraints, reply); #endif } /* fprintf(stderr, "reply height: %d; screen_h: %d; add_h: %d\n", reply->height, screen_h, *add_h); */ if (!(reply->request_mode & CWWidth)) reply->width = constraints.width; if (reply->width >= screen_w) reply->width = screen_w; if (!(reply->request_mode & CWHeight)) { reply->height = constraints.height - 2 * bwidth; } if (reply->height + *add_h >= screen_h) { reply->height = screen_h #ifdef MOTIF - 1.5 #else - 2 #endif * *add_h - 2 * bwidth; } } void set_windowsize(Dimension *ret_w, Dimension *ret_h, int add_w, int add_h, Boolean override) { static Arg set_wh_args[] = { {XtNwidth, (XtArgVal) 0}, {XtNheight, (XtArgVal) 0}, }; Dimension screen_w, screen_h; const char *test_geometry = resource.geometry; if (resource.fullscreen) { Dimension w = WidthOfScreen(SCRN), h = HeightOfScreen(SCRN); if (currwin.shrinkfactor == 0) { /* if not set by user */ Dimension height_factor = ROUNDUP(globals.page.unshrunk_h, h); currwin.shrinkfactor = ROUNDUP(globals.page.unshrunk_w, w); if (height_factor >= currwin.shrinkfactor) currwin.shrinkfactor = height_factor; /* fprintf(stderr, "factor was 0, using %d\n", currwin.shrinkfactor); */ } /* else */ /* fprintf(stderr, "factor != 0, using %d\n", currwin.shrinkfactor); */ mane.shrinkfactor = currwin.shrinkfactor; init_page(); set_wh_args[0].value = (XtArgVal)w; set_wh_args[1].value = (XtArgVal)h; *ret_w = w; *ret_h = h; #ifdef MOTIF #if USE_XAW_PANNER XtVaGetValues(globals.widgets.main_window, XmNshadowThickness, &g_save_shadow_thickness, NULL); #endif XtVaSetValues(globals.widgets.main_window, XmNshadowThickness, 0, NULL); #endif XtSetValues(globals.widgets.top_level, set_wh_args, XtNumber(set_wh_args)); } else if (override) { set_wh_args[0].value = (XtArgVal)*ret_w; set_wh_args[1].value = (XtArgVal)*ret_h; XtSetValues(globals.widgets.top_level, set_wh_args, XtNumber(set_wh_args)); } else { /* determine a window size that fits the current shrink factor */ Arg temp_args3 = { XtNborderWidth, (XtArgVal)&bwidth }; XtWidgetGeometry reply; XtGetValues(globals.widgets.top_level, &temp_args3, 1); /* get border width */ screen_w = WidthOfScreen(SCRN) - 2 * bwidth; screen_w -= add_w; /* screen_h = HeightOfScreen(SCRN) - 2 * bwidth - get_statusline_height() - 6; */ screen_h = HeightOfScreen(SCRN) - 2 * bwidth; for (;;) { /* actually, at most two passes */ Dimension height_factor; TRACE_GUI((stderr, "geometry: |%s|; remember: %d, windowsize: %s", resource.geometry ? resource.geometry : "", resource.remember_windowsize, resource.windowsize ? resource.windowsize : "")); if (resource.geometry == NULL && !resource.remember_windowsize) { /* geometry not set by user, try to find geometry that fits the shrink factor */ get_window_constraints(&reply, screen_w, screen_h, &add_h); TRACE_GUI((stderr, "w: %d, h: %d, add_h: %d, reply: %d x %d", screen_w, screen_h, add_h, reply.width, reply.height)); } else { int x, y; unsigned int width, height; int flags; if (resource.remember_windowsize && resource.windowsize != NULL) test_geometry = resource.windowsize; else test_geometry = resource.geometry; flags = XParseGeometry(test_geometry, &x, &y, &width, &height); if (!(flags & WidthValue) || !(flags & HeightValue)) { /* no geometry specified, use fallback */ get_window_constraints(&reply, screen_w, screen_h, &add_h); } /* warn about bad values */ if (flags & WidthValue) { if (width > (unsigned int)(2 * bwidth + add_w)) { TRACE_GUI((stderr, "width: %hu, bwidth: %hu, add_w: %d", width, bwidth, add_w)); reply.width = width - 2 * bwidth - add_w; } else { reply.width = width; } } if (flags & HeightValue) { if (height > (unsigned int)(2 * bwidth + add_h)) { TRACE_GUI((stderr, "height: %hu, bwidth: %hu, add_h: %d", height, bwidth, add_h)); reply.height = height - 2 * bwidth - add_h; } else { reply.height = height; } } TRACE_GUI((stderr, "setting geometry: %dx%d", (int)reply.width, (int)reply.height)); } /* now reply.{width,height} contain max. usable window size */ /* User didn't use `-s 0', use either default or other user-specified value */ if (currwin.shrinkfactor != 0) { /* fprintf(stderr, "factor != 0, using %d\n", currwin.shrinkfactor); */ break; } /* else { */ /* fprintf(stderr, "factor was 0, using %d\n", currwin.shrinkfactor); */ /* } */ /* else, try to find a suitable shrink factor: */ currwin.shrinkfactor = ROUNDUP(globals.page.unshrunk_w, reply.width - 2); /* fprintf(stderr, "factor w: %d\n", currwin.shrinkfactor); */ height_factor = ROUNDUP(globals.page.unshrunk_h, reply.height - 2); /* fprintf(stderr, "factor h: %d\n", height_factor); */ if (height_factor >= currwin.shrinkfactor) currwin.shrinkfactor = height_factor; /* fprintf(stderr, "factor now is: %d\n", currwin.shrinkfactor); */ mane.shrinkfactor = currwin.shrinkfactor; init_page(); set_wh_args[0].value = (XtArgVal)globals.page.w; set_wh_args[1].value = (XtArgVal)globals.page.h; *ret_w = globals.page.w; *ret_h = globals.page.h; XtSetValues(globals.widgets.draw_widget, set_wh_args, XtNumber(set_wh_args)); } #ifdef MOTIF /* SU 2002/11/23: Added scrollbar width to height computation. Otherwise, when the vertical space isn't sufficient, a vertical scrollbar will be added, but since this makes the display narrower, a horizontal scrollbar will be added as well, even if this wouldn't be neccessary. SU 2003/09/30: Apparently the size computation works now, even though I'm not sure why (scrollbar value isn't in add_w). Investigate. */ /* HACK ALERT: 4 for window decoration borders - FIXME: get actual values?? */ set_wh_args[0].value = reply.width + add_w + (test_geometry == NULL ? 4 : 0); set_wh_args[1].value = reply.height + add_h + (test_geometry == NULL ? 4 : 0); XtSetValues(globals.widgets.top_level, set_wh_args, XtNumber(set_wh_args)); #else /* MOTIF */ set_wh_args[0].value = reply.width + add_w + 2 * bwidth; /* + (test_geometry == NULL ? 15 : (2 * bwidth)); */ /* FIXME: use real height of statusline here Somehow I didn't manage to use XtVaCreateWidget in a call to create_statusline() above, and XtManageChild() below. In that case, we could do without get_statusline_height(). */ set_wh_args[1].value = reply.height + (test_geometry == NULL ? (2 * bwidth + add_h) : 0); XtSetValues(globals.widgets.top_level, set_wh_args, XtNumber(set_wh_args)); set_wh_args[0].value -= add_w; XtSetValues(globals.widgets.vport_widget, set_wh_args, XtNumber(set_wh_args)); #endif /* MOTIF */ *ret_w = set_wh_args[0].value; *ret_h = set_wh_args[1].value; TRACE_GUI((stderr, "returning: w=%d, h=%d", *ret_w, *ret_h)); } } static void net_wm_toggle_fullscreen(int flag) { Atom NET_WM_FULLSCREEN = XInternAtom(DISP, "_NET_WM_STATE_FULLSCREEN", True); if (NET_WM_FULLSCREEN) { XEvent ev; Atom NET_WM_STATE = XInternAtom(DISP, "_NET_WM_STATE", False); /* XDVI_INFO((stdout, "trying _NET_WM_STATE_FULLSCREEN ...")); */ ev.type = ClientMessage; ev.xclient.serial = 0; ev.xclient.send_event = True; ev.xclient.display = DISP; ev.xclient.window = XtWindow(globals.widgets.top_level); ev.xclient.message_type = NET_WM_STATE; ev.xclient.format = 32; ev.xclient.data.l[0] = flag; /* _NET_WM_STATE_REMOVE (0) or _NET_WM_STATE_ADD (1) */ ev.xclient.data.l[1] = NET_WM_FULLSCREEN; ev.xclient.data.l[2] = 0L; XSendEvent(DISP, DefaultRootWindow(DISP), False, SubstructureNotifyMask, &ev); } else { XDVI_INFO((stdout, "_NET_WM_STATE_FULLSCREEN not supported by this window manager.")); } } void reconfigure_window(Boolean fullscreen, Dimension width, Dimension height, Boolean save_position) { static int x_old = 5, y_old = 15; #ifdef SIZECONFIGURE_WORKS int sizeconfiguremask; XWindowChanges sizeconfigure; #endif /* SIZECONFIGURE_WORKS */ #ifdef MOTIF static int save_wm_decorations; #else static struct PropMotifWmHints MWMHints = {MWM_HINTS_DECORATIONS, 0, 0, 0, 0}; Atom WM_HINTS = XInternAtom(DISP, "_MOTIF_WM_HINTS", True); #endif int x, y; #ifdef SIZECONFIGURE_WORKS sizeconfiguremask = CWX | CWY | CWWidth | CWHeight | CWBorderWidth; sizeconfigure.width = width; sizeconfigure.height = height; #endif /* SIZECONFIGURE_WORKS */ if (fullscreen) { #if 0 static Boolean first_time = True; /* offsets between the raw window and the decorated window */ static int wm_x_offset = 0; static int wm_y_offset = 0; #endif Window dummy; #ifdef SIZECONFIGURE_WORKS sizeconfigure.x = 0; sizeconfigure.y = 0; sizeconfigure.border_width = 0; #endif /* SIZECONFIGURE_WORKS */ /* Note ZLB: avoid to call XTranslateCoordinates if the window is not yet mapped since XTranslateCoordinates implicitly maps the window (note: calling the function XGetWindowAttributes also makes the window mapped). This effectively eliminates the flashing effect when xdvik is started in fullscreen mode for the Motif version. For the Xaw version we still get flashing effect (seems that the window is already mapped). */ if (save_position) { /* save current window coordinates so that we can change them back */ (void)XTranslateCoordinates(DISP, XtWindow(globals.widgets.top_level), RootWindowOfScreen(SCRN), 0, 0, &x_old, &y_old, &dummy); #if 0 if (first_time) { first_time = False; /* This is a hack for finding out wm_x_offset, wm_y_offset */ XMoveWindow(DISP, XtWindow(globals.widgets.top_level), 0, 0); XSync(DISP, False); (void)XTranslateCoordinates(DISP, XtWindow(globals.widgets.top_level), RootWindowOfScreen(SCRN), 0, 0, &wm_x_offset, &wm_y_offset, &dummy); fprintf(stderr, "wm offset = (%d,%d)\n", wm_x_offset, wm_y_offset); } x_old -= wm_x_offset; y_old -= wm_y_offset; #endif } x = y = 0; #ifdef MOTIF XtVaGetValues(globals.widgets.top_level, XmNmwmDecorations, &save_wm_decorations, NULL); /* FIXME: this doesn't work e.g. with KDE */ XtVaSetValues(globals.widgets.top_level, XmNmwmDecorations, 0, XmNgeometry, "+0+0", NULL); XtVaSetValues(globals.widgets.main_window, XmNshadowThickness, 0, NULL); #else MWMHints.decorations = 0; if (WM_HINTS != None) { XChangeProperty(DISP, XtWindow(globals.widgets.top_level), WM_HINTS, WM_HINTS, 32, PropModeReplace, (unsigned char *)&MWMHints, sizeof(MWMHints) / 4); } #endif /* SU: apparently some new standard that is supposed to work with some WMs ... but it doesn't with my versions of Gnome and KDE. */ net_wm_toggle_fullscreen(1); #ifdef SIZECONFIGURE_WORKS XConfigureWindow(DISP, XtWindow(globals.widgets.top_level), sizeconfiguremask, &sizeconfigure); #endif /* SIZECONFIGURE_WORKS */ } else { #ifdef SIZECONFIGURE_WORKS sizeconfiguremask = CWWidth | CWHeight | CWX | CWY; sizeconfigure.x = x_old; sizeconfigure.y = y_old; sizeconfigure.border_width = 20; #endif /* SIZECONFIGURE_WORKS */ XtVaSetValues(globals.widgets.top_level, XtNx, x_old, XtNy, y_old, NULL); #ifdef MOTIF XtVaSetValues(globals.widgets.top_level, XmNmwmDecorations, save_wm_decorations, NULL); #if USE_XAW_PANNER XtVaSetValues(globals.widgets.main_window, XmNshadowThickness, g_save_shadow_thickness, NULL); #endif #else MWMHints.decorations = MWM_DECOR_ALL; if (WM_HINTS != None) { XChangeProperty(DISP, XtWindow(globals.widgets.top_level), WM_HINTS, WM_HINTS, 32, PropModeReplace, (unsigned char *)&MWMHints, sizeof(MWMHints) / 4); } #endif net_wm_toggle_fullscreen(0); x = x_old; y = y_old; } #if 1 #if 0 XUnmapWindow(DISP, XtWindow(globals.widgets.top_level)); #else XWithdrawWindow(DISP, XtWindow(globals.widgets.top_level), XScreenNumberOfScreen(SCRN)); #endif /* Note ZLB: Placing XResizeWindow before XUnmapWindow or after XMapWindow makes the fullscreen window size smaller than the screen size when using `mwm' of Lesstif */ XSetWindowBorderWidth(DISP, XtWindow(globals.widgets.top_level), 0); XResizeWindow(DISP, XtWindow(globals.widgets.top_level), width, height); XMapRaised(DISP, XtWindow(globals.widgets.top_level)); /* Note ZLB: XMapWindow might change the window position with some WMs (like Sawfish), so we place the window position after it's mapped. */ XMoveWindow(DISP, XtWindow(globals.widgets.top_level), x, y); #endif /* 0 */ /* need to redraw the page to avoid artifacts */ globals.ev.flags |= EV_NEWPAGE; XFlush(DISP); } /* * Parse colors from resource.{visited_}link_color, saving them * to g_{visited_}link_color and {visited_}link_pix. */ static void get_link_colors(Pixel *link_pix, Pixel *visited_link_pix) { XrmValue from1, from2, to1, to2; XColor exact, approx; double r, g, b; double factor = 65535.0; int ret; /* get rgb values from color for links */ if ((ret = XLookupColor(DISP, G_colormap, resource.link_color, &exact, &approx)) != 0) { } else { XDVI_WARNING((stderr, "XLookupColor failed for resource.link_color \"%s\"\n" "- using fallback color \"%s\".", resource.visited_link_color, LINK_COLOR_FALLBACK)); XLookupColor(DISP, G_colormap, LINK_COLOR_FALLBACK, &exact, &approx); } #if 0 fprintf(stderr, "lookup color for %s returned: %d, %d, %d\n", resource.link_color, exact.red, exact.green, exact.blue); #endif r = exact.red / factor; g = exact.green / factor; b = exact.blue / factor; g_link_color_rgb = xmalloc(strlen("push rgb 0.00 0.00 0.00") + 1); sprintf(g_link_color_rgb, "push rgb %.2f %.2f %.2f", r, g, b); /* same for visited links */ if ((ret = XLookupColor(DISP, G_colormap, resource.visited_link_color, &exact, &approx)) != 0) { } else { XDVI_WARNING((stderr, "XLookupColor failed for resource.visited_link_color \"%s\"\n" "- using fallback color \"%s\".", resource.visited_link_color, VISITED_LINK_COLOR_FALLBACK)); XLookupColor(DISP, G_colormap, VISITED_LINK_COLOR_FALLBACK, &exact, &approx); } #if 0 fprintf(stderr, "lookup color for %s returned: %d, %d, %d\n", resource.visited_link_color, exact.red, exact.green, exact.blue); #endif r = exact.red / factor; g = exact.green / factor; b = exact.blue / factor; g_visited_link_color_rgb = xmalloc(strlen("push rgb 0.00 0.00 0.00") + 1); sprintf(g_visited_link_color_rgb, "push rgb %.2f %.2f %.2f", r, g, b); /* 2nd part: Create CG for the underlines. */ from1.addr = resource.link_color; from1.size = strlen(from1.addr) + 1; to1.addr = (XtPointer)link_pix; to1.size = sizeof(Pixel); if (!XtConvertAndStore(globals.widgets.top_level, XtRString, &from1, XtRPixel, &to1)) { XDVI_WARNING((stderr, "String to pixel conversion failed for resource.link_color \"%s\"\n" "- using fallback color \"%s\".", resource.link_color, LINK_COLOR_FALLBACK)); from1.addr = LINK_COLOR_FALLBACK; from1.size = strlen(from1.addr) + 1; to1.addr = (XtPointer)link_pix; to1.size = sizeof(Pixel); XtConvertAndStore(globals.widgets.top_level, XtRString, &from1, XtRPixel, &to1); } from2.addr = resource.visited_link_color; from2.size = strlen(from2.addr) + 1; to2.addr = (XtPointer)visited_link_pix; to2.size = sizeof(Pixel); if (!XtConvertAndStore(globals.widgets.top_level, XtRString, &from2, XtRPixel, &to2)) { XDVI_WARNING((stderr, "String to pixel conversion failed for resource.visited_link_color \"%s\"\n" "- using fallback color \"%s\".", resource.visited_link_color, VISITED_LINK_COLOR_FALLBACK)); from2.addr = VISITED_LINK_COLOR_FALLBACK; from2.size = strlen(from2.addr) + 1; to2.addr = (XtPointer)visited_link_pix; to2.size = sizeof(Pixel); XtConvertAndStore(globals.widgets.top_level, XtRString, &from2, XtRPixel, &to2); } } /* Widget globals.widgets.main_row, globals.widgets.menu_bar; */ #ifdef MOTIF /* make sure the translations for the drawing area are properly set (Motif 2.x seems to somehow overwrite them somewhere in the initialization phase; bug #610206). */ void motif_translations_hack(void) { static XtTranslations xlats = NULL; const char *const translations = \ "osfPageUp:back-page()\n" "osfPageDown:forward-page()\n" "CtrlosfBeginLine:goto-page(1)\n" "CtrlosfEndLine:goto-page()\n" "osfBeginLine:home-or-top()\n" "osfEndLine:end-or-bottom()\n" #if 0 /* AFAIK the following don't have any effect with Motif */ #ifdef XK_KP_Left "KP_Home:home()\n" "KP_End:down()\n" "KP_Prior:back-page()\n" "KP_Next:forward-page()\n" #endif #endif ; if (xlats == NULL) { xlats = XtParseTranslationTable(translations); } ASSERT(globals.widgets.clip_widget != NULL, "globals.widgets.clip_widget must have been initialized"); ASSERT(globals.widgets.draw_widget != NULL, "globals.widgets.draw_widget must have been initialized"); XtOverrideTranslations(globals.widgets.clip_widget, xlats); } #endif /* MOTIF */ /* return an empty cursor. Lifted from unclutter.c */ static Cursor h_get_empty_cursor(Display *display, Window root) { Pixmap cursormask; XGCValues xgc; GC gc; XColor dummycolour; Cursor cursor; cursormask = XCreatePixmap(display, root, 1, 1, 1/*depth*/); xgc.function = GXclear; gc = XCreateGC(display, cursormask, GCFunction, &xgc); XFillRectangle(display, cursormask, gc, 0, 0, 1, 1); dummycolour.pixel = 0; dummycolour.red = 0; dummycolour.flags = 04; cursor = XCreatePixmapCursor(display, cursormask, cursormask, &dummycolour, &dummycolour, 0, 0); XFreePixmap(display, cursormask); XFreeGC(display, gc); return cursor; } static void create_cursors(void) { XColor bg_Color; Pixmap temp; Pixmap mask; /* first try colors by name, as fix for #804294; fall back on WhitePixelOfScreen() etc. if this fails: */ if (resource.cr_Pixel != (Pixel)ULONG_MAX) { m_cursor_color.pixel = resource.cr_Pixel; XQueryColor(DISP, G_colormap, &m_cursor_color); } else { if (XParseColor(DISP, G_colormap, "black", &m_cursor_color) == 0) { /* lookup failure */ m_cursor_color.pixel = BlackPixelOfScreen(SCRN); XQueryColor(DISP, G_colormap, &m_cursor_color); } } if (XParseColor(DISP, G_colormap, "white", &bg_Color) == 0) { /* lookup failure */ bg_Color.pixel = WhitePixelOfScreen(SCRN); XQueryColor(DISP, G_colormap, &bg_Color); } /* wait cursor */ globals.cursor.wait = XCreateFontCursor(DISP, XC_watch); if (resource.mouse_mode1_cursor == -1) { /* Use default ready cursor (custom bitmap) */ temp = XCreateBitmapFromData(DISP, RootWindowOfScreen(SCRN), (char *)magglass_bits, magglass_width, magglass_height); mask = XCreateBitmapFromData(DISP, RootWindowOfScreen(SCRN), (char *)magglass_mask_bits, magglass_mask_width, magglass_mask_height); globals.cursor.mode1 = XCreatePixmapCursor(DISP, temp, mask, &m_cursor_color, &bg_Color, magglass_x_hot, magglass_y_hot); XFreePixmap(DISP, temp); XFreePixmap(DISP, mask); } else { globals.cursor.mode1 = XCreateFontCursor(DISP, resource.mouse_mode1_cursor); } globals.cursor.corrupted = XCreateFontCursor(DISP, XC_watch); /* empty cursor */ globals.cursor.empty = h_get_empty_cursor(DISP, RootWindowOfScreen(SCRN)); #if !COLOR XRecolorCursor(DISP, globals.cursor.ready, &m_cursor_color, &bg_Color); XRecolorCursor(DISP, globals.cursor.wait, &m_cursor_color, &bg_Color); #endif /* Cursor when page is paused */ #ifdef VMS temp = XCreateBitmapFromData(DISP, RootWindowOfScreen(SCRN), (char *)hand_bits, hand_width, hand_height); mask = XCreateBitmapFromData(DISP, RootWindowOfScreen(SCRN), (char *)hand_mask_bits, hand_mask_width, hand_mask_height); globals.cursor.pause = XCreatePixmapCursor(DISP, temp, mask, &m_cursor_color, &bg_Color, 6, 6); XFreePixmap(DISP, temp); XFreePixmap(DISP, mask); #else globals.cursor.pause = XCreateFontCursor(DISP, XC_watch); #endif /* cursors indicating dragging direction */ globals.cursor.drag_v = XCreateFontCursor(DISP, XC_sb_v_double_arrow); globals.cursor.drag_h = XCreateFontCursor(DISP, XC_sb_h_double_arrow); globals.cursor.drag_a = XCreateFontCursor(DISP, XC_fleur); #ifdef VMS globals.cursor.link = globals.cursor.ready; globals.cursor.mode2 = globals.cursor.ready; globals.cursor.mode3 = globals.cursor.ready; #else globals.cursor.link = XCreateFontCursor(DISP, XC_hand2); globals.cursor.mode2 = XCreateFontCursor(DISP, resource.mouse_mode2_cursor); globals.cursor.mode3 = XCreateFontCursor(DISP, resource.mouse_mode3_cursor); /* globals.cursor.text = XCreateFontCursor(DISP, XC_tcross); */ #endif } /* Initialize a forward search if the source_position argument is not NULL. */ static void do_forward_search(const char *source_position) { /* parse the special to expand the filename */ struct src_parsed_special data; char *new_special = NULL; char *expanded_filename = NULL; if (source_position == NULL) /* nothing to do */ return; data.filename_len = 0; data.filename = NULL; src_parse(source_position, strlen(source_position), &data); if (data.filename_len == 0) { /* malformed argument: tell user, and ignore it */ popup_message(globals.widgets.top_level, MSG_ERR, /* helptext */ "The format of the -sourceposition argument should be:\n" "-sourceposition '[ ]* = linenumber, [ ]* = an arbitrary number of spaces, " "and = TeX source file.", /* error message */ "Filename missing in `-sourceposition' argument \"%s\". " "Could not perform forward search.", source_position); } else { TRACE_CLIENT((stderr, "got data: line %d, col %d, file |%s|, len %lu\n", data.line, data.col, data.filename, (unsigned long)data.filename_len)); /* expand -sourceposition argument if it contains a path component, like above */ if (strchr(data.filename, '/') != NULL && (expanded_filename = expand_filename(data.filename, USE_CWD_PATH)) != NULL) { char *tmp = canonicalize_path(expanded_filename); free(data.filename); free(expanded_filename); expanded_filename = tmp; } else expanded_filename = data.filename; TRACE_CLIENT((stderr, "expanded source_position: |%s|\n", expanded_filename)); new_special = xmalloc(2 * LENGTH_OF_INT + 2 /* 2 for `:' and separating space */ + strlen(expanded_filename) + 1); sprintf(new_special, "%d:%d %s", data.line, data.col, expanded_filename); free(expanded_filename); globals.src.fwd_string = new_special; globals.ev.flags |= EV_SRC; } } static void create_colormaps(void) { #ifdef GREY G_depth = (unsigned int)DefaultDepthOfScreen(SCRN); G_visual = DefaultVisualOfScreen(SCRN); G_colormap = DefaultColormapOfScreen(SCRN); #ifdef XSERVER_INFO if (globals.debug & DBG_ALL) fprintf(stdout, "--- G_depth: %d\n", G_depth); #endif if (resource.install != False && G_visual->class == PseudoColor) { /* look for a TrueColor visual with more bits */ XVisualInfo template; XVisualInfo *list; int nitems_return; #ifdef XSERVER_INFO if (globals.debug & DBG_ALL) fprintf(stdout, "--- looking for a better TrueColor visual\n"); #endif template.screen = XScreenNumberOfScreen(SCRN); template.class = TrueColor; list = XGetVisualInfo(DISP, VisualScreenMask | VisualClassMask, &template, &nitems_return); if (list != NULL) { XVisualInfo *list1; XVisualInfo *best = NULL; for (list1 = list; list1 < list + nitems_return; ++list1) { #ifdef XSERVER_INFO if (globals.debug & DBG_ALL) fprintf(stdout, "--- checking %d\n", list1->depth); #endif if ((unsigned int)list1->depth > G_depth # if PS_GS /* patch by Toni Ronkko , fixes bug #458057: * SGI supports additional depths of 12 and 30, but * these are not supported by ghostscript (see * xdev->vinfo->depth in gdevxcmp.c (ghostscript-6.51)), * so we restrict the values to those supported by gs. */ && (list1->depth == 1 || list1->depth == 2 || list1->depth == 4 || list1->depth == 8 || list1->depth == 15 || list1->depth == 16 || list1->depth == 24 || list1->depth == 32) # endif && (best == NULL || list1->depth > best->depth)) best = list1; } if (best != NULL) { #ifdef XSERVER_INFO if (globals.debug & DBG_ALL) fprintf(stdout, "--- best depth: %d\n", best->depth); #endif G_depth = best->depth; G_visual = best->visual; G_colormap = XCreateColormap(DISP, RootWindowOfScreen(SCRN), G_visual, AllocNone); XInstallColormap(DISP, G_colormap); temp_args1[0].value = (XtArgVal) G_depth; temp_args1[1].value = (XtArgVal) G_visual; temp_args1[2].value = (XtArgVal) G_colormap; XtSetValues(globals.widgets.top_level, temp_args1, XtNumber(temp_args1)); XtSetTypeConverter(XtRString, XtRPixel, XdviCvtStringToPixel, (XtConvertArgList) colorConvertArgs, 2, XtCacheByDisplay, NULL); { /* This is needed so that popup windows have the right visual and colormap. It is unnecessary for newer versions of Motif (Motif 2.1.0, Solaris 9) but needed for older versions (Motif 1.2.5, Solaris 2.6), and for Xaw. */ XrmDatabase db = XtScreenDatabase(SCRN); XrmValue val; val.size = sizeof G_visual; val.addr = (XtPointer) &G_visual; XrmPutResource(&db, "XDvi*visual", XtRVisual, &val); val.size = sizeof G_colormap; val.addr = (XtPointer) &G_colormap; XrmPutResource(&db, "XDvi*colormap", XtRColormap, &val); } } XFree(list); } } #ifdef MOTIF if (globals.debug & DBG_GUI) { printf("Compiled with %s, runtime version %d.%d\n", /* XmVERSION, XmREVISION, XmUPDATE_LEVEL, */ XmVERSION_STRING, xmUseVersion / 1000, xmUseVersion % 1000); } #endif if (resource.install == True && G_visual->class == PseudoColor) { XColor tmp_color; #ifdef XSERVER_INFO if (globals.debug & DBG_ALL) fprintf(stdout, "--- PseudoColor, trying to install colormap\n"); #endif /* This next bit makes sure that the standard black and white pixels are allocated in the new colormap. */ tmp_color.pixel = BlackPixelOfScreen(SCRN); XQueryColor(DISP, G_colormap, &tmp_color); XAllocColor(DISP, G_colormap, &tmp_color); tmp_color.pixel = WhitePixelOfScreen(SCRN); XQueryColor(DISP, G_colormap, &tmp_color); XAllocColor(DISP, G_colormap, &tmp_color); G_colormap = XCopyColormapAndFree(DISP, G_colormap); temp_args1[2].value = (XtArgVal) G_colormap; XtSetValues(globals.widgets.top_level, temp_args1 + 2, 1); } XtGetApplicationResources(globals.widgets.top_level, (XtPointer)&resource, app_pixel_resources, XtNumber(app_pixel_resources), (ArgList)NULL, 0); #endif /* GREY */ globals.gc.do_copy = resource.copy; #if GREY || COLOR color_data[0].pixel = resource.fore_Pixel; color_data[1].pixel = resource.back_Pixel; XQueryColors(DISP, G_colormap, color_data, 2); #endif #if COLOR fg_initial.r = color_data[0].red; fg_initial.g = color_data[0].green; fg_initial.b = color_data[0].blue; bg_initial.r = color_data[1].red; bg_initial.g = color_data[1].green; bg_initial.b = color_data[1].blue; #endif #if GREY if (G_depth == 1) { #ifdef XSERVER_INFO if (globals.debug & DBG_ALL) fprintf(stdout, "--- using depth 1\n"); #endif resource.use_grey = False; } if (resource.use_grey && G_visual->class != TrueColor) { #ifdef XSERVER_INFO if (globals.debug & DBG_ALL) fprintf(stdout, "--- using grey, but not TrueColor\n"); #endif init_plane_masks(); if (!globals.gc.do_copy) { /* Retain color_data[1].pixel for psgs.c. */ XColor tmp_color; #ifdef XSERVER_INFO if (globals.debug & DBG_ALL) fprintf(stdout, "--- not using copy\n"); #endif tmp_color = color_data[1]; tmp_color.pixel = resource.back_Pixel; XStoreColor(DISP, G_colormap, &tmp_color); } } #endif } static void create_widgets( #ifdef MOTIF Widget tool_bar, Widget form, #endif int *add_w, int *add_h) { #ifdef MOTIF Widget status_line; #if 0 { int i, n, longest_page = 0; Dimension width, height; char tmpbuf[1024]; char *fontname; XmString tmpstring; Widget dummy_list; XmRendition rendition; XmRenderTable rtable; Arg args[10]; /* * Try to determine width of longest page string: */ for (i = 0; i < total_pages; i++) { int curr = abs(pageinfo_get_number(i)); if (curr > longest_page) longest_page = curr; } fprintf(stderr, "longest page number: %d\n", longest_page); sprintf(tmpbuf, "* %d", longest_page); tmpstring = XmStringCreateLocalized(tmpbuf); dummy_list = XtCreateWidget("PageList", xmListWidgetClass, form, NULL, 0); fprintf(stderr, "rendition table\n"); n = 0; /* XtVaGetValues(globals.widgets.top_level, XmNfontList, &fontname, NULL); */ /* fprintf(stderr, "fontname: |%s|\n", fontname); */ XtSetArg(args[n], XmNfontName, "8x16"); n++; XtSetArg(args[n], XmNfontType, XmFONT_IS_FONT); n++; rendition = XmRenditionCreate(dummy_list, XmFONTLIST_DEFAULT_TAG, args, n); rtable = XmRenderTableAddRenditions(NULL, &rendition, 1, XmMERGE_REPLACE); XtVaSetValues(dummy_list, XmNrenderTable, rtable, NULL); /* rendition = XmRenditionCreate(globals.widgets.top_level, XmFONTLIST_DEFAULT_TAG, NULL, 0); */ fprintf(stderr, "extent\n"); XmStringExtent(rtable, tmpstring, &width, &height); fprintf(stderr, "string %s has width %d, height %d\n", tmpbuf, width, height); XtDestroyWidget(dummy_list); XmRenditionFree(rendition); XmStringFree(tmpstring); } #endif { #define ARG_LEN 20 int n = 0; Arg list_args[ARG_LEN]; XtSetArg(list_args[n], XmNlistSizePolicy, XmVARIABLE); n++; XtSetArg(list_args[n], XmNwidth, resource.pagelist_width); n++; #if defined(USE_PANNER) && USE_XAW_PANNER XtSetArg(list_args[n], XmNheight, globals.page.h - 62); n++; #else XtSetArg(list_args[n], XmNheight, globals.page.h); n++; #endif /* XtSetArg(list_args[n], XmNspacing, 10); n++; */ #if defined(USE_PANNER) && USE_XAW_PANNER XtSetArg(list_args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(list_args[n], XmNtopWidget, panner); n++; #else XtSetArg(list_args[n], XmNtopAttachment, XmATTACH_FORM); n++; #endif XtSetArg(list_args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(list_args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(list_args[n], XmNrightAttachment, XmATTACH_OPPOSITE_FORM); n++; XtSetArg(list_args[n], XmNrightOffset, -resource.pagelist_width); n++; XtSetArg(list_args[n], XmNresizable, True); n++; XtSetArg(list_args[n], XmNtopOffset, 2); n++; XtSetArg(list_args[n], XmNleftOffset, 2); n++; ASSERT(n < ARG_LEN, "list_args too short"); #undef ARG_LEN /* TODO: Find a smart way to determine size of pagelist instead of using resource.pagelist_width, and find a smart way of resizing it when switching to a file with larger page numbers! */ page_list = XmCreateScrolledList(form, "PageList", list_args, n); } if (resource.expert_mode == XPRT_SHOW_NONE) { XtUnmanageChild(XtParent(page_list)); XtUnmanageChild(page_list); } globals.widgets.main_window = XtVaCreateManagedWidget("mainWindow", xmScrolledWindowWidgetClass, form, XmNscrollingPolicy, XmAUTOMATIC, XmNleftAttachment, XmATTACH_WIDGET, /* lesstif balks if we just use page_list, so use its parent, the xmScrolledWindow, for alignment: */ XmNleftWidget, XtParent(page_list), XmNallowResize, True, /* XmNtopOffset, 2, */ XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, /* XmNleftOffset, 10, */ XmNresizable, True, XmNborderWidth, 0, NULL); XtManageChild(form); globals.widgets.x_bar = XtNameToWidget(globals.widgets.main_window, "HorScrollBar"); globals.widgets.y_bar = XtNameToWidget(globals.widgets.main_window, "VertScrollBar"); #ifdef TEST_SCROLLING /* TODO: try the following to prevent `flashing' effect - still breaks scrolling in its current form though */ globals.widgets.draw_background = XtVaCreateManagedWidget("drawing_bg", xmFormWidgetClass, globals.widgets.main_window, XmNwidth, globals.page.w, XmNheight, globals.page.h, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNhighlightThickness, 0, XmNbackground, resource.back_Pixel, XmNrubberPositioning, True, NULL); #endif globals.widgets.draw_widget = XtVaCreateWidget("drawing", xmDrawingAreaWidgetClass, #ifdef TEST_SCROLLING globals.widgets.draw_background, #else globals.widgets.main_window, #endif XmNwidth, globals.page.w, XmNheight, globals.page.h, XmNhighlightThickness, 0, XmNrubberPositioning, True, XtNbackground, resource.back_Pixel, NULL); #if !FIXED_FLUSHING_PAGING ASSERT(XtParent(globals.widgets.draw_widget) != NULL, ""); XtVaSetValues(XtParent(globals.widgets.draw_widget), XtNbackground, resource.back_Pixel, NULL); #endif #ifdef TEST_SCROLLING fprintf(stderr, "globals.widgets.draw_widget is: %p\n", globals.widgets.draw_widget); #endif XtVaGetValues(globals.widgets.main_window, XmNclipWindow, &globals.widgets.clip_widget, NULL); XtVaSetValues(globals.widgets.main_row, XmNmenuBar, globals.widgets.menu_bar, XmNcommandWindow, XtParent(tool_bar), XmNworkWindow, form, NULL); XtVaSetValues(globals.widgets.main_window, XmNworkWindow, globals.widgets.draw_widget, NULL); XtManageChild(globals.widgets.draw_widget); status_line = create_statusline(globals.widgets.main_row); XtVaSetValues(globals.widgets.main_row, XmNmessageWindow, status_line, NULL); if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) == 0) { XtUnmanageChild(status_line); } XtManageChild(globals.widgets.main_row); if ((resource.expert_mode & XPRT_SHOW_TOOLBAR) != 0) { if (resource.toolbar_unusable) statusline_error(STATUS_LONG, "Error creating the toolbar pixmaps - toolbar is disabled!"); else XtManageChild(XtParent(tool_bar)); } if ((resource.expert_mode & XPRT_SHOW_MENUBAR) != 0) XtManageChild(globals.widgets.menu_bar); XmAddTabGroup(globals.widgets.draw_widget); /* note: a few more custom translations for page_list are defined in pagesel.c, since the actions are only known there. */ { size_t i, k = 0; #define WIDGETS_SIZE 10 Widget widgets[WIDGETS_SIZE]; widgets[k++] = globals.widgets.main_row; /* widgets[k++] = globals.widgets.menu_bar; */ widgets[k++] = tool_bar; widgets[k++] = page_list; widgets[k++] = globals.widgets.main_window; widgets[k++] = globals.widgets.draw_widget; widgets[k++] = globals.widgets.clip_widget; ASSERT(k < WIDGETS_SIZE, "widgets list too short"); #undef WIDGETS_SIZE for (i = 0; i < k; i++) { XtOverrideTranslations(widgets[i], XtParseTranslationTable(base_key_translations)); if (i > 3) { /* widgets for which we want to use our own mouse translations */ XtOverrideTranslations(widgets[i], XtParseTranslationTable(base_mouse_translations)); if (resource.mouse_translations != NULL) { XtOverrideTranslations(widgets[i], XtParseTranslationTable(resource.mouse_translations)); } } } } if (resource.mouse_translations != NULL) { TRACE_GUI((stderr, "merging in mouse translations |%s|", resource.mouse_translations)); XtOverrideTranslations(globals.widgets.clip_widget, XtParseTranslationTable(resource.mouse_translations)); } if (resource.main_translations != NULL) { XtTranslations xlats = XtParseTranslationTable(resource.main_translations); XtOverrideTranslations(globals.widgets.draw_widget, xlats); XtOverrideTranslations(globals.widgets.clip_widget, xlats); XtOverrideTranslations(globals.widgets.main_row, xlats); XtOverrideTranslations(globals.widgets.menu_bar, xlats); XtOverrideTranslations(globals.widgets.main_window, xlats); /* don't do it for the page list, otherwise mouse customizations will break the default list bindings too. */ /* XtOverrideTranslations(page_list, xlats); */ } #else /* MOTIF */ globals.widgets.form_widget = XtVaCreateManagedWidget("form", formWidgetClass, globals.widgets.top_level, XtNdefaultDistance, 0, NULL); globals.widgets.vport_widget = XtVaCreateManagedWidget("vport", viewportWidgetClass, globals.widgets.form_widget, XtNborderWidth, 0, XtNtop, XtChainTop, XtNbottom, XtChainBottom, XtNleft, XtChainLeft, XtNright, XtChainRight, XtNallowHoriz, True, XtNallowVert, True, NULL); globals.widgets.clip_widget = XtNameToWidget(globals.widgets.vport_widget, "clip"); globals.widgets.draw_widget = XtVaCreateManagedWidget("drawing", drawWidgetClass, globals.widgets.vport_widget, XtNwidth, globals.page.w, XtNheight, globals.page.h, XtNx, 0, XtNy, 0, XtNlabel, "", NULL); XtOverrideTranslations(globals.widgets.form_widget, XtParseTranslationTable(base_key_translations)); XtOverrideTranslations(globals.widgets.form_widget, XtParseTranslationTable(base_mouse_translations)); if (resource.mouse_translations != NULL) { TRACE_GUI((stderr, "merging in mouse translations |%s|", resource.mouse_translations)); XtOverrideTranslations(globals.widgets.form_widget, XtParseTranslationTable(resource.mouse_translations)); } if (resource.main_translations != NULL) { XtOverrideTranslations(globals.widgets.form_widget, XtParseTranslationTable(resource.main_translations)); } /* set background colors of the drawing widget */ XtVaSetValues(globals.widgets.draw_widget, XtNbackground, resource.back_Pixel, NULL); #if !FIXED_FLUSHING_PAGING XtVaSetValues(globals.widgets.clip_widget, XtNbackground, resource.back_Pixel, NULL); #endif /* initialize add_w with width of button panel */ create_menu_buttons(globals.widgets.form_widget, add_w); #endif /* MOTIF */ /* activate expert mode and related settings */ toggle_statusline(); toggle_scrollbars(); #ifdef MOTIF toggle_pagelist(); toggle_toolbar(); toggle_menubar(); #else if ((resource.expert_mode & XPRT_SHOW_BUTTONS) == 0) toggle_buttons(); #endif *add_h = 0; #ifdef MOTIF *add_w = 0; if (resource.expert_mode & XPRT_SHOW_PAGELIST) *add_w += xm_get_width(page_list); /* if (globals.widgets.y_bar != NULL) */ /* add_w += xm_get_width(globals.widgets.y_bar); */ /* if (globals.widgets.x_bar != NULL) */ /* add_h += xm_get_width(globals.widgets.x_bar); */ if (resource.expert_mode & XPRT_SHOW_MENUBAR) *add_h += xm_get_height(globals.widgets.menu_bar); if (resource.expert_mode & XPRT_SHOW_TOOLBAR) *add_h += xm_get_height(tool_bar); if (resource.expert_mode & XPRT_SHOW_STATUSLINE) *add_h += xm_get_height(status_line); #else /* add_w has been initialized by create_menu_buttons() call above. Reset to 0 if we're in expert mode. */ if (!(resource.expert_mode & XPRT_SHOW_BUTTONS)) { *add_w = 0; } if (resource.expert_mode & XPRT_SHOW_STATUSLINE) { /* FIXME: Unfortunately the statusline hasn't been created at this point for Xaw, so the value is still the built-in default. */ *add_h += get_statusline_height(); } #endif } static void realize_widgets(Dimension main_win_w, Dimension main_win_h, int add_w) { /* * Realize the widgets (or windows). */ #ifndef MOTIF realize_button_panel(main_win_h); #endif XtAddEventHandler( #ifdef MOTIF globals.widgets.clip_widget, #else globals.widgets.vport_widget, #endif StructureNotifyMask, False, handle_resize, (XtPointer) NULL); XtAddEventHandler(globals.widgets.top_level, PropertyChangeMask, False, handle_property_change, (XtPointer) NULL); XtAddEventHandler(globals.widgets.draw_widget, ExposureMask, False, handle_expose, (XtPointer) &mane); XtRealizeWidget(globals.widgets.top_level); mainDeleteWindow = XInternAtom(DISP, "WM_DELETE_WINDOW", False); #ifdef MOTIF /* for Xaw, event handlers for scrollbars are added inside get_geom(), events.c */ ASSERT(globals.widgets.x_bar != NULL, ""); ASSERT(globals.widgets.y_bar != NULL, ""); #ifdef USE_PANNER XtAddEventHandler(globals.widgets.x_bar, ButtonPressMask | ButtonReleaseMask, False, handle_x_scroll, NULL); XtAddEventHandler(globals.widgets.y_bar, ButtonPressMask | ButtonReleaseMask, False, handle_y_scroll, NULL); #endif XmAddWMProtocolCallback(globals.widgets.top_level, mainDeleteWindow, xdvi_exit_callback, NULL); #else wmProtocols = XInternAtom(DISP, "WM_PROTOCOLS", False); XSetWMProtocols(DISP, XtWindow(globals.widgets.top_level), &mainDeleteWindow, 1); XtAddEventHandler(globals.widgets.top_level, NoEventMask, True, handle_delete_message, NULL); #endif /* check whether we want to run in fullscreen mode */ if (resource.fullscreen) { reconfigure_window(resource.fullscreen, main_win_w + add_w, main_win_h, False); } #ifdef MOTIF XmProcessTraversal(globals.widgets.draw_widget, XmTRAVERSE_CURRENT); TRACE_GUI((stderr, "toplevel: %p", (void *)globals.widgets.top_level)); create_tips(globals.widgets.top_level); #else if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0) { create_statusline(); } #endif currwin.win = mane.win = XtWindow(globals.widgets.draw_widget); { XWindowAttributes attrs; (void)XGetWindowAttributes(DISP, mane.win, &attrs); G_backing_store = attrs.backing_store; } #ifdef HAVE_X11_XMU_EDITRES_H /* * Enable editres protocol (see "man editres"). * Usually will need to add -lXmu to the linker line as well. */ XtAddEventHandler(globals.widgets.top_level, (EventMask)0, True, _XEditResCheckMessages, (XtPointer)NULL); #endif } /* * Create colors and GCs. * In color mode, color changes affect globals.gc.fore, globals.gc.fore2, * and globals.gc.rule, but not globals.gc.copy or globals.gc.high. */ static void create_gcs(void) { #if GREY if (resource.gamma == 0.0) resource.gamma = 1.0; #endif if (!resource.rule_color) resource.rule_pixel = resource.fore_Pixel; #if !COLOR #if GREY if (resource.use_grey) init_pix(); else #endif { /* not #defined GREY, or not resource.use_grey */ XGCValues values; Pixel set_bits = (Pixel) (resource.fore_Pixel & ~resource.back_Pixel); Pixel clr_bits = (Pixel) (resource.back_Pixel & ~resource.fore_Pixel); Boolean copy_tmp = resource.copy; globals.gc.copy = set_or_make_gc(NULL, GXcopy, resource.fore_Pixel, resource.back_Pixel); if (copy_tmp || (set_bits && clr_bits)) { globals.gc.rule = globals.gc.copy; if (!resource.thorough) copy_tmp = True; } if (copy_tmp) { globals.gc.fore = globals.gc.rule; if (!resource.copy) { warn_overstrike(); } } else { if (set_bits) { globals.gc.fore = set_or_make_gc(NULL, GXor, set_bits, 0); } if (clr_bits || !set_bits) *(globals.gc.fore ? &globals.gc.fore2 : &globals.gc.fore) = set_or_make_gc(NULL, GXandInverted, clr_bits, 0); if (!globals.gc.rule) globals.gc.rule = globals.gc.fore; } } #endif /* !COLOR */ { Pixel link_pix, visited_link_pix; get_link_colors(&link_pix, &visited_link_pix); globals.gc.linkcolor = set_or_make_gc(NULL, GXcopy, link_pix, resource.back_Pixel); globals.gc.visited_linkcolor = set_or_make_gc(NULL, GXcopy, visited_link_pix, resource.back_Pixel); } #if COLOR /* Not affected by color changes. */ globals.gc.copy = set_or_make_gc(NULL, GXcopy, resource.fore_Pixel, resource.back_Pixel); #endif globals.gc.high = set_or_make_gc(NULL, GXcopy, resource.hl_Pixel, resource.back_Pixel); globals.gc.ruler = set_or_make_gc(NULL, GXcopy, resource.rule_pixel, resource.fore_Pixel); #if XAW /* * There's a bug in the Xaw toolkit, in which it uses the * DefaultGCOfScreen to do vertical scrolling in the Text widget. * This leads to a BadMatch error if our visual is not the default one. * The following kludge works around this. */ DefaultGCOfScreen(SCRN) = globals.gc.copy; #endif } static void do_fork(void) { TRACE_CLIENT((stderr, "no other instance of xdvi found, forking ...")); /* * No suitable xdvi found, so we start one by * self-backgrounding. */ /* flush output buffers to avoid double buffering (i.e. data waiting in the output buffer being written twice, by the parent and the child) */ fflush(stdout); fflush(stderr); XFlush(DISP); if (fork()) /* if initial process (do NOT use vfork()!) */ _exit(0); } #if defined(MOTIF) && defined(USE_PANNER) && USE_XAW_PANNER static void panner_cb(Widget widget, XtPointer closure, XtPointer report_ptr) { fprintf(stderr, "panner_cb called!\n"); } #endif #if !DELAYED_MKTEXPK static XtIntervalId m_font_popup_id = 0; static Widget m_font_popup = 0; static void remove_font_popup(XtPointer client_data, XtIntervalId *id) { UNUSED(client_data); UNUSED(id); if (m_font_popup != 0) { kill_message_window(m_font_popup); } } static void remove_font_popup_exit_cb(XtPointer arg) { UNUSED(arg); xdvi_exit(EXIT_SUCCESS); } static void create_font_popup(XtPointer client_data, XtIntervalId *id) { int *curr_timeout = (int *)client_data; static int new_timeout = 0; UNUSED(client_data); UNUSED(id); /* fprintf(stderr, "+++++++++++++++ create_font_popup\n"); */ if (m_font_popup_id) { if (*curr_timeout > 0) { XtRemoveTimeOut(m_font_popup_id); m_font_popup_id = XtAppAddTimeOut(globals.app, *curr_timeout, create_font_popup, (XtPointer)&new_timeout); } else { m_font_popup = choice_dialog(globals.widgets.top_level, MSG_INFO, NULL, #ifndef MOTIF NULL, #endif NULL, NULL, /* no pre_callbacks */ NULL, NULL, NULL, /* default arguments for `OK' */ "Exit Xdvi", remove_font_popup_exit_cb, (XtPointer)NULL, "Loading %s\n(may take some time creating fonts ...)", globals.dvi_name); } } } void register_font_popup(void) { /* Use a two-step process, so that when the timeout is removed by unregister_font_popup(), it will occur before new_timeout. create_font_popup() will call XtAppAddTimeOut() again with new_timeout = 0. */ static int new_timeout = 50; /* fprintf(stderr, "+++++++++++++++ registered font popup\n"); */ m_font_popup_id = XtAppAddTimeOut(globals.app, 100, create_font_popup, (XtPointer)&new_timeout); } void unregister_font_popup(void) { /* fprintf(stderr, "+++++++++++++++ unregister_font_popup\n"); */ if (m_font_popup_id) { XtRemoveTimeOut(m_font_popup_id); m_font_popup_id = 0; /* FIXME: calling this directly crashes xdvi?? */ /* m_font_popup_id = XtAppAddTimeOut(globals.app, 1, remove_font_popup, (XtPointer)NULL); */ remove_font_popup(NULL, NULL); } } #endif /* !DELAYED_MKTEXPK */ /* revert resources */ void load_app_resources(Boolean also_pixels) { /* /\* reset some resources to built-in defaults *\/ */ /* resource.browser = NULL; */ /* resource.editor = NULL; */ /* resource.gamma = 1; */ /* resource.link_style = 3; */ /* resource.link_color = LINK_COLOR_FALLBACK; */ /* resource.visited_link_color = VISITED_LINK_COLOR_FALLBACK; */ /* resource.expert_mode = 31; */ /* resource.use_color = True; */ /* resource.match_highlight_inverted = True; */ XtGetApplicationResources(globals.widgets.top_level, (XtPointer)&resource, application_resources, XtNumber(application_resources), (ArgList)NULL, 0); if (also_pixels) { XtGetApplicationResources(globals.widgets.top_level, (XtPointer)&resource, app_pixel_resources, XtNumber(app_pixel_resources), (ArgList)NULL, 0); } /* fprintf(stderr, "gamma: %f\n", resource.gamma); */ } /* * Unfortunately this must be a callback, for the file selector ... * This is the second part of Main: Create all widgets, initialize the DVI file, * and enter the main event loop. */ void run_dvi_file(const char *filename, void *data) { Boolean tried_dvi_ext = False; struct startup_info *cb = (struct startup_info *)data; #ifdef MOTIF Widget tool_bar = 0; Widget form = 0; #endif char *title_name = NULL; char *icon_name = NULL; dviErrFlagT errflag = NO_ERROR; int add_w = 0, add_h = 0; Dimension main_win_w, main_win_h; UNUSED(data); ASSERT(filename != NULL, "filename must have been initialized here!"); globals.dvi_name = xstrdup(filename); file_history_push(globals.dvi_name); TRACE_FILES((stderr, "globals.dvi_name is: |%s| %p\n", globals.dvi_name, globals.dvi_name)); globals.dvi_file.dirname = get_dir_component(globals.dvi_name); xdvi_assert(XDVI_VERSION_INFO, __FILE__, __LINE__, globals.dvi_file.dirname != NULL, "globals.dvi_name (%s) must contain a dir component", globals.dvi_name); globals.dvi_file.dirlen = strlen(globals.dvi_file.dirname); form_dvi_property(); /* If `unique' is active, we may need to pass the file to a different instance of xdvi: */ if (resource.unique) { Window w1 = 0, w2 = 0; if ((w1 = get_xdvi_window_id(True, NULL)) != 0 || (w2 = get_xdvi_window_id(False, NULL)) != 0) { if (w1 != 0) { /* another xdvi instance, same file: reload */ w2 = w1; set_string_property("", atom_reload(), w2); } else { /* another xdvi instance, different file: load new file */ set_string_property(globals.dvi_name, atom_newdoc(), w2); } if (cb->page_arg != NULL) { /* switch to different page */ if (strlen(cb->page_arg) == 0) { /* special case: treat `+' as last page */ set_string_property("+", atom_newpage(), w2); } else { set_string_property(cb->page_arg, atom_newpage(), w2); } } else { /* if page_arg is empty, go to 1st page so that this page is inserted into the page history (fix for #1044891) */ set_string_property("1", atom_newpage(), w2); } /* in all cases, raise the window of the other instance */ set_string_property("", atom_raise(), w2); xdvi_exit(EXIT_SUCCESS); } else if (resource.src_fork) { do_fork(); } } /* Similar for forward search or string search: */ if (resource.src_pos != NULL || resource.find_string != NULL) { Window w; if ((w = get_xdvi_window_id(True, NULL)) != 0) { /* another instance of xdvi running, displaying the same file */ TRACE_CLIENT((stderr, "Match; changing property of client and exiting ...")); if (resource.src_pos != NULL) set_sourceposition_property(resource.src_pos, w); else set_stringsearch_property(resource.find_string, w); xdvi_exit(EXIT_SUCCESS); } else if (resource.src_fork) { do_fork(); } } /* Needed for source specials and for calling ghostscript. */ xputenv("DISPLAY", XDisplayString(DISP)); if (globals.debug) { fprintf(stderr, "%s %s, kpathsea: %s\n", XDVIK_PROGNAME, XDVI_VERSION_INFO, kpathsea_version_string); fprintf(stderr, "configured with: ppi=%d shrink=%d mfmode=%s alt_font=%s paper=%s\n", resource.pixels_per_inch, currwin.shrinkfactor, resource.mfmode ? resource.mfmode : "", resource.alt_font, resource.paper); } #ifdef T1LIB /* needed so that T1lib can produce tfm's e.g. for cm-super */ kpse_set_program_enabled(kpse_tfm_format, True, kpse_src_compile); #endif kpse_set_program_enabled(kpse_any_glyph_format, resource.makepk, kpse_src_compile); /* janl 16/11/98: I have changed this. The above line used to say the settings in resource.makepk was supplied on the commandline, resulting in it overriding _all other_ settings, derived from the environment or texmf.cnf, no matter what the value. The value in resource.makepk could be the compile-time default... Personaly I like the environment/texmf.cnf to override resources and thus changed the 'level' of this setting to kpse_src_compile so the environment/texmf.cnf will override the values derived by Xt. Previous comment here: ``Let true values as an X resource/command line override false values in texmf.cnf/envvar.'' */ /* * Step 2: Settle colormap issues. This should be done before * other widgets are created, so that they get the right * pixel values. (The top-level widget won't have the right * values, but I don't think that makes any difference.) */ #ifdef XSERVER_INFO print_xserver_info(); #endif create_colormaps(); #ifdef TESTING_OPEN_FILES fprintf(stderr, "open_max: %ld\n", OPEN_MAX); for (i = 0; i < OPEN_MAX - 10; i++) { FILE *fp; if ((fp = fopen("/tmp/foo", "r")) == NULL) { perror("fopen"); xdvi_exit(EXIT_FAILURE); } } fprintf(stderr, "opened %d files.\n", i); #endif /* toolbar code may open files, but we have no check close_a_file() in the toolbar code; so do this before prescan() possibly opens lots of files. */ #ifdef MOTIF globals.widgets.main_row = XmCreateMainWindow(globals.widgets.top_level, "main", NULL, 0); create_menu_buttons(globals.widgets.main_row, &globals.widgets.menu_bar); /* seems to be needed for enabling `XmNhighlightOnEnter' for the toolbar buttons - is this the correct place to do it? */ XtVaSetValues(globals.widgets.top_level, XmNkeyboardFocusPolicy, (XtArgVal)XmPOINTER, NULL); form = XtVaCreateWidget("form", xmFormWidgetClass, globals.widgets.main_row, XmNshadowThickness, 0, NULL); if (resource.main_translations != NULL) { XtOverrideTranslations(form, XtParseTranslationTable(resource.main_translations)); } #if defined(USE_PANNER) && USE_XAW_PANNER panner = XtVaCreateWidget("panner", pannerWidgetClass, form, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20, XmNrightAttachment, XmATTACH_OPPOSITE_FORM, XmNrightOffset, -resource.pagelist_width + 20, XmNtopOffset, 2, XmNleftOffset, 2, XtNheight, 60, XtNwidth, resource.pagelist_width - 50, XtNsliderX, 5, XtNsliderY, 7, XtNinternalSpace, 0, XtNshadowThickness, 0, NULL); #endif #endif /* use bounding box for highlighting if our visual isn't TrueColor (not worth the trouble ...) */ if (G_visual->class != TrueColor) { resource.match_highlight_inverted = False; } /* * Step 3: Initialize the dvi file and set titles. */ #ifdef T1LIB /* At this point DISP, G_visual, G_depth and G_colormap must be defined. Also, init_t1() must go before internal_open_dvi(), since read_postamble will define some fonts and insert them into fontmaps_hash, but we need a clean fontmaps_hash for detecting duplicate entries in the map file. */ if (resource.t1lib) { init_t1(); } #endif /* T1LIB */ #if DELAYED_MKTEXPK /* Open and initialize the DVI file. First, disable creation of PK fonts * so that we can count the missing fonts that are to be generated. */ kpse_set_program_enabled(kpse_any_glyph_format, False, kpse_src_compile); #endif setup_signal_handlers(False); #if !DELAYED_MKTEXPK /* Notify users that fonts are being created. This is just a hack and no replacement for true asynchronous font creation since it doesn't give details (is just invoked if startup takes somewhat longer) and freezes during font creation. */ register_font_popup(); #endif /* open and initialize the DVI file, but don't read the fonts yet */ if (!internal_open_dvi(globals.dvi_name, &errflag, True #if DELAYED_MKTEXPK , False /* read fonts, but don't initialize data structures */ #endif )) { if (tried_dvi_ext) { XDVI_FATAL((stderr, "Could not open %s: %s, and %s.dvi doesn't exist either - exiting.", globals.dvi_name, get_dvi_error(errflag), globals.dvi_name)); } else { XDVI_FATAL((stderr, "Could not open %s: %s.", globals.dvi_name, get_dvi_error(errflag))); } } #if DELAYED_MKTEXPK fprintf(stderr, "after opening ...\n"); /* Now re-enable PK creation and read the postamble for a second time. * FIXME: Actually we don't need this re-reading, could as well read the * entire thing in the first run, not quit early and correctly initialize * the fonts without creating them. */ kpse_set_program_enabled(kpse_any_glyph_format, resource.makepk, kpse_src_compile); if (!internal_open_dvi(globals.dvi_name, &errflag, True, True)) { if (tried_dvi_ext) { XDVI_FATAL((stderr, "Could not open %s: %s, and %s.dvi doesn't exist either - exiting.", globals.dvi_name, get_dvi_error(errflag), globals.dvi_name)); } else { XDVI_FATAL((stderr, "Could not open %s: %s.", globals.dvi_name, get_dvi_error(errflag))); } } #else unregister_font_popup(); #endif if (cb->page_arg != NULL) { if (cb->page_arg[0] == '\0') { /* empty page_arg -> goto last page */ current_page = total_pages - 1; page_history_insert(current_page); } else { char *testptr; current_page = strtoul(cb->page_arg, &testptr, 10) - 1; if (*testptr != '\0') { XDVI_FATAL((stderr, "Invalid page number: `%s'.", cb->page_arg)); } current_page = check_goto_page(current_page, True); } } else { page_history_insert(current_page); } file_history_set_page(current_page); ASSERT(globals.dvi_file.bak_fp != NULL, "Backup file pointer must have been initialized here"); if (resource.prescan) { prescan(globals.dvi_file.bak_fp); } globals.page.unshrunk_w = pageinfo_get_page_width(current_page); globals.page.unshrunk_h = pageinfo_get_page_height(current_page); TRACE_GUI((stderr, "globals.page.unshrunk_w: %d, h: %d; window: %d, %d", globals.page.unshrunk_w, globals.page.unshrunk_h, pageinfo_get_window_width(current_page), pageinfo_get_window_height(current_page))); init_page(); /* * Step 4: Create widgets, and set initial window size. */ /* currently these override expert mode - using this is deprecated in favour of `-expertmode'; inform user about this: */ if (resource.statusline) { XDVI_WARNING((stderr, "The option/X resource `statusline' is obsolete; " "use `-expertmode ' instead, e.g. `-expertmode 1'\n" "to switch on the status line, or `-expertmode 6'\n" "to switch it off. See the xdvi man page for details.")); resource.expert_mode |= XPRT_SHOW_STATUSLINE; } /* XtRealizeWidget(globals.widgets.top_level); */ #ifdef MOTIF tool_bar = create_toolbar(globals.widgets.main_row, globals.widgets.menu_bar); if (resource.main_translations != NULL) { XtOverrideTranslations(tool_bar, XtParseTranslationTable(resource.main_translations)); } #endif create_widgets( #ifdef MOTIF tool_bar, form, #endif &add_w, &add_h); TRACE_GUI((stderr, "add_w = %d, add_h = %d\n", add_w, add_h)); /* fprintf(stderr, "geometry xdvirc: |%s|, orig: |%s|\n", resource.xdvirc_geometry, resource.geometry); */ /* * Set initial window size. * This needs to be done before colors are assigned because if * -s 0 is specified, we need to compute the shrink factor * (which in turn affects whether init_pix is called). */ set_windowsize(&main_win_w, &main_win_h, add_w, add_h, False); realize_widgets(main_win_w, main_win_h, add_w); /* this needs to be done after total_pages is known (via internal_open_dvi) */ get_icon_and_title(globals.dvi_name, &icon_name, &title_name); add_icon(globals.widgets.top_level, title_name, icon_name); /* this needs to be done after the widgets have been created */ set_icon_and_title(icon_name, title_name); free(icon_name); free(title_name); icon_name = title_name = NULL; G_image = XCreateImage(DISP, G_visual, 1, XYBitmap, 0, (char *)NULL, 0, 0, BMBITS, 0); G_image->bitmap_unit = BMBITS; #ifdef WORDS_BIGENDIAN G_image->bitmap_bit_order = MSBFirst; #else G_image->bitmap_bit_order = LSBFirst; #endif { short endian = MSBFirst << 8 | LSBFirst; G_image->byte_order = *((char *)&endian); } /* Store window id for use by src_client_check(). */ { #if !(defined(WORD64) || defined(LONG64)) xuint32 data = XtWindow(globals.widgets.top_level); XChangeProperty(DISP, DefaultRootWindow(DISP), atom_xdvi_windows(), atom_xdvi_windows(), 32, PropModePrepend, (unsigned char *)&data, 1); #else unsigned char data[4]; set_window_id(XtWindow(globals.widgets.top_level), data); XChangeProperty(DISP, DefaultRootWindow(DISP), atom_xdvi_windows(), atom_xdvi_windows(), 32, PropModePrepend, data, 1); #endif set_dvi_property(); } /* * Step 5: Assign colors and GCs. * Because of the latter, this has to go after the widgets are realized. */ create_gcs(); create_cursors(); #ifdef MOTIF #if defined(USE_PANNER) && USE_XAW_PANNER XtVaSetValues(panner, XtNsliderWidth, globals.page.w / 2, XtNsliderHeight, globals.page.h / 2, XtNcanvasWidth, globals.page.w, XtNcanvasHeight, globals.page.h, NULL); XtManageChild(panner); XtAddCallback(panner, XtNreportCallback, panner_cb, (XtPointer)NULL); #endif create_pagelist(); #endif /* trigger forward search */ do_forward_search(resource.src_pos); /* trigger string search */ if (resource.find_string != NULL) { globals.ev.flags |= EV_FIND; } /* trigger anchor search */ if (resource.anchor_pos != NULL) { g_anchor_pos = xstrdup(resource.anchor_pos); g_anchor_len = strlen(g_anchor_pos); globals.ev.flags |= EV_ANCHOR; } #if defined(MOTIF) && HAVE_XPM tb_check_navigation_sensitivity(current_page); #endif #if CHECK_APP_FILEVERSION check_app_defaults_fileversion(); #endif /* can do this only after scrollbars have been realized */ if (!BROKEN_RECONFIG && (resource.expert_mode & XPRT_SHOW_SCROLLBARS) == 0) { toggle_scrollbars(); } /* initialize file watching */ if (resource.watch_file > 0.0) { #if XDVI_XT_TIMER_HACK watch_file_cb(NULL, NULL); #else XDVI_WARNING((stderr, "Could not redefine XtAppAddTimeOut(); `watchfile' not available.")); #endif } /* raise `early' message windows */ raise_message_windows(); { String args[1]; char mmode[LENGTH_OF_INT]; snprintf(mmode, LENGTH_OF_INT, "%d", resource.mouse_mode); args[0] = mmode; XtCallActionProc(globals.widgets.top_level, "switch-mode", NULL, args, 1); } /* go to home position on first page to honor -(side|top)margin flags */ if (!resource.keep_flag) home(False); do_pages(); } xdvik-ja-22.84.16-j1.40/texk/xdvik/xdvi.1.in0000664000175000017500000037062511173312615017641 0ustar uwabamiuwabami.\" Copyright (c) 1990-2004 Paul Vojta and others .\" .\" This is Paul's license, included here only for reference, it does not apply .\" to all parts of the k version. .\" ---- .\" 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 .\" PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. .\" ---- .\" This is the xdvik license: .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" following is UGLY ... use La\*(Te\& instead: .\" .if t .ds La L\\h'-0.1667m'\\v'-0.20v'A\\v'0.20v'\\h'-0.1667m'T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X .\" .if n .ds La LaTeX .if t .ds Te T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X .if n .ds Te TeX ' # small and boldface (not all -man's provide it) .de SB \&\fB\s-1\&\\$1 \\$2\s0\fR .. .TH XDVI 1 "@XDVI_DATE@" "Xdvik @XDVI_VERSION@" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH NAME xdvi \- DVI Previewer for the X Window System .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH SYNOPSIS .B xdvi .nh [\fB+\fP[\fIpage\fP]] [\fB\--help\fP] #ifps [\fB\-allowshell\fP] #endif [\fB\-altfont\fP \fIfont\fP] [\fB\-bg\fP \fIcolor\fP] [\fB\-browser\fP \fIWWWbrowser\fP] [\fB\-copy\fP] [\fB\-cr\fP \fIcolor\fP] [\fB\-debug\fP \fIbitmask\fP|\fIstring[,string ...]\fP] [\fB\-display\fP \fIhost:display\fP] [\fB\-dvipspath\fP \fIpath\fP] [\fB\-editor\fP \fIcommand\fP] [\fB\-expert\fP] [\fB\-expertmode\fP \fIflag\fP] [\fB\-fg\fP \fIcolor\fP] [\fB\-findstring\fP \fIstring\fP] [\fB\-text-encoding\fP \fIencoding\fP] [\fB\-font\fP \fIfont\fP] [\fB\-fullscreen \fP] #ifgrey [\fB\-gamma\fP \fIg\fP] #endif [\fB\-geometry\fP \fIgeometry\fP] #ifghost [\fB\-gsalpha\fP] #endif #ifghost [\fB\-gspalette\fP \fIpalette\fP] #endif [\fB\-h\fP] [\fB\-help\fP] [\fB\-hl\fP \fIcolor\fP] [\fB\-anchorposition\fP \fIanchor\fP] [\fB\-hush\fP] [\fB\-hushchars\fP] [\fB\-hushchecksums\fP] [\fB\-warnpecials\fP] [\fB\-hushstdout\fP] [\fB\-hushbell\fP] [\fB\-icongeometry\fP \fIgeometry\fP] [\fB\-iconic\fP] #ifgrey [\fB\-install\fP] #endif #ifghost [\fB\-interpreter\fP \fIpath\fP] #endif [\fB\-keep\fP] [\fB\-l\fP] [\fB\-license\fP] [\fB\-linkcolor\fP \fIcolor\fP] [\fB\-linkstyle\fP \fI0|1|2|3\fP] [\fB\-margins\fP \fIdimen\fP] #ifkpathsea [\fB\-mfmode\fP \fImode-def\fP[\fB:\fP\fIdpi\fP]] #endif #ifnokpathsea [\fB\-mfmode\fP \fImode-def\fP] #endif [\fB\-mgs\fP[\fIn\fP] \fIsize\fP] [\fB\-mousemode\fP \fI0|1|2\fP] #ifcolor [\fB\-nocolor\fP] #endif #ifdps [\fB\-nodps\fP] #endif [\fB\-nofork\fP] #ifghost [\fB\-noghostscript\fP] #endif #ifgrey [\fB\-nogrey\fP] #endif #ifghost [\fB\-nogssafer\fP] #endif #ifgrey [\fB\-noinstall\fP] #endif #ifmakepk [\fB\-nomakepk\fP] #endif [\fB\-nomatchinverted\fP] #ifnews [\fB\-nonews\fP] #endif [\fB\-noomega\fP] [\fB\-noscan\fP] #ift1 [\fB\-not1lib\fP] #endif [\fB\-notempfile\fP] [\fB\-offsets\fP \fIdimen\fP] [\fB\-p\fP \fIpixels\fP] [\fB\-paper\fP \fIpapertype\fP] [\fB\-pause\fP] [\fB\-pausespecial\fP \fIspecial-string\fP] #ifps [\fB\-postscript\fP \fIflag\fP] #endif [\fB\-rulecolor\fP \fIcolor\fP] [\fB\-rv\fP] [\fB\-S\fP \fIdensity\fP] [\fB\-s\fP \fIshrink\fP] [\fB\-safer\fP] [\fB\-sidemargin\fP \fIdimen\fP] [\fB\-sourceposition\fP \fIline\fP[\fB:\fP\fIcol\fP][\ ]\fIfilename\fP] [\fB\-statusline\fP] [\fB\-thorough\fP] [\fB\-topmargin\fP \fIdimen\fP] [\fB\-unique\fP] [\fB\-version\fP] [\fB\-visitedlinkcolor\fP \fIcolor\fP] [\fB\-warnspecials\fP] [\fB\-watchfile\fP \fIsecs\fP] [\fB\-wheelunit\fP \fIpixels\fP] [\fB\-xoffset\fP \fIdimen\fP] [\fB\-yoffset\fP \fIdimen\fP] [\fIdvi_file\fP] .hy .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH DESCRIPTION .B Xdvi is a program for previewing .I dvi files, as produced e.g. by the .BR tex (1) program, under the X window system. .PP .B Xdvi can show the file shrunken by various integer factors, and it has a ``magnifying glass'' for viewing parts of the page enlarged (see the section MAGNIFIER below). This version of .B xdvi is also referred to as .B xdvik since it uses the kpathsea library to locate and generate font files. In addition to that, it supports the following features: .RS 2 .TP 2 - hyperlinks in DVI files (section HYPERLINKS), .TP - #ift1 direct rendering of Postscript Type1 fonts (section T1LIB), .TP - #endif source specials in the DVI file (section SOURCE SPECIALS), .TP - string search in DVI files (section STRING SEARCH), .TP - saving or printing (parts of) the DVI file (sections PRINT DIALOG and SAVE DIALOG). .RE .PP Xdvi can be compiled with the Motif toolkit or the Xaw (Athena) toolkit (and variants of it), and the Motif version has a slightly different GUI; these differences are noted below. .PP Before displaying a page of a DVI file, .B xdvi will check to see if the file has changed since the last time it was displayed. If this is the case, it will reload the file. This feature allows you to preview many versions of the same file while running .B xdvi only once. Since it cannot read partial DVI files, .B xdvik versions starting from 22.74.3 will create a temporary copy of the DVI file being viewed, to ensure that the file can be viewed without interruptions. (The .B \-notempfile can be used to turn off this feature). #ifps .PP .B Xdvi can show PostScript specials by any of three methods. It will try first to use Display PostScript, then NeWS, then it will try to use Ghostscript to render the images. All of these options depend on additional software to work properly; moreover, some of them may not be compiled into this copy of .BR xdvi . .PP For performance reasons, .B xdvi does not render PostScript specials in the magnifying glass. #endif .PP If no file name has been specified on the command line, xdvi will try to open the most recently opened file; if the file history (accessible via the .B File > Open Recent menu) is empty, or if none of the files in the history are valid DVI files, it will pop up a file selector for choosing a file name. (In previous versions, which didn't have a file history, the file selector was always used; you can set the X resource .B noFileArgUseHistory to .I false to get back the old behaviour.) .PP .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH OPTIONS In addition to specifying the .I dvi file (with or without the .B .dvi extension), .B xdvi supports the following command line options. If the option begins with a .RB ` + ' instead of a .RB ` \- ', the option is restored to its default value. By default, these options can be set via the resource names given in parentheses in the description of each option. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI + page Specifies the first page to show. If .B + is given without a number, the last page is assumed; the first page is the default. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifps .TP .B \-allowshell .RB ( .allowShell ) This option enables the shell escape in PostScript specials. (For security reasons, shell escapes are disabled by default.) This option should be rarely used; in particular it should not be used just to uncompress files: that function is done automatically if the file name ends in .BR .Z , .BR .gz , or .BR .bz2 . Shell escapes are always turned off if the .B \-safer option is used. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-altfont " font" .RB ( .altFont ) Declares a default font to use when the font in the .I dvi file cannot be found. This is useful, for example, with PostScript fonts. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-background " color" .RB ( .background ) Determines the color of the background. Same as .BR -bg . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-bg " color" .RB ( .background ) Determines the color of the background. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-browser " browser" .RB ( .wwwBrowser ) Defines the web browser used for handling external URLs. The value of this option or resource has the same syntax as the .B BROWSER environment variable; see the explanation of that variable in the section `ENVIRONMENT' below for a detailed description. If neither the option nor the X resource .I wwwBrowser is specified, the environment variables .B BROWSER and .B WWWBROWSER (in that order) are used to determine the browser command. If these are not set either, the following default value is used: \fBxdg-open %s:htmlview %s:firefox -remote -remote "openURL(%s,new-window)":mozilla -remote "openURL(%s,new-window)":netscape -raise -remote "openURL(%s,new-window)":xterm -e w3m %s:xterm -e lynx %s:xterm -e wget %s\fP .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifgrey .TP .B \-copy .RB ( .copy ) Always use the .I copy operation when writing characters to the display. This option may be necessary for correct operation on a color display, but overstrike characters will be incorrect. If greyscale anti-aliasing is in use, the .B \-copy operation will disable the use of colorplanes and make overstrikes come out incorrectly. #endif See also .BR \-thorough . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-cr " color" .RB ( .cursorColor ) Determines the color of the mouse cursor. The default is the same as the foreground color. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-debug " bitmask|string[,string ...]" .RB ( .debugLevel ) If nonzero, prints additional information on standard output. The argument can be either a bitmask specified as a decimal number, or comma-separated list of strings. .br For the bitmask representation, multiple values can be specified by adding the numbers that represent the individual bits; e.g. to debug all all file searching and opening commands, use 4032 (= 2048 + 1024 + 512 + 256 + 128 + 64). Use -1 to turn on debugging of everything (this will produce huge output). .br For the string representation, use the strings listed in the following table, with a comma to separate the values; e.g. to debug all file searching and opening commands, use .BR search,expand,paths,hash,stat,open . (The option `kpathsea' is provided as a shorthand for these.) Note that such a list may need to be quoted to prevent the shell from interpreting commas or spaces in the list. .br The individual numbers and strings have the following meanings: .nf .sp 1n .ta 1L +8L +12L 1 bitmap Bitmap creation 2 dvi DVI translation 4 pk PK fonts 8 batch Batch mode: Exit after reading the DVI file 16 event Event handling 32 ps PostScript interpreter calls 64 stat Kpathsea stat(2) calls 128 hash Kpathsea hash table lookups 256 open Kpathsea file opening 512 paths Kpathsea path definitions 1024 expand Kpathsea path expansion 2048 search Kpathsea searching 4032 kpathsea All Kpathsea options 4096 htex Hypertex specials 8192 src Source specials 16384 client Client/server mode (see -unique and -sourceposition options) 32768 t1 Type1 font library messages 65536 t1_verbose Verbose Type1 library messages 131072 gui GUI elements .sp 1n .fi Some of the Kpathsea debugging options are actually provided by Kpathsea; see the Debugging section in the Kpathsea manual for more information on these. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-density " density" .RB ( .densityPercent ) Determines the density used when shrinking bitmaps for fonts. A higher value produces a lighter font. The default value is 40. #ifgrey If greyscaling is in use, this argument does not apply; use .B \-gamma instead. #endif See also the .RB ` S ' keystroke. Same as .BR \-S . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-display " host" : display Specifies the host and screen to be used for displaying the .I dvi file. By default this is obtained from the environment variable .SB DISPLAY. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-dvipspath " path" .RB ( .dvipsPath ) Use .I path as the .B dvips program to use when printing. The default for this is .BR dvips . The program or script should read the DVI file from standard input, and write the Postscript file to standard output. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-editor " editor" .RB ( .editor ) Specifies the editor that will be invoked when the .I source-special() action is triggered to start a reverse search (by default via Ctrl-Mouse 1). The argument to this option is a format string in which occurrences of .RB `` %f '' are replaced by the file name, occurrences of .RB `` %l '' are replaced by the line number within the file, and optional occurrences of .RB `` %c '' are replaced by the column number within the line. .sp If neither the option nor the X resource .I .editor is specified, the following environment variables are checked to determine the editor command: .BR XEDITOR , .BR VISUAL , and .B EDITOR (in this sequence). If the string is found as the value of the .SB VISUAL or .SB EDITOR environment variables, then .RI `` "xterm -e "'' is prepended to the string; if the editor is specified by other means, then it must be in the form of a shell command to pop up an X window with an editor in it. If none of these variables is set, a warning message is displayed and the command .RI `` "xterm -e vi +%l %f"'' is used. .sp If no .RB `` %f '' or .RB `` %l '' occurs in the string, the missing format strings are appended automatically. (This is for compatibility with other programs when using one of the environment variables). .sp A new instance of the editor is started each time this command is used; therefore it is preferable to use an editor that can be invoked in `client' mode to load new files into the same instance. Example settings are: .RS 7 .TP 7 .SB emacsclient --no-wait (older Emacsen) .TP .SB gnuclient -q (XEmacs and newer Emacsen) .TP .SB gvim --servername xdvi --remote (VIM v6.0+; the `--servername xdvi' option will cause gvim to run a dedicated instance for the files opened by xdvi.) .TP .SB nc (nedit) .PP .sp Note that those strings need to be enclosed into quotes when using them on the command-line to protect them from the shell; when using them as argument for the .I .editor resource in an X resource file, no quotes should be used. .sp .B NOTE ON SECURITY: The argument of this option isn't executed as a shell command, but via .I exec() to prevent evil tricks with the contents of source specials. .RE .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-expert This option is only supported for backwards compatibility; it is equivalent to .BR "\-expertmode 0" , which should be preferred. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-expertmode " flag" .RB ( .expertMode ) With an argument of .IR 0 , this option switches off the display of the buttons, scrollbars, the toolbar (Motif only), the statusline and the page list. These GUI elements can also be (de)activated separately, by combining the appropriate values in the .I flag argument. This acts similar to the .B \-debug option: The integer .I flag is treated as a bitmap where each bit represents one element. If the bit has the value .IR 1 , the element is switched on, if it has the value .IR 0 , the element is switched off. The meaning of the bits is as follows: .nf .sp 1n .ta 1L +8L +12L 1 statusline 2 scrollbars 4 Motif: pagelist, Xaw: buttons and pagelist 8 toolbar (Motif only) 16 menubar (Motif only) .sp 1n .fi For example, to turn on only the statusline and the scrollbars, use 3 (= 1 + 2). See also the .RB ` x ' keystroke, where the bits are addressed by their positions, from 1 to 3 (Xaw) or 5 (Motif), respectively. .PP If the statusline is not active, all messages that would normally be printed to the statusline will be printed to .IR stdout , unless the .B \-hushstdout option is used. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-fg " color" .RB ( .foreground ) Determines the color of the text (foreground). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-text-encoding " encoding" .RB ( .textEncoding ) Use .I encoding as text encoding of the string in the "Find" window. Usually, this shouldn't be needed since the encoding is determined from the locale settings. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-findstring\fP \fIstring\fP This option triggers a search for .I string in the DVI file mentioned on the command-line, similar to forward search (see the description of the .B sourceposition option): If there is already another instance of .B xdvi running on the displaying that DVI file, it will cause that instance to perform the search instead. The search starts at the top of the current page of the DVI file. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-font " font" .RB ( *font ) Sets the font used in menus, buttons etc., as described in the .I X(7x) man page. The font for child windows can be set separately, e.g.: .RS 7 .nf .ft 3 .sp 1n xdvi*statusline*font: \e -*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-* .sp 1n .ft .fi .RE .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-foreground " color" Same as .BR -fg . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-fullscreen When this option is used, xdvi will (try to) run in fullscreen mode, with no window decorations. This option is not guaranteed to work with all windowmanagers/desktops; if you're experiencing problems with it, please use the .B \-geometry option instead, and a suitable window manager setting to remove the window decorations. When using this option for presentations, you might want to get rid of all the control widgets as well, using the .B -expertmode option. This option can also be toggled at runtime using the .B fullscreen action (by default bound to Ctrl-l). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifgrey .TP .BI \-gamma " gamma" .RB ( .gamma ) Controls the interpolation of colors in the greyscale anti-aliasing color palette. Default value is 1.0. For 0 < .I gamma < 1, the fonts will be lighter (more like the background), and for .I gamma > 1, the fonts will be darker (more like the foreground). Negative values behave the same way, but use a slightly different algorithm. For color and grayscale displays; for monochrome, see .BR \-density . See also the .RB ` S ' keystroke. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-geometry " geometry" .RB ( .geometry ) Specifies the initial geometry of the main window, as described in the .I X(7x) man page. The geometry of child windows can be set separately, e.g.: .br .I xdvi*helpwindow.geometry: 600x800 .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-gsalpha .RB ( .gsAlpha ) Causes .B Ghostscript to be called with the .B x11alpha driver instead of the .B x11 driver. The .B x11alpha driver enables anti-aliasing in PostScript specials, for a nicer appearance. It is available on newer versions of .BR Ghostscript . This option can also be toggled with the .RB ` V ' keystroke. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifghost .TP .BI \-gspalette " palette" .RB ( .palette ) Specifies the palette to be used when using Ghostscript for rendering PostScript specials. Possible values are .BR Color , .BR Greyscale , and .BR Monochrome . The default is .BR Color . #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BR \-h , " \-help" , " \--help" Prints a short help text with an overview of the command-line options to standard output. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-hl " color" .RB ( .highlight ) Determines the color of the page border, of the ruler in `ruler mode', and of the highlighting markers in forward search and string search. The default is the foreground color. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-anchorposition " anchor" Jump to .I anchor after opening the DVI file. This is only useful when invoking .B xdvi from other applications. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-hush .RB ( .Hush ) Causes .B xdvi to suppress all suppressible warnings. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-hushchars .RB ( .hushLostChars ) Causes .B xdvi to suppress warnings about references to characters which are not defined in the font. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-hushchecksums .RB ( .hushChecksums ) Causes .B xdvi to suppress warnings about checksum mismatches between the .I dvi file and the font file. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-hushstdout .RB ( .hushStdout ) Suppresses printing of status messages to .IR stdout . Note that errors or warnings will still be printed to .I stderr even if this option is used. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-hushbell .RB ( .hushBell ) Don't sound the X bell when an error occurs. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-icongeometry " geometry" .RB ( .iconGeometry ) Specifies the initial position for the icon. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-iconic .RB ( .iconic ) Causes the .B xdvi window to start in the iconic state. The default is to start with the window open. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifgrey .TP .B \-install .RB ( .install ) If .B xdvi is running under a .B PseudoColor visual, then (by default) it will check for .B TrueColor visuals with more bits per pixel, and switch to such a visual if one exists. If no such visual exists, it will use the current visual and colormap. If .B \-install is selected, however, it will still use a .B TrueColor visual with a greater depth, if one is available; otherwise, it will install its own colormap on the current visual. If the current visual is not .BR PseudoColor , then .B xdvi will not switch the visual or colormap, regardless of its options. The default value of the .B install resource is the special value, .BR maybe . There is no .B +install option. See also .BR \-noinstall , and the GREYSCALING AND COLORMAPS section. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifghost .TP .BI \-interpreter " filename" .RB ( .interpreter ) Use .I filename as the Ghostscript interpreter. By default it uses .BR @GS_PATH@ . #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-keep .RB ( .keepPosition ) Sets a flag to indicate that .B xdvi should not move to the home position when moving to a new page. See also the .RB ` k ' keystroke. This flag is honored by all page switching actions and by .B up-or-previous() / .BR down-or-next() , although the latter only honor the horizontal postion, not the vertical one. This allows for a "continuous" scrolling back an forth through a document with a display window narrower than a page width. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-l .RB ( .listFonts ) List the names of all fonts used. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-license Prints licensing information. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-linkcolor .RB ( .linkColor ) Color used for unvisited hyperlinks (`Blue2' by default). Hyperlinks are unvisited before you click on them, or after the DVI file has been reloaded. The value should be either a valid X color name (such as .IR DarkGoldenrod4 ) or a hexadecimal color string (such as .IR #8b6508 ). See also .B \-visitedlinkcolor and .BR \-linkstyle . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-linkstyle .RB ( .LinkStyle ) Determines the style in which hyperlinks are displayed. Possible values and their meanings are: .nf .sp 1n .ta 1L +8L 0 No highlighting of links 1 Underline links with \fIlink color\fR 2 No underlining, color text with \fIlink color\fR 3 Underline and display text colored with \fIlink color\fR .sp 1n .fi The values for \fIlink color\fR are specified by the options/resources .BI \-linkcolor and .BI \-visitedlinkcolor (which see). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-margins " dimen" .RB ( .Margin ) Specifies the size of both the top margin and side margin. This determines the ``home'' position of the page within the window as follows. If the entire page fits in the window, then the margin settings are ignored. If, even after removing the margins from the left, right, top, and bottom, the page still cannot fit in the window, then the page is put in the window such that the top and left margins are hidden, and presumably the upper left-hand corner of the text on the page will be in the upper left-hand corner of the window. Otherwise, the text is centered in the window. The dimension should be a decimal number optionally followed by any of the two-letter abbreviations for units accepted by \*(Te\& .RB ( pt , .BR pc , .BR in , .BR bp , .BR cm , .BR mm , .BR dd , .BR cc , or .BR sp ). By default, the unit will be .BR @DEFAULT_UNIT@. See also .BR \-sidemargin ", " \-topmargin , and the keystroke .RB ` M .' .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifkpathsea .TP .BI \-mfmode " mode-def" #endif #ifnokpathsea .BI \-mfmode " mode-def\fR[\fP\fB:\fPdpi\fR]\fP" #endif .RB ( .mfMode ) Specifies a .I mode-def string, which can be used in searching for fonts (see ENVIRONMENT, below). Generally, when changing the .IR mode-def , it is also necessary to change the font size to the appropriate value for that mode. This is done by adding a colon and the value in dots per inch; for example, .BR "\-mfmode ljfour:600" . This method overrides any value given by the .B pixelsPerInch resource or the .B \-p command-line argument. #ifmakepk The metafont mode is also passed to .B metafont during automatic creation of fonts. #endif By default, it is .BR "@MFMODE@" . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-mgs " size" Same as .BR \-mgs1 . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-mgs[ n ] " size" .RB ( .magnifierSize\fR[\fIn\fR] ) Specifies the size of the window to be used for the ``magnifying glass'' for Button .IR n . The size may be given as an integer (indicating that the magnifying glass is to be square), or it may be given in the form .IR width x height . See the MOUSE ACTIONS section. Defaults are 200x150, 400x250, 700x500, 1000x800, and 1200x1200. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-mousemode " " [ 0 | 1 | 2 ] .RB ( .mouseMode ) Specifies the default mode of xdvi at startup: Magnifier (0), Text Selection Mode (1) or Ruler Mode (2). See the section .BR MODES , below, for more information. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifcolor .TP .B \-nocolor .RB ( .color ) Turns off the use of color specials. This option can be toggled with the .RB ` C ' keystroke. (Note: .B \-nocolor corresponds to .BR color:off ; .B +nocolor to .BR color:on .) #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifdps .TP .B \-nodps .RB ( .dps ) Inhibits the use of Display PostScript for displaying PostScript specials. Other forms of PostScript emulation, if installed, will be used instead. (Note: .B \-nodps corresponds to .BR dps:off ; .B +nodps to .BR dps:on .) #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-nofork .RB ( .fork ) With the .B \-sourceposition and .B \-unique options, the default behavior is for .B xdvi to put itself into the background (like a daemon) if there is no appropriate instance of .B xdvi already running. This argument makes it run in the foreground instead. This is useful for debugging, or if your client application cannot deal well with a program self-backgrounding itself in this way -- e.g., the IPC functions in .B emacs are known to have problems with this. If no .B \-sourceposition or .B \-unique argument is given, then this option has no effect. (Note: .B \-nofork corresponds to .BR fork:off ; .B +nofork to .BR fork:on .) .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifghost .TP .B \-noghostscript .RB ( .ghostscript ) Inhibits the use of Ghostscript for displaying PostScript specials. (Note: .B \-noghostscript corresponds to .BR ghostscript:off ; .B +noghostscript to .BR ghostscript:on .) #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifgrey .TP .B \-nogrey .RB ( .grey ) Turns off the use of greyscale anti-aliasing when printing shrunken bitmaps. (Note: .B \-nogrey corresponds to .BR grey:off ; .B +nogrey to .BR grey:on .) See also the .RB ` G ' keystroke. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifghost .TP .B \-nogssafer .RB ( .gsSafer ) Normally, if Ghostscript is used to render PostScript specials, the Ghostscript interpreter is run with the option .BR \-dSAFER . The .B \-nogssafer option runs Ghostscript without .BR \-dSAFER . The .B \-dSAFER option in Ghostscript disables PostScript operators such as .BR deletefile , to prevent possibly malicious PostScript programs from having any effect. If the .B \-safer option is specified, then this option has no effect; in that case Ghostscript is always run with .BR \-dSAFER . (Note: .B \-nogssafer corresponds to .BR gsSafer:off ; .B +nogssafer to .BR gsSafer:on .) #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifgrey .TP .B \-noinstall .RB ( .install ) Inhibit the default behavior of switching to a .B TrueColor visual if one is available with more bits per pixel than the current visual. (Note: \-noinstall corresponds .BR install:off ; there is no .B +noinstall option.) See also .BR \-install , and the GREYSCALING AND COLORMAPS section. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifmakepk .TP .B \-nomakepk .RB ( .makePk ) Turns off automatic generation of font files that cannot be found by other means. (Note: .B \-nomakepk corresponds to .BR makePk:off ; .B +nomakepk to .BR makePK:on .) #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-nomatchinverted .RB ( .matchInverted ) Don't highlight string search matches in inverted color; instead, draw a rectangle in .I highlight color (see the .B \-hl option) around the match. This option is activated automatically if the display isn't running in TrueColor. (Note: .B \-nomatchinverted corresponds to .BR matchInverted:off ; .B +nomatchinverted to .BR matchInverted:on .) .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifnews .TP .B \-nonews .RB ( .news ) Inhibits the use of NeWS for displaying PostScript specials. Ghostscript, if enabled by the installation, will be used instead. (Note: .B \-nonews corresponds to .BR news:off ; .B +nonews to .BR news:on .) #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-noomega .RB ( .omega ) This will disable the use of Omega extensions when interpreting DVI files. By default, the additional opcodes .I 129 and .I 134 are recognized by xdvi as Omega extensions and interpreted as requests to set 2-byte characters. The only drawback is that the virtual font array will require 65536 positions instead of the default 256 positions, i.e. the memory requirements of xdvi will be slightly larger. If you find this unacceptable or encounter another problem with the Omega extensions, you can switch this extension off by using .B \-noomega (but please do send a bug report if you find such problems - see the bug address in the .B AUTHORS section below). .br (Note: .B \-noomega corresponds to .BR "omega: off" ; .B +noomega to .BR "omega: on" .) .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-noscan .RB ( .prescan ) By default, .B xdvi does a preliminary scan of the .I dvi file to process any .B papersize specials; this is especially important at startup since the paper size may be needed to determine the window size. #ifps If PostScript is in use, then prescanning is also necessary in order to properly process header files. #endif #ifcolor In addition, prescanning is needed to correctly determine the background color of a page. #endif This option turns off such prescanning. (Prescanning will be automatically be turned back on if .B xdvi detects any of the specials mentioned above.) (Note: .B \-noscan corresponds to .BR prescan:off ; .B +noscan to .BR prescan:on .) .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ift1 .TP .BI \-not1lib .RB ( .t1lib ) This will disable the use of T1Lib to display PostScript fonts. Use this option as a workaround when you encounter problems with the display of T1Lib (but please don't forget to send a bug report in this case, to the URL mentioned in the section AUTHORS below). .br (Note: .B \-not1lib corresponds to .BR t1lib:off ; .B +not1lib to .BR t1lib:on .) #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-notempfile .RB ( .tempFile ) As mentioned in the section .B DESCRIPTION above, xdvi will create a temporary copy of the DVI file so that it can be accessed without interruptions even while the file is being rewritten by .BR TeX . Since this introduces the overhead of copying the file every time it has changed, the .B \-notempfile allows you to turn off this behaviour. In this case, exposing parts of the window while the DVI file is being written by \*(Te\& will erase the current window contents until the DVI file can be completely reread. .br (Note: .B \-notempfile corresponds to .BR tempFile:off ; .B +notempfile to .BR tempFile:on .) .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-offsets " dimen" .RB ( .Offset ) Specifies the size of both the horizontal and vertical offsets of the output on the page. By decree of the Stanford \*(Te\& Project, the default \*(Te\& page origin is always 1 inch over and down from the top-left page corner, even when non-American paper sizes are used. Therefore, the default offsets are 1.0 inch. The argument .I dimen should be a decimal number optionally followed by any of the two-letter abbreviations for units accepted by \*(Te\& .RB ( pt , .BR pc , .BR in , .BR bp , .BR cm , .BR mm , .BR dd , .BR cc , or .BR sp ). By default, the unit will be .BR @DEFAULT_UNIT@. See also .B \-xoffset and .BR \-yoffset . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-p " pixels" .RB ( .pixelsPerInch ) Defines the size of the fonts to use, in pixels per inch. The default value is @BDPI@. This option is provided only for backwards compatibility; the preferred way is to set both the resolution and the Metafont mode via the .B \-mfmode option (which see). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-paper " papertype" .RB ( .paper ) Specifies the size of the printed page. Note that in most cases it's best to specify the paper size in the TeX input file via the line .sp .B \eusepackage[dvips]{geometry} .sp which will be recognized by both dvips and xdvi; in that case the use of a `-paper' option should be unnecessary. .br The paper size may be specified in the form \fIwidth\fBx\fIheight\fR optionally followed by a unit, where .I width and .I height are decimal numbers giving the width and height of the paper, respectively, and the unit is any of the two-letter abbreviations for units accepted by \*(Te\& .RB ( pt , .BR pc , .BR in , .BR bp , .BR cm , .BR mm , .BR dd , .BR cc , or .BR sp ). By default, the unit is .BR @DEFAULT_UNIT@\fR. .br There are also synonyms which may be used: .B us (8.5x11in), .B legal (8.5x14in), .B foolscap (13.5x17in), as well as the ISO sizes .BR a1 - a7 , .BR b1 - b7 , .BR c1 - c7 . Each of these also has a landscape or `rotated' variant: .B usr (11x8.5in), .BR a1r - a7r , etc. For compatibility with .BR dvips , the formats .B letter (8.5x11in), .B ledger (17x11in) and .B tabloid (11x17in) are also supported (these don't have rotated variants). .br Any of the above sizes may be preceded by a plus sign .RB (` + '); this causes the paper size given here to override any paper size given in the .I dvi file. The default paper size is @DEFAULT_PAGE_SIZE@. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-pause .RB ( .pause ) This option provides a simple implementation of incremental (stepwise) display, which can be used for presentations. When this option is used, .B xdvi will pause the display of the current page whenever it encounters a special .I special-string .RI ( xdvi:pause by default; the string can be customized via .IR \-pausespecial , see below), and the cursor will change its shape. The action .B unpause-or-next() (by default bound to the .B Space key) will display the next portion of the page up to the following .IR special-string , or until the end of the page is reached. When the option is not used, specials containing .I special-string will be ignored. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-pausespecial " special-string" .RB ( .pauseSpecial ) Sets the special string that causes xdvi to pause when the .I -pause option is active. The default value of .I special-string is .IR xdvi:pause . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifps .TP .BI \-postscript " flag" .RB ( .postscript ) If .I flag = 0, rendering of PostScript specials is disabled; instead, bounding boxes will be displayed (if available). A value of .I 1 (the default) switches PostScript specials on. With a value of .IR 2 , the PostScript specials are displayed along with their bounding boxes; this allows you to visually check the correctness of the bounding boxes. The values can also be toggled at runtime with the .RB ` v ' keystroke and the corresponding numerical prefix arguments 0, 1 and 2. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-ps2pdfpath " path" .RB ( .ps2pdfPath ) Use .I path as a conversion program from Postscript to PDF. The program or script should accept two command-line arguments: The Postscript file as first argument, and the PDF output file as second argument. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-rulecolor " color" .RB ( .ruleColor ) Determines the color of the rules used for the the magnifier (default: foreground color). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-q .RB ( .noInitFile ) Ignore the .I $HOME/.xdvirc startup file (i.e. don't read it at startup, and don't write it at exit). This forces the defaults defined in .I $HOME/.Xdefaults to be used. See .B FILES for more information on .IR $HOME/.xdvirc . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-rv .RB ( .reverseVideo ) Causes the page to be displayed with white characters on a black background, instead of vice versa. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-S " density" .RB ( .densityPercent ) Same as .B \-density (which see). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-s " shrink" .RB ( .shrinkFactor ) Defines the initial shrink factor. The default value is @SHRINK@. If .I shrink is given as 0, then the initial shrink factor is computed so that the page fits within the window (as if the `s' keystroke were given without a number). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-safer .RB ( .safer ) This option turns on all available security options; it is designed for use when .B xdvi is called by a browser that obtains a .I dvi or \*(Te\& file from another site. #ifps This option selects #endif #ifghost .B +nogssafer and #endif #ifps .BR +allowshell . #endif #ifnops Otherwise, it has no effect, since .B xdvi has been compiled without support for PostScript specials. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-sidemargin " dimen" .RB ( .sideMargin ) Specifies the side margin (see .BR \-margins ). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-sourceposition " line" [: col "][ ]" filename This option makes .B xdvi search in the .I dvi file for the place corresponding to the indicated line (and, optionally, column) in the .tex source file, and highlight the place found by drawing a rectangle in the .I highlight color (see the .B \-hl option) around the corresponding text. In addition, when run with this argument (and the .B \-nofork option is not given, which see), .B xdvi will always return immediately: if it finds another instance of .B xdvi already showing .I dvi_file, then it will cause that instance to raise its window and move to the given place in the .I dvi file; otherwise it will start up its own instance in the background. If several instances of xdvi are displaying the respective .I dvi file, the instance which was last raised to the foreground will be used. .sp The space before .I filename is only needed if the filename starts with a digit. When the space is used, the argument needs to be enclosed in quotes to prevent the shell from misinterpreting the space as argument separator. .sp This option requires that .I dvi_file be prepared with source special information. See the section on SOURCE SPECIALS for details on how to do this. .sp Here is a more detailed description of how the filename in the .I \-sourceposition argument is matched with the filename in the source specials: .RS 7 .TP 3 1. If neither of the filenames contains a path name component, the filenames are compared ignoring the .RI ` .tex ' extensions in both filenames. .TP 2. Otherwise, if one of the filenames does contain a path component (e.g.: .IR ./test.tex , .IR ../test.tex , .IR /my/homedir/tex/test.tex or any combination of these), both filenames are expanded to a full path, with any occurrences of .I ../ and .I ./ expanded, and multiple slashes removed. .br The pathname in the .I \-sourceposition is expanded relative to the current working directory of the .I xdvi \-sourceposition invocation, and the pathnames in the source specials are expanded relative to the path of the current DVI file being viewed. .br The path names are then compared ignoring the .RI ` .tex ' extensions in both path names. .RE .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-statusline\fP .RB ( .statusline ) This option is obsolete; use \fB\-expertmode \fP \fIflag\fP instead (which see). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-thorough .RB ( .thorough ) .B Xdvi will usually try to ensure that overstrike characters .RI ( e.g. , .BR \enotin ) are printed correctly. On monochrome displays, this is always possible with one logical operation, either .I and or .IR or . On color displays, however, this may take two operations, one to set the appropriate bits and one to clear other bits. If this is the case, then by default .B xdvi will instead use the .I copy operation, which does not handle overstriking correctly. The .B \-thorough option chooses the slower but more correct choice. See also .BR \-copy . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-topmargin " dimen" .RB ( .topMargin ) Specifies the top and bottom margins (see .BR \-margins ). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-unique .RB ( .unique ) This option will make another instance of xdvi running on the same display act as a `server'. For example, the invocation .sp .B xdvi -unique +5 file.dvi .sp will cause this other instance to load .I file.dvi on page 5 in place of the file that it is currently displaying. If there is already another instance of xdvi already displaying the file .IR file.dvi , then it will just jump to page 5. If the other instance of xdvi is displaying a different file, it will load .I file.dvi instead. Otherwise, if no other instance of xdvi is currently running on the display, this option instead starts a new instance of xdvi in the background (unless the .I \-nofork option is specified, which see) displaying page 5 of .IR file.dvi . .br The filename and the .B +n option for the page number are the only options available for controlling a remote instance of xdvi like this; all other options are currently ignored. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-useTeXpages Use logical \*(Te\& pages (the values of the .I \ecount0 register) instead of physical pages for the pagelist labels and when jumping to a page in a document with the `g' keystroke (or the .B goto-page() action). This option can be toggled via the .RB ` T ' keystroke. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-version Print information on the version of .BR xdvi . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-visitedlinkcolor .RB ( .visitedLinkColor ) Color used for visited hyperlinks (`Purple4' by default). Hyperlinks become visited once you click on them. As for .BR linkColor , the value should be either a valid X color name or a hexadecimal color string. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B \-warnspecials .RB ( .warnSpecials ) Causes .B xdvi to print warnings about .B \especial strings that it cannot process to stderr. These warnings are suppressed by default. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-watchfile " n" .RB ( .watchFile ) If this option is set to a value larger than 0, xdvi will check the DVI file for changes every .I n seconds. If the DVI file has been completely written by TeX, it will be reloaded automatically. Fractional values (e.g. `2.5') are possible. The default for this option is 0, i.e. no watching. .br Since xdvi cannot handle partial DVI files, it tries not to reload the file while it is being rewritten. However, use of the magnifier or switching of pages requires reading (a part of) the DVI file, and if the .B tempfile option is switched off, this will erase the current contents of the window until the DVI file can be read entirely. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-wheelunit " pixels" .RB ( .wheelUnit ) Sets the number of pixels that a motion of a wheel mouse will move the image up or down. (See the .B wheel action, below, for more information on this.) If set to zero, the wheel mouse functionality is disabled. The default value is 80. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-xoffset " dimen" .RB ( .xOffset ) Specifies the size of the horizontal offset of the output on the page. See .BR \-offsets . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BI \-yoffset " dimen" .RB ( .yOffset ) Specifies the size of the vertical offset of the output on the page. See .BR -offsets . .PP .SH KEYSTROKES .B Xdvi recognizes the following keystrokes when typed in its window. Each may optionally be preceded by a (positive or negative) number, a `prefix argument', whose interpretation will depend on the particular keystroke. This prefix argument can be discarded by pressing the ``Escape'' key. If present, the ``Help'', ``Prior'' and ``Next'' keys are synonyms for .RB ` ? ', .RB ` b ', and .RB ` f ' keys, respectively. .PP The key bindings listed here are those that .B xdvi assigns by default. The names appearing in brackets at the beginning of the descriptions are the names of the actions associated with the keys; these can be used to customize the key bindings, as explained in more detail in the section .B CUSTOMIZATION below. If only a lowercase binding is listed, both upper- and lowercase keys will work for that binding. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\" .\" SPECIAL KEYS .\" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BR ESC " key" .RB [ discard-number() ] The escape key discards the numerical prefix for all actions (useful when you mistyped a number). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BR Return " key" .RB [ forward-page() ] Moves to the next page (or to the .IR n th next page if a number is given). Synonyms are .RB ` n ', .RB ` f ' and Line Feed. .TP .BR Backspace " key" .RB [ back-pagee() ] Moves to the previous page (or back .I n pages). Synonyms are .RB ` p ', .RB ` b ' and .BR Ctrl-h . .TP .BR Delete " key" .RB [ up-or-previous() ] Moves up two-thirds of a window-full, or to the top of the previous page if already at the top of the page. With a float argument, moves up the corresponding fraction of a window-full. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BR Space " key" .RB [ unpause-or-next() ] Moves down two-thirds of a window-full, or to the next page if already at the bottom of the page. .br When the option .BI \-pause " special-string" is used and the display is currently paused, this key will instead display the next portion of the page until the next .I special-string or the end of the page is encountered. See the description of the .B \-pause option for details. The action .RB [ down-or-next() ] does a similar thing, but without pausing; it is not bound to a key by default. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BR Ctrl-Home " (Xaw), " Ctrl-osfBeginLine " (Motif)" .RB [ goto-page(1) ] Moves to the first page of the document. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BR Ctrl-End " (Xaw), " Ctrl-osfEndLine " (Motif)" .RB [ goto-page() ] Moves to the last page of the document. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BR Home " (Xaw), " osfBeginLine " (Motif)" .RB [ home-or-top() ] Move to the ``home'' position of the page, or to the top of the page if the .I keep flag is set (in this case, the page doesn't scroll horizontally). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BR End " (Xaw), " osfEndLine " (Motif)" .RB [ end-or-bottom() ] Move to the ``end'' position of the page (the lower right-hand corner), or to the bottom of the page if the .I keep flag is set (in this case, the page doesn't scroll horizontally). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\" .\" ARROW KEYS .\" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Down arrow .RB [ down(0.015) ] Scrolls page down. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Up arrow .RB [ up(0.015) ] Scrolls page up. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Right arrow .RB [ right(0.015) ] Scrolls page right. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Left arrow .RB [ left(0.015) ] Scrolls page left. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\" .\" ORDINARY KEYS. Note that the special symbols ([ ] + - etc.) are not in .\" strict ASCII order (found that more intuitive). Sequence for each letter .\" is: Alt-Ctrl, Ctrl, uppercase, lowercase. .\" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Alt-Ctrl-+ .RB [ change-density(25) ] Increase the darkness of the fonts in the DVI window by adding to the gamma value (see also the .RB ` S ' keystroke). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Alt-Ctrl-- .RB [ change-density(-25) ] Decrease the darkness of the fonts in the DVI window by subtracting from the gamma value (see also the .RB ` S ' keystroke). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-+ .RB [ set-shrink-factor(+) ] Increase the shrink factor (see also the .RB ` s ' keystroke). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-- .RB [ set-shrink-factor(-) ] Decrease the shrink factor (see also the .RB ` s ' keystroke). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctr-[ .RB [ pagehistory-delete-backward() ] Delete the current item in the page history and move to the history item before the deleted one. With a prefix argument .BR n , delete .B n previous history items. See .B PAGE HISTORY for details. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B [ .RB [ pagehistory-back() ] Move back in the page history (see .B PAGE HISTORY for details). With a prefix argument .BR n , move back .B n history items. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctr-] .RB [ pagehistory-delete-forward() ] Delete the current item in the page history and move to the history item after the deleted one. With a prefix argument .BR n , delete .B n next history items. See .B PAGE HISTORY for details. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B ] .RB [ pagehistory-forward() ] Move forward in the page history (see .B PAGE HISTORY for details). With a prefix argument .BR n , move forward .B n history items. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .BR ^ .RB [ home() ] Move to the ``home'' position of the page. This is normally the upper left-hand corner of the page, depending on the margins as described in the .B \-margins option, above. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B ? .RB [ help() ] Same as the .B h key (which see). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B B .RB [ htex-back() ] This key jumps back to the previous hyperlink anchor. See the section .B HYPERLINKS for more information on navigating the links. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B b .RB [ back-page() ] Moves to the previous page (or back .I n pages). Synonyms are .RB ` p ', .B Ctrl-h and .BR Backspace . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifcolor .TP .B C .RB [ set-color() ] This key toggles the use of color specials. The key sequences .RB ` 0C ' and .RB ` 1C ' turn interpretation of color specials off and on, respectively. See also the .B \-nocolor option. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B c .RB [ center() ] Moves the page so that the point currently beneath the mouse cursor is moved to the middle of the window, and warps the mouse cursor to the same place. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B D .RB [ toggle-grid-mode() ] This key toggles the use of a grid on the displayed page. If no number is given, the grid mode is switched on or off. By prepending a number from 1 to 3, 3 different grid levels can be set. The units of the grid are inches or centimeters, depending on whether the paper format is letter (in) or a4 (cm). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B d .RB [ down() ] Moves page down two thirds of a window-full. With a float argument to ``down'', moves down the corresponding fraction of a window-full. .\" Therefore, a more .\" ``smooth'' scrolling using the ``Up'' and ``Down'' keys can be .\" achieved by the the following setting: .\" .sp .\" xdvi.mainTranslations: #override\e .\" .br .\" Up:up(0.01)\en\e .\" .br .\" Down:down(0.01)\en .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-f .RB [ find() ] Pop up a window to search for a string in the DVI file. See the section .BR "STRING SEARCH" , below, for more details. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B f .RB [ forward-page() ] Moves to the next page (or to the .IR n th next page if a number is given). Synonyms are .RB ` n ', Return, and Line Feed. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifgrey .TP .B G .RB [ set-greyscaling() ] This key toggles the use of greyscale anti-aliasing for displaying shrunken bitmaps. In addition, the key sequences .RB ` 0G ' and .RB ` 1G ' clear and set this flag, respectively. See also the .B \-nogrey option. .sp If given a numeric argument that is not 0 or 1, greyscale anti-aliasing is turned on, and the gamma resource is set to the value divided by 100. E.g., .RB ` 150G ' turns on greyscale and sets gamma to 1.5. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-g .RB [ find-next() ] Find the next match string in the DVI file; this can be used instead of pressing the `Find' button in the search window. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B g .RB [ goto-page() ] Moves to the page with the given number. If no page number is given, xdvi jumps to the last page. .br If the option/resource .B useTeXpages is active, the numbers correspond to the actual page numbers in the TeX file; otherwise, absolute page numbers (starting from 1) are used. In the latter case, the page numbers can be changed with the .RB ` P ' keystroke, below. Note that with the .B useTeXpages option it is possible that the same page number occurs multiple times; in such a case, xdvi will use the first page number that matches. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B h Pops up a help window with a short explanation of the most important key bindings and concepts. .\" .\" Ummh, surely nobody will use the following ... .\" .\" For I18n purposes, the help texts and menu entries are configurable .\" via the following X resources: .\" .BR helpGeneral , .\" #ifhyper .\" .BR helpHypertex , .\" #endif .\" .BR helpOthercommands , .\" .BR helpMarking , .\" .BR helpPagemotion , .\" .BR helpMousebuttons , .\" .BR helpRulermode , .\" .BR helpSearch and .\" .BR helpSourcespecials . .\" The values of this resource should be a text string, the first line of .\" which should contain two fields separated by `\en'. The first field is .\" used as list entry for the list of help topics on the left of the help .\" window, and the second field is used as the heading on the right-hand side. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B k .RB [ set-keep-flag() ] Normally when .B xdvi switches pages, it moves to the home position as well. The .RB ` k ' keystroke toggles a `keep-position' flag which, when set, will keep the same position when moving between pages. Also .RB ` 0k ' and .RB ` 1k ' clear and set this flag, respectively. See also the .B \-keep option. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-l .RB [ fullscreen(toggle) ] Toggles fullscreen mode (see the description of the .B \-fullscreen option for more information on this). This is even more flaky than using the command-line option: There is no universal standard how a window could change its own geometry or window decorations at run-time, so this will not work with most window managers or desktops. Generally, it's better to use the window manager controls to change the size or decorations of the xdvi window. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B l .RB [ left() ] Moves page left two thirds of a window-full. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B M .RB [ set-margins() ] Sets the margins so that the point currently under the mouse cursor defines the upper left-hand corner of the text in the page. Note that the command does .I not move the image, but only determines the margins for the page switching commands. For details on how the margins are used, see the .B \-margins option. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B m .RB [ toggle-mark() ] Toggles the mark for the current page in the page list. When a page is marked, it is displayed with a small star `*' next to the page number. The marked pages can then be printed or saved to a file. A page or several pages can also be marked by clicking or dragging .B Mouse-2 in the page list. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-n .RB [ toggle-mark()forward-page() ] Toggles the mark for the current page in the page list, and moves to the next page. This lets you quickly mark a series of subsequent pages. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B n .RB [ forward-page() ] Moves to the next page (or to the .IR n th next page if a number is given). Synonyms are .RB ` f ', Return, and Line Feed. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-o .RB [ select-dvi-file() ] Read a new .I dvi file. A file-selection widget is popped up for you to choose the DVI file from. If a prefix argument .I n is given, the .I n th file from the file history is opened instead. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B P .RB [ declare-page-number() ] ``This is page number .IR n .'' This can be used to make the .RB ` g ' keystroke refer to a different page number than the physical page. (If you want to use `logical' or \*(Te\& page numbers instead of physical pages, consider using the option .B \-useTeXpages instead.) The argument .I n should be given as prefix to this key. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-p .RB [ print() ] Opens a popup window for printing the DVI file, or parts of it. See the section .B PRINT DIALOG for an explanation of the options available, and the resources to customize the default behaviour. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B p .RB [ back-page() ] Moves to the previous page (or back .I n pages). Synonyms are .RB ` b ', .B Ctrl-h and .BR Backspace . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B q .RB [ quit() ] Quits the program. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-r .RB [ forward-page(0) ] Redisplays the current page. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B R .RB [ reread-dvi-file() ] Forces the .I dvi file to be reread. This allows you to preview many versions of the same file while running .B xdvi only once. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B r .RB [ right() ] Moves page right two thirds of a window-full. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-s .RB [ save() ] Opens a popup window for saving the DVI file, or parts of it. See the section SAVE DIALOG below for more information on this. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B S .RB [ set-density() ] Sets the density factor to be used when shrinking bitmaps. This should be a number between 0 and 100; higher numbers produce lighter characters. #ifgrey If greyscaling mode is in effect, this changes the value of gamma instead. The new value of gamma is the given number divided by 100; negative values are allowed. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B s .RB [ set-shrink-factor() ] Changes the shrink factor to the given number. If no number is given, the smallest factor that makes the entire page fit in the window will be used. (Margins are ignored in this computation.) .\" NOTE: following only works in action string, not interactively!!! .\" Two special values are .\" .B + .\" and .\" .B - .\" which zoom in and out respectively, by decrementing/incrementing the .\" shrinkfactor by one step. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B T .RB [ use-tex-pages() ] Use logical \*(Te\& pages (the values of the .I \ecount0 register) instead of physical pages for the pagelist labels and when jumping to a page in a document via .BR goto-page() . See also the .B \-useTeXpages option. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B t .RB [ switch-magnifier-units() ] Switches the units used for the magnifier tick marks, and for reporting the distance between the mouse pointer and the ruler centre in ruler mode (see the section .BR MODES ). The default value is specified by the X resource .B tickUnits (`mm' by default). The units toggle through the following values; except for `px', they all correspond to \*(Te\&'s units: .I mm (millimeters) .I pt (\*(Te\& points), .I in (inches), .I sp (scaled points, the unit used internally by \*(Te\&) .I bp (big points or `Postscript points'), .I cc (cicero points), .I dd (didot points), .I pc (pica), and .I px (screen pixels). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-u .RB [ back-page()toggle-mark() ] Moves to the previous page, and toggles the mark for that page. This is the dual action to .BR Ctrl-n . .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B u .RB [ up() ] Moves page up two thirds of a window-full. With a float argument to ``up'', moves up the corresponding fraction of a window-full. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-v .RB [ show-source-specials() ] Show bounding boxes for every source special on the current page, and print the strings contained in these specials to stderr. With prefix 1, show every bounding box on the page. This is for debugging purposes mainly. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifghost .TP .B V .RB [ set-gs-alpha() ] This key toggles the anti-aliasing of PostScript specials when .B Ghostscript is used as renderer. In addition the key sequences .RB ` 0V ' and .RB ` 1V ' clear and set this flag, respectively. See also the .B \-gsalpha option. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifps .TP .B v .RB [ set-ps() ] This key toggles the rendering of PostScript specials between 3 states: .RS 7 .TP 0 .SB - specials (like EPS graphics) are displayed; .TP .SB - specials are displayed along with their bounding box (if available); .TP .SB - only the bounding box is displayed. .PP .sp The states can also be selected directly by using .RB ` 1v ', .RB ` 2v ' and .RB ` 0v ' respectively. See also the .B \-postscript option. .RE #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Ctrl-x .RB [ source-what-special() ] Display information about the source special next to the mouse cursor in the statusline. This is the same special that would be found by .IR source-special() , but without invoking the editor. For debugging purposes. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B x .RB [ set-expert-mode() ] Toggles expert mode, in which the statusline, the scrollbars, the menu buttons, the toolbar (Motif only) and the page list are not shown. Typing .RB ` 1x ' toggles the display of the statusline at the bottom of the window. Typing .RB ` 2x ' toggles the scrollbars (if available). For Xaw, .RB ` 3x ' toggles the menu buttons and the page list, for Motif, it toggles the page list. In Motif, the additional bindings .RB ` 4x ' toggle the toolbar, and .RB ` 5x ' the menu bar. .br Without a prefix argument, all of the mentioned GUI elements are either switched on (if they had been invisible before) or off. .br Toggling the scrollbars may behave erratically with the Xaw widgets; e.g. the scrollbars may reappear after resizing the window, and at certain window sizes one of the scrollbars may fail to disappear. .br See also the option .B \-expertmode (the numbers above correspond to the bits in the argument to .BR \-expertmode ). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH MOUSE ACTIONS IN THE MAIN WINDOW The mouse actions can be customized by setting the X resource .BR mouseTranslations . Since there are three different mouse modes (see the section .B MODES below), there is a special action .B mouse-modes which lists the actions for each of the three modes: \fBmouse-modes("ACTIONS-FOR-MODE1", "ACTIONS-FOR-MODE2", "ACTIONS-FOR-MODE3")\fR. If only one argument is specified, this action is used for all modes. The default bindings are as follows: .RS 5 .nf .ft 3 .sp 1n xdvi.mouseTranslations: \e Shift:mouse-modes("drag(+)")\en\e Shift:mouse-modes("drag(|)")\en\e Shift:mouse-modes("drag(-)")\en\e Ctrl:mouse-modes("source-special()")\en\e : mouse-modes("do-href()magnifier(*2)", "text-selection()", "ruler()")\en\e : mouse-modes("do-href-newwindow()magnifier(*2)", "text-selection()", "ruler()")\en\e : mouse-modes("magnifier(*3)")\en\e : mouse-modes("wheel(-0.2)")\en\e : mouse-modes("wheel(0.2)")\en\e .sp 1n .ft .fi .RE All of these actions are described in more detail below. Note the use of quote symbols around the action strings, which are neccessary to group them into one argument. The buttons 4 and 5 refer to wheel movements (wheel up/down) on wheel mice. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B do-href() .TP .B do-href-newwindow() .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Usually, if a binding specifies more then one action, all actions are executed in a sequence. The hyperlink bindings .B do-href() and .B do-href-newwindow() are special in that they are used as an .I alternative to other actions that might follow them .I if the mouse is currently located on a hyperlink. In this case, none of the other actions will be executed; otherwise, only the other actions are executed. .br The action .B do-href() jumps to the link target in the current xdvi window (eventually switching to another page), and .B do-href-newwindow() opens a new instance of xdvi for the link target. In both cases, the location of the target is indicated by a small arrow drawn in the same color as a visited link in the left corner of the window. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B magnifier(n x m) .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B magnifier(*n) This action will pop up a ``magnifying glass'' which shows the unshrunk image of the region around the mouse pointer. The magnifier disappears when the mouse button is released. Moving the mouse cursor while holding the button down will move the magnifier. .br Different mouse buttons produce different sized windows, as indicated by the the argument of the .I magnifier() action. Its argument is either a string of the form .IR width x height , as in the .BI \-mgs n command-line option, or one of the strings .B *1 through .BR *5 , referring to the value specified by the corresponding .BI \-mgs n option. .\" Note that in order to assign magnifier actions to .\" the buttons 4 or 5, you need to use the resource .\" .B wheelTranslations .\" (more about this resource below), e.g.: .\" .sp .\" xdvi.wheelTranslations: : magnifier(*4)\en\e .\" : magnifier(*5)\en .\" .sp .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B drag(+) .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B drag(|) .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B drag(-) Drags the page with the mouse. This action should have one parameter, the character .RB `` | '', .RB `` - '', or .RB `` + '', indicating vertical dragging only, horizontal dragging only, or dragging in all directions. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B source-special() This action starts a ``reverse search'', opening the editor at the location in the \*(Te\& file corresponding to the pointer location in the DVI file. See the section on SOURCE SPECIALS, below, for more information on this. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B wheel() This action can be used to scroll the image with a wheel mouse, where it is usually bound to mouse button 4 (wheel up) or 5 (wheel down). The action takes one parameter, giving the distance to scroll the image. If the parameter contains a decimal point, the distance is given in wheel units; otherwise, pixels. A negative value scrolls up, a positive value scrolls down. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B text-selection() This action allows you to mark a rectangular region of text in the DVI file. The text is put into the X selection buffer and can be pasted into other applictions (e.g. text editors). This works similar to the Plain text option in the .B Save dialog; see the discussion there for more information on encoding issues. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B ruler() This action creates a cross-shaped ruler. Moving the mouse and holding the button down drags the ruler and lets you measure distances on the page. See the section .B Ruler Mode for more information on this. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH UNBOUND ACTIONS The following actions are not bound to a key by default, but are available for customization. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B quit-confirm() Pops up a confirmation window to quit xdvi. To bind it to the .RB ` q ' key instead of the default `quit()' action, put the following into your .I ~/.Xdefaults file: .sp xdvi.mainTranslations: #override\e .br q: quit-confirm()\en .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B down-or-next() Similar to .IR unpause-or-next() : Moves down two-thirds of a window-full, or to the next page if already at the bottom of the page. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B shrink-to-dpi() This action takes one (required) argument. It sets the shrink factor to an integer so as to approximate the use of fonts with the corresponding number of dots per inch. If .B xdvi is using fonts scaled for .I p dots per inch, and the argument to .B shrink-to-dpi is .IR n , then the corresponding shrink factor is the ratio .IR p / n , rounded to the nearest integer. .PP .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH CUSTOMIZATION Key and mouse button assignments can be changed by setting the .B mainTranslations resource to a string of translations as defined in the documentation for the X toolkit. The actions should take the form of action names listed in the KEYSTROKES and MOUSE ACTIONS sections. .PP An exception to this are the Motif keys .IR osfPageUp " (" PgUp ), .IR osfPageDown " (" PgDown ), .IR osfBeginLine " (" Home ) and .IR osfEndLine " (" End ) which are currently not customizable in the Motif version. .PP Key actions will usually be without arguments; if they are passed an argument, it represents the optional number or `prefix argument' typed prior to the action. .PP Some key actions may take special arguments, as follows: The argument of .B goto-page may be the letter .RB ` e ', indicating the action of going to the end of the document. The argument of .B set-shrink-factor may be the letter .RB ` a ', indicating that the shrink factor should be set to the smallest value such that the page will fit in the window, or one of the signs .RB ` + ' or .RB ` - ', indicating that the shrink factor should be increased or decreased, respectively. Finally, actions that would perform a toggle, such as .BR set-keep-flag , may receive an argument .RB ` t ', indicating that the action should toggle regardless of the current prefix argument. .PP Mouse actions should refer only to .B ButtonPress events (e.g., .BR ":magnifier(*1)" ). The corresponding motion and release events will be handled internally. A key action may be bound to a mouse event, but not vice versa. .PP Usually the string of translations should begin with .RB `` #override '', indicating that the default key and mouse button assignments should not be discarded. .PP When keys or mouse buttons involving modifiers (such as Ctrl or Shift) are customized together with their non-modified equivalents, the modified keys should come first, for example: .RS 5 .nf .ft 3 .sp 1n xdvi.mainTranslations: #override \e Shifts: select-dvi-file()\en\e Ctrls: save()\en\e s: find()\en .sp 1n .ft .fi .RE .PP Because .B xdvi needs to capture pointer motion events, and because the X Toolkit translations mechanism cannot accommodate both motion events and double-click events at the same time, it is not possible to specify double-click actions in .B xdvi customizations. For information on this and other aspects of translations, see the X Toolkit Intrinsics documentation. .PP There is no command-line option to set the .B mainTranslations resource, since changing this resource on the command line would be cumbersome. To set the resource for testing purposes, use the .B -xrm command-line option provided by the X toolkit. For example, \fBxdvi \-xrm 'XDvi.mainTranslations: #override "z":quit()' ...\fR or .B "xdvi \-xrm 'XDvi.mainTranslations: #override z:quit()' ..." will cause the key .RB ` z ' to quit .BR xdvi . .PP Some resources are provided to allow customization of the geometry of the Xaw command buttons. Again, they are not changeable via command-line options, other than via the .B \-xrm option. All of these resources take integer values. .TP .B buttonSideSpacing The number of pixels to be placed on either side of the buttons. The default value is 6. .TP .B buttonTopSpacing The number of pixels between the top button and the top of the window. The default value is 50. .TP .B buttonBetweenSpacing The number of pixels between the buttons. The default value is 20. .TP .B buttonBetweenExtra The number of pixels of additional space to be inserted if the .B buttonTranslations resource string contains an extra newline character. The default value is 50. .TP .B buttonBorderWidth The border width of the button windows. The default value is 1. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH PAGE LIST The scrollable page list on the right of the main window allows you to jump directly to a page in the DVI file. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Mouse-1 Jumps to the page the mouse is located on. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B Mouse-2 .RB [ toggle-mark() ] Toggle the mark of the current page. The marks are used by the `Print' and `Save to file' dialogs to select only marked pages from the DVI file. .PP When the mouse pointer is inside the page list, the mouse wheel switches to the next or previous page. .PP .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH SCROLLBARS The scrollbars (if present) behave in the standard way: pushing Button 2 in a scrollbar moves the top or left edge of the scrollbar to that point and optionally drags it; pushing Button 1 moves the image up or right by an amount equal to the distance from the button press to the upper left-hand corner of the window; pushing Button 3 moves the image down or left by the same amount. .PP The scrollbars can be removed via the .I -expertmode flag/keystroke (which see). .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH MAGNIFIER By default, the mouse buttons 1 to 5 will pop up a ``magnifying glass'' that shows an unshrunken image of the page (i.e. an image at the resolution determined by the option/X resource .B pixels or .BR mfmode ) at varying sizes. When the magnifier is moved, small ruler-like tick marks are displayed at the edges of the magnifier (unless the X resource .B delayRulers is set to false, in which case the tick marks will always be displayed). The unit of the marks is determined by the X resource .B tickUnits (mm by default). This unit can be changed at runtime via the action .BR switch-magnifier-units() , by default bound to the keystroke .RB ` t ' (see the description of that key, and of switch-magnifier-units() for more details on the units available). .br The length of the tick marks can be changed via the X resource .B tickLength (4 by default). A zero or negative value suppresses the tick marks. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH PAGE HISTORY Xdvi keeps a history of viewed pages, and you can move through the history and delete items using the keys .B [ .RI ( pagehistory-back() ), .B ] .RI ( pagehistory-forward() ), .B Ctr-[ .RI ( pagehistory-delete-backward() ) and .B Ctr-] .RI ( pagehistory-delete-forward() ). .PP When one of the history commands is used, the page history is displayed in the status line at the bottom of the window, with the current list item marked by square brackets `[', `]' and a left and right context of at most 10 items. File boundaries are marked by `#'. .PP The size of the history can be customized with the X resource .B pageHistorySize (the default size is 1000 items). If the size is set to 0, the history commands are disabled. .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH HYPERLINKS The actions .B do-href() and .B do-href-newwindow() (by default bound to Mouse-1 and Mouse-2 if the pointer is currently located on a hyperlink) can be used to open the link target in the same window .RB ( do-href() ) or in a new window .RB ( do-href-newwindow() ). .PP If the link target is not a file on the local disk, xdvi tries to launch a web browser (as specified by the .B -browser command line option, the .B BROWSER environment variable or the .B wwwBrowser X resource, in this order) to retrieve the document. See the description of the .B BROWSER environment variable, below, for an example setting. .PP If the file is a local file, xdvi tries to determine if it is a DVI file. If it is, xdvi will try to display the file; otherwise it will try to determine the MIME type of the file, and from that an application suitable for opening the file. This is done by parsing the files specified by the environment variable .B EXTENSIONMAPS for a mapping of filename extensions to MIME types, and the files determined by the environment variable .B MAILCAPS for a mapping of MIME types to application programs. See the descriptions of these variables in the section .BR ENVIRONMENT , below, for a more detailed description and the default values of these variables. If no suitable files are found, a set of built-in default MIME types and applications is used. .PP Xdvi currently uses no heuristics apart from the filename suffix to determine the mime type of a file. If a filename has no suffix, the value of the resource .B noMimeSuffix is used (by default .IR application/x-unknown ). If the suffix doesn't match any of the suffixes in .BR mime.types , the value of the resource .B unknownMimeSuffix is used (by default .IR application/x-unknown ). If the .B mailcap entries do not list a viewer for a given mime type, xdvi will show a warning popup. If you want to avoid this warning, and for example want to always use the netscape browser for unknown MIME types, you could add the following line to your ~/.mailcap file: .RS 4 .nf .ft 3 .sp 1n application/xdvi-unknown; \e netscape -raise -remote 'openURL(%s,new-window)' .sp 1n .ft .fi .RE .\" As an example, consider the following settings, which are the default .\" settings for buttons 1 and 2: .\" .RS 5 .\" .nf .\" .ft 3 .\" .sp 1n .\" xdvi.mainTranslations: #override \e .\" : do-href()magnifier(*1)\en\e .\" : do-href-newwindow()magnifier(*2)\en\e .\" : magnifier(*3)\en .\" .sp 1n .\" .ft .\" .fi .\" .RE .\" .PP .\" If a link points to a file which is not a DVI file (e.g. HTML, or .\" PostScript), the files .\" .B mime.types .\" and .\" .B mailcap .\" are parsed to determine a suitable viewer; if no suitable .\" .B mailcap .\" entry was found, if the .\" .SB WWWBROWSER .\" environment variable is set, or .\" .B \-browser .\" was specified on the command line, the browser is launched to load the file. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH STRING SEARCH The keystroke .I Ctrl-f or the menu entry .I File > Find ... (or the `Binoculars' symbol in the toolbar, for Motif) opens a dialog window to search for a text string or a regular expression in the DVI file. The keystroke .I Ctrl-g jumps to the next match (like pressing the `Find' button in the search window). .PP By default, the matches are highlighted in inverted color. If the display isn't running in TrueColor, or if the X resource .B matchHighlightInverted is set to false or the command-line option .B \-nomatchinverted is used, xdvi will instead draw a rectangle in .I highlight color (see the .B \-hl option) around the match. .PP If a match crosses a page boundary, only the part on the first page is highlighted. .B Xdvi will scan up to 2 adjacent pages to match strings crossing page boundaries; but note that header or footer lines, or intervening float pages will be treated as parts of the scanned text. Such text will usually cause multi-page matching to fail. .PP This emphasizes the fact that searching in the formatted text (the DVI output) works differently from searching in the source text: Searching in the DVI file makes it easier to skip formatting instructions, and makes it possible to search for e.g. hyphenation and equation numbers; but sometimes the formatting results can also get in the way, e.g. in the case of footnotes. In these cases it's better to search in the \*(Te\& source instead. The use of .I source specials will make switching between the xdvi display and the editor with the \*(Te\& source easier; see the section .B SOURCE SPECIALS below for more information on this. .PP The text extracted from the DVI file is in encoded in UTF-8 (you can view that text by saving the file in UTF-8 format via the .I File > Save as ... menu item). If xdvi has been compiled with locale, .I nl_langinfo() and .I iconv support, the search term is converted from the character set specified by the current locale into UTF-8. (See the output of .B locale -a for a list of locale settings available on your system). If .I nl_langinfo() is not available, but .I iconv is, you can specify the input encoding for .I iconv via the X resource .I textEncoding (see the output of .B iconv -l for a list of valid encodings). If .I iconv support is not available, only the encodings .I ISO-8859-1 and .I UTF-8 are supported (these names are case-insensitive). .PP Ideographic characters from CJKV fonts are treated specially: All white space (spaces and newlines) before and after such characters is ignored in the search string and in the DVI file. .PP To match a newline character, use \fI\en\fR in the search string; to match the string \fI\en\fR, use \fI\e\en\fR. .PP If the checkbox .I Regular Expression is activated, the string is treated as a regular expression in extended POSIX syntax, with the following properties: .RS 2 .TP 2 - \fIa?\fR matches \fIa\fR zero or one times. .TP - \fIa*\fR matches \fIa\fR zero or more times. .TP - \fIa+\fR matches \fIa\fR one or more times. Note that \fI*\fR and \fI+\fR are greedy, i.e. they match the longest possible substring. .TP - The pattern \fI.\fR matches any character except for newline. To also match a newline, use `\fI(.|\en)\fR'. .TP - \fIa{n}\fR matches \fIa\fR exactly n times. .TP - \fIa{n,m}\fR matches \fIa\fR at least n and no more than m times. .TP - \fIa|b\fR matches \fIa\fR or \fIb\fR. Brackets can be used for grouping, e.g.: \fI(a|b)|c\fR. .TP - The string matched by the nth group can be referenced by \fI\en\fR, e.g. \fI\e1\fR refers to the first match. .TP - The characters \fI^\fR and \fI$\fR match the beginning and the end of a line, respectively. .TP - \fI[abc]\fR matches any of the letters a, b, c, and \fI[a-z]\fR matches all characters from a to z. .TP - Each item in a regular expression can also be one of the following POSIX character classes: .br .nf .I [[:alnum:]] [[:alpha:]] [[:blank:]] [[:cntrl:]] [[:digit:]] .I [[:graph:]] [[:lower:]] [[:print:]] [[:space:]] [[:upper:]] .fi These can be negated by inserting a \fI^\fR symbol after the first bracket: .I [^[:alpha:]] For more details on POSIX regular expressions, see e.g. the .B IEEE Std 1003.1 standard definition available online from: .nf http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap09.html .fi .TP - As a non-standard extension, the following Perl-like abbreviations can be used instead of the POSIX classes: .nf .sp 1n .ta 1L +8L +30L Symbol Meaning POSIX Class \fI\ew\fR an alphanumeric character \fI[[:alnum:]]\fR \fI\eW\fR a non-alphanumeric character \fI[^[:alnum:]]\fR \fI\ed\fR a digit character \fI[[:digit:]]\fR \fI\eD\fR a non-digit character \fI[^[:digit:]]\fR \fI\es\fR a whitespace character \fI[[:space:]]\fR \fI\eS\fR a non-whitespace character \fI[^[:space:]]\fR .sp 1n .fi .TP - The following characters are special symbols; they need to be escaped with \fI\e\fR in order to match them literally: \fI ( ) [ ] . * ? + ^ $ \e\fR. .TP - Matches of length zero are silently skipped. .RE .PP The dialog also provides checkboxes to: .RS 2 .TP 2 - search backwards; .TP - match in a case-sensitive manner (the default is to ignore case, i.e. a search string .I Test will match both the strings .I test and .I TEST in the DVI file); .TP - ignore line breaks and hyphens: This removes all hyphens at the ends of lines and the following newline characters, and replaces all remaining newline characters by white spaces. So hyphenated words will appear as one word to the search, and a search for two words with a space in between will also match the words if they are separated by a linebreak. .br Note that the hyphen removal may cause unwanted side effects for compound words containing hyphens that are wrapped after the hyphen, and that replacing the newlines affects the interpretation of regular expressions as follows: The \fI.\fR pattern will also match newlines, and \fI^\fR and \fI$\fR won't match begin and end of lines any more. (Since currently there is no option for turning off the greediness of \fI*\fR and \fI+\fR, turning on this option will usually result in matches that are longer than desired.) .RE .PP The current checkbox settings are saved in the .I ~/.xdvirc file. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH PRINT DIALOG The print dialog window allows you to print all pages, marked pages (click or drag Mouse-2 in the page list to mark them), or a range of pages. Note that the page numbers always refer to physical pages, so if you're using the option `use TeX pages', you may want to disable it to make it easier to determine the correct page numbers (or avoid this problem altogether by marking the pages to be printed). .PP The value of the .B Printer text filed is passed to .B dvips via the .B -o! mechanism, as a single argument after the `!'. Any arguments listed in the .B Dvips options field are segmented at whitespaces and passed as separate arguments to dvips. If you e.g. want to print the file 2-up, you should enter the following string into the .B Printer field: .RS 5 .nf .sp 1n \fIpsnup -2 -q | lpr -Plp\fP .sp 1n .fi .RE .PP There are several resources for customizing the behaviour and the default entries of the print dialog: .TP .B dvipsPrinterString .TP .B dvipsOptionsString These can be used to provide default entries for the .B Printer and the .B Dvips options text fields, respectively. If no paper size is specified in the DVI file (via e.g. \eusepackage[dvips]{geometry} - this is the preferred method), the input field is initialized with the current value of the command line option/X resource .BR paper . E.g., the option .I -paper a4r is translated into the dvips options .IR "-t a4 -t landscape" . Note that no check is performed whether dvips actually understands these options (it will ignore them if it can't); currently not all options used by xdvi are also covered by dvips. .TP .B dvipsHangTime .TP .B dvipsFailHangTime These specify the time (in milliseconds) that the printing progress window will stay open after the .B dvips process has terminated. The value of .BR dvipsHangTime is used if the process terminates successfully; .B dvipsFailHangTime is used if it terminates with an error. The default values are 1.5 and 5 seconds, respectively. If both values are negative, the window will stay open until it is closed by the user. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH SAVE DIALOG This dialog allows you to save all or selected/marked pages in the current DVI file. You can save in one of the following formats: .RS 2 .TP 2 - Postscript (uses .B dvips to convert the DVI file to a Postscript file, just like when printing to a Postscript file). .TP - PDF (first uses .B dvips to convert the DVI file to a Postscript file, then uses .B ps2pdf to convert the Postscript file to PDF). .TP - Plain text in ISO-8859-1 or UTF-8 encoding. The latter will preserve more of the special LaTeX characters e.g. from mathematical mode. Note however that e.g. only few of LaTeX's mathematical symbols can be rendered correctly as text; so this funcionality works best for plain text documents. If a character cannot be displayed in the selected charset, it is replaced by `\e' followed by the hexadecimal character code. If a character is not recognized at all, it is replaced by `?'. .RE .PP The programs for Postscript and PDF conversion can be customized via the command line options or X resources .BR -dvipspath / .dvipsPath and .BR -ps2pdfpath / .ps2pdfPath , respectively; see the explanation of these options above for more details. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH MODES The keystroke .B Ctrl-m [\fBswitch-mode()\fR] switches between three different mouse bindings, which can also be activated via the .B Modes menu (in Motif, this is a submenu of the .B Options menu called .BR "Mouse Mode" ). The default mode at startup can be customized via the X resource .B mouseMode or the command-line option .BR \-mousemode . The default startup mode is Magnifier Mode. .PP .B Note: The modes are implemented by changing the .I magnifier() action. Switching the mode will not work if .B Mouse-1 has been customized to an action sequence that does not contain the magnifier() action. .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B "Magnifier Mode" In this mode, the mouse buttons 1 to 5 pop up a ``magnifying glass'' that shows an unshrunken image of the page (i.e. an image at the resolution determined by the option/X resource .B pixels or .BR mfmode ) at varying sizes. When the magnifier is moved, small ruler-like tick marks are displayed at the edges of the magnifier (unless the X resource .B delayRulers is set to false, in which case the tick marks are always displayed). The unit of the marks is determined by the X resource .B tickUnits (mm by default). This unit can be changed at runtime via the action .BR switch-magnifier-units() , by default bound to the keystroke .RB ` t ' (see the description of that key, and of switch-magnifier-units() for more details on the units available). .br The length of the tick marks can be changed via the X resource .B tickLength (4 by default). A zero or negative value suppresses the tick marks. .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B "Text Selection Mode" This mode allows you to select a rectangular region of text in the DVI file by holding down .B Mouse-1 and moving the mouse. The text is put into the X primary selection so that it can be pasted into other X applications with .B Mouse-2 as usual. .br If xdvi has been compiled with locale, .I nl_langinfo() and .I iconv support, the selected text is converted into the character set of the current locale (see the output of .B locale -a for a list of locale settings available on your system). If .I nl_langinfo() is not available, but .I iconv is, you can specify the input encoding for .I iconv via the X resource .I textEncoding (see the output of .B iconv -l for a list of valid encodings). If .I iconv support is not available, only the encodings .I ISO-8859-1 and .I UTF-8 are supported (these names are case-insensitive). .br Note that UTF-8 is the only encoding that can render all characters (e.g. mathematical symbols) of a DVI file. If ISO-8859-1 is active, characters that cannot be displayed are replaced by `\e' followed by the hexadecimal character code. For other encodings, such characters may trigger iconv error messages. If a character is not recognized at all, it is replaced by `?'. .br To extract larger portions of text, you can alternatively save selected pages or the entire file in text format via the .B File > Save as ... menu. .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .B "Ruler Mode" This mode provides a simple way of measuring distances on the page. .br When this mode is activated, the mouse cursor changes into a thin cross, and a larger, cross-shaped ruler is drawn in the highlight color at the mouse location. The ruler doesn't have units attached to it; instead, the current distance between the ruler and the mouse cursor is continuously printed to the statusline. .br When activating Ruler Mode, the ruler is at first attached to the mouse and can be moved around. It can then be positioned at a fixed place by clicking .BR Mouse-1 . After that, the mouse cursor can be moved to measure the horizontal .RI ( dx ), vertical .RI ( dy ) and direct (shortest) .RI ( dr ) distance between the ruler center point and the mouse. .br Clicking .B Mouse-1 again will move the ruler to the current mouse position, and holding down .B Mouse-1 will drag the ruler around. .br In Ruler Mode, the following special keybindings extend or replace the default bindings: .RS 7 .TP 7 .B o .RB [ ruler-snap-origin() ] Snap the ruler back to the origin coordinate (0,0). .TP .B t \fR[overrides \fBswitch-magnifier-units()\fP] Toggle between various ruler units, which can be specified by the X resource .B tickUnits (`mm' by default). .TP .B P \fR[overrides \fBdeclare-page-number()\fP] Print the distances shown in the statusline to standard output. .RE .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH TOOLBAR (Motif only) The Motif toolbar can also be customized. The XPM file used for the toolbar icons can be specified via the resource .BR toolbarPixmapFile , which should contain a filename that can be found in one of .B XFILESEARCHPATH or .B XDVIINPUTS (see the section .B FILE SEARCHING below for more information on these variables). Xdvi will try to split this pixmap horizontally into .I n pieces, where each piece is as wide as the pixmap is high and is treated as an image for toolbar button .IR n . This means that each icon should be a square, and that the entire pixmap should have width \fIn\fR x \fIh\fR if \fIh\fR is the height of the pixmap. .PP The resource .B toolbarTranslations can be used to map icons/buttons to specific actions. The resource should contain a string separated by newline characters, similar to the resources .B mainTranslations and .BR menuTranslations . Every line must contain either a spacer definition, or an icon definition: .PP A spacer definition is a string \fBSPACER(\fIn\fB)\fR, where .I n is the number of pixels inserted as separator to the following button. .PP An icon definition is a colon-separated list containing the following elements: .RS 2 .TP 2 .SB - the index of an icon in the pixmap file (starting from zero); .TP .SB - a long tooltip string, displayed in the status area; .TP .SB - a short tooltip string, displayed as popup; .TP .SB - a sequence of actions to be performed when the corresponding toolbar button is pushed. .RE .PP To illustrate this, the default value of .B toolbarTranslations looks as follows: .RS 5 .nf .ft 3 .sp 1n xdvi.toolbarTranslations: \e SPACER(5)\en\e 0:Open a new document (Key\e\e: Ctrl-f):\e Open file:select-dvi-file()\en\e SPACER(10)\en\e 1:Reread this document (Key\e\e: R):\e Reread file:reread-dvi-file()\en\e SPACER(10)\en\e 2:Go to the first page of this document (Key\e\e: 1g):\e Go to first page:goto-page(1)\en\e 3:Go to the previous page of this document (Key\e\e: p):\e Go to previous page:back-page(1)\en\e 4:Go to the next page of this document (Key\e\e: n):\e Go to next page:forward-page(1)\en\e 5:Go to the last page of this document (Key\e\e: g):\e Go to last page:goto-page()\en\e SPACER(10)\en\e 6:Enlarge the display (Key\e\e: Ctrl-+):Zoom in:\e set-shrink-factor(+)\en\e 7:Shrink the display (Key\e\e: Ctrl--):Zoom out:\e set-shrink-factor(-)\en\e SPACER(10)\en\e 8:Jump back to the previous hyperlink (Key\e\e: B):\e Back hyperlink:htex-back()\en\e SPACER(10)\en\e 10:Print this document:Print:print()\en\e SPACER(10)\en\e 11:Toggle marks for odd pages (Key\e\e: 1m):\e Toggle odd:toggle-mark(1)\en\e 12:Toggle marks for even pages (Key\e\e: 2m):\e Toggle even:toggle-mark(2)\en\e 13:Toggle mark for current page (Key\e\e: 2m):\e Toggle current:toggle-mark()\en\e 14:Unmark all pages (Key\e\e: 0m):\e Unmark all:toggle-mark(0)\en\e SPACER(10)\en\e 18:Display fonts darker (Key\e\e: Alt-Ctrl-+):\e Fonts darker:change-density(5)\en\e 19:Display fonts lighter (Key\e\e: Alt-Ctrl--):\e Fonts lighter:change-density(-5)\en .sp 1n .ft .fi .RE .PP When the mouse remains over a toolbar button for a certain period, a `tooltip' window is shown, describing what the button does using the .I short tooltip string from the above resource. At the same time, the .I long tooltip string is displayed in the statusline. The appearance and behaviour of these tooltips can be customized via the following resources: .TP .B tipShell.background Background color of the tooltip window. .TP .B tipShell.fontSet Font used for the tooltip. .TP .B tipShell.waitPeriod The time (in milliseconds) the mouse pointer needs to be over the button before the tooltip is shown. Set it to a negative value to suppress the tooltips altogether. #ifgrey .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH GREYSCALING AND COLORMAPS The greyscale anti-aliasing feature in .B xdvi will not work at its best if the display does not have enough colors available. This can happen if other applications are using most of the colormap (even if they are iconified). If this occurs, then .B xdvi will print an error message and turn on the .B -copy option. This will result in overstrike characters appearing wrong; it may also result in poor display quality if the number of available colors is very small. .PP Typically this problem occurs on displays that allocate eight bits of video memory per pixel. To see how many bits per pixel your display uses, type .B xwininfo in an .B xterm window, and then click the mouse on the root window when asked. The ``Depth:'' entry will tell you how many bits are allocated per pixel. .PP Displays using at least 15 bits per pixel are typically .B TrueColor visuals, which do not have this problem, since their colormap is permanently allocated and available to all applications. (The visual class is also displayed by .BR xwininfo .) For more information on visual classes see the documentation for the X Window System. .PP To alleviate this problem, therefore, one may (a) run with more bits per pixel (this may require adding more video memory or replacing the video card), (b) shut down other applications that may be using much of the colormap and then restart .BR xdvi , or (c) run .B xdvi with the .B \-install option. .PP One application which is often the cause of this problem is .BR Netscape . In this case there are two more alternatives to remedying the situation. One can run .RB `` "netscape -install" '' to cause .B Netscape to install a private colormap. This can cause colors to change in bizarre ways when the mouse is moved to a different window. Or, one can run .RB `` "netscape -ncols 220" '' to limit .B Netscape to a smaller number of colors. A smaller number will ensure that other applications have more colors available, but will degrade the color quality in the .B Netscape window. #endif #ifps .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH HANDLING OF POSTSCRIPT FIGURES .B Xdvi can display Encapsulated PostScript (EPS) files included in the .I dvi file. Such files are first searched for in the directory where the .I dvi file is, and then using normal .B Kpathsea rules. There is an exception to this, however: if the file name begins with a backtick .RB ( ` ), then the remaining characters in the file name give a shell command (often .BR zcat ) which is executed; its standard output is then sent to be interpreted as PostScript. Since the execution of arbitrary shell commands with the user's permissions is a huge security risk, evaluation of these backtick commands is disabled by default. It needs to be activated via the .B \-allowshell command-line option. .B NOTE: You should never use this option when viewing documents that you didn't compile yourself. The backtick specials are not needed for uncompressing gzipped Postscript files, since .B xdvi can do that on the fly if the filename ends with .I .eps.gz or .I .eps.Z (and if the first bytes of the file indicate that the file is indeed compressed). This is both safer and more flexible than the backtick approach, since the default file searching rules will apply to such filenames too. #endif #ift1 .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH T1LIB Using T1Lib, a library written by Rainer Menzner (see ftp://sunsite.unc.edu/pub/Linux/libs/graphics/), .B xdvi can render Postscript Type1 fonts directly, without the route via \*(Te\& pixel (pk) fonts. The advantage of this is that only one size of each font needs to be stored on disk. Unless the .B -not1lib option is used, .B xdvi will try to render every font using T1Lib. Only as a fallback it will invoke an external program (like .BR mktexpk , which in turn may invoke utilities like .B ps2pk or .BR gsftopk ) to generate a pixel font from the Type1 source. The direct rendering of the .B Computer Modern fonts should work out-of-the box, whereas other Type1 fonts such as the 35 `standard' Postscript fonts resident in printers may need to be made accessible for use with xdvi, unless your system administrator or TeX distribution has already done so (which is the case e.g. for current teTeX systems). The .B xdvik distribution comes with a utility called .B t1mapper to make these fonts available for xdvi; see the manual page for t1mapper(1) for usage details. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH SPECIALS (GENERALLY) Any of the specials used by .B xdvi may be preceded by the characters .RB `` xdvi: ''. Doing so does not change the behavior of the special under .BR xdvi , but it tells other dvi drivers (such as e.g. dvips) to ignore the special. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH SOURCE SPECIALS Some \*(Te\& implementations or macro packages provide the facility to automatically include so-called `source specials' into a DVI file. These contain the line number, eventually a column number, and the filename of the .tex source. This makes it possible to jump from a .dvi file to the corresponding place in the .tex source and vice versa (also called `inverse search' - jumping from the DVI file to the TeX file is also known as `reverse search', and jumping from the TeX file to the DVI file as `forward search'). .P To be usable with .BR xdvi , source specials in the .I dvi file must have one of the following formats: .RS 5 .nf .sp 1n \fBsrc:\fP\fIline\fP[ ]\fIfilename\fP \fBsrc:\fP\fIline\fP\fB:\fP\fIcol\fP[ ]\fIfilename\fP \fBsrc:\fP\fIline\fP \fBsrc:\fP\fIline\fP\fB:\fP\fIcol\fP \fBsrc::\fP\fIcol\fP .sp 1n .fi .RE If .I filename or .I line are omitted, the most recent values are used. The first source special on each page must be in one of the first two forms, since defaults are not inherited across pages. .sp You will need a \*(Te\& implementation that provides an appropriate switch (e.g. .IR -src ) or a macro package (such as .I srcltx.sty or .IR srctex.sty , available from CTAN:macros/latex/contrib/supported/srcltx/) to insert such source specials into the DVI file. .sp For reverse search, the combination .I Ctrl-Mouse 1 will make xdvi open an editor (the value of the .I \-editor command line option) with the file and the line number of the .tex source. See the description of the .I \-editor option for more information and example settings. .P For forward search, .B xdvi has a .I \-sourceposition option that makes .B xdvi jump to the page in the DVI file corresponding to the given line (or the closest line having a source special) of the specified file and highlight the found region. See the description of the .I \-sourceposition option for more details. .PP More information on setting up various editors for use with source specials can be found at: .RS 5 .nf .sp 1n http://xdvi.sourceforge.net/inverse-search.html .sp 1n .fi .RE .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH PAPERSIZE SPECIALS .B xdvi accepts specials to set the paper size for the document. These specials should be of the form .RS 5 .nf .sp 1n \fBpapersize=\fP[\fB*\fP]\fIwidth\fP,\fIheight\fP .sp 1n .fi .RE .PP where .I width and .I height give the width and height of the paper, respectively. Each of these should appear in the form of a decimal number followed by any of the two-letter abbreviations for units accepted by \*(Te\& .RB ( pt , .BR pc , .BR in , .BR bp , .BR cm , .BR mm , .BR dd , .BR cc , or .BR sp ). If an asterisk .RB ( * ) appears just before the width, then the measurements refer to the document dimensions (e.g., .B pt as opposed to .BR truept ). This allows a macro package to vary the page size according to elements of the document; e.g., .RS 5 .ft 3 .nf .sp 1n \especial{xdvi: papersize=*\enumber\ewd\emybox sp, \enumber\eht\emybox sp} .sp 1n .ft .fi .RE .PP Except for the asterisk, this format is compatible with .BR dvips . .P The last .B papersize special on a page determines the size of that page. If there is no such special on a given page, the most recent .B papersize is used, or, if there are no .B papersize specials on any preceding page, then the value of the .B paper resource (or .B \-paper option on the command line) is used. Thus the paper size may vary for different pages of the .I dvi file. .P If the .B paper resource (or .B \-paper command-line option) begins with a plus sign .RB (` + '), then all .B papersize specials in the .I dvi file are ignored. #ifcolor .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH COLOR SPECIALS The color specials supported by .B xdvi are the same as those supported by .BR dvips , except that the literal PostScript color specification (as in the .B AggiePattern example in the .B dvips documentation) is not supported. There are also some restrictions due to the way xdvi's drawing routines are implemented; e.g. the \ecolorbox and \efcolorbox macros don't work with xdvi. See the section LIMITATIONS below for more information on these restrictions. Xdvi supports the same list of named colors as with .BR dvips , namely: .P .BR Apricot , .BR Aquamarine , .BR Bittersweet , .BR Black , .BR Blue , .BR BlueGreen , .BR BlueViolet , .BR BrickRed , .BR Brown , .BR BurntOrange , .BR CadetBlue , .BR CarnationPink , .BR Cerulean , .BR CornflowerBlue , .BR Cyan , .BR Dandelion , .BR DarkOrchid , .BR Emerald , .BR ForestGreen , .BR Fuchsia , .BR Goldenrod , .BR Gray , .BR Green , .BR GreenYellow , .BR JungleGreen , .BR Lavender , .BR LimeGreen , .BR Magenta , .BR Mahogany , .BR Maroon , .BR Melon , .BR MidnightBlue , .BR Mulberry , .BR NavyBlue , .BR OliveGreen , .BR Orange , .BR OrangeRed , .BR Orchid , .BR Peach , .BR Periwinkle , .BR PineGreen , .BR Plum , .BR ProcessBlue , .BR Purple , .BR RawSienna , .BR Red , .BR RedOrange , .BR RedViolet , .BR Rhodamine , .BR RoyalBlue , .BR RoyalPurple , .BR RubineRed , .BR Salmon , .BR SeaGreen , .BR Sepia , .BR SkyBlue , .BR SpringGreen , .BR Tan , .BR TealBlue , .BR Thistle , .BR Turquoise , .BR Violet , .BR VioletRed , .BR White , .BR WildStrawberry , .BR Yellow , .BR YellowGreen , .BR YellowOrange . .P Note that these names are case sensitive. .P The documentation of the La\*(Te\& .B color package provides more details on how to use such specials with La\*(Te\&; see the .B dvips documentation for a detailed description of the syntax and semantics of the color specials. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH SIGNALS When .B xdvi receives a .SB SIGUSR1 signal, it rereads the .I dvi file. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .SH ENVIRONMENT .B Xdvik uses the same environment variables and algorithms for searching for font files as \*(Te\& and friends. See the documentation for the .B Kpathsea library, .BR kpathsea.dvi , for a detailed description of these. .PP In addition, .B xdvik accepts the following variables: .TP .SB DISPLAY Specifies which graphics display terminal to use. #ifnokpathsea .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .SB XDVISIZES A list of font resolutions separated by colons. If a font cannot be found or made at its stated size, then these sizes are tried as a fallback. See the `Fallback font' section in the .B Kpathsea manual for more details. .B xdvi tries the actual size of the font before trying any of the given sizes. Each font resolution should be a positive integer, specifying the number of dots per inch, or a string of the form .BR magstep\fIn\fP , where .I n is a number -9.5, -9, -8.5, ..., 8, 8.5, 9, or 9.5. The string .B magstep may be shortened to any non-empty initial substring (so that .B magstep0.5 may be shortened to .B mag0.5 or .B m0.5 (but not .BR mag.5 )). The entries .BI magstep n signify the current pixels-per-inch value, multiplied by 1.2 raised to the .IR n th power, and rounded to the nearest integer. If the list begins with a colon, the system default sizes are used, as well. Sizes are expressed in dots per inch and must be integers. The current default set of sizes is @DEFAULT_FONT_SIZES@. #endif .TP .SB KPATHSEA_DEBUG Trace .B Kpathsea lookups; set it to .B -1 (= all bits on) for complete tracing. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .SB EXTENSIONMAPS A list of files to be searched for mime types entries (as for Acrobat Reader). Earlier entries in one of these files override later ones. If this variable is not set, the following default path is used: .RS 7 .nf .ft 3 .sp 1n $HOME/.mime.types:/etc/mime.types:\e /usr/etc/mime.types:/usr/local/etc/mimetypes .sp 1n .ft .fi .RE .TP .SB MAILCAPS A list of files to be searched for mailcap entries, as defined by RFC 1343. See this RFC or the .BR mailcap (4) manual page for a detailed description of the mailcap file format. Currently, only the following mailcap features are supported: .RS 7 .TP 7 .BI test= command The entry is only used if .I command can be executed via the .B system() call and if the system() call returns with value 0 (success). The .I command string may contain the format string .IR %s , which will be replaced by the file name. .TP .BI needsterminal If this flag is used, the command will be executed in a new xterm window by prepending .RI `` "xterm -e "'' to the command string. .RE .PP .RS 7 All other fields in the mailcap entry are ignored by xdvi. Earlier entries in one of these files override later ones. If the variable is not defined, the following default path is used: .RS 4 .nf .ft 3 .sp 1n $HOME/.mailcap:/etc/mailcap:/usr/etc/mailcap:\e /usr/local/etc/mailcap .sp 1n .ft .fi .RE .br For security reasons, some special characters (i.e.: ( ) ` \e ;) are escaped in the argument before passing it to .BR system() . .RE .TP .SB BROWSER Determines the web browser used to open external links (i.e., all URLs that don't start with the .RI ` file: ' scheme and are not relative links in the local DVI file), and to open links for which no viewer has been specified in the .B mailcap files. The value of this variable is a colon-separated list of commands. Xdvi will try each of them in sequence until one succeeds (i.e. doesn't immediately return with status 0). This allows you to specify your favourite browser at the beginning, and fallback browsers at the end. Every occurrence of .I %s in the string is replaced by the target URL; every occurrence of .I %% is replaced by a single .IR % . If no .I %s is present, the URL string is added as an extra argument. .br An example setting is: .RS 7 .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP 7 .SB "netscape -raise -remote 'openURL(%s,new-window)':xterm -e lynx %s:xterm -e wget %s:lynx %s:wget %s" .TP See .TP .SB http://www.catb.org/~esr/BROWSER/ .PP for more details on the .B BROWSER environment variable. .RE #ifps .TP .SB TMPDIR The directory to use for storing temporary files created when uncompressing PostScript files. #endif .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .SB XEDITOR Determines the editor command used for source special `reverse search', if neither the .I \-editor command-line option nor the .I .editor resource are specified. See the description of the .I \-editor command line option for details on the format. .TP .SB VISUAL Determines an editor to be opened in an xterm window if neither of .IR -editor , .IR .editor , or .I XEDITOR is specified. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .SB EDITOR Determines an editor to be opened in an xterm window if neither of .IR -editor , .IR .editor , .I XEDITOR or .I VISUAL is specified. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .TP .SB WWWBROWSER Obsolete; use .B BROWSER instead. .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #ifps .SH LIMITATIONS .B xdvi accepts many but not all types of PostScript specials accepted by .BR dvips . For example, it accepts most specials generated by .B epsf and .BR psfig . It does not, however, support .B bop\-hook or .BR eop\-hook , nor does it allow PostScript commands to affect the rendering of things that are not PostScript (for example, the ``NEAT'' and rotated ``A'' examples in the .B dvips manual). These restrictions are due to the design of .BR xdvi ; in all likelihood they will always remain. .PP La\*(Te\&2e rotation specials are currently not supported. .PP .B MetaPost files containing included text are not supported. .PP .BR Xdvi 's color handling doesn't support the .B \ecolorbox and .B \efcolorbox macros; this is not likely to change in the near future. This also means that e.g. colored tables (as created by the .I colortbl package) may render incorrectly: Text in colors different from the default foreground color may not be displayed. When the page is redrawn (e.g. after using the magnifier), the background color of the cells may overdraw the text. #endif .SH FILES .TP .SB $HOME/.xdvirc A file that holds all settings that the user changed via the keys, the `Options' and the Xaw `Modes' menu and the dialogs, as X resources. These resources override the settings in .BR $HOME/.Xdefaults . This file is ignored if the .B \-q option is used or the .B noInitFile X resource is set. .TP .SB xdvi.cfg A configuration file for the T1 font setup which needs to be supplied in the directory determined by the .B XDVIINPUTS environment variable. Please see the file .B http://xdvi.sourceforge.net/README.t1fonts if that file is missing. .SH SEE ALSO .BR X (1), .BR dvips (1), .BR mktexpk (1), .BR ps2pk (1), .BR gsftopk (1), .BR t1mapper (1), .BR mailcap (4), the .B Kpathsea documentation, and the Xdvik home page at .BR http://xdvi.sourceforge.net/ . .SH AUTHORS Eric Cooper, CMU, did a version for direct output to a QVSS. Modified for X by Bob Scheifler, MIT Laboratory for Computer Science. Modified for X11 by Mark Eichin, MIT SIPB. Additional enhancements by many others. .PP The current maintainer of the original .B xdvi is Paul Vojta, U.C. Berkeley. .PP Code for the xdvik variant has been contributed by many people, whose names are scattered across the source files. Xdvik is hosted on .B CTAN:dviware/xdvik and on SourceForge; for the most up-to-date information, please visit: .PP .B http://xdvi.sourceforge.net .PP Please report all bugs to the SourceForge bug tracker: .PP .nf .B http://sourceforge.net/tracker/?func=add&group_id=23164&atid=377580 .PP xdvik-ja-22.84.16-j1.40/texk/xdvik/filehist.h0000664000175000017500000000341410363262237020151 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef FILEHIST_H_ #define FILEHIST_H_ typedef void (*filehistCallbackT) (int idx, const char *filename, int pageno, void *data); extern void file_history_enumerate(filehistCallbackT callback, void *data); extern void file_history_init(void); extern Boolean file_history_push(const char *filename); extern void file_history_set_page(int pageno); extern void file_history_set_page_at(int idx, int pageno); extern int file_history_get_page(void); extern char *file_history_get_elem(int idx, int *ret_page); extern char *file_history_get_list(void); extern void file_history_open(const char *filename); extern size_t file_history_size(void); #endif /* FILEHIST_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/pagehist.c0000664000175000017500000003642711276240141020145 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ /* Very simple page history (i.e. stack of visited pages) for xdvik */ #include "xdvi-config.h" #include "xdvi.h" #include "util.h" #include "dl_list.h" #include "string-utils.h" #include "events.h" #include "dvi-init.h" #include "statusline.h" #include "message-window.h" #include "xm_toolbar.h" #include "pagehist.h" /**************************************************************************** * * File-scope globals * ****************************************************************************/ /* maximum number of items to print before truncating (10 left and right) */ static const int HISTORY_MAX_CONTEXT = 21; /* list of pages in history */ static struct dl_list *m_page_history = NULL; /* pointer to the head of the list, which only gets changed when truncating the head (when list has reached its max size). */ static struct dl_list *m_page_history_head = NULL; /* current size of the list */ static int m_page_history_length = 0; /* current position in the list */ static int m_page_history_currpos = 0; /* lookup table of filenames visited so far */ static char **m_filename_list = NULL; static size_t m_filename_size = 0; /* item in above list */ struct page_history { int pageno; int file_idx; /* index in file_list */ }; #define DEBUG 0 /**************************************************************************** * * Private functions * ****************************************************************************/ static void page_history_show(struct dl_list *head, const struct dl_list *curr) { #if DEBUG int n; for (n = 0; head != NULL; head = head->next, n++) { struct page_history *item = (struct page_history *)(head->item); if (head == curr) { fprintf(stderr, "item %d: <%d>\n", n, item->pageno); } else { fprintf(stderr, "item %d: %d\n", n, item->pageno); } } #else UNUSED(head); UNUSED(curr); #endif /* DEBUG */ } /* like above, but output goes to the statusline, and it prints only up to HISTORY_MAX_CONTEXT items around the current one. */ static void page_history_show_statusline(struct dl_list *head, const struct dl_list *curr, const char *msg) { #define HIST_LEN 1024 /* should be ample since statusline is limited to 512 MAX_LEN */ int file_idx = 0; int n; char history[HIST_LEN]; char *ptr = history; int tot_len = m_page_history_length; int curr_pos = m_page_history_currpos; int initial_offset = 0; int printed_len = 0; #if DEBUG fprintf(stderr, "tot_len: %d, curr_pos: %d\n", tot_len, curr_pos); #endif if (!(resource.expert_mode & XPRT_SHOW_STATUSLINE)) { /* too distracting for stdout */ return; } if (head == NULL){ strcpy(ptr, "Page history empty."); ptr += strlen("Page history empty."); } else { strcpy(ptr, "Page history:"); ptr += strlen("Page history:"); } /* check if we need to truncate at the beginning or end */ if (tot_len > HISTORY_MAX_CONTEXT) { /* need to truncate, try to make first and second chunk around current position of same length */ int good_pos = HISTORY_MAX_CONTEXT / 2.0 + 0.5; while (curr_pos > good_pos /* && */ /* m_page_history_length - m_page_history_currpos > good_pos */) { #if DEBUG fprintf(stderr, "%d > %d; %d > %d\n", curr_pos, good_pos, m_page_history_length - m_page_history_currpos, good_pos); #endif curr_pos--; initial_offset++; } #if DEBUG fprintf(stderr, "initial offset: %d\n", initial_offset); #endif /* if we're more to the end, adjust good_pos and initial_offset */ while (good_pos - 1 > m_page_history_length - m_page_history_currpos) { #if DEBUG fprintf(stderr, "%d > %d\n", m_page_history_length - m_page_history_currpos, good_pos); #endif initial_offset--; good_pos--; } #if DEBUG fprintf(stderr, "initial offset adjusted: %d\n", initial_offset); #endif } for (n = 0; head != NULL; head = head->next, n++) { struct page_history *item; /* skip initial offset, and insert truncation marker at beginning/end */ if (initial_offset == 1 || printed_len >= HISTORY_MAX_CONTEXT) { strcpy(ptr, " ..."); ptr += strlen(" ..."); if (printed_len >= HISTORY_MAX_CONTEXT) break; } if (initial_offset > 0) { initial_offset--; continue; } printed_len++; item = (struct page_history *)(head->item); /* insert a marker if item is in different file ... */ if (item->file_idx != file_idx) { if (n > 0) { /* ... but only if we're not at the beginning of the list */ #if 1 strcpy(ptr, " -"); ptr += 2; #else char *fname = m_filename_list[item->file_idx]; char *tmp; if ((tmp = strrchr(m_filename_list[item->file_idx], '/')) != NULL) fname = tmp + 1; strcpy(ptr, " ["); ptr += 2; strcpy(ptr, fname); ptr += strlen(fname); strcpy(ptr, "]"); ptr++; #endif } file_idx = item->file_idx; } if (head == curr) { xdvi_assert(XDVI_VERSION_INFO, __FILE__, __LINE__, m_page_history_currpos == n + 1, "%d == %d + 1", m_page_history_currpos, n); sprintf(ptr, " [%d]", item->pageno + 1); ptr += 3 + length_of_int(item->pageno + 1); } else { sprintf(ptr, " %d", item->pageno + 1); ptr += 1 + length_of_int(item->pageno + 1); } } #if DEBUG fprintf(stderr, "Statusline string: |%s|; printed len: %d\n", history, printed_len); #endif statusline_info(STATUS_MEDIUM, "%s %s", history, msg ? msg : ""); #undef HIST_LEN } static void goto_location(const char *filename) { #if DEBUG fprintf(stderr, "going to file %s\n", filename); #endif if (strcmp(globals.dvi_name, filename) != 0) { /* it's a different file */ Boolean tried_dvi_ext = True; char *new_dvi_name; #if DEBUG fprintf(stderr, "different file: |%s|\n", filename); #endif if ((new_dvi_name = open_dvi_file_wrapper(filename, True, False, &tried_dvi_ext, True)) == NULL) { statusline_append(STATUS_MEDIUM, "Re-opening file", "Re-opening file \"%s\" failed!", filename); #if DEBUG fprintf(stderr, "Re-opening file \"%s\" failed!\n", filename); #endif page_history_delete(1); return; } else { dviErrFlagT errflag; if (load_dvi_file( #if !DELAYED_MKTEXPK True, #endif &errflag)) { set_dvi_name(new_dvi_name); globals.ev.flags |= EV_NEWDOC; globals.ev.flags |= EV_PAGEHIST_GOTO_PAGE; #if DEBUG fprintf(stderr, "Back to file: \"%s\"\n", globals.dvi_name); #endif } else { /* re-open old file */ popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Could not open `%s': %s.\n" /* "Removing this file from the history." */, globals.dvi_name, get_dvi_error(errflag)); if (!internal_open_dvi(globals.dvi_name, &errflag, True #if DELAYED_MKTEXPK , True #endif )) { popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Couldn't reopen `%s': %s.\n" /* "Removing this file from the history." */, globals.dvi_name, get_dvi_error(errflag)); } else { globals.ev.flags |= EV_NEWPAGE; } page_history_delete(1); } } } else { globals.ev.flags |= EV_PAGEHIST_GOTO_PAGE; } } /**************************************************************************** * * Exported functions * ****************************************************************************/ /* Move n elements in page history; n == 0 doesn't move, n < 0 moves n items back, n > 0 moves n items forward. */ void page_history_move(int n) { struct dl_list *pos; struct page_history *item; const char *msg = NULL; page_history_show(m_page_history_head, m_page_history); if (resource.page_history_size == 0) return; if (m_page_history_head == NULL) m_page_history_head = m_page_history; if (n < 0) { /* move backwards */ for (pos = NULL; n < 0; n++) { if (m_page_history != NULL) pos = m_page_history->prev; if (pos == NULL) { xdvi_bell(); msg = " - at begin of page history."; break; } else { m_page_history = pos; m_page_history_currpos--; } } } else { /* move forward */ for (pos = NULL; n > 0; n--) { if (m_page_history != NULL) pos = m_page_history->next; if (pos == NULL) { xdvi_bell(); msg = " - at end of page history."; break; } else { m_page_history = pos; m_page_history_currpos++; } } } item = (struct page_history *)m_page_history->item; #if DEBUG fprintf(stderr, "going to page %d\n", item->pageno); #endif goto_location(m_filename_list[item->file_idx]); #if defined(MOTIF) && HAVE_XPM tb_set_pagehist_back_sensitivity(m_page_history->prev != NULL); tb_set_pagehist_forward_sensitivity(m_page_history->next != NULL); #endif page_history_show(m_page_history_head, m_page_history); page_history_show_statusline(m_page_history_head, m_page_history, msg); page_history_update_toolbar_navigation(); } int page_history_get_page(void) { return ((struct page_history *)m_page_history->item)->pageno; } /* add page n to the page history */ void page_history_insert(int n) { struct page_history *item = NULL; static char *current_filename = NULL; static size_t filename_idx = 0; /* index of current filename */ #if DEBUG fprintf(stderr, "inserting into history: %d\n", n); #endif page_history_show(m_page_history_head, m_page_history); /* do nothing if no history is used */ if (resource.page_history_size == 0) return; if (m_page_history_head == NULL) m_page_history_head = m_page_history; item = xmalloc(sizeof *item); /* first call, or filename changed -> update file_list */ if (current_filename == NULL || strcmp(current_filename, globals.dvi_name) != 0) { size_t i; current_filename = xstrdup(globals.dvi_name); for (i = 0; i < m_filename_size; i++) { #if DEBUG fprintf(stderr, "comparing %d: |%s|%s|\n", i, current_filename, m_filename_list[i]); #endif if (strcmp(current_filename, m_filename_list[i]) == 0) { /* found */ filename_idx = i; break; } } if (i >= m_filename_size) { /* not found, insert into file list */ m_filename_list = xrealloc(m_filename_list, (m_filename_size + 1) * sizeof *m_filename_list); m_filename_list[m_filename_size] = filename_append_dvi(current_filename); filename_idx = m_filename_size++; #if DEBUG fprintf(stderr, "NEW file %d: %s\n", filename_idx, current_filename); #endif } } #if DEBUG fprintf(stderr, "-------- %d >= %d?\n", m_page_history_length, resource.page_history_size - 1); #endif if (m_page_history_length >= resource.page_history_size - 1) { /* truncate history */ free(m_page_history_head->item); m_page_history_head = dl_list_truncate_head(m_page_history_head); } else { m_page_history_length++; } item->pageno = n; item->file_idx = filename_idx; #if DEBUG fprintf(stderr, "inserting %d\n", item->pageno); #endif m_page_history = dl_list_insert(m_page_history, item); m_page_history_currpos++; #if DEBUG fprintf(stderr, "head: %p, curr: %p\n", (void *)m_page_history_head, (void *)m_page_history); #endif page_history_show(m_page_history_head, m_page_history); page_history_update_toolbar_navigation(); } void page_history_update_toolbar_navigation(void) { #if defined(MOTIF) && HAVE_XPM tb_set_htex_back_sensitivity(m_page_history->prev != NULL); tb_set_htex_forward_sensitivity(m_page_history->next != NULL); #endif } void page_history_clear(void) { struct dl_list *pos, *curr; if (resource.page_history_size == 0) return; m_page_history_head = m_page_history; for (curr = m_page_history; curr != NULL && curr->prev != NULL; curr = pos) { pos = curr->prev; free(curr->item); (void)dl_list_remove_item(&curr); m_page_history_length--; page_history_show(m_page_history_head, m_page_history); page_history_show_statusline(m_page_history_head, m_page_history, NULL); } /* for (curr = m_page_history; curr != NULL && curr->next != NULL; curr = pos) { */ /* pos = curr->next; */ /* free(curr->item); */ /* (void)dl_list_remove_item(&curr); */ /* m_page_history_length--; */ /* page_history_show(m_page_history_head, m_page_history); */ /* } */ } /* Delete n elements from the page history. If n < 0, delete current and n-1 previous items and move to the item before them. If n > 0, delete current and n-1 next items and move to the item after them. E.g. (with current position marked by `<>'): a b d e -> page_history_delete(-2) -> d e a b d e -> page_history_delete(2) -> a b Prints an error to the statusline if number of deletions exceeds the limits of the list. */ void page_history_delete(int n) { struct dl_list *pos; struct page_history *item; const char *msg = NULL; if (resource.page_history_size == 0) return; if (m_page_history_head == NULL) m_page_history_head = m_page_history; /* fprintf(stderr, "deleting items: |%d|\n", n); */ if (n < 0) { /* delete backwards */ for (pos = NULL; n < 0; n++) { if (m_page_history != NULL) pos = m_page_history->prev; if (pos == NULL) { xdvi_bell(); msg = " - at begin of page history."; break; } else { /* remove item */ free(m_page_history->item); (void)dl_list_remove_item(&m_page_history); m_page_history = pos; m_page_history_currpos--; m_page_history_length--; } } } else { /* delete forward */ for (pos = NULL; n > 0; n--) { if (m_page_history != NULL) pos = m_page_history->next; if (pos == NULL) { xdvi_bell(); msg = " - at end of page history."; break; } else { /* remove item */ free(m_page_history->item); if (m_page_history->prev == NULL) { /* at head */ m_page_history_head = m_page_history = dl_list_truncate_head(m_page_history); } else { (void)dl_list_remove_item(&m_page_history); m_page_history = pos; } /* Note: m_page_history_currpos remains unchanged here */ m_page_history_length--; } } } item = (struct page_history *)m_page_history->item; #if DEBUG fprintf(stderr, "going to page %d\n", item->pageno); #endif goto_location(m_filename_list[item->file_idx]); page_history_show(m_page_history_head, m_page_history); page_history_show_statusline(m_page_history_head, m_page_history, msg); } xdvik-ja-22.84.16-j1.40/texk/xdvik/font-open.h0000664000175000017500000000276411614761145020260 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef FONT_OPEN_H_ #define FONT_OPEN_H_ extern FILE *font_open( #if DELAYED_MKTEXPK Boolean load_font_now, #endif struct font *fontp, const char **font_ret, int *dpi_ret, #ifdef T1LIB int *t1id, #endif Boolean use_t1lib); #if DELAYED_MKTEXPK void reset_missing_font_count(void); #endif #endif /* FONT_OPEN_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/mksedscript0000775000175000017500000000501610363262237020447 0ustar uwabamiuwabami#! /bin/sh srcdir=$1 # Values from c-auto.h mk_GREY= mk_PS_GS= mk_GS_PATH='gs' mk_PS_DPS= mk_PS_NEWS= mk_A4= mk_MOTIF= mk_COLOR= # T1 is always true mk_T1=1 # Kpathsea defaults, they are #if'ed in the source but there is no # config option to disable them. mk_KPATHSEA=1 # Optional values from CFLAGS mk_MFMODE='unspecified' mk_BDPI=600 mk_DEFAULT_FONT_SIZES='m0:m0.5:m1:m2:m3:m4:m5' mk_SHRINK=8 # Get arguments from CFLAGS for mk_arg do case "$mk_arg" in -D*=*) eval "`echo \"$mk_arg\" | sed 's/^-D/mk_/'`" ;; -D*) eval "`echo \"$mk_arg\" | sed 's/^-D/mk_/'`=1" ;; esac done # Get arguments from c-auto.h eval "`awk '/^#define/ { print "mk_"$2"="$3 }' c-auto.h`" # eval "`cat c-auto.h \ # | grep '^[ ]*#[ ]*define[ ]' \ # | sed 's/^[ ]*#[ ]*define[ ][ ]*/mk_/' \ # | sed 's/[ ][ ]*/=/'`" # Process simple boolean arguments. Their values are empty or nonempty if test -z "$mk_COLOR"; then echo '/^#ifcolor/,/^#/d'; fi if test -z "$mk_GREY"; then echo '/^#ifgrey/,/^#/d'; fi if test -z "$mk_PS_DPS"; then echo '/^#ifdps/,/^#/d'; fi if test -z "$mk_PS_NEWS"; then echo '/^#ifnews/,/^#/d'; fi if test -z "$mk_T1"; then echo '/^#ift1/,/^#/d'; fi if test -z "$mk_MOTIF"; then echo '/^#ifmotif/,/^#/d'; else echo '/^#ifxaw/,/^#/d'; fi if test -z "$mk_KPATHSEA"; then echo '/^#ifkpathsea/,/^#/d'; else echo '/^#ifnokpathsea/,/^#/d'; fi # Process remaining PostScript emulation arguments if test -z "$mk_PS_GS"; then echo '/^#ifghost/,/^#/d' else echo "s^@GS_PATH@^$mk_GS_PATH^" fi if test -n "$mk_PS_GS" || test -n "$mk_PS_DPS" || test -n "$mk_PS_NEWS"; then mk_PS=y echo '/^#ifnops/,/^#/d' else mk_PS= echo '/^#ifps/,/^#/d' fi # get version info and release date from CHANGES file spacetab=' ' XDVI_VERSION_INFO=`egrep "^[$spacetab]+\*" $srcdir/CHANGES | sed 1q | awk '{print $2 " " $3}'` XDVI_VERSION=`echo $XDVI_VERSION_INFO | awk '{print $1}'` XDVI_DATE=`echo $XDVI_VERSION_INFO | awk '{print $2}' | sed 's/[():]//g'` # Miscellaneous args if test -n "$mk_A4"; then echo 's/@DEFAULT_PAGE_SIZE@/21 x 29.7 cm (A4 size)/' echo 's/@DEFAULT_UNIT@/cm " (centimeters)"/' else echo 's/@DEFAULT_PAGE_SIZE@/8.5 x 11 inches/' echo 's/@DEFAULT_UNIT@/in " (inches)"/' fi echo "s^@MFMODE@^$mk_MFMODE^" echo "s/@BDPI@/$mk_BDPI/" echo "s/@SHRINK@/$mk_SHRINK/" echo "s/@XDVI_VERSION@/$XDVI_VERSION/" echo "s^@XDVI_DATE@^$XDVI_DATE^" echo "s/@DEFAULT_FONT_SIZES@/$mk_DEFAULT_FONT_SIZES/" | sed -e "s/:/ :\\\\\\ /g" # Remove all remaining '#' lines echo '/^#/d' # Done exit 0 xdvik-ja-22.84.16-j1.40/texk/xdvik/read-mapfile.c0000664000175000017500000000705011611476365020671 0ustar uwabamiuwabami/* This code was stolen from dvips (getpsinfo() in resident.c) for xdvi use. The file itself does not carry any licensing info, except for reference to dvips.h, which doesn't have a standart-type license either. The code seems to be either in the public domain, or, in the worst case, GPL. - Nicolai Langfeldt, 21/2/1999 */ #include "xdvi-config.h" #include "xdvi.h" #include "util.h" #include "read-mapfile.h" #include "dvi-draw.h" /* for add_T1_mapentry */ #include #ifdef T1LIB #include "kpathsea/tex-file.h" #define INLINE_SIZE 2048 /* * Read a dvips psfont map file. Return True if it was read ok, * False otherwise. */ Boolean read_map_file(char *name) { FILE *fp; char *p; char *specinfo; char specbuf[500]; char *fullname; int lineno = 0; static char inline_buf[INLINE_SIZE]; /* Try first for xdvi specific file */ fullname = kpse_find_file(name, kpse_program_text_format, 0); /* Then any fontmap file */ if (fullname == NULL) { fullname = kpse_find_file(name, kpse_fontmap_format, 0); } if (fullname == NULL) { XDVI_WARNING((stderr, "Could not find map file \"%s\".", name)); return False; } fp = XFOPEN(fullname, "r"); if (fp == NULL) { XDVI_WARNING((stderr, "Could not open map file \"%s\": %s.\n", name, strerror(errno))); return False; } TRACE_T1((stderr, "Map file: %s\n", fullname)); while (fgets(inline_buf, INLINE_SIZE, fp) != NULL) { char *TeXname = NULL; char *PSname = NULL; char *Fontfile = NULL; char *Vectfile = NULL; char *hdr_name = NULL; specinfo = NULL; specbuf[0] = 0; lineno++; /* One line at a time */ p = inline_buf; if (*p < ' ' || *p == '*' || *p == '#' || *p == ';' || *p == '%') continue; while (*p) { while (*p && *p <= ' ') p++; if (*p) { /* Note: In dvips, this flag is set outside the loop so that font files may be scanned/included as encoding files (I guess it doesn't matter for dvips, but it does for xdvi ...) */ boolean encoding_p = False; if (*p == '"') { /* PostScript instructions? */ if (specinfo) { strcat(specbuf, specinfo); strcat(specbuf, " "); } specinfo = p + 1; } else if (*p == '<') { /* Header to download? */ if (p[1] == '<') { /* << means always full download, ignore */ p++; } else if (p[1] == '[') { /* <[ means an encoding */ p++; encoding_p = True; } p++; /* skip whitespace after < */ while (*p && *p <= ' ') p++; /* save start of header name */ hdr_name = p; } else if (TeXname) /* second regular word on line? */ PSname = p; else /* first regular word? */ TeXname = p; if (*p == '"') { p++; /* find end of "..." word */ while (*p != '"' && *p) p++; } else while (*p > ' ') /* find end of anything else */ p++; /* Terminate the substring we just identified */ if (*p) *p++ = 0; /* If we had a header we were downloading, figure out what to do; couldn't do this above since we want to check the suffix. */ if (hdr_name) { const char *suffix = find_suffix(hdr_name); if (encoding_p || (suffix != NULL && strcmp(suffix, "enc") == 0)) { Vectfile = hdr_name; } else { Fontfile = hdr_name; } } } } /* while (*p) */ /* Line finished. Lookit what we got */ if (specinfo) { strcat(specbuf, specinfo); } if (TeXname) { add_T1_mapentry(lineno, fullname, TeXname, Fontfile, Vectfile, specinfo); } } fclose(fp); return True; } #endif /* T1LIB */ xdvik-ja-22.84.16-j1.40/texk/xdvik/xdvi.h0000664000175000017500000007365411276240141017323 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1990-2004 Paul Vojta 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. NOTE: xdvi is based on prior work, as noted in the modification history in xdvi.c. \*========================================================================*/ /* * Original version by Eric C. Cooper, CMU */ #ifndef XDVI_H_ #define XDVI_H_ #include "xdvi-config.h" /* headers used by all modules */ #include "xdvi-debug.h" #include "c-auto.h" #include "kpathsea/c-auto.h" /* kpathsea definitions */ #include "kpathsea/config.h" /******************************** * The C environment * *******************************/ #include #include #include /* in case stdlib.h doesn't define these ... */ #ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 #endif #ifndef EXIT_FAILURE # define EXIT_FAILURE 1 #endif #ifdef HAVE_WORKING_NL_LANGINFO_CODESET # define USE_LANGINFO 1 #else # define USE_LANGINFO 0 #endif #if HAVE_SYS_WAIT_H # include #endif #ifndef WIFEXITED # define WIFEXITED(status) (((status) & 255) == 0) #endif #ifndef WEXITSTATUS # define WEXITSTATUS(status) ((unsigned)(status) >> 8) #endif #ifndef WIFSIGNALED # ifndef WIFSTOPPED # define WIFSTOPPED(status) (((status) & 0xff) == 0x7f) # endif # define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status)) #endif #ifndef WTERMSIG # define WTERMSIG(status) ((status) & 0x7f) #endif #if A4 # define DEFAULT_PAPER "a4" #else # define DEFAULT_PAPER "us" #endif /* * If this is set to 1, xdvi will explicitly clear the internal GS * buffer after every page that contained a PS special (figure etc.) * to avoid artifacts with later PS specials (overlapping lines etc.); * see also bug #633420. This workaround will slow down the drawing of * the next page considerably. Currently xdvi also sometimes dies with * `Internal error in beginheader_gs()' * when paging quickly through a file with this hack enabled. * Set to 0 to disable the hack. */ #define GS_PIXMAP_CLEARING_HACK 1 /* * Define to 1 if you want to use the experimental font creation code */ #define DELAYED_MKTEXPK 0 #ifdef __hpux /* On HP-UX 10.10 B and 20.10, compiling with _XOPEN_SOURCE + ..._EXTENDED * leads to poll() not realizing that a file descriptor is writable in psgs.c. */ # define _HPUX_SOURCE 1 #else # ifndef _XOPEN_SOURCE # define _XOPEN_SOURCE 600 # endif # define _XOPEN_SOURCE_EXTENDED 1 # define __EXTENSIONS__ 1 /* needed to get struct timeval on SunOS 5.5 */ # define _SVID_SOURCE 1 /* needed to get S_IFLNK in glibc */ # define _BSD_SOURCE 1 /* needed to get F_SETOWN in glibc-2.1.3 */ #endif /* Some O/S dependent kludges. */ #ifdef _AIX # define _ALL_SOURCE 1 #endif /* just a kludge, no real portability here ... */ #define DIR_SEPARATOR '/' #if STDC_HEADERS # include # include /* the following works around the wchar_t problem */ # include # if HAVE_X11_XOSDEFS_H # include # endif # ifdef X_NOT_STDC_ENV # undef X_NOT_STDC_ENV # undef X_WCHAR # include # define X_NOT_STDC_ENV # endif #endif /* STDC_HEADERS */ /* For wchar_t et al., that the X files might want. */ #include "kpathsea/systypes.h" #include "kpathsea/c-memstr.h" #ifdef HAVE_SYS_PARAM_H # include /* this should define MAXPATHLEN */ #endif #include "kpathsea/c-pathmx.h" /* get fallback for PATH_MAX if all else fails */ #include /* include Xfuncs.h, if available */ #include /* needed for XDestroyImage */ #include #include #include #ifndef MAXPATHLEN # ifdef PATH_MAX # define MAXPATHLEN PATH_MAX # else # define MAXPATHLEN 1024 # endif #endif typedef char Bool3; /* Yes/No/Maybe */ #define True 1 #define False 0 #define Maybe 2 #ifdef DEBUG # include extern unsigned long time_start, time_end; #endif #include /* get WORD64 and LONG64 */ #ifndef WORD64 # ifdef LONG64 typedef unsigned int xuint32; # else typedef unsigned long xuint32; # endif #endif #if defined(HAVE_STDINT_H) #include #elif defined(HAVE_INTTYPES_H) #include #endif /* for unused parameters */ #ifndef UNUSED # define UNUSED(x) ((void)(x)) #endif #include #ifdef VMS # define index strchr # define rindex strrchr # define bzero(a, b) (void) memset ((void *) (a), 0, (size_t) (b)) # define bcopy(a, b, c) (void) memmove ((void *) (b), (void *) (a), (size_t) (c)) #endif #include #include #if HAVE_UNISTD_H # include #endif /* all of these are POSIX and should have been defined by unistd.h: */ #ifndef STDIN_FILENO # define STDIN_FILENO 0 #endif #ifndef STDOUT_FILENO # define STDOUT_FILENO 1 #endif #ifndef STDERR_FILENO # define STDERR_FILENO 2 #endif /* see C FAQ; additional +1 for '\0' */ #define LENGTH_OF_INT ((sizeof(int) * CHAR_BIT + 2) / 3 + 1 + 1) #define LENGTH_OF_LONG ((sizeof(long) * CHAR_BIT + 2) / 3 + 1 + 1) #define LENGTH_OF_ULONG ((sizeof(unsigned long) * CHAR_BIT + 2) / 3 + 1 + 1) #include "kpathsea/c-dir.h" /* dirent.h, NAMLEN */ #include #include "kpathsea/c-fopen.h" #include "kpathsea/version.h" #ifndef _XFUNCPROTOBEGIN # define _XFUNCPROTOBEGIN # define _XFUNCPROTOEND #endif /* If xmkmf is broken and there's a symlink from /usr/include/X11 to the right * place, then there will be no -I... argument on the cc command line for the * X include files. Since gcc version 3 and higher sets __STDC__ to 0 when * including system header files on some platforms, we may end up with * NeedFunctionPrototypes set to 0 when it should be 1. So, let's force the * issue. */ #if __STDC__ && !defined(FUNCPROTO) /* FUNCPROTO is a bitmask specifying ANSI conformance (see Xfuncproto.h). The single bits specify varargs, const availability, prototypes etc.; we enable everything here. */ # define FUNCPROTO (-1) #endif #ifndef VOLATILE # if __STDC__ || (defined(__stdc__) && defined(__convex__)) # define VOLATILE volatile # else # define VOLATILE /* as nothing */ # endif #endif #ifndef OPEN_MODE /* * SU, 2001/01/07: xdvi defines OPEN_MODE as "r" or as "r", "ctx=stm" (for VMS), * but we use the definition of FOPEN_R_MODE from kpathsea/c-fopen.h instead: */ # define OPEN_MODE FOPEN_R_MODE #endif /* OPEN_MODE */ #ifndef VMS # define OPEN_MODE_ARGS const char * #else # define OPEN_MODE_ARGS const char *, const char * #endif #ifndef __LINE__ # define __LINE__ 0 #endif #ifndef __FILE__ # define __FILE__ "?" #endif #define MAXDIM 32767 typedef unsigned char ubyte; typedef unsigned int wide_ubyte; typedef int wide_bool; #if defined(MAKEPK) && !defined(MKTEXPK) # define MKTEXPK 1 #endif #define spell_conv0(n, f) ((long) (n * f)) #define spell_conv(n) spell_conv0(n, dimconv) typedef BMTYPE bmTypeT; typedef unsigned BMTYPE bmUnitT; /* #define BMUNIT unsigned BMTYPE */ #define BMBITS (8 * BMBYTES) /* number of bits in a bmTypeT */ #define ADD(a, b) ((bmUnitT *) (((char *) a) + b)) #define SUB(a, b) ((bmUnitT *) (((char *) a) - b)) extern bmUnitT bit_masks[BMBITS + 1]; /* for safely printing char *s that might be NULL */ #define STRING_OR_NULL(x) ((x == NULL ? "" : x)) #define INSIDE_MANE_WIN ((currwin.win == mane.win)) #define MAGNIFIER_ACTIVE ((magnifier.win != 0)) /* #define MAGNIFIER_ACTIVE ((globals.cursor.flags & CURSOR_MAG)) */ #define mane_base_x 0 #define mane_base_y 0 struct frame { /* dvi_h and dvi_v is the horizontal and vertical baseline position; it is the responsability of the set_char procedure to update them. */ struct framedata { long dvi_h, dvi_v, w, x, y, z; int pxl_v; } data; struct frame *next, *prev; }; #ifdef TEXXET typedef void setcharRetvalT; #else typedef long setcharRetvalT; #endif typedef setcharRetvalT (*set_char_proc) ( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch); #define ROUNDUP(x,y) (((x)+(y)-1)/(y)) #ifndef BDPI # define BDPI 600 #endif #if defined(GS_PATH) && !defined(PS_GS) # define PS_GS 1 #endif #if defined(PS_DPS) || defined(PS_NEWS) || defined(PS_GS) # define PS 1 #else # define PS 0 #endif #ifdef MOTIF # include /* Note: non-k xdvi has MOTIF_TIMERS here, we use XDVI_XT_TIMER_HACK instead (see above) */ # ifndef DDIST # define DDIST 4 # endif # ifndef DDIST_MAJOR # define DDIST_MAJOR 10 # endif # ifndef DDIST_MINOR # define DDIST_MINOR 5 # endif extern XmStringCharSet G_charset; /* * Whether to use some widgets which are only available with Motif 2.0. * In these cases, the LessTif versions are either buggy or visually * inferior (as of lesstif-0.93.18), in which case suitable replacements * should be used; e.g. cascade button or a textfield plus button for * a combobox, or a textfield plus button for a spinbox. */ # if XmVersion >= 2000 && !defined(LESSTIF_VERSION) # define USE_COMBOBOX 1 # define Xdvi_COMBO_BOX_ARROW_SIZE 15 /* the default arrows are *way* too big */ # define USE_SPINBOX 1 # else # define USE_COMBOBOX 0 # define USE_SPINBOX 0 # endif #endif /* MOTIF */ typedef enum { XPRT_SHOW_NONE = 0U, XPRT_SHOW_STATUSLINE = 1, XPRT_SHOW_SCROLLBARS = 2, #ifdef MOTIF XPRT_SHOW_PAGELIST = 4, XPRT_SHOW_TOOLBAR = 8, XPRT_SHOW_MENUBAR = 16, XPRT_SHOW_ALL = 31 #else XPRT_SHOW_BUTTONS = 4, XPRT_SHOW_ALL = 7 #endif /* MOTIF */ } expertFlagT; typedef enum { MOUSE_MODE1, MOUSE_MODE2, MOUSE_MODE3, MOUSE_MODE_MAX } mouseModeT; typedef enum { NO_MODE_ACTIVE, RULER_MODE_ACTIVE, TEXT_MODE_ACTIVE } modeFlagT; /* SUBPIXEL_NONE for no subpixel rendering, otherwise order of subpixels (from option/resource subPixels) */ typedef enum { SUBPIXEL_NONE, SUBPIXEL_RGB, SUBPIXEL_BGR } subpixelOrderT; /* * X resources. */ extern struct x_resources { /* NOTE: we don't use CFGFILE */ Boolean no_init_file; Boolean regression; const char *geometry; const char *windowsize; Boolean remember_windowsize; int app_defaults_fileversion; mouseModeT mouse_mode; Boolean use_tex_pages; int shrinkfactor; const char *main_translations; const char *mouse_translations; /* const char *wheel_translations; */ int wheel_unit; int density; Boolean omega; const char *mouse_mode1_name; const char *mouse_mode1_description; int mouse_mode1_cursor; const char *mouse_mode2_name; const char *mouse_mode2_description; int mouse_mode2_cursor; const char *mouse_mode3_name; const char *mouse_mode3_description; int mouse_mode3_cursor; #ifdef GREY float gamma; /* float inverted_factor; */ #endif int pixels_per_inch; Boolean delay_rulers; int tick_length; char *tick_units; const char *sidemargin; int sidemargin_int; const char *topmargin; int topmargin_int; const char *xoffset; int xoffset_int; const char *yoffset; int yoffset_int; Boolean use_current_offset; /* only used internally */ const char *paper; Boolean paper_landscape; /* only used internally */ const char *alt_font; #ifdef MKTEXPK Boolean makepk; #endif const char *mfmode; const char *editor; #ifdef MOTIF char *prefs_editor_list; #endif Boolean t1lib; const char *src_pos; const char *find_string; const char *text_encoding; Boolean src_fork; const char *sub_pixels; const char *file_history; int file_history_size; Boolean no_file_arg_use_history; subpixelOrderT subpixel_order; float subpixel_energy[3]; Boolean unique; Boolean list_fonts; Boolean reverse; Boolean warn_spec; Boolean hush; Boolean hush_chars; Boolean hush_chk; Boolean hush_stdout; Boolean hush_bell; Boolean safer; #ifdef VMS const char *fore_color; const char *back_color; #endif Pixel fore_Pixel; Pixel back_Pixel; /* Pixel brdr_Pixel; */ Pixel hl_Pixel; Pixel cr_Pixel; const char *icon_geometry; Boolean keep_flag; Boolean copy; Boolean thorough; Boolean pause; const char *pause_special; Boolean fullscreen; #ifdef PS int postscript; Boolean allow_shell; # ifdef PS_DPS Boolean useDPS; # endif # ifdef PS_NEWS Boolean useNeWS; # endif # ifdef PS_GS Boolean useGS; Boolean gs_safer; Boolean gs_alpha; const char *gs_path; const char *gs_palette; int gs_timeout; # endif # ifdef MAGICK Boolean useMAGICK; const char *magick_cache; # endif #endif /* PS */ Boolean prescan; Boolean use_temp_fp; const char *debug_arg; const char *menu_translations; Boolean expert; float watch_file; /* check DVI file every so often, in seconds */ int expert_mode; #ifndef MOTIF Dimension btn_side_spacing; Dimension btn_top_spacing; Dimension btn_between_spacing; /* ignored, only for backwards compatibility */ Dimension btn_between_extra; Dimension btn_border_width; #else /* MOTIF */ const char *toolbar_translations; #endif /* MOTIF */ Boolean statusline; #ifdef MOTIF /* not a user-level resource; indicates a problem with the toolbar, in which case the toolbar is disabled. */ Boolean toolbar_unusable; const char *toolbar_pixmap_file; Boolean toolbar_buttons_raised; Boolean tooltips_in_statusline; int tooltips_wait_period; /* used for communication with Tip.c */ int tooltips_wait_period_bak; /* uncustomized value */ Boolean show_tooltips; #endif /* MOTIF */ Boolean pagelist_highlight_current; Dimension pagelist_width; const char *mg_arg[5]; #if COLOR Boolean use_color; #endif #ifdef GREY Boolean use_grey; Bool3 install; #endif Boolean match_highlight_inverted; const char *dvips_path; const char *ps2pdf_path; int dvips_hang; int dvips_fail_hang; const char *dvips_printer_str; const char *dvips_options_str; int default_saving_format; int default_printing_target; int grid_mode; char *rule_color; Pixel rule_pixel; int link_style; char *link_color; char *visited_link_color; char *browser; #ifdef MOTIF char *prefs_browser_list; # if USE_COMBOBOX char *search_history; int search_history_size; # endif #endif /* MOTIF */ char *unknown_mime_suffix; char *no_mime_suffix; char *anchor_pos; /* whether to open file in new window from file selector (only for DVI files) */ Boolean filesel_open_new_window; /* bitmask of current search window settings */ unsigned int search_window_defaults; /* char * _scroll_pages; */ char *help_general; char *help_hypertex; char *help_othercommands; char *help_pagemotion; char *help_marking; char *help_modes; char *help_search; char *help_mousebuttons; char *help_sourcespecials; int page_history_size; } resource; extern void load_app_resources(Boolean also_pixels); struct WindowRec { Window win; int shrinkfactor; int base_x; int base_y; unsigned int width; unsigned int height; /* for pending expose events */ int min_x; int max_x; int min_y; int max_y; }; struct event_info { int flags; VOLATILE int ctr; jmp_buf canit; jmp_buf next; /* to skip next event */ }; struct pause_info { int num; int *num_save; Boolean flag; }; struct gc_info { GC rule; GC fore; GC inverted; GC high; GC linkcolor; GC visited_linkcolor; GC fore2; GC fore2_bak; GC fore2_bak1; GC copy; GC ruler; Boolean do_copy; }; /* flags for special cursor states */ #define CURSOR_LINK 1 /* hyperlink */ #define CURSOR_MAG 2 /* magnifier is mapped */ #define CURSOR_DRAG_V 4 /* vertical dragging */ #define CURSOR_DRAG_H 8 /* horizontal dragging */ #define CURSOR_DRAG_A 16 /* dragging in any direction */ #define CURSOR_CORRUPTED 32 /* DVI file corrupted */ #define CURSOR_TEXT 64 /* DVI file corrupted */ #define CURSOR_RULER 128 /* DVI file corrupted */ /* cursors for all states */ struct cursor_info { Cursor mode1; Cursor mode2; Cursor mode3; Cursor wait; Cursor corrupted; /* hyperlink */ Cursor link; /* horizontal/vertical/all directions drag */ Cursor drag_h; Cursor drag_v; Cursor drag_a; /* support for `pause' feature */ Cursor pause; /* empty cursor */ Cursor empty; /* one of the flags defined above */ unsigned long flags; }; struct window_expose_info { int min_x, max_x, min_y, max_y; }; /* for communication with forward search in dvi-draw.c */ struct src_info { int fwd_box_page; const char *fwd_string; }; struct widget_info { Widget top_level; Widget draw_widget, draw_background, clip_widget; Widget x_bar, y_bar; #ifdef MOTIF Widget main_window, main_row, tool_bar, top_row, menu_bar; #else Widget vport_widget, form_widget, paned; #endif }; struct page_info { unsigned int w, h; unsigned int unshrunk_w, unshrunk_h; }; struct dvi_file_info { char *dirname; size_t dirlen; FILE *bak_fp; time_t time; /* last file modification time */ }; /* struct to hold global settings that can't go into the resources, * as a replacement for global variables: */ extern struct program_globals { XtAppContext app; const char *program_name; /* argv[0] without the directory part */ const char *cwd; /* directory where xdvi is running in (for childs who need to change back to it) */ char *dvi_name; /* dvi file name, fully expanded with REALPATH */ Boolean load_init_file; /* whether to read/save ~/.xdvirc */ char *orig_locale; /* original locale we are running in */ unsigned long debug; /* debugging option */ /* for older Motif versions or LessTif, which have broken handling of Act_motion() / Act_release() events */ Boolean broken_motif_event_handling; /* offset from c-style (0 based) numbers to real pagenumbers; also contains the offset that user has set via Act_declare_page_number() */ int pageno_correct; /* paper unit used for grid mode */ unsigned int grid_paper_unit; /* whether we warn about unrecognized specials. Copy of resource.warn_spec value, set to False in the drawing routine to reduce the amount of warnings given. Better maybe replace with hash lookup similar to fonts warnings? */ Boolean warn_spec_now; /* used to save X resource values */ char *curr_paper; char *curr_editor; char *curr_browser; float curr_gamma; Boolean curr_use_color; modeFlagT curr_mode; /* forward search info */ struct src_info src; /* event information */ struct event_info ev; /* support for `-pause' feature */ struct pause_info pausing; /* window expose information */ struct window_expose_info win_expose; struct gc_info gc; /* cursor information */ struct cursor_info cursor; /* widget information */ struct widget_info widgets; /* page size info */ struct page_info page; /* DVI file and modification time info */ struct dvi_file_info dvi_file; } globals; /* TODO: put these into globals as well */ extern struct WindowRec mane; extern struct WindowRec currwin; extern struct WindowRec magnifier; extern XtAppContext app; extern char *dvi_property; /* for setting in window */ extern size_t dvi_property_length; extern XImage *G_image; extern int G_backing_store; /* extern int home_x, home_y; */ extern Display *DISP; extern Screen *SCRN; extern XtAccelerators G_accels_cr; #ifdef GREY extern Visual *G_visual; extern unsigned int G_depth; extern Colormap G_colormap; #else # define G_depth (unsigned int) DefaultDepthOfScreen(SCRN) # define G_visual DefaultVisualOfScreen(SCRN) # define G_colormap DefaultColormapOfScreen(SCRN) #endif #define TNTABLELEN 30 /* length of TeXnumber array (dvi file) */ #define VFTABLELEN 5 /* length of TeXnumber array (virtual fonts) */ extern struct font *tn_table[TNTABLELEN]; extern struct font *font_head; extern struct tn *tn_head; extern wide_ubyte maxchar; extern unsigned short current_timestamp; extern int current_page; extern int total_pages; extern unsigned long magnification; extern double dimconv; extern double tpic_conv; /* whether this file contains source specials, so that we need to update the `windows' property for forward search on expose events: */ extern Boolean have_src_specials; extern Boolean dragcurs; /* whether drag cursor is active; needed by hypertex.c */ extern int drag_flags; /* 1 = vert, 2 = horiz; also needed by hypertex.c */ typedef void (*mouse_proc) (XEvent *); extern mouse_proc mouse_motion; extern mouse_proc mouse_release; #if GREY extern Pixel plane_masks[4]; #endif #if GREY || COLOR extern XColor color_data[2]; #endif #if COLOR struct rgb { unsigned short r, g, b; }; struct pagecolor { struct rgb bg; unsigned int stacksize; struct rgb *colorstack; }; struct pagecolor_info { /* different from non-k xdvi, we also need the allocated stack size, since it might differ from the number of pages (e.g. when loading a new file). */ size_t size; /* this is const in non-k xdvi, but some instances of it may ultimately get free()d in full_reset_colors(), so it's not *really* const ... */ struct pagecolor *stack; }; /* Information on background color and initial color stack for each page. */ extern struct pagecolor_info page_colors; /* The initial color stack is obtained from the pagecolor record for a page. */ extern struct rgb *color_bottom; extern unsigned int color_bot_size; /* number of entries */ /* Additions to the runtime color stack on a given page are stored in a linked list. "struct colorframe" is defined in special.c. */ extern struct colorframe *rcs_top; /* Color states. */ /* * For each (foreground, background) color pair, we keep information (depending * on the color model). It is organized as a linked list of linked lists, * with background color more significant. */ struct bgrec { struct bgrec *next; struct rgb color; struct fgrec *fg_head; Boolean pixel_good; /* if the pixel entry is valid */ Pixel pixel; }; struct fgrec { struct fgrec *next; struct rgb color; Boolean pixel_good; /* if the pixel entry is valid */ Pixel pixel; # if GREY Boolean palette_good; /* if the palette entry is valid */ Pixel palette[16]; /* non-TrueColor only */ # endif }; extern struct rgb fg_initial; /* Initial fg (from command line) */ extern struct rgb bg_initial; /* Initial bg */ extern struct bgrec *bg_head; /* head of list */ extern struct bgrec *bg_current; /* current bg value */ extern struct fgrec *fg_current; /* current fg value */ extern struct fgrec *fg_active; /* where the GCs are */ /* List of allocated colors (to be deallocated upon document change) */ extern Pixel *color_list; /* list of colors */ extern unsigned int color_list_len; /* current len of list */ extern unsigned int color_list_max; /* allocated size */ /* Whether the color situation has been warned about. */ extern Boolean color_warned; #endif /* COLOR */ extern Boolean dvi_file_corrupted; extern short magnifier_stat; /* 1 = wait for expose, -1 = destroy upon expose */ extern void run_dvi_file(const char *filename, void *data); /* ================================================================================ globals from dvi-draw.c ================================================================================ */ /* * The following is set when we're prescanning before opening up the windows, * and we hit a PostScript header file. We can't start up gs until we get * a window to associate the process to, so we have to prescan twice. */ #if PS_GS extern Boolean gs_postpone_prescan; #endif #if PS extern int scanned_page_ps; /* last page scanned for PS specials */ extern int scanned_page_ps_bak; /* save the above if PS is turned off */ #endif #if COLOR extern int scanned_page_color; /* last page scanned for color spcls */ #endif /* COLOR */ extern int scanned_page; /* last page prescanned */ extern int scanned_page_reset; /* number to reset the above to */ extern ubyte *G_dvi_buf_ptr; extern struct drawinf currinf; extern Boolean drawing_mag; extern Boolean htex_inside_href; /* globals from hypertex.h */ /* current anchor to search for, either from command-line or from clicking mouse */ extern char *g_anchor_pos; extern size_t g_anchor_len; extern char *g_link_color_rgb; extern char *g_visited_link_color_rgb; /* globals from special.h */ /* * If we're in the middle of a PSFIG special. */ extern Boolean psfig_begun; /* * Set if the -paper option overrides papersize specials. */ extern Boolean ignore_papersize_specials; extern Boolean have_raw_postscript; #if PS extern struct psprocs psp, no_ps_procs; # ifdef PS_GS extern Boolean had_ps_specials; # endif #endif #ifdef MAGICK /* TODO: put access functions for these in special.c */ extern int bbox_angle; extern Boolean bbox_valid; extern unsigned int bbox_width; extern unsigned int bbox_height; extern int bbox_voffset; #endif /* globals from statusline.h */ extern Widget statusline; /* * The cursor shape in the magnifying glass is determined by which * window received the button press event. Under Motif, it's mane.win, * under XAW, it's the parent of mane.win. */ #ifdef MOTIF # define CURSORWIN mane.win #else /* # define CURSORWIN XtWindow(globals.widgets.form_widget) */ # define CURSORWIN mane.win #endif /* * This was MOTIF_TIMERS in the non-k xdvi version, but since xdvik * also uses XtAppAddTimeOut() for Xaw, we always need to define it. * See the comment in events.c for further explanations. */ #if LD_ALLOWS_MULTIPLE_DEFINITIONS # define XDVI_XT_TIMER_HACK 1 #else # define XDVI_XT_TIMER_HACK 0 #endif extern const char **get_paper_types(void); extern size_t get_paper_types_size(void); extern void register_font_popup(void); extern void unregister_font_popup(void); struct startup_info { int file_idx; char *page_arg; }; #ifdef STATUSLINE /* this is only for the initialization; the statusline will reset it to a more adequate value: */ # define XTRA_H 17 #endif /* * Generic structure for DVI scans; contains a buffer for longjmp()ing * out of the scanning process if it's interrupted by the user (ugh ...) * and a generic `void *' to scan-specific info. */ struct scan_info { jmp_buf done_env; void (*geom_special)(struct scan_info *info, const char *str, int str_len); void *data; }; /* * Used by the geometry-scanning routines. * It passes pointers to routines to be called at certain * points in the dvi file, and other information. */ struct geom_info { void (*geom_box)(struct scan_info *, long, long, long, long); void *geom_data; }; #define get_byte(fp) ((unsigned char)getc(fp)) #define get_lbyte(fp) ((long)get_byte(fp)) extern void get_icon_and_title(const char *filename, char **icon_name, char **title_name); extern void set_icon_and_title(const char *icon_name, const char *title_name); extern void reconfigure_window(Boolean fullsize, Dimension w, Dimension h, Boolean save_position); extern void set_windowsize(Dimension *ret_w, Dimension *ret_h, int add_w, int add_h, Boolean override); #ifdef MOTIF extern void motif_translations_hack(void); #endif #ifndef MAX # define MAX(i, j) ((i) > (j) ? (i) : (j)) #endif #ifndef MIN # define MIN(i, j) ((i) < (j) ? (i) : (j)) #endif #ifndef ABS # define ABS(x) (((x) < 0) ? (-(x)) : (x)) #endif #define REPORT_XDVI_BUG_TEMPLATE "Please report this as a bug to:\n\ http://sourceforge.net/tracker/?group_id=23164&atid=377580\n" #if HAVE_ICONV && HAVE_ICONV_H # undef HAVE_ICONV_H # define HAVE_ICONV_H 1 #else # undef HAVE_ICONV_H # define HAVE_ICONV_H 0 #endif #if HAVE_GOOD_SETSID_VFORK # if HAVE_VFORK_H # include # endif #else /* HAVE_GOOD_SETSID_VFORK */ /* Mac OS X 10.3 (Panther) (11/2003) doesn't allow setsid() within vfork() */ # undef vfork # define vfork fork #endif /* HAVE_GOOD_SETSID_VFORK */ /* XawtextScrollWhenNeeded has been ditched in Xaw7 (e.g. Xfree >= 4.x); from the man page: The value XawtextScrollWhenNeeded (and whenNeeded, recognized by the converter), is accepted for backwards compatibilty with resource specifications written for the Xaw6 Text widget, but ignored (effectively treated as XawtextScrollNever). So we're forced to use `scrollAlways' here. */ #define XAW_SCROLL_ALWAYS XawtextScrollAlways /* the reconfig stuff has been fixed in XFree 4.1.0, vendor release 6510 (Slackware 8.0) */ #define BROKEN_RECONFIG (( \ (strstr(ServerVendor(DISP), "XFree") != NULL) \ && VendorRelease(DISP) >= 4000 \ && VendorRelease(DISP) < 4002 \ )) /* enable the following if you're getting unresolved messages about `iconv_open' etc.: */ #if 0 #define LIBICONV_PLUG #define iconv_open libiconv_open #define iconv_close libiconv_close #define iconv libiconv #endif /* 0 */ #if HAVE_ICONV_H typedef ICONV_CHAR_PPTR_TYPE iconv_char_pptrT; #endif /* HAVE_ICONV_H */ #define DEVEL_MODE 0 #endif /* XDVI_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/psheader.txt0000664000175000017500000001754610363262237020540 0ustar uwabamiuwabami%% These are from tex.lpro /TeXDict 250 dict def % define a working dictionary ( IBM: color - 200->250 ) TeXDict begin % start using it. /N {def} def /B {bind def} N /S {exch} N /X { S N } B /TR {translate} N /vsize 11 72 mul N end % TeXDict %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% header for the \special command %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The structure of the PostScript produced by dvips for \special is: % @beginspecial % - any number of @hsize, @hoffset, @hscale, etc., commands % @setspecial % - the user's file of PostScript commands % @endspecial TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults { /hs 612 N /vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen false N /rhiSeen false N /letter {} N /note {} N /a4 {} N /legal {} N } B % % The following definition sets up the units that hscale/vscale are in. % For certain sites this might require change, but it is % recommended instead that any macro packages that require % hscale/vscale set the units appropriately via % % \special{! /@scaleunit 1 def } % % if global, or % % \special{" /@scaleunit 1 def } % % before each instance if multiple macro packages with % different requirements are being used. % /@scaleunit 100 N % s @hscale - set scale factor /@hscale {@scaleunit div /hsc X} B /@vscale {@scaleunit div /vsc X} B % d @hsize - specify a horizontal clipping dimension /@hsize {/hs X /CLIP 1 N} B /@vsize {/vs X /CLIP 1 N} B /@clip {/CLIP 2 N} B % d @hoffset - specify a shift for the figure /@hoffset {/ho X} B /@voffset {/vo X} B % a @angle - set rotation angle /@angle {/ang X} B % % Here we handle bounding box calculations, if necessary. % /@rwi { 10 div /rwi X /rwiSeen true N } B % rwi will be real width after scaling /@rhi { 10 div /rhi X /rhiSeen true N } B % rhi will be real height after scaling /@llx { /llx X } B /@lly { /lly X } B /@urx { /urx X } B /@ury { /ury X } B /magscale true def end % of SDict /@MacSetUp { userdict /md known % if md is defined { userdict /md get type /dicttype eq % and if it is a dictionary { userdict begin % expand it if necessary md length 10 add md maxlength ge {/md md dup length 20 add dict copy def}if end md begin % then redefine some stuff /letter {} N /note {} N /legal {} N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark {transform{itransform moveto}} {transform{itransform lineto}} { 6 -2 roll transform 6 -2 roll transform 6 -2 roll transform { itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto } } {{closepath}} pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if }N /txpose{ pxs pys scale ppr aload pop por { noflips { pop S neg S TR pop 1 -1 scale }if xflip yflip and { pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR }if xflip yflip not and { pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR }if yflip xflip not and { ppr 1 get neg ppr 0 get neg TR }if } { noflips { TR pop pop 270 rotate 1 -1 scale }if xflip yflip and { TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR }if xflip yflip not and { TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR }if yflip xflip not and { TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR }if }ifelse scaleby96 { ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR }if }N /cp {pop pop showpage pm restore}N end }if } if } N % % The following procedure brings us back to PostScript size. It takes % into account the current global dvi magnification, so graphics % scale with the document. % /normalscale { Resolution 72 div VResolution 72 div neg scale magscale { DVImag dup scale } if 0 setgray } N % % We need the psfig macros. % % All software, documentation, and related files in this distribution of % psfig/tex are Copyright (c) 1987 Trevor J. Darrell % % Permission is granted for use and non-profit distribution of psfig/tex % providing that this notice be clearly maintained, but the right to % distribute any portion of psfig/tex for profit or as part of any commercial % product is specifically reserved for the author. % % % psfigTeX PostScript Prolog % /psfts { S 65781.76 div N } N % x y bb-llx bb-lly bb-urx bb-ury startTexFig - /startTexFig { /psf$SavedState save N userdict maxlength dict begin /magscale true def normalscale currentpoint TR %set the current point as the user's origin /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts /psf$sx psf$x psf$urx psf$llx sub div N % scaling for x /psf$sy psf$y psf$ury psf$lly sub div N % scaling for y psf$sx psf$sy scale % scale by (sx,sy) psf$llx neg psf$ury neg TR /showpage { } N /erasepage { } N /copypage { } N /setpagedevice {pop} def /p 3 def % necessary to get around a bug in Adobe Illustrator @MacSetUp } N % llx lly urx ury doclip - (args in figure coordinates) /doclip { psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto } N % - endTexFig - /endTexFig { end psf$SavedState restore } N % this will be invoked as the result of a \special command (for the % inclusion of PostScript graphics). The basic idea is to change all % scaling and graphics back to defaults, but to shift the origin % to the current position on the page. /@beginspecial % - @beginspecial - -- enter special mode { /SpecialSave save N SDict begin gsave normalscale currentpoint TR %set the current point as the user's origin @SpecialDefaults % setup default offsets, scales, sizes, and angle count /ocount X /dcount countdictstack N } N /@setspecial % to setup user specified offsets, scales, sizes (for clipping) { CLIP 1 eq { newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip } if ho vo TR hsc vsc scale ang rotate rwiSeen { rwi urx llx sub div rhiSeen { rhi ury lly sub div } { dup } ifelse scale llx neg lly neg TR } { rhiSeen { rhi ury lly sub div dup scale llx neg lly neg TR } if } ifelse CLIP 2 eq { newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip } if /showpage {} N /erasepage {} N /copypage {} N /setpagedevice {pop} def newpath } N /@endspecial % - @endspecial - -- leave special mode { count ocount sub {pop} repeat countdictstack dcount sub {end} repeat grestore SpecialSave restore end } N % xdvik special treatment for saving definitions made in SDict (while using % the bang special; try to guarantee that the dictionary stack is ok! % xdvik should not systematically bracket code within save/restore pairs, % anyway: such bracketing breaks a lot of code (many packages do change % TeXDict from with ps: specials for instance) and we should only guarantee % that bracketing is done within @beginspecial and @endspecial. -- YA /@xdvisavestate { userdict /xdvi$sav save put } N /@defspecial { SDict begin } N /@fedspecial { end @xdvisavestate } B end % revert to previous dictionary xdvik-ja-22.84.16-j1.40/texk/xdvik/mime.h0000664000175000017500000000254610363262237017276 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef MIME_H_ #define MIME_H_ extern char *figure_mime_type(const char *filename); extern char *figure_viewer(const char *mime_type, const char **format_string, Boolean *needs_terminal, const char *arg); #endif /* MIME_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/t1mapper.10000664000175000017500000001070610363262237020006 0ustar uwabamiuwabami.TH t1mapper "1" "15 October 2001" .SH NAME t1mapper \- A tool to help xdvi use all your t1 fonts .SH SYNOPSIS .B t1mapper [\fIOPTIONS\fR] \fITeX-fontdir Type1-font-file-spec\fR .PP .B t1mapper [\fIOPTIONS\fR] -gs \fIGS-fontmap GS-fontdir TeX-fontdir\fR .SH DESCRIPTION .B T1mapper is a utility script written in Perl. It assists you in making new Postscript Type1 fonts available for use with .BR xdvi . .PP \fINOTE: \fBRunning this utility is only required if your TeX installation doesn't already contain the neccessary .pfb files somewhere in the texmf/ directory hierarchy.\fR .PP The first invocation shown above makes any Type1 font you may have floating around on your system available to .BR xdvi . The second invocation is for hi-jacking fonts from your Ghostscript installation, which will supply .B xdvi with all the standard Type1 fonts it needs. .PP .B T1mapper relies on a installed and working .B texk system to be present. In particular it uses .B kpsewhich to locate the .B fontname package .map files which maps between Postscript font names and TeX font names. .B teTeX is one such .B texk system. .PP When invoked without the .B -gs option, t1mapper will examine each of the fonts specified. It will attempt to determine the Postscript name of the font by looking inside the font file, and if that name has a TeX equivalent it will copy, link or symlink your the file into the TeX font directory you named first on the command line. The name in the TeX font directory will be according to the TeX/KB-fontname scheme, so that the font names used in .B .dvi files matches the names found in the TeX font directories. .PP When invoked with the .B -gs option .B t1mapper will read the named GS Fontmap file to determine which GS font files correspond to which standard Postscript fonts (GS' version of Times-Roman is not called \fITimes-Roman\fR, it's actually called \fINimbusRomNo9L-Regu\fR), and then proceed to copy or link the files in the named GS font directory into the named TeX font directory. .PP The program's diagnostic output is also written to a logfile .IR t1map.log , which is created either in the current working directory or in .BR /tmp . .SH OPTIONS All options except .B -gs have to do with how the font files are copied or linked into the TeX font directories: .TP .B -cp Copy the files from the \fIGS-fontdir\fR or matching the \fIType1-font-file-spec\fR into the \fITeX-fontdir\fR. This is the default and will always work. .TP .B -ln Hard link the files. This requires the fonts to reside on the same disk, but it will save space, and the files will not disappear from the \fITeX-fontdir\fR if they are removed from the source directory. .TP .B -lns Symlink the files. This saves space, but if the original files are removed the symlinks will be broken. .TP .B -lnlns Attempt hard-link first, if it fails make symlink. .TP .B -lncp Attempt hard-link first, if that fails, copy the font. .SH EXAMPLES If your Ghostscript is installed in .B /usr/local/share/ghostscript and your TeX lives in .B /usr/local/teTeX then this command will make your GS fonts available to xdvi: .PP .Vb 4 \&t1mapper -lns -gs \e \& /usr/local/share/ghostscript/5.50/Fontmap \e \& /usr/local/share/ghostscript/fonts \e \& /usr/local/teTeX/share/texmf/fonts/type1/gs .Ve .PP The first argument here is the full path to the GS Fontmap. The second is the GS font directory, note the lack of wildcards here (as opposed to the next example). The third argument is the TeX font directory. If it does not exist it will be created. Texk and teTeX uses quite finely structured font directories, and the above reflects this. .PP If you have a Solaris machine with Display Postscript fonts then this command will make them available to xdvi: .PP .Vb 4 \&t1mapper -lns \e \& /usr/local/teTeX/share/texmf/fonts/type1/gs \e \& /usr/openwin/lib/X11/fonts/Type1/*.pfa .Ve .PP Here the first argument is the TeX font directory and thereafter comes a wildcard that specifies which fonts to examine for copying/linking into the TeX font directory. .SH FILES .B fontname Postscript to TeX name mapping files from .B http://tug.org/fontname/, these are included in teTeX. .PP .B Ghostscript fonts from .B http://sourceforge.net/projects/ghostscript/ or .B http://www.gnu.org/software/ghostscript/ghostscript.html .SH SEE ALSO .BR kpsewhich (1), .BR xdvi (1), .BR ln (1), .B README.t1fonts in the source distribution .SH AUTHOR Nicolai Langfeldt for the xdvik project at SourceForge (see .BR http://sourceforge.net/projects/xdvi/ ). xdvik-ja-22.84.16-j1.40/texk/xdvik/psnews.c0000664000175000017500000006011411276240141017646 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1994-2004 Paul Vojta 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. NOTES: This code was originally written by Ricardo Telichevesky (ricardo@rle-vlsi-mit.edu) and Luis Miguel Silveira (lms@rle-vlsi-mit.edu). It was largely influenced by similar code in the SeeTeX/XTeX package by Dirk Grunwald (grunwald@colorado.edu). \*========================================================================*/ /* ||| To do: * ALWAYS_CLOSE_SERVER_CONNECTION? * Is there some way of interrupting a process? * fork * extra bytes on input */ #ifdef PS_NEWS /* whole file */ #include #include /* this defines FASYNC */ #include #include #undef SYSV /* To avoid defined SYSV_{WAIT,UCONTEXT} in xview/notify.h. */ #include #include /* Condition for retrying a write */ #include #include #include "xdvi-config.h" #include "xdvi.h" #include "events.h" #include "dvi-init.h" #include "dvi-draw.h" /* if POSIX O_NONBLOCK is not available, use O_NDELAY */ #if !defined(O_NONBLOCK) && defined(O_NDELAY) #define O_NONBLOCK O_NDELAY #endif #ifdef X_NOT_STDC_ENV extern int errno; #endif #ifdef EWOULDBLOCK #ifdef EAGAIN #define AGAIN_CONDITION (errno == EWOULDBLOCK || errno == EAGAIN) #else /* EAGAIN */ #define AGAIN_CONDITION (errno == EWOULDBLOCK) #endif /* EAGAIN */ #else /* EWOULDBLOCK */ #ifdef EAGAIN #define AGAIN_CONDITION (errno == EAGAIN) #endif /* EAGAIN */ #endif /* EWOULDBLOCK */ #if HAVE_POLL # include # define XIO_IN POLLIN # define XIO_OUT POLLOUT #else # define XIO_IN 1 # define XIO_OUT 2 #endif #if !defined(FLAKY_SIGPOLL) && !HAVE_STREAMS && !defined(FASYNC) # define FLAKY_SIGPOLL 1 #endif char *strtok(char *, const char *); /* define ALWAYS_CLOSE_SERVER_CONNECTION if you want to close the server connection all the time */ #undef ALWAYS_CLOSE_SERVER_CONNECTION /* * Some setup code. */ static const char str0[] = "/OW2? version cvi 2 eq def " "OW2? " "{ /setlinewidth { pop } def} " "{ /NeWS 3 0 findpackage beginpackage " " /X11 3 0 findpackage beginpackage} " "ifelse " "currentcanvas /Color get " "currentcanvas /Colormap get getcubedescription null eq and " " {8 {{currentcanvas /Colormap get 1 index dup dup dup newcube} stopped " " {pop pop pop pop pop} {exit} ifelse " " 2 div cvi dup 1 eq {exit} if} loop pop} " "if\n"; /* * This string reads chunks (delimited by %%xdvimark). * The first character of a chunk tells whether a given chunk * is to be done within save/restore or not. * The `H' at the end tells it that the first group is a * header; i.e., no save/restore. */ static const char preamble[] = "/xdvi$line 81 string def " "/xdvi$run {$error null ne {$error /newerror false put} if " " {currentfile cvx stopped " " $error null eq {false} {$error /newerror get} ifelse and " " {handleerror} if} stopped pop} def " "/xdvi$dslen countdictstack def " "{currentfile read not {exit} if 72 eq " " {xdvi$run} " " {/xdvi$sav save def xdvi$run " " clear countdictstack xdvi$dslen sub {end} repeat xdvi$sav restore} " " ifelse " " {(%%xdvimark) currentfile xdvi$line {readline} stopped " " {clear} {{eq {false exit} if} {true exit} ifelse} ifelse }loop {exit} if " " 58 tagprint flush " "}loop\nH"; extern const char psheader[]; extern int psheaderlen; static const char preamble2[] = " stop\n%%xdvimark\n"; #define stopstring preamble2 /* global procedures (besides initNeWS) */ static void toggleNeWS(int flag); static void destroyNeWS(void); static void interruptNeWS(void); static void endpageNeWS(void); static void drawbeginNeWS(int, int, const char *); static void drawbeginNeWS_box(int, int, const char *); static void drawrawNeWS(const char *); static void drawrawNeWS_box(const char *); static void drawfileNeWS(const char *, FILE *); static void drawendNeWS(const char *); static void beginheaderNeWS(void); static void endheaderNeWS(void); static void newdocNeWS(void); static struct psprocs news_procs = { /* toggle */ toggleNeWS, /* destroy */ destroyNeWS, /* interrupt */ interruptNeWS, /* endpage */ endpageNeWS, /* drawbegin */ drawbeginNeWS, /* drawraw */ drawrawNeWS, /* drawfile */ drawfileNeWS, /* drawend */ drawendNeWS, /* beginheader */ beginheaderNeWS, /* endheader */ endheaderNeWS, /* newdoc */ newdocNeWS }; /* define local static variables */ static int NeWS_mag; /* magnification currently in use */ static int NeWS_shrink; /* shrink factor currently in use */ static unsigned int NeWS_page_w; /* how big our current page is */ static unsigned int NeWS_page_h; static Boolean NeWS_active; /* if we've started a page yet */ static int NeWS_pending; /* number of ack's we're expecting */ static const char *NeWS_send_byte; /* next byte to send to NeWS */ static const char *NeWS_send_end; /* last + 1 byte to send */ static Boolean NeWS_in_header; /* if we're sending a header */ static Boolean NeWS_in_doc; /* if we've sent header information */ static int NeWS_ev_mask; /* events for which we'll stop */ static Boolean NeWS_destroyed = False; #define NEWS_MASK_NORMAL EV_GE_NEWPAGE #define NEWS_MASK_HEADER EV_GE_PS_TOGGLE #define NEWS_MASK_INIT (EV_GE_TERM | EV_PS_TOGGLE) /* * NeWS I/O code. This should send PS code to NeWS, * receive acknowledgements, and receive X events in the meantime. * It also checks for SIGPIPE errors. */ static void read_from_NeWS(void); static void write_to_NeWS(void); static struct xio NeWS_xout = {NULL, 0, XIO_IN, #if HAVE_POLL NULL, #endif read_from_NeWS, write_to_NeWS, NULL}; static struct xio NeWS_xin = {NULL, 0, XIO_IN, #if HAVE_POLL NULL, #endif read_from_NeWS, NULL, NULL}; /*---------------------------------------------------------------------------* psio_sigpipe_handler () Arguments: sig, code, scp, addr (see man page for signal) Returns: (void) Side-Effects: SIGPIPE signal is flagged as sigpipe_error variable is set. Description: Handler for SIGPIPE error generated by a broken pipe in the connection to the NeWS server; this may be duer to some abnormal condition, or some hairy PostScript code containing commands not implemented by the server. +----------------------------------------------------------------------------*/ static Boolean sigpipe_error = False; static struct sigaction psio_sigpipe_handler_struct; /* initialized to {psio_sigpipe_handler, (sigset_t) 0, 0} in initNeWS */ static RETSIGTYPE psio_sigpipe_handler(int sig, int code, struct sigcontext *scp, char *addr) { sigpipe_error = True; } /* * read_from_NeWS - This does the actual retrieving of acknowledgements. * If other bytes appear on the file - tough. */ static void read_from_NeWS(void) { for (;;) { int retval; retval = ps_checkfor(PostScriptInput, PSIO_FIND_TAG, 58); if (retval == 0) break; if (retval < 0) { fprintf(stderr, "[xdvik] ps_checkfor: %d\n", retval); return; } (void)ps_checkfor(PostScriptInput, PSIO_WAIT_TAG, 58); --NeWS_pending; if (NeWS_pending == 0) globals.ev.flags |= EV_ACK; if (globals.debug & DBG_PS) printf("Got NeWS ack; %d pending.\n", NeWS_pending); } } /* * write_to_NeWS - Write to the PostScript interpreter. */ static void write_to_NeWS(void) { int old_flags; int bytes; old_flags = fcntl(PostScript->file, F_GETFL, 0); if (old_flags < 0) return; /* set to be non-blocking */ if (fcntl(PostScript->file, F_SETFL, old_flags | O_NONBLOCK) < 0) return; for (;;) { bytes = write(PostScript->file, NeWS_send_byte, NeWS_send_end - NeWS_send_byte); if (bytes < 0) { if (AGAIN_CONDITION) break; perror("xdvi NeWS_send"); break; } NeWS_send_byte += bytes; if (NeWS_send_byte == NeWS_send_end) { NeWS_send_byte = NULL; NeWS_xout.xio_events &= ~XIO_OUT; #if HAVE_POLL /* This check is necessary, since write_to_NeWS can be called directly. */ if (NeWS_xout.pfd != NULL) NeWS_xout.pfd->events &= ~POLLOUT; globals.ev.flags |= EV_ACK; break; #endif } } fcntl(PostScript->file, F_SETFL, old_flags); } /* * Clean up after NeWS_send() */ static void post_send(void) { if (sigpipe_error) { fputs("NeWS died unexpectedly.\n", stderr); destroyNeWS(); draw_bbox(); } } /* * Main routine for writing to the NeWS interpreter. */ static void NeWS_send(const char *cp, size_t len) { struct sigaction orig; if (PostScript == (PSFILE *) NULL || (globals.ev.flags & NeWS_ev_mask)) return; (void) sigaction(SIGPIPE, &psio_sigpipe_handler_struct, &orig); sigpipe_error = False; NeWS_send_byte = cp; NeWS_send_end = cp + len; NeWS_xout.xio_events |= XIO_OUT; #if HAVE_POLL if (NeWS_xout.pfd != NULL) NeWS_xout.pfd->events |= POLLOUT; #endif write_to_NeWS(); (void) read_events(NeWS_ev_mask | EV_ACK); if (!(globals.ev.flags & EV_ACK)) { /* if interrupted */ /* ||| Do somthing more severe here */ } globals.ev.flags &= ~EV_ACK; /* put back generic handler for SIGPIPE */ (void) sigaction(SIGPIPE, &orig, (struct sigaction *) NULL); if (!NeWS_in_header) post_send(); } /* * Wait for acknowledgement from NeWS. With NeWS we have no choice but * to wait (||| I think). */ static void waitack(void) { if (PostScript == (PSFILE *) NULL) return; if (NeWS_pending > 0) (void) read_events(EV_GE_ACK); if (globals.ev.flags & EV_ACK) { globals.ev.flags &= ~EV_ACK; return; } /* ||| Do something more serious here */ } /*---------------------------------------------------------------------------* initNeWS() Arguments: None. Returns: True if and only if initialization succeeded Side-Effects: Static variables may be set. Description: Initializes variables for the application main loop. +----------------------------------------------------------------------------*/ Boolean initNeWS(void) { static NeWStoken newstoken; /* now try to open the connection to the NeWS server */ if (ps_open_PostScript() == (PSFILE *) NULL) return False; psio_sigpipe_handler_struct.sa_handler = psio_sigpipe_handler; sigemptyset(&psio_sigpipe_handler_struct.sa_mask); #if !FLAKY_SIGPOLL if (fcntl(PostScript->file, F_SETOWN, getpid()) == -1) perror("xdvi: fcntl F_SETOWN"); if (fcntl(PostScript->file, F_SETFL, fcntl(PostScript->file, F_GETFL, 0) | FASYNC) == -1) perror("xdvi: fcntl F_SETFL"); #endif /* not FLAKY_SIGPOLL */ if (PostScriptInput->file != PostScript->file) { #if !FLAKY_SIGPOLL if (fcntl(PostScriptInput->file, F_SETOWN, getpid()) == -1) perror("xdvi: fcntl F_SETOWN"); if (fcntl(PostScriptInput->file, F_SETFL, fcntl(PostScriptInput->file, F_GETFL, 0) | FASYNC) == -1) perror("xdvi: fcntl F_SETFL"); #endif /* not FLAKY_SIGPOLL */ NeWS_xout.xio_events &= ~XIO_IN; NeWS_xin.fd = PostScriptInput->file; set_io(&NeWS_xin); } NeWS_xout.fd = PostScript->file; set_io(&NeWS_xout); NeWS_active = False; NeWS_in_header = True; NeWS_ev_mask = NEWS_MASK_INIT; NeWS_pending = 1; ps_flush_PostScript(); NeWS_send(str0, (sizeof str0) - 1); /* get xid of window, then make this window the NeWS canvas */ (void)ps_token_from_xid(mane.win, &newstoken); if (newstoken != -1) { ps_setcanvas(newstoken); ps_flush_PostScript(); NeWS_send(preamble, (sizeof preamble) - 1); NeWS_send(psheader, psheaderlen); NeWS_send(preamble2, (sizeof preamble2) - 1); NeWS_in_header = False; post_send(); waitack(); } if (NeWS_destroyed) return False; /* success */ NeWS_mag = NeWS_shrink = -1; NeWS_page_w = globals.page.w; NeWS_page_h = globals.page.h; psp = news_procs; if (!resource.postscript) toggleNeWS(0); /* if we got a 'v' already */ return True; } /*---------------------------------------------------------------------------* toggleNeWS(int flag) Arguments: flag for toggling PostScript Returns: (void) Side-Effects: psp.drawbegin is changed Description: Used to toggle the rendering of PostScript by the NeWS server Callable from within read_events(). +----------------------------------------------------------------------------*/ static void toggleNeWS(int flag) { if (globals.debug & DBG_PS) fprintf(stdout, "Toggling NeWS to %d", flag); switch (flag) { case 0: psp.drawbegin = drawbegin_none; break; case 1: psp.drawbegin = drawbeginNeWS; break; default: psp.drawbegin = drawbeginNeWS_box; break; } } /*---------------------------------------------------------------------------* destroyNeWS() Arguments: none Returns: (void) Side-Effects: the pointer to the NeWS file is nulled Description: Close the connection to the NeWS server; used when rendering is terminated in any way. +----------------------------------------------------------------------------*/ static void destroyNeWS(void) { psp = no_ps_procs; NeWS_destroyed = True; scanned_page = scanned_page_ps = scanned_page_reset; } /*---------------------------------------------------------------------------* interruptNeWS() Arguments: none Returns: void Description: Close the connection to the NeWS server; used when rendering is terminated because of an interruption in the viewing of the current page. ||| It would be nice if we could asynchronously ``wake up'' a NeWS process (preferably by sending something along the X socket); then we could do better than just to wait. +----------------------------------------------------------------------------*/ static void interruptNeWS(void) { if (globals.debug & DBG_PS) puts("Running interruptNeWS()"); if (NeWS_pending <= 0) return; /* if nothing to do */ if (NeWS_active) { NeWS_send(stopstring, (sizeof stopstring) - 1); NeWS_active = False; } for (;;) { ps_flush_PostScript(); if (NeWS_pending <= 0) break; waitack(); } } /*---------------------------------------------------------------------------* endpageNeWS() Arguments: none Returns: (void) Side-Effects: the NeWS_active variable is cleared. Description: Should be called at the end of a page to end this chunk for the NeWS server. +----------------------------------------------------------------------------*/ static void endpageNeWS(void) { if (globals.debug & DBG_PS) puts("endpage sent to NeWS Server"); if (NeWS_active) { NeWS_send(stopstring, (sizeof stopstring) - 1); NeWS_active = False; waitack(); } } /*---------------------------------------------------------------------------* drawbeginNeWS () Arguments: xul, yul - coordinates of the upper left corner of the figure cp - string with the bounding box line data Returns: (void) Description: Opens a connection to the NeWS server and send in the preamble and the bounding box information after correctly computing resolution factors. In case no rendering is to be done, outlines the figure. An outline is also generated whenever the PostScript code is too hairy and generates a SIGPIPE signal. +----------------------------------------------------------------------------*/ static void drawbeginNeWS(int xul, int yul, const char *cp) { char buf[100]; static const char str[] = " TeXDict begin\n"; static const char str2[] = "Hinitgraphics stop\n%%xdvimark\n"; if (globals.debug & DBG_PS) { printf("xul= %d yul= %d\n", xul, yul); printf("String = < %s >\n", cp); } /* catch up on the X side */ XSync(DISP, False); if (!NeWS_active) { /* send initialization to NeWS server */ if (NeWS_page_w < globals.page.w || NeWS_page_h < globals.page.h) { if (globals.ev.flags & NEWS_MASK_NORMAL) longjmp(globals.ev.canit, 1); ++NeWS_pending; NeWS_page_w = globals.page.w; NeWS_page_h = globals.page.h; NeWS_send(str2, (sizeof str2) - 1); } if (magnification != NeWS_mag) { if (globals.ev.flags & NEWS_MASK_NORMAL) longjmp(globals.ev.canit, 1); ++NeWS_pending; sprintf(buf, "H TeXDict begin /DVImag %d 1000 div def " "end stop\n%%%%xdvimark\n", NeWS_mag = magnification); NeWS_send(buf, strlen(buf)); } if (mane.shrinkfactor != NeWS_shrink) { if (globals.ev.flags & NEWS_MASK_NORMAL) longjmp(globals.ev.canit, 1); ++NeWS_pending; sprintf(buf, "H TeXDict begin %d %d div dup " "/Resolution X /VResolution X " "end stop\n%%%%xdvimark\n", resource.pixels_per_inch, NeWS_shrink = mane.shrinkfactor); NeWS_send(buf, strlen(buf)); } if (globals.ev.flags & NEWS_MASK_NORMAL) longjmp(globals.ev.canit, 1); ++NeWS_pending; NeWS_send(str, (sizeof str) - 1); NeWS_active = True; } sprintf(buf, "%d %d moveto\n", xul, yul); NeWS_send(buf, strlen(buf)); NeWS_send(cp, strlen(cp)); } static void drawbeginNeWS_box(int xul, int yul, const char *cp) { drawbeginNeWS(xul, yul, cp); draw_bbox(); } /*---------------------------------------------------------------------------* drawrawNeWS() Arguments: origcp - the raw string to be sent to the postscript interpreter Returns: (void) Side-Effects: (none) Description: If there is a valid connection to the NeWS server, just send the string to the interpreter, else leave. +----------------------------------------------------------------------------*/ static void drawrawNeWS(const char *origcp) { const char *pt, *ptm1, *ocp1; static char *cp; char *cp1; static unsigned int cplen = 0; unsigned int len; double angle; Boolean found = False; if (!NeWS_active) return; if (globals.debug & DBG_PS) printf("Raw PS sent to context: <%s>\n", origcp); /* take a look at the string: NeWS bums on certain rotations */ len = strlen(origcp) + 4; if (cplen < len) { if (cplen != 0) free(cp); cplen = len; cp = xmalloc(cplen); } ocp1 = origcp; pt = origcp; while (*pt == ' ' || *pt == '\t') ++pt; cp1 = cp; for (;;) { ptm1 = pt; while (*pt != '\0' && *pt != ' ' && *pt != '\t') ++pt; if (*pt == '\0') break; while (*pt == ' ' || *pt == '\t') ++pt; if (strncmp(pt, "rotate", 6) == 0 && (pt[6] == '\0' || pt[6] == ' ' || pt[6] == '\t')) { /* found rotate; check angle */ if (sscanf(ptm1, "%lf", &angle) >= 1) { found = True; while (angle > 360.0) angle -= 360; while (angle < -360.0) angle += 360; if (angle == 90.0) { angle = 89.999; (void)memcpy(cp1, ocp1, ptm1 - ocp1); cp1 += ptm1 - ocp1; strcpy(cp1, "89.999 rotate "); cp1 += strlen(cp1); while (*pt != '\0' && *pt != ' ' && *pt != '\t') ++pt; while (*pt == ' ' || *pt == '\t') ++pt; ocp1 = pt; } else if (angle == -90.0) { angle = -89.999; (void)memcpy(cp1, ocp1, ptm1 - ocp1); cp1 += ptm1 - ocp1; strcpy(cp1, "-89.999 rotate "); cp1 += strlen(cp1); while (*pt != '\0' && *pt != ' ' && *pt != '\t') ++pt; while (*pt == ' ' || *pt == '\t') ++pt; ocp1 = pt; } else if (angle == 0.0) { (void)memcpy(cp1, ocp1, ptm1 - ocp1); cp1 += ptm1 - ocp1; while (*pt != '\0' && *pt != ' ' && *pt != '\t') ++pt; while (*pt == ' ' || *pt == '\t') ++pt; ocp1 = pt; } } } } strcpy(cp1, ocp1); if ((globals.debug & DBG_PS) && found) { printf("String is now <%s>\n", cp); printf("Found rotate string. Angle is %g degrees.\n", angle); } len = strlen(cp); cp[len] = '\n'; NeWS_send(cp, len + 1); } /*---------------------------------------------------------------------------* drawfileNeWS() Arguments: cp - string with the postscript file pathname psfile - file, already opened Returns: (void) Side-Effects: none Description: Postscript file containing the figure is opened and sent to the NeWS server. Figure is outlined in case hairy code produces a SIGPIPE signal. +----------------------------------------------------------------------------*/ static void drawfileNeWS(const char *cp, FILE *psfile) { char buffer[1025]; int blen; struct sigaction orig; if (!NeWS_active) { fclose(psfile); return; } if (globals.debug & DBG_PS) printf("printing file %s\n", cp); sigpipe_error = False; for (;;) { blen = fread(buffer, sizeof(char), 1024, psfile); if (blen == 0) break; NeWS_send(buffer, blen); if (sigpipe_error || (globals.ev.flags & NeWS_ev_mask)) break; } fclose(psfile); if (sigpipe_error) { fputs("NeWS died unexpectedly.\n", stderr); destroyNeWS(); draw_bbox(); } } /*---------------------------------------------------------------------------* drawendNeWS() Arguments: cp - string with indication of the end of the special Returns: (void) Description: Sends the indication of end of the figure PostScript code. +----------------------------------------------------------------------------*/ static void drawendNeWS(const char *cp) { if (!NeWS_active) return; if (globals.debug & DBG_PS) puts("drawend sent to NeWS Server"); NeWS_send(cp, strlen(cp)); NeWS_send("\n", 1); } /*---------------------------------------------------------------------------* beginheaderNeWS() Arguments: none Returns: (void) Description: Prepares the PostScript interpreter for receipt of header code. +----------------------------------------------------------------------------*/ static void beginheaderNeWS(void) { static const char str[] = "Hsave /xdvi$doc exch def\n"; if (globals.debug & DBG_PS) puts("Running beginheaderNeWS()"); if (NeWS_active) { if (!NeWS_in_header) XDVI_FATAL((stderr, "Internal error in beginheaderNeWS().")); return; } if (globals.ev.flags & NEWS_MASK_HEADER) longjmp(globals.ev.canit, 1); NeWS_in_header = True; NeWS_ev_mask = NEWS_MASK_HEADER; ++NeWS_pending; if (NeWS_in_doc) NeWS_send("H", 1); else { NeWS_send(str, (sizeof str) - 1); NeWS_in_doc = True; } NeWS_active = True; } /*---------------------------------------------------------------------------* endheaderNeWS() Arguments: none Returns: (void) Description: Prepares the PostScript interpreter for receipt of header code. +----------------------------------------------------------------------------*/ static void endheaderNeWS(void) { static const char str[] = "stop\n%%xdvimark\n"; if (globals.debug & DBG_PS) puts("Running endheaderNeWS()"); if (NeWS_active) { NeWS_send(str, (sizeof str) - 1); NeWS_active = False; post_send(); waitack(); NeWS_in_header = False; NeWS_ev_mask = NEWS_MASK_NORMAL; } } /*---------------------------------------------------------------------------* newdocNeWS() Arguments: none Returns: (void) Description: Clears out headers stored from the previous document. +----------------------------------------------------------------------------*/ static void newdocNeWS(void) { static const char str[] = "H xdvi$doc restore stop\n%%xdvimark\n"; if (globals.debug & DBG_PS) puts("Running newdocNeWS()"); if (NeWS_in_doc) { ++NeWS_pending; NeWS_send(str, (sizeof str) - 1); NeWS_mag = NeWS_shrink = -1; NeWS_in_doc = False; } } #else /* silence `empty compilation unit' warnings */ static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); } #endif /* PS_NEWS */ xdvik-ja-22.84.16-j1.40/texk/xdvik/xdvi-search.el0000664000175000017500000003566411032450154020733 0ustar uwabamiuwabami;;; xdvi-search.el --- (X)Emacs frontend for forward search with xdvi(k) ;;; Requires xdvi(k) >= 22.38. ;;; ;;; See http://xdvi.sourceforge.net/inverse-search.html and the section ;;; `FORWARD SEARCH' in the xdvi man page for more information on forward search. ;;; ;;; This file is available from: http://xdvi.sourceforge.net/xdvi-search.el ;;; ;;; Copyright (C) 2004 - 2006 Stefan Ulrich ;;; Copyright (C) 2006, Chris Stucchio (minor modifications) ;;; $Revision: 1.37 $, tested with Emacs 20.4 to 21.2 and Xemacs 21.1 to 21.5 ;;; ;;; 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. ;;; ;;; ;;; Commentary: ;; ;; Usage: ;; ;; - Add this file to some place where Emacs can find it ;; (e.g. put it into a directory ~/emacs/, which you add to your ;; load path by putting the following line into your .emacs file: ;; ;; (add-to-list 'load-path (expand-file-name "~/emacs/")) ;; ;; Then, add the following line to your .emacs file: ;; ;; (require 'xdvi-search) ;; ;; After compiling your .tex file with source specials activated, you should ;; be able to use ;; M-x xdvi-jump-to-line ;; to make xdvi jump to the current location of the cursor. ;; ;; You could also bind this command to a key, e.g. by adding ;; a binding to tex-mode-hook: ;; ;; (add-hook 'tex-mode-hook (lambda () ;; (local-set-key "\C-c\C-j" 'xdvi-jump-to-line))) ;; ;; ;; (without AucTeX; use LaTeX-mode-hook instead of tex-mode-hook with AucTeX. ;; Note that with AucTeX, C-c C-j is already bound to LaTeX-insert-item, so ;; you might want to use a different key combination instead.) ;; ;; - Note that with xdvik < 22.74.2, you may need to use one of the ;; functions xdvi-jump-to-line-fullpath() or xdvi-jump-to-line-relpath() ;; instead of xdvi-jump-to-line(), depending on the type of paths contained ;; in your \include{} commands. See the docstring of xdvi-jump-to-line() ;; for more information. ;; ;; Please send bug reports, improvements etc. to ;; . ;; ;;; Code: ;;; ;;; Customizable stuff ;;; (defgroup xdvi-search nil "Support for inverse search with (La)TeX and DVI previewers." :group 'languages) (defcustom explicit-shell-file-name nil "*If non-nil, file name to use for explicitly requested inferior shell." :type '(choice (const :tag "nil" nil) file) :group 'xdvi-search) (defcustom xdvi-shell-buffer-name nil "*If non-nil, file name to use for explicitly requested inferior shell." :type '(choice (const :tag "nil" nil) file) :group 'xdvi-search) (defcustom xdvi-bin "xdvi" "*Name of the xdvi executable." :type '(choice (const "xdvi") file) :group 'xdvi-search) (defcustom xdvi-logfile "~/.xdvi-log" "*Write xdvi output to this file, or throw away output if set to nil." :type '(choice (const :tag "nil" nil) file) :group 'xdvi-search) ;;; ;;; global variables/constants ;;; (defvar xdvi-version-number 0 "*Version of xdvi(k) you're using. Only set this to override the built-in version recognition if that fails. The version number is computed as: major * 1000000 + minor * 1000 + patchlevel, where alphabetic characters are ignored; e.g. 22040000 equals version 22.40c; 22077002 equals version 22.77.2.") (defvar xdvi-is-xdvik nil "Whether we're really using xdvik instead of xdvi.") ;;; ;;; exported functions ;;; ;;;###autoload (defun xdvi-jump-to-line-fullpath () "See `xdvi-jump-to-line' for documentation." (interactive) (xdvi-jump-to-line 3)) ;;;###autoload (defun xdvi-jump-to-line-relpath () "See `xdvi-jump-to-line' for documentation." (interactive) (xdvi-jump-to-line 2)) ;;;###autoload (defun xdvi-jump-to-line (flag) "Call xdvi to perform a `forward search' for current file and line number. The optional argument FLAG controls the path searching behaviour; see also 'xdvi-jump-to-line-fullpath' and 'xdvi-jump-to-line-relpath'. Xdvi needs three pieces of information for forward search: - the current line number - the name of the current input file - the name of the master .tex file. The `master' .tex file (following AucTeX's terminology) is the same as `\jobname' and determines the name of the DVI file. It is either obtained by using AucTeX's function `TeX-master-file' or, in case AucTeX isn't available, by calling `xdvi-master-file-name', a function which tries to mimick AucTeX's behaviour to obtain this filename. For the current input file name, we need to rely on the DVI viewer to make a smart matching of path suffixes with the file names that actually occur in the specials, since specials inserted by TeX's `-src' option may contain absolute or relative paths, depending on whether TeX is called with a relative or absolute filename. (Similarly for srcltx.sty, which can't expand paths.) Note to users of older versions of xdvik (< 22.74.2), or non-k xdvi: There are various ways of specifying an input file path for LaTeX's \\input{} commands (which will end up in the source specials): (1) Filename only: \\input{chapter1} (2) Relative path name: \\input{chapters/chapter1} (3) Full path name: \\input{/home/user/tex/diss/chapters/chapter1} Versions of xdvik < 22.74.2 and plain xdvi will not match pathname suffixes. With these versions, `xdvi-jump-to-line' will only work with variant (1); for (2) or (3) you will need to use one of `xdvi-jump-to-line-relpath' (for 2) or `xdvi-jump-to-line-fullpath' (for 3) instead." (interactive "P") (save-excursion (save-restriction (widen) (beginning-of-line 1) (if (not flag) (setq flag 1)) (let* (;;; Current line in file. ;;; `count-lines' yields different results at beginning and in the ;;; middle of a line, so we normalize by going to BOL first and ;;; then adding 1 (curr-line (+ 1 (count-lines (point-min) (point)))) ;;; name of master .tex file, to be used as DVI basename: (abspath (file-name-directory buffer-file-name)) (master-file (if (fboundp 'TeX-master-file) (TeX-master-file t) (xdvi-get-masterfile (xdvi-master-file-name)))) (xdvi-version-info (xdvi-get-version-number xdvi-version-number)) ;;; DVI file name: (dvi-file (concat (file-name-sans-extension master-file) ".dvi")) ;;; Current source filename (filename (get-source-filename (buffer-file-name) flag))) (if (not (xdvi-has-inverse-search (car xdvi-version-info))) (error "Your xdvi version is too old; see http://xdvi.sourceforge.net/inverse-search.html for more information")) (if (not (file-exists-p dvi-file)) (message "File %s does not exist; maybe you need to run latex first?" dvi-file) (save-window-excursion (if (xdvi-has-nofork (car xdvi-version-info) (car (cdr xdvi-version-info))) (progn (setq proc (start-process "xdvi" "*xdvi output*" xdvi-bin "-nofork" "-sourceposition" (concat (int-to-string curr-line) " " filename) dvi-file)) (set-process-sentinel proc 'xdvi-process-sentinel)) ;;; ;;; More complicated if we don't have nofork: start a ;;; subshell, since otherwise there's no way of viewing ;;; the stderr/stdout output of the xdvi child process ;;; without having either xdvi freezing, Emacs freezing, ;;; or Emacs killing the xdvi child process (which is ;;; forked when running with -sourceposition). ;;; ;;; Obtain the type of I/O-redirection needed for current shell: (let* ((default-shell (or (and (boundp 'explicit-shell-file-name) explicit-shell-file-name) (getenv "ESHELL") (getenv "SHELL") "/bin/sh")) (shell-redirection (cond ((string-match "/bin/t?csh" default-shell) (list ">&" "")) ;; bash/ksh/sh ((list ">" "2>&1"))))) (cond ((string-match "XEmacs" emacs-version) (xdvi-shell)) ((< emacs-major-version 21) (xdvi-shell)) ((shell (or xdvi-shell-buffer-name "*xdvi-shell*")))) (comint-send-input) (insert (concat "cd " abspath ";") ) (insert xdvi-bin " -sourceposition '" (int-to-string curr-line) " " filename "' " dvi-file " " ;;; we could probably do without the logfile, but it's an easy ;;; way for toggling between /dev/null and logging. (if xdvi-logfile (let ((xdvi-logfile-fullname (expand-file-name xdvi-logfile))) ;;; to avoid problems with `noclobber' (if (file-exists-p xdvi-logfile-fullname) (delete-file xdvi-logfile-fullname)) (car shell-redirection) " " xdvi-logfile-fullname " " (car (cdr shell-redirection)) ) ) " &") (if xdvi-logfile (message "Writing xdvi output to \"%s\"." xdvi-logfile)) (comint-send-input))))))))) ;;; ;;; internal functions ;;; (defun shell-with-name (name) "This function opens a shell in a buffer with name given by the argument, and switches to that buffer. If the buffer already exists, we simply switch to it." (let ((buffer-of-name (get-buffer name)) (tempname (generate-new-buffer-name "*tempshell*") ) ) (cond ((bufferp buffer-of-name) ;If the buffer exists, switch to it (assume it is a shell) (switch-to-buffer name)) ( (bufferp (get-buffer "*shell*")) (progn (shell) (rename-buffer tempname) (shell) (rename-buffer name) (switch-to-buffer tempname) (rename-buffer "*shell*") (switch-to-buffer name))) ( t (progn (shell) (rename-buffer name) ) ) ) ) ) (defun xdvi-shell () "Behaves just like function shell, but creates the shell in buffer named *xdvi-shell* (unless of course the user chooses to modify the xdvi-shell-buffer-name variable.)" (shell-with-name (or xdvi-shell-buffer-name "*xdvi-shell*") ) ) (defun xdvi-has-inverse-search (version) "Return True if inverse search is available for this VERSION of xdvi(k)." (>= version 22038000)) (defun xdvi-has-nofork (version is-xdvik) "Return True if the '-nofork' option is available for this VERSION of xdvi(k). This option was implemented in version 22.74.1 of xdvik, and 22.61 of plain xdvi. Argument IS-XDVIK controls whether we're running xdvik or plain xdvi." (if is-xdvik (>= version 22074001) (>= version 22061000))) (defun get-source-filename (fname flag) "Helper function to extract the file name from the file name FNAME. FLAG controls whether to use the full path or a relative path." (if (> flag 1) (if (> flag 2) ;;; full path name, for use with TeX patch and when using the ;;; full path in \input or \include with srcltx.sty: (expand-file-name fname) ;;; relative path name: if current path and path of master file match partly, ;;; use the rest of this path; else use buffer name. This can treat both the ;;; cases when a relative path is used in \input{}, or when just the filename ;;; is used and the file is located in the current directory (suggested by ;;; frisk@isy.liu.se). (if (string-match (concat "^" (regexp-quote (file-name-directory master-file))) fname) (substring fname (match-end 0)) fname)) ;;; buffer file name without path: (file-name-nondirectory fname))) (defun xdvi-get-version-number (default) "Return a tuple of (version-number xdvi-is-xdvik), or (DEFAULT nil) if DEFAULT != 0." (if (not (= default 0)) (list default nil) (save-window-excursion (switch-to-buffer "*xdvi-version*") (erase-buffer) (call-process xdvi-bin nil "*xdvi-version*" nil "-version") (goto-char (point-min)) (if (not (re-search-forward "xdvi\\((?k)?\\)? version \\([0-9]+\\)\\.\\([0-9]+\\)\\(\\.\\([0-9]+\\)\\)?" nil t)) (error "Unable to get xdvi version number - please check value of `xdvi-bin', or set it manually via `xdvi-version-number'") (let* ((major (string-to-int (buffer-substring (match-beginning 2) (match-end 2)))) (minor (string-to-int (buffer-substring (match-beginning 3) (match-end 3)))) (patchlevel (if (match-beginning 5) (string-to-int (buffer-substring (match-beginning 5) (match-end 5))) 0)) (xdvi-is-xdvik (if (match-beginning 1) t nil)) (version (+ (* 1000 minor) (* 1000000 major) patchlevel))) (kill-buffer "*xdvi-version*") ;;; (message "Xdvi%s version: major %d, minor %d, version %d" (if xdvi-is-xdvik "k" "") major minor version) (list version xdvi-is-xdvik) ))))) (defun xdvi-process-sentinel (process signal) "Return a readable error message for subprocess PROCESS which has terminated with SIGNAL." (let ((retmsg (substring signal 0 -1))) (if (string-match "abnormally" retmsg) (progn (message "XDvi: %s" retmsg) (pop-to-buffer (process-buffer process))) (message "XDvi: %s" retmsg)))) (defun xdvi-get-masterfile (file) "Small helper function for AucTeX compatibility. Converts the special value t that TeX-master might be set to (Argument FILE) into a real file name." (if (eq file t) (buffer-file-name) file)) (defun xdvi-master-file-name () "Emulate AucTeX's TeX-master-file function. Partly copied from tex.el's TeX-master-file and TeX-add-local-master." (if (boundp 'TeX-master) TeX-master (let ((master-file (read-file-name "Master file (default this file): "))) (if (y-or-n-p "Save info as local variable? ") (progn (goto-char (point-max)) (if (re-search-backward "^\\([^\n]+\\)Local Variables:" nil t) (let* ((prefix (if (match-beginning 1) (buffer-substring (match-beginning 1) (match-end 1)) "")) (start (point))) (re-search-forward (regexp-quote (concat prefix "End:")) nil t) (if (re-search-backward (regexp-quote (concat prefix "TeX-master")) start t) ;;; if TeX-master line exists already, replace it (progn (beginning-of-line 1) (kill-line 1)) (beginning-of-line 1)) (insert prefix "TeX-master: " (prin1-to-string master-file) "\n")) (insert "\n%%% Local Variables: " ;;; mode is of little use without AucTeX ... ;;; "\n%%% mode: " (substring (symbol-name major-mode) 0 -5) "\n%%% TeX-master: " (prin1-to-string master-file) "\n%%% End: \n")) (save-buffer) (message "(local variables written.)")) (message "(nothing written.)")) (set (make-local-variable 'TeX-master) master-file)))) (provide 'xdvi-search) ;;; page break to avoid "Local variables entry is missing the prefix" error for previous stuff ;;; xdvi-search.el ends here xdvik-ja-22.84.16-j1.40/texk/xdvik/dvi-draw.h0000664000175000017500000001147310363262237020063 0ustar uwabamiuwabami/* * Copyright (c) 1990-2004 Paul Vojta and the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef DVI_DRAW_H_ #define DVI_DRAW_H_ #include "xdvi-config.h" #include "xdvi.h" extern void prescan(FILE *fp); /* forward declarations */ struct font; struct tn; /* this information is saved when using virtual fonts */ struct drawinf { struct framedata data; struct font *fontp; set_char_proc set_char_p; unsigned long tn_table_len; struct font **tn_table; struct tn *tn_head; ubyte *pos, *end; /* pointers to a scan buffer defined in dvi-draw.c */ struct font *virtual; #ifdef TEXXET int dir; #endif }; struct src_parsed_special { int line; int col; char *filename; size_t filename_len; }; extern void src_parse(const char *str, int str_len, struct src_parsed_special *parsed); /* * pixel_conv is currently used only for converting absolute positions * to pixel values; although normally it should be * * ((int) ((x) / currwin.shrinkfactor + (1 << 15) >> 16)), * * the rounding is achieved instead by moving the constant 1 << 15 to * PAGE_OFFSET in dvi-draw.c. */ #define pixel_conv(x) ((int) ((x) / currwin.shrinkfactor >> 16)) #define pixel_round(x) ((int) ROUNDUP(x, currwin.shrinkfactor << 16)) /* entries below with the characters 'dvi' in them are actually stored in scaled pixel units */ #define DVI_H currinf.data.dvi_h #define PXL_H pixel_conv(currinf.data.dvi_h) #define DVI_V currinf.data.dvi_v #define PXL_V currinf.data.pxl_v #define WW currinf.data.w #define XX currinf.data.x #define YY currinf.data.y #define ZZ currinf.data.z extern void draw_page(void); extern void source_reverse_search(int, int, wide_bool); extern void source_special_show(wide_bool); extern void source_forward_search(const char *); extern void anchor_search(const char *str); #ifdef T1LIB extern void init_t1(void); extern void add_T1_mapentry(int lineno, const char *mapfile, const char *name, const char *file, const char *vec, char *psec); extern void read_T1_char(struct font *, wide_ubyte); extern int find_T1_font(const char *); extern setcharRetvalT set_t1_char( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch); #endif /* T1LIB */ /* this is needed by any program that wants to use spcl_scan, since the buffer is supposed to be of that length. */ #ifndef DVI_BUFFER_LEN #define DVI_BUFFER_LEN 2048 #endif extern long text_do_char(FILE *fp, struct scan_info *info, wide_ubyte ch); extern Boolean spcl_scan(Boolean(*spcl_proc) (char *str, int str_len, void *data), void *data, Boolean return_if_found, FILE *fp); extern void geom_scan_part(long(*char_proc)(FILE *, struct scan_info *, wide_ubyte), FILE *fp, struct scan_info *info, struct frame *min_frame, double current_dimconv); extern void geom_scan(long(*char_proc)(FILE *, struct scan_info *, wide_ubyte), FILE *fp, struct scan_info *info, int pageno); extern off_t save_file_status(FILE *fp, struct drawinf *currinf_save, ubyte *maxchar_save); extern void reinit_text_scan(void); extern void restore_file_status(FILE *fp, struct drawinf currinf_save, ubyte maxchar_save, off_t pos_save); void htex_do_special(const char *str, size_t len); extern setcharRetvalT set_char( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch); extern setcharRetvalT load_n_set_char( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch); extern setcharRetvalT set_vf_char( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch); #ifdef GREY void init_plane_masks(void); #endif #if COLOR struct rgb; /* forward declaration */ Pixel alloc_color(const struct rgb *, Pixel); void do_color_change(void); #elif GREY void init_pix(void); #endif void dvi_fmt_error(const char *message, ...); #endif /* DVI_DRAW_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/dvi-draw.c0000664000175000017500000060077611217712530020063 0ustar uwabamiuwabami/* The rest of the code has the following copyright: Copyright (c) 1990-2004 Paul Vojta and others 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. NOTE: xdvi is based on prior work, as noted in the modification history in xdvi.c. \*========================================================================*/ #include "xdvi-config.h" #include "xdvi.h" #include #include #include #include #define USE_HASH #include #include "kpathsea/c-fopen.h" #include "kpathsea/c-stat.h" #include "kpathsea/magstep.h" #include "kpathsea/tex-file.h" #include #include "dvi.h" #include "string-utils.h" #include "util.h" #include "x_util.h" #include "events.h" #include "dvi-init.h" #include "statusline.h" #include "hypertex.h" #include "special.h" #include "tfmload.h" #include "read-mapfile.h" #include "my-snprintf.h" #include "kpathsea/tex-file.h" #include "mag.h" #include "message-window.h" #include "dvi-draw.h" #include "search-internal.h" #include "encodings.h" #include "pagesel.h" #include "pagehist.h" #ifdef RGB_ANTI_ALIASING #define TRACE_AA 0 #define TRACE_AA1 1 #define TRACE_AA3 0 #else #define TRACE_AA 0 #define TRACE_AA1 0 #define TRACE_AA3 0 #endif #define MY_DEBUG 0 #if MY_DEBUG # define TRACE_FIND_VERBOSE(x) TRACE_FIND(x) #else # define TRACE_FIND_VERBOSE(x) /* as nothing */ #endif #if PS && PS_GS #include "psgs.h" #endif /* PS && PS_GS */ #ifdef DOPRNT /* define this if vfprintf gives you trouble */ # define vfprintf(stream, message, args) _doprnt(message, args, stream) #endif #define BUF_SIZE 1024 /* * All calculations are done with shrink factor = 1, so we re-do some * macros accordingly. Many of these are also defined in special.c. */ #define xpixel_conv(x) ((int) ((x) >> 16)) #define xpixel_round(x) ((int) ROUNDUP(x, 1 << 16)) #define G_PXL_H xpixel_conv(currinf.data.dvi_h) #define G_OFFSET_X (resource.xoffset_int << 16) + (3 << 15) #define G_OFFSET_Y (resource.yoffset_int << 16) + (3 << 15) #ifdef T1LIB /* hashing stuff to speed up checking whether a font or tfminfo file has already been loaded. */ #define T1FONTS_INITIAL_HASHTABLE_SIZE 1031 static hashTableT t1fonts_hash; static hashTableT tfminfo_hash; static hashTableT fontmaps_hash; /* static hashTableT font_warn_hash; */ typedef enum { FAILURE_BLANK = -2, FAILURE_PK = -1, SUCCESS = 0 } t1FontLoadStatusT; #endif #if PS int scanned_page_ps; int scanned_page_ps_bak; #endif #if COLOR int scanned_page_color; #endif int scanned_page_reset, scanned_page; struct drawinf currinf; Boolean htex_inside_href = False; /* whether we're inside a href */ Boolean drawing_mag = False; #ifdef T1LIB # include "t1lib.h" /* Datastructures: encodings[n]: Loaded from map file [0] = 8r, [1] = 8c, The vectors are demand-loaded in 'load_encoded_font' */ struct encoding { char *enc; /* This may be NULL. From dvips maps we get encodings loaded by filename, and no name given */ char *file; char **vector; }; static struct encoding *encodings = NULL; /* Dynamic array = realloc when it gets full */ static size_t enclidx = 0; /* global, for communication with find_T1_font */ /* t1fonts[n]: Built as xdvi loads t1 fonts idx file short t1id loaded [0] = /path/cmr10.pfb, cmr10 0 1 [1] = /path/prmr.pfa, prmr 1 0 [2] = /path/pcrr8a.pfa, pcrr8a 2 0 This array enumerates the loaded t1 fonts by full path name. The integer `t1id' is the t1lib font id. The font will not be extended/slanted/encoded. The `loaded' field indicates if T1_LoadFont has been called for the font yet. Texfonts that need a modified version of the t1 font must use T1_CopyFont to copy the raw font and obtain the id of a new t1 font which can then be modified. As described in the t1 docs a font must be loaded before it can be copied. Fonts that are copies of other fonts have NULL filenames. If any font files are to be reused based on the file name, the raw font must be reused, not a copy. The `short' field contains the font as it was identified in the fontmap. This is used to save searching; if two fonts are identified the same way in the fontmap, they are the same font. */ struct t1font_info { char *file; char *shortname; int t1id; int loaded; }; static struct t1font_info *t1fonts = NULL; /* Dynamic array */ /* fontmaps[n]: Loaded from map file, and extended with 'implied' fonts as needed. idx texname enc exten. slant filena. t1libid pathn. tfmidx [0] = pcrr8rn 0 750 0 pcrr8a 2 ... 2 [1] = putro8r 0 0 0 putro8r 3 ... 3 The first 5 fields of this table are loaded from the font map files, or filled out with default values when implied fonts are set-up. The t1libid is -1 until the font is loaded or copied as described under t1fonts. Once the dvi file reveals that the font is needed, it is located on disk to ensure it exists, and the pathname field is filled out. The t1 font is not loaded or copied before it's needed because set_t1_char has been called to draw a glyph from the font. The late loading is necessiated by the high cost of loading fonts. If the font loading is concentrated at startup of the program the startup-time becomes ecessively high due to the high number of fonts used by the average LaTeX document. A value of 0 for `extension'/`slant' means no extension/slant. If the input values are decimal (less than 10) they're multiplied by 1000 and 10000 respectively to obtain fixed-point integer values. (This means that xdvi will translate entries like `0.81' to 810.) Integer values have the advantage that they can be tested for exact equality on all architectures. */ struct fontmap { char *texname; int enc; /* Index in encoding array */ int extension; /* Fixed point, *1000 */ int slant; /* Fixed point, *10000, some font slantings have 4 significant digits, all after the decimalpoint */ char *filename; /* Name of the t1 font file as given in map/dvi */ int t1libid; /* The t1lib id of this font, or -1 if not set up */ char *pathname; /* Full path of the font, once needed and located */ int tfmidx; /* Index in tfminfo array, or -1 */ Boolean warned_about; /* whether a warning message about this font has been displayed yet */ /* if the font file was not readable for some reason (e.g. corrupt, or encrypted for proprietry distribution), load_font_now() will try to load a PK version via load_font() instead. If this is successful, it will set force_pk to true, which will tell get_t1_glyph() to return immediately, and just use the standard set_char() routine to set the PK glyph. If even that fails, get_t1_glyph() returns an error status in a special flag that's evaluated by set_t1_char(). */ Boolean force_pk; }; static struct fontmap *fontmaps = NULL; static size_t g_maplidx = 0; /* global, for communication with find_texfont */ /* widthinfo[n]: TFM width info, loaded on demand as the fonts are used. idx texname widths [0] = cmr10 ... [1] = ptmr8r ... [2] = pcrr8rn ... [3] = putro8r ... The widthinfo is loaded from the font tfm file because the type1 width information isn't precise enough to avoid accumulating rounding errors that make things visibly misaligned. This is esp. noticeable in tables (for the lines separating the columns). For other than "design" sizes the widths are scaled up or down. */ struct tfminfos { const char *texname; long designsize; long widths[256]; long fontdimen2; /* width of word spacing in this font */ }; static struct tfminfos *tfminfo = NULL; /* For file reading */ # define BUFFER_SIZE 1024 /* This is the conversion factor from TeXs pt to TeXs bp (big point). Maximum machine precision is needed to keep it accurate. */ /* UNUSED */ /* static double bp_fac=72.0/72.27; */ /* Try to convert from PS charspace units to DVI units with minimal loss of significant digits */ # define t1_dvi_conv(x) ((((int) (x)) << 16)/1000) /* Convert from DVI units to TeX pt */ # define dvi_pt_conv(x) (((long) ((x)*dimconv)) >> 19) /* Convert from TFM units to DVI units */ # define tfm_dvi_conv(x) (((int) (x)) >> 1) static Boolean padMismatch = False; /* Does t1lib padding match xdvi required padding? */ static int archpad; # define T1PAD(bits, pad) (((bits) + (pad) - 1) & -(pad)) static struct glyph *get_t1_glyph( # ifdef TEXXET wide_ubyte cmd, # endif wide_ubyte ch, t1FontLoadStatusT *flag, Boolean is_geom_scan); # ifdef WORDS_BIGENDIAN unsigned char rbits[] = { 0x00, /* 00000000 -> 00000000 */ 0x80, /* 00000001 -> 10000000 */ 0x40, /* 00000010 -> 01000000 */ 0xC0, /* 00000011 -> 11000000 */ 0x20, /* 00000100 -> 00100000 */ 0xA0, /* 00000101 -> 10100000 */ 0x60, /* 00000110 -> 01100000 */ 0xE0, /* 00000111 -> 11100000 */ 0x10, /* 00001000 -> 00010000 */ 0x90, /* 00001001 -> 10010000 */ 0x50, /* 00001010 -> 01010000 */ 0xD0, /* 00001011 -> 11010000 */ 0x30, /* 00001100 -> 00110000 */ 0xB0, /* 00001101 -> 10110000 */ 0x70, /* 00001110 -> 01110000 */ 0xF0, /* 00001111 -> 11110000 */ 0x08, /* 00010000 -> 00001000 */ 0x88, /* 00010001 -> 10001000 */ 0x48, /* 00010010 -> 01001000 */ 0xC8, /* 00010011 -> 11001000 */ 0x28, /* 00010100 -> 00101000 */ 0xA8, /* 00010101 -> 10101000 */ 0x68, /* 00010110 -> 01101000 */ 0xE8, /* 00010111 -> 11101000 */ 0x18, /* 00011000 -> 00011000 */ 0x98, /* 00011001 -> 10011000 */ 0x58, /* 00011010 -> 01011000 */ 0xD8, /* 00011011 -> 11011000 */ 0x38, /* 00011100 -> 00111000 */ 0xB8, /* 00011101 -> 10111000 */ 0x78, /* 00011110 -> 01111000 */ 0xF8, /* 00011111 -> 11111000 */ 0x04, /* 00100000 -> 00000100 */ 0x84, /* 00100001 -> 10000100 */ 0x44, /* 00100010 -> 01000100 */ 0xC4, /* 00100011 -> 11000100 */ 0x24, /* 00100100 -> 00100100 */ 0xA4, /* 00100101 -> 10100100 */ 0x64, /* 00100110 -> 01100100 */ 0xE4, /* 00100111 -> 11100100 */ 0x14, /* 00101000 -> 00010100 */ 0x94, /* 00101001 -> 10010100 */ 0x54, /* 00101010 -> 01010100 */ 0xD4, /* 00101011 -> 11010100 */ 0x34, /* 00101100 -> 00110100 */ 0xB4, /* 00101101 -> 10110100 */ 0x74, /* 00101110 -> 01110100 */ 0xF4, /* 00101111 -> 11110100 */ 0x0C, /* 00110000 -> 00001100 */ 0x8C, /* 00110001 -> 10001100 */ 0x4C, /* 00110010 -> 01001100 */ 0xCC, /* 00110011 -> 11001100 */ 0x2C, /* 00110100 -> 00101100 */ 0xAC, /* 00110101 -> 10101100 */ 0x6C, /* 00110110 -> 01101100 */ 0xEC, /* 00110111 -> 11101100 */ 0x1C, /* 00111000 -> 00011100 */ 0x9C, /* 00111001 -> 10011100 */ 0x5C, /* 00111010 -> 01011100 */ 0xDC, /* 00111011 -> 11011100 */ 0x3C, /* 00111100 -> 00111100 */ 0xBC, /* 00111101 -> 10111100 */ 0x7C, /* 00111110 -> 01111100 */ 0xFC, /* 00111111 -> 11111100 */ 0x02, /* 01000000 -> 00000010 */ 0x82, /* 01000001 -> 10000010 */ 0x42, /* 01000010 -> 01000010 */ 0xC2, /* 01000011 -> 11000010 */ 0x22, /* 01000100 -> 00100010 */ 0xA2, /* 01000101 -> 10100010 */ 0x62, /* 01000110 -> 01100010 */ 0xE2, /* 01000111 -> 11100010 */ 0x12, /* 01001000 -> 00010010 */ 0x92, /* 01001001 -> 10010010 */ 0x52, /* 01001010 -> 01010010 */ 0xD2, /* 01001011 -> 11010010 */ 0x32, /* 01001100 -> 00110010 */ 0xB2, /* 01001101 -> 10110010 */ 0x72, /* 01001110 -> 01110010 */ 0xF2, /* 01001111 -> 11110010 */ 0x0A, /* 01010000 -> 00001010 */ 0x8A, /* 01010001 -> 10001010 */ 0x4A, /* 01010010 -> 01001010 */ 0xCA, /* 01010011 -> 11001010 */ 0x2A, /* 01010100 -> 00101010 */ 0xAA, /* 01010101 -> 10101010 */ 0x6A, /* 01010110 -> 01101010 */ 0xEA, /* 01010111 -> 11101010 */ 0x1A, /* 01011000 -> 00011010 */ 0x9A, /* 01011001 -> 10011010 */ 0x5A, /* 01011010 -> 01011010 */ 0xDA, /* 01011011 -> 11011010 */ 0x3A, /* 01011100 -> 00111010 */ 0xBA, /* 01011101 -> 10111010 */ 0x7A, /* 01011110 -> 01111010 */ 0xFA, /* 01011111 -> 11111010 */ 0x06, /* 01100000 -> 00000110 */ 0x86, /* 01100001 -> 10000110 */ 0x46, /* 01100010 -> 01000110 */ 0xC6, /* 01100011 -> 11000110 */ 0x26, /* 01100100 -> 00100110 */ 0xA6, /* 01100101 -> 10100110 */ 0x66, /* 01100110 -> 01100110 */ 0xE6, /* 01100111 -> 11100110 */ 0x16, /* 01101000 -> 00010110 */ 0x96, /* 01101001 -> 10010110 */ 0x56, /* 01101010 -> 01010110 */ 0xD6, /* 01101011 -> 11010110 */ 0x36, /* 01101100 -> 00110110 */ 0xB6, /* 01101101 -> 10110110 */ 0x76, /* 01101110 -> 01110110 */ 0xF6, /* 01101111 -> 11110110 */ 0x0E, /* 01110000 -> 00001110 */ 0x8E, /* 01110001 -> 10001110 */ 0x4E, /* 01110010 -> 01001110 */ 0xCE, /* 01110011 -> 11001110 */ 0x2E, /* 01110100 -> 00101110 */ 0xAE, /* 01110101 -> 10101110 */ 0x6E, /* 01110110 -> 01101110 */ 0xEE, /* 01110111 -> 11101110 */ 0x1E, /* 01111000 -> 00011110 */ 0x9E, /* 01111001 -> 10011110 */ 0x5E, /* 01111010 -> 01011110 */ 0xDE, /* 01111011 -> 11011110 */ 0x3E, /* 01111100 -> 00111110 */ 0xBE, /* 01111101 -> 10111110 */ 0x7E, /* 01111110 -> 01111110 */ 0xFE, /* 01111111 -> 11111110 */ 0x01, /* 10000000 -> 00000001 */ 0x81, /* 10000001 -> 10000001 */ 0x41, /* 10000010 -> 01000001 */ 0xC1, /* 10000011 -> 11000001 */ 0x21, /* 10000100 -> 00100001 */ 0xA1, /* 10000101 -> 10100001 */ 0x61, /* 10000110 -> 01100001 */ 0xE1, /* 10000111 -> 11100001 */ 0x11, /* 10001000 -> 00010001 */ 0x91, /* 10001001 -> 10010001 */ 0x51, /* 10001010 -> 01010001 */ 0xD1, /* 10001011 -> 11010001 */ 0x31, /* 10001100 -> 00110001 */ 0xB1, /* 10001101 -> 10110001 */ 0x71, /* 10001110 -> 01110001 */ 0xF1, /* 10001111 -> 11110001 */ 0x09, /* 10010000 -> 00001001 */ 0x89, /* 10010001 -> 10001001 */ 0x49, /* 10010010 -> 01001001 */ 0xC9, /* 10010011 -> 11001001 */ 0x29, /* 10010100 -> 00101001 */ 0xA9, /* 10010101 -> 10101001 */ 0x69, /* 10010110 -> 01101001 */ 0xE9, /* 10010111 -> 11101001 */ 0x19, /* 10011000 -> 00011001 */ 0x99, /* 10011001 -> 10011001 */ 0x59, /* 10011010 -> 01011001 */ 0xD9, /* 10011011 -> 11011001 */ 0x39, /* 10011100 -> 00111001 */ 0xB9, /* 10011101 -> 10111001 */ 0x79, /* 10011110 -> 01111001 */ 0xF9, /* 10011111 -> 11111001 */ 0x05, /* 10100000 -> 00000101 */ 0x85, /* 10100001 -> 10000101 */ 0x45, /* 10100010 -> 01000101 */ 0xC5, /* 10100011 -> 11000101 */ 0x25, /* 10100100 -> 00100101 */ 0xA5, /* 10100101 -> 10100101 */ 0x65, /* 10100110 -> 01100101 */ 0xE5, /* 10100111 -> 11100101 */ 0x15, /* 10101000 -> 00010101 */ 0x95, /* 10101001 -> 10010101 */ 0x55, /* 10101010 -> 01010101 */ 0xD5, /* 10101011 -> 11010101 */ 0x35, /* 10101100 -> 00110101 */ 0xB5, /* 10101101 -> 10110101 */ 0x75, /* 10101110 -> 01110101 */ 0xF5, /* 10101111 -> 11110101 */ 0x0D, /* 10110000 -> 00001101 */ 0x8D, /* 10110001 -> 10001101 */ 0x4D, /* 10110010 -> 01001101 */ 0xCD, /* 10110011 -> 11001101 */ 0x2D, /* 10110100 -> 00101101 */ 0xAD, /* 10110101 -> 10101101 */ 0x6D, /* 10110110 -> 01101101 */ 0xED, /* 10110111 -> 11101101 */ 0x1D, /* 10111000 -> 00011101 */ 0x9D, /* 10111001 -> 10011101 */ 0x5D, /* 10111010 -> 01011101 */ 0xDD, /* 10111011 -> 11011101 */ 0x3D, /* 10111100 -> 00111101 */ 0xBD, /* 10111101 -> 10111101 */ 0x7D, /* 10111110 -> 01111101 */ 0xFD, /* 10111111 -> 11111101 */ 0x03, /* 11000000 -> 00000011 */ 0x83, /* 11000001 -> 10000011 */ 0x43, /* 11000010 -> 01000011 */ 0xC3, /* 11000011 -> 11000011 */ 0x23, /* 11000100 -> 00100011 */ 0xA3, /* 11000101 -> 10100011 */ 0x63, /* 11000110 -> 01100011 */ 0xE3, /* 11000111 -> 11100011 */ 0x13, /* 11001000 -> 00010011 */ 0x93, /* 11001001 -> 10010011 */ 0x53, /* 11001010 -> 01010011 */ 0xD3, /* 11001011 -> 11010011 */ 0x33, /* 11001100 -> 00110011 */ 0xB3, /* 11001101 -> 10110011 */ 0x73, /* 11001110 -> 01110011 */ 0xF3, /* 11001111 -> 11110011 */ 0x0B, /* 11010000 -> 00001011 */ 0x8B, /* 11010001 -> 10001011 */ 0x4B, /* 11010010 -> 01001011 */ 0xCB, /* 11010011 -> 11001011 */ 0x2B, /* 11010100 -> 00101011 */ 0xAB, /* 11010101 -> 10101011 */ 0x6B, /* 11010110 -> 01101011 */ 0xEB, /* 11010111 -> 11101011 */ 0x1B, /* 11011000 -> 00011011 */ 0x9B, /* 11011001 -> 10011011 */ 0x5B, /* 11011010 -> 01011011 */ 0xDB, /* 11011011 -> 11011011 */ 0x3B, /* 11011100 -> 00111011 */ 0xBB, /* 11011101 -> 10111011 */ 0x7B, /* 11011110 -> 01111011 */ 0xFB, /* 11011111 -> 11111011 */ 0x07, /* 11100000 -> 00000111 */ 0x87, /* 11100001 -> 10000111 */ 0x47, /* 11100010 -> 01000111 */ 0xC7, /* 11100011 -> 11000111 */ 0x27, /* 11100100 -> 00100111 */ 0xA7, /* 11100101 -> 10100111 */ 0x67, /* 11100110 -> 01100111 */ 0xE7, /* 11100111 -> 11100111 */ 0x17, /* 11101000 -> 00010111 */ 0x97, /* 11101001 -> 10010111 */ 0x57, /* 11101010 -> 01010111 */ 0xD7, /* 11101011 -> 11010111 */ 0x37, /* 11101100 -> 00110111 */ 0xB7, /* 11101101 -> 10110111 */ 0x77, /* 11101110 -> 01110111 */ 0xF7, /* 11101111 -> 11110111 */ 0x0F, /* 11110000 -> 00001111 */ 0x8F, /* 11110001 -> 10001111 */ 0x4F, /* 11110010 -> 01001111 */ 0xCF, /* 11110011 -> 11001111 */ 0x2F, /* 11110100 -> 00101111 */ 0xAF, /* 11110101 -> 10101111 */ 0x6F, /* 11110110 -> 01101111 */ 0xEF, /* 11110111 -> 11101111 */ 0x1F, /* 11111000 -> 00011111 */ 0x9F, /* 11111001 -> 10011111 */ 0x5F, /* 11111010 -> 01011111 */ 0xDF, /* 11111011 -> 11011111 */ 0x3F, /* 11111100 -> 00111111 */ 0xBF, /* 11111101 -> 10111111 */ 0x7F, /* 11111110 -> 01111111 */ 0xFF /* 11111111 -> 11111111 */ }; # endif /* WORDS_BIGENDIAN */ #endif /* T1LIB */ static struct frame frame0; /* dummy head of list */ #ifdef TEXXET static struct frame *scan_frame; /* head frame for scanning */ #endif static const char *const reverse_search_helptext = "Forward/reverse search allows you to jump from a point " "in the DVI file to the corresponding location in the .tex source file, and vice versa. " "To make this possible, the .tex file needs to be compiled with source special support. " "This can be done by using either a package like \"srcltx.sty\" or \"srctex.sty\", " "or a command-line switch like \"-src\" for the TeX executable. " "See the xdvi man page (section SOURCE SPECIALS) " "for more information about this."; static ubyte dvi_buffer[DVI_BUFFER_LEN]; ubyte *G_dvi_buf_ptr = dvi_buffer; static struct frame *current_frame; /* Points to drawinf record containing current dvi file location (for update by geom_scan). */ static struct drawinf *dvi_pointer_frame = NULL; #ifdef TEXXET #define DIR currinf.dir #else #define DIR 1 #endif /* * Explanation of the following constant: * offset_[xy] << 16: margin (defaults to one inch) * currwin.shrinkfactor << 16: one pixel page border * currwin.shrinkfactor << 15: rounding for pixel_conv */ #define OFFSET_X (resource.xoffset_int << 16) + (currwin.shrinkfactor * 3 << 15) #define OFFSET_Y (resource.yoffset_int << 16) + (currwin.shrinkfactor * 3 << 15) #if (BMBYTES == 1) bmUnitT bit_masks[] = { 0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff }; #else #if (BMBYTES == 2) bmUnitT bit_masks[] = { 0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff }; #else /* BMBYTES == 4 */ bmUnitT bit_masks[] = { 0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff }; #endif #endif #ifdef VMS #define off_t int #endif extern off_t lseek(); #ifndef SEEK_SET /* if is not provided (or for = globals.win_expose.min_x && y < globals.win_expose.max_y && y + (int)h >= globals.win_expose.min_y) { if (--globals.ev.ctr == 0) { if (read_events(EV_NOWAIT) & EV_GE_MAG_GONE) { /* fprintf(stderr, "longjmp1!\n"); */ longjmp(globals.ev.canit, 1); } } #if COLOR if (fg_active != fg_current) do_color_change(); #endif XFillRectangle(DISP, currwin.win, globals.gc.rule, x - currwin.base_x, y - currwin.base_y, w ? w : 1, h ? h : 1); } } static void put_bitmap(struct bitmap *bitmap, int x, int y) { if (globals.debug & DBG_BITMAP) printf("X(%d,%d)\n", x - currwin.base_x, y - currwin.base_y); if (htex_inside_href) htex_record_position(x, y, bitmap->w, bitmap->h); if (x < globals.win_expose.max_x && x + (int)bitmap->w >= globals.win_expose.min_x && y < globals.win_expose.max_y && y + (int)bitmap->h >= globals.win_expose.min_y) { if (--globals.ev.ctr == 0) if (read_events(EV_NOWAIT) & EV_GE_MAG_GONE) { /* fprintf(stderr, "longjmp2!\n"); */ longjmp(globals.ev.canit, 1); } #if COLOR if (fg_active != fg_current) do_color_change(); #endif G_image->width = bitmap->w; G_image->height = bitmap->h; G_image->data = bitmap->bits; G_image->bytes_per_line = bitmap->bytes_wide; XPutImage(DISP, currwin.win, globals.gc.fore, G_image, 0, 0, x - currwin.base_x, y - currwin.base_y, bitmap->w, bitmap->h); if (globals.gc.fore2) { XPutImage(DISP, currwin.win, globals.gc.fore2, G_image, 0, 0, x - currwin.base_x, y - currwin.base_y, bitmap->w, bitmap->h); } } } #if GREY /* Anti-aliasing stuff. The method used here is supersampling of the unshrunk glyph (this also means that no anti-aliasing happens at shrink 1). A sample of the number of bits that are `on' in the unsrunk glyph determines the grey level of the shrunk image. */ /* Pixel lookup tables for anti-aliasing: These store all possible supersampling values (i.e. number of bits set in the unshrunk image) for the given shrink factor. E.g. at shrink level 2, the size of the pixel table is 4; in other words, 1 pixel in the shrunk image corresponds to 4 pixels in the unshrunk image. Thus, the possible values for shink level 2 are: black, 1/4 (0x404040), 1/2 (0x808080), 3/4 (0xc0c0c0) and white (0xffffff). */ static Pixel *pixeltbl; static Pixel *pixeltbl_gc2; /* drawing to globals.gc.fore2 (compare pixmap2_gc2) */ static void shrink_glyph_grey(struct glyph *); static void put_image(struct glyph *g, int x, int y) { XImage *img = g->image2; if (htex_inside_href) htex_record_position(x, y, img->width, img->height); if (x < globals.win_expose.max_x && x + img->width >= globals.win_expose.min_x && y < globals.win_expose.max_y && y + img->height >= globals.win_expose.min_y) { if (--globals.ev.ctr == 0) if (read_events(EV_NOWAIT) & EV_GE_MAG_GONE) { /* fprintf(stderr, "longjmp3!\n"); */ longjmp(globals.ev.canit, 1); } #if COLOR if (g->fg != fg_current) /* if color change since last use */ shrink_glyph_grey(g); else if (fg_active != fg_current) /* if GCs need updating */ do_color_change(); #endif /* TODO: Can we increase gamma locally to make the inverted text more readable? and to draw the background, so something like this: XFillRectangle(DISP, currwin.win, globals.gc.fore, x - currwin.base_x, y - currwin.base_y, (unsigned int)img->width * 2, (unsigned int)img->height * 2); test this with color changes!! */ /*TEST_DELAY("check point 1 ...")*/ XPutImage(DISP, currwin.win, globals.gc.fore, img, 0, 0, x - currwin.base_x, y - currwin.base_y, (unsigned int)img->width, (unsigned int)img->height); /*TEST_DELAY("check point 2 ...")*/ if (globals.gc.fore2 != NULL) { img->data = g->pixmap2_gc2; XPutImage(DISP, currwin.win, globals.gc.fore2, img, 0, 0, x - currwin.base_x, y - currwin.base_y, (unsigned int)img->width, (unsigned int)img->height); img->data = g->pixmap2; } /*TEST_DELAY("check point 3 ...")*/ } } #endif /* GREY */ /* * Draw the border of a rectangle on the screen. * This should be replaced by a grey background both in Xaw and Motif * as soon as #470325 is fixed (see also FIXED_FLUSHING_PAGING). */ static void draw_border(int x, int y, unsigned int width, unsigned int height, GC ourGC) { --width; --height; XDrawRectangle(DISP, currwin.win, ourGC, x, y, width, height); } /* draw the grid */ static void put_grid(int x, int y, unsigned int width, unsigned int height, unsigned int unit, GC gc) { int i; float sep; unsigned int tmp; --width; --height; /* draw vertial grid */ #define DRAWGRID_VER(gc) for (i = 1; \ (tmp = x + (int)(i * sep)) < x + width; \ i++) \ XFillRectangle(DISP, currwin.win, (gc), \ tmp, y, 1, height) /* draw horizontal grid */ #define DRAWGRID_HOR(gc) for (i = 1; \ (tmp = y + (int)(i * sep)) < y + height; \ i++) \ XFillRectangle(DISP, currwin.win, (gc), \ x, tmp, width, 1) if (resource.grid_mode > 2) { /* third level grid */ sep = (float)unit / 4.0; DRAWGRID_VER(gc); DRAWGRID_HOR(gc); } if (resource.grid_mode > 1) { /* second level grid */ sep = (float)unit / 2.0; DRAWGRID_VER(gc); DRAWGRID_HOR(gc); } if (resource.grid_mode > 0) { /* first level grid */ sep = (float)unit; DRAWGRID_VER(gc); DRAWGRID_HOR(gc); } } #undef DRAWGRID_VER #undef DRAWGRID_HOR /* * Byte reading routines for dvi file. */ #define xtell(fp, pos) (lseek(fileno(fp), 0L, SEEK_CUR) - \ (currinf.end - (pos))) static ubyte xxone(FILE *fp) { if (currinf.virtual) { ++currinf.pos; return EOP; } currinf.end = G_dvi_buf_ptr + read(fileno(fp), (char *)(currinf.pos = G_dvi_buf_ptr), DVI_BUFFER_LEN); return currinf.end > G_dvi_buf_ptr ? *(currinf.pos)++ : EOF; } #define xone(fp) (currinf.pos < currinf.end ? *(currinf.pos)++ : xxone(fp)) static unsigned long xnum(FILE *fp, ubyte size) { long x = 0; while (size--) x = (x << 8) | xone(fp); return x; } static long xsnum(FILE *fp, ubyte size) { long x; #if __STDC__ x = (signed char)xone(fp); #else x = xone(fp); if (x & 0x80) x -= 0x100; #endif while (--size) x = (x << 8) | xone(fp); return x; } #define xsfour(fp) xsnum(fp, 4) static void xskip(FILE *fp, long offset) { currinf.pos += offset; if (!currinf.virtual && currinf.pos > currinf.end) (void)lseek(fileno(fp), (long)(currinf.pos - currinf.end), SEEK_CUR); } void dvi_fmt_error(const char *message, ...) { va_list args; va_start(args, message); fprintf(stderr, "%s: ", globals.program_name); (void)vfprintf(stderr, message, args); va_end(args); if (currinf.virtual) fprintf(stderr, " in virtual font %s\n", currinf.virtual->fontname); else fprintf(stderr, ", offset %ld\n", (long)xtell(globals.dvi_file.bak_fp, currinf.pos - 1)); /* #ifndef NDEBUG */ /* xdvi_exit(EXIT_FAILURE); */ /* #else */ XDVI_ABORT((stderr, "I'll abort now, to help you debugging this.")); /* #endif */ } /* * Code for debugging options. */ static void print_bitmap(struct bitmap *bitmap) { bmUnitT *ptr = (bmUnitT *)bitmap->bits; int x, y, i; ASSERT(ptr != NULL, "Invalid bitmap bits"); printf("w = %d, h = %d, bytes wide = %d\n", bitmap->w, bitmap->h, bitmap->bytes_wide); for (y = 0; y < (int)bitmap->h; ++y) { for (x = bitmap->bytes_wide; x > 0; x -= BMBYTES) { #ifdef WORDS_BIGENDIAN for (i = BMBITS - 1; i >= 0; --i) putchar((*ptr & (1 << i)) ? '@' : '.'); #else for (i = 0; i < BMBITS; ++i) putchar((*ptr & (1 << i)) ? '@' : '.'); #endif ++ptr; } putchar('\n'); } } static void print_char(ubyte ch, struct glyph *g) { printf("char %d", ch); if (isprint(ch)) printf(" (%c)", ch); putchar('\n'); printf("x = %d, y = %d, dvi = %ld\n", g->x, g->y, g->dvi_adv); print_bitmap(&g->bitmap); } static const char *dvi_table1[] = { "SET1", "SET2", NULL, NULL, "SETRULE", "PUT1", "PUT2", NULL, NULL, "PUTRULE", "NOP", "BOP", "EOP", "PUSH", "POP", "RIGHT1", "RIGHT2", "RIGHT3", "RIGHT4", "W0", "W1", "W2", "W3", "W4", "X0", "X1", "X2", "X3", "X4", "DOWN1", "DOWN2", "DOWN3", "DOWN4", "Y0", "Y1", "Y2", "Y3", "Y4", "Z0", "Z1", "Z2", "Z3", "Z4" }; static const char *dvi_table2[] = { "FNT1", "FNT2", "FNT3", "FNT4", "XXX1", "XXX2", "XXX3", "XXX4", "FNTDEF1", "FNTDEF2", "FNTDEF3", "FNTDEF4", "PRE", "POST", "POSTPOST", "SREFL", "EREFL", NULL, NULL, NULL, NULL }; static void print_dvi(ubyte ch) { const char *s; fprintf(stderr, "%4d %4d ", PXL_H, PXL_V); if (ch <= (ubyte) (SETCHAR0 + 127)) { fprintf(stderr, "SETCHAR%-3d", ch - SETCHAR0); if (isprint(ch)) fprintf(stderr, " (%c)", ch); fputc('\n', stderr); return; } else if (ch < FNTNUM0) s = dvi_table1[ch - 128]; else if (ch <= (ubyte) (FNTNUM0 + 63)) { fprintf(stderr, "FNTNUM%d\n", ch - FNTNUM0); return; } else s = dvi_table2[ch - (FNTNUM0 + 64)]; if (s) { fputs(s, stderr); fputc('\n', stderr); } else XDVI_FATAL((stderr, "print_dvi: unknown op-code %d", ch)); } /* * Count the number of set bits in a 4x4-region of the bitmap */ static char sample_count[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; /* * For greyscaling, return the number of bits that are set in a given region * of width w and height h of the bitmap `bits', starting horizontally after * `bit_skip' bits, where `bytes_wide' is the same as the `bytes_wide' field * in the bitmap struct (scan line width in bytes). * Note that `bits' is really a one-dimensional array, i.e. all the rows * are put in sequence into one single row. */ static int sample(bmUnitT *bits, int bytes_wide, int bit_skip, int w, int h) { bmUnitT *beg_ptr, *end_ptr, *curr_ptr; int bits_left; int n, bit_shift, wid; #if TRACE_AA fprintf(stderr, "sample: %d bytes wide, %d skip, %d w, %d h\n", bytes_wide, bit_skip, w, h); #endif beg_ptr = bits + bit_skip / BMBITS; end_ptr = ADD(bits, h * bytes_wide); #if TRACE_AA fprintf(stderr, "beg_ptr: %p, end: %p\n", (void *)beg_ptr, (void *)end_ptr); #endif bits_left = w; #ifdef WORDS_BIGENDIAN bit_shift = BMBITS - bit_skip % BMBITS; #else bit_shift = bit_skip % BMBITS; #endif #if TRACE_AA fprintf(stderr, "shift: %d\n", bit_shift); #endif n = 0; while (bits_left) { #ifdef WORDS_BIGENDIAN wid = bit_shift; #else wid = BMBITS - bit_shift; #endif if (wid > bits_left) wid = bits_left; if (wid > 4) /* why? */ wid = 4; #ifdef WORDS_BIGENDIAN bit_shift -= wid; #endif for (curr_ptr = beg_ptr; curr_ptr < end_ptr; curr_ptr = ADD(curr_ptr, bytes_wide)) { #if TRACE_AA int i; for (i = 0; i < bytes_wide; i++) { fprintf(stderr, "%d ", *(curr_ptr + i)); } fprintf(stderr, "\nMask: %d; count: %d\n", wid, sample_count[ (*curr_ptr >> bit_shift) & bit_masks[wid] ]); #endif n += sample_count[ (*curr_ptr >> bit_shift) & bit_masks[wid] ]; } #ifdef WORDS_BIGENDIAN if (bit_shift == 0) { bit_shift = BMBITS; ++beg_ptr; } #else bit_shift += wid; if (bit_shift == BMBITS) { bit_shift = 0; ++beg_ptr; } #endif bits_left -= wid; /* fprintf(stderr, "bits_left: %d\n", bits_left); */ } return n; } static void shrink_glyph(struct glyph *g) { int shrunk_bytes_wide, shrunk_height; int rows_left, rows, init_cols; int cols_left; int cols; bmUnitT *unshrunk_ptr, *shrunk_ptr; bmUnitT m, *cp; /* threshold for which a bit will be set to `on' in the shrunken bitmap */ int min_sample = currwin.shrinkfactor * currwin.shrinkfactor * resource.density / 100; int row_num; /* These machinations ensure that the character is shrunk according to its hot point, rather than its upper left-hand corner. */ g->x2 = g->x / currwin.shrinkfactor; init_cols = g->x - g->x2 * currwin.shrinkfactor; if (init_cols <= 0) init_cols += currwin.shrinkfactor; else ++g->x2; g->bitmap2.w = g->x2 + ROUNDUP((int)g->bitmap.w - g->x, currwin.shrinkfactor); /* include row zero with the positively numbered rows */ row_num = g->y + 1; g->y2 = row_num / currwin.shrinkfactor; rows = row_num - g->y2 * currwin.shrinkfactor; if (rows <= 0) { rows += currwin.shrinkfactor; --g->y2; } g->bitmap2.h = shrunk_height = g->y2 + ROUNDUP((int)g->bitmap.h - row_num, currwin.shrinkfactor) + 1; alloc_bitmap(&g->bitmap2); unshrunk_ptr = (bmUnitT *) g->bitmap.bits; shrunk_ptr = (bmUnitT *) g->bitmap2.bits; shrunk_bytes_wide = g->bitmap2.bytes_wide; rows_left = g->bitmap.h; memset((char *)shrunk_ptr, '\0', shrunk_bytes_wide * shrunk_height); while (rows_left) { if (rows > rows_left) rows = rows_left; cols_left = g->bitmap.w; #ifndef WORDS_BIGENDIAN m = 1; /* XXX was (1 << 0) */ #else m = ((bmUnitT)1 << (BMBITS - 1)); #endif cp = shrunk_ptr; cols = init_cols; while (cols_left) { /* ??? */ if (cols > cols_left) cols = cols_left; /* set a bit to `on' if it's over the threshold */ if (sample(unshrunk_ptr, g->bitmap.bytes_wide, (int)g->bitmap.w - cols_left, cols, rows) >= min_sample) *cp |= m; #ifndef WORDS_BIGENDIAN if (m == ((bmUnitT)1 << (BMBITS - 1))) { m = 1; /* XXX was (1 << 0) */ ++cp; } else m <<= 1; #else if (m == 1) { /* XXX was (1 << 0) */ m = ((bmUnitT)1 << (BMBITS - 1)); ++cp; } else m >>= 1; #endif cols_left -= cols; cols = currwin.shrinkfactor; } shrunk_ptr += shrunk_bytes_wide / sizeof(bmUnitT); unshrunk_ptr += rows * g->bitmap.bytes_wide / sizeof(bmUnitT); /* *((char **)&shrunk_ptr) += shrunk_bytes_wide; */ /* *((char **)&unshrunk_ptr) += rows * g->bitmap.bytes_wide; */ rows_left -= rows; rows = currwin.shrinkfactor; } g->y2 = g->y / currwin.shrinkfactor; if (globals.debug & DBG_BITMAP) print_bitmap(&g->bitmap2); } #ifdef GREY #ifdef RGB_ANTI_ALIASING /* void */ /* filter_colors(Pixel *p1, Pixel *p2) */ /* { */ /* Pixel res1, res2; */ /* int res1_r = *p1 & G_visual->red_mask; */ /* int res1_g = *p1 & G_visual->green_mask; */ /* int res1_b = *p1 & G_visual->blue_mask; */ /* int res2_r = *p2 & G_visual->red_mask; */ /* int res2_g = *p2 & G_visual->green_mask; */ /* int res2_b = *p2 & G_visual->blue_mask; */ /* } */ static void color_filter_image(struct glyph *g) { int rows = g->bitmap2.h; int cols = g->bitmap2.w; int i, j, k; int arr_size = rows * cols * 3; unsigned char *arr = xmalloc(arr_size * sizeof *arr); unsigned char *arr2 = xmalloc(arr_size * sizeof *arr2); fprintf(stderr, "total: %d\n", arr_size); for (i = 0, j = 0; j < rows; j++) { for (k = 0; k < cols; k++) { Pixel p = XGetPixel(g->image2, k, j); #if TRACE_AA3 fprintf(stderr, "k: %d, j: %d, idx: %d\n", k, j, i); #endif arr[i] = (p & G_visual->red_mask) >> 16; arr[i + 1] = (p & G_visual->green_mask) >> 8; arr[i + 2] = (p & G_visual->blue_mask); #if TRACE_AA3 fprintf(stderr, "0x%.6lX -> %d, %d, %d\n", p, arr[i], arr[i + 1], arr[i + 2]); #endif i += 3; } } for (i = 0; i < arr_size; i++) { if (i == 0) { /* merge two elems */ if (i == arr_size - 1) /* only one elem, do nothing */ break; arr2[i] = (int)(resource.subpixel_energy[0] * arr[i] + resource.subpixel_energy[1] * arr[i + 1] + 0.5); } else if (i == arr_size - 1) { /* merge two elems */ if (i == 0) /* only one elem, do nothing */ break; arr2[i] = (int)(resource.subpixel_energy[1] * arr[i - 1] + resource.subpixel_energy[0] * arr[i] + 0.5); } else { /* merge three elems */ arr2[i] = (int)(resource.subpixel_energy[1] * arr[i - 1] + resource.subpixel_energy[0] * arr[i] + resource.subpixel_energy[1] * arr[i + 1] + 0.5); #if TRACE_AA3 fprintf(stderr, "%d, %d, %d -> %d\n", arr[i - 1], arr[i], arr[i + 1], arr2[i]); #endif } } for (i = 0, j = 0; j < rows; j++) { for (k = 0; k < cols; k++) { Pixel p = arr2[i] << 16 | (arr2[i + 1] << 8) | arr2[i + 2]; #if TRACE_AA3 fprintf(stderr, "%d, %d, %d -> 0x%.6lX\n", arr2[i], arr2[i + 1], arr2[i + 2], p); #endif XPutPixel(g->image2, k, j, p); i += 3; } } free(arr); free(arr2); } #endif static void shrink_glyph_grey(struct glyph *g) { int rows_left, rows, init_cols; int cols_left; int cols; int x, y; long thesample; /* int min_sample = currwin.shrinkfactor * currwin.shrinkfactor * resource.density / 100; */ Pixel onoff, onoff2; bmUnitT *unshrunk_ptr; unsigned int size; int row_num; int actual_w; #if COLOR if (fg_active != fg_current) { do_color_change(); } #endif if (pixeltbl == NULL) { /* fix #1611508 (segfault when starting with -nogrey) */ do_color_change(); } /* TODO: rounding errors causing color fringing (see HACK comment below): \documentclass{article} \pagestyle{empty} \begin{document} l \end{document} With ./xdvi-xaw.bin -name xdvi -subpixel rgb -s 4 ./test.dvi: subpixel order: rgb = 1 g->x2: 0, init_cols: -2 AFTER: g->x2: 0, init_cols: 2 but with ./xdvi-xaw.bin -name xdvi -s 4 ./test.dvi: g->x2: 0, init_cols: -3 AFTER: g->x2: 0, init_cols: 1 */ /* These machinations ensure that the character is shrunk according to its hot point, rather than its upper left-hand corner. */ #ifdef RGB_ANTI_ALIASING if (resource.subpixel_order == SUBPIXEL_NONE) g->x2 = g->x / currwin.shrinkfactor; else { if (g->x < 0) g->x2 = (int)(g->x / 3.0 - 0.5) / currwin.shrinkfactor; else g->x2 = (int)(g->x / 3.0 + 0.5) / currwin.shrinkfactor; } if (resource.subpixel_order == SUBPIXEL_NONE) init_cols = g->x - g->x2 * currwin.shrinkfactor; else { if (g->x < 0) init_cols = (int)(g->x / 3.0 - 0.5) - g->x2 * currwin.shrinkfactor; else init_cols = (int)(g->x / 3.0 + 0.5) - g->x2 * currwin.shrinkfactor; fprintf(stderr, "g->x: %d, g->x2: %d, init_cols: %d\n", g->x, g->x2, init_cols); } #else g->x2 = g->x / currwin.shrinkfactor; init_cols = g->x - g->x2 * currwin.shrinkfactor; #endif if (init_cols <= 0) init_cols += currwin.shrinkfactor; else ++(g->x2); #ifdef RGB_ANTI_ALIASING if (resource.subpixel_order == SUBPIXEL_NONE) g->bitmap2.w = g->x2 + ROUNDUP((int)g->bitmap.w - g->x, currwin.shrinkfactor); else { fprintf(stderr, "AFTER: g->x2: %d, init_cols: %d\n", g->x2, init_cols); /* fprintf(stderr, "g->bitmap.w / 3.0 + 0.5: %d; g->x / 3.0: %d; all: %d, %d\n", */ /* (int)(g->bitmap.w / 3.0 + 0.5), */ /* (int)(g->x / 3.0), */ /* (int)((g->bitmap.w / 3.0 + 0.5) - g->x / 3.0), */ /* g->x2 + (int)((((g->bitmap.w / 3.0 + 0.5) - g->x / 3.0) + currwin.shrinkfactor - 1) / currwin.shrinkfactor)); */ g->bitmap2.w = g->x2 + ROUNDUP((int)((g->bitmap.w / 3.0 + 0.5) - g->x / 3.0), currwin.shrinkfactor); /* fprintf(stderr, "g->bitmap.w: %d\n", g->bitmap2.w); */ } #else g->bitmap2.w = g->x2 + ROUNDUP((int)g->bitmap.w - g->x, currwin.shrinkfactor); #endif /* include row zero with the positively numbered rows */ row_num = g->y + 1; #ifdef DBG_AA fprintf(stderr, "row_num: %d\n", row_num); #endif /* DBG_AA */ /* g->y2 is the new height of the image: */ g->y2 = row_num / currwin.shrinkfactor; #ifdef DBG_AA fprintf(stderr, "g->y2: %d\n", g->y2); #endif /* DBG_AA */ /* in C89 and before, result of division can `truncate towards negative infinity' (i.e., round to the larger digit) for negative quotients, hence we need to test for rows < 0. OTOH, if rows = 0, use currwin.shrinkfactor instead (why?) */ if ((rows = row_num - g->y2 * currwin.shrinkfactor) <= 0) { rows += currwin.shrinkfactor; --(g->y2); } g->bitmap2.h = g->y2 + ROUNDUP((int)g->bitmap.h - row_num, currwin.shrinkfactor) + 1; #if TRACE_AA1 if (resource.subpixel_order != SUBPIXEL_NONE) { fprintf(stderr, "\nbitmap.h: %d, bitmap.w: %d\n", g->bitmap2.h, g->bitmap2.w); } #endif /* DBG_AA */ /* allocate pixmap for antialiasing ... */ if (g->pixmap2 == NULL) { g->image2 = XCreateImage(DISP, G_visual, G_depth, ZPixmap, 0, (char *)NULL, g->bitmap2.w, g->bitmap2.h, BMBITS, 0); size = g->image2->bytes_per_line * g->bitmap2.h; g->pixmap2 = g->image2->data = xmalloc(size != 0 ? size : 1); } /* ... and the pixmap used for globals.gc.fore2: */ if (globals.gc.fore2 != NULL && g->pixmap2_gc2 == NULL) { size = g->image2->bytes_per_line * g->bitmap2.h; g->pixmap2_gc2 = xmalloc(size != 0 ? size : 1); } #if 0 if (resource.subpixel_order != SUBPIXEL_NONE) { fprintf(stderr, "\n============= BITMAP ==============\n"); print_bitmap(&g->bitmap); } #endif unshrunk_ptr = (bmUnitT *)g->bitmap.bits; actual_w = g->bitmap.w; rows_left = g->bitmap.h; y = 0; /* the basic algorithm is the same as in the nogrey code, with the main exception that the return value of sample() is used. */ while (rows_left) { #ifdef RGB_ANTI_ALIASING Pixel pixel = 0; Pixel pixel2 = 0; #endif x = 0; if (rows > rows_left) /* why - extra safety? */ rows = rows_left; cols_left = g->bitmap.w; /* fprintf(stderr, "init_cols: %d\n", init_cols); */ cols = init_cols; while (cols_left) { if (cols > cols_left) /* why - extra safety? */ cols = cols_left; thesample = sample(unshrunk_ptr, g->bitmap.bytes_wide, (int)g->bitmap.w - cols_left, cols, rows); /* if (resource.subpixel_order != SUBPIXEL_NONE && resource.subpixel_energy[2] != 0) */ /* onoff = thesample >= min_sample ? 0xffffff : 0; */ /* else */ onoff = pixeltbl[thesample]; #ifdef XSERVER_INFO if (globals.debug & DBG_PK) { int c; /* fprintf(stderr, "onoff: %d\n", onoff); */ if (onoff > 65536) c = onoff / 65536; else if (onoff > 256) c = onoff / 256; else c = onoff; if (c == 0) fprintf(stdout, ",.."); else fprintf(stdout, ",%.2x", c); } #endif #ifdef RGB_ANTI_ALIASING if (resource.subpixel_order != SUBPIXEL_NONE) { int div = x / 3; int rest = x % 3; if (resource.subpixel_order == SUBPIXEL_RGB) { if (rest == 0) pixel = onoff & G_visual->red_mask; else if (rest == 1) pixel |= onoff & G_visual->green_mask; else pixel |= onoff & G_visual->blue_mask; } else { /* SUBPIXEL_BGR */ if (rest == 0) pixel = onoff & G_visual->blue_mask; else if (rest == 1) pixel |= onoff & G_visual->green_mask; else pixel |= onoff & G_visual->red_mask; } #if 0 && TRACE_AA1 fprintf(stderr, "sample: %ld; row %d, col %d, left %d: 0x%.6lx; pixel: 0x%.6lx at pos %d,%d (x:%d)\n", thesample, rows, cols, cols_left, onoff, pixel, div, y, x); #endif /* TRACE_AA */ fprintf(stderr, "pixel at %d\n", div); XPutPixel(g->image2, div, y, pixel); /* HACK to fix color fringing problem */ if (div + 1 < g->bitmap2.w) { fprintf(stderr, "rest pixel at %d\n", div); XPutPixel(g->image2, div + 1, y, 0); } } else { #if 0 && TRACE_AA1 fprintf(stderr, "sample: %ld; row %d, col %d, left %d: 0x%.6lx at pos %d, %d\n", thesample, rows, cols, cols_left, onoff, x, y); #endif /* TRACE_AA */ XPutPixel(g->image2, x, y, onoff); } #else XPutPixel(g->image2, x, y, onoff); #endif /* RGB_ANTI_ALIASING */ if (globals.gc.fore2 != NULL) { onoff2 = pixeltbl_gc2[thesample]; #ifdef RGB_ANTI_ALIASING if (resource.subpixel_order != SUBPIXEL_NONE) { int div = x / 3; int rest = x % 3; if (resource.subpixel_order == SUBPIXEL_RGB) { if (rest == 0) pixel2 = onoff2 & G_visual->red_mask; else if (rest == 1) pixel2 |= onoff2 & G_visual->green_mask; else pixel2 |= onoff2 & G_visual->blue_mask; } else { /* SUBPIXEL_BGR */ if (rest == 0) pixel2 = onoff2 & G_visual->blue_mask; else if (rest == 1) pixel2 |= onoff2 & G_visual->green_mask; else pixel2 |= onoff2 & G_visual->red_mask; } g->image2->data = g->pixmap2_gc2; #if TRACE_AA1 fprintf(stderr, "fore2 at %d, %d\n", div, y); #endif XPutPixel(g->image2, div, y, pixel2); g->image2->data = g->pixmap2; } else { #else /* RGB_ANTI_ALIASING */ g->image2->data = g->pixmap2_gc2; XPutPixel(g->image2, x, y, onoff2); g->image2->data = g->pixmap2; #endif #ifdef RGB_ANTI_ALIASING } #endif } #if 0 && TRACE_AA1 fprintf(stderr, "subtracting %d from %d: %d\n", cols, cols_left, cols_left - cols); #endif cols_left -= cols; cols = currwin.shrinkfactor; x++; } /* advance pointer by the number of rows covered */ /* fprintf(stderr, "++: %d; %d, %d\n", rows * g->bitmap.bytes_wide, g->bitmap.bytes_wide, sizeof(bmUnitT)); */ unshrunk_ptr += rows * g->bitmap.bytes_wide / sizeof(bmUnitT); /* *((char **)&unshrunk_ptr) += rows * g->bitmap.bytes_wide; */ rows_left -= rows; rows = currwin.shrinkfactor; y++; #ifdef XSERVER_INFO if (globals.debug & DBG_PK) fprintf(stdout, "\n"); #endif } #ifdef XSERVER_INFO if (globals.debug & DBG_PK) fprintf(stdout, "\n"); #endif #if 0 fprintf(stderr, "y: %d, bitmap.h: %d\n", y, (int)g->bitmap2.h); #endif /* DBG_AA */ /* fill remaining rows not covered before (how?) */ while (y < (int)g->bitmap2.h) { for (x = 0; x < (int)g->bitmap2.w; x++) { /* int c = *pixeltbl; */ #if TRACE_AA1 fprintf(stderr, "Remaining at %d, %d: 0x%.6lx\n", x, y, *pixeltbl); #endif XPutPixel(g->image2, x, y, *pixeltbl); /* if (c == 0) */ /* fprintf(stdout, ",.."); */ /* else */ /* fprintf(stdout, ",%.2x", c); */ if (globals.gc.fore2 != NULL) { g->image2->data = g->pixmap2_gc2; #if TRACE_AA1 fprintf(stderr, "image2 at %d, %d: 0x%.6lx\n", x, y, *pixeltbl_gc2); #endif XPutPixel(g->image2, x, y, *pixeltbl_gc2); g->image2->data = g->pixmap2; } } y++; } #ifdef RGB_ANTI_ALIASING if (resource.subpixel_order != SUBPIXEL_NONE && resource.subpixel_energy[1] != 0) color_filter_image(g); if (resource.subpixel_order != SUBPIXEL_NONE && resource.subpixel_energy[2] != 0) color_filter_image(g); #endif g->y2 = g->y / currwin.shrinkfactor; #if COLOR g->fg = fg_current; #endif } #endif /* GREY */ /* * Find font #n. */ static void change_font(unsigned long n) { struct tn *tnp; if (n < currinf.tn_table_len) currinf.fontp = currinf.tn_table[n]; else { currinf.fontp = NULL; for (tnp = currinf.tn_head; tnp != NULL; tnp = tnp->next) if (tnp->TeXnumber == n) { currinf.fontp = tnp->fontp; break; } } if (currinf.fontp == NULL) XDVI_FATAL((stderr, "Non-existent font number %ld", n)); if (currinf.fontp->set_char_p == NULL) XDVI_FATAL((stderr, "No procedure to set font %ld, %s", n, currinf.fontp->fontname)); maxchar = currinf.fontp->maxchar; currinf.set_char_p = currinf.fontp->set_char_p; } /* * Open a font file. */ static void open_font_file(struct font *fontp) { if (fontp->file == NULL) { fontp->file = XFOPEN(fontp->filename, OPEN_MODE); if (fontp->file == NULL) XDVI_FATAL((stderr, "Couldn't re-locate font file `%s'", fontp->filename)); } } /* * Read and return a 0-terminated special string allocated in static memory * (i.e. contents will be overwritten by next call of this function). */ static char * read_special(FILE *fp, long nbytes) { static char *spcl = NULL; static long spcl_len = -1; char *p; if (nbytes > spcl_len) { spcl = xrealloc(spcl, (unsigned)nbytes + 1); spcl_len = nbytes; } p = spcl; for (;;) { int i = currinf.end - currinf.pos; if (i > nbytes) i = nbytes; memcpy(p, (char *)currinf.pos, i); currinf.pos += i; p += i; nbytes -= i; if (nbytes == 0) break; (void)xxone(fp); --currinf.pos; } *p = '\0'; return spcl; } /* * Table used for scanning. If >= 0, then skip that many bytes. * M1 means end of page, M2 means special, M3 means FNTDEF, * M4 means unrecognizable, and M5 means doesn't belong here. */ #define M1 255 #define M2 254 #define M3 253 #define M4 252 #define M5 251 #define MM 251 static ubyte scantable[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* chars 0 - 127 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, /* SET1,SET2 (128,129) */ /* -,-,SETRULE,PUT1,PUT2,-,-,PUTRULE,NOP,BOP (130-139) */ M4, M4, 8, 1, 2, M4, M4, 8, 0, 44, M1, 0, 0, 1, 2, 3, 4, 0, 1, 2, /* EOP,PUSH,POP,RIGHT1-4,W0M2 (140-149) */ 3, 4, 0, 1, 2, 3, 4, 1, 2, 3, /* W3-4,X0-4,DOWN1-3 (150-159) */ 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, /* DOWN4,Y0-4,Z0-3 (160-169) */ 4, /* Z4 (170) */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* change font 171 - 234 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, M2, /* FNT1-4,XXX1 (235-239) */ /* XXX2-4,FNTDEF1-4,PRE,POST,POSTPOST (240-249) */ M2, M2, M2, M3, M3, M3, M3, M5, M5, M5, 0, 0, M4, M4, M4, M4 }; /* SREFL,EREFL,-,-,-,- (250-255) */ /* * This is the generic scanning routine. It assumes that currinf, etc. * are ready to go at the start of the page to be scanned. */ Boolean spcl_scan(Boolean (*spcl_proc)(char *str, int str_len, void *data), void *data, Boolean return_if_found, FILE *fp) { ubyte ch; ubyte n; long a; for (;;) { ch = xone(fp); /* print_dvi(ch); */ n = scantable[ch]; if (n < MM) while (n-- != 0) (void)xone(fp); else if (n == M1) break; /* end of page */ else switch (n) { case M2: /* special */ a = xnum(fp, ch - XXX1 + 1); if (a > 0) { if (spcl_proc(read_special(fp, a), a, data) && return_if_found) { return True; } } break; case M3: /* FNTDEF */ xskip(fp, (long)(12 + ch - FNTDEF1 + 1)); ch = xone(fp); xskip(fp, (long)ch + (long)xone(fp)); break; case M4: /* unrecognizable */ XDVI_FATAL((stderr, "unknown op-code %d", ch)); break; case M5: /* doesn't belong */ dvi_fmt_error("spcl_scan: shouldn't happen: %s encountered", dvi_table2[ch - (FNTNUM0 + 64)]); break; } } return False; } #define xspell_conv(n) spell_conv0(n, current_dimconv) /* * Prescanning routine for dvi file. This looks for specials like * `header=' and `!'. */ void prescan(FILE *fp) { if (fp == NULL) { return; } TRACE_FILES((stderr, "prescan on %p", (void *)fp)); (void)lseek(fileno(fp), pageinfo_get_offset(scanned_page + 1), SEEK_SET); G_dvi_buf_ptr = dvi_buffer; currinf.pos = currinf.end = G_dvi_buf_ptr; for (;;) { if (scanned_page == -1) { /* on first page */ TRACE_FILES((stderr, "prescan on page 1")); pageinfo_set_page_width(scanned_page + 1, pageinfo_get_page_width(total_pages)); pageinfo_set_page_height(scanned_page + 1, pageinfo_get_page_height(total_pages)); pageinfo_set_window_width(scanned_page + 1, pageinfo_get_window_width(total_pages)); pageinfo_set_window_height(scanned_page + 1, pageinfo_get_window_height(total_pages)); } else { TRACE_FILES((stderr, "prescan on page %d", scanned_page)); pageinfo_set_page_width(scanned_page + 1, pageinfo_get_page_width(scanned_page)); pageinfo_set_page_height(scanned_page + 1, pageinfo_get_page_height(scanned_page)); pageinfo_set_window_width(scanned_page + 1, pageinfo_get_window_width(scanned_page)); pageinfo_set_window_height(scanned_page + 1, pageinfo_get_window_height(scanned_page)); } if (read_events(EV_NOWAIT) & EV_GE_NEWPAGE) { break; } /* NOTE: longjmp(globals.ev.canit) should not be done within read_events(). */ htex_prescan_save(); htex_prescan_initpage(); if (!setjmp(globals.ev.canit)) { struct htex_prescan_data data; int pre_depth, depth; data.pageno = scanned_page + 1; data.scan_type = HTEX_ANCHOR_NUM; /* just for the anchor numbers */ pre_depth = htex_prescan_get_depth(); (void)spcl_scan(scan_special, &data, False, fp); depth = htex_prescan_get_depth(); if (depth > pre_depth) { /* we have a mismatched anchor. We currently don't deal with _nested_ mismatched anchors (ugh), so there's only one anchor string that can be used as info on the next page. */ int anchor_num = htex_prescan_get_mismatched_anchor_num(depth); /* scan again to find the anchor string at anchor number `anchor_num' */ (void)lseek(fileno(fp), pageinfo_get_offset(scanned_page + 1), SEEK_SET); currinf.pos = currinf.end = G_dvi_buf_ptr; data.anchor_num = anchor_num; data.scan_type = HTEX_ANCHOR_STRING; htex_prescan_reset_firstpass(); (void)spcl_scan(scan_special, &data, False, fp); depth = htex_prescan_get_depth(); } else if (depth > 0 && scanned_page >= 0) { /* mismatch was on a previous page */ htex_prescan_carry_over(scanned_page, scanned_page + 1); } } else { /* if interrupted */ htex_prescan_restore(scanned_page + 1); #if PS psp.interrupt(); #endif break; } if (globals.ev.flags & EV_GE_NEWPAGE) break; ++scanned_page; #if COLOR if (scanned_page_color < scanned_page) { scan_color_eop(); scanned_page_color = scanned_page; } #endif #if PS if (scanned_page_ps < scanned_page) scanned_page_ps = scanned_page; #endif if (scanned_page >= current_page) break; } #if PS if (!(globals.ev.flags & EV_GE_NEWPAGE)) psp.endheader(); #endif } /* * Routines to print characters. */ setcharRetvalT set_char( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch) { struct glyph *g; #ifdef TEXXET long dvi_h_sav; #endif if (ch > maxchar) realloc_font(currinf.fontp, (wide_ubyte)ch); if ((g = &currinf.fontp->glyph[ch])->bitmap.bits == NULL) { if (g->addr == 0) { if (!resource.hush_chars) XDVI_WARNING((stderr, "Character %d not defined in font %s", ch, currinf.fontp->fontname)); g->addr = -1; #ifdef TEXXET return; #else return 0L; #endif } if (g->addr == -1) { #ifdef TEXXET return; #else return 0L; /* previously flagged missing char */ #endif } open_font_file(currinf.fontp); fseek(currinf.fontp->file, g->addr, SEEK_SET); (*currinf.fontp->read_char) (currinf.fontp, ch); if (globals.debug & DBG_BITMAP) print_char((ubyte) ch, g); currinf.fontp->timestamp = ++current_timestamp; } #ifdef TEXXET dvi_h_sav = DVI_H; if (currinf.dir < 0) DVI_H -= g->dvi_adv; if (scan_frame == NULL) { #endif #ifdef RGB_ANTI_ALIASING if (currwin.shrinkfactor == -1) { put_bitmap(&g->bitmap, PXL_H - g->x, PXL_V - g->y); } #ifdef __GNUC__ #warning TODO: implement horizontal AA at shrink 1 #endif #else if (currwin.shrinkfactor == 1) { put_bitmap(&g->bitmap, PXL_H - g->x, PXL_V - g->y); } #endif else { #ifdef GREY if (resource.use_grey) { if (g->pixmap2 == NULL) { #ifdef DBG_AA fprintf(stderr, "shinking the bitmap!\n"); #endif /* DBG_AA */ /* print_bitmap(&g->bitmap); */ shrink_glyph_grey(g); } put_image(g, PXL_H - g->x2, PXL_V - g->y2); } else { if (g->bitmap2.bits == NULL) { shrink_glyph(g); } put_bitmap(&g->bitmap2, PXL_H - g->x2, PXL_V - g->y2); } #else if (g->bitmap2.bits == NULL) { shrink_glyph(g); } put_bitmap(&g->bitmap2, PXL_H - g->x2, PXL_V - g->y2); #endif } #ifdef TEXXET } if (cmd == PUT1 || (resource.omega && cmd == PUT2)) DVI_H = dvi_h_sav; else if (currinf.dir > 0) DVI_H += g->dvi_adv; return; #else return g->dvi_adv; #endif } /* * Routines to print characters. */ static setcharRetvalT set_empty_char( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch) { #ifdef TEXXET UNUSED(cmd); #endif UNUSED(ch); #ifdef TEXXET return; #else return 0L; #endif } setcharRetvalT load_n_set_char( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch) { if (!load_font(currinf.fontp, resource.t1lib #if DELAYED_MKTEXPK , True #endif )) { /* if not found */ if (globals.ev.flags & EV_GE_NEWDOC) { /* if abort */ longjmp(globals.ev.canit, 1); } /* FIXME: does this need to be replaced by GUI warning, or has this case already been covered? */ XDVI_WARNING((stderr, "load_n_set_char: Character(s) will be left blank.")); currinf.set_char_p = currinf.fontp->set_char_p = set_empty_char; #ifdef TEXXET return; #else return 0L; #endif } maxchar = currinf.fontp->maxchar; currinf.set_char_p = currinf.fontp->set_char_p; #ifdef TEXXET (*currinf.set_char_p) (cmd, ch); return; #else return (*currinf.set_char_p) (ch); #endif } setcharRetvalT set_vf_char( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch) { struct macro *m; struct drawinf oldinfo; wide_ubyte oldmaxchar; static ubyte c; #ifdef TEXXET long dvi_h_sav; #endif if (ch > maxchar) realloc_virtual_font(currinf.fontp, ch); if ((m = &currinf.fontp->macro[ch])->pos == NULL) { if (!resource.hush_chars) XDVI_WARNING((stderr, "Character %d not defined in font %s", ch, currinf.fontp->fontname)); m->pos = m->end = &c; #ifdef TEXXET return; #else return 0L; #endif } #ifdef TEXXET dvi_h_sav = DVI_H; if (currinf.dir < 0) DVI_H -= m->dvi_adv; if (scan_frame == NULL) { #endif oldinfo = currinf; if (!currinf.virtual) dvi_pointer_frame = &oldinfo; oldmaxchar = maxchar; WW = XX = YY = ZZ = 0; currinf.tn_table_len = VFTABLELEN; currinf.tn_table = currinf.fontp->vf_table; currinf.tn_head = currinf.fontp->vf_chain; currinf.pos = m->pos; currinf.end = m->end; currinf.virtual = currinf.fontp; draw_part(globals.dvi_file.bak_fp, current_frame, currinf.fontp->dimconv); if (currinf.pos != currinf.end + 1) dvi_fmt_error("virtual character macro does not end correctly"); currinf = oldinfo; if (!currinf.virtual) dvi_pointer_frame = &currinf; maxchar = oldmaxchar; #ifdef TEXXET } if (cmd == PUT1 || (resource.omega && cmd == PUT2)) DVI_H = dvi_h_sav; else if (currinf.dir > 0) DVI_H += m->dvi_adv; return; #else return m->dvi_adv; #endif } static setcharRetvalT set_no_char( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch) { if (currinf.virtual) { currinf.fontp = currinf.virtual->first_font; if (currinf.fontp != NULL) { maxchar = currinf.fontp->maxchar; currinf.set_char_p = currinf.fontp->set_char_p; #ifdef TEXXET (*currinf.set_char_p) (cmd, ch); return; #else return (*currinf.set_char_p) (ch); #endif } } dvi_fmt_error("set_no_char: attempt to set character of unknown font"); exit(0); /* NOTREACHED */ } /* * Set rule. Arguments are coordinates of lower left corner. */ static void set_rule(int h, int w) { #ifdef TEXXET put_rule(PXL_H - (currinf.dir < 0 ? w - 1 : 0), PXL_V - h + 1, (unsigned int)w, (unsigned int)h); #else put_rule(PXL_H, PXL_V - h + 1, (unsigned int)w, (unsigned int)h); #endif } /* * Interpret a sequence of dvi bytes (either the page from the dvi file, * or a character from a virtual font). */ static void draw_part(FILE *fp, struct frame *minframe, double current_dimconv) { ubyte ch = 0; #ifdef TEXXET struct drawinf oldinfo; wide_ubyte oldmaxchar = 0; off_t file_pos = 0; int refl_count = 0; #endif int pause_cnt = 0; globals.pausing.flag = False; currinf.fontp = NULL; currinf.set_char_p = set_no_char; #ifdef TEXXET currinf.dir = 1; scan_frame = NULL; /* indicates we're not scanning */ #endif for (;;) { ch = xone(fp); if (globals.debug & DBG_DVI) { print_dvi(ch); } if (ch <= (ubyte)(SETCHAR0 + 127)) { #ifdef TEXXET (*currinf.set_char_p) (ch, ch); #else DVI_H += (*currinf.set_char_p) (ch); #endif } else if (FNTNUM0 <= ch && ch <= (ubyte) (FNTNUM0 + 63)) { change_font((unsigned long)(ch - FNTNUM0)); } else { long a, b; switch (ch) { case SET1: case PUT1: #ifdef TEXXET (*currinf.set_char_p) (ch, xone(fp)); #else a = (*currinf.set_char_p) (xone(fp)); if (ch != PUT1) DVI_H += a; #endif break; case SET2: case PUT2: if (!resource.omega) dvi_fmt_error("%s:%d: draw_part: op-code %d only works with the \"-omega\" option", __FILE__, __LINE__, ch); else { #ifdef TEXXET (*currinf.set_char_p) (ch, xnum(fp, 2)); #else a = (*currinf.set_char_p) (xnum(fp, 2)); if (ch != PUT2) DVI_H += a; #endif } break; case SETRULE: /* Be careful, dvicopy outputs rules with height = 0x80000000. We don't want any SIGFPE here. */ a = xsfour(fp); b = xspell_conv(xsfour(fp)); if (a > 0 && b > 0 #ifdef TEXXET && scan_frame == NULL #endif ) { set_rule(pixel_round(xspell_conv(a)), pixel_round(b)); } DVI_H += DIR * b; break; case PUTRULE: a = xspell_conv(xsfour(fp)); b = xspell_conv(xsfour(fp)); if (a > 0 && b > 0 #ifdef TEXXET && scan_frame == NULL #endif ) { set_rule(pixel_round(a), pixel_round(b)); } break; case NOP: break; case BOP: xskip(fp, (long)11 * 4); DVI_H = OFFSET_X; DVI_V = OFFSET_Y; PXL_V = pixel_conv(DVI_V); WW = XX = YY = ZZ = 0; break; case EOP: if (current_frame != minframe) dvi_fmt_error("%s:%d: draw_part: stack not empty at EOP", __FILE__, __LINE__); return; case PUSH: if (current_frame->next == NULL) { struct frame *newp = xmalloc(sizeof *newp); current_frame->next = newp; newp->prev = current_frame; newp->next = NULL; } current_frame = current_frame->next; current_frame->data = currinf.data; break; case POP: if (current_frame == minframe) dvi_fmt_error("%s:%d: draw_part: more POPs than PUSHes", __FILE__, __LINE__); currinf.data = current_frame->data; current_frame = current_frame->prev; break; #ifdef TEXXET case SREFL: if (scan_frame == NULL) { /* we're not scanning: save some info. */ oldinfo = currinf; oldmaxchar = maxchar; if (!currinf.virtual) file_pos = xtell(fp, currinf.pos); scan_frame = current_frame; /* now we're scanning */ refl_count = 0; break; } /* we are scanning */ if (current_frame == scan_frame) ++refl_count; break; case EREFL: if (scan_frame != NULL) { /* if we're scanning */ if (current_frame == scan_frame && --refl_count < 0) { /* we've hit the end of our scan */ scan_frame = NULL; /* first: push */ if (current_frame->next == NULL) { struct frame *newp = xmalloc(sizeof *newp); current_frame->next = newp; newp->prev = current_frame; newp->next = NULL; } current_frame = current_frame->next; current_frame->data = currinf.data; /* next: restore old file position, XX, etc. */ if (!currinf.virtual) { off_t bgn_pos = xtell(fp, G_dvi_buf_ptr); if (file_pos >= bgn_pos) { oldinfo.pos = dvi_buffer + (file_pos - bgn_pos); oldinfo.end = currinf.end; } else { (void)lseek(fileno(fp), file_pos, SEEK_SET); oldinfo.pos = oldinfo.end; } } currinf = oldinfo; maxchar = oldmaxchar; /* and then: recover position info. */ DVI_H = current_frame->data.dvi_h; DVI_V = current_frame->data.dvi_v; PXL_V = current_frame->data.pxl_v; /* and finally, reverse direction */ currinf.dir = -currinf.dir; } break; } /* we're not scanning, */ /* so just reverse direction and then pop */ currinf.dir = -currinf.dir; currinf.data = current_frame->data; current_frame = current_frame->prev; break; #endif /* TEXXET */ case RIGHT1: case RIGHT2: case RIGHT3: case RIGHT4: DVI_H += DIR * xspell_conv(xsnum(fp, ch - RIGHT1 + 1)); break; case W1: case W2: case W3: case W4: WW = xspell_conv(xsnum(fp, ch - W0)); case W0: DVI_H += DIR * WW; break; case X1: case X2: case X3: case X4: XX = xspell_conv(xsnum(fp, ch - X0)); case X0: DVI_H += DIR * XX; break; case DOWN1: case DOWN2: case DOWN3: case DOWN4: DVI_V += xspell_conv(xsnum(fp, ch - DOWN1 + 1)); PXL_V = pixel_conv(DVI_V); break; case Y1: case Y2: case Y3: case Y4: YY = xspell_conv(xsnum(fp, ch - Y0)); case Y0: DVI_V += YY; PXL_V = pixel_conv(DVI_V); break; case Z1: case Z2: case Z3: case Z4: ZZ = xspell_conv(xsnum(fp, ch - Z0)); case Z0: DVI_V += ZZ; PXL_V = pixel_conv(DVI_V); break; case FNT1: case FNT2: case FNT3: case FNT4: change_font(xnum(fp, ch - FNT1 + 1)); break; case XXX1: case XXX2: case XXX3: case XXX4: a = xnum(fp, ch - XXX1 + 1); if (a > 0) { char *p = read_special(fp, a); if (resource.pause && strcmp(p, resource.pause_special) == 0) { if (++pause_cnt > globals.pausing.num) { globals.pausing.flag = True; /* can't use longjmp(globals.ev.canit, 1); */ return; } } applicationDoSpecial(p, a); } break; case FNTDEF1: case FNTDEF2: case FNTDEF3: case FNTDEF4: xskip(fp, (long)(12 + ch - FNTDEF1 + 1)); a = (long)xone(fp); xskip(fp, a + (long)xone(fp)); break; #ifndef TEXXET case SREFL: case EREFL: #endif case PRE: case POST: case POSTPOST: dvi_fmt_error("%s:%d: draw_part: shouldn't happen: %s encountered", __FILE__, __LINE__, dvi_table2[ch - (FNTNUM0 + 64)]); break; default: dvi_fmt_error("%s:%d: draw_part: unknown op-code %d", __FILE__, __LINE__, ch); } /* end switch */ } /* end else (ch not a SETCHAR or FNTNUM) */ } /* end for */ } extern int waiting_for_anchor; static void warn_raw_postscript(void) { static int *pagelist = NULL; static int pagelist_size = 0; #ifdef PS if (!resource.hush_stdout) { if (total_pages >= pagelist_size) { pagelist_size = total_pages + 1; pagelist = xrealloc(pagelist, pagelist_size * sizeof *pagelist); memset(pagelist, 0, pagelist_size * sizeof *pagelist); } ASSERT(pagelist_size > current_page, "pagelist_size too small"); if (pagelist[current_page] == 0) { XDVI_WARNING((stderr, "Raw Postscript commands on page %d may be rendered incorrectly.", current_page + 1)); pagelist[current_page] = 1; } /* too likely to overdraw important information */ /* statusline_info(STATUS_MEDIUM, */ /* "Warning: Postscript commands on this page may not display correctly."); */ } #endif /* PS */ } void draw_page(void) { #if 0 volatile double save_gamma = 0.0; #endif /* 0 */ /* Check for changes in dvi file. */ if (dvi_file_changed()) { return; } if (globals.dvi_file.bak_fp == NULL) { return; } #ifdef PS have_raw_postscript = False; #endif #if COLOR color_bottom = &fg_initial; color_bot_size = 1; if (page_colors.stack != NULL && current_page > 0) { color_bottom = page_colors.stack[current_page - 1].colorstack; color_bot_size = page_colors.stack[current_page - 1].stacksize; } rcs_top = NULL; ASSERT(color_bot_size > 0, "color_bot_size mustn't become negative!"); ASSERT(color_bottom != NULL, "color_bottom mustn't become negative!"); set_fg_color(&color_bottom[color_bot_size - 1]); #endif /* COLOR */ #if !FIXED_FLUSHING_PAGING draw_border(-currwin.base_x, -currwin.base_y, ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 2, ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 2, globals.gc.high); #endif /* MOTIF */ if (resource.grid_mode > 0) { /* grid is wanted */ put_grid(-currwin.base_x, -currwin.base_y, /* ROUNDUP(globals.page.unshrunk_w, currwin.shrinkfactor) + 2, */ /* ROUNDUP(globals.page.unshrunk_h, currwin.shrinkfactor) + 2, */ ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 2, ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 2, ROUNDUP(globals.grid_paper_unit, currwin.shrinkfactor), globals.gc.high); } (void) lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(current_page), SEEK_SET); memset((char *)&currinf.data, '\0', sizeof currinf.data); currinf.tn_table_len = TNTABLELEN; currinf.tn_table = tn_table; currinf.tn_head = tn_head; currinf.pos = currinf.end = dvi_buffer; currinf.virtual = NULL; dvi_pointer_frame = &currinf; drawing_mag = (currwin.win == magnifier.win); psfig_begun = False; htex_initpage(False, False, current_page); if (currwin.win == mane.win) { XRectangle rect; rect.x = globals.win_expose.min_x; rect.y = globals.win_expose.min_y; rect.width = globals.win_expose.max_x - globals.win_expose.min_x; rect.height = globals.win_expose.max_y - globals.win_expose.min_y; /* fprintf(stderr, "clip: %d, %d, %d, %d\n", */ /* globals.win_expose.min_x, */ /* globals.win_expose.min_y, */ /* globals.win_expose.max_x - globals.win_expose.min_x, */ /* globals.win_expose.max_y - globals.win_expose.min_y); */ #define SET_CLIP(gc) if (gc != NULL) XSetClipRectangles(DISP, gc, 0, 0, &rect, 1, Unsorted) #define CLEAR_CLIP(gc) if (gc != NULL) XSetClipMask(DISP, gc, None) /* Set clip masks for all GC's */ SET_CLIP(globals.gc.fore); SET_CLIP(globals.gc.fore2); SET_CLIP(globals.gc.fore2_bak); SET_CLIP(globals.gc.fore2_bak1); SET_CLIP(globals.gc.rule); SET_CLIP(globals.gc.high); SET_CLIP(globals.gc.linkcolor); SET_CLIP(globals.gc.copy); } if (!setjmp(globals.ev.canit)) { /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BUG ALERT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ALL GLYPH DRAWING/RULE SETTING COMMANDS THAT MIGHT INVOKE longjmp(globals.ev.canit) MUST GO INSIDE THIS IF CASE, AND MUST NOT BE INVOKED FROM SOMEWHERE ELSE! Failure to check whether a command could (indirectly) invoke such a drawing routine (like e.g. put_rule()) will result in *really* strange bugs (see e.g. #616920, and probably also #471021). !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BUG ALERT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ /* generate an expose event */ if (search_have_match(current_page)) { search_erase_highlighting(False); } if (globals.curr_mode == TEXT_MODE_ACTIVE) { text_change_region(TEXT_SEL_ERASE, NULL); } draw_part(globals.dvi_file.bak_fp, current_frame = &frame0, dimconv); if (have_raw_postscript) { warn_raw_postscript(); } } else { /* If we were interrupted, put the expose event back, so that the * region gets redrawn. The if statement is necessary because the * magnifier may have been destroyed as part of the interrupt. */ if (currwin.win == mane.win || currwin.win == magnifier.win) { expose(currwin.win == mane.win ? &mane : &magnifier, globals.win_expose.min_x - currwin.base_x, globals.win_expose.min_y - currwin.base_y, globals.win_expose.max_x - globals.win_expose.min_x, globals.win_expose.max_y - globals.win_expose.min_y); } #ifdef PS psp.interrupt(); /* reset this flag too, just to make sure ... */ # if defined(PS_GS) && GS_PIXMAP_CLEARING_HACK had_ps_specials = False; # endif #endif globals.ev.flags &= ~EV_MAG_GONE; #if 0 if (search_have_match() && save_gamma != 0.0) { resource.gamma = save_gamma; do_color_change(); reset_fonts(); } #endif /* 0 */ } drawing_mag = False; dvi_pointer_frame = NULL; if (currwin.win == mane.win) { if (globals.src.fwd_box_page >= 0) { source_fwd_draw_box(); /* draw box showing found source line */ } htex_draw_anchormarkers(); } #ifdef PS psp.endpage(); #endif if (currwin.win == mane.win && resource.postscript != 1) { display_bboxes(); } if (search_have_match(current_page)) { /* highlight search match */ search_draw_inverted_regions(); } if (currwin.win == mane.win && (globals.curr_mode == TEXT_MODE_ACTIVE)) { /* highlight selection */ text_change_region(TEXT_SEL_REDRAW, NULL); } if (globals.curr_mode == RULER_MODE_ACTIVE) { redraw_ruler(); } clear_bboxes(); if (currwin.win == mane.win) { CLEAR_CLIP(globals.gc.fore); CLEAR_CLIP(globals.gc.fore2); CLEAR_CLIP(globals.gc.fore2_bak); CLEAR_CLIP(globals.gc.fore2_bak1); CLEAR_CLIP(globals.gc.rule); CLEAR_CLIP(globals.gc.high); CLEAR_CLIP(globals.gc.linkcolor); CLEAR_CLIP(globals.gc.copy); } #undef SET_CLIP #undef CLEAR_CLIP currwin.win = (Window) 0; } /* this sets the file-scope htex_anchor_type to the type of the anchor just scanned, which is used by the drawing routines to determine whether current position is inside an anchor. Called from special.c. */ void htex_do_special(const char *str, size_t len) { if (INSIDE_MANE_WIN) { htex_inside_href = htex_scan_anchor(str, len); } } /* * General dvi scanning routines. These are used for: * o source special lookups and * o finding the dimensions of links (if compiling with support for * hypertext specials). * This routine can be a bit slower than draw_page()/draw_part(), since * it is not run that often; that is why it is a separate routine in * spite of much duplication. * * Note that it does not use a separate copy of define_font(). */ /* * This set of routines can be called while draw_part() is active, * so the global variables must be separate. */ static struct frame geom_frame0; /* dummy head of list */ #ifdef TEXXET static struct frame *geom_scan_frame; /* head frame for scanning */ #endif static struct frame *geom_current_frame; static uint32_t get_unicode_char(wide_ubyte ch, struct drawinf currinf, char *retbuf) { /* attempt 1: if it's a Type1 font, get the Adobe character name from T1lib's T1_GetCharName */ if (currinf.set_char_p == set_t1_char) { int id = currinf.fontp->t1id; int t1libid = fontmaps[id].t1libid; char *char_name; ASSERT(t1libid != -1, "Font must have been loaded at this point!"); char_name = T1_GetCharName(t1libid, ch); TRACE_FIND_VERBOSE((stderr, "T1 char: %d = `%s' (id: %d; font: %s; enc: %d)", ch, char_name, currinf.fontp->t1id, fontmaps[currinf.fontp->t1id].texname, fontmaps[currinf.fontp->t1id].enc)); return adobe2unicode_name(char_name); } else { /* attempt 2: try to derive the encoding from the font name, by looking it up in a list of known font names. */ return guess_encoding(ch, currinf.fontp->fontname, retbuf); } } #define MAX_CHARS 16 /* maximum number of unicode characters that one do_char can produce (rounded up ...) */ static const size_t ALLOC_STEP = 1024; /* create a page break at BOP, unless we're at the start of the file */ static void do_newpage(struct scan_info *info) { struct word_info *w_info = (struct word_info *)info->data; if (w_info->curr_buf_idx > 0) { /* not at start of file */ /* resize buffer if needed */ while (w_info->curr_buf_idx + MAX_CHARS >= w_info->txt_buf_size) { w_info->txt_buf_size += ALLOC_STEP; w_info->txt_buf = xrealloc(w_info->txt_buf, w_info->txt_buf_size); } w_info->txt_buf[w_info->curr_buf_idx++] = '\n'; } } static void reset_bboxes(struct word_info *info) { size_t i; for (i = 0; i < info->bboxes_size; i++) { info->bboxes[i].ulx = INT_MAX; info->bboxes[i].uly = INT_MAX; info->bboxes[i].lrx = 0; info->bboxes[i].lry = 0; } } static void delete_last_bbox(struct word_info *info) { info->bboxes[info->bboxes_idx].ulx = INT_MAX; info->bboxes[info->bboxes_idx].uly = INT_MAX; info->bboxes[info->bboxes_idx].lrx = 0; info->bboxes[info->bboxes_idx].lry = 0; } static void finish_bbox(struct word_info *info) { /* if (info->bboxes_idx == 0) /\* nothing to do *\/ */ /* return; */ info->bboxes_idx++; while (info->bboxes_idx + 1 > info->bboxes_size) { /* re-allocate info */ info->bboxes_size += 32; info->bboxes = xrealloc(info->bboxes, info->bboxes_size * sizeof *(info->bboxes)); } info->bboxes[info->bboxes_idx].ulx = INT_MAX; info->bboxes[info->bboxes_idx].uly = INT_MAX; info->bboxes[info->bboxes_idx].lrx = 0; info->bboxes[info->bboxes_idx].lry = 0; #if 0 fprintf(stderr, "========= finish_bbox: index=%d, boxes:\n", info->bboxes_idx); { int i; for (i = 0; i < info->bboxes_idx; i++) { fprintf(stderr, "%d: x %d, y %d, w %d, h %d\n", i, info->bboxes[i].ulx, info->bboxes[i].uly, info->bboxes[i].lrx, info->bboxes[i].lry); } } #endif /* 0 */ } static void create_bbox(struct word_info *info, int x, int y, int w, int h) { #if 0 fprintf(stderr, "++++++++++++++ inside match: %d,%d,%d,%d!\n", x,y,w,h); XDrawRectangle(DISP, mane.win, globals.gc.high, x / (double)currwin.shrinkfactor + 0.5, y / (double)currwin.shrinkfactor + 0.5, w / (double)currwin.shrinkfactor + 0.5, h / (double)currwin.shrinkfactor + 0.5); #endif while (info->bboxes_idx + 1 > info->bboxes_size) { /* re-allocate info */ size_t old_size = info->bboxes_size; size_t i; info->bboxes_size += 32; info->bboxes = xrealloc(info->bboxes, info->bboxes_size * sizeof *(info->bboxes)); for (i = old_size; i < info->bboxes_size; i++) { info->bboxes[i].ulx = INT_MAX; info->bboxes[i].uly = INT_MAX; info->bboxes[i].lrx = 0; info->bboxes[i].lry = 0; } } /* adjust size of box */ if (x < info->bboxes[info->bboxes_idx].ulx) info->bboxes[info->bboxes_idx].ulx = x; if (y < info->bboxes[info->bboxes_idx].uly) info->bboxes[info->bboxes_idx].uly = y; if (x + w > info->bboxes[info->bboxes_idx].lrx) info->bboxes[info->bboxes_idx].lrx = x + w; if (y + h > info->bboxes[info->bboxes_idx].lry) info->bboxes[info->bboxes_idx].lry = y + h; #if 0 fprintf(stderr, "dimens: %d, %d, %d, %d\n", info->bboxes[info->bboxes_idx].ulx, info->bboxes[info->bboxes_idx].uly, info->bboxes[info->bboxes_idx].lrx, info->bboxes[info->bboxes_idx].lry); fprintf(stderr, "============ create_bbox: index=%d, boxes:\n", info->bboxes_idx); { int i; for (i = 0; i <= info->bboxes_idx; i++) { fprintf(stderr, "%d: x %d, y %d, w %d, h %d\n", i, info->bboxes[i].ulx, info->bboxes[i].uly, info->bboxes[i].lrx, info->bboxes[i].lry); } } #endif /* 0 */ } static void map_index_positions(const struct search_info *searchinfo, const struct page_mapping *page_mapping, int *from, int *to) { *from = searchinfo->from_pos; *to = searchinfo->to_pos; if (*from >= page_mapping[0].offset) { /* on second page of scan */ #if 0 fprintf(stderr, "current_page: %d, from: %d, to: %d; subtracting %d for pageinfo at index 0\n", current_page, *from, *to, page_mapping[0].offset); #endif /* 0 */ if (page_mapping[0].offset != -1) { ASSERT(page_mapping[0].offset != -1, "page_mapping not properly initialized?"); (*from) -= page_mapping[0].offset; (*to) -= page_mapping[0].offset; } ASSERT(*from >= 0, "index must be > 0"); ASSERT(*to >= 0, "index must be > 0"); } } /* decrement curr_buf_idx so that the previous character in info * (which might be a multi-byte character) is erased. */ static void erase_prev_char(struct word_info *info) { /* erase the hyphen, which might be a multibyte character */ if ((unsigned char)(info->txt_buf[info->curr_buf_idx - 1]) < 0x80) { /* single-byte */ TRACE_FIND_VERBOSE((stderr, "1 XXX: %d", (unsigned char)(info->txt_buf[info->curr_buf_idx - 1]))); info->txt_buf[--(info->curr_buf_idx)] = '\0'; } else { /* skip back over multi-byte sequence */ while ((unsigned char)(info->txt_buf[info->curr_buf_idx - 1]) >= 0x80 && (unsigned char)(info->txt_buf[info->curr_buf_idx - 1]) < 0xC0) { /* 10xxxxxx bytes */ TRACE_FIND_VERBOSE((stderr, "2 XXX: %d", (unsigned char)(info->txt_buf[info->curr_buf_idx - 1]))); info->txt_buf[--(info->curr_buf_idx)] = '\0'; } /* first byte (TODO: sanity check?) */ info->txt_buf[--(info->curr_buf_idx)] = '\0'; } } static Boolean inside_text_match(int curr_pos, int from, int to) { return from < curr_pos && curr_pos <= to; } static Boolean reinit_scan = False; void reinit_text_scan(void) { reinit_scan = True; } static Boolean inside_bbox(int x, int y, int w, int h, struct bbox *bboxes) { int mid_x, mid_y; #if 0 XDrawRectangle(DISP, mane.win, globals.gc.high, x / (double)currwin.shrinkfactor + 0.5, y / (double)currwin.shrinkfactor + 0.5, w / (double)currwin.shrinkfactor + 0.5, h / (double)currwin.shrinkfactor + 0.5); #endif /* already treat it as inside if there's an overlap of more than 50% */ mid_x = x + w / 2.0; mid_y = y + h / 2.0; #if 0 fprintf(stderr, "------- check:\n%d, %d\n%d, %d, %d, %d\n", mid_x, mid_y, bboxes->ulx, bboxes->uly, bboxes->lrx, bboxes->lry); #endif if (bboxes->ulx <= mid_x && bboxes->uly <= mid_y && bboxes->lrx >= mid_x && bboxes->lry >= mid_y) { #if 0 fprintf(stderr, "====== MATCH:\n%d, %d\n%d, %d, %d, %d\n", mid_x, mid_y, bboxes->ulx, bboxes->uly, bboxes->lrx, bboxes->lry); #endif return True; } return False; } static Boolean inside_bbox_line(int y, int h, struct bbox *bboxes) { int mid_y = y + h / 2.0; if (bboxes->uly <= mid_y && bboxes->lry >= mid_y) { #if 0 fprintf(stderr, "MATCH:\n%d, %d, %d, %d\n%d, %d, %d, %d\n", x, y, w, h, bboxes->ulx, bboxes->uly, bboxes->lrx, bboxes->lry); #endif return True; } return False; } static void do_char(wide_ubyte ch, struct drawinf currinf, struct scan_info *info, long pxl_v1, long pxl_v2, long x1, long x2, struct glyph *g) { struct word_info *w_info = (struct word_info *)info->data; struct search_settings *settings = NULL; const struct page_mapping *page_mapping = NULL; uint32_t u_glyph = 0, new_glyph = 0; float fsize = dvi_pt_conv(currinf.fontp->scale); /* font size in pt */ Boolean convert_to_lowercase = False; /* if set to true, ignore whitespace before/after character (for CJK characters) */ Boolean ignore_whitespace = False; /* default min space between words, in DVI units */ /* TODO: for T1 fonts, should we look at fontdimen2 / fontdimen4? (e.g. tfminfo[fontmaps[currinf.fontp->t1id].tfmidx].fontdimen2) */ long min_delta = (int)(1.5 * fsize + 0.5) << 16; size_t buf_offset = w_info->buffer_offset; size_t i; /* for delayed insertion of newlines in text selection mode */ static Boolean had_newline = False; /* for whitespace insertion in text selection mode */ static Boolean had_chars_in_line = False; static long last_dvi_h1 = 0, last_pxl_v = 0; static long last_dvi_h2 = 0; static long last_x = 0; static uint32_t last_u_glyph = 0; static int last_page = -1; static int page_bak = -1; const char *expanded_lig = NULL; const uint32_t UNKNOWN_GLYPH_CODE = 0x003F; /* question mark */ char retbuf[MAX_CHARS]; retbuf[0] = '\0'; if (w_info != NULL && w_info->settings != NULL) { settings = w_info->settings; if (!settings->case_sensitive) convert_to_lowercase = True; } if (w_info->bbox_pass) { ASSERT(w_info != NULL, ""); ASSERT(w_info->page_mapping != NULL, ""); page_mapping = w_info->page_mapping; } if (reinit_scan || last_page != current_page) { /* reinit */ last_dvi_h1 = last_pxl_v = last_dvi_h2 = last_x = 0; last_page = current_page; last_u_glyph = 0; w_info->bboxes_idx = 0; reset_bboxes(w_info); /* w_info->curr_buf_idx = 0; */ reinit_scan = False; had_newline = False; had_chars_in_line = False; } /* TRACE_FIND((stderr, "\n--------- POSITIONS: %ld, %ld, %ld, %ld", x1, pxl_v2, x2, y2)); */ if ((u_glyph = get_unicode_char(ch, currinf, retbuf)) == 0) { if (retbuf[0] == '\0') { TRACE_FIND((stderr, "unknown glyph `%lu'\n", (unsigned long)ch)); u_glyph = UNKNOWN_GLYPH_CODE; } else /* several characters in retbuf, will be evaluated later */ u_glyph = 0; } TRACE_FIND_VERBOSE((stderr, "UNICODE: 0x%.4X; idx: %ld", (unsigned int)u_glyph, (unsigned long)w_info->curr_buf_idx)); /* resize buffer if needed */ while (w_info->curr_buf_idx + MAX_CHARS >= w_info->txt_buf_size) { w_info->txt_buf_size += ALLOC_STEP; w_info->txt_buf = xrealloc(w_info->txt_buf, w_info->txt_buf_size); } /* Copy text into buffer, applying heuristics for special glyphs. A `\0' is always appended, so that we have a valid C string; if we have more text, this '\0' will be overwritten in the next call. */ /* apply accent/linebreak heuristics */ /* fprintf(stderr, "Checking: %ld > 0, %ld > 0\n", last_dvi_h1, last_pxl_v); */ if (last_dvi_h1 > 0 && last_pxl_v > 0) { /* had at least 1 character */ TRACE_FIND_VERBOSE((stderr, "++++ dvi_h: %ld, last_dvi_h1: %ld, w_info->curr_buf_idx: %ld", DVI_H, last_dvi_h1, (unsigned long)w_info->curr_buf_idx)); /* spaces after/before ideographic characters are ignored */ if (is_ideograph(last_u_glyph) || is_ideograph(u_glyph)) ignore_whitespace = true; /* first, check for linebreaks since accents are also triggered by negative hspace. * Usually, a linebreak is signalled by vertical movement down. However, in multicolumn * mode, it can also be a movement up, which we try to catch with the second condition. */ if (pxl_v2 > last_pxl_v + (int)(1.2 * fsize + 0.5) || (page_bak == current_page && pxl_v2 + (int)(6 * fsize + 0.5) < last_pxl_v)) { TRACE_FIND_VERBOSE((stderr, "linebreak (%ld > %ld + %d || %ld < %ld)!\n", pxl_v2, last_pxl_v, (int)(1.2 * fsize + 0.5), pxl_v2 + (int)(6 * fsize + 0.5), last_pxl_v)); /* remove hyphen followed by newline if ignore_hyphens option is set, and we're scanning for string search: */ if ((w_info->search_scan_pass || w_info->bbox_pass) && settings->ignore_hyphens && w_info->curr_buf_idx > 0 && is_hyphenchar(last_u_glyph)) { erase_prev_char(w_info); TRACE_FIND_VERBOSE((stderr, "%d > %d + %d? offset: %lu", settings->searchinfo->from_pos, (int)w_info->curr_buf_idx, settings->hyphen_delta, (unsigned long)buf_offset)); if (!w_info->bbox_pass && settings->searchinfo->from_pos > (int)(w_info->curr_buf_idx + buf_offset + settings->hyphen_delta)) { settings->hyphen_delta += 2; } TRACE_FIND((stderr, "erasing hyphen %lu at pos %lu with char %c; hyphen_delta is: %d", (unsigned long)last_u_glyph, (unsigned long)w_info->curr_buf_idx, ch, settings->hyphen_delta)); /* If the position of this hyphen had been at the start of the bounding box, this bounding box info is now invalid - delete it */ if (w_info->bbox_pass) { int from, to; map_index_positions(settings->searchinfo, page_mapping, &from, &to); if ((int)w_info->curr_buf_idx == from) { delete_last_bbox(w_info); } } } else { /* ignore_hyphens not set, insert newline */ /* Also save hyphen_delta, in case we need to update from_pos and to_pos if user switched from ignore hyphens to don't ignore hyphens */ if (w_info->search_scan_pass && !w_info->bbox_pass && is_hyphenchar(last_u_glyph) && settings->searchinfo->from_pos + settings->hyphen_delta >= (int)(w_info->curr_buf_idx + buf_offset)) { settings->hyphen_delta += 2; TRACE_FIND((stderr, "updating delta: %d at pos %d, curr_idx %d, offset: %lu", settings->hyphen_delta, settings->searchinfo->from_pos, (int)w_info->curr_buf_idx, (unsigned long)buf_offset)); } if (w_info->text_selection_pass) { if (inside_bbox(last_x, last_pxl_v, 5, 5, w_info->bboxes) || (inside_bbox_line(last_pxl_v, 5, w_info->bboxes))) { had_newline = True; had_chars_in_line = False; } } else if (w_info->search_scan_pass && settings->ignore_linebreaks && !ignore_whitespace) w_info->txt_buf[w_info->curr_buf_idx++] = ' '; else if (!ignore_whitespace) w_info->txt_buf[w_info->curr_buf_idx++] = '\n'; } if (w_info->bbox_pass) { int from, to; map_index_positions(settings->searchinfo, page_mapping, &from, &to); if (inside_text_match((int)w_info->curr_buf_idx, from, to)) { finish_bbox(w_info); } } } else if (w_info->curr_buf_idx > 0 && last_u_glyph != 0 && last_x > 0 && (!w_info->text_selection_pass || (w_info->text_selection_pass && inside_bbox(last_x, pxl_v2, x1 - last_x, pxl_v1 - pxl_v2, w_info->bboxes))) && x1 < last_x /* overlapping glyphs: check for diacritics */ && ((new_glyph = get_accented_glyph(last_u_glyph, u_glyph)) != 0)) { erase_prev_char(w_info); /* use new glyph for next writing operation: */ u_glyph = new_glyph; } else if (!ignore_whitespace && last_dvi_h2 > 0 && DVI_H > last_dvi_h2 + min_delta) { TRACE_FIND_VERBOSE((stderr, "space (%ld > %ld + %ld)!", DVI_H, last_dvi_h2, min_delta)); if (!w_info->text_selection_pass || (w_info->text_selection_pass && had_chars_in_line && inside_bbox(x1, pxl_v2, x2 - x1, g->bitmap.h, w_info->bboxes))) { w_info->txt_buf[w_info->curr_buf_idx++] = ' '; w_info->txt_buf[w_info->curr_buf_idx] = '\0'; if (w_info->bbox_pass) { int from, to; map_index_positions(settings->searchinfo, page_mapping, &from, &to); if (inside_text_match((int)w_info->curr_buf_idx, from, to)) { TRACE_FIND_VERBOSE((stderr, "bounding box for space: %ld, %ld, %ld, %ld", last_x, last_pxl_v, x1 - last_x, pxl_v1 - pxl_v2)); create_bbox(w_info, last_x, pxl_v2, x1 - last_x, pxl_v1 - pxl_v2); } } } } } last_page = current_page; if (retbuf[0] != '\0' || (expanded_lig = expand_ligature(u_glyph)) != NULL /* when in search pass, normalize more characters */ || ((w_info->bbox_pass || w_info->search_scan_pass) && (expanded_lig = search_normalize_chars(u_glyph)) != NULL)) { /* expanded ligature, which is always in 7-bit ASCII -> copy into buffer */ size_t len; if (retbuf[0] != '\0') expanded_lig = retbuf; len = strlen(expanded_lig); TRACE_FIND_VERBOSE((stderr, "I: %lu to %lu", (unsigned long)w_info->curr_buf_idx, (unsigned long)(w_info->curr_buf_idx + len))); if (!w_info->text_selection_pass || (w_info->text_selection_pass && inside_bbox(x1, pxl_v2, x2 - x1, g->bitmap.h, w_info->bboxes))) { /* fprintf(stderr, "inserting1 %s\n", expanded_lig); */ if (had_newline) { w_info->txt_buf[w_info->curr_buf_idx++] = '\n'; had_newline = False; } memcpy(w_info->txt_buf + w_info->curr_buf_idx, expanded_lig, len); had_chars_in_line = True; for (i = 0; i < len; i++) { w_info->curr_buf_idx++; /* fprintf(stderr, "setting index to: %d\n", w_info->curr_buf_idx); */ if (w_info->bbox_pass) { int from, to; map_index_positions(settings->searchinfo, page_mapping, &from, &to); if (inside_text_match((int)w_info->curr_buf_idx, from, to)) { create_bbox(w_info, x1, pxl_v2, x2 - x1, g->bitmap.h); } } } w_info->txt_buf[w_info->curr_buf_idx] = '\0'; } } else if (!w_info->text_selection_pass || (w_info->text_selection_pass && inside_bbox(x1, pxl_v2, x2 - x1, g->bitmap.h, w_info->bboxes))) { /* convert to utf8 */ char utf8_buf[MAX_CHARS]; /* ample ... */ size_t len; /* convert to utf8, eventually lowercasing */ ucs4_to_utf8(u_glyph, utf8_buf, &len, convert_to_lowercase); /* fprintf(stderr, "inserting2 %lu\n", u_glyph); */ if (had_newline) { w_info->txt_buf[w_info->curr_buf_idx++] = '\n'; had_newline = False; } memcpy(w_info->txt_buf + w_info->curr_buf_idx, utf8_buf, len); had_chars_in_line = True; for (i = 0; i < len; i++) { w_info->curr_buf_idx++; /* fprintf(stderr, "setting index2 to: %d\n", w_info->curr_buf_idx); */ if (w_info->bbox_pass) { int from, to; #if 0 int j; fprintf(stderr, "current page_mapping:\n"); for (j = 0; j <= total_pages; j++) { fprintf(stderr, "%d: %d\n", j, page_mapping[j]); } #endif /* 0 */ /* fprintf(stderr, "mapping!\n"); */ map_index_positions(settings->searchinfo, page_mapping, &from, &to); if (inside_text_match((int)w_info->curr_buf_idx, from, to)) { create_bbox(w_info, x1, pxl_v2, x2 - x1, g->bitmap.h); } } } w_info->txt_buf[w_info->curr_buf_idx] = '\0'; /* ensure termination */ } last_dvi_h1 = DVI_H; last_u_glyph = u_glyph; last_pxl_v = pxl_v1; last_dvi_h2 = DVI_H + currinf.fontp->glyph[ch].dvi_adv; last_x = x2; } /* handle a character in the text scanning routine */ long text_do_char(FILE *fp, struct scan_info *info, wide_ubyte ch) { if (currinf.set_char_p == set_no_char) { if (currinf.virtual == NULL || (currinf.fontp = currinf.virtual->first_font) == NULL) return 0; /* error; we'll catch it later */ maxchar = currinf.fontp->maxchar; currinf.set_char_p = currinf.fontp->set_char_p; } if (currinf.set_char_p == set_empty_char) return 0; /* error; we'll catch it later */ if (currinf.set_char_p == load_n_set_char) { if (globals.ev.flags & EV_GE_NEWDOC) /* if abort */ return 0; if (!load_font(currinf.fontp, resource.t1lib #if DELAYED_MKTEXPK , True #endif )) { /* if not found */ if (globals.ev.flags & EV_GE_NEWDOC) /* if abort */ return 0; /* FIXME: replace by GUI warning! */ fputs("geom_do_char: Character(s) will be left blank.\n", stderr); currinf.set_char_p = currinf.fontp->set_char_p = set_empty_char; return 0; } maxchar = currinf.fontp->maxchar; currinf.set_char_p = currinf.fontp->set_char_p; } if (currinf.set_char_p == set_char) { struct glyph *g; long x, y; if (ch > maxchar) return 0; /* catch the error later */ if ((g = &currinf.fontp->glyph[ch])->bitmap.bits == NULL) { if (g->addr == 0) return 0; /* catch the error later */ if (g->addr == -1) return 0; /* previously flagged missing char */ open_font_file(currinf.fontp); fseek(currinf.fontp->file, g->addr, SEEK_SET); (*currinf.fontp->read_char) (currinf.fontp, ch); if (globals.debug & DBG_BITMAP) print_char((ubyte) ch, g); currinf.fontp->timestamp = ++current_timestamp; } #ifdef TEXXET if (geom_scan_frame == NULL) { long dvi_h_sav = DVI_H; if (currinf.dir < 0) DVI_H -= g->dvi_adv; #endif x = G_PXL_H - g->x; y = PXL_V - g->y; do_char(ch, currinf, info, PXL_V, y, x, x + g->bitmap.w - 1, g); #ifdef TEXXET DVI_H = dvi_h_sav; } #endif return DIR * g->dvi_adv; } else if (currinf.set_char_p == set_vf_char) { struct macro *m; struct drawinf oldinfo; wide_ubyte oldmaxchar; #ifdef TEXXET long dvi_h_sav; #endif if (ch > maxchar) return 0; /* catch the error later */ if ((m = &currinf.fontp->macro[ch])->pos == NULL) return 0; /* catch the error later */ #ifdef TEXXET dvi_h_sav = DVI_H; if (currinf.dir < 0) DVI_H -= m->dvi_adv; if (geom_scan_frame == NULL) { #endif oldinfo = currinf; oldmaxchar = maxchar; WW = XX = YY = ZZ = 0; currinf.tn_table_len = VFTABLELEN; currinf.tn_table = currinf.fontp->vf_table; currinf.tn_head = currinf.fontp->vf_chain; currinf.pos = m->pos; currinf.end = m->end; currinf.virtual = currinf.fontp; geom_scan_part(text_do_char, fp, info, geom_current_frame, currinf.fontp->dimconv); currinf = oldinfo; maxchar = oldmaxchar; #ifdef TEXXET DVI_H = dvi_h_sav; } #endif return DIR * m->dvi_adv; } #ifdef T1LIB else if (currinf.set_char_p == set_t1_char) { struct glyph *g ; long x, y; t1FontLoadStatusT status; #ifdef TEXXET g = get_t1_glyph(0, ch, &status, True); if (status == FAILURE_BLANK) return 0; if (geom_scan_frame == NULL) { long dvi_h_sav = DVI_H; if (currinf.dir < 0) DVI_H -= g->dvi_adv; x = G_PXL_H - g->x; y = PXL_V - g->y; do_char(ch, currinf, info, PXL_V, y, x, x + g->bitmap.w - 1, g); DVI_H = dvi_h_sav; } #else g = get_t1_glyph(ch, &status, True); if (status == FAILURE_BLANK) return 0; x = G_PXL_H - g->x; y = PXL_V - g->y; do_char(ch, currinf, info, PXL_V, y, x, x + g->bitmap.w - 1, g); #endif return DIR * g->dvi_adv; } #endif /* T1LIB */ else { XDVI_FATAL((stderr, "currinf.set_char_p not a registered routine!")); } /* NOTREACHED */ return 0; } /* * Handle a character in geometric scanning routine. */ static long geom_do_char(FILE *fp, struct scan_info *info, wide_ubyte ch) { struct geom_info *g_info = info->data; if (currinf.set_char_p == set_no_char) { if (currinf.virtual == NULL || (currinf.fontp = currinf.virtual->first_font) == NULL) return 0; /* error; we'll catch it later */ maxchar = currinf.fontp->maxchar; currinf.set_char_p = currinf.fontp->set_char_p; } if (currinf.set_char_p == set_empty_char) return 0; /* error; we'll catch it later */ if (currinf.set_char_p == load_n_set_char) { if (globals.ev.flags & EV_GE_NEWDOC) /* if abort */ return 0; if (!load_font(currinf.fontp, resource.t1lib #if DELAYED_MKTEXPK , True #endif )) { /* if not found */ if (globals.ev.flags & EV_GE_NEWDOC) /* if abort */ return 0; /* FIXME: replace by GUI warning! */ fputs("geom_do_char: Character(s) will be left blank.\n", stderr); currinf.set_char_p = currinf.fontp->set_char_p = set_empty_char; return 0; } maxchar = currinf.fontp->maxchar; currinf.set_char_p = currinf.fontp->set_char_p; } if (currinf.set_char_p == set_char) { struct glyph *g; long x, y; if (ch > maxchar) return 0; /* catch the error later */ if ((g = &currinf.fontp->glyph[ch])->bitmap.bits == NULL) { if (g->addr == 0) return 0; /* catch the error later */ if (g->addr == -1) return 0; /* previously flagged missing char */ open_font_file(currinf.fontp); fseek(currinf.fontp->file, g->addr, SEEK_SET); (*currinf.fontp->read_char) (currinf.fontp, ch); if (globals.debug & DBG_BITMAP) print_char((ubyte) ch, g); currinf.fontp->timestamp = ++current_timestamp; } #ifdef TEXXET if (geom_scan_frame == NULL) { long dvi_h_sav = DVI_H; if (currinf.dir < 0) DVI_H -= g->dvi_adv; #endif x = G_PXL_H - g->x; y = PXL_V - g->y; g_info->geom_box(info, x, y, x + g->bitmap.w - 1, y + g->bitmap.h - 1); #ifdef TEXXET DVI_H = dvi_h_sav; } #endif return DIR * g->dvi_adv; } else if (currinf.set_char_p == set_vf_char) { struct macro *m; struct drawinf oldinfo; wide_ubyte oldmaxchar; #ifdef TEXXET long dvi_h_sav; #endif if (ch > maxchar) return 0; /* catch the error later */ if ((m = &currinf.fontp->macro[ch])->pos == NULL) return 0; /* catch the error later */ #ifdef TEXXET dvi_h_sav = DVI_H; if (currinf.dir < 0) DVI_H -= m->dvi_adv; if (geom_scan_frame == NULL) { #endif oldinfo = currinf; oldmaxchar = maxchar; WW = XX = YY = ZZ = 0; currinf.tn_table_len = VFTABLELEN; currinf.tn_table = currinf.fontp->vf_table; currinf.tn_head = currinf.fontp->vf_chain; currinf.pos = m->pos; currinf.end = m->end; currinf.virtual = currinf.fontp; geom_scan_part(geom_do_char, fp, info, geom_current_frame, currinf.fontp->dimconv); currinf = oldinfo; maxchar = oldmaxchar; #ifdef TEXXET DVI_H = dvi_h_sav; } #endif return DIR * m->dvi_adv; } #ifdef T1LIB else if (currinf.set_char_p == set_t1_char) { struct glyph *g ; long x, y; t1FontLoadStatusT status; #ifdef TEXXET g = get_t1_glyph(0, ch, &status, False); if (status == FAILURE_BLANK) return 0; if (geom_scan_frame == NULL) { long dvi_h_sav = DVI_H; if (currinf.dir < 0) DVI_H -= g->dvi_adv; x = G_PXL_H - g->x; y = PXL_V - g->y; g_info->geom_box(info, x, y, x + g->bitmap.w - 1, y + g->bitmap.h - 1); DVI_H = dvi_h_sav; } #else g = get_t1_glyph(ch, &status, False); if (status == FAILURE_BLANK) return 0; x = G_PXL_H - g->x; y = PXL_V - g->y; g_info->geom_box(info, x, y, x + g->bitmap.w - 1, y + g->bitmap.h - 1); #endif return DIR * g->dvi_adv; } #endif /* T1LIB */ else { XDVI_FATAL((stderr, "currinf.set_char_p not a registered routine!")); } /* NOTREACHED */ return 0; } /* * Do a rule in the geometry-scanning routine. */ static void geom_do_rule(struct scan_info *info, long h, long w) { long x, y; #ifdef TEXXET long dvi_h_save = DVI_H; #endif struct geom_info *g_info = info->data; #ifdef TEXXET if (currinf.dir < 0) DVI_H -= w - 1; #endif x = G_PXL_H; y = PXL_V; g_info->geom_box(info, x, y - xpixel_round(h) + 1, x + xpixel_round(w) - 1, y); #ifdef TEXXET DVI_H = dvi_h_save; #endif } /* * Geometric dvi scanner work routine. This does most of the work * (a) reading from a page, and (b) executing vf macros. */ void geom_scan_part(long(*char_proc)(FILE *, struct scan_info *, wide_ubyte), FILE *fp, struct scan_info *info, struct frame *minframe, double current_dimconv) { ubyte ch; #ifdef TEXXET struct drawinf oldinfo; wide_ubyte oldmaxchar = 0; off_t file_pos = 0; int refl_count = 0; #endif currinf.fontp = NULL; currinf.set_char_p = set_no_char; #ifdef TEXXET currinf.dir = 1; geom_scan_frame = NULL; /* indicates we're not scanning */ #endif for (;;) { ch = xone(fp); if (ch <= (ubyte)(SETCHAR0 + 127)) DVI_H += char_proc(fp, info, ch); else if (FNTNUM0 <= ch && ch <= (ubyte) (FNTNUM0 + 63)) { change_font((unsigned long)(ch - FNTNUM0)); } else { long a, b; switch (ch) { case SET1: case PUT1: a = char_proc(fp, info, xone(fp)); if (ch != PUT1) DVI_H += a; break; case SET2: case PUT2: if (!resource.omega) dvi_fmt_error("%s:%d: draw_part: op-code %d only works with the \"-omega\" option", __FILE__, __LINE__, ch); else { #ifdef TEXXET char_proc(fp, info, xnum(fp, 2)); #else a = char_proc(fp, info, xnum(fp, 2)); if (ch != PUT2) DVI_H += a; #endif } break; case SETRULE: /* Be careful, dvicopy outputs rules with height = 0x80000000. We don't want any SIGFPE here. */ a = xsfour(fp); b = xspell_conv(xsfour(fp)); if (a >= 0 && b >= 0 #ifdef TEXXET && geom_scan_frame == NULL #endif ) { /* is this a geom scan? */ if (info->geom_special != NULL) geom_do_rule(info, xspell_conv(a), b); } DVI_H += DIR * b; break; case PUTRULE: a = xspell_conv(xsfour(fp)); b = xspell_conv(xsfour(fp)); if (a >= 0 && b >= 0 #ifdef TEXXET && geom_scan_frame == NULL #endif ) { /* is this a geom scan? */ if (info->geom_special != NULL) geom_do_rule(info, a, b); } break; case NOP: break; case BOP: xskip(fp, (long)11 * 4); DVI_H = G_OFFSET_X; DVI_V = G_OFFSET_Y; PXL_V = xpixel_conv(DVI_V); WW = XX = YY = ZZ = 0; /* create pagebreak in character scan */ if (info->geom_special == NULL) { do_newpage(info); } break; case PUSH: if (geom_current_frame->next == NULL) { struct frame *newp = xmalloc(sizeof *newp); geom_current_frame->next = newp; newp->prev = geom_current_frame; newp->next = NULL; } geom_current_frame = geom_current_frame->next; geom_current_frame->data = currinf.data; break; case POP: if (geom_current_frame == minframe) dvi_fmt_error("more POPs than PUSHes"); currinf.data = geom_current_frame->data; geom_current_frame = geom_current_frame->prev; break; #ifdef TEXXET case SREFL: if (geom_scan_frame == NULL) { /* we're not scanning: save some info. */ oldinfo = currinf; oldmaxchar = maxchar; if (!currinf.virtual) file_pos = xtell(fp, currinf.pos); geom_scan_frame = geom_current_frame; /* start scanning */ refl_count = 0; break; } /* we are scanning */ if (geom_current_frame == geom_scan_frame) ++refl_count; break; case EREFL: if (geom_scan_frame != NULL) { /* if we're scanning */ if (geom_current_frame == geom_scan_frame && --refl_count < 0) { /* we've hit the end of our scan */ geom_scan_frame = NULL; /* first: push */ if (geom_current_frame->next == NULL) { struct frame *newp = xmalloc(sizeof *newp); geom_current_frame->next = newp; newp->prev = geom_current_frame; newp->next = NULL; } geom_current_frame = geom_current_frame->next; geom_current_frame->data = currinf.data; /* next: restore old file position, XX, etc. */ if (!currinf.virtual) { off_t bgn_pos = xtell(fp, G_dvi_buf_ptr); if (file_pos >= bgn_pos) { oldinfo.pos = dvi_buffer + (file_pos - bgn_pos); oldinfo.end = currinf.end; } else { (void)lseek(fileno(fp), file_pos, SEEK_SET); oldinfo.pos = oldinfo.end; } } currinf = oldinfo; maxchar = oldmaxchar; /* and then: recover position info. */ DVI_H = geom_current_frame->data.dvi_h; DVI_V = geom_current_frame->data.dvi_v; PXL_V = geom_current_frame->data.pxl_v; /* and finally, reverse direction */ currinf.dir = -currinf.dir; } break; } /* we're not scanning, */ /* so just reverse direction and then pop */ currinf.dir = -currinf.dir; currinf.data = geom_current_frame->data; geom_current_frame = geom_current_frame->prev; break; #endif /* TEXXET */ case RIGHT1: case RIGHT2: case RIGHT3: case RIGHT4: DVI_H += DIR * xspell_conv(xsnum(fp, ch - RIGHT1 + 1)); break; case W1: case W2: case W3: case W4: WW = xspell_conv(xsnum(fp, ch - W0)); case W0: DVI_H += DIR * WW; break; case X1: case X2: case X3: case X4: XX = xspell_conv(xsnum(fp, ch - X0)); case X0: DVI_H += DIR * XX; break; case DOWN1: case DOWN2: case DOWN3: case DOWN4: DVI_V += xspell_conv(xsnum(fp, ch - DOWN1 + 1)); PXL_V = xpixel_conv(DVI_V); break; case Y1: case Y2: case Y3: case Y4: YY = xspell_conv(xsnum(fp, ch - Y0)); case Y0: DVI_V += YY; PXL_V = xpixel_conv(DVI_V); break; case Z1: case Z2: case Z3: case Z4: ZZ = xspell_conv(xsnum(fp, ch - Z0)); case Z0: DVI_V += ZZ; PXL_V = xpixel_conv(DVI_V); break; case FNT1: case FNT2: case FNT3: case FNT4: change_font(xnum(fp, ch - FNT1 + 1)); break; case XXX1: case XXX2: case XXX3: case XXX4: a = xnum(fp, ch - XXX1 + 1); if (a > 0) { char *str = read_special(fp, a); /* is this a geom scan? */ if (info->geom_special != NULL) { /* process the bounding box */ geom_do_special(info, str, current_dimconv); /* process the specials we're looking for */ info->geom_special(info, str, a); } } break; case FNTDEF1: case FNTDEF2: case FNTDEF3: case FNTDEF4: xskip(fp, (long)(12 + ch - FNTDEF1 + 1)); a = (long)xone(fp); xskip(fp, a + (long)xone(fp)); break; #ifndef TEXXET case SREFL: case EREFL: #endif case PRE: case POST: case POSTPOST: case EOP: default: return; } /* end switch */ } /* end else (ch not a SETCHAR or FNTNUM) */ } /* end for */ } /* * Main scanning routine. */ void geom_scan(long(*char_proc)(FILE *, struct scan_info *, wide_ubyte), FILE *fp, struct scan_info *info, int pageno) { volatile off_t pos_save = 0; struct drawinf currinf_save; ubyte maxchar_save; #if PS if (info->geom_special != NULL && scanned_page < current_page) { fprintf(stderr, "shouldn't happen: %d >= %d!\n", scanned_page, current_page); return; /* should not happen */ } #endif if (dvi_pointer_frame != NULL) pos_save = lseek(fileno(fp), 0L, SEEK_CUR) - (dvi_pointer_frame->end - dvi_pointer_frame->pos); (void) lseek(fileno(fp), pageinfo_get_offset(pageno), SEEK_SET); currinf_save = currinf; maxchar_save = maxchar; memset((char *)&currinf.data, '\0', sizeof currinf.data); currinf.tn_table_len = TNTABLELEN; currinf.tn_table = tn_table; currinf.tn_head = tn_head; currinf.pos = currinf.end = dvi_buffer; currinf.virtual = NULL; if (!setjmp(info->done_env)) { geom_scan_part(char_proc, fp, info, geom_current_frame = &geom_frame0, dimconv); } maxchar = maxchar_save; currinf = currinf_save; if (dvi_pointer_frame != NULL) { (void)lseek(fileno(fp), pos_save, SEEK_SET); dvi_pointer_frame->pos = dvi_pointer_frame->end = dvi_buffer; } } /* * Routines for source special lookup */ struct src_spec_data { long x, y; /* coordinates we're looking for */ unsigned long distance; /* best distance so far */ Boolean recent_in_best; /* most recent string == XXX->best */ struct src_parsed_special best; /* best special so far */ struct src_parsed_special recent; /* most recent special */ }; void src_parse(const char *str, int str_len, struct src_parsed_special *parsed) { const char *p = str; if (*p >= '0' && *p <= '9') { parsed->line = atoi(p); do { ++p; str_len--; } while (*p >= '0' && *p <= '9'); } parsed->col = 0; if (*p == ':') { ++p; str_len--; parsed->col = atoi(p); while (*p >= '0' && *p <= '9') { ++p; str_len--; } } if (*p == ' ') { ++p; str_len--; } if (*p != '\0') { size_t len = str_len + 1; if (len > parsed->filename_len) { if (parsed->filename_len != 0) free(parsed->filename); parsed->filename_len = (len & -8) + 64; /* rounding? */ parsed->filename = xmalloc(parsed->filename_len); } memcpy(parsed->filename, p, len); } } static void src_spec_box(struct scan_info *info, long ulx, long uly, long lrx, long lry) { struct geom_info *g_info = (struct geom_info *)info->data; struct src_spec_data *data = g_info->geom_data; unsigned long distance; distance = 0; if (data->x < ulx) distance += (ulx - data->x) * (ulx - data->x); else if (data->x > lrx) distance += (data->x - lrx) * (data->x - lrx); if (data->y < uly) distance += (uly - data->y) * (uly - data->y); else if (data->y > lry) distance += (data->y - lry) * (data->y - lry); if (distance < data->distance) { data->distance = distance; /* Copy it over */ if (!data->recent_in_best) { data->best.line = data->recent.line; data->best.col = data->recent.col; if (data->recent.filename_len != 0) { if (data->best.filename_len < data->recent.filename_len) { if (data->best.filename_len != 0) free(data->best.filename); data->best.filename_len = data->recent.filename_len; data->best.filename = xmalloc(data->best.filename_len); } memcpy(data->best.filename, data->recent.filename, data->recent.filename_len); } data->recent_in_best = True; } /* Quit early if we've found our glyph. */ if (distance == 0 && data->best.filename_len != 0) { longjmp(info->done_env, 1); } } } static void src_spec_special(struct scan_info *info, const char *str, int str_len) { struct geom_info *g_info = (struct geom_info *)info->data; struct src_spec_data *data = g_info->geom_data; if (memcmp(str, "src:", 4) != 0) return; src_parse(str + 4, str_len - 4, &data->recent); /* * If this is the first special on the page, we may already have * spotted the nearest box. */ if (data->best.filename_len == 0) { data->best.line = data->recent.line; data->best.col = data->recent.col; if (data->recent.filename_len != 0) { if (data->best.filename_len < data->recent.filename_len) { if (data->best.filename_len != 0) free(data->best.filename); data->best.filename_len = data->recent.filename_len; data->best.filename = xmalloc(data->best.filename_len); } memcpy(data->best.filename, data->recent.filename, data->recent.filename_len); data->recent_in_best = True; } if (data->distance == 0) { longjmp(info->done_env, 1); } } else data->recent_in_best = False; } /* * Routines for reverse searches on other pages. */ static struct src_parsed_special found; /* static jmp_buf scan_env; */ static Boolean scan_first_src_spcl(char *str, int str_len, void *data) { UNUSED(data); if (memcmp(str, "src:", 4) != 0) return False; src_parse(str + 4, str_len - 4, &found); return True; } static Boolean scan_last_src_spcl(char *str, int str_len, void *data) { UNUSED(data); if (memcmp(str, "src:", 4) != 0) return False; src_parse(str + 4, str_len - 4, &found); return True; } static void src_spawn_editor(const struct src_parsed_special *parsed) { char *expanded_filename; char **argv; const char *p; char *q; int i; struct stat buf; /* first, determine the editor if necessary */ if (resource.editor == NULL || *resource.editor == '\0') { p = getenv("XEDITOR"); if (p != NULL) resource.editor = xstrdup(p); else { p = getenv("VISUAL"); if (p == NULL) { p = getenv("EDITOR"); if (p == NULL) { popup_message(globals.widgets.top_level, MSG_WARN, /* help text */ "Use the \"-editor\" command-line opion, the X resource " "\"xdvi.editor\" or one of the following environment variables " "to select the editor for source specials: " "\"XEDITOR\", \"VISUAL\" or \"EDITOR\".\n" "See the xdvi man page for more information on source specials " "and the editor options.", /* message */ "No custom editor set - using vi as default."); p = "vi"; } } q = xmalloc(strlen(p) + 10); memcpy(q, "xterm -e ", 9); strcpy(q + 9, p); resource.editor = q; } } /* now try to open the file; find_file allocates space for expanded_filename */ if ((expanded_filename = find_file(parsed->filename, &buf, kpse_tex_format)) == NULL) { popup_message(globals.widgets.top_level, MSG_ERR, NULL, "File \"%s\" not found, couldn't jump to special\n\"%s:%d\"\n", parsed->filename, parsed->filename, parsed->line); } else { TRACE_SRC((stderr, "source file \"%s\" expanded to \"%s\"\n", parsed->filename, expanded_filename)); if (buf.st_mtime > globals.dvi_file.time) { statusline_info(STATUS_FOREVER, "Warning: TeX file is newer than dvi file - " "source special information might be wrong."); } /* this allocates argv */ argv = src_format_arguments(get_separated_list(resource.editor, " \t", True), expanded_filename, parsed->line, parsed->col); fork_process(argv[0], False, NULL, NULL, NULL, argv); free(expanded_filename); for (i = 0; argv[i] != NULL; i++) free(argv[i]); free(argv); } } off_t save_file_status(FILE *fp, struct drawinf *currinf_save, ubyte *maxchar_save) { off_t pos_save = 0; if (dvi_pointer_frame != NULL) pos_save = lseek(fileno(fp), 0L, SEEK_CUR) - (dvi_pointer_frame->end - dvi_pointer_frame->pos); *currinf_save = currinf; *maxchar_save = maxchar; return pos_save; } void restore_file_status(FILE *fp, struct drawinf currinf_save, ubyte maxchar_save, off_t pos_save) { maxchar = maxchar_save; currinf = currinf_save; if (dvi_pointer_frame != NULL) { (void)lseek(fileno(fp), pos_save, SEEK_SET); dvi_pointer_frame->pos = dvi_pointer_frame->end = dvi_buffer; } } /* * The main routine for source specials (reverse search). */ void source_reverse_search(int x, int y, wide_bool call_editor) { struct scan_info info; struct geom_info g_info; struct src_spec_data data; struct src_parsed_special *foundp; info.geom_special = src_spec_special; g_info.geom_box = src_spec_box; g_info.geom_data = &data; info.data = &g_info; data.x = x; data.y = y; data.distance = 0xffffffff; data.recent_in_best = True; data.best.filename_len = data.recent.filename_len = 0; foundp = &data.best; geom_scan(geom_do_char, globals.dvi_file.bak_fp, &info, current_page); if (data.best.filename_len == 0) { /* * nothing found on current page; * scan next and previous pages with increasing offset */ volatile int upper, lower; volatile off_t pos_save; struct drawinf currinf_save; ubyte maxchar_save; /* Save file position */ pos_save = save_file_status(globals.dvi_file.bak_fp, &currinf_save, &maxchar_save); upper = lower = current_page; found.filename_len = 0; /* mark it as empty */ for (;;) { if (++upper < total_pages) { (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(upper), SEEK_SET); memset((char *)&currinf.data, '\0', sizeof currinf.data); currinf.tn_table_len = TNTABLELEN; currinf.tn_table = tn_table; currinf.tn_head = tn_head; currinf.pos = currinf.end = dvi_buffer; currinf.virtual = NULL; if (spcl_scan(scan_first_src_spcl, NULL, True, globals.dvi_file.bak_fp)) { lower = upper; break; } } else if (lower < 0) break; if (--lower >= 0) { (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(lower), SEEK_SET); memset((char *)&currinf.data, '\0', sizeof currinf.data); currinf.tn_table_len = TNTABLELEN; currinf.tn_table = tn_table; currinf.tn_head = tn_head; currinf.pos = currinf.end = dvi_buffer; currinf.virtual = NULL; (void)spcl_scan(scan_last_src_spcl, NULL, False, globals.dvi_file.bak_fp); if (found.filename_len != 0) break; } } if (found.filename_len != 0) statusline_info(STATUS_MEDIUM, "No source specials on this page - nearest on page %d", lower + globals.pageno_correct); else { /* nothing found at all; complain */ xdvi_bell(); popup_message(globals.widgets.top_level, MSG_ERR, /* helptext */ reverse_search_helptext, /* popup */ "No source specials in this DVI file - couldn't do reverse search."); } /* Restore file status. */ restore_file_status(globals.dvi_file.bak_fp, currinf_save, maxchar_save, pos_save); foundp = &found; } if (data.recent.filename_len != 0) free(data.recent.filename); if (foundp->filename_len != 0) { if (call_editor) { src_spawn_editor(foundp); } else { statusline_info(STATUS_MEDIUM, "nearest special at (%d,%d): \"%s:%d\"", x / currwin.shrinkfactor, y / currwin.shrinkfactor, foundp->filename, foundp->line); } free(foundp->filename); } } /* * Debug routines for source special display (highlight the first box * after each source special, or highlight each box). */ struct src_spec_show_data { Boolean do_this_one; /* flag set after source special */ Boolean do_them_all; /* flag to reset the above to */ }; static void src_spec_show_box(struct scan_info *info, long ulx, long uly, long lrx, long lry) { struct geom_info *g_info = (struct geom_info *)info->data; struct src_spec_show_data *data = g_info->geom_data; if (data->do_this_one) { long x = ulx / mane.shrinkfactor; long y = uly / mane.shrinkfactor; XDrawRectangle(DISP, mane.win, globals.gc.high, x - mane_base_x, y - mane_base_y, lrx / mane.shrinkfactor - x, lry / mane.shrinkfactor - y); data->do_this_one = data->do_them_all; } } static void src_spec_show_special(struct scan_info *info, const char *str, int str_len) { /* if (memcmp(str, "src:", 4) != 0) */ /* return; */ struct geom_info *g_info = (struct geom_info *)info->data; UNUSED(str_len); XDVI_INFO((stdout, "special: %s", str)); ((struct src_spec_show_data *)g_info->geom_data)->do_this_one = True; } void source_special_show(wide_bool do_them_all) { struct scan_info info; struct geom_info g_info; struct src_spec_show_data src_data; info.geom_special = src_spec_show_special; g_info.geom_box = src_spec_show_box; g_info.geom_data = &src_data; info.data = &g_info; src_data.do_this_one = src_data.do_them_all = do_them_all; geom_scan(geom_do_char, globals.dvi_file.bak_fp, &info, current_page); } /* * Routines for forward search (look up a source line). * * The general procedure is: * (1) Use spcl_scan() to find the page containing the line (or at * least the closest line). This could be optimized further. * (2) Use geom_scan_part() to find the exact location of the source * special, and the box to highlight. */ /* These variables are referenced by src_scan_special(). */ static int src_this_line; static Boolean src_this_file_equal; static int src_line; static int src_col; static const char *src_file; static int src_page; /* static jmp_buf src_env; */ static Boolean found_src; static unsigned long best_distance; static unsigned long best_col_dist; static int best_line; static int best_page; static off_t best_offset; static off_t max_offset; /* Some of the above, plus these below, are used by geom_scan_part(). */ static Boolean src_fwd_active; #define BBOX_INFO_MAXIDX 8 /* maximum number of bounding boxes */ /* list of bounding boxes */ struct bbox_info { long min_x, max_x, min_y, max_y; long spcl_min_x, spcl_max_x, spcl_min_y, spcl_max_y; } g_bbox_info[BBOX_INFO_MAXIDX]; /* current index in g_bbox_info[] */ static size_t bbox_info_idx = 0; static Boolean src_scan_special(char *str, int str_len, void *data) { char *p; int col = 0; unsigned long distance; unsigned long col_dist; UNUSED(data); if (memcmp(str, "src:", 4) != 0) return False; found_src = True; p = str + 4; str_len -= 4; if (*p >= '0' && *p <= '9') { src_this_line = atoi(p); do { ++p; str_len--; } while (*p >= '0' && *p <= '9'); } if (*p == ':') { ++p; str_len--; col = atoi(p); while (*p >= '0' && *p <= '9') { ++p; str_len--; } } if (*p == ' ') { ++p; str_len--; } /* src specials might omit the file name when it had already been specified on the page; so skip the test when the special ends right here: */ if (*p != '\0') { ASSERT(globals.dvi_file.dirname != NULL, "DVI name should be set here"); src_this_file_equal = src_compare(p, str_len, src_file, globals.dvi_file.dirname, globals.dvi_file.dirlen); } if (!src_this_file_equal) return False; distance = (src_line > src_this_line ? src_line - src_this_line : 2 * (src_this_line - src_line)); /* favor earlier lines */ if (distance < best_distance) { /* found a better line */ best_distance = distance; best_line = src_this_line; best_page = src_page; max_offset = best_offset = xtell(globals.dvi_file.bak_fp, currinf.pos); } else if (distance == best_distance) { /* still on a good line, remember diff */ max_offset = xtell(globals.dvi_file.bak_fp, currinf.pos); } if (distance == 0 && best_distance == 0) { /* found a better col */ col_dist = (src_col > col ? src_col - col : 2 * (col - src_col)); if (col_dist < best_col_dist) { best_col_dist = col_dist; best_page = src_page; max_offset = best_offset = xtell(globals.dvi_file.bak_fp, currinf.pos); } else if (col_dist == best_col_dist) { max_offset = xtell(globals.dvi_file.bak_fp, currinf.pos); } } return True; } static Boolean htex_scan_special(char *str, int str_len, void *data) { UNUSED(data); if (g_anchor_pos == NULL) return False; /* first, hypertex specials */ if (memicmp(str, "html:", strlen("html:")) == 0) { size_t offset = strlen("html:"); str += offset; str_len -= offset; while (*str == ' ' || *str == '\t') { str++; str_len--; } if (memicmp(str, " */ /* skip over spaces, = and open quotes */ while (*str == ' ' || *str == '=') { str++; str_len--; } if (*str == '"') { str++; str_len -= 2; /* don't compare closing quote */ } /* fprintf(stderr, "comparing: |%s|%s|%d\n", str, g_anchor_pos, MAX((size_t)str_len, g_anchor_len)); */ if (memcmp(str, g_anchor_pos, MAX((size_t)str_len, g_anchor_len)) == 0) return True; else return False; } /* then, hdvips specials */ else if (memicmp(str, "ps:", 3) == 0 && g_anchor_pos != NULL) { str += 3; if (memicmp(str, "sdict begin ", strlen("sdict begin ")) == 0) { char *ptr = NULL, *pptr = NULL; str += strlen("sdict begin "); if ((ptr = strstr(str, "/View")) != NULL && (ptr = strchr(ptr, '(')) != NULL && (pptr = strchr(ptr + 1, ')')) != NULL) { if (memcmp(ptr + 1, g_anchor_pos, pptr - ptr - 1) == 0 && g_anchor_pos[pptr - ptr - 1] == '\0') { return True; } } } return False; } else { return False; } } static void htex_scan_special_noreturn(struct scan_info *info, const char *str, int str_len) { struct geom_info *g_info = (struct geom_info *)info->data; /* first, hypertex specials */ if (memcmp(str, "html:", strlen("html:")) == 0) { size_t offset = strlen("html:"); str += offset; str_len -= offset; while (*str == ' ' || *str == '\t') { str++; str_len--; } if (memicmp(str, " */ /* skip over spaces, = and open quotes */ while (*str == ' ' || *str == '=') { str++; str_len--; } if (*str == '"') { str++; str_len -= 2; /* don't compare closing quote */ } if (g_anchor_pos != NULL && memcmp(str, g_anchor_pos, MAX((size_t)str_len, g_anchor_len)) == 0) { *((int *)g_info->geom_data) = pixel_conv(DVI_V); longjmp(info->done_env, 1); } } /* then, hdvips specials */ else if (memicmp(str, "ps:", 3) == 0 && g_anchor_pos != NULL) { str += 3; if (memicmp(str, "sdict begin ", strlen("sdict begin ")) == 0) { char *ptr = NULL, *pptr = NULL; str += strlen("sdict begin "); if ((ptr = strstr(str, "/View")) != NULL && (ptr = strchr(ptr, '(')) != NULL && (pptr = strchr(ptr + 1, ')')) != NULL) { if (memcmp(ptr + 1, g_anchor_pos, pptr - ptr - 1) == 0 && g_anchor_pos[pptr - ptr - 1] == '\0') { *((int *)g_info->geom_data) = pixel_conv(DVI_V); longjmp(info->done_env, 1); } } } } } static void src_spec_fwd_box(struct scan_info *info, long ulx, long uly, long lrx, long lry) { /* Heuristic value to detect column breaks: A negative vertical offset to the next glyph larger than BBOX_OFF will create a new bounding box. The amount is in unshrunken pixels, i.e. 120 \approx 1 Line of 12pt Text. */ static const int BBOX_OFF = 360; UNUSED(info); if (src_fwd_active) { /* probably a column break, create new box */ if (lry < g_bbox_info[bbox_info_idx].max_y - BBOX_OFF && lrx > g_bbox_info[bbox_info_idx].max_x + 50) { if (bbox_info_idx < BBOX_INFO_MAXIDX - 1) { bbox_info_idx++; g_bbox_info[bbox_info_idx].min_y = g_bbox_info[bbox_info_idx].min_x = LONG_MAX; g_bbox_info[bbox_info_idx].max_x = g_bbox_info[bbox_info_idx].max_y = 0; } } if (ulx < g_bbox_info[bbox_info_idx].min_x) { g_bbox_info[bbox_info_idx].min_x = ulx; } if (uly < g_bbox_info[bbox_info_idx].min_y) { g_bbox_info[bbox_info_idx].min_y = uly; } if (lrx > g_bbox_info[bbox_info_idx].max_x) g_bbox_info[bbox_info_idx].max_x = lrx; if (lry > g_bbox_info[bbox_info_idx].max_y) { g_bbox_info[bbox_info_idx].max_y = lry; } } } /* dummy procedure for hyperlinks; we don't need geometry info for these. */ static void htex_dummy_box(struct scan_info *info, long ulx, long uly, long lrx, long lry) { UNUSED(info); UNUSED(ulx); UNUSED(uly); UNUSED(lrx); UNUSED(lry); return; } static void src_spec_fwd_special(struct scan_info *info, const char *str, int str_len) { long pos; UNUSED(str_len); if (memcmp(str, "src:", 4) != 0) /* if no source special */ return; pos = xtell(globals.dvi_file.bak_fp, currinf.pos); if (pos >= best_offset) src_fwd_active = True; if (src_fwd_active) { if (pos > max_offset) longjmp(info->done_env, 1); if (G_PXL_H < g_bbox_info[bbox_info_idx].spcl_min_x) g_bbox_info[bbox_info_idx].spcl_min_x = G_PXL_H; if (G_PXL_H > g_bbox_info[bbox_info_idx].spcl_max_x) g_bbox_info[bbox_info_idx].spcl_max_x = G_PXL_H; if (PXL_V < g_bbox_info[bbox_info_idx].spcl_min_y) g_bbox_info[bbox_info_idx].spcl_min_y = PXL_V; if (PXL_V > g_bbox_info[bbox_info_idx].spcl_max_y) g_bbox_info[bbox_info_idx].spcl_max_y = PXL_V; } } /* * Routine to actually draw the box. */ static void source_fwd_draw_box(void) { if (globals.src.fwd_box_page != current_page) { globals.src.fwd_box_page = -1; /* different page---clear it */ } else { size_t i; static const int padding = 15; /* fix oversplitting by heuristics, by merging box n with box n+1 if they overlap */ for (i = 0; i < bbox_info_idx; i++) { if (g_bbox_info[i].min_x == LONG_MAX) continue; if ((g_bbox_info[i+1].min_x < g_bbox_info[i].max_x && g_bbox_info[i+1].min_y < g_bbox_info[i].max_y) || (g_bbox_info[i].min_x < g_bbox_info[i+1].max_x && g_bbox_info[i].min_y < g_bbox_info[i+1].max_y)) { /* overlap */ g_bbox_info[i].min_x = MIN(g_bbox_info[i].min_x, g_bbox_info[i+1].min_x); g_bbox_info[i].min_y = MIN(g_bbox_info[i].min_y, g_bbox_info[i+1].min_y); g_bbox_info[i].max_x = MAX(g_bbox_info[i].max_x, g_bbox_info[i+1].max_x); g_bbox_info[i].max_y = MAX(g_bbox_info[i].max_y, g_bbox_info[i+1].max_y); bbox_info_idx--; } } for (i = 0; i <= bbox_info_idx; i++) { int min_x, min_y, max_x, max_y; volatile XPoint ul, ur, ll, lr; if (g_bbox_info[i].min_x == LONG_MAX) { /* If no glyphs or rules, use hot point of special instead. */ g_bbox_info[i].min_x = g_bbox_info[i].spcl_min_x; g_bbox_info[i].min_y = g_bbox_info[i].spcl_min_y; g_bbox_info[i].max_x = g_bbox_info[i].spcl_max_x; g_bbox_info[i].max_y = g_bbox_info[i].spcl_max_y; } min_x = (g_bbox_info[i].min_x - padding) / mane.shrinkfactor - mane_base_x; min_y = (g_bbox_info[i].min_y - padding) / mane.shrinkfactor - mane_base_y; max_x = (g_bbox_info[i].max_x + padding) / mane.shrinkfactor - mane_base_x; max_y = (g_bbox_info[i].max_y + padding) / mane.shrinkfactor - mane_base_y; ul.x = min_x; ul.y = min_y; ur.x = max_x; ur.y = min_y; ll.x = min_x; ll.y = max_y; lr.x = max_x; lr.y = max_y; if (i == 0 && bbox_info_idx == 0) { /* only 1 bounding box */ XDrawRectangle(DISP, mane.win, globals.gc.high, min_x, min_y, max_x - min_x, max_y - min_y); } else if (i == 0) { /* draw first bbox with open bottom */ XPoint points[4]; points[0] = ll; points[1] = ul; points[2] = ur; points[3] = lr; XDrawLines(DISP, mane.win, globals.gc.high, points, 4, CoordModeOrigin); } else if (i > 0 && i < bbox_info_idx) { /* draw middle box with open top and open bottom */ XPoint points[2]; points[0] = ul; points[1] = ll; XDrawLines(DISP, mane.win, globals.gc.high, points, 2, CoordModeOrigin); points[0] = ur; points[1] = lr; XDrawLines(DISP, mane.win, globals.gc.high, points, 2, CoordModeOrigin); } else { /* draw last box with open top */ XPoint points[4]; points[0] = ul; points[1] = ll; points[2] = lr; points[3] = ur; XDrawLines(DISP, mane.win, globals.gc.high, points, 4, CoordModeOrigin); } } } } #if 0 #include unsigned long time_start=0, time_end=0; #endif void source_forward_search(const char *str) { volatile off_t pos_save = 0; struct drawinf currinf_save; ubyte maxchar_save; struct scan_info info; struct geom_info g_info; TRACE_CLIENT((stderr, "Entering source_forward_search(%s)", str)); max_offset = 0; src_file = str; while (*src_file == '0') ++src_file; if (*src_file < '1' || *src_file > '9') { XDVI_WARNING((stderr, "Ignoring malformed source special \"%s\"", str)); return; } src_line = atoi(src_file); while (*src_file >= '0' && *src_file <= '9') ++src_file; src_col = 0; if (*src_file == ':') { ++src_file; src_col = atoi(src_file); while (*src_file >= '0' && *src_file <= '9') ++src_file; } if (*src_file == ' ') ++src_file; TRACE_CLIENT((stderr, "File = \"%s\", line = %d, col = %d", src_file, src_line, src_col)); /* Save status of dvi_file reading (in case we hit an error and resume drawing). */ if (dvi_pointer_frame != NULL) pos_save = lseek(fileno(globals.dvi_file.bak_fp), 0L, SEEK_CUR) - (dvi_pointer_frame->end - dvi_pointer_frame->pos); (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(0), SEEK_SET); currinf_save = currinf; maxchar_save = maxchar; memset((char *)&currinf.data, '\0', sizeof currinf.data); currinf.tn_table_len = TNTABLELEN; currinf.tn_table = tn_table; currinf.tn_head = tn_head; currinf.pos = currinf.end = dvi_buffer; currinf.virtual = NULL; /* Start search over pages */ #if 0 rdtscl(time_start); #endif found_src = False; best_distance = best_col_dist = ULONG_MAX; src_this_line = 0; /* initialize things that are kept as defaults */ src_this_file_equal = False; /* These two lines do the actual scanning (first pass). */ for (src_page = 0; src_page < total_pages; ++src_page) (void)spcl_scan(src_scan_special, NULL, False, globals.dvi_file.bak_fp); if (best_distance == ULONG_MAX) { if (!found_src) { popup_message(globals.widgets.top_level, MSG_WARN, /* helptext */ reverse_search_helptext, /* popup */ "No source specials in this DVI file - couldn't do reverse search."); } else { popup_message(globals.widgets.top_level, MSG_WARN, /* helptext */ "To enable reverse search, the TeX file has to be compiled with source specials. " "See the xdvi man page (section SOURCE SPECIALS) for details.", /* popup */ "No references to source file \"%s\" in DVI file.", src_file); } /* Restore file position. */ maxchar = maxchar_save; currinf = currinf_save; if (dvi_pointer_frame != NULL) { (void)lseek(fileno(globals.dvi_file.bak_fp), pos_save, SEEK_SET); dvi_pointer_frame->pos = dvi_pointer_frame->end = dvi_buffer; } return; } TRACE_CLIENT((stderr, "Match: line %d on page %d, offset %lu", best_line, best_page + globals.pageno_correct, (unsigned long)best_offset)); /* * In this case we don't need to restore maxchar and currinf, since * we won't resume drawing -- we'll jump to a new page instead. */ /* Move to that page. */ goto_page(best_page, resource.keep_flag ? NULL : home, False); page_history_insert(best_page); globals.ev.flags |= EV_NEWPAGE; /* so that existing mark gets erased */ /* Now search that particular page. */ info.geom_special = src_spec_fwd_special; g_info.geom_box = src_spec_fwd_box; g_info.geom_data = NULL; src_fwd_active = False; bbox_info_idx = 0; g_bbox_info[bbox_info_idx].min_x = g_bbox_info[bbox_info_idx].min_y = g_bbox_info[bbox_info_idx].spcl_min_x = g_bbox_info[bbox_info_idx].spcl_min_y = LONG_MAX; g_bbox_info[bbox_info_idx].max_x = g_bbox_info[bbox_info_idx].max_y = g_bbox_info[bbox_info_idx].spcl_max_x = g_bbox_info[bbox_info_idx].spcl_max_y = 0; globals.src.fwd_box_page = -1; /* in case of error, suppress box */ (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(best_page), SEEK_SET); currinf.tn_table_len = TNTABLELEN; currinf.tn_table = tn_table; currinf.tn_head = tn_head; currinf.pos = currinf.end = dvi_buffer; currinf.virtual = NULL; info.data = &g_info; if (!setjmp(info.done_env)) geom_scan_part(geom_do_char, globals.dvi_file.bak_fp, &info, geom_current_frame = &geom_frame0, dimconv); if (!src_fwd_active) { XDVI_ERROR((stderr, "%s:%d: shouldn't happen: geom_scan_part() failed to re-find the special.", __FILE__, __LINE__)); } else { long x_min = g_bbox_info[bbox_info_idx].min_x; long y_min = g_bbox_info[bbox_info_idx].min_y; long x_max = g_bbox_info[bbox_info_idx].max_x; long y_max = g_bbox_info[bbox_info_idx].max_y; do_autoscroll = True; globals.src.fwd_box_page = current_page; if (x_min == LONG_MAX || x_max == LONG_MAX) { /* If no glyphs or rules, use hot point of special instead. */ x_min = g_bbox_info[bbox_info_idx].spcl_min_x; y_min = g_bbox_info[bbox_info_idx].spcl_min_y; x_max = g_bbox_info[bbox_info_idx].spcl_max_x; y_max = g_bbox_info[bbox_info_idx].spcl_max_y; } scroll_page_if_needed((int)(x_min / currwin.shrinkfactor) + 2, (int)(x_max / currwin.shrinkfactor) - 2, (int)(y_min / currwin.shrinkfactor) + 10, (int)(y_max / currwin.shrinkfactor) - 10); } #if 0 rdtscl(time_end); printf("time search: %lu\n", time_end - time_start); #endif } void anchor_search(const char *str) { off_t pos_save = 0; struct drawinf currinf_save; ubyte maxchar_save; volatile int test_page = 0; Boolean found_anchor = False; int y_pos = -1; struct scan_info info; struct geom_info g_info; ASSERT(str != NULL, "Argument to anchor_search() musn't be NULL"); TRACE_HTEX((stderr, "Entering anchor_search(%s)", str)); /* Save status of dvi_file reading (in case we hit an error and resume drawing). */ if (dvi_pointer_frame != NULL) pos_save = lseek(fileno(globals.dvi_file.bak_fp), 0L, SEEK_CUR) - (dvi_pointer_frame->end - dvi_pointer_frame->pos); (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(0), SEEK_SET); currinf_save = currinf; maxchar_save = maxchar; memset((char *)&currinf.data, '\0', sizeof currinf.data); currinf.tn_table_len = TNTABLELEN; currinf.tn_table = tn_table; currinf.tn_head = tn_head; currinf.pos = currinf.end = dvi_buffer; currinf.virtual = NULL; /* Start search over pages */ for (test_page = 0; test_page < total_pages; test_page++) { if (spcl_scan(htex_scan_special, NULL, True, globals.dvi_file.bak_fp)) { TRACE_HTEX((stderr, "Found anchor on page %d", test_page)); found_anchor = True; break; } } if (!found_anchor) { TRACE_HTEX((stderr, "Anchor not found")); /* Restore file position. */ maxchar = maxchar_save; currinf = currinf_save; if (dvi_pointer_frame != NULL) { (void)lseek(fileno(globals.dvi_file.bak_fp), pos_save, SEEK_SET); dvi_pointer_frame->pos = dvi_pointer_frame->end = dvi_buffer; } xdvi_bell(); statusline_error(STATUS_MEDIUM, "Error: Anchor \"%s\" not found.", str); return; } /* * In this case we don't need to restore maxchar and currinf, since * we won't resume drawing -- we'll jump to a new page instead. */ /* Move to that page. */ (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(test_page), SEEK_SET); currinf.tn_table_len = TNTABLELEN; currinf.tn_table = tn_table; currinf.tn_head = tn_head; currinf.pos = currinf.end = dvi_buffer; currinf.virtual = NULL; info.geom_special = htex_scan_special_noreturn; g_info.geom_box = htex_dummy_box; g_info.geom_data = &y_pos; info.data = &g_info; if (!setjmp(info.done_env)) geom_scan_part(geom_do_char, globals.dvi_file.bak_fp, &info, geom_current_frame = &geom_frame0, dimconv); if (y_pos == -1) { /* not found */ XDVI_ERROR((stderr, "%s:%d: shouldn't happen: geom_scan_part() failed to re-find the link.", __FILE__, __LINE__)); } else { goto_page(test_page, resource.keep_flag ? NULL : home, False); page_history_insert(test_page); do_autoscroll = True; TRACE_HTEX((stderr, "Found anchor on position %d", y_pos)); htex_set_anchormarker(y_pos); } /* reset info */ free(g_anchor_pos); g_anchor_pos = NULL; g_anchor_len = 0; } #ifdef T1LIB /* ********************** FONT AND ENCODING LOADING ******************** */ static char ** load_vector(const char *enc) { char *filename; TRACE_T1((stderr, "loading vector: |%s|", enc)); /* * With TDS 1.0/kpathsea 3.5.2(?), encoding files are in texmf/fonts/enc and accessed * via kpse_enc_format; see e.g.: * http://tug.org/mailman/htdig/tex-live/2004-January/004734.html * * The lookups under kpse_program_text_format and kpse_tex_ps_header_format * are kept for backwards compatibility. */ do { filename = kpse_find_file(enc, kpse_enc_format, 0); if (filename != NULL) break; filename = kpse_find_file(enc, kpse_program_text_format, 0); if (filename != NULL) break; /* If that fails we try the standard place: postscript headers */ filename = kpse_find_file(enc, kpse_tex_ps_header_format, 1); } while (0); if (filename != NULL) { return T1_LoadEncoding(filename); } return NULL; } static int add_tfm(const char *texname) { /* Load font metrics if not already loaded. Return index into fontmetrics array. If it fails, fallback metrics must be loaded instead; if that fails as well, exit. */ size_t i; int idx; static size_t wlidx = 0; static size_t wlidx_max = 0; static const size_t wlidx_step = 1024; #ifdef USE_HASH if (tfminfo_hash.size == 0) tfminfo_hash = hash_create(T1FONTS_INITIAL_HASHTABLE_SIZE); if (find_str_int_hash(&tfminfo_hash, texname, &i)) { return i; } #else for (i = 0; i <= wlidx; i++) if (strcmp(tfminfo[i].texname, texname) == 0) return i; #endif /* USE_HASH */ while (wlidx >= wlidx_max) { wlidx_max += wlidx_step; tfminfo = xrealloc(tfminfo, wlidx_max * sizeof *tfminfo); } tfminfo[wlidx].texname = texname; #ifdef USE_HASH put_str_int_hash(&tfminfo_hash, tfminfo[wlidx].texname, wlidx); #endif /* USE_HASH */ if (!tfmload(texname, &tfminfo[wlidx].designsize, tfminfo[wlidx].widths, &(tfminfo[wlidx].fontdimen2))) { XDVI_FATAL((stderr, "Cannot find font metrics file %s.tfm, " "and fallback metrics cmr10.tfm is missing as well - exiting.\n", texname)); } idx = wlidx++; if (fallbacktfm == 1) { fallbacktfm = 2; popup_message(globals.widgets.top_level, MSG_ERR, /* helptext */ "A font metrics file is missing and cmr10.tfm is used instead. Either " "you don't have the file, or your TeX system cannot find it. Try to " "invoke \"kpsewhich\" with the filename mentioned in the error " "message and the \"-debug 2\" option to find out where Xdvik is " "searching for your files.\n" "To enable automatic creation of .tfm files for " "Metafont fonts, " /* FIXME: how about Type1 fonts?? */ "set the environment variable MKTEXTFM " "to 1 and re-start xdvi. See the file texmf.cnf for the default settings " "of MKTEXTFM and related variables.", /* message */ "Could not find font metrics file %s.tfm; using cmr10.tfm instead. " "Expect ugly output.", texname); } return idx; } static int add_t1font(const char *fontname, const char *filename) { /* Add t1 font to list if it's not already there; return the (newly created, or already existing) t1lib font id. The filename argument is optional, but is assumed to be a full path if it is given. */ int id, idx; size_t i; char *path = NULL; static size_t t1lidx = 0; static size_t t1lidx_max = 0; static const size_t t1lidx_step = 1024; #ifdef USE_HASH /* Already set up by that name? */ if (t1fonts_hash.size == 0) t1fonts_hash = hash_create(T1FONTS_INITIAL_HASHTABLE_SIZE); if (find_str_int_hash(&t1fonts_hash, fontname, &i)) { return i; } #else for (i = 0; i <= t1lidx; i++) { if (strcmp(t1fonts[i].shortname, fontname) == 0 || strcmp(t1fonts[i].file, fontname) == 0) { TRACE_T1((stderr, "Type1 font %s already loaded from %s", fontname, filename)); return i; } } #endif /* USE_HASH */ /* Insert and set up new t1 font */ while (t1lidx >= t1lidx_max) { t1lidx_max += t1lidx_step; t1fonts = xrealloc(t1fonts, t1lidx_max * sizeof *t1fonts); TRACE_T1((stderr, "Enlarged t1 table from %lu to %lu entries", (unsigned long)t1lidx, (unsigned long)t1lidx_max)); } if (filename == NULL) { /* We don't know the full path name yet, find it */ path = kpse_find_file(fontname, kpse_type1_format, 0); if (path == NULL) return -1; /* xdvi will use substitution font */ } else { path = xstrdup(filename); } t1fonts[t1lidx].file = xstrdup(path); t1fonts[t1lidx].t1id = id = T1_AddFont(path); t1fonts[t1lidx].shortname = xstrdup(fontname); t1fonts[t1lidx].loaded = 0; TRACE_T1((stderr, "Loaded font %lu/%s (%d) from %s", (unsigned long)t1lidx, fontname, id, path)); #ifdef USE_HASH /* also save the info in the hashtable (note: no duplication of the string here!) */ put_str_int_hash(&t1fonts_hash, t1fonts[t1lidx].shortname, t1lidx); #endif /* USE_HASH */ idx = t1lidx++; free(path); #if USE_AFM /* BZZT! AFM files are useless to us, their metric information is too inacurate for TeX use. Never define USE_AFM */ /* Set the afm filename. Always before loading. If no afm file found t1lib will use fallback code. In fact the fallback code has been deactivated entierly, it's dog slow. */ path = kpse_find_file(fontname, kpse_afm_format, 0); if (path != NULL) { TRACE_T1((stderr, "found afm file: %s", path)); T1_SetAfmFileName(id, path); free(path); } #endif return idx; } static int find_texfont(const char *texname) { /* Find fontmap index of texfont */ size_t i; #ifdef USE_HASH if (fontmaps_hash.size == 0) fontmaps_hash = hash_create(T1FONTS_INITIAL_HASHTABLE_SIZE); if (find_str_int_hash(&fontmaps_hash, texname, &i)) { return i; } #else for (i = 0; i < g_maplidx; i++) { if (strcmp(fontmaps[i].texname, texname) == 0) { TRACE_T1((stderr, "Type1 font already loaded at index %d: %s\n", i, texname)); return i; } } #endif /* USE_HASH */ return -1; } static int setup_encoded_T1_font(const char *mapfile, int lineno, const char *texname, const char *alias, const char *filename, int enc, int ext, int sl) { /* xdvi T1 Font loading is done in two steps: 1. At xdvi startup two things happen: a. The fontmaps are read. b. the dvi file is (partialy) scanned, and fonts are set up. In the case of t1 fonts we only set up the data structures, they are not actually loaded until they are used. 2. At the time a T1 font is used it is loaded, encoded, extended and slanted as prescribed. This procedure takes care of step 1a. It locates the font and sets up the data-structures so it may be assumed, by xdvi, to be loaded. Return the fontmaps array index. The 'texname' param should be the texname of the font, such as ptmr8r or cmr10. The 'alias' param should be the file name of the font if it is different from the texname. This is often the case with fonts defined in fontmaps. If, for some reason, the full filename of the font has already been looked up before we get here it is passed in the filename param so we don't have to look it up again. Implied encodings are not handled here. REMEMBER: THIS PROC IS CALLED FOR EACH FONT IN THE FONTMAPS, WE CANNOT DO ANY EXPENSIVE OPERATIONS HERE!!! */ int test_idx; size_t curr_idx; static size_t maplidx_max = 0; static const size_t maplidx_step = 1024; /* fprintf(stderr, "setup font: |%s|, %s\n", texname, mapfile); */ /* Already setup by that name? */ test_idx = find_texfont(texname); ASSERT(test_idx == -1 || (test_idx > -1 && test_idx < (int)g_maplidx), "Result of find_texfont() out of range"); if (mapfile != NULL && test_idx != -1) { /* font is already set up, and we're scanning the map file: replace existing font with new one */ curr_idx = test_idx; XDVI_INFO((stdout, "%s: Entry for font \"%s\" on line %d overrides previous entry.", mapfile, texname, lineno)); free(fontmaps[curr_idx].filename); free(fontmaps[curr_idx].pathname); } else if (test_idx != -1) { /* font is already set up, but we're not scanning the map file - return font index */ TRACE_T1_VERBOSE((stderr, "font |%s| already set up at index %d", texname, test_idx)); return test_idx; } else { /* Not set up yet, do it. */ curr_idx = g_maplidx++; /* increment global index count */ while (curr_idx >= maplidx_max) { maplidx_max += maplidx_step; fontmaps = xrealloc(fontmaps, maplidx_max * sizeof *fontmaps); TRACE_T1((stderr, "Enlarged the fontmap from %lu to %lu entries", (unsigned long)curr_idx, (unsigned long)maplidx_max)); } fontmaps[curr_idx].texname = xstrdup(texname); } if (alias == NULL) alias = texname; #ifdef USE_HASH if (test_idx == -1) { if (fontmaps_hash.size == 0) fontmaps_hash = hash_create(T1FONTS_INITIAL_HASHTABLE_SIZE); put_str_int_hash(&fontmaps_hash, fontmaps[curr_idx].texname, curr_idx); } #endif /* USE_HASH */ fontmaps[curr_idx].enc = enc; fontmaps[curr_idx].extension = ext; fontmaps[curr_idx].slant = sl; fontmaps[curr_idx].filename = xstrdup(alias); fontmaps[curr_idx].t1libid = -1; TRACE_T1((stderr, "fontmaps[%lu]: \"%s\", enc=%d, ext=%d, sl=%d, alias \"%s\"", (unsigned long)curr_idx, texname, enc, ext, sl, alias)); if (filename != NULL) { fontmaps[curr_idx].pathname = xstrdup(filename); } else { fontmaps[curr_idx].pathname = NULL; } fontmaps[curr_idx].tfmidx = -1; fontmaps[curr_idx].warned_about = False; fontmaps[curr_idx].force_pk = False; return curr_idx; } static t1FontLoadStatusT try_pk_fallback(int idx, struct font *fontp) { Boolean success; success = load_font(fontp, False #if DELAYED_MKTEXPK , True #endif ); /* loading non-t1 version of font */ fontmaps[idx].force_pk = True; TRACE_T1((stderr, "setting force_pk for %d to true; success for PK fallback: %d\n", idx, success)); if (!success) { /* this is probably serious enough for a GUI warning */ popup_message(globals.widgets.top_level, MSG_ERR, /* helptext */ "Xdvi tries all of the following possibilities in turn, and all of them have failed:\n\n" " (1) If the resource t1lib is set, try a Postscript Type1 version of a font.\n\n" " (2) Otherwise, or if the Type1 version hasn't been found, try to " "locate, or generate via mktexpk, a TeX Pixel (PK) version of the font.\n\n" " (3) Use the fallback font defined via the \"altfont\" resource (cmr10 by default), " "both as Type1 and as PK version, at various resolutions.\n\n" "It seems that your font setup is defective.\n", /* errmsg */ "Error loading font %s: Neither a Type1 version nor " "a pixel version could be found. The character(s) " "will be left blank.", fontmaps[idx].texname); currinf.set_char_p = currinf.fontp->set_char_p = set_empty_char; return FAILURE_BLANK; } /* free unneeded resources. We mustn't free fontmaps[idx].texname, else find_T1_font will try to load the font all over again. */ free(fontmaps[idx].filename); free(fontmaps[idx].pathname); currinf.set_char_p = currinf.fontp->set_char_p = set_char; return FAILURE_PK; } static t1FontLoadStatusT load_font_now(int idx, struct font *fontp) { /* At this point xdvi needs to draw a glyph from this font. But first it must be loaded/copied and modified if needed. */ int t1idx; /* The fontmap entry number */ int t1id; /* The id of the unmodified font */ int cid; /* The id of the copied font */ int enc, sl, ext; /* statusline_info(STATUS_SHORT, "Loading T1 font %s", fontmaps[idx].filename); */ TRACE_T1((stderr, "adding %s %s", fontmaps[idx].filename, fontmaps[idx].pathname)); t1idx = add_t1font(fontmaps[idx].filename, fontmaps[idx].pathname); t1id = fontmaps[idx].t1libid = t1fonts[t1idx].t1id; errno = 0; if (!t1fonts[t1idx].loaded && T1_LoadFont(t1id) == -1) { /* this error is somehow better kept at stderr instead of a popup (too annoying) or the statusline (might disappear too fast) ... */ XDVI_ERROR((stderr, "Could not load Type1 font %s from %s: %s %s (T1_errno = %d); " "will try pixel version instead.\nPlease see the T1lib documentation for details about this.\n", fontmaps[idx].texname, fontmaps[idx].pathname, T1_StrError(T1_errno), errno != 0 ? strerror(errno) : "", T1_errno)); return try_pk_fallback(idx, fontp); } fontmaps[idx].tfmidx = add_tfm(fontmaps[idx].texname); t1fonts[t1idx].loaded = 1; /* If there is nothing further to do, just return */ enc = fontmaps[idx].enc; ext = fontmaps[idx].extension; sl = fontmaps[idx].slant; TRACE_T1((stderr, "lookup at idx[%d] yields: %d, %d, %d", idx, enc, ext, sl)); if (enc == -1 && ext == 0 && sl == 0) return SUCCESS; /* The fontmap entry speaks of a modified font. Copy it first. */ cid = T1_CopyFont(t1id); fontmaps[idx].t1libid = cid; if (enc != -1) { TRACE_T1_VERBOSE((stderr, "trying to load vector from encodings index %d", enc)); /* Demand load vector */ if (encodings[enc].vector == NULL) encodings[enc].vector = load_vector(encodings[enc].file); if (encodings[enc].vector == NULL) { /* this error is somehow better kept at stderr instead of a popup (too annoying) or the statusline (might disappear too fast) ... */ XDVI_ERROR((stderr, "Could not load load encoding file %s for vector %s (font %s): %s (T1_errno = %d); " "will try pixel version instead.\n" "Please see the T1lib documentation for details about this.\n", encodings[enc].file, encodings[enc].enc, fontmaps[idx].texname, T1_StrError(T1_errno), T1_errno)); return try_pk_fallback(idx, fontp); } else { if (T1_ReencodeFont(cid, encodings[enc].vector) != 0) { XDVI_ERROR((stderr, "Re-encoding of %s failed: %s (T1_errno = %d); " "will try pixel version instead.\n" "Please see the T1lib documentation for details about this.\n", fontmaps[idx].texname, T1_StrError(T1_errno), T1_errno)); return try_pk_fallback(idx, fontp); } } } if (ext) T1_ExtendFont(cid, ext / 1000.0); if (sl) T1_SlantFont(cid, sl / 10000.0); return SUCCESS; } int find_T1_font(const char *texname) { /* Step 1b in the scenario above. xdvi knows that this font is needed. Check if it is available, but do not load it yet. Return the fontmap index at which the font was found */ int idx; /* Iterator, t1 font id */ char *filename; int fl, el; /* Fontname length, encoding name length */ int encoded = -1; char *mname; /* Modified font name */ size_t i; encoded = 0; /* First: Check the maps */ idx = find_texfont(texname); if (idx != -1) { if (fontmaps[idx].force_pk) { return idx; } if (fontmaps[idx].pathname == NULL) { filename = kpse_find_file(fontmaps[idx].filename, kpse_type1_format, 0); /* It should have been on disk according to the map, but never fear, xdvi will try to find it other ways. */ if (filename == NULL) { if (!fontmaps[idx].warned_about) { fontmaps[idx].warned_about = True; XDVI_WARNING((stderr, "Font map calls for %s, but it was not found (will try PK version instead).", fontmaps[idx].filename)); } return -1; } fontmaps[idx].pathname = filename; } TRACE_T1((stderr, "find_T1_font map: %s, entered as #%d",texname,idx)); return idx; } #if 0 /* SU: Fix for #1295829: If eg. plr10 is missing from ps2pk.map, xdvi will use plr10.pfb without reencoding it instead of calling mktexpk for plr10.mf which will use the correct encoding. */ /* Second: the bare name */ filename = kpse_find_file(texname, kpse_type1_format, 0); if (filename != NULL) { idx = setup_encoded_T1_font(NULL, 0, texname, NULL, filename, -1, 0, 0); TRACE_T1((stderr, "find_T1_font bare enc: %s, entered as #%d", texname, idx)); return idx; } #endif /* Third: Implied encoding? */ fl = strlen(texname); for (i = 0; i < enclidx; i++) { if (encodings[i].enc == NULL) continue; el = strlen(encodings[i].enc); /* Note: the encodings map is short, so the strcmp doesn't hurt here */ if (strcmp(texname + (fl - el), encodings[i].enc) == 0) { /* Found a matching encoding */ TRACE_T1((stderr, "Encoding match: %s - %s", texname, encodings[i].enc)); mname = malloc(fl + 2); strcpy(mname, texname); mname[fl - el] = '\0'; /* If we had 'ptmr8r' the we now look for 'ptmr' */ filename = kpse_find_file(mname, kpse_type1_format, 0); if (filename == NULL) { /* No? Look for ptmr8a. 8a postfix is oft used on raw fonts */ strcat(mname, "8a"); filename = kpse_find_file(mname, kpse_type1_format, 0); } if (filename != NULL) { idx = setup_encoded_T1_font(NULL, 0, texname, mname, filename, i, 0, 0); TRACE_T1((stderr, "find_T1_font implied enc: %s, is #%d", texname, idx)); return idx; } free(mname); /* Now we have tried everything. Time to give up. */ return -1; } /* If (strcmp...) */ } /* for */ return -1; } /* ************************* CONFIG FILE READING ************************ */ static int new_encoding(const char *enc, const char *file) { /* (Possibly) new encoding entered from .cfg file, or from dvips map. When entered from dvips map the enc is null/anonymous */ size_t i; static size_t enclidx_max = 0; static const size_t enclidx_step = 16; /* Shirley! You're jesting! */ if (file == NULL) return -1; if (enc == NULL) { /* Enter by file name. First check if the file has been entered already. */ for (i = 0; i < enclidx; i++) { if (strcmp(encodings[i].file, file) == 0) { return i; } } } else { /* Enter by encoding name. Check if already loaded first. */ for (i = 0; i < enclidx; i++) { if (encodings[i].enc != NULL && strcmp(encodings[i].enc, enc) == 0) return i; } } /* Bonafide new encoding */ while (enclidx >= enclidx_max) { enclidx_max += enclidx_step; encodings = xrealloc(encodings, enclidx_max * sizeof *encodings); TRACE_T1((stderr, "Enlarged encoding map from %lu to %lu entries", (unsigned long)enclidx, (unsigned long)enclidx_max)); } TRACE_T1((stderr, "New encoding #%lu: '%s' -> '%s'", (unsigned long)enclidx, enc ? enc : "", file)); /* The encoding name is optional */ encodings[enclidx].enc = NULL; if (enc != NULL) encodings[enclidx].enc = xstrdup(enc); /* The file name is required */ encodings[enclidx].file = xstrdup(file); encodings[enclidx].vector = NULL; /* Demand load later */ return enclidx++; } void add_T1_mapentry(int lineno, const char *mapfile, const char *name, const char *file, const char *vec, char *spec) { /* This is called from read_map_file, once for each fontmap line `lineno'. We will dutifully enter the information into our fontmap table */ static char delim[] = "\t "; char *last, *current; float number; int extend = 0; int slant = 0; TRACE_T1_VERBOSE((stderr, "%s:%d: %s -> %s Enc: %s Spec: %s", mapfile, lineno, name, file, vec == NULL ? "" : vec, spec == NULL ? "" : spec)); if (spec != NULL) { /* Try to analyze the postscript string. We recognize two things: "n ExtendFont" and "m SlantFont". n can be a decimal number in which case it's an extension factor, or a integer, in which case it's a charspace unit? In any case 850 = .85 */ last = strtok(spec, delim); current = strtok(NULL, delim); while (current != NULL) { if (strcmp(current, "ExtendFont") == 0) { sscanf(last, "%f", &number); if (number < 10.0) extend = number * 1000.0; else extend = number; } else if (strcmp(current, "SlantFont") == 0) { sscanf(last, "%f", &number); slant = number * 10000.0; } last = current; current = strtok(NULL, delim); } } setup_encoded_T1_font(mapfile, lineno, name, file, NULL, new_encoding(NULL, vec), extend, slant); } static void read_cfg_file(const char *file) { char *filename; FILE *fp; int len; char *keyword; char *ptr; char *buffer; char *enc; char *name; int i; static const char delim[] = "\t \n\r"; Boolean found_no_map_files = True; if (file == NULL) file = "xdvi.cfg"; filename = kpse_find_file(file, kpse_program_text_format, 1); if (filename == NULL) { statusline_error(STATUS_MEDIUM, "Warning: Unable to find \"%s\"!", file); return; } if ((fp = XFOPEN(filename, "r")) == NULL) { XDVI_ERROR((stderr, "Cannot open config file `%s' for reading: %s", filename, strerror(errno))); return; } TRACE_T1((stderr, "Reading cfg file %s", filename)); buffer = xmalloc(BUFFER_SIZE); while (fgets(buffer, BUFFER_SIZE, fp) != NULL) { len = strlen(buffer); if (buffer[len - 1] != '\n') { int c; /* this really shouldn't happen ... */ XDVI_WARNING((stderr, "Skipping overlong line (> %d characters) in config file `%s':\n%s ...", BUFFER_SIZE, filename, buffer)); /* read until end of this line */ while((c = fgetc(fp)) != '\n' && c != EOF) { ; } continue; } keyword = buffer; /* Skip leading whitespace */ while (keyword[0] != '\0' && (keyword[0] == ' ' || keyword[0] == '\t')) keyword++; /* % in first column is a correct comment */ if (keyword[0] == '%' || keyword[0] == '\0' || keyword[0] == '\n') continue; keyword = strtok(keyword, delim); if (strcmp(keyword, "dvipsmap") == 0) { if ((ptr = strtok(NULL, delim)) == NULL) { XDVI_WARNING((stderr, "Syntax error in entry \"%s\"", buffer)); continue; } TRACE_T1((stderr, "DVIPSMAP: '%s'", ptr)); if (read_map_file(ptr)) { found_no_map_files = False; } else { TRACE_T1((stderr, "Read map file: '%s'", ptr)); } } else if (strcmp(keyword, "encmap") == 0) { popup_message(globals.widgets.top_level, MSG_ERR, "Your xdvi.cfg file is for a previous version of xdvik. Please replace " "it by the xdvi.cfg file in the current xdvik distribution.", "Keyword \"encmap\" in xdvi.cfg is no longer supported, " "please update the config file %s.", filename); } else if (strcmp(keyword, "enc") == 0) { enc = strtok(NULL, delim); name = strtok(NULL, delim); if ((ptr = strtok(NULL, delim)) == NULL) { XDVI_WARNING((stderr, "Syntax error in entry \"%s\" (skipping line)", buffer)); continue; } i = new_encoding(enc, ptr); TRACE_T1((stderr, "Encoding[%d]: '%s' = '%s' -> '%s'", i, enc, name, ptr)); } else { /* again, nag them with a popup so that they'll do something about this ... */ popup_message(globals.widgets.top_level, MSG_ERR, "Please check the syntax of your config file. " "Valid keywords are: \"enc\" and \"dvipsmap\".", "Skipping unknown keyword \"%s\" in config file %s.", keyword, filename); } } if (found_no_map_files) { /* nag 'em with a popup so that they'll do something about this ... */ popup_message(globals.widgets.top_level, MSG_ERR, "Direct Type 1 font rendering via T1lib gives you many benefits, such as:\n" " - quicker startup time, since no bitmap fonts need to be generated;\n" " - saving disk space for storing the bitmap fonts.\n" "To fix this error, check that the file `ps2pk.map' is located somewhere " "in your XDVIINPUTS path. Have a look at the xdvi wrapper shell script " "(type \"which xdvi\" to locate that shell script) for the current setting " "of XDVIINPUTS.", "Could not load any of the map files listed in xdvi.cfg - disabling T1lib."); resource.t1lib = False; } fclose(fp); free(buffer); free(filename); } /* **************************** GLYPH DRAWING *************************** */ /* Set character# ch */ static struct glyph * get_t1_glyph( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch, t1FontLoadStatusT *flag, Boolean is_geom_scan) { /* A problem is that there are some gaps in math modes tall braces '{', (see for example the amstex users guide). These gaps are seen less if a small size factor is applied, 1.03 seems nice. This does not seem like the Right Thing though. Also gaps do not show up in the fullsize window. All in all the factor has been dropped. Despite the beauty flaw. */ float size = dvi_pt_conv(currinf.fontp->scale); int id = currinf.fontp->t1id; int t1libid = fontmaps[id].t1libid; GLYPH *G; /* t1lib glyph */ struct glyph *g; /* xdvi glyph */ #ifdef TEXXET UNUSED(cmd); #endif *flag = SUCCESS; #if COLOR if (!is_geom_scan && fg_active != fg_current) do_color_change(); #endif /* return immediately if we need to use the fallback PK */ if (fontmaps[id].force_pk) return NULL; TRACE_T1((stderr, "scale: %ld, ppi %d, sf: %d, size: %f", currinf.fontp->scale, resource.pixels_per_inch, currwin.shrinkfactor, size)); if (t1libid == -1) { TRACE_T1((stderr, "trying to load font %d", id)); *flag = load_font_now(id, currinf.fontp); if (*flag < 0) { TRACE_T1((stderr, "load_font_now failed for T1 font %d", id)); return NULL; } t1libid = fontmaps[id].t1libid; } TRACE_T1((stderr, "Setting 0x%x `%c' of %d, at %ld(%.2fpt), shrinkage is %d", ch, isprint(ch) ? ch : '?', t1libid, currinf.fontp->scale, size, currwin.shrinkfactor)); /* Check if the glyph already has been rendered */ if (ch > currinf.fontp->maxchar) { /* in this case, the replacement font is 'smaller' than the requested one. This will later lead to a warning: "Character 9561 not defined in font cmr10". */ return NULL; } if ((g = &currinf.fontp->glyph[ch])->bitmap.bits == NULL) { int bitmapbytes; int h; unsigned char *f; unsigned char *t; /* Not rendered: Generate xdvi glyph from t1font */ g->addr = 1; /* Dummy, should not provoke errors other places in xdvi */ /* Use the width from the tfm file */ g->dvi_adv = tfminfo[fontmaps[id].tfmidx].widths[ch] * currinf.fontp->dimconv; TRACE_T1((stderr, "0x%x, dvi_adv = %ld; dimconv: %f", ch, tfminfo[fontmaps[id].tfmidx].widths[ch], currinf.fontp->dimconv)); /* Render the glyph. Size here should be postscript bigpoints */ G = T1_SetChar(t1libid, ch, size, NULL); if (G == NULL) { /* This can happen e.g. if font is too small; example with plain TeX: \magnification=50 Hello, world!\end */ statusline_info(STATUS_FOREVER, "Error rendering character 0x%x `%c' - replacing by whitespace", ch, isprint(ch) ? ch : '?'); XDVI_ERROR((stderr, "T1lib failed for character 0x%x `%c': %s. Replacing by whitespace.", ch, isprint(ch) ? ch : '?', T1_StrError(T1_errno))); g->bitmap.w = 1; g->bitmap.h = 1; g->bitmap.bytes_wide = T1PAD(g->bitmap.w, archpad) / 8; alloc_bitmap(&g->bitmap); memset(g->bitmap.bits, 0, g->bitmap.h * g->bitmap.bytes_wide); g->x = 0; g->y = 0; #if COLOR g->fg = fg_current; #endif return g; } if (G->bits == NULL) { #if 0 /* in this case the glyph can either be a whitespace or .notdef. We would like to warn about the latter, but I haven't found a way to distinguish between the two cases that works reliably. If the font has built-in encoding, we can't use the following test to check for the name, since the index i doesn't correspond to "ch": */ char **glyph_names = T1_GetAllCharNames(t1libid); for (i = 0; glyph_names[i] != NULL; i++) { fprintf(stderr, "CHAR %d: %s\n", i, glyph_names[i]); } free(glyph_names); // not sure about this ... /* For ~/projects/xdvik/bugs/cjk-notdef-problem, this prints: CHAR 0: .notdef CHAR 1: uni3000 even though the character at point 0 is uni3000. For external encodings, it should be possible to look at the encoding vector: */ int enc = fontmaps[id].enc; if (enc != -1) { if (encodings[enc].vector == NULL) { fprintf(stderr, "Unexpected: vector is NULL!\n"); } else { fprintf(stderr, "GOT CHAR: %s\n", encodings[enc].vector[ch]); } } /* Also checking for the font dimens doesn't help in this case - the results are identical for .notdef and uni3000: */ fprintf(stderr, "DIMENS: %d,%d,%d,%d\n", G->metrics.rightSideBearing, G->metrics.leftSideBearing, G->metrics.advanceX, G->metrics.advanceY); /* the following simple test for whitespace doesn't work for Chinese fonts either: */ if (ch != ' ') { char index[128]; char *fontname = xstrdup(currinf.fontp->fontname); size_t dummy = 0; SNPRINTF(index, sizeof index, "%d", ch); fontname = xstrcat(fontname, index); if (font_warn_hash.size == 0) { /* TODO: print to statusline */ /* popup_message(MSG_WARN, */ /* NULL, */ /* "Unexpected blank character (.notdef) in font %s, " */ /* "replacing with whitespace (see output to stderr for details). " */ /* "This might indicate that the font %s is missing " */ /* "from the font map, or that it has been specified " */ /* "with a wrong encoding.", */ /* currinf.fontp->fontname, currinf.fontp->fontname); */ font_warn_hash = hash_create(T1FONTS_INITIAL_HASHTABLE_SIZE); } if (!find_str_int_hash(&font_warn_hash, fontname, &dummy)) { if (!resource.hush_chars) XDVI_WARNING((stderr, "Character %d is mapped to .notdef in font %s (page %d), " "replaced by whitespace.", ch, currinf.fontp->fontname, current_page + 1)); put_str_int_hash(&font_warn_hash, fontname, dummy); } else { free(fontname); } } #endif /* *flag = FAILURE_BLANK; */ /* g->addr = -1; */ /* return NULL; */ /* FIXME: g->dvi_adv is only used when invoking set_char(), not with set_empty_char(), and the former apparently needs a valid bitmap. Check how this is done without t1lib. */ TRACE_T1((stderr, "replaced .notdef or whitespace char 0x%02x by space.\n", ch)); g->bitmap.w = 1; g->bitmap.h = 1; g->bitmap.bytes_wide = T1PAD(g->bitmap.w, archpad) / 8; alloc_bitmap(&g->bitmap); memset(g->bitmap.bits, 0, g->bitmap.h * g->bitmap.bytes_wide); g->x = 0; g->y = 0; #if COLOR g->fg = fg_current; #endif return g; } g->bitmap.w = abs(G->metrics.rightSideBearing - G->metrics.leftSideBearing); g->bitmap.h = abs(G->metrics.descent - G->metrics.ascent); g->bitmap.bytes_wide = T1PAD(g->bitmap.w, archpad) / 8; alloc_bitmap(&g->bitmap); bitmapbytes = g->bitmap.bytes_wide * g->bitmap.h; if (padMismatch) { /* Fix alignment mismatch */ int from_bytes = T1PAD(g->bitmap.w, 8) / 8; f = (unsigned char *)G->bits; t = (unsigned char *)g->bitmap.bits; memset(t, 0, bitmapbytes); /* OR ELSE! you get garbage */ for (h = 0 ; h < g->bitmap.h; h++) { memcpy(t, f, from_bytes); f += from_bytes; t += g->bitmap.bytes_wide; } } else { /* t1lib and arch alignment matches */ memcpy(g->bitmap.bits, G->bits, bitmapbytes); } #ifdef WORDS_BIGENDIAN /* xdvi expects the bits to be reversed according to endianness. t1lib expects no such thing. This loop reverses the bit order in all the bytes. -janl 18/5/2001 */ t = (unsigned char *)g->bitmap.bits; for (h = 0; h < bitmapbytes; h++) { *t = rbits[*t]; t++; } #endif g->x = -G->metrics.leftSideBearing; /* Opposed x-axis */ g->y = G->metrics.ascent; #if COLOR g->fg = fg_current; #endif } return g; } setcharRetvalT set_t1_char( #ifdef TEXXET wide_ubyte cmd, #endif wide_ubyte ch) { t1FontLoadStatusT flag; /* get_t1_glyph() will itself set currinf.fontp->set_char_p to set_empty_char() or set_char() if it failed to load the T1 version, but for the *current* call of set_t1_char, we still need to know whether (1) or (2) holds: (1) Type1 font hasn't been found but PK is working, use set_char() to set the PK version (2) neither Type1 nor PK have been found (this is the FAILURE_BLANK case), use set_empty_char(). So we need the flag to pass this additional information. */ #ifdef TEXXET (void)get_t1_glyph(cmd, ch, &flag, False); if (flag == FAILURE_BLANK) set_empty_char(cmd, ch); else set_char(cmd, ch); return; #else (void)get_t1_glyph(ch, &flag, False); if (flag == FAILURE_BLANK) return set_empty_char(ch); else return set_char(ch); #endif } void read_T1_char(struct font *fontp, wide_ubyte ch) { UNUSED(fontp); UNUSED(ch); /* Should never be called */ XDVI_ABORT((stderr, "%s:%d: asked to load %c", __FILE__, __LINE__, ch)); } void init_t1(void) { int i; void *success; /* Attempt to set needed padding. FIXME: This is not really the required alignment/padding. On ix86 the requirement for int * is 8 bits, on sparc on the other hand it's 32 bits. Even so, some operations will be faster if the bitmaps lines are alligned "better". But on the other hand this requires a more complex glyph copying operation... - janl 16/5/2001 */ archpad = BMBYTES * 8; i = T1_SetBitmapPad(archpad); if (i == -1) { /* Failed, revert to 8 bits and compilicated bitmap copying */ padMismatch = True; T1_SetBitmapPad(8); } else { padMismatch = False; } /* Initialize t1lib, use LOGFILE to get logging, NO_LOGFILE otherwise */ /* Under NO circumstances remove T1_NO_AFM, it slows us down a LOT */ if (globals.debug & DBG_T1) { XDVI_INFO((stdout, "Additional t1lib messages may be found in \"t1lib.log\".")); success = T1_InitLib(LOGFILE | T1_NO_AFM | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE); } else success = T1_InitLib(NO_LOGFILE | T1_NO_AFM | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE); if (success == NULL) { XDVI_FATAL((stderr, "Initialization of t1lib failed!")); } T1_SetLogLevel(T1LOG_DEBUG); if (resource.subpixel_order == SUBPIXEL_NONE) T1_SetDeviceResolutions(BDPI, BDPI); else T1_SetDeviceResolutions(3 * BDPI, BDPI); read_cfg_file(NULL); } #endif /* T1LIB */ #if GREY extern double pow(); static void mask_shifts(Pixel mask, int *pshift1, int *pshift2) { int k, l; for (k = 0; (mask & 1) == 0; ++k) mask >>= 1; for (l = 0; (mask & 1) == 1; ++l) mask >>= 1; *pshift1 = sizeof(short) * 8 - l; *pshift2 = k; } /* * Try to allocate 4 color planes for 16 colors (for GXor drawing). * Not called if the visual type is TrueColor. * When color specials are active, this is called exactly once. * It is used for the first foreground/background pair displayed in * the document. For other documents, we act as if this call had failed. */ void init_plane_masks(void) { Pixel pixel; if (globals.gc.do_copy || plane_masks[0] != 0) return; if (XAllocColorCells(DISP, G_colormap, False, plane_masks, 4, &pixel, 1)) { /* Make sure fore_Pixel and back_Pixel are a part of the palette */ resource.back_Pixel = pixel; resource.fore_Pixel = pixel | plane_masks[0] | plane_masks[1] | plane_masks[2] | plane_masks[3]; if (mane.win != (Window) 0) XSetWindowBackground(DISP, mane.win, resource.back_Pixel); } else { globals.gc.do_copy = True; warn_overstrike(); } } #endif /* GREY */ #if COLOR /* * Insert into list of colors to be freed upon opening new document. */ static void color_list_insert(Pixel pixel) { if (color_list_len >= color_list_max) { if (color_list_max == 0) color_list = xmalloc((color_list_max += 16) * sizeof *color_list); else color_list = xrealloc(color_list, (color_list_max += 16) * sizeof *color_list); } color_list[color_list_len++] = pixel; } /* * Warn about colors not being correct. */ static void color_warn(void) { if (!color_warned) { color_warned = True; popup_message(globals.widgets.top_level, MSG_WARN, /* helptext */ "Either this document is using too many " "colors, or some other application is. " "In the latter case, try to close that " "application and re-read the DVI file.", /* msg */ "Cannot allocate colormap entry, " "displayed colors will not be exact."); } } /* * Allocate a color and add it to our list of pixels to be returned * upon opening a new document. */ #define SHIFTIFY(x, shift1, shift2) ((((Pixel)(x)) >> (shift1)) << (shift2)) static int shift1_r, shift1_g, shift1_b; static int shift2_r, shift2_g, shift2_b; static Boolean shifts_good = False; Pixel alloc_color(const struct rgb *colorp, Pixel fallback_pixel) { XColor xcol; if (G_visual->class == TrueColor) { if (!shifts_good) { mask_shifts(G_visual->red_mask, &shift1_r, &shift2_r); mask_shifts(G_visual->green_mask, &shift1_g, &shift2_g); mask_shifts(G_visual->blue_mask, &shift1_b, &shift2_b); shifts_good = True; } return SHIFTIFY(colorp->r, shift1_r, shift2_r) | SHIFTIFY(colorp->g, shift1_g, shift2_g) | SHIFTIFY(colorp->b, shift1_b, shift2_b); } else { xcol.red = colorp->r; xcol.green = colorp->g; xcol.blue = colorp->b; xcol.flags = DoRed | DoGreen | DoBlue; if (XAllocColor(DISP, G_colormap, &xcol)) { color_list_insert(xcol.pixel); if (globals.debug & DBG_DVI) printf("alloc_color%6d%6d%6d --> %ld\n", xcol.red, xcol.green, xcol.blue, xcol.pixel); return xcol.pixel; } else { if (globals.debug & DBG_DVI) printf("alloc_color%6d%6d%6d --> failed\n", xcol.red, xcol.green, xcol.blue); color_warn(); return fallback_pixel; } } } #undef SHIFTIFY /* * Switch colors of GCs, etc. Called when we're about to use a GC. */ void do_color_change(void) { static int shrink_allocated_for = 0; Pixel set_bits; Pixel clr_bits; ASSERT(fg_current != NULL, "Current foreground mustn't be NULL"); ASSERT(bg_current != NULL, "Current background mustn't be NULL"); #if GREY if (resource.use_grey) { if (G_visual->class == TrueColor) { if (!fg_current->pixel_good) { fg_current->pixel = alloc_color(&fg_current->color, color_data[0].pixel); fg_current->pixel_good = True; } set_bits = fg_current->pixel & ~bg_current->pixel; clr_bits = bg_current->pixel & ~fg_current->pixel; if (set_bits & G_visual->red_mask) set_bits |= G_visual->red_mask; if (clr_bits & G_visual->red_mask) clr_bits |= G_visual->red_mask; if (set_bits & G_visual->green_mask) set_bits |= G_visual->green_mask; if (clr_bits & G_visual->green_mask) clr_bits |= G_visual->green_mask; if (set_bits & G_visual->blue_mask) set_bits |= G_visual->blue_mask; if (clr_bits & G_visual->blue_mask) clr_bits |= G_visual->blue_mask; /* * Make the GCs */ globals.gc.rule = set_or_make_gc(globals.gc.rule, GXcopy, fg_current->pixel, bg_current->pixel); globals.gc.fore2 = NULL; if (resource.copy || (set_bits && clr_bits && !resource.thorough)) { if (!resource.copy) { warn_overstrike(); } globals.gc.fore = set_or_make_gc(globals.gc.fore, GXcopy, fg_current->pixel, bg_current->pixel); } else { if (set_bits) { globals.gc.fore = set_or_make_gc(globals.gc.fore, GXor, fg_current->pixel & set_bits, 0); if (clr_bits) { globals.gc.fore2 = globals.gc.fore2_bak = set_or_make_gc(globals.gc.fore2_bak, GXandInverted, ~fg_current->pixel & clr_bits, 0); } } else { globals.gc.fore = set_or_make_gc(globals.gc.fore, GXandInverted, ~fg_current->pixel & clr_bits, 0); } } if (globals.debug & DBG_DVI) printf("do_color_change: fg = %lx, bg = %lx, with%s globals.gc.fore2\n", fg_current->pixel, bg_current->pixel, globals.gc.fore2 == NULL ? "out" : ""); if (mane.shrinkfactor > 1) { unsigned int i; unsigned int sf_squared; sf_squared = mane.shrinkfactor * mane.shrinkfactor; if (shrink_allocated_for < mane.shrinkfactor) { if (pixeltbl != NULL) { free((char *) pixeltbl); if (pixeltbl_gc2 != NULL) { free((char *) pixeltbl_gc2); pixeltbl_gc2 = NULL; } } pixeltbl = xmalloc((sf_squared + 1) * sizeof *pixeltbl); shrink_allocated_for = mane.shrinkfactor; } if (globals.gc.fore2 != NULL && pixeltbl_gc2 == NULL) { /* Can't use sf_squared (or mane.shrinkfactor) here */ pixeltbl_gc2 = xmalloc((shrink_allocated_for * shrink_allocated_for + 1) * sizeof *pixeltbl_gc2); } /* * Initialize the pixel lookup table according to the gamma values. */ #define SHIFTIFY(x, shift1, shift2) ((((Pixel)(x)) >> (shift1)) << (shift2)) for (i = 0; i <= sf_squared; ++i) { double frac = resource.gamma > 0 ? pow((double)i / sf_squared, 1 / resource.gamma) : 1 - pow((double) (sf_squared - i) / sf_squared, -resource.gamma); unsigned int red, green, blue; Pixel pixel; /* fprintf(stderr, "frac: %f\n", frac); */ /* fprintf(stderr, "fg_current: %d, bg_current: %d\n", fg_current->color.r, bg_current->color.r); */ red = frac * ((double) fg_current->color.r - bg_current->color.r) + bg_current->color.r; green = frac * ((double) fg_current->color.g - bg_current->color.g) + bg_current->color.g; blue = frac * ((double) fg_current->color.b - bg_current->color.b) + bg_current->color.b; pixel = SHIFTIFY(red, shift1_r, shift2_r) | SHIFTIFY(green, shift1_g, shift2_g) | SHIFTIFY(blue, shift1_b, shift2_b); if (globals.gc.fore2 != NULL) { /* if thorough */ /* fprintf(stderr, "++++++ pixeltable at %d: %ld\n", i, pixel & ~bg_current->pixel); */ pixeltbl[i] = pixel & ~bg_current->pixel; pixeltbl_gc2[i] = ~pixel & bg_current->pixel; } else if (resource.copy || (set_bits && clr_bits)) { /* fprintf(stderr, "++++++ pixeltable2 at %d: %ld\n", i, pixel); */ pixeltbl[i] = pixel; } else { /* fprintf(stderr, "++++++ pixeltable3 at %d: 0x%lx\n", i, ~pixel & clr_bits); */ /* fprintf(stderr, "++++++ pixeltable3 at %d: %ld\n", i, pixel & set_bits); */ pixeltbl[i] = set_bits ? pixel & set_bits : ~pixel & clr_bits; } } #undef SHIFTIFY } } else { /* not TrueColor */ int i; Boolean using_planes; using_planes = (fg_current == bg_head->fg_head && !globals.gc.do_copy); if (!fg_current->palette_good) { XColor color; /* * Initialize the pixel lookup table according to the gamma values. */ for (i = 0; i < 16; ++i) { double frac; frac = resource.gamma > 0 ? pow((double) i / 15, 1 / resource.gamma) : 1 - pow((double) (15 - i) / 15, -resource.gamma); color.red = frac * ((double) fg_current->color.r - bg_current->color.r) + bg_current->color.r; color.green = frac * ((double) fg_current->color.g - bg_current->color.g) + bg_current->color.g; color.blue = frac * ((double) fg_current->color.b - bg_current->color.b) + bg_current->color.b; color.flags = DoRed | DoGreen | DoBlue; if (using_planes) { color.pixel = resource.back_Pixel; /* start of block */ if (i & 1) color.pixel |= plane_masks[0]; if (i & 2) color.pixel |= plane_masks[1]; if (i & 4) color.pixel |= plane_masks[2]; if (i & 8) color.pixel |= plane_masks[3]; XStoreColor(DISP, G_colormap, &color); fg_current->palette[i] = color.pixel; } else { if (XAllocColor(DISP, G_colormap, &color)) { fg_current->palette[i] = color.pixel; color_list_insert(color.pixel); } else { color_warn(); fg_current->palette[i] = (i * 100 >= resource.density * 15) ? resource.fore_Pixel : bg_current->pixel; } } } if (using_planes && bg_current->pixel != resource.back_Pixel) { bg_current->pixel = resource.back_Pixel; /* XSetWindowBackground(DISP, mane.win, bg_current->pixel); */ #if MOTIF fprintf(stderr, "setting window background!\n"); XSetWindowBackground(DISP, XtWindow(globals.widgets.main_window), bg_current->pixel); XtVaSetValues(globals.widgets.main_window, XmNbackground, bg_current->pixel, NULL); #else XSetWindowBackground(DISP, mane.win, bg_current->pixel); #endif XClearWindow(DISP, mane.win); } fg_current->palette_good = True; } if (globals.debug & DBG_DVI) printf("do_color_change: fg = %ld, bg = %ld, using_planes = %d\n", fg_current->palette[15], bg_current->pixel, using_planes); if (using_planes) { globals.gc.rule = set_or_make_gc(globals.gc.rule, GXor, fg_current->palette[15], bg_current->pixel); globals.gc.fore = set_or_make_gc(globals.gc.fore, GXor, fg_current->palette[15], bg_current->pixel); } else { globals.gc.rule = set_or_make_gc(globals.gc.rule, GXcopy, fg_current->palette[15], bg_current->pixel); globals.gc.fore = set_or_make_gc(globals.gc.fore, GXcopy, fg_current->palette[15], bg_current->pixel); } globals.gc.fore2 = NULL; if (mane.shrinkfactor > 1) { if (shrink_allocated_for < mane.shrinkfactor) { if (pixeltbl != NULL) free((char *) pixeltbl); pixeltbl = xmalloc((unsigned)(mane.shrinkfactor * mane.shrinkfactor + 1) * sizeof *pixeltbl); shrink_allocated_for = mane.shrinkfactor; } for (i = 0; i <= mane.shrinkfactor * mane.shrinkfactor; ++i) { pixeltbl[i] = fg_current->palette[(i * 30 + mane.shrinkfactor * mane.shrinkfactor) / (2 * mane.shrinkfactor * mane.shrinkfactor)]; } } } } /* end if resource.use_grey */ else #endif /* GREY */ { if (!fg_current->pixel_good) { fg_current->pixel = alloc_color(&fg_current->color, color_data[0].pixel); fg_current->pixel_good = True; } if (globals.debug & DBG_DVI) printf("do_color_change: fg = %lx, bg = %lx\n", fg_current->pixel, bg_current->pixel); globals.gc.rule = set_or_make_gc(globals.gc.rule, GXcopy, fg_current->pixel, bg_current->pixel); set_bits = (Pixel) (fg_current->pixel & ~bg_current->pixel); clr_bits = (Pixel) (bg_current->pixel & ~fg_current->pixel); globals.gc.fore2 = NULL; if (resource.copy || (set_bits && clr_bits && !resource.thorough)) { if (!resource.copy) { /* I used to get a warning here which I didn't get for xdvi-22.64/events.c, l.1330, but I can't reproduce it any more ... */ warn_overstrike(); } globals.gc.fore = set_or_make_gc(globals.gc.fore, GXcopy, fg_current->pixel, bg_current->pixel); } else { if (set_bits) { globals.gc.fore = set_or_make_gc(globals.gc.fore, GXor, set_bits, 0); if (clr_bits) { globals.gc.fore2 = globals.gc.fore2_bak1 = set_or_make_gc(globals.gc.fore2_bak1, GXandInverted, clr_bits, 0); } } else globals.gc.fore = set_or_make_gc(globals.gc.fore, GXandInverted, clr_bits, 0); } } fg_active = fg_current; } #elif GREY /* if COLOR */ void init_pix(void) { static int shrink_allocated_for = 0; static float oldgamma = 0.0; static Pixel palette[17]; int i; if (G_visual->class == TrueColor) { /* This mirrors the non-grey code in xdvi.c */ static int shift1_r, shift1_g, shift1_b; static int shift2_r, shift2_g, shift2_b; static Pixel set_bits; static Pixel clr_bits; unsigned int sf_squared; if (oldgamma == 0.0) { mask_shifts(G_visual->red_mask, &shift1_r, &shift2_r); mask_shifts(G_visual->green_mask, &shift1_g, &shift2_g); mask_shifts(G_visual->blue_mask, &shift1_b, &shift2_b); set_bits = color_data[0].pixel & ~(color_data[1].pixel); clr_bits = color_data[1].pixel & ~(color_data[0].pixel); if (set_bits & G_visual->red_mask) set_bits |= G_visual->red_mask; if (clr_bits & G_visual->red_mask) clr_bits |= G_visual->red_mask; if (set_bits & G_visual->green_mask) set_bits |= G_visual->green_mask; if (clr_bits & G_visual->green_mask) clr_bits |= G_visual->green_mask; if (set_bits & G_visual->blue_mask) set_bits |= G_visual->blue_mask; if (clr_bits & G_visual->blue_mask) clr_bits |= G_visual->blue_mask; /* * Make the GCs */ globals.gc.fore = globals.gc.fore2 = globals.gc.rule = 0; globals.gc.copy = set_or_make_gc(NULL, GXcopy, resource.fore_Pixel, resource.back_Pixel); if (globals.gc.do_copy || (set_bits && clr_bits)) { globals.gc.rule = globals.gc.copy; if (!resource.thorough) globals.gc.do_copy = True; } if (globals.gc.do_copy) { globals.gc.fore = globals.gc.rule; if (!resource.copy) { warn_overstrike(); } } else { if (set_bits) { globals.gc.fore = set_or_make_gc(NULL, GXor, set_bits & color_data[0].pixel, 0); } if (clr_bits || !set_bits) { /* fprintf(stderr, "using GXandInverted!\n"); */ *(globals.gc.fore ? &globals.gc.fore2 : &globals.gc.fore) = set_or_make_gc(NULL, GXandInverted, clr_bits & ~(color_data[0].pixel), 0); } if (!globals.gc.rule) globals.gc.rule = globals.gc.fore; } oldgamma = resource.gamma; } if (mane.shrinkfactor == 1) return; sf_squared = mane.shrinkfactor * mane.shrinkfactor; if (shrink_allocated_for < mane.shrinkfactor) { if (pixeltbl != NULL) { free((char *)pixeltbl); if (pixeltbl_gc2 != NULL) free((char *)pixeltbl_gc2); } pixeltbl = xmalloc((sf_squared + 1) * sizeof *pixeltbl); shrink_allocated_for = mane.shrinkfactor; if (globals.gc.fore2 != NULL) { pixeltbl_gc2 = xmalloc((sf_squared + 1) * sizeof *pixeltbl_gc2); } } /* * Initialize the pixel lookup table according to the gamma values. */ #define SHIFTIFY(x, shift1, shift2) ((((Pixel)(x)) >> (shift1)) << (shift2)) for (i = 0; i <= sf_squared; ++i) { double frac = resource.gamma > 0 ? pow((double)i / sf_squared, 1 / resource.gamma) : 1 - pow((double)(sf_squared - i) / sf_squared, -resource.gamma); unsigned int red, green, blue; Pixel pixel; red = frac * ((double)color_data[0].red - color_data[1].red) + color_data[1].red; green = frac * ((double)color_data[0].green - color_data[1].green) + color_data[1].green; blue = frac * ((double)color_data[0].blue - color_data[1].blue) + color_data[1].blue; pixel = SHIFTIFY(red, shift1_r, shift2_r) | SHIFTIFY(green, shift1_g, shift2_g) | SHIFTIFY(blue, shift1_b, shift2_b); if (globals.gc.do_copy) { pixeltbl[i] = pixel; } else if (globals.gc.fore2 != NULL) { /* if thorough */ pixeltbl[i] = pixel & ~(color_data[1].pixel); pixeltbl_gc2[i] = ~pixel & color_data[1].pixel; } else { pixeltbl[i] = set_bits ? pixel & set_bits : ~pixel & clr_bits; } } #undef SHIFTIFY return; } /* if not TrueColor ... */ if (resource.gamma != oldgamma) { XColor color; for (i = 0; i < 16; ++i) { double frac = resource.gamma > 0 ? pow((double)i / 15, 1 / resource.gamma) : 1 - pow((double)(15 - i) / 15, -resource.gamma); color.red = frac * ((double)color_data[0].red - color_data[1].red) + color_data[1].red; color.green = frac * ((double)color_data[0].green - color_data[1].green) + color_data[1].green; color.blue = frac * ((double)color_data[0].blue - color_data[1].blue) + color_data[1].blue; color.pixel = resource.back_Pixel; color.flags = DoRed | DoGreen | DoBlue; if (!globals.gc.do_copy) { if (i & 1) color.pixel |= plane_masks[0]; if (i & 2) color.pixel |= plane_masks[1]; if (i & 4) color.pixel |= plane_masks[2]; if (i & 8) color.pixel |= plane_masks[3]; XStoreColor(DISP, G_colormap, &color); palette[i] = color.pixel; } else { if (XAllocColor(DISP, G_colormap, &color)) palette[i] = color.pixel; else palette[i] = (i * 100 >= resource.density * 15) ? resource.fore_Pixel : resource.back_Pixel; } } globals.gc.copy = set_or_make_gc(NULL, GXcopy, resource.fore_Pixel, resource.back_Pixel); globals.gc.rule = globals.gc.do_copy ? globals.gc.copy : set_or_make_gc(NULL, GXor, resource.fore_Pixel, resource.back_Pixel); globals.gc.fore = globals.gc.rule; globals.gc.fore2 = NULL; oldgamma = resource.gamma; } if (mane.shrinkfactor == 1) return; if (shrink_allocated_for < mane.shrinkfactor) { if (pixeltbl != NULL) free((char *)pixeltbl); pixeltbl = xmalloc((unsigned) (mane.shrinkfactor * mane.shrinkfactor + 1) * sizeof *pixeltbl); shrink_allocated_for = mane.shrinkfactor; } for (i = 0; i <= mane.shrinkfactor * mane.shrinkfactor; ++i) { pixeltbl[i] = palette[(i * 30 + mane.shrinkfactor * mane.shrinkfactor) / (2 * mane.shrinkfactor * mane.shrinkfactor)]; } } #endif /* COLOR */ xdvik-ja-22.84.16-j1.40/texk/xdvik/texmf/0000775000175000017500000000000011730170101017275 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/texk/xdvik/texmf/xdvi.cfg0000664000175000017500000000466311032450154020745 0ustar uwabamiuwabami% original xdvi.cfg -- Configuration file for the Type1 rendering module of xdvi. % (If you change or delete `original' in the first line of this file, % new xdvik installations won't overwrite the file.) % % Lines starting with `%' are comments. % % This file is not suitable for teTeX versions before 1.0. Users of % such or non-teTeX installations should have a look at the following % files instead: % % ../texmf-alt/xdvi.cfg % ../README.t1fonts % % For using this file with teTeX-1.0.x, please uncomment the line with % `psfonts.map' (preserving the order of the lines). % % For any later version of teTeX, no modification is needed. % % File version 1.2 % Original version by Nicolai Langfeldt 2001/06/05 % Changes by Thomas Esser for teTeX, Sat Nov 3 23:33:54 CET 2001. % =============== Section 1: Encodings =============== % % Here we list all the encodings we want xdvi to recognize as an % "implied" encoding. This means that a font named `ptmr8r' will % be treated as font `ptmr' encoded with `8r', and `ptmr8y' as % `ptmr' encoded with `8y'. Fonts that don not follow this convention % must have an explicit encoding entry in the map file. % % The encoding files used by xdvi are similar to those used by dvips, % whith the important exception that xdvi _cannot_ parse postscript, % so the vectors mustn't require postscript execution. %Keyword Suffix Encoding name Defined by this file enc 8r TeXBase1Encoding 8r.enc enc 8c CorkEncoding cork.enc enc 8y TeXnANSIEncoding texnansi.enc % =============== Section 2: Map files =============== % % A font map file is a mapping of TeX font names (and encodings) to % Postscript Type1 font names, similar to dvips' psfonts.map. See the % dvips documentation for more information about the font map file % format, and the file `README.t1fonts' in the xdvik source % distribution for information on the differences between dvips and % xdvik font maps. % % Multiple map files are allowed. If a font entry is found in several % files, later entries will override earlier ones (and a warning % will be printed to stderr). % % However, normally it isn't necessary to add any other map file here % because ps2pk.map is (normally) a generated file (by the updmap % script). Instead, map files should be added to the updmap.cfg file. % % ps2pk has no "built-in" fonts, just like xdvik, so its map file is used % for xdvik too. For teTeX-1.0, psfonts.map is needed in addition. % dvipsmap psfonts.map dvipsmap ps2pk.map xdvik-ja-22.84.16-j1.40/texk/xdvik/texmf/XDvi0000664000175000017500000003312211552011532020077 0ustar uwabamiuwabami!!! Global application defaults for XDvik !!! Install this file into $TEXMF/xdvi/XDvi !!! (use kpsewhich --expand-path '$TEXMF' to determine the location of !!! $TEXMF on you system). !!! !!! Lines commented out (starting with `!') are examples of !!! how to customize Xdvi for your personal needs. !!! To use these settings, copy them into your $HOME/.Xdefaults file !!! (remove the comments), prefix each line with `xdvi', and activate !!! them with: !!! $ xrdb -merge $HOME/.Xdefaults !!!------------------------------------------------------------------------------ !!!------------------------ useful global settings ------------------------------ !!!------------------------------------------------------------------------------ !!! Use `logical' (TeX) pages instead of physical pages for the `g' keystroke: *useTeXPages: True !!! A fairly high resolution, which usually gives better results for anti-aliasing !!! and greater flexibility for shrink values. Generating MF fonts shouldn't be an !!! issue when using T1lib. !*mfMode: ljfour *paper: a4 !!! This should be the best choice for modern displays with large color depth. *thorough: true !!! Add some useful translations for the mouse wheel (bug #1422928) *wheelTranslations:\ Shift:left(.08)\n\ Shift:right(.08)\n\ Ctrl:set-shrink-factor(+)\n\ Ctrl:set-shrink-factor(-)\n\ :wheel(-.7)\n\ :wheel(.7) !!!------------------------------------------------------------------------------ !!!------------------------------ Motif toolbar --------------------------------- !!!------------------------------------------------------------------------------ !!! filename of the XPM file used for the toolbar pixmaps: *toolbarPixmapFile: toolbar.xpm !!! Use toolbar buttons that are non-raised by default and only appear raised !!! when the mouse is over a button, as in e.g. Netscape 4.x: *toolbarButtonsRaised: False !!! don't draw a border around armed buttons: *button*highlightThickness: 0 !!! no extra margin above/below buttons *toolBar.marginHeight:0 !!! some spacing around button icons and button edges *toolBar*button*marginHeight: 2 *toolBar*button*marginWidth: 2 !!! don't draw the small grey rectangle inside the armed button: *button*fillOnArm: false !!! Or, for a more traditional Motif look, use something like: !*toolbarButtonsRaised: True !*button*fillOnArm: True !*button*shadowThickness: 1 !*toolBar.marginHeight: 0 !*toolBarFrame.marginWidth: 0 !*button*highlightThickness: 2 !!!------------------------------------------------------------------------------ !!!-------------------------------- Motif widgets ------------------------------- !!!------------------------------------------------------------------------------ !!! small shadows like in netscape 4.x *menuBar.shadowThickness: 1 *button*shadowThickness: 2 *toolBar.shadowThickness: 1 *toolBarFrame.shadowThickness: 1 *helppanel.shadowThickness: 1 *toolBarFrame.marginWidth: 2 *statusline*shadowThickness: 1 !!! prevent the Motif file selector widget from resizing itself, and start with a reasonable default: *resizePolicy: XmRESIZE_NONE *textColumns: 50 !!! make all text/entry fields white, for better contrasts: *XmDialogShell*XmTextField.background: white *XmDialogShell*XmText.background: white *XmDialogShell*XmList.background: white !!! adjust position of header in help window *help_window*right_form.topOffset: 10 !!!------------------------------------------------------------------------------ !!!----------------------------- Preferences window ----------------------------- !!!------------------------------------------------------------------------------ *XmComboBox*List*background: white *XmComboBox*Text*background: white *XmComboBox*Text*borderWidth: 2 *XmComboBox*Text*borderColor: black !!!------------------------------------------------------------------------------ !!!--------------------------------- Help window -------------------------------- !!!------------------------------------------------------------------------------ !!! (See also the fontList entries for TOPIC_LABEL and TOPIC_HEADING) !!! !!! Set this to something that fits to your font size: *help_text.rows: 23 *help_text.columns: 56 !!! fg/bg for help topics label *help_label*shadowThickness: 2 !!! ... if you want a more colorful label: !*help_label*foreground: blue4 !*help_label*background: grey90 !!! help topics label for Xaw *help_label.font: -*-helvetica-bold-r-*-*-14-*-*-*-*-*-*-* !!!------------------------------------------------------------------------------ !!!-------------------------------- Motif tooltips ------------------------------ !!!------------------------------------------------------------------------------ !!! background color and font: *tipShell.background: cornsilk *tipShell.fontSet: -*-helvetica-medium-r-*-*-12-*-*-*-*-*-* !!! time the mouse needs to stay on a button until tooltips pop up, !!! in milliseconds; set to a negative value to disable: *tipShell.waitPeriod: 800 !!!------------------------------------------------------------------------------ !!!------------------------------ Fonts and colors ------------------------------ !!!------------------------------------------------------------------------------ *font: -*-helvetica-medium-r-*-*-12-*-*-*-*-*-* !!! Use a smaller font for the statusline in the Xaw version: *statusline.font: -*-helvetica-medium-r-*-*-10-*-*-*-*-*-* !!! Motif fonts. Meaning of the tags is: !!! NORMAL: Ordinary text, labels etc. !!! UNMARKED: Unmarked entries in page list !!! MARKED: Marked entries in page list, emphasized entries in other lists !!! TOPIC_LABEL: Label for topics list in help window !!! TOPIC_HEADING: Heading for help text in help window !!! *fontList: \ -*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*=NORMAL,\ -*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*=UNMARKED,\ -*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*=MARKED,\ -*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*=TOPIC_LABEL,\ -*-helvetica-bold-r-*-*-14-*-*-*-*-*-*-*=TOPIC_HEADING !!! Color used for page border, image bounding boxes and the ruler in `Ruler mode'. *highlight: red !!! Color used for the magnifier and its rulers: *rulecolor: blue !!!------------------------------------------------------------------------------ !!!---------------------------------- hyperlinks ------------------------------- !!!------------------------------------------------------------------------------ !!! Colors for unvisited and visited hyperlinks (can be any valid X color spec, !!! also in hex format): *linkColor: Blue2 *visitedLinkColor: Purple4 !!! Link style: !!! 0: no highlighting at all !!! 1: underline with linkColor !!! 2: no underlining, text with linkColor !!! 3: underlining and text with linkColor *linkStyle: 3 !!!------------------------------------------------------------------------------ !!!------------------------------ helper applications --------------------------- !!!------------------------------------------------------------------------------ !!! the editor used for `forward search'; can also be set via $EDITOR, $VISUAL !!! or $XEDITOR. Setting the X resource will override the environment variables. !!! The format strings `%l' and `%f' are optional. !!! You could use this for older emacsen that come with emacsclient: !*editor: emacsclient --no-wait +%l %f !!! and this for current emacs or xemacs that come with gnuclient (which is much better): !*editor: gnuclient -q +%l %f !!!------------------------------------------------------------------------------ !!!------------------------------ Xaw buttons and helptexts --------------------- !!!------------------------------------------------------------------------------ !!! The following sections are of a more esoteric nature, giving !!! examples for customizing the Xaw buttons and the help texts. !!! Maybe these are useful for i18n. !!!------------------------------ !!! This is the default Xaw button configuration: !!!------------------------------ ! *buttonTranslations: \ ! File_Open ...:select-dvi-file()\n\ ! File_Reload:reread-dvi-file()\n\ ! File_Back Hyperref:htex-back()\n\ ! File_Quit:quit()\n\ ! Page_First page:goto-page(1)\n\ ! Page_Page-10:back-page(10)\n\ ! Page_Page-5:back-page(10)\n\ ! Page_Prev:back-page(1)\n\ ! Page_Next:forward-page(1)\n\ ! Page_Page+5:forward-page(5)\n\ ! Page_Page+10:forward-page(10)\n\ ! Page_Last page:goto-page()\n\ ! Zoom_Full size:set-shrink-factor(1)\n\ ! Zoom_$%%:shrink-to-dpi(150)\n\ ! Zoom_$%%:shrink-to-dpi(100)\n\ ! Zoom_$%%:shrink-to-dpi(50)\n\ ! Zoom_Fit in window:set-shrink-factor()\n\ ! Options_View PS:set-ps(toggle)\n\ ! Options_Keep position:set-keep-flag()\n\ ! Help_About ...:popup-help(helpGeneral)\n\ ! Help_Page Motion ...:popup-help(helpPagemotion)\n\ ! Help_Other Commands ...:popup-help(helpOthercommands)\n\ ! Help_HyperTeX commands ...:popup-help(helpHypertex)\n\ ! Help_Source specials ...:popup-help(helpSourcespecials)\n !!!------------------------------ !!! help texts !!!------------------------------ !!!------------------------------ !!! about/general !!!------------------------------ ! *.helpGeneral: \ ! \n\ ! This is xdvik, CVS version.\n\ ! \n\ ! The xdvik project homepage is located at\n\ ! http://sourceforge.net/projects/xdvi,\n\ ! where you can find updates, report bugs and submit feature requests.\n\ ! \n\ ! Getting help and exiting xdvi\n\ ! \n\ ! h or ? or `Help' button\n\ ! Displays this help text.\n\ ! \n\ ! q or Control-C or Control-D or Cancel or Stop or Control-Z (VAX VMS)\n\ ! Quits the program.\n ! !!!------------------------------ !!! other commands !!!------------------------------ ! *helpOthercommands: \ ! \n\ ! Other Commands\n\ ! \n\ ! \n\ ! Control-F\n\ ! Find another DVI file.\n\ ! \n\ ! Control-L or Clear\n\ ! Redisplays the current page.\n\ ! \n\ ! Control-P\n\ ! Prints bitmap unit, bit order, and byte order.\n\ ! \n\ ! ^ or Home\n\ ! Move to the ``home'' position of the page. This is\n\ ! normally the upper left-hand corner of the page,\n\ ! depending on the margins as described in the -margins\n\ ! option, above.\n\ ! \n\ ! c Moves the page so that the point currently beneath the\n\ ! cursor is moved to the middle of the window. It also\n\ ! (gasp!) warps the cursor to the same place.\n\ ! \n\ ! G This key toggles the use of greyscale anti-aliasing for\n\ ! displaying shrunken bitmaps. In addition, the key\n\ ! sequences `0G' and `1G' clear and set this flag,\n\ ! respectively. See also the -nogrey option.\n\ ! \n\ ! k Normally when xdvi switches pages, it moves to the home\n\ ! position as well. The `k' keystroke toggles a `keep-\n\ ! position' flag which, when set, will keep the same\n\ ! position when moving between pages. Also `0k' and `1k'\n\ ! clear and set this flag, respectively. See also the\n\ ! -keep option.\n\ ! \n\ ! M Sets the margins so that the point currently under the\n\ ! cursor is the upper left-hand corner of the text in the\n\ ! page. Note that this command itself does not move the\n\ ! image at all. For details on how the margins are used,\n\ ! see the -margins option.\n\ ! \n\ ! P ``This is page number n.'' This can be used to make\n\ ! the `g' keystroke refer to actual page numbers instead\n\ ! of absolute page numbers.\n\ ! \n\ ! R Forces the dvi file to be reread. This allows you to\n\ ! preview many versions of the same file while running\n\ ! xdvi only once.\n\ ! \n\ ! s Changes the shrink factor to the given number. If no\n\ ! number is given, the smallest factor that makes the\n\ ! entire page fit in the window will be used. (Margins\n\ ! are ignored in this computation.)\n\ ! \n\ ! S Sets the density factor to be used when shrinking\n\ ! bitmaps. This should be a number between 0 and 100;\n\ ! higher numbers produce lighter characters.\n\ ! \n\ ! t Toggles to the next unit in a sorted list of TeX dimension\n\ ! units for the popup magnifier ruler.\n\ ! \n\ ! V Toggles Ghostscript anti-aliasing. Also `0V' and `1V' clear\n\ ! and enables this mode, respectively. See also the the\n\ ! -gsalpha option.\n\ ! \n\ ! x Toggles expert mode (in which the buttons do not appear).\n\ ! `1x' toggles display of the statusline at the bottom of\n\ ! the window.\n !!!------------------------------ !!! page motion !!!------------------------------ ! *helpPagemotion: \ ! \n\ ! Moving around in the document\n\ ! \n\ ! \n\ ! \n\ ! n or f or Space or Return or LineFeed or PgDn\n\ ! Moves to the next page (or to the nth next page if a\n\ ! number is given).\n\ ! \n\ ! p or b or Control-H or BackSpace or DELete or PgUp\n\ ! Moves to the previous page (or back n pages).\n\ ! \n\ ! u or Up-arrow\n\ ! Moves up two thirds of a window-full.\n\ ! \n\ ! d or Down-arrow\n\ ! Moves down two thirds of a window-full.\n\ ! \n\ ! l or Left-arrow\n\ ! Moves left two thirds of a window-full.\n\ ! \n\ ! r or Right-arrow\n\ ! Moves right two thirds of a window-full.\n\ ! \n\ ! g or j or End\n\ ! Moves to the page with the given number. Initially,\n\ ! the first page is assumed to be page number 1, but this\n\ ! can be changed with the `P' keystroke, below. If no\n\ ! page number is given, then it goes to the last page.\n\ ! \n\ ! < Move to first page in document.\n\ ! > Move to last page in document.\n !!!------------------------------ !!! end of helptexts !!!------------------------------ !!!------------------------------------------------------------------------------ !!!-------------- used for internal checking - DO NOT CHANGE THIS! -------------- !!!------------------------------------------------------------------------------ *appDefaultsFileVersion: 20030303 xdvik-ja-22.84.16-j1.40/texk/xdvik/exit-handlers.h0000664000175000017500000000262111032450154021077 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. * */ #ifndef EXIT_HANDLERS_H_ #define EXIT_HANDLERS_H_ typedef void (*exit_procedure) (void *); extern void unregister_exit_handler(exit_procedure proc); extern void register_exit_handler(exit_procedure proc, void *arg); extern void call_exit_handlers(void); #endif /* EXIT_HANDLERS_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/LESSTIF-BUGS0000664000175000017500000000304211032450154017747 0ustar uwabamiuwabami Bugs of current xdvik with LessTif ================================== This is a list of known bugs if current xdvik is compiled with lesstif-0.93.18 (in decreasing severity). Some of them may be bugs in xdvik, others bugs with LessTif. Currently I don't have time and/or deeper knowledge of X to look into them. People who are annoyed by these bugs should use either OpenMotif, or the Xaw version of xdvik instead. Ideas and tips are welcome ... -- S.U. - Page list: Toggling expert mode or the page list produces strange results when page list is switched on again: List appears too wide (hides part of horizontal scrollbar) and too short. When the page list preference is set to 'Off', the pagelist is displayed nevertheless (#1493853). - Main window layout: window is too narrow when starting in expert mode (e.g. 80x900) and too wide (entire screen) in non-expert mode. Workaround: Use -geometry argument to force a sensible window size. - Removing the scrollbars in expert mode doesn't work. - Newline character `\n' in LabelGadget texts doesn't cause a line break. Workaround: Xdvi uses shorter labels when compiled with LessTif. - Spinbox replacement in LessTif looks ugly. Workaround: Xdvi doesn't use Spinbox when compiled with LessTif. - Preferences window: Headings list (left window) is a few pixels too small, cutoff of longest title. The list has a horizontal scrollbar even though it's not needed, and the part that is cut off can't be scrolled to. Workaround: Use extra trailing whitespace for longest title in LessTif. xdvik-ja-22.84.16-j1.40/texk/xdvik/dl_list.h0000664000175000017500000000167611032450154017773 0ustar uwabamiuwabami#include #include "xdvi-config.h" #include "xdvi.h" #include "version.h" #include "kpathsea/c-stat.h" #include "kpathsea/hash.h" #include "kpathsea/tex-file.h" /* double linked list */ struct dl_list { void *item; struct dl_list *prev; struct dl_list *next; }; void dl_list_apply(struct dl_list *list, void (*func)(const void *item)); size_t dl_list_len(struct dl_list *list); struct dl_list *dl_list_head(struct dl_list *list); struct dl_list *dl_list_push_front(struct dl_list *list, void *item); struct dl_list *dl_list_insert(struct dl_list *list, void *item); struct dl_list *dl_list_truncate(struct dl_list *list); struct dl_list *dl_list_truncate_head(struct dl_list *list); struct dl_list *dl_list_remove(struct dl_list *list, const void *elem, int *count, void **item, Boolean (*compare_func)(const void *item1, const void *item2)); Boolean dl_list_remove_item(struct dl_list **list); xdvik-ja-22.84.16-j1.40/texk/xdvik/hypertex.h0000664000175000017500000000554010363262237020214 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef HYPERTEX_H_ #define HTEXTEX_H_ /* fallbacks if parsing user-specified colors fails */ #define LINK_COLOR_FALLBACK "BLUE2" #define VISITED_LINK_COLOR_FALLBACK "Purple4" extern const char *is_local_file(const char *filename); extern void launch_program(const char *filename); extern void launch_xdvi(const char *filename, const char *anchor_name); extern Boolean htex_handleref(int x, int y, Boolean newwindow); extern void htex_reinit(void); extern void htex_resize_page(void); extern void htex_draw_anchormarkers(void); extern void htex_record_position(int, int, int, int); extern void htex_initpage(Boolean dvi_file_changed, Boolean size_changed, int pageno); typedef enum { HTEX_ANCHOR_NUM, HTEX_ANCHOR_STRING } htexPrescanTypeT; struct htex_prescan_data { int pageno; int anchor_num; htexPrescanTypeT scan_type; }; typedef enum { HTEX_TEXT, HTEX_IMG } htexObjectT; /* prescanning stuff */ extern Boolean htex_prescan_special(const char *str, int str_len, struct htex_prescan_data *data); extern int htex_prescan_get_depth(void); extern size_t htex_prescan_get_mismatched_anchor_num(size_t depth); extern void htex_prescan_save(void); extern void htex_prescan_reset_firstpass(void); extern void htex_prescan_restore(int pageno); extern void htex_prescan_initpage(void); extern void htex_prescan_carry_over(int old_page, int new_page); extern void htex_set_anchorsize(int x, int y, int w, int h); extern void htex_set_objecttype(htexObjectT type); extern void htex_reset_page(int pageno); extern void htex_displayanchor(int, int); extern void htex_set_anchormarker(int y); extern void htex_back(void); extern void htex_forward(void); extern Boolean htex_scan_anchor(const char *special, size_t len); #endif /* HTEXTEX_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/dvi-init.c0000664000175000017500000014561411614761145020073 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1990-2004 Paul Vojta 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. NOTE: xdvi is based on prior work, as noted in the modification history in xdvi.c. \*========================================================================*/ #include "xdvi-config.h" #include "xdvi.h" #include "dvi-init.h" #include "dvi-draw.h" #include "util.h" #include "x_util.h" #include "exit-handlers.h" #include "mime.h" #include "pagesel.h" #include "special.h" #include "hypertex.h" #include "kpathsea/c-fopen.h" #include "kpathsea/c-stat.h" #include "kpathsea/magstep.h" #include "kpathsea/tex-glyph.h" #include "dvi.h" #include "string-utils.h" #include "browser.h" #include "sfSelFile.h" #include "xm_toolbar.h" #include "pagehist.h" #if DELAYED_MKTEXPK #include "font-open.h" /* for reinit_missing_font_count() */ #endif #ifdef T1LIB #include "t1lib.h" #endif #include "message-window.h" #include "search-internal.h" #include "statusline.h" #include "events.h" #include "font-open.h" #define PK_PRE 247 #define PK_ID 89 #define PK_MAGIC ((PK_PRE << 8) | PK_ID) #define GF_PRE 247 #define GF_ID 131 #define GF_MAGIC ((GF_PRE << 8) | GF_ID) #define VF_PRE 247 #define VF_ID_BYTE 202 #define VF_MAGIC ((VF_PRE << 8) | VF_ID_BYTE) /* font stuff */ struct font *tn_table[TNTABLELEN]; struct font *font_head = NULL; struct tn *tn_head = NULL; wide_ubyte maxchar; unsigned short current_timestamp = 0; unsigned long magnification; double dimconv; double tpic_conv; /* Curently processed page number (starting at 0). */ int current_page = 0; int total_pages = 0; /* postamble offset is saved in this global variable */ long g_postamble_offset; static struct stat fstatbuf; static FILE *m_dvi_fp = NULL; /* original user's file */ static Boolean open_dvi_file(const char *filename, Boolean open_new_instance); /* * DVI preamble and postamble information. */ static unsigned long numerator, denominator; static unsigned int dvi_unshrunk_page_w, dvi_unshrunk_page_h; static unsigned int m_paper_unshrunk_w, m_paper_unshrunk_h; /* * Offset in DVI file of last page, set in read_postamble(). */ static long m_last_page_offset; static const char *dvi_err_list[] = { /* NO_ERROR */ "No Error", /* WRONG_DVI_VERSION */ "Wrong version of DVI output for this program", /* DVI_CORRUPTED */ "DVI file corrupted", /* NOT_A_DVI_FILE */ "Not a DVI file", /* POSTAMBLE_NO_POST */ "Postamble doesn't begin with POST", /* POSTAMBLE_NO_MATCH */ "Postamble doesn't match preamble", /* POSTAMBLE_NON_FNTDEF */ "Non-fntdef command found in postamble", /* NOT_ALL_PIXEL_FILES_FOUND */ "Not all pixel files were found", /* NO_BOP_AT_PAGEDESC */ "Page description doesn't begin with BOP", /* FILE_HAS_ZERO_SIZE */ "File has zero size", /* FILE_DOESNT_EXIST */ "No such file", /* FILE_IS_DIRECTORY */ "Is a directory", /* UNKNOWN_ERROR */ "An unknown error occurred" }; /* * access method for above list */ const char * get_dvi_error(dviErrFlagT flag) { ASSERT(flag < XtNumber(dvi_err_list), "Flag out of range"); return dvi_err_list[flag]; } /* * Extract the unit used in paper size specification. This information is used * to decide the initial grid separation. */ static int atopixunit(const char *arg) { int len = strlen(arg); /* check if the unit 'mm' or 'cm' occurs in the arg string */ return (len > 2 && (arg[len - 2] == 'c' || arg[len - 2] == 'm') && arg[len - 1] == 'm' ? 1.0 / 2.54 : 1.0) * resource.pixels_per_inch + 0.5; } /* * free_vf_chain frees the vf_chain structure. */ static void free_vf_chain(struct tn *tnp) { while (tnp != NULL) { struct tn *tnp1 = tnp->next; free((char *)tnp); tnp = tnp1; } } /* * delete glyph information in a font. */ static void delete_glyphs(struct font *fontp) { struct glyph *g; for (g = fontp->glyph; g <= fontp->glyph + fontp->maxchar; ++g) { if (g->bitmap2.bits) { free(g->bitmap2.bits); g->bitmap2.bits = NULL; } #ifdef GREY if (g->pixmap2) { XDestroyImage(g->image2); g->pixmap2 = NULL; if (g->pixmap2_gc2 != NULL) { free(g->pixmap2_gc2); g->pixmap2_gc2 = NULL; } } #if COLOR g->fg = NULL; #endif #endif } } /* * Release all shrunken bitmaps for all fonts. */ void reset_fonts(void) { struct font *f; for (f = font_head; f != NULL; f = f->next) { if ((f->flags & FONT_LOADED) && !(f->flags & FONT_VIRTUAL)) { delete_glyphs(f); } } } /* * free up fonts no longer in use. */ static void free_unused_fonts(void) { struct font *fontp; struct font **fontpp; fontpp = &font_head; while ((fontp = *fontpp) != NULL) { if (fontp->flags & FONT_IN_USE) fontpp = &fontp->next; else { if (globals.debug & DBG_PK) printf("xdvi: Discarding font \"%s\" at %d dpi\n", fontp->fontname, (int)(fontp->fsize + 0.5)); *fontpp = fontp->next; /* remove from list */ free(fontp->fontname); if (fontp->flags & FONT_LOADED) { if (fontp->file != NULL) { fclose(fontp->file); } free(fontp->filename); if (fontp->flags & FONT_VIRTUAL) { struct macro *m; for (m = fontp->macro; m <= fontp->macro + fontp->maxchar; ++m) if (m->free_me) free((char *)m->pos); free((char *)fontp->macro); free((char *)fontp->vf_table); free_vf_chain(fontp->vf_chain); } else { delete_glyphs(fontp); free((char *)fontp->glyph); } free((char *)fontp); } } } } #if COLOR /* * Release all allocated pixels, and (in greyscale mode) invalidate * all shrunken glyphs. */ void reset_colors(void) { if (color_list_len != 0) { XFreeColors(DISP, G_colormap, color_list, color_list_len, 0); color_list_len = 0; } while (bg_head != NULL) { struct bgrec *bgp; struct fgrec *fgp; for (fgp = bg_head->fg_head; fgp != NULL;) { struct fgrec *fgp1 = fgp->next; free(fgp); fgp = fgp1; } bgp = bg_head->next; free(bg_head); bg_head = bgp; } #if GREY if (resource.use_grey) { struct font *f; struct glyph *g; for (f = font_head; f != NULL; f = f->next) if ((f->flags & FONT_LOADED) && !(f->flags & FONT_VIRTUAL)) for (g = f->glyph; g <= f->glyph + f->maxchar; ++g) g->fg = NULL; } #endif /* GREY */ bg_current = NULL; fg_active = NULL; color_warned = False; } /* * All of the above, plus discard all scanned information. */ void full_reset_colors(void) { if (page_colors.stack != NULL) { size_t i; struct rgb *last_freed = &fg_initial; /* fprintf(stderr, "i: %d; last freed: %p\n", page_colors.size, &fg_initial); */ for (i = 0; i < page_colors.size; ++i) { if (page_colors.stack[i].colorstack != last_freed) { last_freed = page_colors.stack[i].colorstack; /* BUG ALERT: don't free &fg_initial, else segfault with changing foreground in xm_colorsel.c! */ if (last_freed != NULL && last_freed != &fg_initial) { /* fprintf(stderr, "freeing %d: %p\n", i, last_freed); */ free(last_freed); } } } free(page_colors.stack); page_colors.stack = NULL; } reset_colors(); } #endif /* COLOR */ /* * realloc_font allocates the font structure to contain (newsize + 1) * characters. */ void realloc_font(struct font *fontp, wide_ubyte newsize) { struct glyph *glyph; glyph = fontp->glyph = xrealloc(fontp->glyph, (unsigned int)(newsize + 1) * sizeof(struct glyph)); if (newsize > fontp->maxchar) memset((char *)(glyph + fontp->maxchar + 1), 0, (int)(newsize - fontp->maxchar) * sizeof(struct glyph)); maxchar = fontp->maxchar = newsize; } /* * realloc_virtual_font does the same thing for virtual fonts. */ void realloc_virtual_font(struct font *fontp, wide_ubyte newsize) { struct macro *macro; macro = fontp->macro = xrealloc(fontp->macro, (unsigned int)(newsize + 1) * sizeof(struct macro)); if (newsize > fontp->maxchar) memset((char *)(macro + fontp->maxchar + 1), 0, (int)(newsize - fontp->maxchar) * sizeof(struct macro)); maxchar = fontp->maxchar = newsize; } /* * load_font locates the t1 font or raster file and reads the index of * characters, plus whatever other preprocessing is done (depending on * the format). * * Returns True if sucessful, False if not. */ Boolean load_font(struct font *fontp, Boolean use_t1lib #if DELAYED_MKTEXPK , Boolean load_font_now #endif ) { double fsize = fontp->fsize; int dpi = fsize + 0.5; char *font_found; int size_found; int magic; Boolean hushcs = resource.hush_chk; fontp->file = NULL; /* BUG ALERT: This used to be: * * if (--globals.ev.ctr == 0) { * read_events(EV_GE_IDLE); * } * force_statusline_update(); * XSync(DISP, False); * * The idea was to update the `loading fonts ...' popup. However, * calling read_events() here may call dvi_file_changed() if the * user clicks on the window, which calls file_exists_p(), and * that changes m_dvi_fp while it's still being used to read the * postamble (where load_font() is called from), which will cause * xdvi to crash! (bug #968127). * * Sadly, without this update, the `loading fonts' popup doesn't * appear before the main window comes up ... */ fontp->file = font_open( #if DELAYED_MKTEXPK load_font_now, #endif fontp, (const char **)&font_found, &size_found, #ifdef T1LIB &fontp->t1id, #endif use_t1lib); #if DELAYED_MKTEXPK if (!load_font_now) return True; #endif #ifdef T1LIB if (fontp->t1id >= 0 && use_t1lib) { /* It's a type1 font */ fontp->fsize = fsize; /* It comes in all sizes */ fontp->timestamp = ++current_timestamp; fontp->maxchar = maxchar = 255; fontp->set_char_p = set_t1_char; /* read_T1_char is a dummy */ fontp->read_char = read_T1_char; fontp->glyph = xmalloc (256 * sizeof (struct glyph)); memset((char *) fontp->glyph, 0, 256 * sizeof (struct glyph)); fontp->flags |= FONT_LOADED; if (font_found != NULL) { statusline_error(STATUS_MEDIUM, "Error: Can't find font %s; using %s instead. Expect ugly output.", fontp->fontname, font_found); force_statusline_update(); free(fontp->fontname); fontp->fontname = font_found; /* this has been allocated by font_open */ } return True; } #endif /* T1LIB */ /* when not using T1lib, fontp->file == NULL means total failure */ if (fontp->file == NULL) { if (globals.ev.flags & EV_GE_NEWDOC) return False; fontp->flags |= FONT_LOADED; /* as loaded as it'll get */ XDVI_ERROR((stderr, "Can't find font %s.%dpk", fontp->fontname, dpi)); return False; } fontp->flags |= FONT_LOADED; if (font_found != NULL && strcmp(fontp->fontname, font_found) != 0) { /* some other font used - FIXME: is there a more efficient way than strcmp() for checking this? */ statusline_error(STATUS_MEDIUM, "Can't find pixel font %s; using %s instead at %d dpi.", fontp->fontname, font_found, dpi); force_statusline_update(); free(fontp->fontname); fontp->fontname = font_found; /* this has been allocated by font_open */ hushcs = True; } else if (!kpse_bitmap_tolerance((double)size_found, fsize)) { /* a different size used */ statusline_error(STATUS_MEDIUM, "Can't find pixel font %s at %d dpi; using %d dpi instead.", fontp->fontname, dpi, size_found); force_statusline_update(); } /* PK version of some font found */ fontp->fsize = size_found; fontp->timestamp = ++current_timestamp; fontp->maxchar = maxchar = 255; fontp->set_char_p = set_char; magic = get_bytes(fontp->file, 2); switch(magic) { case PK_MAGIC: read_PK_index(fontp, (wide_bool)hushcs); break; #ifdef USE_GF case GF_MAGIC: read_GF_index(fontp, (wide_bool)hushcs); break; #endif case VF_MAGIC: if (resource.omega) maxchar = read_VF_index(fontp, (wide_bool)hushcs); else (void)read_VF_index(fontp, (wide_bool)hushcs); break; default: XDVI_FATAL((stderr, "Cannot recognize format for font file %s", fontp->filename)); break; } if (fontp->flags & FONT_VIRTUAL) { if (!resource.omega) { while (maxchar > 0 && fontp->macro[maxchar].pos == NULL) { --maxchar; } if (maxchar < 255) { realloc_virtual_font(fontp, (wide_ubyte)maxchar); } } } else { while (maxchar > 0 && fontp->glyph[maxchar].addr == 0) --maxchar; if (maxchar < 255) { realloc_font(fontp, (wide_ubyte)maxchar); } } return True; } /* * MAGSTEPVALUE - If the given magnification is close to a \magstep * or a \magstephalf, then return twice the number of \magsteps. * Otherwise return NOMAGSTP. */ #define NOMAGSTP (-29999) #define NOBUILD 29999 static int magstepvalue(float *mag) { int m = 0; double fmag = *mag; double xmag = resource.pixels_per_inch; float margin = fmag * 0.002; if (fmag < resource.pixels_per_inch) for (;;) { if (xmag - fmag < margin && -(xmag - fmag) < margin) { *mag = xmag; return m; } if (xmag < fmag) break; xmag *= 0.9128709292; --m; } else for (;;) { if (xmag - fmag < margin && -(xmag - fmag) < margin) { *mag = xmag; return m; } if (xmag > fmag) break; xmag *= 1.095445115; ++m; } return NOMAGSTP; } /* * reuse_font recursively sets the flags for font structures being reused. */ static void reuse_font(struct font *fontp) { struct font **fp; struct tn *tnp; if (fontp->flags & FONT_IN_USE) return; fontp->flags |= FONT_IN_USE; if (resource.list_fonts) printf("xdvi: (reusing) %s at %d dpi\n", fontp->fontname, (int)(fontp->fsize + 0.5)); if (fontp->flags & FONT_VIRTUAL) { for (fp = fontp->vf_table; fp < fontp->vf_table + VFTABLELEN; ++fp) if (*fp != NULL) reuse_font(*fp); for (tnp = fontp->vf_chain; tnp != NULL; tnp = tnp->next) reuse_font(tnp->fontp); } } /* * define_font reads the rest of the fntdef command and then reads in * the specified pixel file, adding it to the global linked-list holding * all of the fonts used in the job. */ struct font * define_font( #if DELAYED_MKTEXPK Boolean read_fonts, /* reading font definitions */ Boolean initialize_fonts, /* also initializing internal data structures for fonts */ #else Boolean load_font_now, /* only scanning, or also loading the font? */ #endif FILE *file, wide_ubyte cmnd, struct font *vfparent, /* vf parent of this font, or NULL */ struct font **tntable, /* table for low TeXnumbers */ unsigned int tn_table_len, /* length of table for TeXnumbers */ struct tn **tn_headpp, /* addr of head of list of TeXnumbers */ Boolean *not_found_flag) /* signal that font hasn't been found */ { unsigned int TeXnumber; struct font *fontp; float fsize; double scale_dimconv; long checksum; int scale, orig_scale; int design; int magstepval; int len; char *fontname; int size; TeXnumber = get_bytes(file, (int)cmnd - FNTDEF1 + 1); checksum = get_bytes(file, 4); scale = orig_scale = get_bytes(file, 4); design = get_bytes(file, 4); len = get_byte(file); len += get_byte(file); /* sequence point in the middle */ #if DELAYED_MKTEXPK if (!read_fonts) { get_bytes(file, len); return NULL; } #else if (!load_font_now) return NULL; #endif fontname = xmalloc((unsigned)len + 1); (void)fread(fontname, sizeof(char), len, file); fontname[len] = '\0'; if (globals.debug & DBG_PK) printf("xdvi: Define font \"%s\" scale=%d design=%d number=%d\n", fontname, scale, design, TeXnumber); if (vfparent == NULL) { fsize = 0.001 * scale / design * magnification * resource.pixels_per_inch; scale_dimconv = dimconv; } else { /* * The scaled size is given in units of vfparent->scale * 2 ** -20 * SPELL units, so we convert it into SPELL units by multiplying by * vfparent->dimconv. * The design size is given in units of 2 ** -20 pt, so we convert * into SPELL units by multiplying by * (resource.pixels_per_inch * 2**16) / (72.27 * 2**20). */ fsize = (72.27 * (1 << 4)) * vfparent->dimconv * scale / design; scale_dimconv = vfparent->dimconv; /* Inherit the scale from the virtual parent */ scale = vfparent->scale * ((orig_scale * scale_dimconv / (1 << 20)) / vfparent->dimconv); } magstepval = magstepvalue(&fsize); size = fsize + 0.5; /* * reuse font if possible */ for (fontp = font_head;; fontp = fontp->next) { if (fontp == NULL) { /* if font doesn't exist yet */ if (resource.list_fonts) printf("xdvi: %s at %d dpi\n", fontname, (int)(fsize + 0.5)); fontp = xmalloc((unsigned)sizeof(struct font)); fontp->fontname = fontname; fontp->fsize = fsize; fontp->magstepval = magstepval; fontp->file = NULL; /* needed if it's a virtual font */ fontp->checksum = checksum; fontp->flags = FONT_IN_USE; fontp->dimconv = orig_scale * scale_dimconv / (1 << 20); fontp->set_char_p = load_n_set_char; fontp->scale = scale; if (vfparent == NULL) if (!load_font(fontp, resource.t1lib #if DELAYED_MKTEXPK , initialize_fonts #endif )) { if (globals.ev.flags & EV_GE_NEWDOC) { /* if aborting */ free(fontname); free(fontp); return NULL; } *not_found_flag = True; } fontp->next = font_head; font_head = fontp; break; } if (strcmp(fontname, fontp->fontname) == 0 && size == (int)(fontp->fsize + 0.5)) { /* if font already in use */ reuse_font(fontp); free(fontname); break; } } if (TeXnumber < tn_table_len) tntable[TeXnumber] = fontp; else { struct tn *tnp; tnp = xmalloc((unsigned)sizeof(struct tn)); tnp->next = *tn_headpp; *tn_headpp = tnp; tnp->TeXnumber = TeXnumber; tnp->fontp = fontp; } return fontp; } /* * process_preamble reads the information in the preamble and stores * it into global variables for later use. */ Boolean process_preamble(FILE *fp, dviErrFlagT *errflag) { ubyte k; static char job_id[300]; TRACE_FILES((stderr, "process_preamble: fp = %p, errflag = %d", (void *)fp, *errflag)); if (get_byte(fp) != PRE) { *errflag = NOT_A_DVI_FILE; TRACE_FILES((stderr, "process_preamble: fp = %p, errflag = %d, returning False", (void *)fp, *errflag)); return False; } if (get_byte(fp) != 2) { *errflag = WRONG_DVI_VERSION; TRACE_FILES((stderr, "process_preamble: fp = %p, errflag = %d, returning False", (void *)fp, *errflag)); return False; } numerator = get_bytes(fp, 4); denominator = get_bytes(fp, 4); magnification = get_bytes(fp, 4); dimconv = (((double)numerator * magnification) / ((double)denominator * 1000.)); dimconv = dimconv * (((long)resource.pixels_per_inch) << 16) / 254000; tpic_conv = resource.pixels_per_inch * magnification / 1000000.0; k = get_byte(fp); (void)fread(job_id, sizeof(char), (int)k, fp); job_id[k] = '\0'; TRACE_FILES((stderr, "process_preamble: fp = %p, errflag = %d, returning True", (void *)fp, *errflag)); return True; } /* * find_postamble locates the beginning of the postamble * and leaves the file ready to start reading at that location. */ #define TMPSIZ 516 /* 4 trailer bytes + 512 junk bytes allowed */ Boolean find_postamble(FILE *fp, dviErrFlagT *errflag) { long pos; ubyte temp[TMPSIZ]; ubyte *p; ubyte *p1; ubyte byte; TRACE_FILES((stderr, "find_postamble on fp: %p", (void *)fp)); fseek(fp, 0L, SEEK_END); pos = ftell(fp) - TMPSIZ; if (pos < 0) pos = 0; fseek(fp, pos, SEEK_SET); p = temp + fread((char *)temp, sizeof(char), TMPSIZ, fp); for (;;) { p1 = p; while (p1 > temp && *(--p1) != TRAILER); p = p1; while (p > temp && *(--p) == TRAILER); if (p <= p1 - 4) break; /* found 4 TRAILER bytes */ if (p <= temp) { *errflag = DVI_CORRUPTED; TRACE_FILES((stderr, "find_postamble: returning FALSE")); return False; } } pos += p - temp; byte = *p; while (byte == TRAILER) { fseek(fp, --pos, SEEK_SET); byte = get_byte(fp); } if (byte != 2) { *errflag = WRONG_DVI_VERSION; TRACE_FILES((stderr, "find_postamble: returning FALSE")); return False; } fseek(fp, pos - 4, SEEK_SET); fseek(fp, get_lbytes(fp, 4), SEEK_SET); TRACE_FILES((stderr, "find_postamble: returning TRUE")); return True; } Boolean set_paper_type(const char *arg) { const char *arg1; char temp[21]; const char **p; char *q; const char **paper_types = get_paper_types(); size_t paper_types_size = get_paper_types_size(); if (*arg == '+') { ++arg; ignore_papersize_specials = True; } if (strlen(arg) > sizeof(temp) - 1) return False; q = temp; for (;;) { /* convert to lower case */ char c = *arg++; if (c >= 'A' && c <= 'Z') c ^= ('a' ^ 'A'); *q++ = c; if (c == '\0') break; } arg = temp; /* perform substitutions */ for (p = paper_types; p < paper_types + paper_types_size; p += 2) { if (strcmp(temp, *p) == 0) { arg = p[1]; break; } } arg1 = strchr(arg, 'x'); if (arg1 == NULL) return False; m_paper_unshrunk_w = atopix(arg, False); m_paper_unshrunk_h = atopix(arg1 + 1, False); globals.grid_paper_unit = atopixunit(arg); return (m_paper_unshrunk_w != 0 && m_paper_unshrunk_h != 0); } /* * read_postamble reads the information in the postamble from fp, * storing it into global variables. * It also takes care of reading in all of the pixel files for the fonts * used in the job. * * FIXME: Would be better (speed up initialization when needing to generate fonts, * and allow to open window on first page) if the font loading was done on-demand later! */ Boolean read_postamble(FILE *fp, dviErrFlagT *errflag, #if DELAYED_MKTEXPK Boolean read_fonts, Boolean initialize_fonts #else Boolean load_fonts #endif ) { ubyte cmnd; Boolean font_not_found = False; struct font *fontp; #if DELAYED_MKTEXPK int tmp_total_pages; unsigned long tmp_numerator = numerator; unsigned long tmp_denominator = denominator; unsigned long tmp_magnification = magnification; unsigned int tmp_dvi_unshrunk_page_w, tmp_dvi_unshrunk_page_h; long tmp_last_page_offset; TRACE_FILES((stderr, "read_postamble: reading %p (%d, %d)", (void *)fp, read_fonts, initialize_fonts)); if (read_fonts && initialize_fonts) { /* clear existing font table */ memset((char *)tn_table, 0, (int)sizeof tn_table); free_vf_chain(tn_head); tn_head = NULL; for (fontp = font_head; fontp != NULL; fontp = fontp->next) fontp->flags &= ~FONT_IN_USE; } #else /* DELAYED_MKTEXPK */ TRACE_FILES((stderr, "read_postamble: reading %p (%d)", (void *)fp, load_fonts)); /* clear existing font table */ memset((char *)tn_table, 0, (int)sizeof tn_table); free_vf_chain(tn_head); tn_head = NULL; for (fontp = font_head; fontp != NULL; fontp = fontp->next) fontp->flags &= ~FONT_IN_USE; #endif /* DELAYED_MKTEXPK */ if (get_byte(fp) != POST) { *errflag = POSTAMBLE_NO_POST; TRACE_FILES((stderr, "read_postamble: returning FALSE")); return False; } #if DELAYED_MKTEXPK tmp_last_page_offset = get_bytes(fp, 4); if (read_fonts && initialize_fonts) m_last_page_offset = tmp_last_page_offset; if (tmp_numerator != get_bytes(fp, 4) || tmp_denominator != get_bytes(fp, 4) || tmp_magnification != get_bytes(fp, 4)) { *errflag = POSTAMBLE_NO_MATCH; TRACE_FILES((stderr, "read_postamble: returning FALSE")); return False; } else if (read_fonts && initialize_fonts) { numerator = tmp_numerator; denominator = tmp_denominator; magnification = tmp_magnification; } /* read largest box height and width */ tmp_dvi_unshrunk_page_h = (spell_conv(get_lbytes(fp, 4)) >> 16) + resource.yoffset_int; tmp_dvi_unshrunk_page_w = (spell_conv(get_lbytes(fp, 4)) >> 16) + resource.xoffset_int; (void)get_bytes(fp, 2); /* max stack size */ tmp_total_pages = get_bytes(fp, 2); if (read_fonts && initialize_fonts) { dvi_unshrunk_page_h = tmp_dvi_unshrunk_page_h; if (dvi_unshrunk_page_h < m_paper_unshrunk_h) dvi_unshrunk_page_h = m_paper_unshrunk_h; dvi_unshrunk_page_w = tmp_dvi_unshrunk_page_w; if (dvi_unshrunk_page_w < m_paper_unshrunk_w) dvi_unshrunk_page_w = m_paper_unshrunk_w; total_pages = tmp_total_pages; } #else /* DELAYED_MKTEXPK */ m_last_page_offset = get_bytes(fp, 4); if (numerator != get_bytes(fp, 4) || denominator != get_bytes(fp, 4) || magnification != get_bytes(fp, 4)) { *errflag = POSTAMBLE_NO_MATCH; TRACE_FILES((stderr, "read_postamble: returning FALSE")); return False; } /* read largest box height and width */ dvi_unshrunk_page_h = (spell_conv(get_lbytes(fp, 4)) >> 16) + resource.yoffset_int; if (dvi_unshrunk_page_h < m_paper_unshrunk_h) dvi_unshrunk_page_h = m_paper_unshrunk_h; dvi_unshrunk_page_w = (spell_conv(get_lbytes(fp, 4)) >> 16) + resource.xoffset_int; if (dvi_unshrunk_page_w < m_paper_unshrunk_w) dvi_unshrunk_page_w = m_paper_unshrunk_w; (void)get_bytes(fp, 2); /* max stack size */ total_pages = get_bytes(fp, 2); #endif /* DELAYED_MKTEXPK */ /* read font definitions */ while ((cmnd = get_byte(fp)) >= FNTDEF1 && cmnd <= FNTDEF4) { struct font *f = define_font( #if DELAYED_MKTEXPK read_fonts, initialize_fonts, #else load_fonts, #endif fp, cmnd, (struct font *)NULL, tn_table, TNTABLELEN, &tn_head, &font_not_found); if ( #if DELAYED_MKTEXPK read_fonts && initialize_fonts #else load_fonts #endif && f == NULL) { TRACE_FILES((stderr, "read_postamble: returning FALSE")); return False; } #if !DELAYED_MKTEXPK else if (!load_fonts) { /* return early */ TRACE_FILES((stderr, "read_postamble: returning TRUE")); return True; } #endif } if (cmnd != POSTPOST) { *errflag = POSTAMBLE_NON_FNTDEF; TRACE_FILES((stderr, "read_postamble: returning FALSE")); return False; } if ( #if DELAYED_MKTEXPK read_fonts && initialize_fonts && #endif font_not_found) { *errflag = NOT_ALL_PIXEL_FILES_FOUND; TRACE_FILES((stderr, "read_postamble: returning FALSE")); return False; } #if DELAYED_MKTEXPK if (read_fonts && initialize_fonts) free_unused_fonts(); #else free_unused_fonts(); #endif TRACE_FILES((stderr, "read_postamble: returning TRUE")); return True; } static Boolean prepare_pages(dviErrFlagT *errflag) { int i; long offset; TRACE_FILES((stderr, "calling pageinfo_deallocate")); pageinfo_deallocate(); TRACE_FILES((stderr, "pageinfo_allocate for %d pages", total_pages + 1)); pageinfo_allocate(total_pages + 1); pageinfo_set_page_width(total_pages, m_paper_unshrunk_w); pageinfo_set_page_height(total_pages, m_paper_unshrunk_h); pageinfo_set_window_width(total_pages, dvi_unshrunk_page_w); pageinfo_set_window_height(total_pages, dvi_unshrunk_page_h); pageinfo_set_offset(total_pages - 1, m_last_page_offset); /* * Follow back pointers through pages in the DVI file, * storing the offsets in the pageinfo table. */ for (offset = m_last_page_offset, i = total_pages; i > 0; i--) { fseek(globals.dvi_file.bak_fp, offset, SEEK_SET); if (get_byte(globals.dvi_file.bak_fp) != BOP) { *errflag = NO_BOP_AT_PAGEDESC; return False; } pageinfo_set_offset(i-1, offset); /* from c_0, read count0, the TeX page number */ pageinfo_set_number(i-1, get_bytes(globals.dvi_file.bak_fp, 4)); /* skip c_1 to c_9 */ fseek(globals.dvi_file.bak_fp, 9*4L, SEEK_CUR); /* next 4 byte contain offset to previous bop */ offset = get_bytes(globals.dvi_file.bak_fp, 4); } /* If not prescanning, initialize page sizes. */ if (!resource.prescan) { for (i = 0; i < total_pages; ++i) { pageinfo_set_page_width(i, m_paper_unshrunk_w); pageinfo_set_page_height(i, m_paper_unshrunk_h); pageinfo_set_window_width(i, dvi_unshrunk_page_w); pageinfo_set_window_height(i, dvi_unshrunk_page_h); } } return True; } void init_page(void) { if (globals.dvi_file.bak_fp == NULL) return; globals.page.unshrunk_w = pageinfo_get_page_width(current_page); globals.page.unshrunk_h = pageinfo_get_page_height(current_page); globals.page.w = ROUNDUP(globals.page.unshrunk_w, mane.shrinkfactor) + 2; globals.page.h = ROUNDUP(globals.page.unshrunk_h, mane.shrinkfactor) + 2; TRACE_FILES((stderr, "init_page: setting globals.page.w = %d, globals.page.h = %d", globals.page.w, globals.page.h)); } #ifndef S_ISDIR #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif static char *m_tmp_dvi_name = NULL; /* name of backup file for useTempFp */ /* access function for backup file name */ char *get_tmp_dvi_name(void) { return m_tmp_dvi_name; } static void remove_tmp_dvi_file(void *dummy) { UNUSED(dummy); if (m_tmp_dvi_name != NULL) { unlink(m_tmp_dvi_name); free(m_tmp_dvi_name); } m_tmp_dvi_name = NULL; } static FILE * make_backup_fp(FILE *source_fp, FILE *target_fp) { static Boolean first_time = True; static int tmp_fd = 0; #if !HAVE_FTRUNCATE /* in this case, we can't use ftruncate() on the existing temp file - just close the existing one, and set flag to open a new one */ remove_tmp_dvi_file(NULL); if (target_fp != NULL) fclose(target_fp); /* make sure we use a new temp file, else we'd have a race condition after closing it */ first_time = True; #endif if (first_time) { /* doesn't exist yet, create it */ if ((tmp_fd = xdvi_temp_fd(&m_tmp_dvi_name)) == -1) { XDVI_ERROR((stderr, "error creating temporary file - disabling `useTempFp'.")); resource.use_temp_fp = False; remove_tmp_dvi_file(NULL); return NULL; } /* fprintf(stderr, "temporary file name: |%s|, %d\n", m_tmp_dvi_name, tmp_fd); */ TRACE_EVENTS((stderr, "Created temp file: |%s|\n", m_tmp_dvi_name)); if ((target_fp = try_fdopen(tmp_fd, "wb+")) == NULL) { XDVI_ERROR((stderr, "error opening temporary file (%s) - disabling `useTempFp'.", strerror(errno))); resource.use_temp_fp = False; remove_tmp_dvi_file(NULL); return NULL; } first_time = False; } else { /* if not first time, truncate the existing file, and position both files at beginning */ ASSERT(target_fp != NULL, ""); ASSERT(source_fp != NULL, ""); #if HAVE_FTRUNCATE if (ftruncate(tmp_fd, 0) < 0) { XDVI_ERROR((stderr, "Couldn't truncate file %s: %s - disabling `useTempFp'; target_fp: %p.", m_tmp_dvi_name, strerror(errno), target_fp)); resource.use_temp_fp = False; remove_tmp_dvi_file(NULL); fclose(target_fp); return NULL; } #endif fseek(target_fp, 0L, SEEK_SET); fseek(source_fp, 0L, SEEK_SET); } /* copy the file */ if (!copy_fp(source_fp, target_fp)) { XDVI_ERROR((stderr, "Error creating temporary file: %s\n" "- disabling `useTempFp'.", strerror(errno))); remove_tmp_dvi_file(NULL); resource.use_temp_fp = False; fclose(target_fp); target_fp = NULL; } /* rewind both files, else DVI parsing will fail! */ if (target_fp != NULL) { fflush(target_fp); } fseek(source_fp, 0L, SEEK_SET); if (target_fp != NULL) { fseek(target_fp, 0L, SEEK_SET); } return target_fp; } static Boolean file_exists_p(const char *path, dviErrFlagT *errflag) { TRACE_FILES((stderr, "file_exists_p for |%s|", path)); *errflag = UNKNOWN_ERROR; if ((m_dvi_fp = XFOPEN(path, OPEN_MODE)) == NULL) { /* fprintf(stderr, "after internal_open_dvi1: xfopen\n"); */ *errflag = FILE_DOESNT_EXIST; return False; } TRACE_FILES((stderr, "m_dvi_fp for |%s| = %p", path, (void *)m_dvi_fp)); /* fprintf(stderr, "after internal_open_dvi2: xfopen\n"); */ /* shouldn't happen */ if (fstat(fileno(m_dvi_fp), &fstatbuf) != 0 || S_ISDIR(fstatbuf.st_mode)) { /* if it's a directory */ *errflag = FILE_IS_DIRECTORY; fclose(m_dvi_fp); m_dvi_fp = NULL; return False; } /* If file has zero size, something has gone wrong with downloading it, and the user should already have been warned about that; just return in this case. TODO: can it still happen that we try to load such a file as .dvi file? (Will exit with `draw_part: unknown op-code xyz' or some such). In this case, it would be better to look at the preamble before entering the drawing loop. */ if (fstatbuf.st_size == 0) { *errflag = FILE_HAS_ZERO_SIZE; fclose(m_dvi_fp); m_dvi_fp = NULL; return False; } return True; } /* * internal_init_dvi is the main subroutine for reading the startup * information from the dvi file. */ static Boolean internal_init_dvi(dviErrFlagT *errflag, #if DELAYED_MKTEXPK Boolean read_fonts, Boolean initialize_fonts #else Boolean load_fonts #endif ) { char *icon_name = NULL, *title_name = NULL; have_src_specials = False; TRACE_FILES((stderr, "internal_init_dvi, globals.dvi_file.bak_fp = %p", (void *)globals.dvi_file.bak_fp)); if (!process_preamble(globals.dvi_file.bak_fp, errflag) || !find_postamble(globals.dvi_file.bak_fp, errflag) #if DELAYED_MKTEXPK || !read_postamble(globals.dvi_file.bak_fp, errflag, read_fonts, initialize_fonts) #else || !read_postamble(globals.dvi_file.bak_fp, errflag, load_fonts) || !prepare_pages(errflag) #endif ) { return False; } #if DELAYED_MKTEXPK if (!read_fonts || !initialize_fonts) /* return early */ return True; if (!prepare_pages(errflag)) return False; #endif if (current_page >= total_pages) current_page = total_pages - 1; globals.warn_spec_now = resource.warn_spec; globals.src.fwd_box_page = -1; search_reset_info(); if (globals.pausing.num_save != NULL) { free(globals.pausing.num_save); globals.pausing.num_save = NULL; } if (resource.pause && total_pages > 0) { globals.pausing.num_save = xmalloc(total_pages * sizeof *globals.pausing.num_save); memset(globals.pausing.num_save, 0, total_pages * sizeof *globals.pausing.num_save); } init_prescan(); /* this allocates icon_name and title_name */ get_icon_and_title(globals.dvi_name, &icon_name, &title_name); set_icon_and_title(icon_name, title_name); free(icon_name); free(title_name); icon_name = title_name = NULL; #if defined(MOTIF) && HAVE_XPM tb_check_navigation_sensitivity(current_page); #endif refresh_pagelist(total_pages, current_page); return True; } /* * internal_open_dvi does the real opening of the dvi file, and sets * globals.dvi_file.time. It returns True on success, and sets m_dvi_fp and globals.dvi_file.bak_fp. */ Boolean internal_open_dvi(const char *path, dviErrFlagT *errflag, #if DELAYED_MKTEXPK Boolean read_fonts, Boolean initialize_fonts #else Boolean load_fonts #endif ) { /* FILE *tmp_fp = NULL; */ /* static FILE *bak_fp = NULL; /\* re-use the temporary backup fp *\/ */ /* fprintf(stderr, "------------ opening: |%s|\n", path); */ #if DELAYED_MKTEXPK TRACE_FILES((stderr, "internal_open_dvi for |%s|; loading fonts: %d, %d", path, read_fonts, initialize_fonts)); #else TRACE_FILES((stderr, "internal_open_dvi for |%s|", path)); #endif close_old_filep(); if (!file_exists_p(path, errflag)) { /* this should set fstatbuf.st_mtime */ return False; } if (!resource.use_temp_fp || (globals.dvi_file.bak_fp = make_backup_fp(m_dvi_fp, globals.dvi_file.bak_fp)) == NULL) { globals.dvi_file.bak_fp = m_dvi_fp; } register_exit_handler(remove_tmp_dvi_file, NULL); globals.dvi_file.time = fstatbuf.st_mtime; if (!internal_init_dvi(errflag, #if DELAYED_MKTEXPK read_fonts, initialize_fonts #else load_fonts #endif )) { return False; } #if COLOR full_reset_colors(); #endif /* COLOR */ reset_papersize_special(); TRACE_FILES((stderr, "internal_open_dvi: SUCCESS!")); return True; } /* check whether `filename' is a DVI file, by checking if it exists, and if so, opening it and trying to read a DVI preamble from it: */ static char * is_dvi_file(const char *filename) { FILE *fp; struct stat statbuf; char *full_pathname; dviErrFlagT unused_error; TRACE_FILES((stderr, "is_dvi_file %s", filename)); TRACE_HTEX((stderr, "filename: |%s|", filename)); /* used to append `.dvi' if not already present, but that was a bad idea - if we have both foo.2 and foo.2.dvi, user will want to open `foo.2' (with some appropriate application) if the link points to that filename. This means that we need to have different semantics for filenames on the command-line and filenames in hyperlinks; the latter *must* specify an extension, the former may omit the extension and default to DVI files. */ /* if ((full_filename = filename_append_dvi(filename)) == NULL) { */ /* free(full_filename); */ /* return NULL; */ /* } */ /* TRACE_HTEX((stderr, "full_filename: |%s|\n", full_filename)); */ if ((full_pathname = find_file(filename, &statbuf, kpse_program_text_format)) == NULL) { return NULL; } else { char *tmp = canonicalize_path(full_pathname); free(full_pathname); full_pathname = tmp; } TRACE_HTEX((stderr, "is_dvi_file: full_pathname: |%s|", full_pathname)); if ((fp = XFOPEN(full_pathname, OPEN_MODE)) == NULL) { free(full_pathname); return NULL; } if (!process_preamble(fp, &unused_error)) { free(full_pathname); fclose(fp); return NULL; } fclose(fp); return full_pathname; } static void report_open_error(const char *msg, const char *filename, dviErrFlagT errflag) { const char *errmsg; switch(errflag) { case FILE_HAS_ZERO_SIZE: errmsg = "File has zero size"; break; case FILE_DOESNT_EXIST: errmsg = "No such file"; break; case FILE_IS_DIRECTORY: errmsg = "Is a directory"; break; default: errmsg = "An unknown error occurred"; break; } XDVI_ERROR((stderr, "%s: %s: %s", msg, filename, errmsg)); } /* Implements the algorithm for opening a DVI file from the command line. This is similar to `open_dvi_file()' in non-k xdvi. If the file does not already have `.dvi' extension, append `.dvi' and set tried_dvi_ext to True. Try to open this file. If the file doesn't exist, try the original file name. If this file doesn't exist either, exit with an error message `No such file or directory'. If tried_dvi_ext == True, also report that file.dvi didn't exist either. (A later function will check if the file really is a DVI file, and will use tried_dvi_ext for the same purpose). */ char * find_dvi_file(const char *filename, Boolean *tried_dvi_ext, Boolean from_file_history) { char *new_filename; size_t len; dviErrFlagT errflag; ASSERT(filename != NULL, "Filename argument in find_dvi_file() musn't be NULL"); len = strlen(filename); if (len < sizeof(".dvi") || strcmp(filename + len - sizeof(".dvi") + 1, ".dvi") != 0) { /* doesn't already have .dvi extension */ TRACE_HTEX((stderr, "|%s| doesn't have .dvi extension, appending ...", filename)); new_filename = xstrdup(filename); new_filename = xstrcat(new_filename, ".dvi"); *tried_dvi_ext = True; if (file_exists_p(new_filename, &errflag)) { /* file exists */ char *expanded_filename = expand_filename(new_filename, USE_CWD_PATH); free(new_filename); return expanded_filename; } else { /* don't report an error; will try verbatim filename next */ free(new_filename); } } /* try verbatim filename (might be strange things like `foo.wdvi') */ if (file_exists_p(filename, &errflag)) { char *expanded_filename = expand_filename(filename, USE_CWD_PATH); return expanded_filename; } else { if (*tried_dvi_ext) { if (!from_file_history) { XDVI_FATAL((stderr, "%s: %s, and %s.dvi doesn't exist either.", filename, get_dvi_error(errflag), filename)); } else { popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Could not open \"%s\": %s.\n", filename, get_dvi_error(errflag)); } } else { if (!from_file_history) { XDVI_FATAL((stderr, "%s: %s.", filename, get_dvi_error(errflag))); } /* else: file is from history; this is at startup, where we may loop through the history until we find a usable file. Don't report an error in this case. */ } } return NULL; } /* * A wrapper for open_dvi_file that can also deal with remote files/URLs, and other * file types. Returns the (newly malloc'ed) new dvi file name if it succeeds, NULL else. */ char * open_dvi_file_wrapper(const char *filename, Boolean from_command_line, Boolean open_new_instance, Boolean *tried_dvi_ext, Boolean from_file_history) { char *real_filename = NULL; char *new_dvi_name = NULL; char canonical_path[MAXPATHLEN + 1]; if (from_command_line) { TRACE_HTEX((stderr, "filename IS from commandline")); /* if filename is from command-line, we want to treat the file as a DVI file always (and NOT launch the browser or other programs; that'd just confuse people, who meant to launch *xdvi*). `find_dvi_file' tries to locate the file and does all error handling; on success, it returns a fully expanded filename. */ real_filename = find_dvi_file(filename, tried_dvi_ext, from_file_history); /* this allocates real_filename */ if (real_filename == NULL) return False; TRACE_HTEX((stderr, "filename |%s| %p from commandline;\ndvi_name: |%s|,\nfilename: |%s|%p", real_filename, real_filename, globals.dvi_name, filename, (void *)filename)); new_dvi_name = xstrdup(REALPATH(real_filename, canonical_path)); free(real_filename); TRACE_FILES((stderr, "new_dvi_name: |%s|", new_dvi_name)); return new_dvi_name; } else { /* if it's not from the command line (e.g. result of clicking Mouse-1 on a link); in this case we might fall back to using the browser. Check whether it's a local file: */ const char *filename_no_prefix; char *expanded_filename; TRACE_HTEX((stderr, "filename NOT from commandline")); if ((filename_no_prefix = is_local_file(filename)) != NULL) { /* if it's a local file, check whether it's a DVI file: */ if ((expanded_filename = is_dvi_file(filename_no_prefix)) != NULL) { /* yes, open it */ if (open_dvi_file(expanded_filename, open_new_instance)) { TRACE_FILES((stderr, "success: %p |%s|", expanded_filename, expanded_filename)); if (!open_new_instance) { new_dvi_name = expand_filename_append_dvi(expanded_filename, USE_DVI_PATH, True); TRACE_FILES((stderr, "new_dvi_name: %p |%s|", (void*)new_dvi_name, new_dvi_name)); } } free(expanded_filename); return new_dvi_name; } else { /* local file, but not a DVI file; try other viewers for this MIME type: */ TRACE_HTEX((stderr, "%s is NOT a DVI file", filename_no_prefix)); launch_program(filename); return NULL; } } else { /* not a local file, retrieve it with the browser: */ launch_browser(filename); return NULL; } } } static Boolean open_dvi_file(const char *filename, Boolean open_new_instance) { Boolean retval = True; char *anchor_name = resource.anchor_pos; TRACE_HTEX((stderr, "open_dvi_file: |%s| + |%s|", filename, anchor_name == NULL ? "" : anchor_name)); if (open_new_instance) { launch_xdvi(filename, anchor_name); } else { dviErrFlagT errflag = NO_ERROR; TRACE_HTEX((stderr, "internal_open_dvi: |%s|", filename)); if (!internal_open_dvi(filename, &errflag, True #if DELAYED_MKTEXPK , TRUE #endif )) { report_open_error("Cannot open DVI file", filename, errflag); retval = False; } } return retval; } /** ** form_dvi_property forms the property used to exhibit the dvi file name ** used as a window property (used for source specials). **/ void form_dvi_property(void) { #if 0 size_t len; unsigned long ino; int i; #endif if (m_dvi_fp == NULL) return; if (dvi_property != NULL) free(dvi_property); dvi_property_length = strlen(globals.dvi_name) + 1; /* also copy the terminating 0 */ dvi_property = xmalloc(dvi_property_length); /* NOTE: we don't use dvi_inode like non-k xdvi, since dvi_name is always fully expanded with xdvik. */ strcpy(dvi_property, globals.dvi_name); } /* access for m_dvi_fp */ void close_old_filep(void) { if (m_dvi_fp != NULL) { fclose(m_dvi_fp); m_dvi_fp = NULL; if (!resource.use_temp_fp) globals.dvi_file.bak_fp = NULL; } } /** ** Check for changes in dvi file. ** Return True if file has changed, False else. **/ Boolean dvi_file_changed(void) { TRACE_FILES((stderr, "dvi_file_changed: fp = %p?", (void *)m_dvi_fp)); /* fprintf(stderr, "m_dvi_fp3: %p (%s)\n", m_dvi_fp, globals.dvi_name); */ if (m_dvi_fp == NULL) { TRACE_FILES((stderr, "m_dvi_fp == NULL")); if (stat(globals.dvi_name, &fstatbuf) == 0 && fstatbuf.st_mtime != globals.dvi_file.time) { TRACE_FILES((stderr, "file changed")); if (resource.use_temp_fp) { dviErrFlagT errflag = NO_ERROR; #if !DELAYED_MKTEXPK if (resource.watch_file == 0.0) statusline_info(STATUS_MEDIUM, "File changed ..."); TRACE_FILES((stderr, "returning FALSE")); #endif if (file_exists_p(globals.dvi_name, &errflag) && process_preamble(m_dvi_fp, &errflag) && find_postamble(m_dvi_fp, &errflag) && read_postamble(m_dvi_fp, &errflag, False #if DELAYED_MKTEXPK , False #endif )) { TRACE_FILES((stderr, "File OK, reloading ...")); globals.ev.flags |= EV_RELOAD; return True; } else { #if DELAYED_MKTEXPK if (resource.watch_file == 0.0) statusline_info(STATUS_MEDIUM, "File corrupted (click on window to reload) ..."); TRACE_FILES((stderr, "returning FALSE")); #endif return False; } } /* Bug alert: Don't set EV_RELOAD again here, else xdvi can go into a stretch of time where it again and again tries to reload a file even if the user doesn't click on the canvas. */ /* else { globals.ev.flags |= EV_RELOAD; } */ TRACE_FILES((stderr, "returning TRUE")); return True; } else { TRACE_FILES((stderr, "file not changed")); } } /* BUG ALERT: Don't use fstat(fileno(m_dvi_fp) here; if file hase disappeared, this won't report an error! */ else if (stat(globals.dvi_name, &fstatbuf) != 0 /* stat failed ... */ || fstatbuf.st_mtime != globals.dvi_file.time /* ... or different timestamp, reload: */) { dviErrFlagT errflag = NO_ERROR; TRACE_FILES((stderr, "Stat failed, or different timestamp ...")); globals.dvi_file.time = 0; /* force reload next time also if stat failed */ if (resource.use_temp_fp) { /* in this case, reload only if file has been written completely */ if (resource.watch_file == 0.0) { statusline_info(STATUS_MEDIUM, "File corrupted (click on window to reload) ..."); globals.cursor.flags |= CURSOR_CORRUPTED; globals.ev.flags |= EV_CURSOR; } else { statusline_info(STATUS_MEDIUM, "File corrupted (will try to reload) ..."); } close_old_filep(); if (file_exists_p(globals.dvi_name, &errflag) && process_preamble(m_dvi_fp, &errflag) && find_postamble(m_dvi_fp, &errflag) && read_postamble(m_dvi_fp, &errflag, False #if DELAYED_MKTEXPK , False #endif )) { TRACE_FILES((stderr, "File OK, reloading ...")); globals.ev.flags |= EV_RELOAD; return True; } else { TRACE_FILES((stderr, "NO successful load: %s", get_dvi_error(errflag))); /* fprintf(stderr, "=========== NO successful load: %s\n", get_dvi_error(errflag)); */ return False; } } else { TRACE_FILES((stderr, "Not using temp fp, reloading...")); globals.ev.flags |= EV_RELOAD; return True; } } return False; } /** ** Reload the dvi file (unconditionally). Return True on success, False else. **/ Boolean load_dvi_file( #if !DELAYED_MKTEXPK Boolean load_fonts, #endif dviErrFlagT *errflag) { unsigned int old_page_w, old_page_h; static ino_t dvi_inode = 0; TRACE_FILES((stderr, "load_dvi_file: going to read %p", (void *)m_dvi_fp)); if (resource.use_temp_fp && m_dvi_fp != NULL) { /* in this case, reload only if file has been written completely */ *errflag = NO_ERROR; fseek(m_dvi_fp, 0L, SEEK_SET); if (!process_preamble(m_dvi_fp, errflag) || !find_postamble(m_dvi_fp, errflag) || !read_postamble(m_dvi_fp, errflag, #if DELAYED_MKTEXPK False, False #else True #endif )) { TRACE_FILES((stderr, "reading of %p failed: %s!", (void *)m_dvi_fp, get_dvi_error(*errflag))); return False; } } old_page_w = globals.page.w; old_page_h = globals.page.h; *errflag = NO_ERROR; #if DELAYED_MKTEXPK /* use same trick with reading postamble twice to first find names of PK fonts that need to be created. */ reset_missing_font_count(); kpse_set_program_enabled(kpse_any_glyph_format, False, kpse_src_compile); #endif if (!internal_open_dvi(globals.dvi_name, errflag, #if DELAYED_MKTEXPK True, False #else load_fonts #endif )) { XClearWindow(DISP, mane.win); xdvi_bell(); statusline_info(STATUS_MEDIUM, "%s: %s%s", globals.dvi_name, get_dvi_error(*errflag), resource.watch_file > 0.0 ? "; will try to reload ..." : " (click on window to reload)"); close_old_filep(); return False; } #if DELAYED_MKTEXPK /* second time */ kpse_set_program_enabled(kpse_any_glyph_format, True, kpse_src_compile); if (!internal_open_dvi(globals.dvi_name, errflag, True, True)) { XClearWindow(DISP, mane.win); xdvi_bell(); statusline_info(STATUS_MEDIUM, "%s: %s%s", globals.dvi_name, get_dvi_error(*errflag), resource.watch_file > 0.0 ? "; will try to reload ..." : " (click on window to reload)"); close_old_filep(); return False; } #endif else { /* success */ if (fstatbuf.st_ino != dvi_inode) { dvi_inode = fstatbuf.st_ino; form_dvi_property(); set_dvi_property(); } if (globals.page.w != old_page_w || globals.page.h != old_page_h) reconfig(); htex_reinit(); globals.cursor.flags &= ~CURSOR_CORRUPTED; return True; } } xdvik-ja-22.84.16-j1.40/texk/xdvik/events.c0000664000175000017500000043752011276240141017644 0ustar uwabamiuwabami/*======================================================================*\ Copyright (c) 1990-2004 Paul Vojta and others 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. NOTE: xdvi is based on prior work, as noted in the modification history in xdvi.c. \*========================================================================*/ #include "xdvi-config.h" #ifdef STDC_HEADERS # include # include #endif #include #include /* this defines FASYNC */ #ifdef HAVE_SYS_FCNTL_H # include /* Or this might define FASYNC */ #endif #include /* this defines SIOCSPGRP and FIOASYNC */ #include /* ignore HAVE_SYS_WAIT_H -- we always need WNOHANG */ #include "xdvi.h" /* this includes Xlib and Xutil are already included */ #include "xdvi-debug.h" #ifndef MOTIF #include /* for XtNresizable */ #endif #include #include /* for gettimeofday */ #include #include #include #include /* needed for def. of XtNiconX(??) */ #include "pagesel.h" #include "filehist.h" #include "special.h" #include "psgs.h" #include #include #include "util.h" #include "x_util.h" #include "string-utils.h" #include "print-dialog.h" #include "search-dialog.h" #include "sfSelFile.h" #include "mag.h" #include "help-window.h" #include "message-window.h" #include "dvi-draw.h" #include "statusline.h" #include "hypertex.h" #include "dvi-init.h" #include "Tip.h" #include "browser.h" #include "search-internal.h" #include "my-snprintf.h" #include "events.h" #include "selection.h" #include "encodings.h" #include "pagehist.h" #include "xm_colorsel.h" #include "xm_toolbar.h" #include "xaw_menu.h" #include "xm_menu.h" #include "xm_prefs.h" #include "xm_prefs_appearance.h" /* for update_preferences_expert() */ #include "xm_prefs_fonts.h" /* for update_preferences_color() */ #include "xm_prefs_page.h" /* for update_preferences_shrink() */ #ifdef X_NOT_STDC_ENV extern int errno; #endif /* X_NOT_STDC_ENV */ /* Linux prefers O_ASYNC over FASYNC; SGI IRIX does the opposite. */ #if !defined(FASYNC) && defined(O_ASYNC) # define FASYNC O_ASYNC #endif #if !defined(FLAKY_SIGPOLL) && !HAVE_STREAMS && !defined(FASYNC) # if !defined(SIOCSPGRP) || !defined(FIOASYNC) # define FLAKY_SIGPOLL 1 # endif #endif #ifndef FLAKY_SIGPOLL # ifndef SIGPOLL # define SIGPOLL SIGIO # endif # ifndef SA_RESTART # define SA_RESTART 0 # endif # if HAVE_STREAMS # include # ifndef S_RDNORM # define S_RDNORM S_INPUT # endif # ifndef S_RDBAND # define S_RDBAND 0 # endif # ifndef S_HANGUP # define S_HANGUP 0 # endif # ifndef S_WRNORM # define S_WRNORM S_OUTPUT # endif # endif /* HAVE_STREAMS */ #endif /* not FLAKY_SIGPOLL */ #if HAVE_SIGACTION && !defined SA_RESETHAND # ifdef SA_ONESHOT # define SA_RESETHAND SA_ONESHOT # else # undef HAVE_SIGACTION /* Needed for Mac OS X < 10.2 (9/2002) */ # endif #endif #if HAVE_POLL # include #else # if HAVE_SYS_SELECT_H # include # else # if HAVE_SELECT_H # include # endif # endif # define XIO_IN 1 # define XIO_OUT 2 #endif /* HAVE_POLL */ /* cannot be const since Stings in Action routines arent either */ static char *Act_true_retval = "true"; static char *Act_false_retval = "false"; static sigset_t all_signals; /* * Interrupt system for receiving events. The program sets a flag * whenever an event comes in, so that at the proper time (i.e., when * reading a new dvi item), we can check incoming events to see if we * still want to go on printing this page. This way, one can stop * displaying a page if it is about to be erased anyway. We try to read * as many events as possible before doing anything and base the next * action on all events read. * Note that the Xlib and Xt routines are not reentrant, so the most we * can do is set a flag in the interrupt routine and check it later. * Also, sometimes the interrupts are not generated (some systems only * guarantee that SIGIO is generated for terminal files, and on the system * I use, the interrupts are not generated if I use "(xdvi foo &)" instead * of "xdvi foo"). Therefore, there is also a mechanism to check the * event queue every 70 drawing operations or so. This mechanism is * disabled if it turns out that the interrupts do work. * For a fuller discussion of some of the above, see xlife in * comp.sources.x. */ /* * Signal flags */ /* This could be static volatile, but we want to avoid any optimizer bugs. */ VOLATILE unsigned int sig_flags = 0; #define SF_USR 1 #define SF_ALRM 2 #define SF_POLL 4 #define SF_CHLD 8 #define SF_TERM 16 #define SF_SEGV 32 static void do_sigusr(void); static void do_sigalrm(void); static void do_sigpoll(void); static void do_sigchld(void); static void do_sigterm(void); static void do_sigsegv(void); /* these must be in the same order as SF_*. The higher flags have higher priority, since these are checked first when resolving flags_to_sigproc[sig_flags]. Example: flag := SF_TERM | SF_CHLD = 24 flags_to_sigproc[24] => do_sigterm, which sets flag to 24 & ~SF_TERM == 8 then, in next check: flags_to_sigproc[8] => do_sigchld, which sets flag 8 & ~SF_CHLD == 0. */ #define SP0 do_sigusr #define SP1 do_sigalrm #define SP2 do_sigpoll #define SP3 do_sigchld #define SP4 do_sigterm #define SP5 do_sigsegv typedef void (*signalproc)(void); static const signalproc flags_to_sigproc[64] = { NULL, /* 1 */ SP0, /* 2 - 3 */ SP1, SP1, /* 4 - 7 */ SP2, SP2, SP2, SP2, /* 8 - 15 */ SP3, SP3, SP3, SP3, SP3, SP3, SP3, SP3, /* 16 - 31 */ SP4, SP4, SP4, SP4, SP4, SP4, SP4, SP4, SP4, SP4, SP4, SP4, SP4, SP4, SP4, SP4, /* 32 - 63 */ SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5 }; #undef SP0 #undef SP2 #undef SP3 #undef SP4 #undef SP5 /* file-static variables for prefix argument mechanism */ static Boolean m_have_arg = False; /* flag whether we have a possible prefix arg */ static int m_number = 0; /* prefix arg value, without the sign */ static int m_sign = 1; /* is prefix arg negative? */ /* to remember the scrollbar positions so that we can restore them when `keep position' is active and window is resized to full size (removing scrollbars) and then back (#810501) */ static int m_x_scroll = 0, m_y_scroll = 0; static int source_reverse_x, source_reverse_y; static int source_show_all; /* globals for color stuff */ Pixel plane_masks[4]; XColor color_data[2]; struct pagecolor_info page_colors = { 0, NULL }; struct rgb *color_bottom; unsigned int color_bot_size; /* number of entries */ struct colorframe *rcs_top; struct rgb fg_initial; /* Initial fg (from command line) */ struct rgb bg_initial; /* Initial bg */ struct bgrec *bg_head = NULL; /* head of list */ struct bgrec *bg_current = NULL; /* current bg value */ struct fgrec *fg_current; /* current fg value */ struct fgrec *fg_active = NULL; /* where the GCs are */ Pixel *color_list; /* list of colors */ unsigned int color_list_len = 0; /* current len of list*/ unsigned int color_list_max = 0; /* allocated size */ Boolean color_warned = False; void null_mouse(XEvent *event) { UNUSED(event); } mouse_proc mouse_motion = null_mouse; mouse_proc mouse_release = null_mouse; static void Act_digit(Widget, XEvent *, String *, Cardinal *); static void Act_find(Widget, XEvent *, String *, Cardinal *); static void Act_incremental_find(Widget, XEvent *, String *, Cardinal *); static void Act_find_next(Widget, XEvent *, String *, Cardinal *); static void Act_minus(Widget, XEvent *, String *, Cardinal *); static void Act_quit(Widget, XEvent *, String *, Cardinal *); static void Act_quit_confirm(Widget, XEvent *, String *, Cardinal *); static void Act_print(Widget, XEvent *, String *, Cardinal *); static void Act_save(Widget, XEvent *, String *, Cardinal *); static void Act_help(Widget, XEvent *, String *, Cardinal *); static void Act_goto_page(Widget, XEvent *, String *, Cardinal *); static void Act_declare_page_number(Widget, XEvent *, String *, Cardinal *); static void Act_toggle_mark(Widget, XEvent *, String *, Cardinal *); static void Act_home(Widget, XEvent *, String *, Cardinal *); static void Act_home_or_top(Widget, XEvent *, String *, Cardinal *); static void Act_end_or_bottom(Widget, XEvent *, String *, Cardinal *); static void Act_center(Widget, XEvent *, String *, Cardinal *); static void Act_left(Widget, XEvent *, String *, Cardinal *); static void Act_right(Widget, XEvent *, String *, Cardinal *); static void Act_up(Widget, XEvent *, String *, Cardinal *); static void Act_down(Widget, XEvent *, String *, Cardinal *); static void Act_up_or_previous(Widget, XEvent *, String *, Cardinal *); static void Act_down_or_next(Widget, XEvent *, String *, Cardinal *); static void Act_set_margins(Widget, XEvent *, String *, Cardinal *); static void Act_show_display_attributes(Widget, XEvent *, String *, Cardinal *); static void Act_set_density(Widget, XEvent *, String *, Cardinal *); static void Act_change_density(Widget, XEvent *, String *, Cardinal *); static void Act_fullscreen(Widget, XEvent *, String *, Cardinal *); #ifdef GREY static void Act_set_greyscaling(Widget, XEvent *, String *, Cardinal *); #endif #if COLOR static void Act_set_color(Widget, XEvent *, String *, Cardinal *); #endif static void Act_htex_anchorinfo(Widget, XEvent *, String *, Cardinal *); static void Act_reread_dvi_file(Widget, XEvent *, String *, Cardinal *); static void Act_select_dvi_file(Widget, XEvent *, String *, Cardinal *); static void Act_discard_number(Widget, XEvent *, String *, Cardinal *); static void Act_drag(Widget, XEvent *, String *, Cardinal *); static void Act_wheel(Widget, XEvent *, String *, Cardinal *); static void Act_motion(Widget, XEvent *, String *, Cardinal *); static void Act_release(Widget, XEvent *, String *, Cardinal *); static void Act_toggle_grid_mode(Widget, XEvent *, String *, Cardinal *); static void Act_source_special(Widget, XEvent *, String *, Cardinal *); static void Act_show_source_specials(Widget, XEvent *, String *, Cardinal *); static void Act_source_what_special(Widget, XEvent *, String *, Cardinal *); static void Act_unpause_or_next(Widget, XEvent *, String *, Cardinal *); static void Act_ruler_snap_origin(Widget w, XEvent *event, String *params, Cardinal *num_params); static void Act_load_url(Widget w, XEvent *event, String *params, Cardinal *num_params); #ifdef MOTIF static void Act_prefs_dialog(Widget w, XEvent *event, String *params, Cardinal *num_params); #endif static XtActionsRec m_actions[] = { {"digit", Act_digit}, {"mouse-modes", Act_mouse_modes}, {"switch-mode", Act_switch_mode}, {"minus", Act_minus}, {"recent-files", Act_recent_files}, {"quit", Act_quit}, {"quit-confirm", Act_quit_confirm}, {"print", Act_print}, {"save", Act_save}, {"find", Act_find}, {"incremental-find", Act_incremental_find}, {"find-next", Act_find_next}, {"help", Act_help}, {"goto-page", Act_goto_page}, {"use-tex-pages", Act_use_tex_pages}, {"forward-page", Act_forward_page}, {"back-page", Act_back_page}, {"toggle-mark", Act_toggle_mark}, {"declare-page-number", Act_declare_page_number}, {"home", Act_home}, {"home-or-top", Act_home_or_top}, {"end-or-bottom", Act_end_or_bottom}, {"center", Act_center}, {"set-keep-flag", Act_set_keep_flag}, {"left", Act_left}, {"right", Act_right}, {"up", Act_up}, {"down", Act_down}, {"up-or-previous", Act_up_or_previous}, {"down-or-next", Act_down_or_next}, {"set-margins", Act_set_margins}, {"show-display-attributes", Act_show_display_attributes}, {"set-shrink-factor", Act_set_shrink_factor}, {"shrink-to-dpi", Act_shrink_to_dpi}, {"set-density", Act_set_density}, {"change-density", Act_change_density}, {"fullscreen", Act_fullscreen}, #ifdef GREY {"set-greyscaling", Act_set_greyscaling}, #endif #if COLOR {"set-color", Act_set_color}, #endif #ifdef PS {"set-ps", Act_set_ps}, #endif {"htex-back", Act_htex_back}, {"htex-forward", Act_htex_forward}, {"htex-anchorinfo", Act_htex_anchorinfo}, #ifdef PS_GS {"set-gs-alpha", Act_set_gs_alpha}, #endif {"set-expert-mode", Act_set_expert_mode}, {"reread-dvi-file", Act_reread_dvi_file}, {"select-dvi-file", Act_select_dvi_file}, {"discard-number", Act_discard_number}, {"drag", Act_drag}, {"wheel", Act_wheel}, {"motion", Act_motion}, {"release", Act_release}, {"toggle-grid-mode", Act_toggle_grid_mode}, {"source-special", Act_source_special}, {"show-source-specials", Act_show_source_specials}, {"source-what-special", Act_source_what_special}, {"unpause-or-next", Act_unpause_or_next}, #if 0 /* not implemented yet */ {"set-papersize", Act_set_papersize}, {"set-paper-landscape", Act_set_paper_landscape}, #endif {"load-url", Act_load_url}, {"pagehistory-clear", Act_pagehistory_clear}, {"pagehistory-back", Act_pagehistory_back}, {"pagehistory-forward", Act_pagehistory_forward}, {"pagehistory-delete-backward", Act_pagehistory_delete_backward}, {"pagehistory-delete-forward", Act_pagehistory_delete_forward}, #ifdef MOTIF {"prefs-dialog", Act_prefs_dialog}, #endif {"magnifier", Act_magnifier}, {"ruler", Act_ruler}, {"ruler-snap-origin", Act_ruler_snap_origin}, {"text-selection", Act_text_selection}, {"do-href", Act_href}, {"do-href-newwindow", Act_href_newwindow}, {"switch-magnifier-units", Act_switch_magnifier_units}, }; /* * Access to m_actions */ int get_num_actions(void) { return XtNumber(m_actions); } XtActionsRec *get_actions(void) { return m_actions; } /* * Data for buffered events. */ #ifndef FLAKY_SIGPOLL static VOLATILE int event_freq = 70; #else #define event_freq 70 #endif static void can_exposures(struct WindowRec *windowrec); /* * Set the flag so that termination occurs, via the above routine. * This should be used in place of xdvi_exit() when there may be a * non-killable process running (e.g., anytime within read_events()). */ static void xdvi_normal_exit(void) { sig_flags |= SF_TERM; } static void xdvi_normal_exit_cb(XtPointer arg) { UNUSED(arg); sig_flags |= SF_TERM; } void xdvi_exit_callback(Widget w, XtPointer client_data, XtPointer call_data) { UNUSED(w); UNUSED(client_data); UNUSED(call_data); sig_flags |= SF_TERM; } /* * Event-handling routines. */ void expose(struct WindowRec *windowrec, int x, int y, unsigned int w, unsigned int h) { if (windowrec->min_x > x) windowrec->min_x = x; if (windowrec->max_x < (int)(x + w)) windowrec->max_x = x + w; if (windowrec->min_y > y) windowrec->min_y = y; if (windowrec->max_y < (int)(y + h)) windowrec->max_y = y + h; globals.ev.flags |= EV_EXPOSE; } void clearexpose(struct WindowRec *windowrec, int x, int y, unsigned w, unsigned h) { XClearArea(DISP, windowrec->win, x, y, w, h, False); expose(windowrec, x, y, w, h); } /* * Routines for X11 toolkit. */ static Position m_window_x, m_window_y; static Arg arg_xy[] = { {XtNx, (XtArgVal) &m_window_x}, {XtNy, (XtArgVal) &m_window_y}, }; #define get_xy() XtGetValues(globals.widgets.draw_widget, arg_xy, XtNumber(arg_xy)) static void warn_num_params(const char *act_name, String *params, int num_params, int max_params) { if (num_params > max_params) { XDVI_WARNING((stderr, "Too many parameters (%d) for action \"%s\", ignoring all after \"%s\"", num_params, act_name, params[max_params - 1])); } } struct xdvi_action * compile_action(const char *str) { const char *p, *p1, *p2, *end_cmd; XtActionsRec *actp; struct xdvi_action *ap; while (*str == ' ' || *str == '\t') ++str; if (*str == '\0' || *str == '\n') return NULL; p = str; /* find end of command name */ while (isalnum((int)*p) || *p == '-' || *p == '_') ++p; end_cmd = p; for (actp = m_actions; ; ++actp) { if (actp >= m_actions + XtNumber(m_actions)) { const char *tmp = strchr(str, '\0'); if (tmp == NULL) { tmp = p; } XDVI_WARNING((stderr, "Cannot compile action \"%.*s\".", (int)(tmp - str), str)); return NULL; } if (memcmp(str, actp->string, p - str) == 0 && actp->string[p - str] == '\0') break; } while (*p == ' ' || *p == '\t') ++p; if (*p != '(') { while (*p != '\0' && *p != '\n') ++p; XDVI_WARNING((stderr, "Syntax error in action %.*s.", (int)(p - str), str)); return NULL; } ++p; while (*p == ' ' || *p == '\t') ++p; for (p1 = p;; ++p1) { if (*p1 == '\0' || *p1 == '\n') { XDVI_WARNING((stderr, "Syntax error in action %.*s.", (int)(p1 - str), str)); return NULL; } if (*p1 == ')') break; } ap = xmalloc(sizeof *ap); ap->proc = actp->proc; ap->command = xstrndup(str, end_cmd - str); for (p2 = p1;; --p2) { if (p2 <= p) { /* if no args */ ap->num_params = 0; ap->param = NULL; break; } else if (p2[-1] != ' ' && p2[-1] != '\t') { /* we only deal with one arg here */ char *arg; arg = xmalloc(p2 - p + 1); memcpy(arg, p, p2 - p); arg[p2 - p] = '\0'; ap->num_params = 1; ap->param = arg; break; } } /* call recursivly; next will be either next parsed action, or NULL */ ap->next = compile_action(p1 + 1); return ap; } void handle_command(Widget widget, XtPointer client_data, XtPointer call_data) { struct xdvi_action *actp; UNUSED(call_data); /* call all actions registered for this event */ for (actp = (struct xdvi_action *)client_data; actp != NULL; actp = actp->next) { if (globals.debug & DBG_EVENT) fprintf(stderr, "calling action with param: %s\n", actp->param); (actp->proc)(widget, NULL, &actp->param, &actp->num_params); } } #ifdef MOTIF int set_bar_value(Widget bar, int value, int max) { XmScrollBarCallbackStruct call_data; #ifdef TEST_SCROLLING fprintf(stderr, "set_bar_value: val %d, max %d\n", value, max); #endif if (value > max) value = max; if (value < 0) value = 0; call_data.value = value; XtVaSetValues(bar, XmNvalue, value, NULL); XtCallCallbacks(bar, XmNvalueChangedCallback, &call_data); return value; } #endif void home(wide_bool scrl) { if (!scrl) XUnmapWindow(DISP, mane.win); # ifdef MOTIF { int value; if (!resource.keep_flag) { value = (globals.page.w - mane.width) / 2; if (value > resource.sidemargin_int / mane.shrinkfactor) value = resource.sidemargin_int / mane.shrinkfactor; (void)set_bar_value(globals.widgets.x_bar, value, (int)(globals.page.w - mane.width)); } value = (globals.page.h - mane.height) / 2; if (value > resource.topmargin_int / mane.shrinkfactor) value = resource.topmargin_int / mane.shrinkfactor; (void)set_bar_value(globals.widgets.y_bar, value, (int)(globals.page.h - mane.height)); } # else get_xy(); if (!resource.keep_flag && globals.widgets.x_bar != NULL) { int coord = (globals.page.w - mane.width) / 2; if (coord > resource.sidemargin_int / mane.shrinkfactor) coord = resource.sidemargin_int / mane.shrinkfactor; XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(m_window_x + coord)); } if (globals.widgets.y_bar != NULL) { int coord = (globals.page.h - mane.height) / 2; if (coord > resource.topmargin_int / mane.shrinkfactor) coord = resource.topmargin_int / mane.shrinkfactor; XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(m_window_y + coord)); } # endif /* MOTIF */ if (!scrl) { XMapWindow(DISP, mane.win); /* Wait for the server to catch up---this eliminates flicker. */ XSync(DISP, False); } #ifdef USE_PANNER handle_x_scroll(NULL, NULL, NULL, NULL); handle_y_scroll(NULL, NULL, NULL, NULL); #endif } /* * Same as home(), except move to the bottom of the page. */ static void home_bottom(wide_bool scrl) { UNUSED(scrl); XUnmapWindow(DISP, mane.win); #ifdef MOTIF { int value; if (!resource.keep_flag) { value = (globals.page.w - mane.width) / 2; if (value > resource.sidemargin_int / mane.shrinkfactor) value = resource.sidemargin_int / mane.shrinkfactor; (void)set_bar_value(globals.widgets.x_bar, value, (int)(globals.page.w - mane.width)); } (void)set_bar_value(globals.widgets.y_bar, (int)(globals.page.h - mane.height), (int)(globals.page.h - mane.height)); } #else /* MOTIF */ get_xy(); if (!resource.keep_flag && globals.widgets.x_bar != NULL) { int coord = (globals.page.w - mane.width) / 2; if (coord > resource.sidemargin_int / mane.shrinkfactor) coord = resource.sidemargin_int / mane.shrinkfactor; XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(m_window_x + coord)); } if (globals.widgets.y_bar != NULL) XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(m_window_y + (globals.page.h - mane.height))); #endif /* MOTIF */ XMapWindow(DISP, mane.win); /* Wait for the server to catch up---this eliminates flicker. */ XSync(DISP, False); #ifdef USE_PANNER handle_x_scroll(NULL, NULL, NULL, NULL); handle_y_scroll(NULL, NULL, NULL, NULL); #endif } #ifndef MOTIF static void handle_destroy_bar(Widget w, XtPointer client_data, XtPointer call_data) { UNUSED(w); UNUSED(call_data); *(Widget *) client_data = NULL; } #endif static Boolean resized = False; static void get_geom(void) { static Dimension new_clip_w, new_clip_h; static Arg arg_wh_clip[] = { {XtNwidth, (XtArgVal) &new_clip_w}, {XtNheight, (XtArgVal) &new_clip_h}, }; static Dimension window_w, window_h; static Arg arg_wh[] = { {XtNwidth, (XtArgVal) &window_w}, {XtNheight, (XtArgVal) &window_h}, }; int old_clip_w; #ifdef MOTIF /* event handlers for Motif scrollbars have already been added in create_initialize_widgets(), xdvi.c */ XtGetValues(globals.widgets.main_window, arg_wh, XtNumber(arg_wh)); #else XtGetValues(globals.widgets.vport_widget, arg_wh, XtNumber(arg_wh)); /* Note: widgets may be destroyed but not forgotten */ if (globals.widgets.x_bar == NULL) { globals.widgets.x_bar = XtNameToWidget(globals.widgets.vport_widget, "horizontal"); if (globals.widgets.x_bar != NULL) { XtAddCallback(globals.widgets.x_bar, XtNdestroyCallback, handle_destroy_bar, (XtPointer)&globals.widgets.x_bar); #ifdef USE_PANNER XtAddEventHandler(globals.widgets.x_bar, ButtonMotionMask | ButtonPressMask | ButtonReleaseMask, False, handle_x_scroll, NULL); #endif } } if (globals.widgets.y_bar == NULL) { globals.widgets.y_bar = XtNameToWidget(globals.widgets.vport_widget, "vertical"); if (globals.widgets.y_bar != NULL) { XtAddCallback(globals.widgets.y_bar, XtNdestroyCallback, handle_destroy_bar, (XtPointer)&globals.widgets.y_bar); #ifdef USE_PANNER XtAddEventHandler(globals.widgets.y_bar, ButtonMotionMask | ButtonPressMask | ButtonReleaseMask, False, handle_y_scroll, NULL); #endif } } #endif XtGetValues(globals.widgets.clip_widget, arg_wh_clip, XtNumber(arg_wh_clip)); old_clip_w = mane.width; /* we need to do this because sizeof(Dimension) != sizeof(int) */ mane.width = new_clip_w; mane.height = new_clip_h; if (old_clip_w == 0) { globals.ev.flags |= EV_NEWPAGE; } if (resource.keep_flag) { #ifndef MOTIF Dimension d; int curr_scroll; if ((globals.widgets.x_bar != NULL && m_x_scroll != 0) || (globals.widgets.y_bar != NULL && m_y_scroll != 0)) { get_xy(); } #endif if (globals.widgets.x_bar != NULL && m_x_scroll != 0) { #ifdef MOTIF if (m_x_scroll > 0) (void)set_bar_value(globals.widgets.x_bar, m_x_scroll, (int)(globals.page.w - mane.width)); #else XtVaGetValues(globals.widgets.clip_widget, XtNy, &d, NULL); curr_scroll = d - m_window_x; if (m_x_scroll > curr_scroll) { TRACE_GUI((stderr, "======== diff: %d", m_x_scroll - curr_scroll)); XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(m_x_scroll - curr_scroll)); } #endif } if (globals.widgets.y_bar != NULL && m_y_scroll != 0) { #ifdef MOTIF if (m_y_scroll > 0) (void)set_bar_value(globals.widgets.y_bar, m_y_scroll, (int)(globals.page.h - mane.height)); #else XtVaGetValues(globals.widgets.clip_widget, XtNy, &d, NULL); curr_scroll = d - m_window_y; if (m_y_scroll > curr_scroll) { TRACE_GUI((stderr, "======== diff: %d", m_y_scroll - curr_scroll)); XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(m_y_scroll - curr_scroll)); } #endif } } /* home(False); */ resized = False; } /* * Callback routines */ void handle_resize(Widget widget, XtPointer junk, XEvent *event, Boolean *cont) { UNUSED(widget); UNUSED(junk); UNUSED(event); UNUSED(cont); resized = True; #ifndef MOTIF handle_statusline_resize(); handle_pagelist_resize(); #endif } void reconfig(void) { /* Dimension x, y; */ if (globals.dvi_file.bak_fp == NULL) return; #ifndef MOTIF XtVaSetValues(globals.widgets.vport_widget, XtNresizable, (XtArgVal)False, NULL); #endif TRACE_GUI((stderr, "globals.widgets.draw_widget: w %d, h %d", globals.page.w, globals.page.h)); XtVaSetValues(globals.widgets.draw_widget, XtNwidth, (XtArgVal)globals.page.w, XtNheight, (XtArgVal)globals.page.h, NULL); #ifdef TEST_SCROLLING /* XtVaSetValues(globals.widgets.draw_background, XtNwidth, (XtArgVal)globals.page.w, XtNheight, (XtArgVal)globals.page.h, NULL); */ #endif #ifndef MOTIF handle_statusline_resize(); /* without this, statusline will disappear */ /* following not needed? */ /* handle_pagelist_resize(); */ #endif get_geom(); /* set_windowsize(&x, &y */ /* #ifndef MOTIF */ /* , get_panel_width() */ /* #endif */ /* ); */ /* XResizeWindow(DISP, XtWindow(globals.widgets.top_level), x, y); */ /* reconfigure_window(False, x, y, True); */ /* reconfig_window(); */ } int check_goto_page(int pageno, Boolean insert_into_pagehist) { int retval; if (pageno < 0) { xdvi_bell(); /* statusline_info(STATUS_SHORT, "Can't go to page %d, going to first page instead", pageno + 1); */ retval = 0; } else if (pageno >= total_pages) { xdvi_bell(); /* statusline_info(STATUS_SHORT, */ /* "Can't go to page %d, going to last page (%d) instead", */ /* pageno + 1, total_pages); */ retval = total_pages - 1; } else retval = pageno; if (insert_into_pagehist) { page_history_insert(retval); } return retval; } static int check_goto_tex_page(int pageno) { /* Translate from TeX page number to `real' page number if needed. Note that pageno is a C-style 0-based number, hence we add 1 for the argument of pageinfo_get_index_of_number(). */ int retval; if (resource.use_tex_pages) { int res = pageinfo_get_index_of_number(pageno + 1); if (res >= 0) retval = res; else { xdvi_bell(); if (pageno < 1) { /* statusline_info(STATUS_SHORT, "Can't go to page %d, going to first page instead", pageno + 1); */ retval = 0; } else { /* there is no quick way to determine the last page number in the TeX page index */ /* statusline_info(STATUS_SHORT, */ /* "Can't go to page %d, going to last page instead", */ /* pageno + 1); */ retval = total_pages - 1; } } page_history_insert(retval); } else { retval = check_goto_page(pageno, True); } return retval; } /* ||| * Currently the event handler does not coordinate XCopyArea requests * with GraphicsExpose events. This can lead to problems if the window * is partially obscured and one, for example, drags a scrollbar. */ /* * Actions for the translation mechanism. */ /* if there are global prefixes, return them in res and reset them to defaults */ static Boolean get_prefix_arg(int *res) { Boolean ret; *res = m_sign * m_number; ret = m_have_arg; /* reset global flags */ m_have_arg = False; m_number = 0; m_sign = 1; return ret; } Boolean get_int_arg(String *param, Cardinal *num_params, int *res) { if (*num_params > 0) { *res = atoi(*param); return True; } else { if (get_prefix_arg(res)) { /* prefix argument? */ return True; } } return False; } Boolean toggle_arg(int arg, String *param, Cardinal *num_params) { if (*num_params > 0) { if (**param != 't' && (atoi(*param) != 0) == arg) return False; } else { if (m_have_arg) { int tmparg = m_number; m_have_arg = False; m_number = 0; m_sign = 1; if ((tmparg != 0) == arg) return False; } } return True; } Boolean check_resource_expert(void *val, const char *param) { int j = strtol(param, (char **)NULL, 10); /* check if the j-1th bit is set: */ return (*(int *)val >> (j - 1)) & 1; } Boolean check_papersize(void *val, const char *param) { UNUSED(val); UNUSED(param); return False; /* TODO */ } Boolean check_paper_landscape(void *val, const char *param) { UNUSED(val); UNUSED(param); return False; /* TODO */ } /* comparison functions for the menu setting code */ Boolean check_toggle(void *val, const char *param) { Boolean *on = val; if (strcmp(param, "toggle") == 0) { return *on; } else { fprintf(stderr, "TODO: check_toggle: arg |%s|, curr: %d\n", param, *(int *)val); return *on; } } Boolean check_int(void *val, const char *param) { int i = strtol(param, (char **)NULL, 10); return i == *(int *)val; } void Act_ruler(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(params); UNUSED(num_params); MYTRACE((stderr, "ruler!\n")); if (dvi_file_changed()) { globals.ev.flags |= EV_RELOAD; return; } #ifdef MOTIF /* see xm_menu.c for an explanation of this */ if (event && pulldown_menu_active(event->xany.serial)) { return; } #endif if (bg_current == NULL) { /* HACK ALERT: we can arrive here after loading a new file via the file selector for which not all fonts have been generated. In that case, dereferencing bg_current would bomb. Try to recover by simply returning here. */ return; } show_ruler(event); globals.curr_mode = RULER_MODE_ACTIVE; globals.ev.flags |= EV_CURSOR; XFlush(DISP); show_distance_from_ruler(event, False); } void Act_text_selection(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(params); UNUSED(num_params); MYTRACE((stderr, "text selection!\n")); if (dvi_file_changed()) { globals.ev.flags |= EV_RELOAD; return; } #ifdef MOTIF /* see xm_menu.c for an explanation of this */ if (pulldown_menu_active(event->xany.serial)) { return; } #endif if (bg_current == NULL) { /* HACK ALERT: we can arrive here after loading a new file via the file selector for which not all fonts have been generated. In that case, dereferencing bg_current would bomb. Try to recover by simply returning here. */ return; } globals.curr_mode = TEXT_MODE_ACTIVE; globals.ev.flags |= EV_CURSOR; XFlush(DISP); text_selection_start(event); text_motion(event); } /**************************************************************************** * Actions specific to the handling of the magnifier */ void Act_magnifier(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); MYTRACE((stderr, "magnifier!\n")); if (dvi_file_changed()) { globals.ev.flags |= EV_RELOAD; return; } #ifdef MOTIF /* see xm_menu.c for an explanation of this */ if (pulldown_menu_active(event->xany.serial)) { return; } #endif if (bg_current == NULL) { /* HACK ALERT: we can arrive here after loading a new file via the file selector for which not all fonts have been generated. In that case, dereferencing bg_current would bomb. Try to recover by simply returning here. */ return; } if (event->type != ButtonPress || mouse_release != null_mouse || MAGNIFIER_ACTIVE || mane.shrinkfactor == 1 || *num_params != 1) { XBell(DISP, 0); if (mane.shrinkfactor == 1) { statusline_info(STATUS_SHORT, "No magnification available at shrink factor 1"); } return; } magnifier_move(*params, event); } void Act_switch_magnifier_units(Widget w, XEvent *event, String *params, Cardinal *num_params) { size_t k = 0; static char *TeX_units[] = { "mm", "pt", "in", "sp", "bp", "cc", "dd", "pc", "px", }; UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); for (k = 0; k < XtNumber(TeX_units); ++k) if (strcmp(resource.tick_units, TeX_units[k]) == 0) break; k++; if (k >= XtNumber(TeX_units)) k = 0; resource.tick_units = TeX_units[k]; if (globals.curr_mode == RULER_MODE_ACTIVE) { show_distance_from_ruler(event, False); } else { statusline_info(STATUS_SHORT, "Ruler units: %s\n", resource.tick_units); } } void Act_href(Widget w, XEvent *event, String *params, Cardinal *num_params) { int x, y; Window dummy; UNUSED(w); UNUSED(num_params); (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win, event->xkey.x, event->xkey.y, &x, &y, &dummy); if (params) { if (htex_handleref(x, y, False)) *params = Act_true_retval; else *params = Act_false_retval; } } void Act_href_newwindow(Widget w, XEvent *event, String *params, Cardinal *num_params) { int x, y; Window dummy; UNUSED(w); UNUSED(num_params); (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win, event->xkey.x, event->xkey.y, &x, &y, &dummy); if (params) { if (htex_handleref(x, y, True)) *params = Act_true_retval; else *params = Act_false_retval; } } static void Act_digit(Widget w, XEvent *event, String *params, Cardinal *num_params) { int digit; /* for overflow checks */ static const int MAXINT_QUOT = INT_MAX / 10; static const int MAXINT_MOD = INT_MAX % 10; UNUSED(w); UNUSED(event); if (*num_params != 1 || (digit = **params - '0') > 9) { xdvi_bell(); return; } m_have_arg = True; /* don't increment m_number if it would overflow */ if (m_number < MAXINT_QUOT || (m_number == MAXINT_QUOT && digit <= MAXINT_MOD)) { m_number = m_number * 10 + digit; if (resource.expert_mode & XPRT_SHOW_STATUSLINE) /* too distracting for stdout */ statusline_info(STATUS_SHORT, "numerical prefix: %s%d", m_sign < 0 ? "-" : "", m_number); } else { xdvi_bell(); statusline_info(STATUS_SHORT, "numerical prefix: %s%d: no larger value possible", m_sign < 0 ? "-" : "", m_number); } } static void Act_minus(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); m_have_arg = True; m_sign = -m_sign; if (m_number > 0) { if (resource.expert_mode & XPRT_SHOW_STATUSLINE) /* too distracting for stdout */ statusline_info(STATUS_SHORT, "numerical prefix: %s%d", m_sign < 0 ? "-" : "", m_number); } else { if (resource.expert_mode & XPRT_SHOW_STATUSLINE) /* too distracting for stdout */ statusline_info(STATUS_SHORT, "numerical prefix: %s", m_sign < 0 ? "-" : ""); } } static void Act_quit(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); #ifndef FLAKY_SIGPOLL if (globals.debug & DBG_EVENT) puts(event_freq < 0 ? "SIGPOLL is working" : "no SIGPOLL signals received"); #endif xdvi_normal_exit(); } static void Act_quit_confirm(Widget w, XEvent *event, String *params, Cardinal *num_params) { static Widget dialog = 0; UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); #ifndef FLAKY_SIGPOLL if (globals.debug & DBG_EVENT) puts(event_freq < 0 ? "SIGPOLL is working" : "no SIGPOLL signals received"); #endif /* already a quit dialog open? */ if (dialog != 0) { /* HACK ALERT: use brute force, since tests for XtIsRealized() or XtIsMapped() don't work?? Grabbing the server apparently has problems with Xaw, and it's not a nice solution anyway ... */ if (kill_message_window(dialog)) xdvi_bell(); } dialog = choice_dialog_sized(globals.widgets.top_level, MSG_QUESTION, SIZE_SMALL, NULL, #ifndef MOTIF "quit", #endif NULL, NULL, /* no pre_callbacks */ "OK", xdvi_normal_exit_cb, NULL, "Cancel", NULL, NULL, "Really quit xdvi?"); } static void Act_load_url(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(num_params); launch_browser(*params); } static void Act_print(Widget w, XEvent *event, String *params, Cardinal *num_params) { /* static so that we can pass them around to callbacks etc. */ static struct save_or_print_info info; static struct select_pages_info pinfo = { 0, 0, check_marked, { 0, NULL }, NO_ERROR }; static struct file_info finfo = { NULL, NULL, NULL, NULL, NULL }; static Boolean first_time = True; UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); if (first_time) { info.shell = info.printlog = NULL; info.act = FILE_PRINT; info.pinfo = &pinfo; info.finfo = &finfo; info.callbacks = NULL; first_time = False; } save_or_print_callback(&info); } static void Act_save(Widget w, XEvent *event, String *params, Cardinal *num_params) { /* static so that we can pass them around to callbacks etc. */ static struct save_or_print_info info; static struct select_pages_info pinfo = { 0, 0, check_marked, { 0, NULL }, NO_ERROR }; static struct file_info finfo = { NULL, NULL, NULL, NULL, NULL }; static Boolean first_time = True; UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); if (first_time) { info.shell = info.printlog = NULL; info.act = FILE_SAVE; info.pinfo = &pinfo; info.finfo = &finfo; info.callbacks = NULL; first_time = False; } save_or_print_callback(&info); } static void Act_find(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); dvi_find_string(NULL, False); } static void Act_incremental_find(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); isearch_start(); } static void Act_find_next(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); dvi_find_string(NULL, True); } static void Act_help(Widget w, XEvent *event, String *params, Cardinal *num_params) { char *arg = NULL; UNUSED(w); UNUSED(event); if (*num_params > 0) arg = *params; show_help(globals.widgets.top_level, arg); } static home_proc home_action = NULL; void goto_page(int new_page, home_proc proc, Boolean force) { /* SU: added clearing the window here, otherwise old window content will survive switching pages as long as globals.pausing.flag is active (i.e. when accidentally changing page instead of unpausing) */ if (globals.pausing.flag) { XClearWindow(DISP, mane.win); } if (globals.dvi_file.bak_fp == NULL) { current_page = new_page; /* so that xdvi gets the page change */ return; } xdvi_assert(XDVI_VERSION_INFO, __FILE__, __LINE__, new_page >= 0 && new_page < total_pages, "%d >= 0 && %d < %d", new_page, new_page, total_pages); if (current_page != new_page || force) { globals.cursor.flags &= ~CURSOR_LINK; /* disable link cursor if needed */ current_page = new_page; home_action = proc; globals.warn_spec_now = resource.warn_spec; /* this seems unneccessary */ /* if (!resource.keep_flag) */ /* home(False); */ #if defined(MOTIF) && HAVE_XPM tb_check_navigation_sensitivity(current_page); /* page_history_update_toolbar_navigation(); */ #endif maybe_scroll_pagelist(current_page, False); if (globals.pausing.num_save) globals.pausing.num = globals.pausing.num_save[new_page]; else globals.pausing.num = 0; /* Control-L (and changing the page) clears this box */ globals.src.fwd_box_page = -1; globals.ev.flags |= EV_NEWPAGE; XFlush(DISP); } } static void Act_goto_page(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; Boolean clear_statusline = False; UNUSED(w); UNUSED(event); warn_num_params("goto-page()", params, *num_params, 1); if (*num_params > 0) { if (**params == 'e') { arg = total_pages - 1; } else arg = atoi(*params) - globals.pageno_correct; } else { if (get_prefix_arg(&arg)) { clear_statusline = True; arg -= globals.pageno_correct; } else { arg = total_pages - 1; } } if (arg == total_pages - 1) { /* with TeX numbers, total_pages - 1 might not be found in the page list, so don't use check_goto_tex_page() in this case */ goto_page(check_goto_page(arg, True), resource.keep_flag ? NULL : home, False); } else { goto_page(check_goto_tex_page(arg), resource.keep_flag ? NULL : home, False); } search_signal_page_changed(); if (clear_statusline) statusline_clear(); statusline_erase("Page history:"); } void Act_recent_files(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); } void Act_use_tex_pages(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); if (*num_params == 0) { if (m_have_arg) { resource.use_tex_pages = (m_number != 0); m_have_arg = False; m_number = 0; m_sign = 1; } else { resource.use_tex_pages = !resource.use_tex_pages; } } else resource.use_tex_pages = (**params == 't' ? !resource.use_tex_pages : atoi(*params)); if (resource.use_tex_pages) { statusline_info(STATUS_SHORT, "Using TeX page numbers for \"g\", goto-page()"); } else { statusline_info(STATUS_SHORT, "Using physical page numbers for \"g\", goto-page()"); } store_preference(NULL, "useTeXPages", "%s", resource.use_tex_pages ? "True" : "False"); set_menu(&resource.use_tex_pages, Act_use_tex_pages, check_toggle); refresh_pagelist(total_pages, current_page); } void Act_forward_page(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; Boolean clear_statusline = False; UNUSED(w); UNUSED(event); if (!get_int_arg(params, num_params, &arg)) arg = 1; else clear_statusline = True; arg += current_page; if (arg == current_page) { /* zero argument -> redraw page */ globals.src.fwd_box_page = -1; search_reset_info(); globals.ev.flags |= EV_NEWPAGE; XFlush(DISP); statusline_info(STATUS_SHORT, "Page redrawn."); return; } else if (current_page >= total_pages - 1) { xdvi_bell(); /* statusline_info(STATUS_SHORT, "Last page of DVI file"); */ return; } goto_page(check_goto_page(arg, True), resource.keep_flag ? NULL : home, False); if (clear_statusline) statusline_clear(); statusline_erase("Page history:"); search_signal_page_changed(); } void Act_back_page(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; Boolean clear_statusline = False; UNUSED(w); UNUSED(event); if (!get_int_arg(params, num_params, &arg)) arg = 1; else clear_statusline = True; arg = current_page - arg; if (current_page == 0) { xdvi_bell(); /* statusline_info(STATUS_SHORT, "First page of DVI file"); */ return; } goto_page(check_goto_page(arg, True), resource.keep_flag ? NULL : home, False); if (clear_statusline) statusline_clear(); statusline_erase("Page history:"); search_signal_page_changed(); } static void Act_declare_page_number(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; UNUSED(w); UNUSED(event); if (globals.curr_mode == RULER_MODE_ACTIVE) { show_distance_from_ruler(event, True); return; } if (!get_int_arg(params, num_params, &arg)) { arg = 0; } globals.pageno_correct = arg - current_page; statusline_info(STATUS_SHORT, "Current page number set to %d", arg); } static void Act_toggle_mark(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; UNUSED(w); UNUSED(event); if (globals.dvi_file.bak_fp == NULL) return; if ( #ifdef MOTIF (resource.expert_mode & XPRT_SHOW_PAGELIST) == 0 #else (resource.expert_mode & XPRT_SHOW_BUTTONS) == 0 #endif ) { xdvi_bell(); statusline_info(STATUS_SHORT, "Expert mode: Page list not available."); return; } if (*num_params > 0) { arg = atoi(*params); if (arg < -1 || arg > 2) { xdvi_bell(); statusline_error(STATUS_SHORT, "Possible arguments: none (toggle current), " "-1 (mark all), 0 (unmark all), 1 (toggle odd), 2 (toggle even)"); } list_toggle_marks(arg); } else if (get_prefix_arg(&arg)) { list_toggle_marks(arg); statusline_clear(); } else { arg = current_page; list_toggle_current(arg); } } static void Act_home(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); home(True); } static void Act_home_or_top(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); if (resource.keep_flag) { String args[1]; args[0] = "10"; /* should be large enough ... */ XtCallActionProc(globals.widgets.top_level, "up", NULL, args, 1); } else { home(True); } } static void Act_end_or_bottom(Widget w, XEvent *event, String *params, Cardinal *num_params) { String args[1]; UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); args[0] = "10"; /* should be large enough ... */ XtCallActionProc(globals.widgets.top_level, "down", NULL, args, 1); if (!resource.keep_flag #ifndef MOTIF && globals.widgets.x_bar != NULL #endif ) { XtCallActionProc(globals.widgets.top_level, "right", NULL, args, 1); } } static void Act_center(Widget w, XEvent *event, String *params, Cardinal *num_params) { int x, y; UNUSED(w); UNUSED(params); UNUSED(num_params); #ifdef MOTIF /* The clip widget gives a more exact value. */ x = event->xkey.x - mane.width / 2; y = event->xkey.y - mane.height / 2; x = set_bar_value(globals.widgets.x_bar, x, (int)(globals.page.w - mane.width)); y = set_bar_value(globals.widgets.y_bar, y, (int)(globals.page.h - mane.height)); get_xy(); XWarpPointer(DISP, None, None, 0, 0, 0, 0, -x - m_window_x, -y - m_window_y); #else if (event == NULL) return; /* button actions do not provide events */ x = event->xkey.x - mane.width / 2; y = event->xkey.y - mane.height / 2; /* The clip widget gives a more exact value. */ if (globals.widgets.x_bar != NULL) XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(x)); if (globals.widgets.y_bar != NULL) XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(y)); XWarpPointer(DISP, None, None, 0, 0, 0, 0, -x, -y); #endif #ifdef USE_PANNER handle_x_scroll(NULL, NULL, NULL, NULL); handle_y_scroll(NULL, NULL, NULL, NULL); #endif } void Act_ruler_snap_origin(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(params); UNUSED(num_params); if (globals.curr_mode == RULER_MODE_ACTIVE) ruler_snap_origin(event); } #if 0 void Act_set_papersize(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(num_params); fprintf(stderr, "set_paperformat: %s\n", *params); resource.paper = *params; set_menu((void *)resource.paper, Act_set_papersize, check_papersize); } void Act_set_paper_landscape(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(num_params); resource.paper_landscape = !resource.paper_landscape; fprintf(stderr, "set_paper_landscape: %s\n", *params); set_menu((char *)resource.paper, Act_set_paper_landscape, check_paper_landscape); } #endif /* 0 */ void Act_set_keep_flag(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(event); UNUSED(w); if (*num_params == 0) { if (m_have_arg) { resource.keep_flag = (m_number != 0); m_have_arg = False; m_number = 0; m_sign = 1; } else { resource.keep_flag = !resource.keep_flag; } } else resource.keep_flag = (**params == 't' ? !resource.keep_flag : atoi(*params)); if (resource.keep_flag) { statusline_info(STATUS_SHORT, "Keeping position when switching pages"); } else { statusline_info(STATUS_SHORT, "Not keeping position when switching pages"); } store_preference(NULL, "keepPosition", "%s", resource.keep_flag ? "True" : "False"); set_menu(&resource.keep_flag, Act_set_keep_flag, check_toggle); } static void Act_left(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); do_autoscroll = False; warn_num_params("left()", params, *num_params, 1); #ifdef MOTIF get_xy(); #ifdef TEST_SCROLLING fprintf(stderr, "left for %p\n", (void *)w); fprintf(stderr, "window x: %d, y: %d\n", m_window_x, m_window_y); #endif (void)set_bar_value(globals.widgets.x_bar, (*num_params == 0 ? (-2 * (int)mane.width / 3) : (int)(-my_atof(*params) * mane.width)) - m_window_x, (int)(globals.page.w - mane.width)); #else if (globals.widgets.x_bar != NULL) XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(*num_params == 0 ? (-2 * (int)mane.width / 3) : (int)(-my_atof(*params) * mane.width))); else { xdvi_bell(); /* statusline_info(STATUS_SHORT, "Horizontal scrolling not possible"); */ } #endif #ifdef USE_PANNER handle_x_scroll(NULL, NULL, NULL, NULL); #endif } static void Act_right(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); do_autoscroll = False; warn_num_params("right()", params, *num_params, 1); #ifdef MOTIF get_xy(); #ifdef TEST_SCROLLING fprintf(stderr, "right for %p\n", (void *)w); fprintf(stderr, "window x: %d, y: %d\n", m_window_x, m_window_y); #endif (void)set_bar_value(globals.widgets.x_bar, (*num_params == 0 ? (2 * (int)mane.width / 3) : (int)(my_atof(*params) * mane.width)) - m_window_x, (int)(globals.page.w - mane.width)); #else if (globals.widgets.x_bar != NULL) XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(*num_params == 0 ? (2 * (int)mane.width / 3) : (int)(my_atof(*params) * mane.width))); else { xdvi_bell(); /* statusline_info(STATUS_SHORT, "Horizontal scrolling not possible"); */ } #endif #ifdef USE_PANNER handle_x_scroll(NULL, NULL, NULL, NULL); #endif } static void Act_up(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); do_autoscroll = False; warn_num_params("up()", params, *num_params, 1); #ifdef MOTIF #ifdef TEST_SCROLLING fprintf(stderr, "up for %p\n", (void *)w); #endif get_xy(); (void)set_bar_value(globals.widgets.y_bar, (*num_params == 0 ? (-2 * (int)mane.height / 3) : (int)(-my_atof(*params) * mane.height)) - m_window_y, (int)(globals.page.h - mane.height)); #else if (globals.widgets.y_bar != NULL) XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(*num_params == 0 ? (-2 * (int)mane.height / 3) : (int)(-my_atof(*params) * mane.height))); else { xdvi_bell(); /* statusline_info(STATUS_SHORT, "Vertical scrolling not possible"); */ } #endif #ifdef USE_PANNER handle_y_scroll(NULL, NULL, NULL, NULL); #endif } static void Act_down(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); do_autoscroll = False; warn_num_params("down()", params, *num_params, 1); #ifdef MOTIF #ifdef TEST_SCROLLING fprintf(stderr, "down for %p\n", (void *)w); #endif get_xy(); (void)set_bar_value(globals.widgets.y_bar, (*num_params == 0 ? (2 * (int)mane.height / 3) : (int)(my_atof(*params) * mane.height)) - m_window_y, (int)(globals.page.h - mane.height)); #else if (globals.widgets.y_bar != NULL) XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(*num_params == 0 ? (2 * (int)mane.height / 3) : (int)(my_atof(*params) * mane.height))); else { xdvi_bell(); /* statusline_info(STATUS_SHORT, "Vertical scrolling not possible"); */ } #endif #ifdef USE_PANNER handle_y_scroll(NULL, NULL, NULL, NULL); #endif } static void Act_down_or_next(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); do_autoscroll = False; warn_num_params("down-or-next()", params, *num_params, 1); #ifdef TEST_SCROLLING fprintf(stderr, "down-or-next for %p\n", (void *)w); #endif #ifdef MOTIF get_xy(); if (m_window_y > (int)mane.height - (int)globals.page.h) { (void)set_bar_value(globals.widgets.y_bar, (*num_params == 0 ? (2 * (int)mane.height / 3) : (int)(my_atof(*params) * mane.height)) - m_window_y, (int)(globals.page.h - mane.height)); return; } #else if (globals.widgets.y_bar != NULL) { get_xy(); if (m_window_y > (int)mane.height - (int)globals.page.h) { XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(*num_params == 0 ? (2 * (int)mane.height / 3) : (int)(my_atof(*params) * mane.height))); return; } } #endif if (current_page < total_pages - 1) { goto_page(current_page + 1, home, False); search_signal_page_changed(); } else { xdvi_bell(); /* statusline_info(STATUS_SHORT, "At bottom of last page"); */ } #ifdef USE_PANNER handle_y_scroll(NULL, NULL, NULL, NULL); #endif statusline_erase("Page history:"); } static void Act_up_or_previous(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); do_autoscroll = False; warn_num_params("up-or-previous()", params, *num_params, 1); #ifdef TEST_SCROLLING fprintf(stderr, "up-or-previous for %p\n", (void *)w); #endif #ifdef MOTIF get_xy(); if (m_window_y < 0) { (void)set_bar_value(globals.widgets.y_bar, (*num_params == 0 ? (-2 * (int)mane.height / 3) : (int)(-my_atof(*params) * mane.height)) - m_window_y, (int)(globals.page.h - mane.height)); return; } #else if (globals.widgets.y_bar != NULL) { get_xy(); if (m_window_y < 0) { XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(*num_params == 0 ? (-2 * (int)mane.height / 3) : (int)(-my_atof(*params) * mane.height))); return; } } #endif if (current_page > 0) { goto_page(current_page - 1, home_bottom, False); search_signal_page_changed(); } else { xdvi_bell(); /* statusline_info(STATUS_SHORT, "At top of first page"); */ } statusline_erase("Page history:"); #ifdef USE_PANNER handle_y_scroll(NULL, NULL, NULL, NULL); #endif } static void Act_set_margins(Widget w, XEvent *event, String *params, Cardinal *num_params) { Window dummy; UNUSED(w); UNUSED(params); UNUSED(num_params); #ifndef MOTIF if (event == NULL) return; /* button actions do not provide events */ #endif (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win, event->xkey.x, event->xkey.y, &resource.sidemargin_int, &resource.topmargin_int, &dummy); /* throw away last argument */ statusline_info(STATUS_SHORT, "Margins set to cursor position (%d, %d)", resource.sidemargin_int, resource.topmargin_int); resource.sidemargin_int *= mane.shrinkfactor; resource.topmargin_int *= mane.shrinkfactor; } static void Act_show_display_attributes(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); statusline_error(STATUS_SHORT, "Unit = %d, bitord = %d, byteord = %d", BitmapUnit(DISP), BitmapBitOrder(DISP), ImageByteOrder(DISP)); } int shrink_to_fit(void) { int value1; int value2; static Dimension window_w; #ifndef MOTIF static Dimension window_h; #endif static Arg arg_wh[] = { {XtNwidth, (XtArgVal) &window_w} #ifndef MOTIF , {XtNheight, (XtArgVal) &window_h} #endif }; #ifdef MOTIF XtGetValues(globals.widgets.main_window, arg_wh, XtNumber(arg_wh)); #else XtGetValues(globals.widgets.vport_widget, arg_wh, XtNumber(arg_wh)); #endif value1 = ROUNDUP(globals.page.unshrunk_w, window_w - 2); #ifdef MOTIF { /* account for menubar */ static Dimension new_h; /* get rid of scrollbar */ XtVaSetValues(globals.widgets.draw_widget, XtNwidth, (XtArgVal)1, XtNheight, (XtArgVal)1, NULL); XtVaGetValues(globals.widgets.clip_widget, XtNheight, &new_h, NULL); value2 = ROUNDUP(globals.page.unshrunk_h, new_h - 2); } #else /* FIXME: value seems too small here! */ value2 = ROUNDUP(globals.page.unshrunk_h, window_h - 2); #endif return value1 > value2 ? value1 : value2; } void do_set_shrinkfactor(int arg, Boolean set_resource) { static int shrink_bak = -1; /* We don't store this as preference since it may affect initial window geometry. */ /* store_preference(NULL, "shrinkFactor", "%d", arg); */ if (globals.curr_mode == TEXT_MODE_ACTIVE) { text_change_region(TEXT_SEL_CLEAR, NULL); } mane.shrinkfactor = arg; if (set_resource) resource.shrinkfactor = mane.shrinkfactor; set_menu(&arg, Act_set_shrink_factor, check_int); #if HAVE_XMP tb_set_zoom_sensitivity(arg != 1); #endif if (arg != 1 && arg != shrink_bak) { shrink_bak = arg; #if GREY #if COLOR if (resource.use_grey) fg_active = NULL; #else if (resource.use_grey) init_pix(); #endif #endif /* GREY */ reset_fonts(); } init_page(); reconfig(); htex_resize_page(); /* this seems unneccessary */ /* if (!resource.keep_flag) */ /* home(False); */ globals.ev.flags |= EV_NEWPAGE; XFlush(DISP); } /* A 'meta' action that is bound to mouse buttons and invokes actions depending on current mouse mode */ void Act_mouse_modes(Widget w, XEvent *event, String *params, Cardinal *num_params) { int i; size_t mode_idx = 0; /* default: one action for all modes */ struct xdvi_action *my_action = NULL, *ap = NULL; if (*num_params > 1) { /* different actions */ if (resource.mouse_mode >= *num_params) { size_t k; XDVI_WARNING((stderr, "Only %d parameters in X resource 'mouse-modes', should be %d", *num_params, resource.mouse_mode + 1)); for (k = 0; k < *num_params; k++) { XDVI_WARNING((stderr, "Param %d: `%s'", (int)(k + 1), params[k])); } return; } mode_idx = resource.mouse_mode; } my_action = compile_action(params[mode_idx]); for (i = 0, ap = my_action; ap; ap = ap->next, i++) { String args[1]; TRACE_EVENTS((stderr, "Action %d for mode %lu: '%s', %d args |%s| maps to proc |%p|", i, (unsigned long)mode_idx, ap->command, ap->num_params, ap->param, ap->proc)); args[0] = ap->param; /* now call the action proc directly */ XtCallActionProc(w, ap->command, event, args, ap->num_params); if (args[0] == Act_true_retval) { /* we may compare the pointers here */ /* Special case: Only invoke first action, not subsequent ones, e.g. if mouse is over * a link and action is Act_href (currently the only case where this is used). */ break; } } /* free all allocated action info. TODO: should we save it for later calls? */ ap = my_action; while (ap) { struct xdvi_action *tmp_ap = ap; free(ap->param); free(ap->command); ap = tmp_ap->next; free(tmp_ap); } } void Act_set_shrink_factor(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; /* Set a limit to the shrink factors allowed; otherwise xdvi may consume a lot of memory (even run out of memory in malloc) in the allocation for the subpixel lookup table pixeltbl, dvi-draw.c. The `correct' solution would be to recognize that at a certain shrink, the only pixel for a character will be always set to `on' anyway, so that we could do without the lookup table for very large shrink factors ... */ static const int SHRINK_MAX = 999; UNUSED(w); UNUSED(event); warn_num_params("set-shrink-factor()", params, *num_params, 1); if (*num_params > 0) { if (**params == 'a') arg = shrink_to_fit(); else if (**params == '-') arg = mane.shrinkfactor + 1; else if (**params == '+') arg = mane.shrinkfactor - 1; else arg = atoi(*params); } else if (!get_prefix_arg(&arg)) { arg = shrink_to_fit(); } if (arg <= 0) { xdvi_bell(); /* statusline_info(STATUS_SHORT, */ /* "No more enlarging possible"); */ return; } if (arg > SHRINK_MAX) { xdvi_bell(); statusline_info(STATUS_SHORT, "Shrink factor %d too large (maximum: %d)", arg, SHRINK_MAX); return; } /* SU: added clearing the window here, else old window content will survive changing shrink */ if (globals.pausing.flag) { XClearWindow(DISP, mane.win); } statusline_info(STATUS_SHORT, "shrink factor: %d", arg); #if 0 /* Uncommented this, otherwise selecting `shrink to fit' with same value as current mane.shrinkfactor will clear the canvas (only fixed by changing shrink factor again). That bug is also present in xdvik-22.48-alpha3. */ if (arg == mane.shrinkfactor) { return; } #endif do_set_shrinkfactor(arg, True); #if MOTIF /* note: mustn't do that inside do_set_shrinkfactor(), or we get into an endless loop! */ update_preferences_shrink(); #endif } void Act_shrink_to_dpi(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg, arg_bak; Boolean clear_statusline = False; UNUSED(w); UNUSED(event); warn_num_params("shrink-to-dpi()", params, *num_params, 1); if (!get_int_arg(params, num_params, &arg)) arg = 0; else clear_statusline = True; arg_bak = arg; if (arg > 0) arg = (double)resource.pixels_per_inch / arg + 0.5; if (arg <= 0) { xdvi_bell(); statusline_info(STATUS_SHORT, "shrink-to-dpi requires a positive argument"); return; } /* like elsewhere */ if (globals.pausing.flag) { XClearWindow(DISP, mane.win); } #if 0 /* Uncommented this, otherwise selecting `shrink to fit' with same value as current mane.shrinkfactor will clear the canvas (only fixed by changing shrink factor again). That bug is also present in xdvik-22.48-alpha3. */ if (arg == mane.shrinkfactor) return; #endif do_set_shrinkfactor(arg, True); #if MOTIF /* note: mustn't do that inside do_set_shrinkfactor(), or we get into an endless loop! */ update_preferences_shrink(); #endif } void do_set_density(double newgamma, Boolean force, Boolean update_resource) { /* like elsewhere */ if (globals.pausing.flag) { XClearWindow(DISP, mane.win); } #ifdef GREY if (resource.use_grey) { if (newgamma == resource.gamma && !force) { statusline_info(STATUS_SHORT, "density value: %.3f", newgamma); return; } resource.gamma = newgamma; if (update_resource) globals.curr_gamma = resource.gamma; #if COLOR fg_active = NULL; reset_colors(); #else init_pix(); if (G_visual->class != TrueColor) { return; } reset_fonts(); #endif /* COLOR */ statusline_info(STATUS_SHORT, "density value: %.3f", newgamma); } else #endif /* GREY */ { reset_fonts(); if (mane.shrinkfactor == 1) { statusline_info(STATUS_SHORT, "set-density ignored at magnification 1"); return; } statusline_info(STATUS_SHORT, "density value: %.3f", newgamma); } store_preference(NULL, "gamma", "%f", resource.gamma); globals.ev.flags |= EV_NEWPAGE; XFlush(DISP); } static void Act_set_density(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; UNUSED(w); UNUSED(event); warn_num_params("set-density()", params, *num_params, 1); if (!get_int_arg(params, num_params, &arg)) { xdvi_bell(); return; } /* if (arg < 0) { */ /* XBell(DISP, 0); */ /* statusline_info(STATUS_SHORT, */ /* "set-density requires a positive value"); */ /* return; */ /* } */ do_set_density(arg != 0 ? arg / 100.0 : 1.0, False, True); #if MOTIF update_preferences_darkness(); #else store_preference(NULL, "gamma", "%f", resource.gamma); #endif } static void Act_change_density(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; double diff; double oldgamma = resource.gamma; UNUSED(w); UNUSED(event); warn_num_params("change-density()", params, *num_params, 1); if (!get_int_arg(params, num_params, &arg)) { xdvi_bell(); return; } diff = oldgamma / arg; if (oldgamma + diff <= 0.0) oldgamma = 0.0; else oldgamma += diff; do_set_density(oldgamma, False, True); #if MOTIF update_preferences_darkness(); #endif } static void h_restore_scroll_position(int orig_pos, #ifndef MOTIF Dimension *get_pos, #endif Widget scrollbar) { if (resource.keep_flag && orig_pos != 0 && scrollbar != NULL) { #ifdef MOTIF if (!resource.fullscreen) { /* only scroll back in non-fullscreen mode */ (void)set_bar_value(scrollbar, orig_pos, INT_MAX); } #else int curr_pos; get_xy(); XtVaGetValues(globals.widgets.clip_widget, XtNx, get_pos, NULL); curr_pos = -((*get_pos) - m_window_x); if (curr_pos - orig_pos > 0) { XtCallCallbacks(scrollbar, XtNscrollProc, cast_int_to_XtPointer(curr_pos - orig_pos)); } #endif /* MOTIF */ } } static void Act_fullscreen(Widget w, XEvent *event, String *params, Cardinal *num_params) { Dimension main_win_w, main_win_h; static int orig_x = 0, orig_y = 0; #ifndef MOTIF static Dimension get_x, get_y; #endif static Dimension old_w = 0, old_h = 0; Dimension panel_width = 0; #if 0 static Dimension w_old = 0, h_old = 0; #endif UNUSED(w); UNUSED(event); if (!toggle_arg(resource.fullscreen, params, num_params)) { return; } resource.fullscreen = !resource.fullscreen; #ifndef MOTIF panel_width = get_panel_width(); #endif if (resource.fullscreen) { /* when toggling to fullscreen, save current scrollbar values and window geometry */ XtVaGetValues(globals.widgets.top_level, XtNwidth, &old_w, XtNheight, &old_h, NULL); /* fprintf(stderr, "saved geometry: %dx%d\n", old_w, old_h); */ #ifdef MOTIF if (globals.widgets.x_bar != NULL) XtVaGetValues(globals.widgets.x_bar, XmNvalue, &orig_x, NULL); if (globals.widgets.y_bar != NULL) XtVaGetValues(globals.widgets.y_bar, XmNvalue, &orig_y, NULL); #else get_xy(); if (globals.widgets.x_bar != NULL) XtVaGetValues(globals.widgets.clip_widget, XtNx, &get_x, NULL); if (globals.widgets.y_bar != NULL) XtVaGetValues(globals.widgets.clip_widget, XtNy, &get_y, NULL); orig_x = -(get_x - m_window_x); orig_y = -(get_y - m_window_y); #endif /* MOTIF */ /* fprintf(stderr, "Current offsets: %d, %d, %d, %d\n", orig_x, m_window_x, orig_y, m_window_y); */ } if (resource.fullscreen) { set_windowsize(&main_win_w, &main_win_h, panel_width, 0, False); } else { /* re-use old window sizes, or initialize them if started in fullscreen mode */ if (old_w == 0 || old_h == 0) /* started in fullscreen mode */ set_windowsize(&old_w, &old_h, panel_width, 0, False); else set_windowsize(&old_w, &old_h, panel_width, 0, True); } /* fprintf(stderr, "reconfigure window!\n"); */ if (resource.fullscreen) reconfigure_window(resource.fullscreen, main_win_w, main_win_h, True); else { reconfigure_window(resource.fullscreen, old_w, old_h, True); } /* restore horizontal/vertical scroll positions */ h_restore_scroll_position(orig_x, #ifndef MOTIF &get_x, #endif globals.widgets.x_bar); h_restore_scroll_position(orig_y, #ifndef MOTIF &get_y, #endif globals.widgets.y_bar); #ifdef USE_PANNER handle_x_scroll(NULL, NULL, NULL, NULL); handle_y_scroll(NULL, NULL, NULL, NULL); #endif } #ifdef GREY static void Act_set_greyscaling(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; UNUSED(w); UNUSED(event); warn_num_params("set-greyscaling()", params, *num_params, 1); if (!get_int_arg(params, num_params, &arg)) { /* no arg, toggle */ if (!toggle_arg(resource.use_grey, params, num_params)) { return; } resource.use_grey = !resource.use_grey; if (resource.use_grey) { statusline_info(STATUS_SHORT, "greyscaling on"); } else { statusline_info(STATUS_SHORT, "greyscaling off"); } globals.ev.flags |= EV_NEWPAGE; XFlush(DISP); return; } switch (arg) { case 0: resource.use_grey = False; statusline_info(STATUS_SHORT, "greyscaling off"); break; case 1: resource.use_grey = True; statusline_info(STATUS_SHORT, "greyscaling on"); break; default: { float newgamma = arg != 0 ? arg / 100.0 : 1.0; resource.use_grey = newgamma; statusline_info(STATUS_SHORT, "greyscale value: %.1f", newgamma); } } /* like elsewhere */ if (globals.pausing.flag) { XClearWindow(DISP, mane.win); } if (resource.use_grey) { if (G_visual->class != TrueColor) init_plane_masks(); #if COLOR fg_active = NULL; #else init_pix(); #endif } reset_fonts(); globals.ev.flags |= EV_NEWPAGE; XFlush(DISP); } #endif #if COLOR void do_toggle_color(Boolean update_resource) { if (resource.use_color) { resource.use_color = False; full_reset_colors(); scanned_page_color = total_pages; #if PS if (ignore_papersize_specials || scanned_page_ps <= total_pages) { scanned_page = scanned_page_ps; } #endif statusline_info(STATUS_SHORT, "color specials off"); } else { resource.use_color = True; scanned_page = scanned_page_color = scanned_page_reset; statusline_info(STATUS_SHORT, "color specials on"); } if (update_resource) globals.curr_use_color = resource.use_color; #ifdef MOTIF update_preferences_color(); #endif globals.ev.flags |= EV_NEWPAGE; } static void Act_set_color(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); if (!toggle_arg(resource.use_color, params, num_params)) { return; }; /* like elsewhere */ if (globals.pausing.flag) { XClearWindow(DISP, mane.win); } do_toggle_color(True); } #endif /* COLOR */ #if PS void Act_set_ps(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; UNUSED(event); UNUSED(w); if (!get_int_arg(params, num_params, &arg)) resource.postscript++; else resource.postscript = arg; if (resource.postscript > 2) resource.postscript = 0; #ifdef PS_GS if (!resource.useGS) { if (resource.postscript > 0) { popup_message(globals.widgets.top_level, MSG_WARN, "This version of xdvi depends on ghostscript for rendering Postscript images. " "Postscript rendering cannot be activated if the option ``-noghostscript'' is used " "or if the resource ``Ghostscript'' is set to false.", /* message */ "Option ``-noghostscript'' is active; " "cannot enable Postscript rendering without ghostscript."); } resource.postscript = 0; } #endif if (resource.postscript > 0) { scanned_page_ps = scanned_page_ps_bak; if (scanned_page > scanned_page_ps) scanned_page = scanned_page_ps; if (resource.postscript == 1) { statusline_info(STATUS_SHORT, "Postscript rendering on"); } else { statusline_info(STATUS_SHORT, "Postscript rendering on (with bounding box)"); } } else { scanned_page_ps_bak = scanned_page_ps; scanned_page_ps = total_pages; #if COLOR if (ignore_papersize_specials || scanned_page_color <= total_pages) { scanned_page = scanned_page_color; } #endif statusline_info(STATUS_SHORT, "Postscript rendering off; displaying bounding box instead"); } store_preference(NULL, "postscript", "%d", resource.postscript); psp.toggle(resource.postscript); set_menu(&resource.postscript, Act_set_ps, check_int); /* like elsewhere */ if (globals.pausing.flag) { XClearWindow(DISP, mane.win); } globals.ev.flags |= EV_PS_TOGGLE; XFlush(DISP); } #endif /* PS */ void Act_htex_back(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); htex_back(); } void Act_htex_forward(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); htex_forward(); } static void Act_htex_anchorinfo(Widget w, XEvent *event, String *params, Cardinal *num_params) { int x, y; Window dummy; UNUSED(w); UNUSED(params); UNUSED(num_params); (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win, event->xkey.x, event->xkey.y, &x, &y, &dummy); htex_displayanchor(x, y); } #ifdef PS_GS void Act_set_gs_alpha(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); if (!toggle_arg(resource.gs_alpha, params, num_params)) { return; } resource.gs_alpha = !resource.gs_alpha; if (resource.gs_alpha) { statusline_info(STATUS_SHORT, "ghostscript alpha active"); } else { statusline_info(STATUS_SHORT, "ghostscript alpha inactive"); } store_preference(NULL, "gsAlpha", "%s", resource.gs_alpha ? "True" : "False"); set_menu(&resource.gs_alpha, Act_set_gs_alpha, check_toggle); #if GS_PIXMAP_CLEARING_HACK had_ps_specials = False; /* else infinite loop and/or crash in redraw! */ #endif /* like elsewhere */ if (globals.pausing.flag) { XClearWindow(DISP, mane.win); } globals.ev.flags |= EV_PS_TOGGLE; XFlush(DISP); } #endif static void Act_reread_dvi_file(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); /* fprintf(stderr, "reread file!\n"); */ globals.ev.flags |= EV_RELOAD; } static void Act_discard_number(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); m_have_arg = False; m_number = 0; m_sign = 1; statusline_info(STATUS_SHORT, "numerical prefix discarded"); } /* * Actions to support dragging the image. */ static int drag_last_x, drag_last_y; /* last position of cursor */ static int text_last_x = -1; static int text_last_y = -1; static int text_last_page = -1; static void drag_motion(XEvent *); static void drag_release(XEvent *); static void text_release(XEvent * event) { int ulx, uly, w, h; static char *text; int text_len = 0; UNUSED(event); MYTRACE((stderr, "text_release!\n")); if (mouse_motion == null_mouse) return; mouse_motion = mouse_release = null_mouse; w = text_last_x - drag_last_x; h = text_last_y - drag_last_y; if (w == 0 || h == 0) { text_last_x = text_last_y = -1; drag_last_x = drag_last_y = -1; text_last_page = -1; return; } if (w < 0) { ulx = drag_last_x + w; w = -w; } else ulx = drag_last_x; if (h < 0) { uly = drag_last_y + h; h = -h; } else uly = drag_last_y; free(text); /* this allocates text */ text = get_text_selection(&text_len, ulx * currwin.shrinkfactor, uly * currwin.shrinkfactor, (ulx + w) * currwin.shrinkfactor, (uly + h) * currwin.shrinkfactor); if (text[0] == '\0') { /* fprintf(stdout, "Text selection empty.\n"); */ return; } TRACE_GUI((stderr, "Selected `%s'", text)); if (text_len > 4 * XMaxRequestSize(DISP) - 32) { xdvi_bell(); statusline_error(STATUS_MEDIUM, "Selection too large (%d bytes, maximum %d bytes)", text_len, 4 * XMaxRequestSize(DISP) - 32); return; } if (!set_selection(text, globals.widgets.top_level)) { xdvi_bell(); statusline_error(STATUS_MEDIUM, "Could not set primary selection!"); text_change_region(TEXT_SEL_CLEAR, NULL); } } void text_motion(XEvent *event) { MYTRACE((stderr, "motion!\n")); text_change_region(TEXT_SEL_MOVE, event); } static void get_rectangle(XRectangle *rect, int x, int y, int last_x, int last_y) { rect->width = ABS(x - last_x); rect->height = ABS(y - last_y); rect->x = (x < last_x) ? x : last_x; rect->y = (y < last_y) ? y : last_y; } static void crop_to_window(int *x, int *y) { if (*x < -currwin.base_x + 1) *x = -currwin.base_x + 1; else if (*x > -currwin.base_x + (int)ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 1) *x = -currwin.base_x + ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 1; if (*y < -currwin.base_y + 1) *y = -currwin.base_y + 1; else if (*y > -currwin.base_y + (int)ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 1) *y = -currwin.base_y + (int)ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 1; } void text_change_region(textSelectionT mode, XEvent *event) { static GC bboxGC = 0; static GC redrawGC = 0; /* needed since bboxGC is clipped to diff of old and new region */ if (bboxGC == 0) { XGCValues values; unsigned long valuemask; values.function = GXinvert; /* as in search code */ if (values.function == GXinvert) { valuemask = GCFunction; } else { values.foreground = WhitePixelOfScreen(SCRN) ^ BlackPixelOfScreen(SCRN); /* fprintf(stderr, "foreground: 0x%lx, white pixel: 0x%lx, black pixel: 0x%lx\n", */ /* values.foreground, WhitePixelOfScreen(SCRN), BlackPixelOfScreen(SCRN)); */ valuemask = GCFunction | GCForeground; } values.line_width = 1; valuemask |= GCLineWidth; bboxGC = XCreateGC(DISP, XtWindow(globals.widgets.top_level), valuemask, &values); redrawGC = XCreateGC(DISP, XtWindow(globals.widgets.top_level), valuemask, &values); } MYTRACE((stderr, "mode: %d\n", mode)); switch (mode) { case TEXT_SEL_MOVE: { int x, y; Window dummy; XRectangle redraw = { -1, -1, 0, 0 }; ASSERT(event != NULL, "event in text_change_region() musn't be NULL for TEXT_SEL_MOVE"); (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win, event->xkey.x, event->xkey.y, &x, &y, &dummy); crop_to_window(&x, &y); get_rectangle(&redraw, x, y, drag_last_x, drag_last_y); /* * If we have an old region, we want to clip the GC to the area: * * (clip \cup redraw) - (clip \cap redraw) * * and redraw both rectangle areas; otherwise, just draw the redraw area. */ if (text_last_x != -1 && text_last_y != -1) { XRectangle clip = { -1, -1, 0, 0 }; Region clip_region = XCreateRegion(); Region redraw_region = XCreateRegion(); Region union_region = XCreateRegion(); Region intersect_region = XCreateRegion(); get_rectangle(&clip, text_last_x, text_last_y, drag_last_x, drag_last_y); XUnionRectWithRegion(&clip, clip_region, clip_region); XUnionRectWithRegion(&redraw, redraw_region, redraw_region); XUnionRegion(clip_region, redraw_region, union_region); XIntersectRegion(clip_region, redraw_region, intersect_region); XSubtractRegion(union_region, intersect_region, redraw_region); XSetRegion(DISP, bboxGC, redraw_region); XDestroyRegion(clip_region); XDestroyRegion(redraw_region); XDestroyRegion(union_region); XDestroyRegion(intersect_region); XFillRectangle(DISP, mane.win, bboxGC, clip.x, clip.y, clip.width, clip.height); } XFillRectangle(DISP, mane.win, bboxGC, redraw.x, redraw.y, redraw.width, redraw.height); text_last_x = x; text_last_y = y; text_last_page = current_page; } break; case TEXT_SEL_CLEAR: unset_selection(globals.widgets.top_level); case TEXT_SEL_ERASE: case TEXT_SEL_REDRAW: if (text_last_page == current_page && text_last_x != -1 && text_last_y != -1 && drag_last_x != -1 && drag_last_y != -1) { XRectangle clear = { -1, -1, 0, 0 }; get_rectangle(&clear, text_last_x, text_last_y, drag_last_x, drag_last_y); if (mode == TEXT_SEL_CLEAR) { text_last_x = text_last_y = drag_last_x = drag_last_y = -1; text_last_page = -1; /* Note ZLB: the region is erased instead of inverted to avoid * multiple inverting problem. An exposure is generated to * make the region redrawn */ clearexpose(&mane, clear.x, clear.y, clear.width, clear.height); } else if (clip_region_to_rect(&clear)) { if (mode == TEXT_SEL_ERASE) { /* If width or height are 0, XClearArea will clear entire window * from coordinates x, y, so check for that: */ if (clear.width > 0 && clear.height > 0) XClearArea(DISP, mane.win, clear.x, clear.y, clear.width, clear.height, False); } else XFillRectangle(DISP, mane.win, redrawGC, clear.x, clear.y, clear.width, clear.height); } } break; } } void text_selection_start(XEvent *event) { int x, y; Window dummy; /* erase existing region */ text_change_region(TEXT_SEL_CLEAR, NULL); (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win, event->xkey.x, event->xkey.y, &x, &y, &dummy); /* throw away last argument */ crop_to_window(&x, &y); drag_last_x = x; drag_last_y = y; text_last_x = text_last_y = -1; MYTRACE((stderr, "selection start; mouse_release: %p; null: %p!\n", mouse_release, null_mouse)); if (mouse_release == null_mouse) { MYTRACE((stderr, "init text_motion!\n")); mouse_motion = text_motion; mouse_release = text_release; } /* resource.mouse_mode_text_selection_active = True; */ } void Act_switch_mode(Widget w, XEvent *event, String *params, Cardinal *num_params) { /* mouseModeT prev_mode = resource.mouse_mode; */ int arg = -1; /* char *ptr; */ const char *mode_name = NULL; const char *mode_description = NULL; /* XEvent ev; */ /* if called the first time from main(), this is only used * to initialize the menu according to the mode. */ Boolean initialization = (w == globals.widgets.top_level); UNUSED(event); if (get_int_arg(params, num_params, &arg)) { if (arg < MOUSE_MODE1 || arg >= MOUSE_MODE_MAX) { statusline_info(STATUS_SHORT, "Argument for Act_switch_mode outside of range from %d to %d", MOUSE_MODE1, MOUSE_MODE_MAX - 1); resource.mouse_mode++; } else resource.mouse_mode = (mouseModeT)arg; } else resource.mouse_mode++; /* check if wrapped */ if (resource.mouse_mode >= MOUSE_MODE_MAX) resource.mouse_mode = MOUSE_MODE1; if (globals.curr_mode == RULER_MODE_ACTIVE) { clear_ruler(); mouse_motion = mouse_release = null_mouse; } else if (globals.curr_mode == TEXT_MODE_ACTIVE) { text_change_region(TEXT_SEL_CLEAR, NULL); mouse_motion = mouse_release = null_mouse; } globals.curr_mode = NO_MODE_ACTIVE; switch(resource.mouse_mode) { case MOUSE_MODE1: mode_name = resource.mouse_mode1_name; mode_description = resource.mouse_mode1_description; break; case MOUSE_MODE2: mode_name = resource.mouse_mode2_name; mode_description = resource.mouse_mode2_description; /* globals.cursor.flags |= CURSOR_TEXT; /\*XXX FIXME: don't hardcode flag here; instead, have Act_text_selection set it *\/ */ break; case MOUSE_MODE3: mode_name = resource.mouse_mode3_name; mode_description = resource.mouse_mode3_description; /* globals.cursor.flags |= CURSOR_RULER; */ break; default: /* can't happen */ XDVI_WARNING((stderr, "resource.mouse_mode larger than %d!", resource.mouse_mode)); break; } globals.ev.flags |= EV_CURSOR; XFlush(DISP); if (!initialization) { statusline_info(STATUS_SHORT, "%s mode; %s", mode_name, mode_description); store_preference(NULL, "mouseMode", "%d", resource.mouse_mode); } set_menu(&resource.mouse_mode, Act_switch_mode, check_int); /*XXX FIXME: Activate mode by synthesizing a mouse event??? */ /* synthesize_event(&ev, globals.widgets.draw_widget); */ /* Act_mouse_modes(w, event, params, num_params); */ } static void Act_drag(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); if (mouse_release != null_mouse && mouse_release != drag_release) return; if ((globals.curr_mode == TEXT_MODE_ACTIVE) && text_last_page != -1 /* this was: && (text_last_x != drag_last_x || text_last_y != drag_last_y) but that isn't restrictive enough */ ) { /* dragging would mess up region drawing */ xdvi_bell(); statusline_info(STATUS_SHORT, "Cannot drag page when selection is active"); return; } if (*num_params != 1) { XDVI_WARNING((stderr, "drag() requires 1 argument (got %d)", *num_params)); return; } switch (**params) { case '|': globals.cursor.flags |= CURSOR_DRAG_V; break; case '-': globals.cursor.flags |= CURSOR_DRAG_H; break; case '+': globals.cursor.flags |= CURSOR_DRAG_A; break; default: XDVI_WARNING((stderr, "drag(): Valid arguments are `+', `|' or `-'")); } globals.ev.flags |= EV_CURSOR; if (mouse_release == null_mouse) { mouse_motion = drag_motion; mouse_release = drag_release; drag_last_x = event->xbutton.x_root; drag_last_y = event->xbutton.y_root; } else drag_motion(event); XFlush(DISP); } static void drag_motion(XEvent * event) { #ifdef MOTIF get_xy(); #endif if (globals.cursor.flags & (CURSOR_DRAG_H | CURSOR_DRAG_A)) { /* horizontal motion */ #ifdef MOTIF (void)set_bar_value(globals.widgets.x_bar, drag_last_x - event->xbutton.x_root - m_window_x, (int)(globals.page.w - mane.width)); #else if (globals.widgets.x_bar != NULL) { XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(drag_last_x - event->xbutton.x_root)); } #endif drag_last_x = event->xbutton.x_root; } if (globals.cursor.flags & (CURSOR_DRAG_V | CURSOR_DRAG_A)) { /* vertical motion */ #ifdef MOTIF (void)set_bar_value(globals.widgets.y_bar, drag_last_y - event->xbutton.y_root - m_window_y, (int)(globals.page.h - mane.height)); #else if (globals.widgets.y_bar != NULL) { XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(drag_last_y - event->xbutton.y_root)); } #endif drag_last_y = event->xbutton.y_root; } #ifdef USE_PANNER handle_x_scroll(NULL, NULL, NULL, NULL); handle_y_scroll(NULL, NULL, NULL, NULL); #endif } static void drag_release(XEvent * event) { drag_motion(event); mouse_motion = mouse_release = null_mouse; globals.cursor.flags &= ~(CURSOR_DRAG_H | CURSOR_DRAG_V | CURSOR_DRAG_A); globals.ev.flags |= EV_CURSOR; XFlush(DISP); } /* Wheel mouse support. */ static int wheel_button = -1; static void Act_wheel(Widget w, XEvent *event, String *params, Cardinal *num_params) { int dist; UNUSED(w); if (*num_params != 1) { XDVI_WARNING((stderr, "wheel() requires 1 argument (got %d)", *num_params)); return; } dist = (strchr(*params, '.') == NULL) ? atoi(*params) : (int)(my_atof(*params) * resource.wheel_unit); #ifdef MOTIF get_xy(); set_bar_value(globals.widgets.y_bar, dist - m_window_y, (int)(globals.page.h - mane.height)); #else if (globals.widgets.y_bar != NULL) XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(dist)); #endif wheel_button = event->xbutton.button; #ifdef USE_PANNER handle_y_scroll(NULL, NULL, NULL, NULL); #endif } /* Internal mouse actions. */ static void Act_motion(Widget w, XEvent *event, String *params, Cardinal *num_params) { /* remember last position, to do this only when pointer is actually moved */ static int old_x = -1, old_y = -1; int x, y; UNUSED(w); UNUSED(params); UNUSED(num_params); MYTRACE((stderr, "act_motion!\n")); if (globals.curr_mode == RULER_MODE_ACTIVE) { show_distance_from_ruler(event, False); } /* This used to be: (abs(x - old_x) > x_threshold || abs(y - old_y) > y_threshold)) but that didn't work too well either. Just change it whenever user moves the mouse. */ if (!MAGNIFIER_ACTIVE && !(globals.curr_mode == RULER_MODE_ACTIVE) && pointerlocate(&x, &y) && (x != old_x || y != old_y)) { htex_displayanchor(x, y); old_x = x; old_y = y; } if ((int)(event->xbutton.button) != wheel_button) { MYTRACE((stderr, "mouse_motion!\n")); mouse_motion(event); } } static void Act_release(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(params); UNUSED(num_params); if ((int)(event->xbutton.button) == wheel_button) { wheel_button = -1; return; } mouse_release(event); } static void Act_toggle_grid_mode(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; UNUSED(w); UNUSED(event); if (!get_int_arg(params, num_params, &arg)) { arg = -1; } switch (arg) { case -1: resource.grid_mode = !resource.grid_mode; if (resource.grid_mode) { statusline_info(STATUS_SHORT, "Grid mode on"); } else { statusline_info(STATUS_SHORT, "Grid mode off"); } break; case 1: /* fall through */ case 2: /* fall through */ case 3: resource.grid_mode = arg; statusline_info(STATUS_SHORT, "Grid mode %d", arg); break; default: xdvi_bell(); statusline_info(STATUS_SHORT, "Valid arguments for grid mode are: none (toggles), 1, 2, 3"); return; } init_page(); reconfig(); globals.ev.flags |= EV_NEWPAGE; XFlush(DISP); } /* Actions for source specials. */ void Act_source_special(Widget w, XEvent *event, String *params, Cardinal *num_params) { Window dummy; UNUSED(w); UNUSED(params); UNUSED(num_params); if ((event->type == ButtonPress && mouse_release != null_mouse) || MAGNIFIER_ACTIVE) { xdvi_bell(); return; } source_reverse_x = event->xbutton.x; source_reverse_y = event->xbutton.y; if (event->xbutton.window != mane.win) (void)XTranslateCoordinates(DISP, RootWindowOfScreen(SCRN), mane.win, event->xbutton.x_root, event->xbutton.y_root, &source_reverse_x, &source_reverse_y, &dummy); /* throw away last argument */ source_reverse_x = (source_reverse_x + mane_base_x) * mane.shrinkfactor; source_reverse_y = (source_reverse_y + mane_base_y) * mane.shrinkfactor; globals.ev.flags |= EV_SRC; } void Act_show_source_specials(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; Boolean clear_statusline = False; UNUSED(w); if (!get_int_arg(params, num_params, &arg)) arg = -1; else clear_statusline = True; if ((event->type == ButtonPress && mouse_release != null_mouse) || !MAGNIFIER_ACTIVE) { xdvi_bell(); return; } if (!(globals.ev.flags & EV_SRC)) { source_reverse_x = -1; source_show_all = (arg == 1 ? True : False); globals.ev.flags |= EV_SRC; } if (clear_statusline) statusline_clear(); } void Act_source_what_special(Widget w, XEvent *event, String *params, Cardinal *num_params) { int my_x, my_y; Window dummy; UNUSED(w); UNUSED(params); UNUSED(num_params); (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win, event->xkey.x, event->xkey.y, &my_x, &my_y, &dummy); /* throw away last argument */ my_x = (my_x + mane_base_x) * mane.shrinkfactor; my_y = (my_y + mane_base_y) * mane.shrinkfactor; source_reverse_search(my_x, my_y, False); } static void select_cb(const char *filename, void *data) { UNUSED(data); if (filename != NULL) { TRACE_FILES((stderr, "new filename: |%s|", filename)); if (resource.filesel_open_new_window) { /* char *fname = expand_filename_append_dvi(filename); */ launch_xdvi(filename, NULL); } else { set_dvi_name_expand(filename); current_page = 0; /* switch to first page */ close_old_filep(); globals.ev.flags |= EV_NEWDOC; globals.ev.flags |= EV_PAGEHIST_INSERT; } } } static void Act_select_dvi_file(Widget w, XEvent *event, String *params, Cardinal *num_params) { /* static so that we can pass its address */ static struct filesel_callback cb = { NULL, NULL, "xdvik: Open File", "Open file:", "OK", "Cancel", NULL, "*.dvi", True, False, NULL, NULL }; int arg = -1; UNUSED(w); UNUSED(event); if (get_int_arg(params, num_params, &arg)) { /* try item from file history */ char *fname; int dummy_page; if (arg < 1) { xdvi_bell(); statusline_info(STATUS_MEDIUM, "Error: File history number must be >= 1"); } else if ((fname = file_history_get_elem(arg - 1, &dummy_page)) == NULL) { statusline_info(STATUS_MEDIUM, "No file number %d in history (history size: %lu)", arg, (unsigned long)file_history_size()); } else { file_history_open(fname); } return; } file_history_set_page(current_page); cb.func_ptr = select_cb; cb.init_path = globals.dvi_file.dirname; if (cb.shell == NULL) cb.shell = XsraSelFile(globals.widgets.top_level, &cb); XsraSelFilePopup(&cb); } /* * If all GUI elements have been turned on/off, make this synonymous * with expert mode off/on, so that next `x' keystroke does something * reasonable. */ void update_expert_mode(void) { if ((resource.expert_mode & (XPRT_SHOW_STATUSLINE | XPRT_SHOW_SCROLLBARS #ifdef MOTIF | XPRT_SHOW_PAGELIST | XPRT_SHOW_TOOLBAR | XPRT_SHOW_MENUBAR #else | XPRT_SHOW_BUTTONS #endif )) == XPRT_SHOW_ALL) { resource.expert = False; } else if ((resource.expert_mode & (XPRT_SHOW_STATUSLINE #ifdef MOTIF | XPRT_SHOW_SCROLLBARS | XPRT_SHOW_PAGELIST | XPRT_SHOW_TOOLBAR | XPRT_SHOW_MENUBAR #else | BROKEN_RECONFIG ? 0 : XPRT_SHOW_SCROLLBARS | XPRT_SHOW_BUTTONS #endif )) == XPRT_SHOW_NONE) { resource.expert = True; } } void Act_set_expert_mode(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; Boolean clear_statusline = False; UNUSED(w); UNUSED(event); if (!get_int_arg(params, num_params, &arg)) arg = -1; else clear_statusline = True; switch(arg) { case 1: resource.expert_mode ^= XPRT_SHOW_STATUSLINE; toggle_statusline(); update_expert_mode(); break; case 2: #ifndef MOTIF /* show this warning only when not toggling global expert mode (that's why it can't be inside toggle_scrollbars) */ if (BROKEN_RECONFIG) { popup_message(globals.widgets.top_level, MSG_WARN, NULL, "Sorry - cannot toggle scrollbars with this X Version.\n" "This version of XFree has a broken implementation of the viewportWidget, " "which would break the layout if the scrollbars are toggled. " "Versions that are known to work have a VendorRelease version below 4000 or above 4002. " "You will need to update your XFree server to fix this."); return; } #endif resource.expert_mode ^= XPRT_SHOW_SCROLLBARS; toggle_scrollbars(); update_expert_mode(); break; #ifdef MOTIF case 3: resource.expert_mode ^= XPRT_SHOW_PAGELIST; toggle_pagelist(); update_expert_mode(); break; case 4: /* toolbar */ resource.expert_mode ^= XPRT_SHOW_TOOLBAR; toggle_toolbar(); update_expert_mode(); break; case 5: resource.expert_mode ^= XPRT_SHOW_MENUBAR; toggle_menubar(); update_expert_mode(); break; #else case 3: /* fprintf(stderr, "sidebar\n"); */ resource.expert_mode ^= XPRT_SHOW_BUTTONS; toggle_buttons(); update_expert_mode(); break; #endif default: /* warn 'em */ if ( #ifdef MOTIF arg > 5 #else arg > 3 #endif ) { statusline_info(STATUS_SHORT, "Number %d too large for `set-expert-mode', using 0 (= toggle) instead.", arg); } /* toggle all items */ resource.expert = !resource.expert; if (resource.expert) resource.expert_mode = XPRT_SHOW_NONE; else resource.expert_mode = XPRT_SHOW_ALL; toggle_statusline(); #ifndef MOTIF if (!BROKEN_RECONFIG) toggle_scrollbars(); #else toggle_scrollbars(); #endif #ifdef MOTIF toggle_pagelist(); toggle_toolbar(); toggle_menubar(); #else toggle_buttons(); #endif } #ifdef MOTIF update_preferences_expert(); #endif store_preference(NULL, "expertMode", "%d", resource.expert_mode); if (clear_statusline) statusline_clear(); } Boolean have_src_specials = False; static Boolean do_update_property = False; #ifdef USE_PANNER void handle_x_scroll(Widget w, XtPointer closure, XEvent *ev, Boolean *cont) { #if !defined(MOTIF) Dimension get_x = 0; #endif UNUSED(w); UNUSED(closure); UNUSED(ev); UNUSED(cont); if (/* !resource.keep_flag || */ globals.widgets.x_bar == NULL) return; #ifdef MOTIF XtVaGetValues(globals.widgets.x_bar, XmNvalue, &m_x_scroll, NULL); #else get_xy(); XtVaGetValues(globals.widgets.clip_widget, XtNx, &get_x, NULL); m_x_scroll = get_x - m_window_x; scroll_x_panner(m_x_scroll); #endif /* MOTIF */ } void handle_y_scroll(Widget w, XtPointer closure, XEvent *ev, Boolean *cont) { #if !defined(MOTIF) Dimension get_y = 0; #endif UNUSED(w); UNUSED(closure); UNUSED(ev); UNUSED(cont); if (/* !resource.keep_flag || */ globals.widgets.y_bar == NULL) return; #ifdef MOTIF XtVaGetValues(globals.widgets.y_bar, XmNvalue, &m_y_scroll, NULL); #else get_xy(); XtVaGetValues(globals.widgets.clip_widget, XtNy, &get_y, NULL); m_y_scroll = get_y - m_window_y; scroll_y_panner(m_y_scroll); #endif /* MOTIF */ } #endif /* USE_PANNER */ void handle_expose(Widget w, XtPointer closure, XEvent *ev, Boolean *cont) { struct WindowRec *windowrec = (struct WindowRec *)closure; UNUSED(w); UNUSED(cont); if (windowrec == &magnifier) { if (magnifier_stat < 0) { /* destroy upon exposure */ magnifier_stat = 0; mag_release(ev); return; } else magnifier_stat = 0; } do_update_property = False; if (have_src_specials && !MAGNIFIER_ACTIVE) { do_update_property = True; } expose(windowrec, (&(ev->xexpose))->x, (&(ev->xexpose))->y, (unsigned int)(&(ev->xexpose))->width, (unsigned int)(&(ev->xexpose))->height); } void handle_property_change(Widget w, XtPointer junk, XEvent *ev, Boolean *cont) { char *prop_ret; size_t prop_len; UNUSED(w); UNUSED(junk); UNUSED(cont); if ((&(ev->xproperty))->window != XtWindow(globals.widgets.top_level)) /* if spurious event */ return; if ((&(ev->xproperty))->atom == atom_src_goto()) { /* forward search requested */ if ((prop_len = property_get_data(XtWindow(globals.widgets.top_level), atom_src_goto(), &prop_ret, XGetWindowProperty)) == 0) { TRACE_CLIENT((stderr, "property_get_data() failed for atom_src_goto()!")); return; } TRACE_CLIENT((stderr, "got back atom_src_goto: |%s|", prop_ret)); globals.src.fwd_string = prop_ret; globals.ev.flags |= EV_SRC; } else if ((&(ev->xproperty))->atom == atom_find_string()) { /* string search requested */ if ((prop_len = property_get_data(XtWindow(globals.widgets.top_level), atom_find_string(), &prop_ret, XGetWindowProperty)) == 0) { TRACE_CLIENT((stderr, "property_get_data() failed for atom_find_string()!")); return; } TRACE_FIND((stderr, "got back atom_find_string: |%s|", prop_ret)); resource.find_string = prop_ret; globals.ev.flags |= EV_FIND; } else if ((&(ev->xproperty))->atom == atom_reload()) { /* like do_sigusr(); there's no data in this case. */ TRACE_CLIENT((stderr, "atom_reload()")); globals.ev.flags |= EV_RELOAD; } else if ((&(ev->xproperty))->atom == atom_newdoc()) { /* loading a new file */ FILE *new_fp; if ((prop_len = property_get_data(XtWindow(globals.widgets.top_level), atom_newdoc(), &prop_ret, XGetWindowProperty)) == 0) { TRACE_CLIENT((stderr, "property_get_data() returned zero length for atom_newdoc()")); /* just raise it in this case */ XMapRaised(XtDisplay(globals.widgets.top_level), XtWindow(globals.widgets.top_level)); raise_message_windows(); return; } TRACE_CLIENT((stderr, "got back atom_newdoc: |%s|", prop_ret)); if ((new_fp = XFOPEN(prop_ret, "r")) == NULL) { popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Loading %s failed: %s", prop_ret, strerror(errno)); return; } set_dvi_name_expand(prop_ret); globals.ev.flags |= EV_NEWDOC; } else if ((&(ev->xproperty))->atom == atom_newpage()) { /* jumping to a different page */ int newpage; char *testptr; if ((prop_len = property_get_data(XtWindow(globals.widgets.top_level), atom_newpage(), &prop_ret, XGetWindowProperty)) == 0) { TRACE_CLIENT((stderr, "property_get_data() failed for atom_newpage(): |%s|", prop_ret)); return; } TRACE_CLIENT((stderr, "got back atom_newpage: |%s|", prop_ret)); if (strcmp(prop_ret, "+") == 0) { /* special case: treat `+' as last page */ newpage = total_pages - 1; } else { newpage = strtol(prop_ret, &testptr, 10) - 1; if (*testptr != '\0') { XDVI_FATAL((stderr, "Invalid page number: `%s'.", prop_ret)); } } if (newpage == total_pages - 1) { /* as in Act_goto_page() */ goto_page(check_goto_page(newpage, True), resource.keep_flag ? NULL : home, False); search_signal_page_changed(); } else { goto_page(check_goto_tex_page(newpage), resource.keep_flag ? NULL : home, False); search_signal_page_changed(); } } else if ((&(ev->xproperty))->atom == atom_raise()) { XMapRaised(XtDisplay(globals.widgets.top_level), XtWindow(globals.widgets.top_level)); raise_message_windows(); } else if ((&(ev->xproperty))->atom == atom_reread_prefs()) { read_user_preferences(globals.widgets.top_level, ".xdvirc.tmp"); } } /* * Signal routines. At the signal level, all we do is set flags. */ #ifndef FLAKY_SIGPOLL static RETSIGTYPE handle_sigpoll(int signo) { UNUSED(signo); globals.ev.ctr = 1; event_freq = -1; /* forget Plan B */ sig_flags |= SF_POLL; # ifndef HAVE_SIGACTION (void) signal(SIGPOLL, handle_sigpoll); /* reset the signal */ # endif } #endif static RETSIGTYPE handle_sigterm(int signo) { UNUSED(signo); sig_flags |= SF_TERM; } static RETSIGTYPE handle_sigchld(int signo) { UNUSED(signo); sig_flags |= SF_CHLD; } static RETSIGTYPE handle_sigalrm(int signo) { UNUSED(signo); sig_flags |= SF_ALRM; } static RETSIGTYPE ignore_sigusr(int signo) { UNUSED(signo); fprintf(stderr, "IGNORE SIGUSR1!\n"); } static RETSIGTYPE handle_sigusr(int signo) { UNUSED(signo); globals.ev.ctr = 1; sig_flags |= SF_USR; } static RETSIGTYPE handle_sigsegv(int signo) { UNUSED(signo); XDVI_ABORT((stderr, "Segmentation fault - trying to clean up and aborting ...")); } static Boolean sigalarm_initialized = False; void setup_sigalarm(void) { #if HAVE_SIGACTION struct sigaction a; a.sa_handler = handle_sigalrm; (void) sigemptyset(&a.sa_mask); (void) sigaddset(&a.sa_mask, SIGALRM); a.sa_flags = 0; sigaction(SIGALRM, &a, NULL); #else /* not HAVE_SIGACTION */ (void) signal(SIGALRM, handle_sigalrm); #endif /* not HAVE_SIGACTION */ sigalarm_initialized = True; } /* * Called from main to set up the signal handlers. */ void setup_signal_handlers(Boolean early) { #ifndef FLAKY_SIGPOLL int sock_fd = 0; #endif #if HAVE_SIGACTION struct sigaction a; #endif if (early) { #if HAVE_SIGACTION a.sa_handler = ignore_sigusr; (void) sigemptyset(&a.sa_mask); (void) sigaddset(&a.sa_mask, SIGUSR1); a.sa_flags = 0; sigaction(SIGUSR1, &a, NULL); #else /* not HAVE_SIGACTION */ (void) signal(SIGUSR1, ignore_sigusr); #endif /* not HAVE_SIGACTION */ (void)sigemptyset(&all_signals); (void)sigaddset(&all_signals, SIGUSR1); return; } #if HAVE_SIGACTION a.sa_handler = handle_sigusr; (void) sigemptyset(&a.sa_mask); (void) sigaddset(&a.sa_mask, SIGUSR1); a.sa_flags = 0; sigaction(SIGUSR1, &a, NULL); #else /* not HAVE_SIGACTION */ (void) signal(SIGUSR1, handle_sigusr); #endif /* not HAVE_SIGACTION */ #ifndef FLAKY_SIGPOLL #if HAVE_SIGACTION /* Subprocess handling, e.g., MakeTeXPK, fails on the Alpha without this, because SIGPOLL interrupts the call of system(3), since OSF/1 doesn't retry interrupted wait calls by default. From code by maj@cl.cam.ac.uk. */ a.sa_handler = handle_sigpoll; (void) sigemptyset(&a.sa_mask); (void) sigaddset(&a.sa_mask, SIGPOLL); a.sa_flags = SA_RESTART; sigaction(SIGPOLL, &a, NULL); #else /* not HAVE_SIGACTION */ (void) signal(SIGPOLL, handle_sigpoll); #endif /* not HAVE_SIGACTION */ sock_fd = ConnectionNumber(DISP); prep_fd(sock_fd, False); #endif /* not FLAKY_SIGPOLL */ #if HAVE_SIGACTION a.sa_handler = handle_sigterm; (void) sigemptyset(&a.sa_mask); (void) sigaddset(&a.sa_mask, SIGINT); (void) sigaddset(&a.sa_mask, SIGQUIT); (void) sigaddset(&a.sa_mask, SIGTERM); (void) sigaddset(&a.sa_mask, SIGHUP); a.sa_flags = SA_RESETHAND; sigaction(SIGINT, &a, NULL); sigaction(SIGQUIT, &a, NULL); sigaction(SIGTERM, &a, NULL); sigaction(SIGHUP, &a, NULL); a.sa_handler = handle_sigsegv; (void)sigemptyset(&a.sa_mask); (void)sigaddset(&a.sa_mask, SIGSEGV); a.sa_flags = 0; sigaction(SIGSEGV, &a, NULL); #else /* not HAVE_SIGACTION */ (void) signal(SIGINT, handle_sigterm); (void) signal(SIGQUIT, handle_sigterm); (void) signal(SIGTERM, handle_sigterm); (void) signal(SIGHUP, handle_sigterm); (void)signal(SIGSEGV, handle_sigsegv); #endif /* not HAVE_SIGACTION */ #if HAVE_SIGACTION a.sa_handler = handle_sigchld; (void) sigemptyset(&a.sa_mask); (void) sigaddset(&a.sa_mask, SIGCHLD); a.sa_flags = 0; sigaction(SIGCHLD, &a, NULL); #else /* not HAVE_SIGACTION */ (void) signal(SIGCHLD, handle_sigchld); #endif /* not HAVE_SIGACTION */ (void)sigemptyset(&all_signals); (void)sigaddset(&all_signals, SIGPOLL); (void)sigaddset(&all_signals, SIGINT); (void)sigaddset(&all_signals, SIGQUIT); (void)sigaddset(&all_signals, SIGTERM); (void)sigaddset(&all_signals, SIGHUP); (void)sigaddset(&all_signals, SIGCHLD); (void)sigaddset(&all_signals, SIGALRM); (void)sigaddset(&all_signals, SIGUSR1); (void)sigaddset(&all_signals, SIGSEGV); } /* * Mid-level signal handlers. These are called from within read_events(), * and do the actual work appropriate for the given signal. */ /* * Process-related routines. Call set_chld(xchild *) to indicate * that a given child process should be watched for when it * terminates. Call clear_chld() to remove the process from the * list. When the child terminates, the record is removed from * the list and xchild->proc is called. * The caller can set the `io' member in xchild to a pointer to * an xio structure for reading from the file descriptor; see * psgs.c and util.c for examples. */ static struct xchild *child_recs = NULL; /* head of child process list */ void set_chld(struct xchild *cp) { cp->next = child_recs; child_recs = cp; } void clear_chld(struct xchild *cp) { struct xchild **cpp; struct xchild *cp2; if (child_recs == NULL) { if (globals.debug & DBG_EVENT) fprintf(stderr, "child_recs: %p\n", (void *)child_recs); return; } for (cpp = &child_recs;;) { cp2 = *cpp; if (cp2 == cp) break; cpp = &cp2->next; } *cpp = cp->next; } static void do_sigchld(void) { pid_t pid; int status; sig_flags &= ~SF_CHLD; #if ! HAVE_SIGACTION (void) signal(SIGCHLD, handle_sigchld); /* reset the signal */ #endif for (;;) { #if HAVE_WAITPID pid = waitpid(-1, &status, WNOHANG); #else pid = wait3(&status, WNOHANG, NULL); #endif if (pid == 0) break; if (pid != -1) { struct xchild **cpp; struct xchild *cp; for (cpp = &child_recs;;) { cp = *cpp; if (cp == NULL) break; if (cp->pid == pid) { *cpp = cp->next; /* unlink it */ /* call exit reporting procedure for this child */ (cp->proc)(status, cp); break; } cpp = &cp->next; } break; } if (errno == EINTR) continue; if (errno == ECHILD) break; #if HAVE_WAITPID perror("xdvi: waitpid"); #else perror("xdvi: wait3"); #endif break; } } /* * File-related routines. Call set_io() to indicate that a given fd * should be watched for ability to input or output data. Call clear_io() * to remove it from the list. When poll()/select() indicates that the fd * is available for the indicated type of i/o, the corresponding routine * is called. Call clear_io() to remove an fd from the list. * Both set_io() and clear_io() can be called from within read_proc or * write_proc (although turning an io descriptor on or off is better * accomplished by setting the events flag in the xio structure, and * in the corresponding pollfd structure if the pfd pointer is not NULL * (it is always non-NULL when read_proc and write_proc are called)). * We allocate space for one additional record in the pollfd array, to * accommodate the fd for the X connection; this is done by initializing * num_fds to 1 instead of zero. */ static struct xio *iorecs = NULL; /* head of xio list */ #if HAVE_POLL static struct pollfd *fds = NULL; static int num_fds = 1; /* current number of fds */ static int max_fds = 0; /* max allocated number of fds */ static Boolean io_dirty= True; /* need to recompute fds[] array */ #else static int numfds = 0; static fd_set readfds; static fd_set writefds; #endif void set_io(struct xio *ip) { ip->next = iorecs; iorecs = ip; #if HAVE_POLL ++num_fds; if (!io_dirty && num_fds <= max_fds) { fds[num_fds - 1].fd = ip->fd; fds[num_fds - 1].events = ip->xio_events; ip->pfd = &fds[num_fds - 1]; } else { ip->pfd = NULL; io_dirty = True; } #else if (numfds <= ip->fd) numfds = ip->fd + 1; #endif } void clear_io(struct xio *ip) { struct xio **ipp; for (ipp = &iorecs;;) { struct xio *ip2; ip2 = *ipp; if (ip2 == ip) break; ipp = &ip2->next; } *ipp = ip->next; #if HAVE_POLL --num_fds; io_dirty = True; #else # if FLAKY_SIGPOLL numfds = ConnectionNumber(DISP); # else numfds = (event_freq < 0 ? -1 : ConnectionNumber(DISP)); # endif for (ip = iorecs; ip != NULL; ip = ip->next) if (ip->fd > numfds) numfds = ip->fd; ++numfds; #endif /* !HAVE_POLL */ } static void do_sigpoll(void) { #if FLAKY_SIGPOLL sig_flags &= ~SF_POLL; #else struct xio *ip; sig_flags &= ~SF_POLL; # if HAVE_POLL if (io_dirty) { struct pollfd *fp; if (num_fds > max_fds) { if (fds != NULL) free(fds); fds = xmalloc(num_fds * sizeof *fds); memset(fds, 0, num_fds * sizeof *fds); max_fds = num_fds; fds->fd = ConnectionNumber(DISP); fds->events = POLLIN; } fp = fds + 1; for (ip = iorecs; ip != NULL; ip = ip->next) { fp->fd = ip->fd; fp->events = ip->xio_events; ip->pfd = fp; ++fp; } io_dirty = False; } for (;;) { if (poll(fds + 1, num_fds - 1, 0) >= 0) break; if (errno != EAGAIN && errno != EINTR) { perror("xdvi: poll"); return; } } for (ip = iorecs; ip != NULL; ip = ip->next) { int revents = ip->pfd->revents; if (revents & POLLIN && ip->read_proc != NULL) (void)(ip->read_proc)(ip->fd, ip->data); if (revents & POLLOUT && ip->write_proc != NULL) (ip->write_proc)(ip->fd, ip->data); } # else FD_ZERO(&readfds); FD_ZERO(&writefds); for (ip = iorecs; ip != NULL; ip = ip->next) { if (ip->xio_events & XIO_IN) FD_SET(ip->fd, &readfds); if (ip->xio_events & XIO_OUT) FD_SET(ip->fd, &writefds); } for (;;) { struct timeval tv; tv.tv_sec = tv.tv_usec = 0; if (select(numfds, &readfds, &writefds, (fd_set *) NULL, &tv) >= 0) break; if (errno != EAGAIN && errno != EINTR) { perror("select (xdvi read_events)"); return; } } for (ip = iorecs; ip != NULL; ip = ip->next) { if (FD_ISSET(ip->fd, &readfds) && ip->read_proc != NULL) (void)(ip->read_proc)(ip->fd, ip->data); if (FD_ISSET(ip->fd, &writefds) && ip->write_proc != NULL) (ip->write_proc)(ip->fd, ip->data); } # endif #endif /* not FLAKY_SIGPOLL */ } /* * Timer-related routines. Call set_timer() to set a timer a given number * of milliseconds in the future. At that time, the timer will be cleared * and the given procedure will be called with argument set to the struct * passed to set_timer(). The timer routine may call set_timer() or * cancel_timer(). */ static struct xtimer *timers = NULL; /* head of timer list */ static struct itimerval itv = {{0, 0}, {0, 0}}; #ifndef timercmp #define timercmp(a, b, OP) (((a)->tv_sec OP (b)->tv_sec || \ ((a)->tv_sec == (b)->tv_sec && (a)->tv_usec OP (b)->tv_usec))) #endif /* timercmp */ static void show_timers(const char *what) { struct xtimer *tp; fprintf(stderr, "=======%s; timers:\n", what); for (tp = timers; tp != NULL; tp = tp->next) { fprintf(stderr, "timer %p: %lu\n", (void *)tp, (unsigned long)tp->when.tv_sec); } fprintf(stderr, "=======\n"); } void set_timer(struct xtimer *tp, int ms) { struct xtimer **tpp; struct xtimer *tp2; if (globals.debug & DBG_EVENT) fprintf(stderr, "%s:%d: set_timer\n", __FILE__, __LINE__); gettimeofday(&tp->when, NULL); itv.it_value.tv_sec = ms / 1000; itv.it_value.tv_usec = (ms % 1000) * 1000; tp->when.tv_sec += itv.it_value.tv_sec; tp->when.tv_usec += itv.it_value.tv_usec; if (tp->when.tv_usec >= 1000000) { tp->when.tv_usec -= 1000000; ++tp->when.tv_sec; } for (tpp = &timers;;) { /* add timer to list */ tp2 = *tpp; if (tp2 == NULL || timercmp(&tp->when, &tp2->when, <)) break; tpp = &tp2->next; } tp->next = tp2; *tpp = tp; if (tpp == &timers) { setitimer(ITIMER_REAL, &itv, NULL); if (ms == 0) sig_flags |= SF_ALRM; } if (globals.debug & DBG_EVENT) show_timers("after set_timer"); } void cancel_timer(struct xtimer *tp) { struct xtimer **tpp; if (globals.debug & DBG_EVENT) show_timers("beginning of cancel_timer"); if (timers == NULL) { fprintf(stderr, "%s:%d: BUG? timers == NULL!\n", __FILE__, __LINE__); return; } if (globals.debug & DBG_EVENT) fprintf(stderr, "%s:%d: cancel_timer %p from %p\n", __FILE__, __LINE__, (void *)&timers, (void *)tp); ASSERT(timers != NULL, "timers in cancel_timer() mustn't be NULL"); for (tpp = &timers; ; ) { /* remove from list */ if (*tpp == tp) break; tpp = &(*tpp)->next; } *tpp = (*tpp)->next; /* unlink it */ if (timers == NULL) { /* cancel SIGALRM */ itv.it_value.tv_sec = itv.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &itv, NULL); } } #if XDVI_XT_TIMER_HACK /* * Original comment by Paul: * Newer versions of the Motif toolkit use the timer facility * (XtAppAddTimeOut(), etc.) in the X Toolkit. Proper functioning of * this mechanism, however, requires that the X Toolkit be in charge of * blocking. Since xdvi does its own blocking, this means that we need * to provide working alternatives to these X Toolkit routines (by * redefining them ...). * One symptom of the above-mentioned bug is that the printlog window * eventually stops showing dvips progress until you move the mouse. * * Comment SU: * Xdvik also uses XtAppAddTimeOut() in other places (hyperref/statusline/...), * so we also need these redefinitions also in the Xaw version. * */ static void xt_alarm(struct xtimer *this, void *data); static struct xtimer *xt_free_timers = NULL; XtIntervalId XtAddTimeOut(unsigned long interval, XtTimerCallbackProc proc, XtPointer closure) { return XtAppAddTimeOut(NULL, interval, proc, closure); } XtIntervalId XtAppAddTimeOut(XtAppContext app, unsigned long interval, XtTimerCallbackProc proc, XtPointer closure) { struct xtimer *tp; UNUSED(app); /* FIXME: better way of checking this instead of static boolean sigalarm_initialized? The following doesn't work, even after sigaddset(&all_signals, SIGALRM); static sigset_t sig_set; (void)sigprocmask(0, NULL, &sig_set); if (sigismember(&sig_set, SIGALRM)) ... OK ... else ... NOT OK ... */ ASSERT(sigalarm_initialized, "Shouldn't invoke XtAppAddTimeOut() before setup_sigalarm()"); if (globals.debug & DBG_EVENT) fprintf(stderr, "XtAppAddTimeOut: %lu msecs\n", interval); if (xt_free_timers == NULL) tp = xmalloc(sizeof *tp); else { tp = xt_free_timers; xt_free_timers = xt_free_timers->next; } tp->proc = xt_alarm; tp->data = closure; tp->xt_proc = proc; tp->closure = closure; set_timer(tp, interval); if (globals.debug & DBG_EVENT) show_timers("XtAppAddTimeOut"); return (XtIntervalId)tp; } void XtRemoveTimeOut(XtIntervalId id) { struct xtimer *tp; ASSERT(id != 0, "XtIntervalId argument in XtRemoveTimeOut() mustn't be NULL"); tp = (struct xtimer *)id; /* Motif (2.1 on Solaris 9, 2003) sometimes calls XtRemoveTimeOut() after the timer event has occurred, so we need to be sure not to remove the timer record twice. */ if (tp->proc == NULL) return; cancel_timer(tp); tp->next = xt_free_timers; xt_free_timers = tp; if (globals.debug & DBG_EVENT) show_timers("XtRemoveTimeOut"); } void xt_alarm(struct xtimer *tp, void *data) { XtIntervalId id; UNUSED(data); tp->proc = NULL; /* flag timer as used-up */ id = (XtIntervalId)tp; (tp->xt_proc)(tp->closure, &id); tp->next = xt_free_timers; xt_free_timers = tp; if (globals.debug & DBG_EVENT) show_timers("xt_alarm"); } #endif /* XDVI_XT_TIMER_HACK */ static void do_sigalrm(void) { struct timeval now; sig_flags &= ~SF_ALRM; #ifndef HAVE_SIGACTION (void) signal(SIGALRM, handle_sigalrm); /* reset the signal */ #endif gettimeofday(&now, NULL); while (timers != NULL && timercmp(&timers->when, &now, <=)) { struct xtimer *tp = timers; timers = timers->next; /* unlink it _first_ */ (tp->proc)(tp, tp->data); } if (timers != NULL) { /* set next timer */ int i; itv.it_value.tv_sec = timers->when.tv_sec - now.tv_sec; i = timers->when.tv_usec - now.tv_usec; if (i < 0) { --itv.it_value.tv_sec; i += 1000000; } itv.it_value.tv_usec = i; setitimer(ITIMER_REAL, &itv, NULL); } } /* * Handle SIGUSR1 signal. Pretty straightforward. */ static void do_sigusr(void) { sig_flags &= ~SF_USR; #ifndef HAVE_SIGACTION (void) signal(SIGUSR1, handle_sigusr); /* reset the signal */ #endif globals.ev.flags |= EV_RELOAD; } static void do_sigsegv(void) { sig_flags &= ~SF_SEGV; #ifndef HAVE_SIGACTION (void) signal(SIGSEGV, handle_sigsegv); /* reset the signal */ #endif handle_sigsegv(SIGSEGV); } /* * Handle termination signals. Kill child processes, if permitted. * Otherwise, leave it up to the caller. This is the only place where * the EV_TERM event flag is set, and it can only happen if there's an * active non-killable process. This should only happen if read_events() * is called from one of a very few select locations. */ static void do_sigterm(void) { struct xchild *cp; sig_flags &= ~SF_TERM; /* loop through child processes */ for (cp = child_recs; cp != NULL; cp = cp->next) { if (cp->killable) kill(cp->pid, SIGKILL); } /* SU: Unlike non-k xdvi, we don't care about whether all children have been killed, since processes forked via fork_process() (e.g. the web browser) may still continue running. So we just exit here. */ xdvi_exit(EXIT_SUCCESS); /* BUG ALERT: since xdvi_exit() may return (checks before writing to ~/.xdvirc), we mustn't do the following which is in non-k xdvi, else we'll end up in a busy loop. I don't know who the `caller' is anyway ... globals.ev.flags |= EV_TERM; /\* otherwise, let the caller handle it *\/ */ } /* * Since redrawing the screen is (potentially) a slow task, xdvi checks * for incoming events while this is occurring. It does not register * a work proc that draws and returns every so often, as the toolkit * documentation suggests. Instead, it checks for events periodically * (or not, if SIGPOLL can be used instead) and processes them in * a subroutine called by the page drawing routine. This routine (below) * checks to see if anything has happened and processes those events and * signals. (Or, if it is called when there is no redrawing that needs * to be done, it blocks until something happens.) * * Ultimately, the goal is to have this be the only place in xdvi where * blocking occurs. * * The argument to this function should be a mask of event types (EV_*) * indicating which event types should cause read_events to return instead * of waiting for more events. This function will always process all * pending events and signals before returning. * The return value is the value of globals.ev.flags. */ unsigned int read_events(unsigned int ret_mask) { XEvent event; #if !HAVE_POLL if (numfds == 0) numfds = ConnectionNumber(DISP) + 1; #endif if (globals.debug & DBG_EVENT) fprintf(stderr, "%s:%d: read_events %u\n", __FILE__, __LINE__, ret_mask); for (;;) { globals.ev.ctr = event_freq; /* * The above line clears the flag indicating that an event is * pending. So if an event comes in right now, the flag will be * set again needlessly, but we just end up making an extra call. * Also, be careful about destroying the magnifying glass while * drawing on it. */ #if !FLAKY_SIGPOLL if (event_freq < 0) { /* if SIGPOLL works */ if (!XtPending()) { sigset_t oldsig; (void) sigprocmask(SIG_BLOCK, &all_signals, &oldsig); for (;;) { #ifdef SHOW_SIG_FLAGS /* this gives HUGE output ... */ if (globals.debug & DBG_EVENT) fprintf(stderr, "%s:%d: sig_flags = %d\n", __FILE__, __LINE__, sig_flags); #endif while (sig_flags) { flags_to_sigproc[sig_flags](); } if (XtPending()) break; if (globals.ev.flags & ret_mask) { (void) sigprocmask(SIG_SETMASK, &oldsig, (sigset_t *) NULL); return globals.ev.flags; } (void) sigsuspend(&oldsig); } (void) sigprocmask(SIG_SETMASK, &oldsig, (sigset_t *) NULL); } } else #endif /* not FLAKY_SIGPOLL */ { for (;;) { struct xio *ip; if (globals.debug & DBG_EVENT) fprintf(stderr, "%s:%d: (flaky) sig_flags = %d\n", __FILE__, __LINE__, sig_flags); while (sig_flags) { sigset_t oldsig; (void) sigprocmask(SIG_BLOCK, &all_signals, &oldsig); while (sig_flags) { flags_to_sigproc[sig_flags](); } (void) sigprocmask(SIG_SETMASK, &oldsig, (sigset_t *) NULL); } if (XtPending()) break; if (globals.ev.flags & ret_mask) return globals.ev.flags; /* If a SIGUSR1 signal comes right now, then it will wait until an X event or another SIGUSR1 signal arrives. */ #if HAVE_POLL if (globals.debug & DBG_EVENT) fprintf(stderr, "%s:%d: have_poll!\n", __FILE__, __LINE__); if (io_dirty) { struct pollfd *fp; if (num_fds > max_fds) { if (fds != NULL) free(fds); fds = xmalloc(num_fds * sizeof *fds); max_fds = num_fds; fds->fd = ConnectionNumber(DISP); fds->events = POLLIN; } fp = fds + 1; for (ip = iorecs; ip != NULL; ip = ip->next) { fp->fd = ip->fd; fp->events = ip->xio_events; ip->pfd = fp; ++fp; } io_dirty = False; } for (;;) { if (poll(fds, num_fds, -1) >= 0) { for (ip = iorecs; ip != NULL; ip = ip->next) { int revents = ip->pfd->revents; if (revents & POLLIN && ip->read_proc != NULL) (ip->read_proc)(ip->fd, ip->data); if (revents & POLLOUT && ip->write_proc != NULL) (ip->write_proc)(ip->fd, ip->data); } break; } if (errno == EINTR) break; if (errno != EAGAIN) { perror("xdvi: poll"); break; } } #else /* HAVE_POLL */ if (globals.debug & DBG_EVENT) fprintf(stderr, "%s:%d: NOT have_poll!\n", __FILE__, __LINE__); FD_ZERO(&readfds); FD_ZERO(&writefds); FD_SET(ConnectionNumber(DISP), &readfds); for (ip = iorecs; ip != NULL; ip = ip->next) { if (ip->xio_events & XIO_IN) FD_SET(ip->fd, &readfds); if (ip->xio_events & XIO_OUT) FD_SET(ip->fd, &writefds); } for (;;) { if (select(numfds, &readfds, &writefds, (fd_set *) NULL, (struct timeval *) NULL) >= 0) { for (ip = iorecs; ip != NULL; ip = ip->next) { if (FD_ISSET(ip->fd, &readfds) && ip->read_proc != NULL) { if (globals.debug & DBG_EVENT) fprintf(stderr, "%s:%d: reading from %d\n", __FILE__, __LINE__, ip->fd); (ip->read_proc)(ip->fd, ip->data); } if (FD_ISSET(ip->fd, &writefds) && ip->write_proc != NULL) { if (globals.debug & DBG_EVENT) fprintf(stderr, "%s:%d: writing to %d\n", __FILE__, __LINE__, ip->fd); (ip->write_proc)(ip->fd, ip->data); } } break; } if (errno == EINTR) break; if (errno != EAGAIN) { perror("xdvi: select"); break; } } #endif /* HAVE_POLL */ } } XtAppNextEvent(globals.app, &event); #ifdef MOTIF if ((resource.expert_mode & XPRT_SHOW_TOOLBAR) != 0) TipAppHandle(globals.app, &event); #endif if (resized) get_geom(); if (event.xany.window == magnifier.win && event.type == Expose) { handle_expose((Widget) NULL, (XtPointer)&magnifier, &event, (Boolean *) NULL); continue; } else if (globals.broken_motif_event_handling && (globals.cursor.flags & (CURSOR_RULER | CURSOR_TEXT))) { /* In this case, Act_motion() and Act_release() are not called properly * for updating the ruler/text selection (it works with the magnifier though), * so we need to invoke them ourselves here: */ if (event.type == MotionNotify) Act_motion(NULL, &event, NULL, NULL); else if (event.type == ButtonRelease) Act_release(NULL, &event, NULL, NULL); } #ifdef MOTIF if (XtIsRealized(globals.widgets.top_level) && event.xany.window == XtWindow(globals.widgets.clip_widget) && event.type == KeyPress) { /* workaround for #610206 */ motif_translations_hack(); } #else if (resource.expert_mode & XPRT_SHOW_BUTTONS) SubMenuHandleEvent(globals.app, &event); #endif XtDispatchEvent(&event); } } /* * Higher-level routines for managing events. */ static void can_exposures(struct WindowRec *windowrec) { windowrec->min_x = windowrec->min_y = MAXDIM; windowrec->max_x = windowrec->max_y = 0; } void redraw(struct WindowRec *windowrec) { currwin = *windowrec; globals.win_expose.min_x = currwin.min_x + currwin.base_x; globals.win_expose.min_y = currwin.min_y + currwin.base_y; globals.win_expose.max_x = currwin.max_x + currwin.base_x; globals.win_expose.max_y = currwin.max_y + currwin.base_y; can_exposures(windowrec); /* fix for bug #619070 - the complicated flags (and do_update_property) are needed to avoid too many updates at exposures, especially for a window of another xdvi instance when the magnifier intersects with that window. */ if (have_src_specials && do_update_property && globals.win_expose.min_x != 1 && globals.win_expose.max_y - globals.win_expose.min_y != 1 && currwin.base_x == 0 && currwin.base_y == 0) { update_window_property(XtWindow(globals.widgets.top_level), True); } TRACE_EVENTS((stderr, "Redraw %d x %d at (%d, %d) (base=%d,%d)", globals.win_expose.max_x - globals.win_expose.min_x, globals.win_expose.max_y - globals.win_expose.min_y, globals.win_expose.min_x, globals.win_expose.min_y, currwin.base_x, currwin.base_y)); /* can't use ev_cursor here, since the event loop might not see this change quick enough */ if (!(globals.ev.flags & EV_CURSOR)) { TRACE_EVENTS((stderr, "Cursor: %ld", globals.cursor.flags)); if (!(globals.cursor.flags & (CURSOR_MAG | CURSOR_DRAG_H | CURSOR_DRAG_V | CURSOR_DRAG_A))) { if (resource.mouse_mode == MOUSE_MODE3) XDefineCursor(DISP, CURSORWIN, globals.cursor.mode3); else XDefineCursor(DISP, CURSORWIN, globals.cursor.wait); XFlush(DISP); } globals.ev.flags |= EV_CURSOR; } /* No longer needed since windows are correctly transient now */ /* raise_message_windows(); */ raise_file_selector(); draw_page(); globals.warn_spec_now = False; } void redraw_page(void) { #if COLOR const struct rgb *rgbp; #endif TRACE_FILES((stderr, "Redraw page on %p", (void *)globals.dvi_file.bak_fp)); if (globals.dvi_file.bak_fp == NULL) return; if (scanned_page < current_page) { TRACE_FILES((stderr, "redraw_page: scanned_page = %d, current_page = %d, prescanning %p\n", scanned_page, current_page, (void *)globals.dvi_file.bak_fp)); prescan(globals.dvi_file.bak_fp); if (globals.ev.flags & EV_GE_NEWPAGE) { /* if we need to re-prescan */ return; } } TRACE_FILES((stderr, "redraw_page: current_page = %d", current_page)); if (pageinfo_get_window_width(current_page) != globals.page.unshrunk_w || pageinfo_get_window_height(current_page) != globals.page.unshrunk_h) { TRACE_FILES((stderr, "NEW SIZE: %dx%d", pageinfo_get_window_width(current_page), pageinfo_get_window_height(current_page))); init_page(); reconfig(); } /* We can't call home() without proper unshrunk_page_*, which requires * prescan(), which can't be done from within read_events() */ /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BUG ALERT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! There's some complicated interaction with Postscript specials here: if home_action check comes before the gs stuff, psp.drawfile might not get initialized correctly, resulting in empty PS figures (bounding box instead of figure). This is different in xdvi, due to different handling of the home_action stuff, but at the moment I can't remember the reason for this ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BUG ALERT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ #if PS_GS if (gs_postpone_prescan) { if (!setjmp(globals.ev.canit)) { gs_resume_prescan(); } else return; } #endif if (home_action != NULL) { home_action(False); home_action = NULL; /* This discards the expose event generated by home() (1 for each page) */ if (read_events(EV_NOWAIT) & EV_GE_NEWPAGE) { return; } can_exposures(&mane); } #if COLOR rgbp = &bg_initial; if (page_colors.stack != NULL) { ASSERT(current_page < (int)page_colors.size, "page_colors.size too small"); rgbp = &page_colors.stack[current_page].bg; } /* Set background color */ if (bg_current == NULL || rgbp->r != bg_current->color.r || rgbp->g != bg_current->color.g || rgbp->b != bg_current->color.b) { struct bgrec **bgpp; for (bgpp = &bg_head;;) { bg_current = *bgpp; if (bg_current == NULL) { /* if bg is not in list */ bg_current = *bgpp = xmalloc(sizeof *bg_current); bg_current->next = NULL; bg_current->color = *rgbp; bg_current->fg_head = NULL; bg_current->pixel_good = False; break; } if (bg_current->color.r == rgbp->r && bg_current->color.g == rgbp->g && bg_current->color.b == rgbp->b) break; bgpp = &bg_current->next; } fg_current = NULL; /* force change of foreground color */ /* globals.gc.high is only used in XDrawRectangle, so its background color doesn't need to be changed. */ if (globals.debug & DBG_DVI) printf("Changing background color to %5d %5d %5d\n", bg_current->color.r, bg_current->color.g, bg_current->color.b); if (!bg_current->pixel_good) { bg_current->pixel = alloc_color(&bg_current->color, color_data[1].pixel); bg_current->pixel_good = True; } XSetWindowBackground(DISP, mane.win, bg_current->pixel); #if MOTIF && !FIXED_FLUSHING_PAGING XtVaSetValues(XtParent(globals.widgets.draw_widget), XtNbackground, bg_current->pixel, NULL); #endif /* XSetWindowBackground(DISP, mane.win, bg_current->pixel); */ /* XClearWindow(DISP, mane.win); */ #if 0 /* don't recolor the cursor - gives too low contrast on color backgrounds, and bad appearance when part of the background is white and cursor mask is colored */ { XColor bg_Color; bg_Color.pixel = bg_current->pixel; XQueryColor(DISP, G_colormap, &bg_Color); XRecolorCursor(DISP, globals.cursor.ready, &globals.cr_color, &bg_Color); XRecolorCursor(DISP, globals.cursor.wait, &globals.cr_color, &bg_Color); } #endif } #endif /* COLOR */ if (!globals.pausing.flag) { XClearWindow(DISP, mane.win); } if (G_backing_store != NotUseful) { mane.min_x = mane.min_y = 0; mane.max_x = globals.page.w; mane.max_y = globals.page.h; } else { get_xy(); mane.min_x = -m_window_x; mane.max_x = -m_window_x + mane.width; mane.min_y = -m_window_y; mane.max_y = -m_window_y + mane.height; } /* update_TOC(); */ redraw(&mane); } void do_pages(void) { if (globals.debug & DBG_BATCH) { (void)read_events(EV_GT_IDLE); for (current_page = 0; current_page < total_pages; ++current_page) { if (resource.keep_flag) { home_action = NULL; } else { home_action = home; } globals.warn_spec_now = resource.warn_spec; #if PS_GS for (;;) { redraw_page(); (void) read_events(EV_NOWAIT); if (!(globals.ev.flags & (EV_NEWPAGE | EV_NEWDOC | EV_RELOAD))) break; globals.ev.flags = EV_IDLE; } #else redraw_page(); #endif } xdvi_exit(EXIT_SUCCESS); } else { for (;;) { /* normal operation */ (void) read_events(EV_GT_IDLE); TRACE_EVENTS((stderr, "globals.ev.flags: %d; ev_newpage: %d, ev_newdoc: %d, ev_reload: %d\n", globals.ev.flags, EV_NEWPAGE, EV_NEWDOC, EV_RELOAD)); /* NOTE: reloading must be checked first! */ if (globals.ev.flags & (EV_NEWPAGE | EV_NEWDOC | EV_RELOAD | EV_PS_TOGGLE)) { TRACE_EVENTS((stderr, "EV_NEWPAGE | ...")); globals.ev.flags &= ~(EV_NEWPAGE | EV_EXPOSE | EV_PS_TOGGLE); if (globals.ev.flags & EV_RELOAD) { dviErrFlagT errflag; globals.ev.flags &= ~EV_RELOAD; if (load_dvi_file( #if !DELAYED_MKTEXPK True, #endif &errflag)) { #if PS ps_clear_cache(); #if PS_GS if (resource.gs_alpha) { /* restart gs so that user has a method for fixing GS artifacts with gs_alpha by using `reload' (see also GS_PIXMAP_CLEARING_HACK) */ ps_destroy(); } #endif #endif statusline_info(STATUS_SHORT, "File reloaded."); } /* else { */ /* statusline_info(STATUS_MEDIUM, "File corrupted, not reloading."); */ /* } */ } if (globals.ev.flags & EV_NEWDOC) { dviErrFlagT errflag; TRACE_EVENTS((stderr, "EV_NEWDOC!")); /* fprintf(stderr, "newdoc!\n"); */ TRACE_FILES((stderr, "current page: %d", current_page)); /* file_history_set_page(current_page); */ globals.ev.flags &= ~EV_NEWDOC; if (load_dvi_file( #if !DELAYED_MKTEXPK True, #endif &errflag)) { statusline_append(STATUS_SHORT, "Opened ", "Opened \"%s\"", globals.dvi_name); /* statusline_info(STATUS_SHORT, "Opened \"%s\"", globals.dvi_name); */ TRACE_FILES((stderr, "Adding to history: |%s|\n", globals.dvi_name)); if (file_history_push(globals.dvi_name)) { /* it's a new file, add to history */ TRACE_FILES((stderr, "New entry!")); filehist_menu_add_entry(globals.dvi_name); } else { /* only need to move existing elements to new positions */ TRACE_FILES((stderr, "Existing entry!\n")); filehist_menu_refresh(); } } } can_exposures(&mane); can_exposures(&magnifier); #if PS && PS_GS && GS_PIXMAP_CLEARING_HACK if (had_ps_specials && !MAGNIFIER_ACTIVE) { erasepage_gs(); had_ps_specials = False; } #endif /* PS && PS_GS && GS_PIXMAP_CLEARING_HACK */ if (globals.dvi_file.bak_fp != NULL) { TRACE_EVENTS((stderr, "redraw_page()")); redraw_page(); } else { TRACE_EVENTS((stderr, "dvi_file_changed()")); (void)dvi_file_changed(); } } else if (globals.ev.flags & EV_PAGEHIST_GOTO_PAGE) { int pageno; globals.ev.flags &= ~EV_PAGEHIST_GOTO_PAGE; pageno = check_goto_page(page_history_get_page(), False); goto_page(pageno, resource.keep_flag ? NULL : home, False); TRACE_FILES((stderr, "got page: %d", pageno)); } else if (globals.ev.flags & EV_FILEHIST_GOTO_PAGE) { int pageno; globals.ev.flags &= ~EV_FILEHIST_GOTO_PAGE; pageno = check_goto_page(file_history_get_page(), True); goto_page(pageno, resource.keep_flag ? NULL : home, False); TRACE_FILES((stderr, "got page: %d", pageno)); } else if (globals.ev.flags & EV_PAGEHIST_INSERT) { globals.ev.flags &= ~EV_PAGEHIST_INSERT; page_history_insert(current_page); } else if (globals.ev.flags & EV_FIND_CANCEL) { /* NOTE: This must be done before checking for expose() */ globals.ev.flags &= ~EV_FIND_CANCEL; } else if (globals.ev.flags & EV_ANCHOR) { /* * Similar to forward search: search for a htex anchor. * This needs to come before the next case which does the redraw_page(), * otherwise anchors for the current page might not be drawn at all: * anchor_search() sets the info later used by htex_draw_anchormarkers(), * which is invoked by redraw_page(). */ /* switch off the link cursor */ globals.cursor.flags &= ~CURSOR_LINK; if (dvi_file_changed()) continue; anchor_search(g_anchor_pos); /* added, otherwise anchors on same page may not be drawn */ /* NOTE: This caused a crash when clicking on link "Langer" on p3 of diss.dvi since the color stack wasn't allocated for the target pages. Removed for the time being, since I can't reproduce the problem for which it was introduced. CVS commit message was: "fix anchor drawing for other window" */ /* redraw(&mane); */ globals.ev.flags &= ~EV_ANCHOR; } else if (globals.ev.flags & EV_SRC) { /* * Source special operations are deferred to here because * they call geom_scan(), which may call define_font(), * which may call makefont(), which may call read_events() * recursively. */ if (globals.src.fwd_string != NULL) { const char *s = globals.src.fwd_string; if (dvi_file_changed()) continue; source_forward_search(s); globals.ev.flags &= ~EV_SRC; globals.src.fwd_string = NULL; /* de-iconify window if needed, and raise it */ XMapRaised(XtDisplay(globals.widgets.top_level), XtWindow(globals.widgets.top_level)); raise_message_windows(); } else if (source_reverse_x != -1) { if (dvi_file_changed()) continue; source_reverse_search(source_reverse_x, source_reverse_y, True); globals.ev.flags &= ~EV_SRC; } else { source_special_show(source_show_all); globals.ev.flags &= ~EV_SRC; } } /* support for `-findstring' */ else if (globals.ev.flags & EV_FIND) { if (dvi_file_changed()) continue; if (resource.find_string != NULL) { /* not first call */ dvi_find_string(resource.find_string, False); resource.find_string = NULL; } else { /* actually should never arrive here?? */ dvi_find_string(NULL, True); } globals.ev.flags &= ~EV_FIND; } else if (globals.ev.flags & EV_MAG_MOVE) { MYTRACE((stderr, "moving mag!\n")); move_magnifier(); } else if (globals.ev.flags & EV_EXPOSE) { if (magnifier.min_x < MAXDIM) { /* fprintf(stderr, "magnifier < maxdim!\n"); */ if (mane.min_x >= MAXDIM) { /* fprintf(stderr, "mane >= maxdim!\n"); */ globals.ev.flags &= ~EV_EXPOSE; } redraw(&magnifier); } else { /* see comment in mag.c */ globals.ev.flags &= ~EV_EXPOSE; if (mane.min_x < MAXDIM) { redraw(&mane); } } } else if (globals.ev.flags & EV_CURSOR) { /* * This code eliminates unnecessary calls to XDefineCursor, * since this is a slow operation on some hardware (e.g., S3 * chips). */ XSync(DISP, False); if (!XtPending()) { Cursor curr; if (globals.cursor.flags & CURSOR_DRAG_V) curr = globals.cursor.drag_v; else if (globals.cursor.flags & CURSOR_DRAG_H) curr = globals.cursor.drag_h; else if (globals.cursor.flags & CURSOR_DRAG_A) curr = globals.cursor.drag_a; else if (resource.mouse_mode == MOUSE_MODE3) curr = globals.cursor.mode3; else if (resource.mouse_mode == MOUSE_MODE2) curr = globals.cursor.mode2; else if (globals.cursor.flags & CURSOR_LINK) curr = globals.cursor.link; else if (globals.cursor.flags & CURSOR_MAG) curr = globals.cursor.empty; else if (globals.cursor.flags & CURSOR_CORRUPTED) curr = globals.cursor.corrupted; else if (globals.pausing.flag) curr = globals.cursor.pause; else curr = globals.cursor.mode1; XDefineCursor(DISP, CURSORWIN, curr); globals.ev.flags &= ~EV_CURSOR; } } XFlush(DISP); } } } static void Act_unpause_or_next(Widget w, XEvent *event, String *params, Cardinal *num_params) { if (globals.pausing.flag) { globals.pausing.num++; if (globals.pausing.num_save) globals.pausing.num_save[current_page] = globals.pausing.num; redraw_page(); } else { Act_down_or_next(w, event, params, num_params); } } /* * timer callback for watching the DVI file. */ void watch_file_cb(XtPointer client_data, XtIntervalId *id) { static XtIntervalId timer = 0; UNUSED(client_data); UNUSED(id); if (resource.watch_file > 0.0) { unsigned long watch_time_ms; (void)dvi_file_changed(); if (timer) { XtRemoveTimeOut(timer); timer = (XtIntervalId)(XtIntervalId)0; } watch_time_ms = (unsigned long)(resource.watch_file * 1000); timer = XtAppAddTimeOut(globals.app, watch_time_ms, watch_file_cb, (XtPointer)NULL); } } void Act_pagehistory_back(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; UNUSED(w); UNUSED(event); if (!get_int_arg(params, num_params, &arg)) { arg = 1; } page_history_move(-arg); } void Act_pagehistory_forward(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; UNUSED(w); UNUSED(event); if (!get_int_arg(params, num_params, &arg)) { arg = 1; } page_history_move(arg); } void Act_pagehistory_clear(Widget w, XEvent *event, String *params, Cardinal *num_params) { UNUSED(w); UNUSED(event); UNUSED(params); UNUSED(num_params); page_history_clear(); } void Act_pagehistory_delete_backward(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; UNUSED(w); UNUSED(event); if (!get_int_arg(params, num_params, &arg)) { arg = 1; } page_history_delete(-arg); } void Act_pagehistory_delete_forward(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; UNUSED(w); UNUSED(event); if (!get_int_arg(params, num_params, &arg)) { arg = 1; } page_history_delete(arg); } #ifdef MOTIF void Act_prefs_dialog(Widget w, XEvent *event, String *params, Cardinal *num_params) { int arg; UNUSED(w); UNUSED(event); if (!get_int_arg(params, num_params, &arg)) { arg = -1; } popup_preferences_dialog(globals.widgets.top_level, arg); } #endif /* MOTIF */ xdvik-ja-22.84.16-j1.40/texk/xdvik/mime.c0000664000175000017500000005021111276240141017253 0ustar uwabamiuwabami/* Copyright (c) 1994-1999 All rights reserved. */ /* Written from scratch July 30, 1994, by A. P. Smith. */ /* Copyright (c) 2003-2004 the xdvik development team */ /* Read mime.types and mailcap entries to check what viewers to invoke on a new file. Patch by Allin Cottrell (cottrell@ricardo.ecn.wfu.edu) to invokeviewer applied 30/11/98. Patched further in january 1999 by Nicolai Langfeldt (janl@math.uio.no) to allow saner mime typing. Rewritten by Stefan Ulrich on 2003/03/25 for better RFC 1343 conformance. 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "xdvi-config.h" #include "xdvi.h" #include "hypertex.h" #include "xdvi-debug.h" #include "util.h" #include "string-utils.h" #include "mime.h" #include "browser.h" #include "message-window.h" #include #include "kpathsea/c-fopen.h" #include "kpathsea/variable.h" #include "kpathsea/c-pathmx.h" /* default settings if $EXTENSIONMAPS and $MAILCAPS is not set */ static const char *const DEFAULT_EXTENSIONMAPS = "$HOME/.mime.types:/etc/mime.types:/usr/etc/mime.types:/usr/local/etc/mimetypes"; static const char *const DEFAULT_MAILCAPS = "$HOME/.mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap"; struct mime_map { char *content_type; char *extensions; }; static struct mime_map default_mimemap[] = { {"application/postscript", "ai eps epsf ps",}, {"application/octet-stream", "bin",}, {"application/oda", "oda",}, {"application/pdf", "pdf",}, {"application/rtf", "rtf",}, {"application/x-mif", "mif",}, {"application/x-csh", "csh",}, {"application/x-dvi", "dvi Dvi DVI",}, {"application/x-hdf", "hdf",}, {"application/x-latex", "latex",}, {"application/x-netcdf", "nc cdf",}, {"application/x-sh", "sh",}, {"application/x-tcl", "tcl",}, {"application/x-tex", "tex",}, {"application/x-texinfo", "texinfo texi",}, {"application/x-troff", "t tr roff",}, {"application/x-troff-man", "man",}, {"application/x-troff-me", "me",}, {"application/x-troff-ms", "ms",}, {"application/x-wais-source", "src",}, {"application/zip", "zip",}, {"application/x-bcpio", "bcpio",}, {"application/x-cpio", "cpio",}, {"application/x-gtar", "gtar",}, {"application/x-shar", "shar",}, {"application/x-sv4cpio", "sv4cpio",}, {"application/x-sv4crc", "sv4crc",}, {"application/x-tar", "tar",}, {"application/x-ustar", "ustar",}, {"audio/basic", "au snd",}, {"audio/x-aiff", "aif aiff aifc",}, {"audio/x-wav", "wav",}, {"image/gif", "gif",}, {"image/ief", "ief",}, {"image/jpeg", "jpeg jpg jpe",}, {"image/tiff", "tiff tif",}, {"image/x-cmu-raster", "ras",}, {"image/x-portable-anymap", "pnm",}, {"image/x-portable-bitmap", "pbm",}, {"image/x-portable-graymap", "pgm",}, {"image/x-portable-pixmap", "ppm",}, {"image/x-rgb", "rgb",}, {"image/x-xbitmap", "xbm",}, {"image/x-xpixmap", "xpm",}, {"image/x-xwindowdump", "xwd",}, {"text/html", "html htm sht shtml",}, {"text/plain", "txt",}, {"text/richtext", "rtx",}, {"text/tab-separated-values", "tsv",}, {"text/x-setext", "etx",}, {"video/mpeg", "mpeg mpg mpe",}, {"video/quicktime", "qt mov",}, {"video/x-msvideo", "avi",}, {"video/x-sgi-movie", "movie",}, {"application/gzip", "gz",}, {"application/compress", "Z",}, {"application/bzip", "bz",}, {"application/bzip2", "bz2",}, }; struct mailcap_map { char *content_type; const char *command; /* command string */ const char *testcmd; /* value of the `test=' field, or NULL if no test field present */ Boolean needsterminal; /* whether the `needsterminal' flag has been specified for this entry */ const char *format_string; /* format specifier ("%s" or "%u" or "") */ }; static struct mailcap_map default_mailcap[] = { {"audio/*", "showaudio %s", NULL, False, "%s"}, {"image/*", "xv %s", NULL, False, "%s"}, {"video/mpeg", "mpeg_play %s", NULL, False, "%s"}, {"application/pdf", "acroread %s", NULL, False, "%s"}, {"text/html", "netscape-raise -remote 'openURL(%s,new-window)'", NULL, False, "%s"}, {"application/postscript", "ghostview %s", NULL, False, "%s"}, {"application/x-dvi", "xdvi %s", NULL, False, "%s"}, }; static struct mime_map *m_mimemap = NULL; static int m_mimemap_currlen = 0; static int m_mimemap_size = 0; static struct mailcap_map *m_mailcap = NULL; static int m_mailcap_currlen, m_mailcap_size = 0; static const size_t MIME_ALLOC_STEP = 64; /* Utility function: Read a line from a config file, dealing with continued lines (ending with '\[ \t]*'). The *linebuf argument is re-alloced as needed from its initial size alloc_len. The length of the read line is returned as ret_len. The lineno int is by the number of lines read. Trailing whitespace and newline is removed, and either the line, or NULL for EOF is returned. */ static char * read_config_line(const char *filename, FILE *fp, char **linebuf, size_t alloc_len, size_t *ret_len, int *lineno) { Boolean read_complete_line = False; *ret_len = 0; while (!read_complete_line) { if ((fgets((*linebuf) + *ret_len, alloc_len - *ret_len, fp)) == NULL) { if (*ret_len == 0) /* at EOF */ return NULL; else /* nothing read, but we have a result from previous loop iteration */ return *linebuf; } (*lineno)++; *ret_len = strlen(*linebuf); if (*ret_len > 0 && (*linebuf)[*ret_len - 1] != '\n') { /* catch the special case of missing NL at EOF */ if (*ret_len < alloc_len - 1) { XDVI_WARNING((stderr, "%s, line %d: missing newline at end of file.", filename, *lineno)); return *linebuf; } /* buffer too short, need to re-allocate */ alloc_len *= 2; *linebuf = xrealloc(*linebuf, alloc_len); } else if (*ret_len > 2 && (*linebuf)[*ret_len - 1] == '\n' && ((*linebuf)[*ret_len - 2] == '\\' || isspace((int)(*linebuf)[*ret_len - 2]))) { /* we may have a continued line */ /* chop off trailing whitespace */ while (*ret_len > 1 && isspace((int)(*linebuf)[*ret_len - 2])) (*ret_len)--; if (*ret_len > 1 && (*linebuf)[*ret_len - 2] != '\\') { /* no continued line */ read_complete_line = True; } else /* overwrite backslash and newline at next read */ *ret_len -= 2; } else read_complete_line = True; } /* chop off trailing NL */ (*linebuf)[--(*ret_len)] = '\0'; return *linebuf; } static void read_mime_file(FILE *fp, const char *filename, int *mime_line) { int i; const size_t line_len = 1024; size_t ret_len = 0; char *linebuf = xmalloc(line_len); char *cp, *cp2; int dummy = 0; TRACE_HTEX((stderr, "reading mime file \"%s\"", filename)); while ((read_config_line(filename, fp, &linebuf, line_len, &ret_len, &dummy)) != NULL) { if (linebuf[ret_len] == '\n') linebuf[ret_len] = '\0'; cp = linebuf; while (isspace((int)*cp)) cp++; if (*cp == '#') continue; /* split either on tab or on whitespace */ if ((cp2 = strchr(cp, '\t')) == NULL && (cp2 = strchr(cp, ' ')) == NULL) continue; *cp2 = '\0'; /* Terminate cp string */ cp2++; while (isspace((int)*cp2)) cp2++; if (*cp2 == '\0') continue; /* No extensions list */ if (*mime_line >= m_mimemap_size) { m_mimemap_size += MIME_ALLOC_STEP; m_mimemap = xrealloc(m_mimemap, m_mimemap_size * sizeof *m_mimemap); for (i = *mime_line; i < m_mimemap_size; i++) { m_mimemap[i].content_type = m_mimemap[i].extensions = NULL; } } #if 0 fprintf(stderr, "========== type %d: |%s| extension: |%s|\n", *mime_line, cp, cp2); #endif free(m_mimemap[*mime_line].content_type); m_mimemap[*mime_line].content_type = xstrdup(cp); free(m_mimemap[*mime_line].extensions); m_mimemap[*mime_line].extensions = xstrdup(cp2); (*mime_line)++; } free(linebuf); } static char * maybe_expand_homedir(const char *path) { char *newpath = NULL; TRACE_HTEX((stderr, "maybe_expand_homedir: |%s|", path)); if (memcmp(path, "$HOME", strlen("$HOME")) == 0) { newpath = xstrdup(getenv("HOME")); newpath = xstrcat(newpath, path + strlen("$HOME")); } else if (path[0] == '~') { newpath = expand_homedir(path); if (newpath == NULL) { XDVI_WARNING((stderr, "Couldn't expand path `%s'", path)); } } TRACE_HTEX((stderr, "maybe_expand_homedir: after expansion: |%s|", newpath ? newpath : "")); return newpath; } static void read_mailcap(FILE *fp, const char *filename, int *mailcap_line) { size_t alloc_len = 1024; size_t ret_len = 0; char *linebuf = xmalloc(alloc_len); int lineno = 0; TRACE_HTEX((stderr, "reading mailcap file \"%s\"", filename)); while ((read_config_line(filename, fp, &linebuf, alloc_len, &ret_len, &lineno)) != NULL) { Boolean error = False; int i; size_t n, num_items; char **items; char *ptr = linebuf; while (isspace((int)*ptr)) { ptr++; ret_len--; } if (*ptr == '#' || *ptr == '\0') /* comments or empty lines */ continue; /* split line into fields */ items = split_line(ptr, ';', 0, ret_len, &num_items); if (num_items == 0) { XDVI_WARNING((stderr, "%s, line %d: skipping malformed line \"%s\" (no command specified)", filename, lineno, linebuf)); error = True; } else if (num_items == 1 || (num_items >= 2 && strlen(items[1]) == 0)) { XDVI_WARNING((stderr, "%s, line %d: skipping malformed line \"%s\" (empty command)", filename, lineno, linebuf)); error = True; } if (error) { for (n = 0; n < num_items; n++) free(items[n]); free(items); continue; } /* resize m_mailcap */ while (*mailcap_line >= m_mailcap_size) { m_mailcap_size += MIME_ALLOC_STEP; m_mailcap = xrealloc(m_mailcap, m_mailcap_size * sizeof *m_mailcap); for (i = *mailcap_line; i < m_mailcap_size; i++) { m_mailcap[i].content_type = NULL; m_mailcap[i].command = NULL; m_mailcap[i].needsterminal = False; m_mailcap[i].testcmd = NULL; } } for (n = 0; n < num_items; n++) { if (n == 0) { /* first field: content-type */ m_mailcap[*mailcap_line].content_type = items[n]; /* * add \/\* to content-type if it only consists of one field * (it's not clear to me from RFC 1343 how this should be handled) */ if (strchr(m_mailcap[*mailcap_line].content_type, '/') == NULL) { m_mailcap[*mailcap_line].content_type = xstrcat(m_mailcap[*mailcap_line].content_type, "/*"); } } else if (memcmp(items[n], "test=", strlen("test=")) == 0) { m_mailcap[*mailcap_line].testcmd = xstrdup(items[n] + strlen("test=")); free(items[n]); } else if (memcmp(items[n], "needsterminal", strlen("needsterminal")) == 0) { /* set flag */ m_mailcap[*mailcap_line].needsterminal = True; free(items[n]); } else if (memcmp(items[n], "copiousoutput", strlen("copiousoutput")) == 0 || memcmp(items[n], "compose=", strlen("compose=")) == 0 || memcmp(items[n], "composetyped=", strlen("composetyped=")) == 0 || memcmp(items[n], "print=", strlen("print=")) == 0 || memcmp(items[n], "edit=", strlen("edit=")) == 0 || memcmp(items[n], "x11-bitmap=", strlen("x11-bitmap=")) == 0 || memcmp(items[n], "description=", strlen("description=")) == 0) { free(items[n]); continue; } else { /* command field */ m_mailcap[*mailcap_line].command = items[n]; if (find_format_str(m_mailcap[*mailcap_line].command, "%s") != NULL) m_mailcap[*mailcap_line].format_string = "%s"; else if (find_format_str(m_mailcap[*mailcap_line].command, "%u") != NULL) m_mailcap[*mailcap_line].format_string = "%u"; else m_mailcap[*mailcap_line].format_string = ""; } } free(items); (*mailcap_line)++; } free(linebuf); } /* parse mime or mailcap file, return true if successful. */ static Boolean parse_mime_mailcap(const char *env_var, const char *default_var_value, int *lines, void(*parse_func)(FILE *fp, const char *filename, int *mime_line)) { const char *path = NULL; char **path_elems; size_t elem_cnt, i; FILE *fp; Boolean success = False; if ((path = getenv(env_var)) == NULL) { path = default_var_value; } path_elems = split_line(path, ':', 0, strlen(path), &elem_cnt); for (i = 0; i < elem_cnt; i++) { char *newpath; /* expand paths */ if ((newpath = maybe_expand_homedir(path_elems[i])) != NULL) { free(path_elems[i]); path_elems[i] = newpath; } if ((fp = XFOPEN(path_elems[i], FOPEN_R_MODE)) != NULL) { parse_func(fp, path_elems[i], lines); success = True; } free(path_elems[i]); } free(path_elems); return success; } static void parsemimes(void) { static Boolean already_called = False; if (already_called) return; already_called = True; m_mimemap_currlen = 0; if (!parse_mime_mailcap("EXTENSIONMAPS", DEFAULT_EXTENSIONMAPS, &m_mimemap_currlen, read_mime_file)) { m_mimemap_currlen = XtNumber(default_mimemap); m_mimemap = default_mimemap; } } /* Partial parsing of mailcap file. Currently not implemented: - specifiers %t, %{xyz}, %n, %F - realplayer's %u is treated as %s (couldn't find any documentation on %u) */ static void parsemailcap(void) { static Boolean already_called = False; if (already_called) return; already_called = True; m_mailcap_currlen = 0; if (!parse_mime_mailcap("MAILCAPS", DEFAULT_MAILCAPS, &m_mailcap_currlen, read_mailcap)) { m_mailcap_currlen = XtNumber(default_mailcap); m_mailcap = default_mailcap; } } /* Try to match test against a content type definition pattern. The strings have one of the following formats (ignore spaces around `/' - these are just to avoid breaking the C comment syntax): * / * text / * * / plain text / plain where * matches everything. */ static Boolean match_content_type(const char *pattern, const char *test) { /* chop both strings into parts at the '/' */ char *subtype_pattern, *subtype_test; if ((subtype_pattern = strchr(pattern, '/')) == NULL) { /* malformed string? */ XDVI_WARNING((stderr, "Malformed content-type \"%s\" (should be \"type/subtype\")", pattern)); return False; } subtype_pattern++; if ((subtype_test = strchr(test, '/')) == NULL) { /* malformed string? */ XDVI_WARNING((stderr, "Malformed content-type \"%s\" (should be \"type/subtype\")", test)); return False; } subtype_test++; /* check whether it either matches the strings or a wildcard */ if ((*pattern == '*' && *subtype_pattern == '*') || (*pattern == '*' && strcmp(subtype_pattern, subtype_test) == 0) || (*subtype_pattern == '*' && memcmp(pattern, test, subtype_test - test) == 0) || (strcmp(subtype_pattern, subtype_test) == 0 && memcmp(pattern, test, subtype_test - test) == 0)) { return True; } return False; } static Boolean run_test_command(const char *cmd, const char *arg) { int retval; const char *ptr; size_t len; char *syscmd = NULL; UNUSED(arg); /* FIXME */ if (cmd == NULL) return True; syscmd = xmalloc(strlen(cmd) + strlen(arg) + 1); if ((ptr = find_format_str(cmd, "%s")) != NULL) { len = 2; } else if ((ptr = find_format_str(cmd, "%u")) != NULL) { len = 2; } else { len = 0; ptr = strchr(cmd, '\0'); } /* build system command */ memcpy(syscmd, cmd, ptr - cmd); if (len > 0) { /* append argument */ strcpy(syscmd + (ptr - cmd), arg); strcpy(syscmd + (ptr - cmd) + strlen(arg), ptr + len); } else { syscmd[ptr - cmd] = '\0'; } retval = system(syscmd); TRACE_HTEX((stderr, "Execution of test command `%s' returned value %d", syscmd, retval)); free(syscmd); return retval == 0; } char * figure_viewer(const char *content_type, const char **format_string, Boolean *needs_terminal, const char *arg) { int i; /* Hardwire xdvi for this MIME type so that xdvizilla isn't used, which would be too dangerous since xdvizilla tries to unlink the DVI file by default. There might be other DVI viewers, but since the user invoking this from xdvi anyway ... FIXME: A better way would be to always copy the original file, like e.g. Acroread does it; see comment in launch_program(), hypertex.c. Furthermore, xdvizilla has been retired in the meantime. */ /* FIXME: why do we actually need format_string - why not sprintf() directly into the target? */ if (strcmp(content_type, "application/x-dvi") == 0) { *format_string = "%s"; *needs_terminal = False; return xstrdup("xdvi %s"); } /* try each command from our mailcap list */ for (i = 0; i < m_mailcap_currlen; i++) { if (globals.debug & DBG_HTEX) { fprintf(stderr, "type |%s| viewer |%s| needsterminal=%s testcmd |%s|\n", m_mailcap[i].content_type, m_mailcap[i].command, m_mailcap[i].needsterminal ? "yes" : "no", m_mailcap[i].testcmd ? m_mailcap[i].testcmd : "None"); } if (match_content_type(m_mailcap[i].content_type, content_type) && run_test_command(m_mailcap[i].testcmd, arg)) { *format_string = m_mailcap[i].format_string; *needs_terminal = m_mailcap[i].needsterminal; return xstrdup(m_mailcap[i].command); } } /* failure */ return NULL; } /* return the mime type for filename, or default types for non-recognized extensions/no extensions */ char * figure_mime_type(const char *filename) { int i; char *extension, *cp; char *content_type = NULL; /* First check for the mailcap and mime files */ parsemimes(); parsemailcap(); if (globals.debug & DBG_HTEX) fprintf(stderr, "figure_mime_type: Called to find type of %s\n", filename); /* See if this is a directory */ if (filename[strlen(filename) - 1] == '/') { if (globals.debug & DBG_HTEX) fprintf(stderr, "It's a directory, returning unknownExtensionMimeType: %s\n", resource.unknown_mime_suffix); return resource.unknown_mime_suffix; } /* See if filename extension is on the mime list: */ extension = strrchr(filename, '.'); if (extension == NULL) { TRACE_HTEX((stderr, "No extension, defaulting to noExtensionMimeType: %s\n", resource.no_mime_suffix)); return resource.no_mime_suffix; } extension++; /* * corrupt URLs might have empty extensions; we need to catch this, * since the while loop below would not terminate in that case: */ if (strcmp(extension, "") == 0) { XDVI_WARNING((stderr, "Empty extension for file name or URL `%s'\n", filename)); return resource.no_mime_suffix; } for (i = 0; i < m_mimemap_currlen; i++) { /* * find extension in m_mimemap[i].extensions, a space-separated list * of extension strings. */ cp = m_mimemap[i].extensions; while ((cp = strstr(cp, extension)) != NULL) { if ((cp - m_mimemap[i].extensions > 0) && (cp[-1] != ' ')) { cp++; continue; } cp += strlen(extension); if ((*cp != ' ') && (*cp != '\0')) continue; content_type = m_mimemap[i].content_type; break; } if (content_type != NULL) break; } if (content_type == NULL) { content_type = xstrdup(resource.unknown_mime_suffix); TRACE_HTEX((stderr, "Unknown extension, defaulting to unknownExtensionMimeType: %s", content_type)); } else { TRACE_HTEX((stderr, "Found mime type: %s", content_type)); } return content_type; } xdvik-ja-22.84.16-j1.40/texk/xdvik/pagehist.h0000664000175000017500000000266111032450154020140 0ustar uwabamiuwabami/* * Copyright (c) 2004 Stefan Ulrich * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef PAGEHIST_H_ #define PAGEHIST_H_ extern void page_history_move(int n); extern void page_history_insert(int n); extern void page_history_delete(int n); extern void page_history_update_toolbar_navigation(void); extern void page_history_clear(void); extern int page_history_get_page(void); #endif /* PAGEHIST_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/tests/0000775000175000017500000000000011742727531017336 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/texk/xdvik/tests/run_tests.c0000664000175000017500000000561311374720735021535 0ustar uwabamiuwabami#include #include #include #include "run_tests.h" #include "util.h" /* helper routines */ Boolean test_str_equality(int verbosity, const char *str1, const char *str2) { int res = strcmp(str1, str2); if (res != 0) { if (verbosity) { ERROR((stderr, "|%s| != |%s|\n", str1, str2)); } return False; } if (verbosity) { INFO((stderr, "|%s| == |%s|\n", str1, str2)); } return True; } Boolean test_str_list_equality(int verbosity, char **str_list1, char **str_list2) { size_t i; for (i = 0; str_list1[i] != NULL || str_list2[i] != NULL; i++) { int res; if (str_list1[i] == NULL || str_list2[i] == NULL) { if (verbosity) { ERROR((stderr, "Items %ld differ: |%s| != |%s|\n", (long) i, str_list1[i], str_list2[i])); } return False; } res = strcmp(str_list1[i], str_list2[i]); if (res != 0) { if (verbosity) { ERROR((stderr, "Items %ld differ: |%s| != |%s|\n", (long) i, str_list1[i], str_list2[i])); } return False; } else if (verbosity) { INFO((stderr, "Items %ld equal: |%s| == |%s|\n", (long) i, str_list1[i], str_list2[i])); } } return True; } struct test_proc { const char *name; testProcT proc; }; static size_t m_test_proc_size = 0; static struct test_proc *m_test_proc_list = NULL; void register_test(testProcT proc, const char *name) { size_t old_idx = m_test_proc_size; m_test_proc_size++; m_test_proc_list = xrealloc(m_test_proc_list, m_test_proc_size * sizeof *m_test_proc_list); m_test_proc_list[old_idx].name = xstrdup(name); m_test_proc_list[old_idx].proc = proc; } static Boolean run_all_tests(int verbosity) { size_t i; int tests_failed = 0; int tests_ok = 0; fprintf(stdout, "\nGoing to run %ld tests ...\n", (long) m_test_proc_size); for (i = 0; i < m_test_proc_size; i++) { Boolean retval = m_test_proc_list[i].proc(verbosity); if (!retval) { tests_failed++; m_test_proc_list[i].proc(True); } else { tests_ok++; } fprintf(stdout, "%sTest %ld: %s (%s)\n", retval ? "" : "*****", (long) i + 1, retval ? "OK" : "FAILURE", m_test_proc_list[i].name); } /* fprintf(stdout, "Ran %d tests: %d OK, %d failures.\n", m_test_proc_size, tests_ok, tests_failed); */ if (tests_failed == 0) { fprintf(stdout, "Great! All tests succeeded.\n\n"); return True; } else { fprintf(stdout, "Darn, %d of %ld tests failed!\n\n", tests_failed, (long) m_test_proc_size); return False; } } int main(int argc, char *argv[]) { int verbosity = 0; /* fprintf(stderr, "argc: %d, argv1: %s\n", argc, argv[1]); */ if (argc > 1 && strcmp(argv[1], "-v") == 0) { verbosity = 1; } register_all_from_test_dl_list(); register_all_from_test_string_utils(); register_all_from_test_string_list(); register_all_from_test_util(); if (!run_all_tests(verbosity)) return 1; else return 0; } xdvik-ja-22.84.16-j1.40/texk/xdvik/tests/test1.c0000664000175000017500000000040011032450154020516 0ustar uwabamiuwabami#include "run_tests.h" static Boolean mytest1(void) { return 1 == 1; } static Boolean mytest2(void) { return 0 == 0; } void register_all_from_test1(void) { register_test(mytest1, "Trivial equality"); register_test(mytest2, "ld_list"); } xdvik-ja-22.84.16-j1.40/texk/xdvik/tests/test_util.c0000664000175000017500000000201511032450154021476 0ustar uwabamiuwabami#include "run_tests.h" #include "util.h" #include "string-utils.h" static Boolean test_src_format_arguments(int verbose) { static struct stringtest { char *str; char *res[16]; /* big enuff */ } tests[] = { { "emacsclient --no-wait +%l %f", { "emacsclient", "--no-wait", "+10", "/this/is/a/filename.tex", NULL } }, { "vim +%l:%c %f", { "vim", "+10:0", "/this/is/a/filename.tex", NULL } }, { "bazoo %f:%l:%c", { "bazoo", "/this/is/a/filename.tex:10:0", NULL } } }; const char *filename = "/this/is/a/filename.tex"; int lineno = 10; int colno = 0; size_t i; Boolean res = True; for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) { char **argv = get_separated_list(tests[i].str, " \t", True); argv = src_format_arguments(argv, filename, lineno, colno); if (!test_str_list_equality(verbose, argv, tests[i].res)) { res = False; } } return res; } void register_all_from_test_util(void) { register_test(test_src_format_arguments, "src_format_arguments"); } xdvik-ja-22.84.16-j1.40/texk/xdvik/tests/run_tests.h0000664000175000017500000000225511032450154021523 0ustar uwabamiuwabami#include "xdvi-config.h" #include /* ZLB: must be before sys/socket.h for IRIX 5.3 */ #include #include /* this defines FASYNC */ #include /* this defines SIOCSPGRP and FIOASYNC */ #include /* this defines WIFEXITED and WEXITSTATUS */ #include "xdvi.h" #include "hypertex.h" #include "dvi-init.h" #include "special.h" #include "string-utils.h" #include "kpathsea/tex-file.h" #include "events.h" #include "util.h" #define ERROR(X) do { fprintf(stderr, "%s:%d: Error: ", __FILE__, __LINE__); fprintf X; } while(0) #define INFO(X) do { fprintf(stderr, "%s:%d: Info: ", __FILE__, __LINE__); fprintf X; } while(0) typedef Boolean (*testProcT)(int verbosity); extern void register_test(testProcT testproc, const char *name); /* test helpers */ extern Boolean test_str_equality(int verbosity, const char *str1, const char *str2); extern Boolean test_str_list_equality(int verbosity, char **str_list1, char **str_list2); extern void register_all_from_test_dl_list(void); extern void register_all_from_test_string_utils(void); extern void register_all_from_test_string_list(void); extern void register_all_from_test_util(void); xdvik-ja-22.84.16-j1.40/texk/xdvik/tests/test_string_list.c0000664000175000017500000000316111032450154023065 0ustar uwabamiuwabami#include "run_tests.h" #include "string_list.h" static Boolean string_list_test1(int verbosity) { static char *test_str = "This\nis\na\ntest\n"; static char *test_str_rotated = "is\na\ntest\nThis\n"; static char *test_list[] = { "This", "is", "a", "test", NULL }; char *res_str; char **test_list_orig, **test_list_rotated; res_str = string_list_to_str(test_list, "\n"); if (!test_str_equality(verbosity, res_str, test_str)) { return False; } test_list_rotated = string_list_rotate_down(test_list); if (!test_str_equality(verbosity, string_list_to_str(test_list_rotated, "\n"), test_str_rotated)) { return False; } test_list_orig = string_list_rotate_up(test_list_rotated); if (!test_str_list_equality(verbosity, test_list_orig, test_list)) { return False; } return True; } static Boolean string_list_test2(int verbosity) { static char *test_str = ""; static char *test_list[] = { NULL }; char **res_list; char *res_str = string_list_to_str(test_list, "#"); if (!test_str_equality(verbosity, res_str, test_str)) { return False; } /* string_list_print(test_list); */ res_list = string_list_rotate_down(test_list); /* string_list_print(res_list); */ if (!test_str_equality(verbosity, test_str, string_list_to_str(res_list, "\n"))) { return False; } return True; } /* todo: append, prepend, reorder */ void register_all_from_test_string_list(void) { register_test(string_list_test1, "string lists"); register_test(string_list_test2, "empty string lists"); } xdvik-ja-22.84.16-j1.40/texk/xdvik/tests/README0000664000175000017500000000167611032450154020212 0ustar uwabamiuwabami1. To run the tests: $ cd texk/xdvik $ make test or $ make test_verbose to see more details on the tests. 2. To add a new test: (a) Adding a test to an existing test file: - create a new function "static Boolean (int verbosity)" - add a register_test() call to the "register_all_...()" method at the bottom of the file: "register_test(, "") (b) Adding a new test file, e.g. test_foo.c: - add test_foo.o to the "objects" definition in Makefile.in - add a declaration for "extern void register_all_from_test_foo()" to run_tests.h - add a call to "register_all_from_test_foo()" to run_tests.c - define "register_all_from_test_foo(void)" at the botton of test_foo.c and add register_test() methods for all test functions in the file (see the existing test files for examples). - rerun "make depend" as described in the toplevel file "README_maintainers". xdvik-ja-22.84.16-j1.40/texk/xdvik/tests/test_dl_list.c0000664000175000017500000000440711374720735022200 0ustar uwabamiuwabami#include "run_tests.h" #include "dl_list.h" static struct elem { int i; const char *name; } elems[] = { { 1, "Hello" }, { 2, " " }, { 3, "World" }, }; static struct elem test_elems[] = { { 1, "Hello" }, { 3, "Another" }, { 1, "Hello" }, { 2, " " }, { 3, "World" }, }; static void printer_func(const void *e_in) { const struct elem *e = (const struct elem *)e_in; INFO((stderr, "ELEM: %d, `%s'\n", e->i, e->name)); } static Boolean test_equality(int verbose, struct dl_list *list, const struct elem *elems, size_t list_len, size_t elem_cnt) { size_t i; struct dl_list *ptr = NULL; if (list_len != elem_cnt) { if (verbose) { ERROR((stderr, "List len %ld != %ld\n", (long) list_len, (long) elem_cnt)); } return False; } for (i = 0, ptr = list; i < list_len; i++, ptr = ptr->next) { const struct elem *curr = (const struct elem *)ptr->item; if (verbose) { INFO((stderr, "Checking: `%s' - `%s'\n", elems[i].name, curr->name)); } if (strcmp(test_elems[i].name, curr->name) != 0) { return False; } if (elems[i].i != curr->i) { return False; } } return True; } static Boolean dl_list_test1(int verbosity) { struct dl_list *testlist = NULL; size_t list_len; static struct elem e1 = { 3, "Another" }; static struct elem e2 = { 1, "Hello" }; testlist = dl_list_insert(testlist, &elems[0]); testlist = dl_list_insert(testlist, &elems[1]); testlist = dl_list_insert(testlist, &elems[2]); testlist = dl_list_head(testlist); if (verbosity) { testlist = dl_list_head(testlist); dl_list_apply(testlist, printer_func); } list_len = dl_list_len(testlist); test_equality(verbosity, testlist, elems, list_len, 3); /* test pushing */ testlist = dl_list_push_front(testlist, &e1); testlist = dl_list_push_front(testlist, &e2); testlist = dl_list_head(testlist); list_len = dl_list_len(testlist); test_equality(verbosity, testlist, test_elems, list_len, 5); /* test truncating */ testlist = dl_list_truncate(testlist); testlist = dl_list_truncate(testlist); return True; } void register_all_from_test_dl_list(void) { register_test(dl_list_test1, "dl_list construction"); } xdvik-ja-22.84.16-j1.40/texk/xdvik/tests/test_string_utils.c0000664000175000017500000002612511314111470023255 0ustar uwabamiuwabami#include "xdvi-config.h" #include "xdvi.h" #include #include #include #include #include "run_tests.h" #include "string-utils.h" #define DEBUG 0 static Boolean test_get_separated_list(int verbose) { char *test_list1[] = { "This is the first line", "This is the second", "This, is the third", "The last one", NULL }; char *test_list2[] = { "This", "is", "another", "first", "line", NULL }; const char *teststring1 = "This is the first line,This is the second,\"This, is the third\",The last one"; const char *teststring2 = "This\nis another\tfirst line"; char **res_list1 = get_separated_list(teststring1, ",", True); char **res_list2 = get_separated_list(teststring2, " \t\n", True); /* TODO: deallocate? */ return test_str_list_equality(verbose, test_list1, res_list1) && test_str_list_equality(verbose, test_list2, res_list2); } static Boolean test_str_is_prefix(int verbose) { static struct stringtest { char *str1; char *str2; Boolean case_sensitive; Boolean result; } tests[] = { { "foo", "foobar", True, True }, { "foo", "Foobar", True, False }, { "foo", "Foobar", False, True }, { "foo", "FOObar", False, True }, { "foo", "foo", True, True }, { "f", "foo", True, True }, { "b", "foo", True, False }, { "foo", "b", True, False }, { "", "foo", True, True }, }; size_t i; Boolean result = True; for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) { if (verbose) { INFO((stderr, "str_is_prefix(%s,%s,%d) -> %d == %d?\n", tests[i].str1, tests[i].str2, tests[i].case_sensitive, str_is_prefix(tests[i].str1, tests[i].str2, tests[i].case_sensitive), tests[i].result)); } if (str_is_prefix(tests[i].str1, tests[i].str2, tests[i].case_sensitive) != tests[i].result) { result = False; } } return result; } static Boolean test_str_is_suffix(int verbose) { static struct stringtest { char *str1; char *str2; Boolean case_sensitive; Boolean result; } tests[] = { { "bar", "foobar", True, True }, { "bar", "FooBar", True, False }, { "bar", "fooBAR", False, True }, { "bar", "fooBaR", False, True }, { "bar", "bar", True, True }, { "r", "bar", True, True }, { "x", "bar", True, False }, { "bar", "r", True, False }, { "", "bar", True, True }, { "", "", True, True }, }; size_t i; Boolean result = True; for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) { if (verbose) { INFO((stderr, "str_is_suffix(%s,%s,%d) -> %d == %d?\n", tests[i].str1, tests[i].str2, tests[i].case_sensitive, str_is_suffix(tests[i].str1, tests[i].str2, tests[i].case_sensitive), tests[i].result)); } if (str_is_suffix(tests[i].str1, tests[i].str2, tests[i].case_sensitive) != tests[i].result) { result = False; } } return result; } static Boolean test_is_spaces_only(int verbose) { static struct stringtest { char *str1; Boolean result; } tests[] = { { "bar", False }, { " \t\n ", True }, { " a ", False }, { "", True }, }; size_t i; Boolean result = True; for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) { if (verbose) { INFO((stderr, "is_spaces_only(%s) -> %d == %d?\n", tests[i].str1, is_spaces_only(tests[i].str1), tests[i].result)); } if (is_spaces_only(tests[i].str1) != tests[i].result) { result = False; } } return result; } static Boolean test_my_stristr(int verbose) { static struct stringtest { char *str1; char *str2; char *result; } tests[] = { { "paloozah", "ooz", "oozah" }, { "paloozah", "pa", "paloozah" }, { "paloozah", "par", NULL }, { "paloozah", "x", NULL }, { "PALOOZAH", "ooz", "OOZAH" }, { "PALOOZAH", "ah", "AH" }, { "PALOOZAH", "h", "H" }, { "h", "h", "h" }, { "H", "h", "H" }, { "", "h", NULL }, }; size_t i; Boolean result = True; for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) { char *res_str = my_stristr(tests[i].str1, tests[i].str2); /* We want to verify that my_stristr(STR1, STR2) is either NULL or * a substring of STR1, but, e.g., `"oozah" == "paloozah" + 3' may * or may not be true (depending on compiler optimizations). */ char *test_str = tests[i].result ? tests[i].str1 + strlen(tests[i].str1) - strlen(tests[i].result) : NULL; if (verbose) { INFO((stderr, "my_stristr(%s, %s) -> %s == %s?\n", tests[i].str1, tests[i].str2, res_str, test_str)); } if (res_str != test_str) { result = False; } } return result; } static Boolean test_format_arg(int verbose) { static struct stringtest { char *str1; char *arg; char *result; } tests[] = { { "netscape(%s, same-window)", "file.html", "netscape(file.html, same-window)" }, { "netscape(same-window)", "file.html", "netscape(same-window)" }, { "%s", "a", "a" }, { "", "", "" }, }; size_t i; int tmpcnt = 0; Boolean result = True; for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) { if (verbose) { INFO((stderr, "format_arg(%s) -> %s == %s, %d\n", tests[i].str1, format_arg(tests[i].str1, tests[i].arg, &tmpcnt), tests[i].result, tmpcnt)); } if (!test_str_equality(verbose, format_arg(tests[i].str1, tests[i].arg, &tmpcnt), tests[i].result)) { result = False; } } /* tempcnt shouldn't be reset to 0 by format_arg() */ if (tmpcnt != 1) { ERROR((stderr, "tmpcnt should be 1\n")); result = False; } return result; } static Boolean test_escape_format_arg(int verbose) { static struct stringtest { char *str; char *result; } tests[] = { { "netscape(%s, same-window)", "netscape(%%s, same-window)" }, { "%%s", "%%%%s" }, { "%d%s", "%%d%%s" }, { "a", "a" }, { "", "" }, }; size_t i; Boolean result = True; for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) { if (verbose) { INFO((stderr, "escape_format_arg(%s) -> %s == %s\n", tests[i].str, escape_format_arg(tests[i].str), tests[i].result)); } if (!test_str_equality(verbose, escape_format_arg(tests[i].str), tests[i].result)) { result = False; } } return result; } static Boolean test_filename_append_dvi(int verbose) { static struct stringtest { char *str1; char *str2; } tests[] = { { "file:///tmp/foo.bar", "/tmp/foo.bar" }, { "file:///tmp/foo", "/tmp/foo.dvi" }, /* the following two mimick firefox behaviour with double/single slashes */ { "file://tmp/foo", "/foo.dvi" }, { "file:/tmp/foo", "/tmp/foo.dvi" }, { "file://localhost/tmp/foo", "/tmp/foo.dvi" }, { "~/tmp/foo", "~/tmp/foo.dvi" }, }; size_t i; Boolean result = True; for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) { char *tmp = filename_append_dvi(tests[i].str1); if (verbose) { INFO((stderr, "filename_append_dvi(%s) -> %s == %s?\n", tests[i].str1, tmp, tests[i].str2)); } if (!test_str_equality(verbose, tmp, tests[i].str2)) { result = False; } free(tmp); } return result; } static Boolean test_canonicalize_path(int verbose) { static struct stringtest { char *str1; char *str2; } tests[] = { { "/foo/a/bz.to/bar.dvi", "/foo/a/bz.to/bar.dvi" }, { "/foo/../bar.dvi", "/bar.dvi" }, { "/foo/../bar.dvi", "/bar.dvi" }, { "/foo/./roo/./bar.dvi", "/foo/roo/bar.dvi" }, { "/foo/./roo/../bar.dvi", "/foo/bar.dvi" }, }; size_t i; Boolean result = True; for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) { if (verbose) { INFO((stderr, "canonicalize_path(%s) -> %s == %s?\n", tests[i].str1, canonicalize_path(tests[i].str1), tests[i].str2)); } if (!test_str_equality(verbose, canonicalize_path(tests[i].str1), tests[i].str2)) { result = False; } } return result; } static Boolean test_expand_filename(int verbose) { char cwd[10240]; char *currpath, *testpath1, *testpath2; currpath = xstrdup(getcwd(cwd, 10240)); testpath1 = expand_filename(__FILE__, USE_CWD_PATH); globals.dvi_file.dirname = xstrdup(cwd); globals.dvi_file.dirname = xstrcat(globals.dvi_file.dirname, "/"); testpath2 = expand_filename(__FILE__, USE_DVI_PATH); if (__FILE__[0] == '/') { free(currpath); currpath = xstrdup(__FILE__); } else { currpath = xstrcat(currpath, "/"); currpath = xstrcat(currpath, __FILE__); } return test_str_equality(verbose, testpath1, currpath) \ && test_str_equality(verbose, testpath2, currpath); } static Boolean test_get_extension(int verbose) { const char *test_strings[][2] = { { "/dev/fd/3", NULL }, { "/home/user/file.dvi", ".dvi" }, { "/home/user/file.ps", ".ps" }, { "/home/user.bar/file.dvi", ".dvi" }, { "/home/user.bar/file", NULL }, { "/home/user/file", NULL }, { NULL, NULL } }; size_t i; for (i = 0; test_strings[i][0] != NULL; i++) { const char *tmp = get_extension(test_strings[i][0]); if (tmp == NULL && test_strings[i][1] == NULL) { if (verbose) INFO((stderr, "Checking extension of |%s| OK: == \n", test_strings[i][0])); } else if (tmp == NULL && test_strings[i][1] != NULL) { if (verbose) ERROR((stderr, "extension of |%s| gave - should be |%s|\n", test_strings[i][0], test_strings[i][1])); return False; } else if (tmp != NULL && test_strings[i][1] == NULL) { if (verbose) ERROR((stderr, "extension of |%s| gave |%s| - should be \n", test_strings[i][0], tmp)); return False; } else { if (strcmp(tmp, test_strings[i][1]) != 0) { if (verbose) ERROR((stderr, "ERROR: extension of |%s| gave |%s| - should be |%s|\n", test_strings[i][0], tmp, test_strings[i][1])); return False; } else { if (verbose) INFO((stderr, "Checking extension of |%s| OK: |%s| == |%s|\n", test_strings[i][0], tmp, test_strings[i][1])); } } } return True; } static Boolean test_length_of_int(int verbose) { static struct stringtest { int d; int len; } tests[] = { { 0, 1 }, { 1, 1 }, { 11, 2 }, { 111, 3 }, { 100, 3 }, { 100000, 6 }, { 999999, 6 }, { 1000000, 7 }, { 101, 3 }, { 001, 1 }, }; size_t i; Boolean result = True; for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) { if (verbose) { INFO((stderr, "length_of_int(%d) -> %d == %d?\n", tests[i].d, length_of_int(tests[i].d), tests[i].len)); } if (length_of_int(tests[i].d) != tests[i].len) { result = False; } } return result; } void register_all_from_test_string_utils(void) { register_test(test_str_is_prefix, "str_is_prefix()"); register_test(test_str_is_suffix, "str_is_suffix()"); register_test(test_is_spaces_only, "is_spaces_only()"); register_test(test_my_stristr, "my_stristr()"); register_test(test_filename_append_dvi, "filename_append_dvi()"); /* TODO: expand_filename_append_dvi */ register_test(test_canonicalize_path, "canonicalize_path()"); register_test(test_format_arg, "format_arg()"); register_test(test_escape_format_arg, "escape_format_arg()"); register_test(test_expand_filename, "expand_filename()"); register_test(test_get_separated_list, "get_separated_list"); register_test(test_length_of_int, "length_of_int()"); register_test(test_get_extension, "Filename extensions"); } xdvik-ja-22.84.16-j1.40/texk/xdvik/tests/Makefile.am0000664000175000017500000000130511276240141021356 0ustar uwabamiuwabami## Makefile.am for the TeX Live subdirectory texk/xdvik/tests/ ## ## Copyright (C) 2009 Peter Breitenlohner ## You may freely use, modify and/or distribute this file. ## include ../common.am INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/gui $(common_includes) AM_CFLAGS = $(WARNING_CFLAGS) check_PROGRAMS = run_tests TESTS = $(check_PROGRAMS) run_tests_SOURCES = \ run_tests.c \ run_tests.h \ test_dl_list.c \ test_string_list.c \ test_string_utils.c \ test_util.c $(run_tests_OBJECTS): ../libxdvi.a $(common_dependencies) LDADD = ../libxdvi.a $(common_ldadd) ../libxdvi.a: $(libxdvi_dependencies) cd .. && $(MAKE) $(AM_MAKEFLAGS) libxdvi.a ## Not used ## EXTRA_DIST = test1.c xdvik-ja-22.84.16-j1.40/texk/xdvik/search-internal.c0000664000175000017500000020443111032450154021405 0ustar uwabamiuwabami/* * Copyright (c) 2003-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ /* How dvi search works: (1) Map the search string passed by the user from resource.text_encoding to UTF-8 (currently only maps ISO_8859-1), and create a regexp from the string if needed. If case-insensitive matching is activated and regexp search is not active, the search string is converted to lowercase. For regexp searches, the flag available with regcomp to ignore case is used. (2) Scan 2 adjacent pages (so that we can also find matches across page boundaries), collecting the text into a char *buffer. This involves the following steps: - Map characters from wide_ubyte to uint32_t encoding (ucs-4), using and Adobe names lookup table (for Postscript Type1 fonts) or font-specific character info (for Metafont fonts). This step also maps accented glyphs to composite glyphs, expands ligatures to separate characters (e.g. `ffi' to `f'`f'`i'), and tries to detect word boundaries and line breaks. If case-insensitive matching is activated, the characters are also lowercased in this step. Optionally, hyphenation can be removed in this step. Routine: do_char() in dvi-draw.c (must be in dvi_draw.c since we need access to drawing-related stuff like `currinf' to get information about the current font, position in the DVI file etc.). - Save the uint32_t characters into a char *buffer, mapping to utf-8. (3) Search the buffer from (2) for the string from (1). If a match has been found, the page is scanned again to store the bounding box information of the matched text for highlighting it. */ #include "xdvi-config.h" #include "xdvi.h" #define SWITCH_TO_UTF8 1 #if HAVE_REGEX_H #include #endif #if HAVE_ICONV_H #include #endif #include #if USE_LANGINFO #include #endif #include #include #include "dvi-init.h" /* for total_pages */ #include "dvi-draw.h" #include "search-internal.h" #include "search-dialog.h" #include "message-window.h" #include "statusline.h" #include "events.h" #include "encodings.h" #include "pagesel.h" #include "events.h" #include "util.h" #include "x_util.h" #include "string-utils.h" #include "mag.h" #include "pagehist.h" #include "translations.h" #define DEBUG_SEARCH 0 /* #define MATCH_HIGHLIGHT_INVERTED 1 */ /* margins for highlighting the match */ const int BBOX_LOWER_MARGIN = 2; const int BBOX_UPPER_MARGIN = 1; #if 0 #define GET_BBOX(bbox, shrink, x, y, w, h) \ x = (bbox.ulx / (double)shrink + 0.5) - BBOX_UPPER_MARGIN; \ y = (bbox.uly / (double)shrink + 0.5) - BBOX_UPPER_MARGIN; \ w = ((bbox.lrx - bbox.ulx) / (double)shrink) + 0.5 \ + BBOX_UPPER_MARGIN + BBOX_LOWER_MARGIN + 1; \ h = ((bbox.lry - bbox.uly) / (double)shrink) + 0.5 \ + BBOX_UPPER_MARGIN + BBOX_LOWER_MARGIN + 2; #endif /* 0 */ /* use integer arithmetic */ #define GET_BBOX(bbox, shrink, x, y, w, h) \ x = (bbox.ulx + shrink / 2) / shrink - BBOX_UPPER_MARGIN; \ y = (bbox.uly + shrink / 2) / shrink - BBOX_UPPER_MARGIN; \ w = (bbox.lrx - bbox.ulx + shrink - 1) / shrink \ + BBOX_UPPER_MARGIN + BBOX_LOWER_MARGIN + 1; \ h = (bbox.lry - bbox.uly + shrink - 1) / shrink \ + BBOX_UPPER_MARGIN + BBOX_LOWER_MARGIN + 2; /* access from drawing routines */ static struct word_info *m_info = NULL; static int m_match_page = -1; /* Force restarting search if user switches pages. E.g. if the current match is the last of 3 matches on the page, and user re-selects the page, the search should start again with match 1. Similarly, if current page is second of two pages scanned, and user clicks on first, search shouldn't continue on second page but restart on current one. */ static Boolean m_changed_page = False; static Boolean m_highlight_region_changed = True; void search_signal_page_changed(void) { m_changed_page = True; } static void reset_info(struct word_info *w_info) { if (w_info == NULL) return; free(w_info->txt_buf); w_info->txt_buf = NULL; w_info->txt_buf_size = 0; w_info->curr_buf_idx = 0; free(w_info->bboxes); w_info->bboxes = NULL; w_info->bboxes_size = 0; w_info->bboxes_idx = 0; m_highlight_region_changed = True; } static void generate_highlight_expose(const struct word_info *info) { int x1 = INT_MAX, y1 = INT_MAX, x2 = 0, y2 = 0; size_t i; for (i = 0; info->bboxes != NULL && i <= info->bboxes_idx && info->bboxes[i].ulx < INT_MAX; i++) { if (info->bboxes[i].ulx < x1) x1 = info->bboxes[i].ulx; if (info->bboxes[i].uly < y1) y1 = info->bboxes[i].uly; if (info->bboxes[i].lrx > x2) x2 = info->bboxes[i].lrx; if (info->bboxes[i].lry > y2) y2 = info->bboxes[i].lry; } #if 0 fprintf(stderr, "region for exposure: %d,%d to %d,%d\n", x1, y1, x2, y2); #endif /* 0 */ x1 -= MAX(BBOX_UPPER_MARGIN, BBOX_LOWER_MARGIN) - 2; y1 -= MAX(BBOX_UPPER_MARGIN, BBOX_LOWER_MARGIN) - 2; x2 += MAX(BBOX_UPPER_MARGIN, BBOX_LOWER_MARGIN) + 2; y2 += MAX(BBOX_UPPER_MARGIN, BBOX_LOWER_MARGIN) + 2; clearexpose(&mane, x1, y1, x2 - x1, y2 - y1); } static void draw_bboxes(const struct word_info *info) { size_t i; static GC bboxGC = 0; static Boolean highlight_inverted_bak; if (bboxGC != 0 && highlight_inverted_bak != resource.match_highlight_inverted) { XFreeGC(DISP, bboxGC); bboxGC = 0; } highlight_inverted_bak = resource.match_highlight_inverted; if (resource.match_highlight_inverted) { if (MAGNIFIER_ACTIVE && !INSIDE_MANE_WIN) return; TRACE_FIND((stderr, "-- EXPOSED region: x %d, y %d, w %d, h %d", globals.win_expose.min_x, globals.win_expose.min_y, globals.win_expose.max_x - globals.win_expose.min_x, globals.win_expose.max_y - globals.win_expose.min_y)); if (bboxGC == 0) { XGCValues values; unsigned long valuemask; values.function = GXinvert; /* was: GXxor; see bug #850788 */ if (values.function == GXinvert) { valuemask = GCFunction; } else { values.foreground = WhitePixelOfScreen(SCRN) ^ BlackPixelOfScreen(SCRN); /* fprintf(stderr, "foreground: 0x%lx, white pixel: 0x%lx, black pixel: 0x%lx\n", */ /* values.foreground, WhitePixelOfScreen(SCRN), BlackPixelOfScreen(SCRN)); */ valuemask = GCFunction | GCForeground; } bboxGC = XCreateGC(DISP, XtWindow(globals.widgets.top_level), valuemask, &values); } } else if (bboxGC == 0) { XGCValues values; values.function = GXcopy; values.line_width = 2; values.cap_style = CapRound; values.foreground = resource.hl_Pixel; values.background = resource.back_Pixel; bboxGC = XCreateGC(DISP, XtWindow(globals.widgets.top_level), GCFunction | GCLineWidth | GCCapStyle | GCForeground | GCBackground, &values); } TRACE_FIND((stderr, "bboxes_idx: %lu", (unsigned long)info->bboxes_idx)); for (i = 0; info->bboxes != NULL && i <= info->bboxes_idx && info->bboxes[i].ulx < INT_MAX; i++) { int x, y, w, h; if (info->bboxes[i].ulx > 10000 || info->bboxes[i].uly > 10000) { TRACE_FIND((stderr, "skipping box: x %d, y %d", info->bboxes[i].ulx, info->bboxes[i].uly)); continue; } GET_BBOX(info->bboxes[i], currwin.shrinkfactor, x, y, w, h); TRACE_FIND((stderr, "DRAWING box: x %d, y %d, w %d, h %d; shrink: %d", x, y, w, h, currwin.shrinkfactor)); if (resource.match_highlight_inverted) { if (clip_region(&x, &y, &w, &h)) { TRACE_FIND((stderr, "CLIPPED box: x %d, y %d, w %d, h %d", x, y, w, h)); TEST_DELAY("Redrawing BBOX ............... "); XFillRectangle(DISP, mane.win, bboxGC, x, y, w, h); TEST_DELAY("Inverting BBOX ............... "); } } /* XDrawRectangle(DISP, mane.win, globals.gc.high, x, y, w + 0, h + 0); */ /* clearexpose(&mane, x, y, w + 3, h + 3); */ /* XDrawRectangle(DISP, mane.win, globals.gc.high, x, y, w + 2, h + 2); */ /* XDrawRectangle(DISP, mane.win, globals.gc.high, x + 1, y + 1, w, h); */ else { static XPoint points[5] = { {0,0}, {0,0}, {0,0}, {0,0}, {0,0} }; h++; points[0].x = x; points[0].y = y; points[1].x = w; points[2].y = h; points[3].x = -w; points[4].y = -h; XDrawLines(DISP, mane.win, bboxGC, points, 5, CoordModePrevious); } if (!MAGNIFIER_ACTIVE) { /* note: inverted y_max y_min, since we want to display the full box here */ scroll_page_if_needed(x + w, x, y + h, y); } } } /* return true if we have a match on page pageno */ Boolean search_have_match(int pageno) { /* fprintf(stderr, "pageno: %d --- m_info: %p\n", pageno, m_info); */ /* fprintf(stderr, "m_match_page: %d\n", m_match_page); */ return m_info != NULL && m_match_page == pageno; } /* TODO: Speed this up, by doing something like bsearch? */ /* Returns 2 if we're at the 1st or last character of the bbox, 1 if inside the bbox, and 0 else (currently the return value 2 is unused). */ int search_inside_bbox_match(int x, int y) { size_t i; ASSERT(m_info != NULL, "inside_match musn't be called with m_info == NULL!"); TRACE_FIND((stderr, "m_info->bboxes: %p; idx: %lu", (void *)m_info->bboxes, (unsigned long)m_info->bboxes_idx)); for (i = 0; m_info->bboxes != NULL && i <= m_info->bboxes_idx && m_info->bboxes[i].ulx < INT_MAX; i++) { TRACE_FIND((stderr, "inside_bbox_match: %d, %d", x, y)); TRACE_FIND((stderr, "x: %d, y: %d, x2: %d, y2: %d", (int)(m_info->bboxes[i].ulx / (double)currwin.shrinkfactor + 0.5), (int)(m_info->bboxes[i].uly / (double)currwin.shrinkfactor + 0.5), (int)(m_info->bboxes[i].lrx / (double)currwin.shrinkfactor + 0.5), (int)(m_info->bboxes[i].lry / (double)currwin.shrinkfactor + 0.5))); if (x >= (int)(m_info->bboxes[i].ulx / (double)currwin.shrinkfactor + 0.5) && x <= (int)(m_info->bboxes[i].lrx / (double)currwin.shrinkfactor + 0.5) && y >= (int)(m_info->bboxes[i].uly / (double)currwin.shrinkfactor + 0.5) && y <= (int)(m_info->bboxes[i].lry / (double)currwin.shrinkfactor + 0.5)) { TRACE_FIND((stderr, "%d == %d", x - 1, (int)(m_info->bboxes[i].ulx / (double)currwin.shrinkfactor + 0.5))); TRACE_FIND((stderr, "%d == %d", y - 1, (int)(m_info->bboxes[i].uly / (double)currwin.shrinkfactor + 0.5))); if (x - 1 == (int)(m_info->bboxes[i].ulx / (double)currwin.shrinkfactor + 0.5) && y - 1 == (int)(m_info->bboxes[i].uly / (double)currwin.shrinkfactor + 0.5)) return 2; else return 1; } } return 0; } void search_draw_inverted_regions(void) { if (m_info != NULL) { draw_bboxes(m_info); } } /* * shift everything in info down by 1 pages, so that info for page 1 becomes * info for page 0. */ static void shift_info_down(struct search_info *searchinfo, struct word_info *info, struct page_mapping *page_mapping) { size_t initial_offset = 0; if (page_mapping[0].offset != -1) { /* remember value */ initial_offset = page_mapping[0].offset; } if (globals.debug & DBG_FIND) { int i; fprintf(stderr, "current page_mapping:\n"); for (i = 0; i < 2; i++) { fprintf(stderr, "%d: %d\n", page_mapping[i].pageno, page_mapping[i].offset); } } TRACE_FIND((stderr, "initial offset: %lu", (unsigned long)initial_offset)); page_mapping[0].offset = page_mapping[1].offset - initial_offset; page_mapping[0].pageno = page_mapping[1].pageno; ASSERT(page_mapping[0].offset >= 0, "new index mustn't be negative!\n"); page_mapping[1].offset = page_mapping[1].pageno = -1; TRACE_FIND((stderr, "new val at 0: %d; curr_idx: %lu, len: %lu", page_mapping[0].offset, (unsigned long)(info->curr_buf_idx - initial_offset), (unsigned long)(strlen(info->txt_buf + initial_offset)))); /* move the text buffer down, and update its current index accordingly */ ASSERT(info->curr_buf_idx >= initial_offset, "info->curr_buf_idx mustn't become negative!"); memmove(info->txt_buf, info->txt_buf + initial_offset, info->curr_buf_idx - initial_offset + 1); info->curr_buf_idx -= initial_offset; TRACE_FIND((stderr, "new index: %lu", (unsigned long)info->curr_buf_idx)); searchinfo->from_pos -= initial_offset; searchinfo->to_pos -= initial_offset; if (searchinfo->from_pos < 0) searchinfo->from_pos = 0; if (searchinfo->to_pos < 0) searchinfo->to_pos = 0; TRACE_FIND((stderr, "new offsets: from=%d, to=%d", searchinfo->from_pos, searchinfo->to_pos)); } /* * shift everything in info up by 1 page, so that info for page 0 becomes info * for page 1. */ static void shift_info_up(struct word_info *info, struct page_mapping *page_mapping) { if (globals.debug & DBG_FIND) { int i; fprintf(stderr, "current page_mapping:\n"); for (i = 0; i < 2; i++) { fprintf(stderr, "%d: %d\n", page_mapping[i].pageno, page_mapping[i].offset); } } ASSERT(page_mapping[0].offset > 0, "info->curr_buf_idx mustn't become negative!"); info->curr_buf_idx = page_mapping[0].offset; TRACE_FIND((stderr, "new index: %lu", (unsigned long)info->curr_buf_idx)); page_mapping[1].offset = page_mapping[0].offset; page_mapping[1].pageno = page_mapping[0].pageno; page_mapping[0].offset = page_mapping[0].pageno = -1; } static void append_to_info(struct word_info *info, const char *str) { size_t len = strlen(str); size_t new_size = info->txt_buf_size; while (len >= new_size) { /* space for trailing 0 */ new_size++; } if (new_size > info->txt_buf_size) { info->txt_buf_size = new_size; info->txt_buf = xrealloc(info->txt_buf, sizeof *(info->txt_buf) * info->txt_buf_size); } memcpy(info->txt_buf + info->curr_buf_idx, str, len + 1); /* also copy trailing 0 */ info->curr_buf_idx += len; } /* append info2 to info1, enlarging info1 as needed. */ static void append_info(struct word_info *info1, const struct word_info *info2) { if (info2->txt_buf_size > 0) { info1->txt_buf = xrealloc(info1->txt_buf, sizeof *(info1->txt_buf) * (info1->txt_buf_size + info2->txt_buf_size)); memcpy(info1->txt_buf + info1->curr_buf_idx, info2->txt_buf, info2->txt_buf_size); info1->txt_buf_size += info2->txt_buf_size; info1->curr_buf_idx += info2->curr_buf_idx; } } /* prepend info1 to info2, enlarging info2 as needed. */ static void prepend_info(const struct word_info *info1, struct word_info *info2) { if (info1->txt_buf_size > 0) { info2->txt_buf = xrealloc(info2->txt_buf, sizeof *(info2->txt_buf) * (info2->txt_buf_size + info1->txt_buf_size + 1)); memmove(info2->txt_buf + info1->curr_buf_idx, info2->txt_buf, info2->curr_buf_idx); info2->txt_buf[info1->curr_buf_idx + info2->curr_buf_idx] = '\0'; memcpy(info2->txt_buf, info1->txt_buf, info1->curr_buf_idx); /* TRACE_FIND((stderr, "prepend_info: info2->txt_buf is: |%s|", info2->txt_buf)); */ info2->txt_buf_size += info1->txt_buf_size; info2->curr_buf_idx += info1->curr_buf_idx; } } #if HAVE_REGEX_H /* convert the encoding part (between the `.' and the `@') of the locale string passed as argument to UTF-8, and return the result in a newly allocated string which the caller is responsible for free()ing. */ static char * locale_to_utf8(const char *locale) { char *utf8_locale = xstrdup(locale); char *ptr; if ((ptr = strchr(utf8_locale, '.')) != NULL) { char *ptr2, *rest = ""; if ((ptr2 = strchr(utf8_locale, '@')) != NULL) rest = xstrdup(ptr2); utf8_locale = xrealloc(utf8_locale, ptr - utf8_locale + strlen(".utf8") + strlen(rest) + 1); *ptr = '\0'; utf8_locale = strcat(utf8_locale, ".utf8"); if (ptr2 != NULL) { utf8_locale = strcat(utf8_locale, rest); free(rest); } } else { utf8_locale = xstrcat(utf8_locale, ".utf8"); } return utf8_locale; } #endif /* HAVE_REGEX_H */ static Boolean is_utf8_ideograph(const unsigned char *p) { int len; uint32_t ucs4; if ((len = utf8_to_ucs4((const char *)p, &ucs4, strlen((const char*)p))) <= 0) return False; return is_ideograph(ucs4); } static void dump_buffer(const struct word_info *info, size_t offset, FILE *fp, outputFormatT fmt) { size_t i = offset, len, tot_len; if (info->txt_buf == NULL) return; tot_len = strlen(info->txt_buf); while (i < tot_len) { if (fmt == FMT_UTF8) { /* just dump as-is */ fputc(info->txt_buf[i++], fp); } else { /* convert to iso-latin1, rendering unknown characters as `?' */ uint32_t ucs4; const char *ret; /* first apply normalization heurisitcs also used by search */ len = utf8_to_ucs4(info->txt_buf + i, &ucs4, strlen(info->txt_buf + i)); if ((ret = search_normalize_chars(ucs4)) != NULL) fputs(ret, fp); else if (ucs4 <= 0xff) /* in iso-latin1 range */ fputc((unsigned char)ucs4, fp); else fprintf(fp, "\\%.4lX", (unsigned long)ucs4); i += len; } } } static void scan_page(FILE *fp, int pageno, struct word_info *w_info) { off_t pos_save; static ubyte my_scan_buffer[DVI_BUFFER_LEN]; struct drawinf currinf_save; struct scan_info info; ubyte maxchar_save; reinit_text_scan(); /* to reset scanning heuristics (linebreaks etc.) */ info.data = (void *)w_info; info.geom_special = NULL; /* no procedure here */ /* Save file position */ pos_save = save_file_status(globals.dvi_file.bak_fp, &currinf_save, &maxchar_save); lseek(fileno(fp), pageinfo_get_offset(pageno), SEEK_SET); memset((char *)&currinf.data, 0, sizeof currinf.data); currinf.tn_table_len = TNTABLELEN; currinf.tn_table = tn_table; currinf.tn_head = tn_head; /* point currinf to our own buffer: */ G_dvi_buf_ptr = my_scan_buffer; currinf.pos = currinf.end = G_dvi_buf_ptr; currinf.virtual = NULL; geom_scan(text_do_char, fp, &info, pageno); /* Restore file status. */ restore_file_status(globals.dvi_file.bak_fp, currinf_save, maxchar_save, pos_save); } static Boolean do_scan_page(struct word_info *w_info, struct search_settings *settings, struct page_mapping *page_mapping, int buffer_offset, int pageno, searchDirectionT direction) { struct word_info page_info = { NULL, 0, 0, NULL, 0, 0, NULL, NULL, 0, False, True, False }; page_info.settings = settings; ASSERT(buffer_offset >= 0, "buffer_offset must have been initialized"); page_info.buffer_offset = buffer_offset; TRACE_FIND((stderr, "scanning page: %d; from_pos: %d", pageno, settings->searchinfo->from_pos)); if (read_events(EV_NOWAIT) & EV_GE_FIND_CANCEL) { TRACE_FIND((stderr, "interrupted!!")); return False; } scan_page(globals.dvi_file.bak_fp, pageno, &page_info); /* TRACE_FIND((stderr, "scanned buffer of length %d on page %d; contents: |%s|", */ /* page_info.curr_buf_idx, pageno, page_info.txt_buf)); */ /* terminate page */ append_to_info(&page_info, "\n"); if (direction == SEARCH_DOWN) { /* append to existing info */ append_info(w_info, &page_info); page_mapping->offset = w_info->curr_buf_idx; } else { prepend_info(&page_info, w_info); /* TRACE_FIND((stderr, "buffer after prepending: |%s|", w_info->txt_buf)); */ page_mapping->offset = page_info.curr_buf_idx; } page_mapping->pageno = pageno; return True; } #if HAVE_REGEX_H static void report_regexp_error(int errcode, regex_t *regex, const char *term, int flag) { size_t n = regerror(errcode, regex, NULL, 0); char *err_buf = xmalloc(n); regerror(errcode, regex, err_buf, n); xdvi_bell(); popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"), MSG_ERR, NULL, "Could not %s regular expression \"%s\": %s\n", flag == 0 ? "compile" : "execute", term, err_buf); free(err_buf); } #endif /* HAVE_REGEX_H */ static void try_match(const struct word_info *info, const struct search_settings *settings) { char *res = NULL; size_t from_pos = 0; struct search_info *searchinfo = settings->searchinfo; ASSERT(info->curr_buf_idx == strlen(info->txt_buf), ""); TRACE_FIND((stderr, "buffer index: %lu, len: %lu; from: %lu", (unsigned long)info->curr_buf_idx, (unsigned long)strlen(info->txt_buf), (unsigned long)searchinfo->from_pos)); if (searchinfo->from_pos != -1) from_pos = searchinfo->from_pos; if (settings->direction == SEARCH_DOWN) { TRACE_FIND((stderr, "trying to match |%s| from %lu; total: %lu", settings->utf8_term, (unsigned long)from_pos, (unsigned long)strlen(info->txt_buf))); res = strstr(info->txt_buf + from_pos, settings->utf8_term); } else { size_t curr_pos = 0; char *res_bak = NULL; TRACE_FIND((stderr, "UP; trying to match |%s| from %lu, %lu", settings->utf8_term, (unsigned long)curr_pos, (unsigned long)from_pos)); TRACE_FIND((stderr, "buf: |%s|", info->txt_buf + curr_pos)); while (curr_pos <= from_pos) { res_bak = res; res = strstr(info->txt_buf + curr_pos, settings->utf8_term); if (res != NULL) { curr_pos = res - info->txt_buf + strlen(settings->utf8_term); } else { break; } } res = res_bak; } if (res != NULL) { searchinfo->have_match = True; searchinfo->from_pos = res - info->txt_buf; searchinfo->to_pos = searchinfo->from_pos + strlen(settings->utf8_term); } else { searchinfo->have_match = False; } } #if HAVE_REGEX_H static Boolean try_regexp_match(regex_t *regex, const struct word_info *info, const struct search_settings *settings) { int have_match; regmatch_t re_match; size_t from_pos = 0; Boolean retval = True; struct search_info *searchinfo = settings->searchinfo; #if SWITCH_TO_UTF8 /* switch to UTF-8 encoding, as for regcomp() */ char *utf8_locale = locale_to_utf8(globals.orig_locale); TRACE_FIND((stderr, "current locale: |%s|, utf8 version: |%s|", globals.orig_locale, utf8_locale)); setlocale(LC_ALL, utf8_locale); #endif re_match.rm_so = re_match.rm_eo = -1; if (searchinfo->from_pos != -1) from_pos = searchinfo->from_pos; if (settings->direction == SEARCH_DOWN) { Boolean search_again = True; while (search_again && from_pos < info->curr_buf_idx) { searchinfo->have_match = False; search_again = False; /* TRACE_FIND((stderr, "search string: |%s|, from_pos: %d", info->txt_buf + from_pos, from_pos)); */ have_match = regexec(regex, info->txt_buf + from_pos, 1, &re_match, 0); if (have_match == 0) { /* match */ TRACE_FIND((stderr, "match from %d to %d", (int)re_match.rm_so, (int)re_match.rm_eo)); if (re_match.rm_so == re_match.rm_eo) { /* skip zero-length matches */ from_pos += re_match.rm_so + 1; search_again = True; } else { searchinfo->from_pos = re_match.rm_so + from_pos; searchinfo->to_pos = re_match.rm_eo + from_pos; searchinfo->have_match = True; } } else if (have_match != REG_NOMATCH) { /* error */ report_regexp_error(have_match, regex, settings->term, 1); retval = False; break; } } } else { /* searching backwards */ size_t curr_pos = 0, prev_pos = 0; regmatch_t re_match_bak; Boolean search_again = True; searchinfo->have_match = False; TRACE_FIND((stderr, "UP; trying to match |%s| from %lu, %lu", settings->utf8_term, (unsigned long)curr_pos, (unsigned long)from_pos)); re_match_bak.rm_so = re_match_bak.rm_eo = -1; while (search_again && curr_pos <= from_pos) { search_again = False; /* remember previous match data */ re_match_bak.rm_so = prev_pos + re_match.rm_so; re_match_bak.rm_eo = prev_pos + re_match.rm_eo; TRACE_FIND((stderr, "backup values: %d, %d; curr_pos: %lu", (int)re_match_bak.rm_so, (int)re_match_bak.rm_eo, (unsigned long)curr_pos)); /* TRACE_FIND((stderr, "text buf: |%s|", info->txt_buf + curr_pos)); */ have_match = regexec(regex, info->txt_buf + curr_pos, 1, &re_match, 0); while (have_match == 0 && re_match.rm_so == re_match.rm_eo) { /* skip zero-length matches */ have_match = regexec(regex, info->txt_buf + ++curr_pos, 1, &re_match, 0); } if (have_match == 0) { /* match */ TRACE_FIND((stderr, "match from %d to %d", (int)re_match.rm_so, (int)re_match.rm_eo)); TRACE_FIND((stderr, "updating pos: %lu -> %lu; from_pos: %lu", (unsigned long)curr_pos, (unsigned long)(curr_pos + re_match.rm_eo), (unsigned long)from_pos)); prev_pos = curr_pos; curr_pos += re_match.rm_eo; search_again = True; } else if (have_match != REG_NOMATCH) { /* error */ report_regexp_error(have_match, regex, settings->term, 1); retval = False; break; } } if (retval) { re_match.rm_so = re_match_bak.rm_so; re_match.rm_eo = re_match_bak.rm_eo; if (re_match.rm_so != -1) { TRACE_FIND((stderr, "remembering from-to: %d - %d", (int)re_match.rm_so, (int)re_match.rm_eo)); searchinfo->from_pos = re_match.rm_so; searchinfo->to_pos = re_match.rm_eo; searchinfo->have_match = True; } } } #if SWITCH_TO_UTF8 /* switch back to original encoding */ setlocale(LC_ALL, globals.orig_locale); setlocale(LC_NUMERIC, "C"); free(utf8_locale); #endif return retval; } #endif /* HAVE_REGEX_H */ /* Erase exising highlighting. TODO: Move this into dvi-draw so that there's no big delay between erasing and drawing the next marker. */ static void erase_match_highlighting(struct word_info *info, Boolean flag) { size_t i; if (info == NULL || (MAGNIFIER_ACTIVE && !INSIDE_MANE_WIN)) return; for (i = 0; info->bboxes != NULL && i <= info->bboxes_idx && info->bboxes[i].ulx < INT_MAX; i++) { int x, y, w, h; GET_BBOX(info->bboxes[i], currwin.shrinkfactor, x, y, w, h); if (resource.match_highlight_inverted) { if (flag || m_highlight_region_changed) { clearexpose(&mane, x, y, w, h); } else if (clip_region(&x, &y, &w, &h)) { TRACE_FIND((stderr, "ERASING box: x %d, y %d, w %d, h %d", x, y, w, h)); TEST_DELAY("Showing BBOX ............... "); XClearArea(DISP, mane.win, x, y, w, h, False); TEST_DELAY("Clearing BBOX ............... "); } } else if (flag) { /* erase only the existing marks, not the entire bounding box, to avoid flashing of the text inside the bounding box. 1 pixel added to w, h just to make sure in case of rounding errors. */ h++; clearexpose(&mane, x - 1, y - 1, 2, h + 2); clearexpose(&mane, x - 1, y - 1, w + 2, 2); clearexpose(&mane, x + w - 1, y - 1, 2, h + 2); clearexpose(&mane, x - 1, y + h - 1, w + 2, 2); } } if (flag) { reset_info(info); info = NULL; } else m_highlight_region_changed = False; } static void highlight_match(struct search_settings *settings, const struct word_info *w_info, const struct page_mapping *page_mapping) { const int context = 10; int match_page, i, j = 0; static struct word_info curr_info = { NULL, 0, 0, NULL, 0, 0, NULL, NULL, 0, True, False, False }; struct search_info *searchinfo = settings->searchinfo; Boolean match_wrapped = False; curr_info.settings = settings; curr_info.page_mapping = page_mapping; TRACE_FIND((stderr, "MATCH from pos %d to %d:", searchinfo->from_pos, searchinfo->to_pos)); if (globals.debug & DBG_FIND) { fprintf(stderr, "current page_mapping:\n"); for (i = 0; i < 2; i++) { fprintf(stderr, "%d: %d\n", page_mapping[i].pageno, page_mapping[i].offset); } } TRACE_FIND((stderr, "to_pos: %d, %d", searchinfo->to_pos, page_mapping[0].offset)); if (searchinfo->from_pos < page_mapping[0].offset) { match_page = page_mapping[0].pageno; if (searchinfo->to_pos > page_mapping[0].offset) { match_wrapped = True; } } else { if (searchinfo->from_pos >= page_mapping[1].offset) { XDVI_ERROR((stderr, "to_pos (%d) should be smaller than page_mapping[1].offset (%d)!", searchinfo->from_pos, page_mapping[1].offset)); } ASSERT(searchinfo->from_pos < page_mapping[1].offset, "to_pos should be smaller than page_mapping[1].offset!"); match_page = page_mapping[1].pageno; if (searchinfo->to_pos > page_mapping[1].offset) { match_wrapped = True; } } if (!settings->isearchterm) { if (match_wrapped) statusline_info(STATUS_MEDIUM, "Match from page %d to %d", match_page + 1, match_page + 2); else statusline_info(STATUS_MEDIUM, "Match on page %d", match_page + 1); if (settings->wrapcnt > 0) statusline_append(STATUS_MEDIUM, " (wrapped)", " (wrapped)"); } if (globals.debug & DBG_FIND) { fprintf(stderr, "*** match_page: %d, adding: %d\n", match_page, searchinfo->page_offset); for (j = searchinfo->from_pos - context; j < searchinfo->from_pos; j++) { if (j >= 0) fputc(w_info->txt_buf[j], stderr); else fputc(' ', stderr); } fputs("\n >>", stderr); for (j = searchinfo->from_pos; j < searchinfo->to_pos; j++) { fputc(w_info->txt_buf[j], stderr); } fputs("<<\n ", stderr); for (j = searchinfo->from_pos; j < searchinfo->to_pos; j++) { fputc(' ', stderr); } for (j = searchinfo->to_pos; j < (int)w_info->curr_buf_idx; j++) { fputc(w_info->txt_buf[j], stderr); if (w_info->txt_buf[j] == '\n') break; } fputc('\n', stderr); } if (match_page != current_page) { goto_page(match_page, resource.keep_flag ? NULL : home, False); page_history_insert(match_page); /* globals.ev.flags |= EV_NEWPAGE; */ } /* don't raise the window - this can obscure the search popup */ /* XMapRaised(DISP, XtWindow(globals.widgets.top_level)); */ /* this erases contents of m_info, so be careful - contents of curr_info will be indirectly erased by this ... */ erase_match_highlighting(m_info, True); /* now rescan the page to get bounding box info for the match */ scan_page(globals.dvi_file.bak_fp, match_page, &curr_info); m_info = &curr_info; m_match_page = match_page; do_autoscroll = True; /* enable scrolling to match */ /* create an expose event so that the region gets highlighted */ if (m_info != NULL) { generate_highlight_expose(m_info); } } #if HAVE_REGEX_H /* * A mapping of Perl-style character classes to POSIX-style character classes. */ static struct perl2posix_mapping { const char *perl_class; const char *posix_class; } perl2posix_map[] = { { "\\w", "[[:alnum:]]" }, { "\\W", "[^[:alnum:]]" }, { "\\d", "[[:digit:]]" }, { "\\D", "[^[:digit:]]" }, { "\\s", "[[:space:]]" }, { "\\S", "[^[:space:]]" }, { NULL, NULL } /* terminate */ }; /* * Convert `perl_regex', a regexp using Perl-style character classes, * to a regexp using POSIX-style character classes. Return the latter * in freshly allocated memory, which the caller is responsible to free(). * Uses the perl2posix_map table. */ static char * perl2posix(const char *perl_regex) { char *posix_regex = xstrdup(perl_regex); size_t i; for (i = 0; perl2posix_map[i].perl_class != NULL; i++) { const char *ptr; size_t offset = 0; TRACE_FIND((stderr, "searching for |%s| at offset %lu", perl2posix_map[i].perl_class, (unsigned long)offset)); while ((ptr = find_format_str(posix_regex + offset, perl2posix_map[i].perl_class)) != NULL) { size_t len1 = ptr - posix_regex; /* length up to match */ size_t len2 = strlen(perl2posix_map[i].posix_class); TRACE_FIND((stderr, "Regexp: mapping %s to %s", perl2posix_map[i].perl_class, perl2posix_map[i].posix_class)); /* -1 since -2 for perl format string, +1 for trailing '\0' */ posix_regex = xrealloc(posix_regex, strlen(posix_regex) + len2 - 1); /* make space for new format string */ memmove(posix_regex + len1 + len2, posix_regex + len1 + 2, strlen(posix_regex + len1 + 2) + 1); /* copy in new format string */ memcpy(posix_regex + len1, perl2posix_map[i].posix_class, len2); TRACE_FIND((stderr, "Expanded regex: |%s|", posix_regex)); offset = len1 + len2; TRACE_FIND((stderr, "searching again for |%s| at offset %lu", perl2posix_map[i].perl_class, (unsigned long)offset)); } } return posix_regex; } #endif /* HAVE_REGEX_H */ char * get_text_selection(int *len, int ulx, int uly, int lrx, int lry) { struct word_info txt_info = { NULL, 0, 0, NULL, 0, 0, NULL, NULL, 0, False, False, True }; struct bbox text_bbox; text_bbox.ulx = ulx; text_bbox.uly = uly; text_bbox.lrx = lrx; text_bbox.lry = lry; txt_info.bboxes = &text_bbox; /* initialize buffer with empty string */ txt_info.txt_buf_size = 1; txt_info.txt_buf = xmalloc(txt_info.txt_buf_size); txt_info.txt_buf[0] = '\0'; /* this enlarges the buffer as needed */ scan_page(globals.dvi_file.bak_fp, current_page, &txt_info); *len = txt_info.txt_buf_size; return txt_info.txt_buf; #if 0 /* fprintf(stderr, "========== SELECTION (len %d):\n", txt_info.curr_buf_idx); */ /* dump_buffer(&txt_info, 0, stderr, FMT_ISO_8859_1); */ /* fprintf(stderr, "==========\n"); */ buf = xmalloc(4 * txt_info.curr_buf_idx + 1); /* just in case we get many non-printables */ while (i < txt_info.curr_buf_idx) { uint32_t ucs4; const char *ret; /* first apply normalization heurisitcs also used by search */ size_t len = utf8_to_ucs4(txt_info.txt_buf + i, &ucs4, strlen(txt_info.txt_buf + i)); if ((ret = search_normalize_chars(ucs4)) != NULL) { size_t len_ret = strlen(ret); memcpy(buf + offset, ret, len_ret); offset += len_ret; } else if (ucs4 <= 0xff) { /* in iso-latin1 range */ buf[offset++] = (unsigned char)ucs4; } else { sprintf(buf + offset, "\\%.4lX", ucs4); offset += 4; } i += len; } buf[offset] = '\0'; free(txt_info.txt_buf); return buf; #endif /* 0 */ } Boolean search_extract_text(struct save_or_print_info *info) { int i; FILE *fp; if ((fp = XFOPEN(info->finfo->out_file, "wb")) == NULL) { popup_message(globals.widgets.top_level, MSG_ERR, NULL, "Could not open %s for writing: %s.", info->finfo->out_file, strerror(errno)); return False; } for (i = 0; i < total_pages; i++) { if (info->pinfo->callback == NULL || info->pinfo->callback(info, i)) { struct word_info txt_info = { NULL, 0, 0, NULL, 0, 0, NULL, NULL, 0, False, False, False }; scan_page(globals.dvi_file.bak_fp, i, &txt_info); dump_buffer(&txt_info, 0, fp, info->fmt); free(txt_info.txt_buf); fputs("\n\n", fp); /* two newlines for page breaks */ } } fclose(fp); return True; } void search_erase_highlighting(Boolean reset) { erase_match_highlighting(m_info, reset); } static void message_search_ended(XtPointer arg) { struct search_settings *settings = (struct search_settings *)arg; settings->searchinfo->from_pos = settings->searchinfo->to_pos = -1; TRACE_FIND((stderr, "search ended; current_page: %d", current_page)); settings->from_page = current_page; search_signal_page_changed(); settings->message_window = 0; /* statusline_append(STATUS_SHORT, " stopped."); */ if (!settings->isearchterm) statusline_info(STATUS_SHORT, "Search stopped."); } void search_restart(XtPointer arg) { struct search_settings *settings = (struct search_settings *)arg; Widget popup, textfield; char *searchterm = NULL; char *textfield_name = NULL; TRACE_FIND((stderr, "restart search!")); /* Update the search term (user might have changed it before hitting `Return' to restart the search). We need to start from the toplevel widget since this method may be called from a different window (e.g. confirmation popup). */ #if defined(MOTIF) && USE_COMBOBOX textfield_name = "Text"; #else textfield_name = Xdvi_SEARCHBOX_INPUT_NAME; #endif /* defined(MOTIF) && USE_COMBOBOX */ if (!settings->isearchterm && get_widget_by_name(&popup, globals.widgets.top_level, Xdvi_SEARCH_POPUP_NAME, True) && get_widget_by_name(&textfield, popup, textfield_name, True)) { XtVaGetValues(textfield, #ifdef MOTIF XmNvalue, #else XtNstring, #endif &searchterm, NULL); if (searchterm == NULL) { XDVI_WARNING((stderr, "Got NULL searchterm in search_restart()!")); return; } settings->term = searchterm; } if (settings->direction == SEARCH_DOWN) { settings->from_page = 0; } else { settings->from_page = total_pages - 1; } if (settings->direction == SEARCH_DOWN) settings->searchinfo->from_pos = settings->searchinfo->to_pos = -1; else settings->searchinfo->from_pos = settings->searchinfo->to_pos = INT_MAX; settings->message_window = 0; search_signal_page_changed(); search_dvi((XtPointer)settings); } static void normalize_newline(char *str) { size_t i, j; for (i = 0, j = 0; str[i] != '\0'; i++, j++) { if (str[i] == '\\' && str[i + 1] == 'n') { if (i > 0 && str[i - 1] == '\\') { str[j] = 'n'; i++; } else { str[j] = '\n'; i++; } } else { str[j] = str[i]; } } str[j] = str[i]; /* copy terminating '\0' */ } static Boolean reinit_searchterm(struct search_settings *settings, const char *encoding) { struct search_info *searchinfo = settings->searchinfo; free(settings->utf8_term); settings->utf8_term = NULL; if (memicmp(encoding, "iso-8859-1", strlen("iso-8859-1")) == 0 || memicmp(encoding, "iso8859-1", strlen("iso8859-1")) == 0) { int conv_len = (strlen(settings->term) + 1) * 2; int ret_len; char *ptr = xmalloc(conv_len); if ((ret_len = str_iso_8859_1_to_utf8(settings->term, ptr, conv_len)) < 0) { xdvi_bell(); popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"), MSG_ERR, NULL, "Shouldn't happen: search term `%s' is too long (> %d)", settings->term, conv_len); searchinfo->locked = False; free(ptr); settings->utf8_term = xstrdup(""); return False; } settings->utf8_term = ptr; } else if (memicmp(encoding, "utf-8", strlen("utf-8")) == 0 || memicmp(encoding, "utf8", strlen("utf8")) == 0) { settings->utf8_term = xstrdup(settings->term); } else { if ((settings->utf8_term = iconv_convert_string(encoding, "utf-8", settings->term)) == NULL) { return False; } } TRACE_FIND((stderr, "UTF-8 search term: |%s|", settings->utf8_term)); normalize_newline(settings->utf8_term); TRACE_FIND((stderr, "UTF-8 search term after normalizing newline: |%s|", settings->utf8_term)); #if 0 /* lowercasing for regexps is dealt with by REG_ICASE */ if (!settings->case_sensitive && !settings->use_regexp) { if (!utf8_lowercase(settings->utf8_term)) return False; TRACE_FIND((stderr, "Lowercased UTF-8 search term: |%s|", settings->utf8_term)); } #else /* always lowercase, since REG_ICASE is broken with UTF-8(?) */ if (!settings->case_sensitive && !utf8_lowercase(settings->utf8_term)) return False; TRACE_FIND((stderr, "Lowercased UTF-8 search term: |%s|", settings->utf8_term)); #endif /* 1 */ /* remove spaces/newlines before/after an ideographic char */ { unsigned char *p = (unsigned char *)settings->utf8_term; unsigned char *q; int l, len = strlen((char *)p); uint32_t ucs4; Boolean had_ideograph; had_ideograph = False; while (len > 0) { if (*p == ' ' || *p == '\n') { q = p + 1; while (*q == ' ' || *q == '\n') q++; len -= q - p; if (had_ideograph || is_utf8_ideograph(q)) memmove(p, q, len + 1); /* remove spaces/newlines */ else p = q; /* preserve spaces/newlines */ } else { if ((l = utf8_to_ucs4((char *)p, &ucs4, len)) <= 0) break; len -= l; had_ideograph = is_ideograph(ucs4); p += l; } } settings->utf8_term = xrealloc(settings->utf8_term, strlen(settings->utf8_term) + 1); } return True; } void search_reset_info(void) { TRACE_FIND((stderr, "resetting info!")); reset_info(m_info); m_info = NULL; } #if HAVE_REGEX_H static Boolean do_recompile_regexp(struct search_settings *settings, regex_t *regex) { int re_retval; /* use extended POSIX, and make `.' not match newlines (otherwise it's often too unintuitive because of the greediness of '+'/'*' */ int re_flags = REG_EXTENDED | REG_NEWLINE; TRACE_FIND((stderr, "compiling regexp ...")); if (settings->posix_term != NULL) { TRACE_FIND((stderr, "freeing old regexp ...")); free(settings->posix_term); regfree(regex); } settings->posix_term = perl2posix(settings->utf8_term); #if 0 /* this is broken with e.g. german umlauts; maybe it can't deal with UTF-8 encoding? */ /* compile regexp from search term */ if (!settings->case_sensitive) re_flags |= REG_ICASE; #endif { /* change the encoding part of the locale to UTF-8 to match encoding of the search string and the search buffer */ #if SWITCH_TO_UTF8 char *utf8_locale = locale_to_utf8(globals.orig_locale); TRACE_FIND((stderr, "current locale: |%s|, utf8 version: |%s|", globals.orig_locale, utf8_locale)); setlocale(LC_ALL, utf8_locale); #endif re_retval = regcomp(regex, settings->posix_term, re_flags); #if SWITCH_TO_UTF8 setlocale(LC_ALL, globals.orig_locale); setlocale(LC_NUMERIC, "C"); free(utf8_locale); #endif } if (re_retval != 0) { report_regexp_error(re_retval, regex, settings->term, 0); settings->searchinfo->locked = False; return False; } return True; } #else /* HAVE_REGEX_H */ static void warn_no_regex(void) { xdvi_bell(); popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"), MSG_WARN, NULL, "POSIX regular expression support (regex.h) is not available on this platform; " "using ordinary string matching instead."); } #endif /* HAVE_REGEX_H */ /* Scan at most two adjacent pages, writing results in to page_mapping. Return False if user cancelled the search, True else. */ static Boolean scan_two_pages(struct search_settings *settings, struct word_info *info, struct page_mapping *page_mapping, int curr_page) { Boolean cancelled = False; struct search_info *searchinfo = settings->searchinfo; if (curr_page != page_mapping[0].pageno && curr_page != page_mapping[1].pageno) { /* none of 2 pages scanned yet */ reset_info(info); if (settings->direction == SEARCH_DOWN) { if (!do_scan_page(info, settings, &(page_mapping[0]), 0, curr_page, settings->direction) || (curr_page + 1 < total_pages && !do_scan_page(info, settings, &(page_mapping[1]), page_mapping[0].offset, curr_page + 1, settings->direction))) cancelled = True; } else { if (!do_scan_page(info, settings, &(page_mapping[1]), 0, curr_page, settings->direction) || (curr_page > 0 && !do_scan_page(info, settings, &(page_mapping[0]), page_mapping[1].offset, curr_page - 1, settings->direction))) cancelled = True; else if (page_mapping[0].offset != -1) { page_mapping[1].offset += page_mapping[0].offset; if (searchinfo->from_pos != INT_MAX) searchinfo->from_pos += page_mapping[0].offset; } } } else if (curr_page != page_mapping[0].pageno) { /* current page scanned as page_mapping[1] */ if (settings->direction == SEARCH_DOWN && curr_page + 1 < total_pages) { shift_info_down(searchinfo, info, page_mapping); if (!do_scan_page(info, settings, &(page_mapping[1]), page_mapping[0].offset, curr_page + 1, settings->direction)) cancelled = True; } else if (curr_page - 1 != page_mapping[0].pageno && curr_page > 0) { if (!do_scan_page(info, settings, &(page_mapping[0]), 0, curr_page - 1, settings->direction)) cancelled = True; else { page_mapping[1].offset += page_mapping[0].offset; if (searchinfo->from_pos != INT_MAX) searchinfo->from_pos += page_mapping[0].offset; } } } else if (curr_page != page_mapping[1].pageno) { /* current page scanned as page_mapping[0] */ if (settings->direction == SEARCH_UP && curr_page > 0) { shift_info_up(info, page_mapping); if (!do_scan_page(info, settings, &(page_mapping[0]), 0, curr_page - 1, settings->direction)) cancelled = True; else { page_mapping[1].offset += page_mapping[0].offset; if (searchinfo->from_pos != INT_MAX) { searchinfo->from_pos += page_mapping[0].offset; searchinfo->to_pos += page_mapping[0].offset; } TRACE_FIND((stderr, "new offsets: from=%d, to=%d", searchinfo->from_pos, searchinfo->to_pos)); } } else if (curr_page + 1 != page_mapping[1].pageno && curr_page + 1 < total_pages) { if (!do_scan_page(info, settings, &(page_mapping[1]), page_mapping[0].offset, curr_page + 1, settings->direction)) cancelled = True; } } return !cancelled; } static void search_over_pages(struct search_settings *settings, struct page_mapping *page_mapping, struct word_info *w_info, int *from_pos_bak, Boolean adjust_hyphen_offset #if HAVE_REGEX_H , regex_t *regex #endif ) { int curr_page = settings->from_page; /* page on which we're currently on */ for (;;) { /* scan pages, try to match */ if (settings->isearchterm) { const char *prefix = ""; if (settings->wrapcnt > 0) prefix = "Wrapped "; statusline_info(STATUS_FOREVER, "%sI-search (ESC to exit): %s", prefix, settings->isearchterm); } else { if (resource.expert_mode & XPRT_SHOW_STATUSLINE) /* too distracting for stdout */ statusline_info(STATUS_MEDIUM, "Searching on page %d", curr_page); } TRACE_FIND((stderr, "curr_page: %d, pageno 0: %d, pageno1: %d", curr_page, page_mapping[0].pageno, page_mapping[1].pageno)); settings->hyphen_delta = 0; /* scan_two_pages will return False if user cancelled */ if (!scan_two_pages(settings, w_info, page_mapping, curr_page) || (read_events(EV_NOWAIT) & EV_GE_FIND_CANCEL)) { if (!settings->isearchterm) { if (resource.expert_mode & XPRT_SHOW_STATUSLINE) /* too distracting for stdout */ statusline_append(STATUS_SHORT, "- cancelled.", "- cancelled."); } settings->searchinfo->locked = False; return; } TRACE_FIND((stderr, "page mapping:\n%d: %d\n%d: %d", page_mapping[0].pageno, page_mapping[0].offset, page_mapping[1].pageno, page_mapping[1].offset)); /* dump_buffer(w_info, 0, stderr, FMT_ISO_8859_1); */ /* If ignore_hyphens has changed (in which case adjust_hyphen_offset is true), the buffer will contain settings->hyphen_delta fewer or more characters than in the previous pass due to the removal or addition of hyphens; adjust from_pos and to_pos accordingly: */ if (adjust_hyphen_offset) { TRACE_FIND((stderr, "adjusting offset by %d", settings->hyphen_delta)); if (settings->ignore_hyphens) { /* fewer characters */ settings->searchinfo->from_pos -= settings->hyphen_delta; settings->searchinfo->to_pos -= settings->hyphen_delta; } else { /* more characters */ settings->searchinfo->from_pos += settings->hyphen_delta; settings->searchinfo->to_pos += settings->hyphen_delta; } TRACE_FIND((stderr, "NEW from_pos: %d; to_pos: %d", settings->searchinfo->from_pos, settings->searchinfo->to_pos)); } /* match the searchstring */ #if HAVE_REGEX_H if (settings->use_regexp) { if (!try_regexp_match(regex, w_info, settings)) /* regexp error */ return; } else { #endif try_match(w_info, settings); #if HAVE_REGEX_H } #endif /* again, check if user cancelled */ if (read_events(EV_NOWAIT) & EV_GE_FIND_CANCEL) { /* user cancelled */ if (!settings->isearchterm) statusline_append(STATUS_SHORT, "- cancelled.", "- cancelled."); settings->searchinfo->locked = False; return; } if (settings->searchinfo->have_match) { /* match, highlight it */ highlight_match(settings, w_info, page_mapping); settings->searchinfo->locked = False; if (settings->direction == SEARCH_DOWN && !settings->isearchterm) { *from_pos_bak = settings->searchinfo->from_pos; settings->searchinfo->from_pos = settings->searchinfo->to_pos; } break; } else if ((settings->direction == SEARCH_DOWN && curr_page + 1 < total_pages) || (settings->direction == SEARCH_UP && curr_page > 0)) { if (settings->direction == SEARCH_DOWN) curr_page++; else curr_page--; TRACE_FIND((stderr, "continuing on page %d", curr_page)); erase_match_highlighting(m_info, True); /* no match, and we have more pages; continue scanning */ continue; } else { /* reached end of file */ Widget find_popup; if (settings->isearchterm) { const char *prefix = "Failed"; fprintf(stderr, "reached end with wrapcnt: %d\n", settings->wrapcnt); if (settings->wrapcnt > 0) prefix = "Failed wrapped"; xdvi_bell(); statusline_info(STATUS_FOREVER, "%s I-search (ESC to exit, RET to restart): %s", prefix, settings->term); settings->searchinfo->locked = False; erase_match_highlighting(m_info, True); settings->wrapcnt++; return; } if (settings->wrap) { if (settings->wrapcnt > 0) { positioned_popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"), MSG_INFO, settings->x_pos, settings->y_pos, NULL, "Pattern `%s' not found.", settings->term); /* positioned_choice_dialog(XtNameToWidget(globals.widgets.top_level, "*find_popup"), */ /* MSG_INFO, */ /* settings->x_pos, settings->y_pos, */ /* NULL, */ /* #ifndef MOTIF */ /* NULL, */ /* #endif */ /* NULL, NULL, /\* pre callback *\/ */ /* "OK", message_search_ended, (XtPointer)settings, */ /* NULL, NULL, NULL, */ /* "Pattern `%s' not found.", settings->term); */ settings->searchinfo->locked = False; message_search_ended((XtPointer)settings); return; } settings->wrapcnt++; erase_match_highlighting(m_info, True); settings->searchinfo->locked = False; search_restart((XtPointer)settings); return; } if ((find_popup = XtNameToWidget(globals.widgets.top_level, "*find_popup")) == 0) { XDVI_WARNING((stderr, "Couldn't find \"find_popup\" widget!")); find_popup = globals.widgets.top_level; } if (!settings->isearchterm) statusline_append(STATUS_MEDIUM, "... searched to end of file.", "... searched to end of file."); erase_match_highlighting(m_info, True); settings->searchinfo->locked = False; settings->message_window = positioned_choice_dialog(find_popup, MSG_QUESTION, settings->x_pos, settings->y_pos, NULL, #ifndef MOTIF "do-search-restart", #endif NULL, NULL, /* no pre_callbacks */ "Yes", search_restart, (XtPointer)settings, "Cancel", message_search_ended, (XtPointer)settings, "Searched %s of file without finding the pattern.\n" "Start again from the %s of the file?", settings->direction == SEARCH_DOWN ? "to end" : "to beginning", settings->direction == SEARCH_DOWN ? "beginning" : "end"); TRACE_GUI((stderr, "message_window: %p\n", (void *)settings->message_window)); /* notreached */ break; } } /* for(;;) */ } void search_dvi(XtPointer arg) { struct search_settings *settings = (struct search_settings *)arg; struct search_info *searchinfo = settings->searchinfo; #if HAVE_REGEX_H static regex_t regex; #endif /* HAVE_REGEX_H */ /* a mapping of page numbers to index positions in w_info->txt_buf, for the 2 pages that we scanned */ static struct page_mapping page_mapping[2] = { { -1, -1 }, { -1, -1 } }; static struct word_info w_info = { NULL, 0, 0, NULL, 0, 0, NULL, NULL, 0, False, False, False }; static time_t dvi_time_bak = 0; static char *searchterm_bak = NULL; static const char *text_encoding = NULL; static Boolean case_sensitive_bak = False; static Boolean ignore_hyphens_bak = False; static Boolean ignore_linebreaks_bak = False; static searchDirectionT direction_bak = SEARCH_UNINITIALIZED; /* from_pos_bak is needed to mark the start of the match when switching from search down to search backwards, where we want to jump to the previous match, so we need the start of the current match again (and down search sets searchinfo->from_pos = searchinfo->to_pos) */ static int from_pos_bak = -1; /* int curr_page; */ Boolean reinit = False; Boolean recompile_regexp = False; Boolean adjust_hyphen_offset = False; /* prevent multiple invocations while still busy searching */ if (searchinfo->locked) { TRACE_FIND((stderr, "LOCKED")); return; } searchinfo->locked = True; if (dvi_time_bak == 0) { /* first invocation */ case_sensitive_bak = settings->case_sensitive; ignore_hyphens_bak = settings->ignore_hyphens; ignore_linebreaks_bak = settings->ignore_linebreaks; dvi_time_bak = globals.dvi_file.time; } if (globals.dvi_file.time > dvi_time_bak) { dvi_time_bak = globals.dvi_file.time; reinit = True; } m_match_page = -1; if (raise_message_windows()) { /* any popups user still needs to deal with? */ TRACE_GUI((stderr, "Still open message windows to deal with, returning ...")); searchinfo->locked = False; return; } ASSERT(settings->term != NULL, "settings->term mustn't be NULL!"); if (strlen(settings->term) == 0) { if (settings->isearchterm) { settings->searchinfo->locked = False; return; } positioned_popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"), MSG_ERR, settings->x_pos, settings->y_pos, NULL, "Empty search term"); searchinfo->locked = False; return; } TRACE_FIND((stderr, "dvi_search: Searching for |%s| from page %d", settings->term, settings->from_page)); TRACE_FIND((stderr, " settings: down = %d, re = %d, case = %d", settings->direction, settings->use_regexp, settings->case_sensitive)); if (m_changed_page) { m_changed_page = False; reinit = True; } /* initialize text_encoding */ if (text_encoding == NULL) { text_encoding = get_text_encoding(); } /* first call to this routine, or search term changed: Re-initialize the utf-8 representation and the regexp */ if (settings->utf8_term == NULL || searchterm_bak == NULL || strcmp(settings->term, searchterm_bak) != 0) { if (!reinit_searchterm(settings, text_encoding)) { searchinfo->locked = False; return; } free(searchterm_bak); searchterm_bak = xstrdup(settings->term); recompile_regexp = True; } if (strlen(settings->utf8_term) == 0) { positioned_popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"), MSG_WARN, settings->x_pos, settings->y_pos, NULL, "Search term is empty after UTF-8 conversion!"); searchinfo->locked = False; return; } if (direction_bak != settings->direction && direction_bak != SEARCH_UNINITIALIZED && searchinfo->from_pos != INT_MAX && searchinfo->from_pos != -1) { TRACE_FIND((stderr, "changed direction! from_pos: %d", searchinfo->from_pos)); if (settings->direction == SEARCH_DOWN) { searchinfo->from_pos = searchinfo->to_pos; TRACE_FIND((stderr, "DOWN; new from_pos: %d", searchinfo->from_pos)); } else if (settings->direction == SEARCH_UP) { if (from_pos_bak != -1) { searchinfo->from_pos = from_pos_bak; } else { searchinfo->from_pos = 0; } TRACE_FIND((stderr, "UP; new from_pos: %d", searchinfo->from_pos)); } } direction_bak = settings->direction; /* If one of the settings for case, hyphens ore linebreaks has * changed, we need to rescan the page to undo lowercasing, * hyphenation or linebreak removal in w_info, but preserve * searchinfo->from_pos since user will want to find next match. */ if (case_sensitive_bak != settings->case_sensitive || ignore_hyphens_bak != settings->ignore_hyphens || ignore_linebreaks_bak != settings->ignore_linebreaks) { if (ignore_hyphens_bak != settings->ignore_hyphens) adjust_hyphen_offset = True; case_sensitive_bak = settings->case_sensitive; ignore_hyphens_bak = settings->ignore_hyphens; ignore_linebreaks_bak = settings->ignore_linebreaks; reset_info(&w_info); /* adjust from_pos if it's on second page (we'll rescan it as first page) */ if (searchinfo->from_pos >= page_mapping[0].offset) searchinfo->from_pos -= page_mapping[0].offset; TRACE_FIND((stderr, "from_pos: %d", searchinfo->from_pos)); page_mapping[0].offset = page_mapping[1].offset = page_mapping[0].pageno = page_mapping[1].pageno = -1; /* also need to recompile regexp, and undo lowercasing of search term */ if (!reinit_searchterm(settings, text_encoding)) return; recompile_regexp = True; } if (reinit) { /* file changed, or on different page: re-initialize scan info */ TRACE_FIND((stderr, "re-initializing scan info!")); page_mapping[0].offset = page_mapping[1].offset = page_mapping[0].pageno = page_mapping[1].pageno = -1; /* re-initialize info */ reset_info(&w_info); if (settings->direction == SEARCH_DOWN) searchinfo->from_pos = searchinfo->to_pos = 0; else settings->searchinfo->from_pos = settings->searchinfo->to_pos = INT_MAX; } TRACE_FIND((stderr, "from_pos initialized with: %d", settings->searchinfo->from_pos)); if (settings->use_regexp && recompile_regexp) { #if HAVE_REGEX_H if (!do_recompile_regexp(settings, ®ex)) return; #else warn_no_regex(); #endif /* HAVE_REGEX_H */ } /* do it */ search_over_pages(settings, page_mapping, &w_info, &from_pos_bak, adjust_hyphen_offset #if HAVE_REGEX_H , ®ex #endif ); } static void cb_isearch(Widget w, XtPointer closure, XEvent *event, Boolean *cont); static void do_isearch_cancel(struct search_settings *settings) { static const char default_key_translations[] = "\"0\":digit(0)\n" "\"1\":digit(1)\n" "\"2\":digit(2)\n" "\"3\":digit(3)\n" "\"4\":digit(4)\n" "\"5\":digit(5)\n" "\"6\":digit(6)\n" "\"7\":digit(7)\n" "\"8\":digit(8)\n" "\"9\":digit(9)\n" /* "\"-\":minus()\n" */ ":motion()\n"; static const char default_mouse_translations[] = ":release()"; statusline_info(STATUS_SHORT, "I-search stopped."); free(settings->isearchterm); settings->isearchterm = NULL; settings->searchinfo->from_pos = settings->searchinfo->to_pos = 0; settings->from_page = current_page; erase_match_highlighting(m_info, True); /* restore translations */ XtOverrideTranslations(globals.widgets.top_level, XtParseTranslationTable(base_key_translations)); XtOverrideTranslations(globals.widgets.top_level, XtParseTranslationTable(default_key_translations)); XtOverrideTranslations(globals.widgets.top_level, XtParseTranslationTable(base_mouse_translations)); XtOverrideTranslations(globals.widgets.top_level, XtParseTranslationTable(default_mouse_translations)); XtOverrideTranslations(globals.widgets.draw_widget, XtParseTranslationTable(base_key_translations)); XtOverrideTranslations(globals.widgets.draw_widget, XtParseTranslationTable(default_key_translations)); XtOverrideTranslations(globals.widgets.draw_widget, XtParseTranslationTable(base_mouse_translations)); XtOverrideTranslations(globals.widgets.draw_widget, XtParseTranslationTable(default_mouse_translations)); XtOverrideTranslations(globals.widgets.clip_widget, XtParseTranslationTable(base_key_translations)); XtOverrideTranslations(globals.widgets.clip_widget, XtParseTranslationTable(default_key_translations)); XtOverrideTranslations(globals.widgets.clip_widget, XtParseTranslationTable(base_mouse_translations)); XtOverrideTranslations(globals.widgets.clip_widget, XtParseTranslationTable(default_mouse_translations)); if (resource.main_translations != NULL) { XtOverrideTranslations(globals.widgets.draw_widget, XtParseTranslationTable(resource.main_translations)); XtOverrideTranslations(globals.widgets.clip_widget, XtParseTranslationTable(resource.main_translations)); } XtRemoveEventHandler(globals.widgets.top_level, KeyPressMask|KeyReleaseMask, False, cb_isearch, (XtPointer)settings); XtRemoveEventHandler(globals.widgets.draw_widget, KeyPressMask|KeyReleaseMask, False, cb_isearch, (XtPointer)settings); XtRemoveEventHandler(globals.widgets.clip_widget, KeyPressMask|KeyReleaseMask, False, cb_isearch, (XtPointer)settings); } static void cb_isearch(Widget w, XtPointer closure, XEvent *event, Boolean *cont) { struct search_settings *settings = (struct search_settings *)closure; UNUSED(w); UNUSED(cont); if (settings->isearchterm == NULL) settings->isearchterm = xstrdup(""); if (event->type == KeyPress) { char buf[48]; KeySym keysym; int count; /* temporarily disable control mask; this gives better results with XLookupString() */ const unsigned int save_state = event->xkey.state; /* event->xkey.state &= ~ControlMask; */ count = XLookupString(&(event->xkey), buf, 48, &keysym, NULL); event->xkey.state = save_state; if (count > 0) { /* Ctrl-g and Ctrl-f continue isearch and switch to the search window, respectively */ if (event->xkey.state & ControlMask) { if (keysym == XK_g) { settings->term = settings->isearchterm; isearch_start(); /* restart search */ return; } else if (keysym == XK_f) { static char *str = NULL; if (str != NULL) { free(str); } str = xstrdup(settings->isearchterm); do_isearch_cancel(settings); TRACE_FIND((stderr, "restarting search: %s", str)); dvi_find_string(str, False); return; } } if (keysym == XK_Escape) { do_isearch_cancel(settings); return; } if (keysym == XK_BackSpace || keysym == XK_Delete) { size_t len = strlen(settings->isearchterm); if (len > 0) { settings->isearchterm = xrealloc(settings->isearchterm, len); settings->isearchterm[len - 1] = '\0'; /* statusline_info(STATUS_FOREVER, "I-search (ESC to exit): %s", settings->posix_term); */ } else { xdvi_bell(); } } else if (keysym >= XK_Shift_L && keysym <= XK_Hyper_R) { fprintf(stderr, "keysym %ld: Modifier %s\n", keysym, XKeysymToString(keysym)); } else if (keysym == XK_Return || keysym == XK_KP_Enter || keysym == XK_Linefeed) { /* TODO */ settings->term = settings->isearchterm; isearch_start(); /* restart search */ return; /* statusline_info(STATUS_FOREVER, "I-search (ESC to exit): %s (next match)", settings->isearchterm); */ } else if ((keysym >= XK_KP_Space && keysym <= XK_KP_9) || (keysym >= XK_space && keysym <= XK_asciitilde) || (keysym >= XK_exclamdown && keysym <= XK_ydiaeresis) || (keysym >= XK_F1 && keysym <= XK_F35)) { settings->isearchterm = xstrcat(settings->isearchterm, buf); /* statusline_info(STATUS_FOREVER, "I-search (ESC to exit): %s", settings->posix_term); */ } else { /* TODO: abort search? */ xdvi_bell(); TRACE_FIND((stderr, "keysym %ld: %s is not handled", keysym, XKeysymToString(keysym))); } if (settings->isearchterm[0] != '\0') { /* const char *prefix = ""; */ /* fprintf(stderr, "cb_isearch called!\n"); */ /* if (settings->wrapcnt > 0) */ /* prefix = "Wrapped "; */ /* statusline_info(STATUS_FOREVER, "%sI-search (ESC to exit): %s", prefix, settings->isearchterm); */ settings->from_page = current_page; settings->message_window = 0; /* settings->wrapcnt = 0; */ settings->term = settings->isearchterm; search_dvi((XtPointer)settings); } } } } #ifdef MOTIF #define XTranslations XmNtranslations #else #define XTranslations XtNtranslations #endif /* static void */ /* isearch_cancel(Widget w, XEvent *event, String *params, Cardinal *num_params) */ /* { */ /* struct search_settings *settings = NULL; */ /* void *ptr; */ /* UNUSED(w); */ /* UNUSED(event); */ /* if (*num_params < 1) { */ /* XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params)); */ /* return; */ /* } */ /* sscanf(*params, "%p", &ptr); */ /* settings = (struct search_settings *)ptr; */ /* do_isearch_cancel(settings); */ /* } */ /* static XtActionsRec isearch_actions[] = { */ /* {"CancelIsearch", isearch_cancel }, */ /* }; */ void isearch_start(void) { /* char *ptr = NULL; */ XtTranslations empty_trans; static struct search_settings settings = { NULL, NULL, NULL, False, False, False, False, False, 0, NULL, /* isearchterm */ SEARCH_DOWN, NULL, 0, 0, 0, 0, 0, 0, NULL }; static struct search_info searchinfo = { False, False, False, 0, 0, 0, 0 }; static int wrapcnt_bak = 0; settings.searchinfo = &searchinfo; if (settings.isearchterm) { /* already running a search, jump to next match */ settings.searchinfo->from_pos = settings.searchinfo->to_pos; if (settings.wrapcnt > wrapcnt_bak) { /* search wrapped */ wrapcnt_bak = settings.wrapcnt; search_restart((XtPointer)&settings); } else { wrapcnt_bak = settings.wrapcnt; search_dvi((XtPointer)&settings); } return; } settings.wrapcnt = 0; /* ptr = get_string_va("osfCancel:CancelIsearch(%p)", (void *)&settings); */ /* empty_trans = XtParseTranslationTable(ptr); */ empty_trans = XtParseTranslationTable(""); /* free(ptr); */ /* XtAddActions(isearch_actions, XtNumber(isearch_actions)); */ statusline_info(STATUS_FOREVER, "I-search (ESC to exit): "); XtVaSetValues(globals.widgets.top_level, XTranslations, empty_trans, NULL); XtAddEventHandler(globals.widgets.top_level, KeyPressMask|KeyReleaseMask, False, cb_isearch, (XtPointer)&settings); XtVaSetValues(globals.widgets.draw_widget, XTranslations, empty_trans, NULL); XtAddEventHandler(globals.widgets.draw_widget, KeyPressMask|KeyReleaseMask, False, cb_isearch, (XtPointer)&settings); XtVaSetValues(globals.widgets.clip_widget, XTranslations, empty_trans, NULL); XtAddEventHandler(globals.widgets.clip_widget, KeyPressMask|KeyReleaseMask, False, cb_isearch, (XtPointer)&settings); } xdvik-ja-22.84.16-j1.40/texk/xdvik/ac/0000775000175000017500000000000011730170101016535 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/texk/xdvik/ac/xdvik.ac0000664000175000017500000000075411173312615020206 0ustar uwabamiuwabami## texk/xdvik/ac/xdvik.ac: configure.ac fragment for the TeX Live subdirectory texk/xdvik/ dnl dnl Copyright (C) 2009 Peter Breitenlohner dnl You may freely use, modify and/or distribute this file. dnl ## configure options for xdvik AC_ARG_WITH([xdvi-x-toolkit], AS_HELP_STRING([--with-xdvi-x-toolkit=KIT], [Use toolkit KIT (motif/xaw/xaw3d/neXtaw) for xdvi @<:@default: Motif if available, else Xaw@:>@])) xdvik-ja-22.84.16-j1.40/texk/xdvik/ac/withenable.ac0000664000175000017500000000064611371753261021211 0ustar uwabamiuwabami## texk/xdvik/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/xdvik/ dnl dnl Copyright (C) 2009, 2010 Peter Breitenlohner dnl You may freely use, modify and/or distribute this file. dnl dnl extra_dirs = texk/xdvik/squeeze dnl ## configure options and TL libraries required for xdvik KPSE_ENABLE_PROG([xdvik], [kpathsea t1lib], [x]) m4_include(kpse_TL[texk/xdvik/ac/xdvik.ac]) xdvik-ja-22.84.16-j1.40/texk/xdvik/search-internal.h0000664000175000017500000000671711032450154021421 0ustar uwabamiuwabami/* * Copyright (c) 2003-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef DVI_SEARCH_H_ #define DVI_SEARCH_H_ #include "xdvi-config.h" #include "xdvi.h" #include "search-dialog.h" #include "dvisel.h" /* Widget names that are used in callbacks */ #define Xdvi_SEARCHBOX_INPUT_NAME "searchbox_input" #define Xdvi_SEARCH_POPUP_NAME "find_popup" /* A sorted dynamic array that maps text buffer (i.e. word) * positions to DVI file offsets. */ struct pos_info { size_t buffer_pos; /* position in text buffer */ struct bbox bbox; /* bounding box of this word */ }; struct page_mapping { int pageno; int offset; }; struct word_info { char *txt_buf; /* contains scanned text as whitespace separated strings */ size_t txt_buf_size; /* size of above buffer */ size_t curr_buf_idx; /* current position in buffer */ struct bbox *bboxes; /* dynamic array of position infos */ size_t bboxes_size; /* size of above array */ size_t bboxes_idx; /* current position in buffer */ const struct page_mapping *page_mapping; /* list of page offsets, for bbox_pass */ struct search_settings *settings; /* pointer to search settings, for bbox_pass */ int buffer_offset; /* offset to start of buffer from text on previous pages */ Boolean bbox_pass; /* whether we're scanning for bounding boxes of match */ Boolean search_scan_pass; /* whether we're scanning for text in string search */ Boolean text_selection_pass; /* whether we're scanning for text selection */ }; struct save_or_print_info; /* forward declaration */ extern void isearch_start(void); extern void search_dvi(XtPointer settings); extern void search_restart(XtPointer settings); extern Boolean search_extract_text(struct save_or_print_info *info); extern Boolean search_have_match(int pageno); extern int search_inside_bbox_match(int x, int y); extern void search_draw_inverted_regions(void); extern void search_signal_page_changed(void); extern void search_reset_info(void); extern void search_erase_highlighting(Boolean flag); extern void search_putback_expose(void); extern char *get_text_selection(int *len, int x, int y, int w, int h); #if 0 #define TEST_DELAY(s) \ do { \ TRACE_FIND((stderr, s)); \ int i, j; \ XSync(DISP, False); \ for (i = 0; i < 10000; i++) \ for (j = 0; j < 20000; j++); \ } while (0) #else #define TEST_DELAY(s) /* as nothing */ #endif #endif /* DVI_SEARCH_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/my-snprintf.c0000664000175000017500000000414111032450154020610 0ustar uwabamiuwabami/*------------------------------------------------------------ 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------*/ #include #include #include "xdvi-config.h" #include "xdvi.h" #include "my-vsnprintf.h" #include "my-snprintf.h" #ifndef HAVE_SNPRINTF /*------------------------------------------------------------ * my_snprintf - emulation of glibc2.1 snprintf, use if * snprintf is not available * * Arguments: * char *str - buffer to print string into * int size - print only len characters of * char *format - variable format list * * Returns: * int size - number of characters that would have been * written if enough space had been available * * Purpose: * Implementation of snprintf function, using my_vsnprintf * (which see). *------------------------------------------------------------*/ int my_snprintf(char *str, size_t size, const char *format, ...) { va_list args; int retVal; va_start(args, format); retVal = VSNPRINTF(str, size, format, args); va_end(args); return retVal; } #endif xdvik-ja-22.84.16-j1.40/texk/xdvik/CHANGES0000664000175000017500000013150711205257067017172 0ustar uwabamiuwabamiThe xdvik development team tries to keep step with the changes in Paul Vojta's xdvi, but since we might not always manage to update xdvik in time, there may be `leaps' in the version numbers. Sometimes there are also intermediate or `patchlevel' releases of xdvik between two releases of xdvi; these are tagged with additional digits (e.g. `22.74.1'; up to 22.40, letters were used instead). Versions containing major changes are marked as `beta'; these may contain undetected bugs. Such versions shouldn't be used by distributors. * 22.84.16 (2009-05-18): + Fixed a problem with the distribution (texmf.cnf file wasn't included). * 22.84.15 (2009-03-02): + Fixed #2067614: Re-introduced default binding for key 0 which had been forgotten in previous changes + Fixed #1502137 (compiler warnings on 64bit systems) + Fixed some typos in the man page (ubuntu ticket #202435, see https://bugs.launchpad.net/ubuntu/+source/texlive-bin/+bug/202435) * 22.84.14: + Added action "mouse-modes()" to allow customization of mode specific mouse bindings. + Fixed #1953028 (typo in events.c that broke fullscreen mode) + Fixed #1953023 (unsigned char vs. signed char problem in window ID computation that broke -unique and -sourceposition on 64bit systems) + Fixed #1953026 (security issue with temp file naming in xdvizilla) + Don't distribute xdvizilla as binary since it's no longer needed for current browsers (see discussion here: http://www.tug.org/pipermail/tex-live/2008-April/015697.html) The source is kept for compatibility. + Updated to kpathsea version 3.4.5 (same as in texlive 2007) + Fixed #1875314 (--with-system-t1lib still used headers from distribution's t1lib subdir) + Fixed #1888187 (Typo in help window) + Fixed #1875311 (Space and backspace now keep horizontal position when -keep is specified) + Fixed #1875321 (Numlock key is not properly handled by translations) + Fixed #1875309: Added xdg-open to browser commands + Improved fix for #1819017 + Implemented feature request #1577926 (make mouse pointer invisible in magnifier window) + Merged STABLE with main branch by #ifdef'ing experimental DELAYED_MKTEXPK code * 22.84.13: + Fixed #1819017 (uint32_t conflicts with XeTeX configure) + Fixed #1044891 (xdvi -unique didn't insert page into page history) + Fixed #1586240 (memory corruption with full TMPDIR) + Fixed #1143508/#1283438 (wrong window sizes at startup) + Fixed margin flags (didn't work for the first page of a document) + Fixed #1553432 (failed assertion with hyperref and html: specials) + Fixed #1796818 (don't use 'empty' argument for %c when no column number info is available) + Fixed 1815476 (use = instead of == in shell wrapper) * 22.84.12: + Fixed a segfault bug if the default replacement font (cmr10) had fewer characters than the font being replaced. + Fixed a segfault with strcmp() when the statusline was disabled. * 22.84.11: + IMPORTANT: The binary is now called xdvi- instead of xdvi-.bin, e.g. 'xdvi-motif' instead of 'xdvi-motif.bin'. For more information on the reasons for this change, please see: http://sourceforge.net/tracker/index.php?func=detail&aid=1222202&group_id=23164&atid=377580 + Implemented a search term history for the search window. + Install signal handler for SIGUSR1 early (#1094615). + Fixed a crash in htex_prescan_carry_over() (#1344956, #1188866). + Fixed a crash when printing a DVI file that was read from a FIFO, as was the case with Debian's xdvi.pl wrapper script (#1466262). + Added more font encodings (missing encodings reported by several people). + Fixed issue with translations not being installed on main window on Motif (problem reported by Joost Kremers to xdvi-core). + Fix for bug 1611508 (segfault with -nogrey/grey). + Fix for bug 1526447 (searching for EPS files in included subdirectories). + Fix for bug 1376354 (make -hush also trigger -hushstdout, add -hushbell). + Fix bug with whitespace chars in Chinese fonts reported as .notdef (see http://tug.org/mail-archives/tex-k/2006-October/001608.html). + Fix for #1572806 (xdvi-search.el: cd into directory of .tex file before invoking xdvi). + Bugfix for #1530667 (hyperlinks containing parentheses don't work correctly with 'hdvips' driver) contributed by Matthias Habl. + Fixed xdvizilla bug #1508963 (Solaris "file" utility doesn't recognize DVI files). + Fixed bug #1499566 (force focus for text input field in search dialog for Xaw). + Fixed bugs #1475921 and #1484561 (type errors and a case of uninitialized memory); thanks to Nobuyuki Tsuchimura for reporting them and providing a patch. + Fix for bug #1454648: restore old behaviour of '-s 0' option which was accidentally lost in rev. 1.249.2.80 + Resurrected 'grid mode' which had been removed in 22.73-beta1 (toggled via 'D'; feature request #1375576) + Fixed bug #1428583 (problems with GS_DPS, reported by Ben Stern) + Fixed bug #1428482 (problem with building on sparcv9, also found by Ben Stern) + Added Ctrl/Shift bindings to the mouse wheel for zooming and scrolling horizontally + Fixed a bug with PK fonts not being used after loading a Type1 font had failed, reported by Ralf Stubner (#1363644) + Fixed a crash on Solaris 10 (SPARC and AMD64) with WORD64/LONG64 reported by Peter Bray. + Fixed a bug with reencoding reported by Staszek Wawrykiewicz (#1295829): If plr10 is missing from ps2pk.map, xdvik will use plr10.pfb without reencoding it instead of calling mktexpk for plr10.mf which would yield the correct encoding. + Replaced a failed assertion with a warning when a graphics file included by a PS special isn't readable by user. + Fix for library inclusion order problem contributed by K. Berry (see http://tug.org/mailman/htdig/tex-live/2005-August/008609.html) * 22.84.10 (2005/04/28): + Fixed zero termination bug in t1lib version number check (t1lib.ac). + Render an empty character instead of terminating with failed assertion if T1lib doesn't return a usable glyph (e.g. at very small \magnification factors; #1184087). + Made gs_timeout in psgs.c a resource instead of #define it. + Make file opening work with file descriptors too, as used in Debian's Perl wrapper for xdvi (#1165497). * 22.84.9 (teTeX-3.0): + Applied Patch by Nobuyuki Tsuchimura (#1116871) to remove code duplication in encodings.c. + Changed --with-x-toolkit configure option to --with-xdvi-x-toolkit for better interoperability with Metafont. + Added a missing #if HAVE_X11_XMU_XMU_H in gui/selection.c. * 22.84.8 (2004/12/02): + Made text selection mode and ruler mode work correctly with LessTif and Motif 1.2.4 (bugfix for #997073). Special thanks to Svend Tollak Munkejord for helping me debugging this and several of the other issues listed here. + Fixed an `unaligned access' warning on 64-bit architectures (OSF1/5.1), and some compiler warnings on Solaris/Ultrix/Tru64. Many thanks to Bernhard Simon for extensive testing on Ultrix, AIX and Tru64. + Fixed a problem with non-default installation paths for libXpm, with a lot of help from Sven de Vries. + Fixed a formatting problem in the man page that showed up with groff-1.17.2. + Fixed a problem with window geometry when `-geometry' argument specifies only x/y-offset, reported by Karl Berry here: http://tug.org/mail-archives/tex-k/2004-November/001128.html + Disabled virtual memory reallocation in T1lib (t1load.c, ANSI_REALLOC_VM) that caused a segfault on OSF1/V5.1 alpha. + Always install a custom X error handler which will print warning messages instead of terminating the application. + Create ~/.xdvirc with permissions 0600 instead of default ones. * 22.84.6 (2004/11/08): + Fixed a few compilation problems with HAVE_REGEX_H, strdup() vs. xstrdup() and linkers not allowing multiple definitions (ULTRIX). * 22.84.5 (2004/10/28): + Fixed bug #968127 (recursive call to file loading code due to read_events() in load_font(), which was supposed to update the `loading file, may take a while' popup when fonts are created; currently, this popup won't appear at all). * 22.84.4 (2004/09/27): + Fixed bug #1002688 (race condition when toggling expert mode and marking pages). + Fix bug #992179 (failed assertion when DVI had been removed), reported again by Ulrich Scholz. + Implemented feature request #995114 (prefix argument for Ctrl-o opens recent files in history). + Fixed bug #1029127 (map file parser didn't understand `<[' encoding file syntax) + Fixed a crasher bug on PowerPC related to multiple invocations of v*printf() without matching va_start()/va_end() calls, reported to the tex-live mailing list by Siep Kroonenberg (http://tug.org/mailman/private/tex-live/2004-September/006780.html). * 22.84.3 (2004/07/15): + Printing to PS or PDF didn't really use the fallback temporary file when current file was corrupted (#986009; thanks to Ulrich Scholz for reporting this one). + Fixed href length computation error when a href started with whitespace (#988934, again reported by Ulrich Scholz). + Removed t1x11.o from libs/t1lib/Makefile.in as in tetex 2.96.5.20040711 since it broke compilation with --with-x=no * 22.84.1 (2004/06/26): + Fixed a segfault if setlocale() call returns NULL for certain locale/X library combinations (reported by Reiner Steib). + Read the toolbar pixmap from build-in default (toolbar.xpm) if no file is found in the search locations. + Fixed a problem with the toolbar causing BadMatch errors with visuals where the xdvi window has a different depth from the root window, reported by Olaf Weber on tex-live (http://tug.org/mailman/private/tex-live/2004-June/006112.html). + Fixed a problem with incompatible vsnprintf() implementations that don't return the length of the string actually needed, also reported by Olaf Weber. + Added a warning if configure detects LessTif because of the bugs with LessTif. * 22.84 (2004/06/01): + Added a `Open Recent' entry to the files menu (file history is saved to ~/.xdvirc). When xdvi is started without filename argument, the most recent file from the history will be used (set the X resource `noFileArgUseHistory' to false to get back the previous behaviour of opening the file selector in that situation). + Also enable the ruler lines when xdvi is started in ruler mode (bug reported by Zhang Lin-Bo). + Added `dvips options' field also to saving dialog (feature request #942853, reported by Ulrich Scholz). + Protect against integer overflow in prefix arguments (patch suggested by Matt Swift in debian bug report #247848) + Imported changes from non-k xdvi 22.83/22.84. + Fixed another wrong string (printing vs. saving) for #939262 + Fixed a bug with UTF-8 conversion in text copy&paste. + Fixed #940056 (Xaw version crashed when toggling expert mode and at same time quickly changing pages) + Added Ctrl-Home/End to forced Motif bindings for the drawing area. * 22.82 (2004/04/21): + Implemented a text selection mode, similar to xpdf: Use Mouse-1 to mark a rectangular region of text in a DVI file which is put into the X selection. + Added a Preferences dialog for the Motif version. + Use $HOME/.xdvirc to save user customization from menus, dialogs and Motif preferences; new `-q' option/`noUserFile' X resource inhibits reading this file. + Changed semantics of `browser' command-line option/`wwwBrowser' X resource: Make it override the $BROWSER or the (obsolete) $WWWBROWSER environment variable; use Netscape by default if no browser is specified. + Fixed #939262 (Bugs when saving/printing: Title of log window was `Printing' also when saving, and outfile names weren't updated correctly after loading a new file). + Force vertical scrollbar for Motif Printing/Saving log window. + Bugfixes for a potential crash if shrink factor is changed on a page with color specials, as in non-k xdvi-22.82. + Fixed a bug with the ESC key to close popup windows in Motif that could cause crashes when opening new popups, and implemented ESC to close Xaw popup windows (feature request #919501). + Updates for kpathsea/withenable.ac by Olaf Weber. + Made Ctrl-+ and Alt-Ctrl-+ case insensitive (suggested by Harald Koenig). + Fixed Motif 1.2 compile (XmEACH_SIDE), and added/fixed configure checks for -lXmu, -lXp and -lXpm linker options. + Removed Xaw file selector auto raising since it could send the X server into a busy loop when the file selector was over a window that should always stay on top. + Removed t1mapper man page install (script wasn't installed either). + Fixed #926055: - Default printing target not set correctly when printing window was initialized. - `-t' paper options were just appended instead of replacing the existing ones. - Current directory of dvips was that of xdvi invocation instead of DVI file path, causing e.g. problems with included EPS files. * 22.81.1 (2004/03/17): + Upgrade to kpathsea 3.5.2, and use lookup in new locations kpse_enc_format and kpse_type1_format for .enc files and .pfa/.pfb files, respectivly. (Lookup in old locations is preserved for backwards compatibility). + Upgrade to t1lib version 5.0.2, and and additional off-by-one bugfix for MAXPATHLEN. + Added support for libtool, as in teTeX-beta, and resync'ed with the teTeX sources (many thanks to Thomas Esser for helping with this!) + Fixed a failed assertion when pressing `Shift-r' (reload) after a DVI file had been deleted (also reported by Thomas Esser), and a problem with the `-unique' option not always reloading the file as it should (idem). + Added key bindings to close some dialogs (suggested by Bernhard Walle in #912671). + Close dependent windows when parent is closed (e.g. warning popups for the save dialog). + Made the `editor' X resource deal correctly with quoted arguments (for arguments containing spaces; see #907714). + Additinally support the paper formats `letter', `ledger' and `tabloid' for better dvips compatibility, suggested by Dragan Milicic. * 22.81 (2004/02/24): + If no --with-toolkit option was given, check if Motif is available, and use it if it is; else, use Xaw. (Use --with-toolkit=xaw to override this default). + Problem with flashing redraw of highlighted region when partially obscured by another window reported and fixed by Zhang Lin-bo. + Fixed #870323 (an error in the online help). + Fixed #880550 (documented Ctrl-s; add default _pp suffix to filenames only when saving partial files). + Added an option '-findstring' for string search from the command line, similar to inverse search. + Improved character name detection in string search by using T1lib function T1_GetCharName(). + Fixed #883708 (oversplitting of forward search markers). + Fixed #876815 (closing search window failed under certain conditions). + Fixed a race condition with hyperlinks and browser startup that might lead to `unknown op-code' crashes, reported again by Zhang Lin-Bo. + Workaround for #884290 (drag&drop in file selector freezes xdvi/X) by disabling drag&drop. Thanks to Bernhard Walle for reporting the bug and suggesting the workaround. + Fixed #885464 (wrong parent window in message popups) by passing in parent widget. + Upgraded to t1lib version 5.0.1. + Implemented a simple page history (feature request #884674). + Implemented hyperref specials inserted by \usepackage[dvips]{hyperref} (feature request #662096). + Fixed wrong page number initialization when going back a hyperlink to a different file (#902073). * 22.78 (2003/12/12): + Improved test for iconv lib to make it work on Mac OS X (reported by Artemio Gonzalez Lopez, http://sourceforge.net/mailarchive/forum.php?thread_id=3535253&forum_id=2244). + Added more encodings for string extraction/search, reported by Ulrich Scholz (#850787). + Fixed a bug with redrawing the page after file had been reloaded by `-watchfile', and a crash when using find while file was reloaded (#850795), again reported by Ulrich Scholz (many thanks!) + Force C locale when converting X resources to numbers, so that `.' is used as decimal point (#855950 - many thanks to Martin Vaeth for finding this bug). + Fixed a bug when loading first file via the file selector, reported by Dragan Milicic. + Fixed a bug with inverted highlighting not working on Solaris, again reported by Ulrich Scholz (#850788) + Don't close file selector if opening the new DVI file failed (feature request #851545, again by Ulrich Scholz). + Implemented a0/a0r and other missing DIN A/B/C formats (feature request #852431). + Fixed wrong binding for XmDIALOG_OK_BUTTON instead of XmDIALOG_CANCEL_BUTTON in create_dialogs(). + Fixed a bug with hyperlinks that wrapped across several lines and pointed to another page: these were highlighted as visited only when region was exposed the second time. + Fixed a compatibility problem with fork/vfork on Mac OS X, as in xdvi-22.78. + Added a `creating fonts' info window before main window is mapped (just a preliminary hack, no replacement for truly asynchronous font creation, since that window also feezes during font creation; see also feature request #614708). + Fixed a bug with width computation of initial window with `-expertmode 0' + Workaround by Zhang Lin-Bo for bug #856547 (presumably a race condition with GS_PIXMAP_CLEARING_HACK and scanned_page_* global variables). * 22.77.3 (2003/11/25): + Fixed a few compilation problems on Solaris (#827454, and headers in print-internal.c). + Added an option `ignore hyphenation/linebreaks' for string search. + Use inverse highlighting instead of drawing bounding box, as in Acroread/xpdf, implemented by Zhang Lin-Bo. + Make the pagelist use physical pages by default, unless `UseTeXPages' option is used. + Made search settings honour the X resources for setting checkboxes (suggested by Reiner Steib). + Made the `Home' and `End' buttons go to the top and bottom of the page, and Ctrl-Home and Ctrl-End to the first and last page of a document, respectively. + Added the forgotten directory texk/xdvik/texmf-alt for non-current-teTeX systems. + Fixed an X error with toggling fullscreen mode when -fullscreen option had been used (thanks to Zhang Lin-Bo for reporting it). + Fixed an off-by-one error in string backwards search that had made it skip every second match for matches of length 1. + Removed the -DOmega define and made Omega a runtime option that is enable by default and can be disabled via the -noomega command-line option or the `Omega' X resource. + Removed the --disable-htex compilation option. + Added support for CJK fonts when saving a file as UTF-8, and when searching in a file with such fonts (many thanks to Zhang Lin-Bo for providing the patches). + Made toolbar.xpm obey the current window background colors. + Fixed a crash when saving a DVI file with empty pages in text format (again reported and fixed by Zhang Lin-Bo). + Fixed a crash when opening nonexisting files via the file selector in Motif (again reported by Zhang Lin-Bo). + Fixed a crash with GS_PIXMAP_CLEARING_HACK when toggling gs_alpha on a page with PS graphics (again reported by Zhang Lin-Bo). + Fixed broken `Print to file' option, and wrong page numbers passed to dvips when `P' has been used to assign a different page number to the current page + Added string `physical pages' to print popup (#841434) * 22.77.2 (2003/10/18): + Implemented support for additional file formats in save dialog: PS, PDF, DVI, and plain text (in ISO-8859-1 and UTF-8). + Implemented string search in DVI files (feature request #470389). + Fixed an incompatibility with X11R5 (#803642; thanks to Ulrich Scholz for his help with debugging this). + Fixed a problem with the cursor masks on some X displays (#804294, again reported and debugged by Ulrich Scholz). + Fixed a problem with the initial tooltip window having the wrong (too large) size on some systems (#802806; thanks to Kostas Oikonomou for help with debugging this). + Also dump PS header files (e.g. psfrag.pro) to partially saved or printed files. + Fixed a security problem (tmp race) with xdvizilla (#812600; thanks very much to Thomas Esser for help with fixing this). + Used another workaround for the Ghostscript `alpha' driver problem with not erasing previous images: Call `erasepage' explicitly for pages with PS graphics (#633420; many thanks to John Bowman for providing a patch). + Fixed a bug with --datadir or --prefix being overwritten by default TEXMFMAIN if they didn't contain a valid texmf tree (#814004; thanks to Han-Wen Nienhuys for reporting this). + Fixed a typo in the Motif menu accelerator for set-gs-alpha() (`V', not `0v', also reported by Han-Wen Nienhuys). + Fixed bug #814328 (prevent Ctrl-l from changing position when switching back from fullscreen mode). + Fixed bug #810501 (`keep position' value was lost when resizing to fullscreen had removed the scrollbars). Thanks again to Ulrich Scholz for reporting these bugs. + Fixed a typo in the manpage, and broken redrawing of page (again reported by Ulrich Scholz, #819937). + Also resolve symbolic links in the main DVI name; this should improve the behaviour with inverse search, cf. #768817, and the search for e.g. embedded graphics or hyperlinks. + Use ',' as separator for command-line debugging options instead of `|'. + Fixed a linker problem with multiple definitions on Cygwin. * 22.77.1 (2003/09/06): + Fixed the support for the window manager `delete' protocol for Xaw. + Fixed bug #797171 (BadValue X error when toggling expert mode on Solaris; thanks to Erik Frisk for helping me with debugging this). + Fixed a bug introduced in 22.76 with wrong argument to kpse_set_program_name(), which results in kpathsearch not finding font files etc. properly if SELFAUTODIR is used. Reported by Erik Frisk. (And a fix to that fix, reported by Dragan Milicic.) + Fixed obsolete link in the `New Features' Help menu entry. * 22.77 (2003/08/25): + Fixed bug #784204 (failed assertion with Motif at startup) + Removed the check for the DVI file inode number in forward search, since (as opposed to original xdvi) xdvik expands the DVI filename to a full path, so it's sufficient to match the full path. + Fixed bug #779521 (crashes when printing with temporary file enabled; thanks to Bernhard Walle for spotting this). + Fixed bug #769025 (saving the DVI file may result in a corrupted copy; thanks to Ulrich Scholz for reporting and help with debugging it). + Always dump `literal' PS specials (starting with `!') to the output file, otherwise things like draftcopy won't work for partially saved DVI files. + New application icons (lion with `X'). * 22.76.1 (2003/06/28): + Implemented a -watchfile option, as in gv (#547137). + Implemented feature request #759865: To avoid `DVI file corrupted' messages (and some race conditions with the drawing routines that might result in `bad opcode' errors when paging through a DVI file while it is being written by TeX), xdvik now creates a backup version of the file being viewed. This file is swapped with a fresh version of the original each time the original file has been written completely by TeX. The command line option `-notempfile' can be used to revert to the previous behaviour (no temporary file). + Fixed a bug with up-or-previous() and down-or-next() ignoring keep flag (which broke gs display, since that relied on home()). + Enabled XtAppAddTimeout() for Xaw, just like for Motif. + Removed the STATUSLINE conditional compilation (which was broken). + Added a `pixels' ruler unit. + Implemented a workaround for the `stale pixmaps' problem with the gs x11alpha driver (#633420), by first drawing a rectangle in background color of the size of the bounding box to clear the pixmap. + Fixed bugs #762621 (-sourceposition and -unique didn't fork properly) and #762765 (printing/saving of marked pages was broken) in the (withdrawn) version 22.76; thanks to Zhang Lin-Bo and Bernhard Walle for reporting these bugs. + Removed the XPM application icon used since xdvik-22.74, after it became apparent that it was a plagiarized version of OzTeX's icon (in an older version). Reported by OzTeX's author Andrew Trevorrow; our sincere apologies to him. * 22.74.3 (2003/06/17): + Security fix for MIME types: Escape all special characters (e.g. backticks) in the filename argument to prevent execution of malicious shell code when launching a MIME viewer. + Fixed a bug in the up-or-previous() action (#754805; thanks to Bernhard Walle), and changed the behaviour of the `keep' flag so that up-or-previous() and down-or-next() ignore it (after all, the ordinary up() and down() actions will already keep the position, so they can be used instead if you don't want the scrolling). + Made XBell honour the bell volume (set e.g. by xset; #751763; thanks to Bernhard Walle for reporting this). * 22.74.2 (2003/06/01): + Fixed a bug with `.dvi' extension not being added if file had a `.' in it (#743876; thanks to Markus Kohm for noting it). Now the algorithm is the same as in non-k xdvi for files passed on the command line. For files opened via hyperlinks, no extension is added. + Fixed a bug with wrong topic name in `Help' pulldown menu (#743280; thanks to Bernhard Walle for reporting this). + Fixed another bug with Omega .vf font searching (#746551; thanks to Alexej Kryukov for reporting it). * 22.74.1 (2003/05/25): + Fixed bug with misplaced link underlining when first character in the link is an accented composite character (#737643; thanks to Christian Ullrich for spotting this). + Made forward search also work when file had been changed and not yet reloaded (#738387). + Fixed typos in `-expertmode' description in man page (followups to #737019). + Fixed a compilation problem when --disable-t1lib is used (thanks to Ross Alexander for providing patches). + Fixed a bug with `-s n' argument not working when -fullscreen is given as well, reported by Zhang Lin-Bo. + Fixed a bug with forward search not warning when it hadn't found the file name in the specials. + Made forward search canonicalize all `../', `./' and `//' in the `-sourceposition' argument and in the source specials. + Fixed a bug with window size not being reset correctly when activating expert mode in fullscreen mode (Xaw). + Added a help topic for `ruler mode'. + Fixed a bug with the icon and Xaw menu code causing BadMatch X errors (#740982). + Setting mouse translations in Motif's `mainTranslations' erroneously disabled the default pagelist translations (reported by Zhang Lin-Bo). + Made usage() output the options in sorted order (thanks to Nelson Beebe for the patch). + Added a `-unique' option (as in KDVI) for loading a new file into a running instance of xdvik. + Fixed a bug with the Motif `PS' options menu (#743085; thanks to Bernhard Walle for finding this). + Fixed a bug with xdvi always appending a `.dvi' extension even if the file already had an extension (#743182; thanks to David Feest for noting this). + Fixed two bugs with compilation under Cygwin (-lXpm linker option too early, and MAX() not defined in xaw_men.c; thanks to Geoffrey Vallis for reporting these). + Fixed a bug with scroll_page_if_needed() being called with wrong arguments if forward search hadn't found a glyph and used the special hotspot instead. * 22.74 (2003/05/14): + New option/X resource `-expertmode ' option replaces `-statusline', `-toolbar' (and effectively also `-expert', which is only supported for backwards compatibility). This should fix bug #737019 and make the interoperation of the various expert settings more evident. * 22.74-beta4 (2003/05/13): + Fixed a bug with Omega and T1fonts (thanks to Hossein Movahhedian for reporting it). + Fixed a bug with t1lib not correctly setting dvi_adv for .notdef chars (thanks to Zhang-Lin Bo for spotting it and providing a patch). + Added configure check for including `-lXpm' option. + Fixed a bug with tooltips sometimes popping up without the pointer being over them. + Fixed a bug with the -statusline option causing a segfault when toggling -expert mode (#721807, thanks to Axel Riese). + Expert mode now also removes the scrollbars (#718224); menu bar/status line are togglable independently. * 22.74-beta2 (2003/03/27): + Added Paul's fix for the Solaris core dump problem, and re-enabled the Motif timer fix for #674992. (Special thanks to Dragan Milicic for help with debugging this.) + Fixed a bug with the NumLock key disabling lowercase key accelerators (#708935; thanks to Diego Santa Cruz for spotting this.) + Replaced MIMELIBDIR and MAILCAPDIR by the more standard path definitions EXTENSIONMAPS and MAILCAPS (RFC 1343). Mailcap parsing now honours the `test=' and `needsterminal' fields. + Improved `Usage' output by showing the option that hadn't been recognized (suggested by Gabriel Zachmann). + Fixed bug that instance that last had focus wasn't used for forward search when there were several instances of xdvi displaying the same file (#619070). + Fixed xdvizilla permissions on install (#705158). + Fixed a bug with the OLD_XAW detection in the configure script (reported by Reiner Steib). + Made hyperlinks also work with image anchors. (Thanks to Gabriel Zachmann for spotting this.) * 22.74-beta1 (2003/03/20): + Reverted change for bug #674992 since it causes core dumps on Solaris. + Fixed wrong values for b6(r) and b7(r) paper sizes. + Added warning about not implemented `hdvips' specials + Fixed bug with PgUp/PgDown key (#610206; thanks to Ingo Krabbe for finding the fix). + Fixed a const/_Xconst mismatch (#693647; thanks to Matthias Koeppe for spotting it). + fixed a few hyperref bugs with links of the form file:foo#target not working properly (#693306; thanks to Kostas Oikonomou for finding this), and a memory corruption caused by the -anchorposition argument. + Upgraded to kpathsea 3.4.5. + New layout for help window (topics list in left pane). * 22.73-beta1 (2003/02/23): + Fixed bug with Motif print log hanging (#674992, as in xdvi-22.72), and another race condition with the print process (as in xdvi-22.73). + Fixed segfault that happened when starting without PS rendering and switching it on later (#684880) + Fixed a bug with underlines positioned too low on wrapped hyperlinks (#685652) + Made text fields in print dialog resize when window is resized. + Made popups respect the window manager closing/destroy action + Print command now may contain pipes (#685235). + Added resources `dvipsHangTime' and `dvipsFailHangTime' for customizing the time the dvips print log remains open (#684620). + Implemented simple but hopefully effective `ruler mode' (feature request #525129). + Removed the old `grid' mode, which didn't have any real purpose at all. + Fixed description of the `-pause' option in the man page. * 22.71-beta1 (2003/02/10): + New Xaw GUI layout: pulldown menus instead of buttons, added a page list for easier navigation. + New Motif GUI layout, including a toolbar and a page list. + Removed libwww; use web browser instead to retrieve remote documents. + Added support for color specials (as in xdvi-22.50), and colored hyperlinks. + Added support for papersize specials (as in xdvi-22.66). + Added page list for easier navigation. + Added `Print' (as in xdvi-22.53) and `Save' dialogs. + Added a fullscreen mode (works reliably with Motif only) and a simple `pause' feature + Added string debugging options (e.g. `-debug T1'). + Swapped the DBG_PS (64) and DBG_OPEN (32) debugging options, so that the kpathsea options now are a continuous range. * 22.40y1 (2003/08/24): + Fixed a typo in xdvi.c and in the man page (X resource is called t1lib, not not1lib). Reported to debian-tetex-maint by Matt Swift. + Fixed a segfault occuring when loading nonexistent graphics files if the filename or PSfile special contains `:' (#793395; many thanks to Frank Küster for helping me debugging this). + NOTE: 22.40y is now considered `frozen' and will not be further developed; only major bugs (which we don't expect at this point) will be fixed. Users and distributors are asked to switch to the 22.7x branch instead. * 22.40y (2003/06/06): + Fixed a bug with Omega .vf font searching (#746551); as in 22.74.2. * 22.40x (2003/04/23): + Fixed a bug with .tfm files not being produced for Type1 fonts for which mf sources exist, posted to dctt (). * 22.40w (2003/04/06): + Fixed wrong values for b6(r) and b7(r) paper sizes + Added warnings about not implemented `hdvips' specials, and when requesting .notdef glyphs from a type1 font + Added executable permissions to xdvizilla (#705158) + Fixed a memory corruption bug when opening links to local files fails (#715793) * 22.40v (2003/02/01): + Replaced all strdup() instances by xstrdup(). + Fixed a compatibility problem with AIX3 in xserver-info.c. + Some documentation changes (README.t1fonts, README.t1mapper). * 22.40u (2003/01/18): + Fixed bug #669426 (scrolling the message popups could result in BadMatch X Errors in case xdvi's color depth was larger than the default depth of the screen). + Updated to kpathsea 3.4.4. + Some minor changes in documentation and status messages. * 22.40t (2002/12/27): + Fixed some prototype declarations. + Made shell command in xdvi-search.el also work with (t)csh (#649173). * 22.40s (2002/11/30): + Update for changed EPS handling in ghostscript 8.00, which had caused previous xdvi(k) versions to hang (#644702). + Replaced the startxdvi script by internal subshell handling in xdvi-search.el, as suggested by Thomas Gerds . * 22.40r (2002/11/14): + Prevent the magnifier from popping up in the button panel. + Removed vsnprintf() from wwwfetch.c. + Fixed return value in xdvi_exit(). * 22.40q (2002/11/12): + Fixed broken configure check for memicmp(). + Fixed a glitch in the fontname hash table lookup. + Fixed a broken prototype with display postscript. * 22.40p (2002/11/10): + Fixed --version and --help options (#626569). + Fixed a bug with TT fonts in X giving an error with the file selector (#627607) + Used kpathsea hash table to speed up processing of large .map files. + Added help page on mouse buttons. + Added X server info for ease of debugging. * 22.40o (2002/10/17): + More changes for ANSI C; fixed a few compilation problems on Tru64 v5.1, HP-UX-10.20 and Mac OS X. + Upgraded to kpathsea v.3.3.8, and libwww version 5.4.0. + Show numerical prefix in the statusline. + Fixed a bug with `FIXME_ps_lock' not being defined when configuring "with-ps=dps" (thanks to Norman Wattenberg for reporting and fixing it). + Improved warnings about incorrect papersize options. + New actions do-href() and do-href-newwindow() to allow binding a mouse event independent of magnifier binding. + Some additions to the man page. + Fixed bug #518761: Xdvik won't exit(1) any more when there had been a problem parsing a Type1 encoding or font file. + Fixed bug #619632: try Type1 fallback first, then PK fallback, and generate PK fallback if it's not already present. + Added a wrapper script `xdvizilla' that makes xdvi act as a Mozilla helper application, which can also deal with .tar files. * 22.40n (2002/09/15): + Fixed a few bugs in xdvi-search.el (thanks to Reiner Steib for spotting them, and suggesting patches) + Merged in changes for libs and configure from teTeX-beta (had been planned only for HEAD, but the situation became too messy) - thanks to Thomas Esser for the great work in teTeX that made this much easier ;-) This means that --with-system-wwwlib and --with-system-t1lib now finally work properly. + Removed K&R compatibility macros to address bugs with gcc 3.2 on Solaris, and simplify the setup. Users who really need K&R support should look at Paul Vojta's version of xdvi instead: http://math.berkeley.edu/~vojta/xdvi.html + Added progress indicator for file downloads * 22.40m (2002/09/14): + Same as 22.40n, except that the depend.mk file had contained references to locally installed libwww headers that had made it unusable. For that reason, 22.40m was withdrawn and replaced by 22.40n. * 22.40l (2002/09/01): + Fixed a memory leak (#599082, discovered and patched by Nobuyuki Tsuchimura) + Updated configure to deal with Mac OS X (bug #597977) + Change rules for multiple entries in .map files: Now later entries override previous ones, which is the same behaviour as dvips. Also, xdvik now gives a warning if such a case occurs. + Fixed a memory corruption bug that could occur when switching from a file for which PK font creation failed to another file in the file selection dialog + Documentation changes and minor GUI changes (button positions, re-introduce `First' and `Last' buttons that had been lost in some previous change, de-iconify window on forward search) + Fixed a bug with values <= 0 for the `+page' option causing xdvi to exit ungracefully (#601722, again discovered and patched by Nobuyuki Tsuchimura) * 22.40k (2002/05/21): + Fixed bug #559113 (segfault with large .map files) + Fixed a bug in 22.40j with magnifier sometimes not appearing for files opened via the file selection dialog * 22.40j (2002/04/30): + Fix the compatibility problems with Ghostview v.7.04 and 7.20 (see the thread "xdvi 22.40i status" in the tex-k mailing list, and feature request #525127). + Fix bug #550357 that might cause segfaults when doing a forward search on a corrupted DVI file. + Replace grid1, grid2 and grid3 resources/options by rulecolor resource/option, and make grid and magnifier window use this resource. + Fix a typo in lucida.map (replaced 850 by .850) * 22.40i (2002/04/08): + Fixed buffer overflow bug in hypertex.c that broke opening a new xdvi instance with Mouse-2 on hyperlink * 22.40h (2002/03/19): + Removal of t1lib documentation and sample fonts reduces package size from 3MB to 2MB. + Fix hyperref bugs #505100 and #473361, and a failed assertion when starting a command (e.g. the EDITOR) fails with no output. + Additional configure options for xaw3d and neXtaw. * 22.40g (2002/01/08): + Upgrade to t1lib v1.3.1. + Fix bug with XInternAtoms not available in X11R5. + Fix bug #478034 (shell escapes were incorrectly treated as URLs). + Fix bug #500386 (wrong scaling of faked small caps fonts). + Don't exit with usage message when n in the `+n' command line option (for goto-page) exceeds the total number of pages, but go to the last page instead. * 22.40f (2001/11/02): + Updgrade to t1lib v1.2. + Fix a t1lib rendering bug with mfmodes different from 600dpi (#474213). * 22.40e (2001/10/09): + fixed a serious bug in previous version: libwww_wrapper_HTLoadToFile (use of xfopen) caused an infinite recursion when saving a remote file to disk. + minor change in README files * 22.40d (2001/10/08): + Use libwww_wrapper_HTLoadToFile to make xdvik more immune to libwww bugs and interface changes. * 22.40c (2001/08/06): + Fix some T1 font sizing problems when switching between documents (#441029, #443743) + Fix a memory leak with popup windows + Fix a libwww bug (segfault with invalid URIs, #434836) + Improve error messages when fetching remote files fails * 22.40b (2001/06/18): + Fix bug with popup windows causing BadMatch X errors under certain color settings (reported by T. Esser; patch from xdvi-22.42). * 22.40a (2001/06/07): + Speed up T1 font loading by disabling afm files. + Change .enc file handling to use same format as dvips (requires update of xdvi.cfg). + Fix a bug with `OK' button not working when several popups are active. * 22.40 (2001/06/01): + Fix some segfaults with font generation and popup windows on Solaris (thanks to T. Esser for reporting and helping to fix). * 22.39 (2001/05/28): + Direct rendering of T1 Postscript(TM) fonts with t1lib. + Source special support (forward + backward search) as in xdvi. + New GUI elements: statusline, message windows, help window. + New event and action handling (from xdvi), with configurable buttons. + New actions: drag canvas with mouse, smooth scrolling with arrow keys, and minor adjustments of other actions. + Minor changes in hyperref and mime handling code to make it more robust. * 22.15 (1999/08/22): + Compiles and works on SunOS 4. * 22.08c (1999/06/15): + The message 'Not a DVI file' accompanied by xdvi terminating should be a lot more rare now. The mime-typing and href mechanism was fixed somewhat. * 22.08b (1999/06/12): + Compressed PS files on more than one page works better. Gets rid of /tmp/xdviXXXXX0: file exists messages and the wrong PS graphics on the wrong page. * 22.08 (1999/06/11): + The "Help" button reappears. * 22.05b (8/5/1999): + Prototype and variable declaration fixups. * 22.04 (1999/02/11): + Adapt cleanup code to the k version. xdvik uses a directory for tmp files, xdvi does not. Other tmp file cleanups; it should be possible to access documents with more than 3 included figures by http now. * 22.01 (1999/02/15): Beta release again. + Fix for (rare?) file-descriptor overflow. + Fix for compilation warning about urlocalize + Added `tags' target in top Makefile + 22 would always use the antialiasing device of gs. Fixed. * 22 (1999/02/05): + Stable release. Sync with Paul Vojtas xdvi-22. There are no functional changes since the last release, only some tidying up. Changes made during the xdvik-21 cycle: * Documentation updates * Numerous porting enhancements: In particular native and addon CCs of AIX, HP-UX and Solaris now works. * Several small cosmetical fixes. * Clearification of copyright and licesing terms in documentation and --version information. * The percent lables on the shrink buttons are back. They also have good shrink factors for both 300 and 600 dpi resolutions. Anyone using 1200 dpi fonts with xdvi are welcome to contribute a patch for that. * Percent labels on user specified shrink buttons. * Got rid of SIGSEGV when showing figures in dvi files whose path contains / (ie. other than in .) * Got rid of SIGSEGV when showing figures in remote (http:, ftp:) files. Doing xdvi http://www.math.uio.no/~janl/tex/tex.dvi now works, with figures and all. Except if they're compressed. * On IRIX and DEC-Unix, if your X libs are in a nonstandard place, so that -L/path/X11 is needed, you also need -Wl,-rpath,/path/X11. Autoconf already supported Solaris' -R. * The Reopen button and automatic redisplay when the dvi file was updated was broken. This will also make it reopen web retrived files. If it will serve as the reload button in a WWW browser is another matter entierly though. * xdvi could not open the old file if Cancel was selected in the selfile dialogue. * The filename returned from the selfile dialogue was not being URLized as it should. * Use tempnam(3) to generate temporary directory name * Reorganized to same hierarchy as upcomming teTeX 0.9 and tex-k 7.3 releases, by Thomas Esser. * Update of libwww and kpathsea also by Thomas Esser. * The shrink buttons work better. Patch by Keith Refson. * Missing / in xfilepath in xdvi-sh * Omega xdvik compilation problems fixed * Selfile fix from Dr. Werner Fink helps the CANCEL button to work. * mime.c patch from Allin Cottrell makes hypertex browsing more reliable. * xdvik always assumed that #foo is a URL fragment reference and removed it unconditionaly. Emacs uses # as temporary file prefix (and infix) and so emacs' TeX mode produced .tex and thus .dvi files with # in the name. Problem found by many and solutions suggested by many. Only remove #foo if the dvi name is an URL. To open local files you had better not use URL format ;-) * xdvik 21.21 was produced from xdvik 20c and xdvi-21.21. Two whole days of work to get the merge sane. xdvik-ja-22.84.16-j1.40/texk/xdvik/browser.h0000664000175000017500000000247610363262237020034 0ustar uwabamiuwabami/* public interface for launching a browser to retrieve remote documents. * Copyright(C) 2002-2004 the xdvik development team. */ /* * 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef BROWSER_H_ #define BROWSER_H_ extern void launch_browser(const char *filename); #endif /* BROWSER_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/x_util.h0000664000175000017500000001314611164427731017653 0ustar uwabamiuwabami/* * Copyright (c) 2002-2004 the xdvik development team * * 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 * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. */ #ifndef X_UTIL_H_ #define X_UTIL_H_ #include #include #include #include "xdvi.h" /* nasty globals */ /* Whether program should autoscroll to make href target marker or forward search marker visible. This is disabled by ordinary user scrolling (otherwise xdvi would jump back to the old place, undoing the user scroll), so we need global access to it. */ extern Boolean do_autoscroll; extern void center_window(Widget w1, Widget w2); extern void position_window(Widget w, Position x, Position y); extern void scroll_page_if_needed(int x_min, int x_max, int y_min, int y_max); extern void adjust_width(Widget a, Widget b); extern GC set_or_make_gc(GC gc, int function, Pixel fg, Pixel bg); extern size_t property_get_data(Window, Atom, char **, int (*x_get_property) (Display *, Window, Atom, long, long, Bool, Atom, Atom *, int *, unsigned long *, unsigned long *, unsigned char **)); extern size_t property_get_window_list(char **window_list); extern void set_dvi_property(void); extern void set_window_id(Window w, unsigned char *data); extern Window get_window_id(char *window_p); extern void update_window_property(Window w, Boolean prepend); extern void update_dvi_property(void); extern void property_initialize(void); /* * atom_xdvi_windows() is attached to the root window of the default * screen of the display; it contains a list of (hopefully active) * xdvi windows. */ Atom atom_xdvi_windows(void); /* * atom_dvi_file() is attached to the main xdvi window; it tells the * world what dvi file is being viewed. It is set by that copy of * xdvi and read by this routine. The first 8 bytes are the inode * number, and the rest is the file name. We use 8 instead of * sizeof(ino_t) because the latter may vary from machine to machine, * and the format needs to be machine independent. */ Atom atom_dvi_file(void); /* Atoms attached to the main xdvi window */ /* instruct the current instance to do a forward search * on the source string encoded in the property */ Atom atom_src_goto(void); /* instruct the current instance to do a string search * on the string encoded in the property */ Atom atom_find_string(void); /* instruct the current instance to reload the current file */ Atom atom_reload(void); /* instruct the current instance to load the new file contained in the property */ Atom atom_newdoc(void); /* instruct the current instance to go to the page encoded in the property */ Atom atom_newpage(void); /* instruct the current instance to raise its window */ Atom atom_raise(void); /* instruct the current instance to reread preferences from ~/.xdvirc.tmp */ Atom atom_reread_prefs(void); extern void synthesize_event(XEvent *ev, Widget button); #ifdef MOTIF extern int xm_get_height(Widget w); extern int xm_get_width(Widget w); extern void str_to_pixel(Widget w, const char *colorname, Pixel *ret); extern void pixel_to_str(Widget w, Pixel pix, char *str, size_t len); extern void pixel_to_color(Pixel pix, XColor *color, Display *display, Colormap colormap); #endif extern void adjust_width_to_max(Widget w, ...); extern Widget get_matching_parent(Widget w, Widget p, const char *fmt, ...); extern Boolean widget_is_parent(Widget w, Widget p, Widget s); extern void adjust_vertically(Widget w1, Widget w2, int default_dist); extern void adjust_heights(Widget w1, ...); extern void adjust_heights_min(Widget w1, ...); /* extern void adjust_widths(Widget w1, ...); */ void block_event_callback(Widget w, XtPointer client_data, XEvent *ev, Boolean *cont); extern void unexpected_widget_in_callback(Widget w, const char *callback); extern Boolean get_widget_by_name(Widget *ret, Widget parent, const char *name, Boolean report_error); extern void merge_into_user_db(XrmDatabase db); extern void store_user_preference(const char *name, const char *fmt, ...); extern void store_preference(XrmDatabase *db, const char *name, const char *fmt, ...); extern Boolean save_user_preferences(Boolean full_save); extern void read_user_preferences(Widget toplevel, const char *filename); /* property related routines */ typedef void (*property_cbT)(Window w); extern Window get_xdvi_window_id(Boolean same_file, property_cbT callback); extern void set_string_property(const char *str, Atom prop, Window win); extern Boolean clip_region(int *x, int *y, int *w, int *h); extern Boolean clip_region_to_rect(XRectangle *rect); extern Boolean window_is_mapped(Window w, Display *dpy); extern XtPointer cast_int_to_XtPointer(int x); #endif xdvik-ja-22.84.16-j1.40/texk/xdvik/string_list.h0000664000175000017500000000053711032450154020675 0ustar uwabamiuwabami char *string_list_to_str(char **list, const char *sep); void string_list_print(char **list); char **string_list_reorder(char **list, char *str); char **string_list_move_to_start(char **list, size_t idx); char **string_list_rotate_down(char **list); char **string_list_rotate_up(char **list); char **string_list_prepend(char **list, const char *str); xdvik-ja-22.84.16-j1.40/texk/xdvik/string-utils.h0000664000175000017500000000650011217712530021000 0ustar uwabamiuwabami#ifndef STRING_UTILS_H_ #define STRING_UTILS_H_ #include "xdvi-config.h" #include #include "my-vsnprintf.h" extern Boolean str_is_prefix(const char *, const char *, Boolean case_sensitive); extern Boolean str_is_suffix(const char *, const char *, Boolean case_sensitive); extern Boolean is_spaces_only(const char *); extern char *my_stristr(const char *haystack, const char *needle); typedef enum { USE_DVI_PATH, USE_CWD_PATH } expandPathTypeT; /* remove `file:[//localhost/]' prefix from filename, and append `.dvi' extension if no extension is present */ extern char *filename_append_dvi(const char *fname); /* prepend a path of type `type' (either CWD, or directory of dvi file) to `fname' */ extern char *expand_filename(const char *fname, expandPathTypeT type); /* do both of the above */ extern char *expand_filename_append_dvi(const char *fname, expandPathTypeT type, Boolean must_exist); /* normalize `../' `./' `//' from path */ extern char *canonicalize_path(const char *path); extern char *format_arg(const char *fmt, const char *arg, int *match); extern char *escape_format_arg(const char *arg); extern char *unquote_arg(const char *fmt, const char *arg, int *match, int *len); extern char *get_dir_component(const char *path); extern char **get_separated_list(const char *source, const char *sep, Boolean do_unquote); extern const char *find_format_str(const char *input, const char *fmt); extern Boolean src_compare(const char *src, int src_len, const char *target, const char *path, size_t path_len); extern char *shell_escape_string(const char *str); extern void replace_extension(const char *fname, const char *extension, char *buf, size_t name_len); extern const char *get_extension(const char *fname); extern int length_of_int(int n); extern char *get_string_va(const char *fmt, ...); extern double my_atof(const char *str); /* * Print `fmt' to a dynamically allocated string `buf'. Uses VSNPRINTF * in a way that should work with all of glibc <= 2.0.6, >= 2.1, and * the implementation in my-vsnprintf.c. We cannot invoke va_start()/va_end() * in a wrapper function since we may need to invoke vsnprintf() several * times, and each call invalidates argp; that's why this is a macro ... */ #define XDVI_GET_STRING_ARGP(buf, fmt) \ do { \ va_list argp; \ int CHUNK_LEN = 128; \ int curr_len = CHUNK_LEN, need_len; \ \ buf = NULL; \ \ for (;;) { \ /* see man page for vsnprintf: for glibc 2.0, is */ \ /* -1 if had been trucated to ; for glibc 2.1, */ \ /* it's the total length of ; so the following works */ \ /* with both versions: */ \ buf = xrealloc(buf, curr_len); \ \ va_start(argp, fmt); \ need_len = VSNPRINTF(buf, curr_len, fmt, argp); \ va_end(argp); \ \ if (need_len > -1 && need_len < curr_len) { /* was large enough */ \ break; \ } \ if (need_len > -1) { /* now need_len + 1 is the exact space needed */ \ curr_len = need_len + 1; \ } \ else { /* try again with larger */ \ curr_len += CHUNK_LEN; \ } \ } \ } while (0) \ #endif /* STRING_UTILS_H_ */ xdvik-ja-22.84.16-j1.40/texk/xdvik/common.am0000664000175000017500000000240011175352220017764 0ustar uwabamiuwabami## texk/xdvik/common.am: Makefile fragment for the TeX Live subdirectory texk/xdvik/ ## ## Copyright (C) 2009 Peter Breitenlohner ## You may freely use, modify and/or distribute this file. ## ## Make `#include ' work. x_cppflags = $(X_CFLAGS) $(iconv_includes) common_includes = $(PS_DEF) $(KPATHSEA_INCLUDES) $(T1LIB_INCLUDES) $(x_cppflags) ## Make `-lX...' work. Follow the library order used in X11R6 itself. ## ## Since libXaw7 needs libXpm we put x_xpm_libs after the tool_libs, ## but before -lX11. ## libXp may be needed by libXm and libXaw (the now defunct libXaw8), ## if required libXp has been added to x_ext_lib. ## libXmu needs to come before Xt and after the toolkit libs. x_ldflags = $(X_LIBS) $(x_linker_options) $(iconv_libpath) x_extra_libs = $(X_EXTRA_LIBS) $(iconv_libs) xdvi_x_libs = $(x_ldflags) $(x_tool_libs) $(x_xmu_lib) -lXt $(X_PRE_LIBS) xdvi_x_libs += $(x_ext_lib) $(x_xpm_libs) -lX11 $(x_extra_libs) common_ldadd = $(KPATHSEA_LIBS) $(T1LIB_LIBS) $(xdvi_x_libs) common_dependencies = $(KPATHSEA_DEPEND) $(T1LIB_DEPEND) ## Dependencies for libxdvi.a ## libxdvi_dependencies = ${top_srcdir}/*.[ch] ${top_srcdir}/gui/*.[ch] ${top_builddir}/psheader.c ## Rebuild libkpathsea @KPATHSEA_RULE@ ## Rebuild libt1 @T1LIB_RULE@ xdvik-ja-22.84.16-j1.40/texk/xdvik/main.c0000664000175000017500000012417411276240141017262 0ustar uwabamiuwabami#include "xdvi-config.h" #include #include #include "kpathsea/proginit.h" #include "kpathsea/expand.h" #include "xdvi.h" #include "util.h" #include "x_util.h" #include "sfSelFile.h" #include "my-snprintf.h" #include "dvi-init.h" #include "filehist.h" #include "mag.h" #include "message-window.h" #ifdef T1LIB #include "t1lib.h" #endif /* T1LIB */ #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) #ifndef XDVI_KPSE_PROG_NAME #define XDVI_KPSE_PROG_NAME xdvi #endif static const char *xdvi_kpse_prog_name = TOSTRING(XDVI_KPSE_PROG_NAME); #undef STRINGIFY #undef TOSTRING static char XtRBool3[] = "Bool3"; /* resource for Bool3 */ /* get these before setting `application_resources' */ static XtResource xdvirc_resources[] = { {"noInitFile", "NoInitFile", XtRBoolean, sizeof(Boolean), XtOffsetOf(struct x_resources, no_init_file), XtRString, "false"}, }; static XrmOptionDescRec options[] = { {"-q", ".noInitFile", XrmoptionNoArg, (XPointer)"on" }, {"+q", ".noInitFile", XrmoptionNoArg, (XPointer)"off" }, {"-geometry", ".geometry", XrmoptionSepArg, (XPointer)NULL }, #ifdef MOTIF /* to make `-font' and `-fn' options work, make them an alias for `fontList' */ { "-font", "*fontList", XrmoptionSepArg, (XPointer)NULL }, { "-fn", "*fontList", XrmoptionSepArg, (XPointer)NULL }, #endif {"-s", ".shrinkFactor", XrmoptionSepArg, (XPointer)NULL }, #ifndef VMS {"-S", ".densityPercent", XrmoptionSepArg, (XPointer)NULL }, #endif {"-density", ".densityPercent", XrmoptionSepArg, (XPointer)NULL }, {"-noomega", ".omega", XrmoptionNoArg, (XPointer)"off" }, {"+noomega", ".omega", XrmoptionNoArg, (XPointer)"on" }, #if COLOR {"-nocolor", ".color", XrmoptionNoArg, (XPointer)"off" }, {"+nocolor", ".color", XrmoptionNoArg, (XPointer)"on" }, #endif #ifdef GREY {"-nogrey", ".grey", XrmoptionNoArg, (XPointer)"off" }, {"+nogrey", ".grey", XrmoptionNoArg, (XPointer)"on" }, {"-gamma", ".gamma", XrmoptionSepArg, (XPointer)NULL }, {"-nomatchinverted",".matchInverted", XrmoptionNoArg, (XPointer)"off" }, {"+nomatchinverted",".matchInverted", XrmoptionNoArg, (XPointer)"on" }, /* {"-invertedfactor", ".invertedFactor", XrmoptionSepArg, (XPointer)NULL }, */ {"-install", ".install", XrmoptionNoArg, (XPointer)"on" }, {"-noinstall", ".install", XrmoptionNoArg, (XPointer)"off" }, #endif {"-rulecolor", ".ruleColor", XrmoptionSepArg, (XPointer)NULL }, {"-p", ".pixelsPerInch", XrmoptionSepArg, (XPointer)NULL }, {"-margins", ".Margin", XrmoptionSepArg, (XPointer)NULL }, {"-sidemargin", ".sideMargin", XrmoptionSepArg, (XPointer)NULL }, {"-topmargin", ".topMargin", XrmoptionSepArg, (XPointer)NULL }, {"-offsets", ".Offset", XrmoptionSepArg, (XPointer)NULL }, {"-xoffset", ".xOffset", XrmoptionSepArg, (XPointer)NULL }, {"-yoffset", ".yOffset", XrmoptionSepArg, (XPointer)NULL }, {"-paper", ".paper", XrmoptionSepArg, (XPointer)NULL }, {"-altfont", ".altFont", XrmoptionSepArg, (XPointer)NULL }, #ifdef MKTEXPK {"-nomakepk", ".makePk", XrmoptionNoArg, (XPointer)"off" }, {"+nomakepk", ".makePk", XrmoptionNoArg, (XPointer)"on" }, #endif {"-mfmode", ".mfMode", XrmoptionSepArg, (XPointer)NULL }, {"-editor", ".editor", XrmoptionSepArg, (XPointer)NULL }, #ifdef T1LIB {"-not1lib", ".t1lib", XrmoptionNoArg, (XPointer)"off" }, {"+not1lib", ".t1lib", XrmoptionNoArg, (XPointer)"on" }, #endif {"-sourceposition", ".sourcePosition", XrmoptionSepArg, (XPointer)NULL }, {"-findstring", ".findString", XrmoptionSepArg, (XPointer)NULL }, {"-text-encoding", ".textEncoding", XrmoptionSepArg, (XPointer)NULL }, {"-unique", ".unique", XrmoptionNoArg, (XPointer)"on" }, {"+unique", ".unique", XrmoptionNoArg, (XPointer)"off" }, {"-nofork", ".fork", XrmoptionNoArg, (XPointer)"off" }, {"+nofork", ".fork", XrmoptionNoArg, (XPointer)"on" }, #ifdef RGB_ANTI_ALIASING {"-subpixels", ".subPixels", XrmoptionSepArg, (XPointer)NULL }, #endif {"-l", ".listFonts", XrmoptionNoArg, (XPointer)"on" }, {"+l", ".listFonts", XrmoptionNoArg, (XPointer)"off" }, {"-watchfile", ".watchFile", XrmoptionSepArg, (XPointer)NULL }, {"-expertmode", ".expertMode", XrmoptionSepArg, (XPointer)NULL }, {"-expert", ".expert", XrmoptionNoArg, (XPointer)"on" }, {"+expert", ".expert", XrmoptionNoArg, (XPointer)"off" }, {"+statusline", ".statusline", XrmoptionNoArg, (XPointer)"off" }, {"-statusline", ".statusline", XrmoptionNoArg, (XPointer)"on" }, {"+useTeXpages", ".useTeXPages", XrmoptionNoArg, (XPointer)"off" }, {"-useTeXpages", ".useTeXPages", XrmoptionNoArg, (XPointer)"on" }, {"-mgs", ".magnifierSize1", XrmoptionSepArg, (XPointer)NULL }, {"-mgs1", ".magnifierSize1", XrmoptionSepArg, (XPointer)NULL }, {"-mgs2", ".magnifierSize2", XrmoptionSepArg, (XPointer)NULL }, {"-mgs3", ".magnifierSize3", XrmoptionSepArg, (XPointer)NULL }, {"-mgs4", ".magnifierSize4", XrmoptionSepArg, (XPointer)NULL }, {"-mgs5", ".magnifierSize5", XrmoptionSepArg, (XPointer)NULL }, {"-warnspecials", ".warnSpecials", XrmoptionNoArg, (XPointer)"on" }, {"+warnspecials", ".warnSpecials", XrmoptionNoArg, (XPointer)"off" }, {"-hush", ".Hush", XrmoptionNoArg, (XPointer)"on" }, {"+hush", ".Hush", XrmoptionNoArg, (XPointer)"off" }, {"-hushchars", ".hushLostChars", XrmoptionNoArg, (XPointer)"on" }, {"+hushchars", ".hushLostChars", XrmoptionNoArg, (XPointer)"off" }, {"-hushchecksums", ".hushChecksums", XrmoptionNoArg, (XPointer)"on" }, {"+hushchecksums", ".hushChecksums", XrmoptionNoArg, (XPointer)"off" }, {"-hushstdout", ".hushStdout", XrmoptionNoArg, (XPointer)"on" }, {"+hushstdout", ".hushStdout", XrmoptionNoArg, (XPointer)"off" }, {"-hushbell", ".hushBell", XrmoptionNoArg, (XPointer)"on" }, {"+hushbell", ".hushBell", XrmoptionNoArg, (XPointer)"off" }, {"-safer", ".safer", XrmoptionNoArg, (XPointer)"on" }, {"+safer", ".safer", XrmoptionNoArg, (XPointer)"off" }, {"-fg", ".foreground", XrmoptionSepArg, (XPointer)NULL }, {"-foreground", ".foreground", XrmoptionSepArg, (XPointer)NULL }, {"-bg", ".background", XrmoptionSepArg, (XPointer)NULL }, {"-background", ".background", XrmoptionSepArg, (XPointer)NULL }, {"-hl", ".highlight", XrmoptionSepArg, (XPointer)NULL }, {"-cr", ".cursorColor", XrmoptionSepArg, (XPointer)NULL }, {"-icongeometry", ".iconGeometry", XrmoptionSepArg, (XPointer)NULL }, {"-keep", ".keepPosition", XrmoptionNoArg, (XPointer)"on" }, {"+keep", ".keepPosition", XrmoptionNoArg, (XPointer)"off" }, {"-copy", ".copy", XrmoptionNoArg, (XPointer)"on" }, {"+copy", ".copy", XrmoptionNoArg, (XPointer)"off" }, {"-thorough", ".thorough", XrmoptionNoArg, (XPointer)"on" }, {"+thorough", ".thorough", XrmoptionNoArg, (XPointer)"off" }, {"-fullscreen", ".fullscreen", XrmoptionNoArg, (XPointer)"on" }, {"+fullscreen", ".fullscreen", XrmoptionNoArg, (XPointer)"off" }, {"-pause", ".pause", XrmoptionNoArg, (XPointer)"on" }, {"+pause", ".pause", XrmoptionNoArg, (XPointer)"off" }, {"-pausespecial", ".pauseSpecial", XrmoptionSepArg, (XPointer)NULL }, {"-wheelunit", ".wheelUnit", XrmoptionSepArg, (XPointer)NULL }, {"-mousemode", ".mouseMode", XrmoptionSepArg, (XPointer)NULL }, #ifdef PS {"-postscript", ".postscript", XrmoptionSepArg, (XPointer)NULL }, {"-allowshell", ".allowShell", XrmoptionNoArg, (XPointer)"on" }, {"+allowshell", ".allowShell", XrmoptionNoArg, (XPointer)"off" }, # ifdef PS_DPS {"-nodps", ".dps", XrmoptionNoArg, (XPointer)"off" }, {"+nodps", ".dps", XrmoptionNoArg, (XPointer)"on" }, # endif # ifdef PS_NEWS {"-nonews", ".news", XrmoptionNoArg, (XPointer)"off" }, {"+nonews", ".news", XrmoptionNoArg, (XPointer)"on" }, # endif # ifdef PS_GS {"-noghostscript", ".ghostscript", XrmoptionNoArg, (XPointer)"off" }, {"+noghostscript", ".ghostscript", XrmoptionNoArg, (XPointer)"on" }, {"-nogssafer", ".gsSafer", XrmoptionNoArg, (XPointer)"off" }, {"+nogssafer", ".gsSafer", XrmoptionNoArg, (XPointer)"on" }, {"-gsalpha", ".gsAlpha", XrmoptionNoArg, (XPointer)"on" }, {"+gsalpha", ".gsAlpha", XrmoptionNoArg, (XPointer)"off" }, {"-interpreter", ".interpreter", XrmoptionSepArg, (XPointer)NULL }, {"-gspalette", ".palette", XrmoptionSepArg, (XPointer)NULL }, # endif # ifdef MAGICK {"-magick", ".ImageMagick", XrmoptionNoArg, (XPointer)"on" }, {"+magick", ".ImageMagick", XrmoptionNoArg, (XPointer)"off" }, {"-magick_cache", ".MagickCache", XrmoptionSepArg, (XPointer)NULL }, # endif #endif /* PS */ {"-noscan", ".prescan", XrmoptionNoArg, (XPointer)"off" }, {"+noscan", ".prescan", XrmoptionNoArg, (XPointer)"on" }, {"-notempfile", ".tempFile", XrmoptionNoArg, (XPointer)"off" }, {"+notempfile", ".tempFile", XrmoptionNoArg, (XPointer)"on" }, {"-dvipspath", ".dvipsPath", XrmoptionSepArg, (XPointer)NULL }, {"-ps2pdfpath", ".ps2pdfPath", XrmoptionSepArg, (XPointer)NULL }, {"-debug", ".debugLevel", XrmoptionSepArg, (XPointer)NULL }, {"-linkstyle", ".linkStyle", XrmoptionSepArg, (XPointer)NULL }, {"-linkcolor", ".linkColor", XrmoptionSepArg, (XPointer)NULL }, {"-visitedlinkcolor",".visitedLinkColor", XrmoptionSepArg, (XPointer)NULL }, {"-browser", ".wwwBrowser", XrmoptionSepArg, (XPointer)NULL }, {"-anchorposition", ".anchorPosition", XrmoptionSepArg, (XPointer)NULL }, }; /* * Data for options processing. */ static const char SILENT[] = " "; /* flag value for usage() */ static const char SUBST[] = "x"; /* another flag value */ static const char USAGESTR_END_MARKER[] = "__USAGE_END_MARKER__"; /* end marker */ /* Here, list usage values for options that have `XrmoptionSepArg' set. TODO: what does the `^' stand for? */ static const char *usagestr[] = { /* geometry */ SILENT, #ifdef MOTIF /* font */ SILENT, /* f */ SILENT, #endif /* shrinkFactor */ "shrink", #ifndef VMS /* S */ "density", /* density */ SILENT, #else /* density */ "density", #endif #ifdef GREY /* gamma */ "float", #endif /* rulecolor */ "color", /* p */ "pixels", /* margins */ "dimen", /* sidemargin */ "dimen", /* topmargin */ "dimen", /* offsets */ "dimen", /* xoffset */ "dimen", /* yoffset */ "dimen", /* paper */ "papertype", /* altfont */ "font", /* mfmode */ "mode-def", /* editor */ "editor", /* sourceposition */ "linenumber[ ]*filename", /* findstring */ "string", /* textencoding */ "charset", #ifdef RGB_ANTI_ALIASING /* subpixels */ "{rgb,bgr}[ i1 i2 i3]", #endif /* rv */ "^-l", "-rv", /* watchfile */ "secs", /* expertmode */ "flag", /* mgs */ SUBST, /* mgs1 */ SILENT, /* mgs2 */ SILENT, /* mgs3 */ SILENT, /* mgs4 */ SILENT, /* mgs5 */ SILENT, /* fg */ "color", /* foreground */ SILENT, /* bg */ "color", /* background */ SILENT, /* hl */ "color", /* cr */ "color", #ifndef VMS /* display */ "^-cr", "-display ", #else /* display */ "^-cr", "-display ", #endif /* geometry */ "^-cr", "-geometry ", /* icongeometry */ "geometry", /* iconic */ "^-icongeometry", "-iconic", /* font */ "^-icongeometry", "-font ", /* pausespecial */ "string", /* wheelunit */ "pixels", /* mousemode */ "0|1|2", #ifdef PS /* postscript */ "0|1|2", # ifdef PS_GS /* interpreter */ "path", /* gspalette */ "monochrome|grayscale|color", # endif # ifdef MAGICK /* magick_cache */ "size[k|K|m|M|g|G]", # endif #endif /* dvipspath */ "path", /* ps2pdfpath */ "path", /* debug */ "bitmask|string[,string ...]", /* linkstyle */ "0|1|2|3", /* linkcolor */ "color", /* visitedlinkcolor */ "color", /* browser */ "WWWbrowser", /* anchorposition */ "anchor", /* [end marker] */ USAGESTR_END_MARKER }; static const char *SUBST_VAL[] = { "-mgs[n] " }; static int compare_strings(const void *s, const void *t) { const char *const *ss = (const char *const *)s; const char *const *tt = (const char *const *)t; return memicmp(*ss, *tt, strlen(*tt) + 1); /* also check for final 0 */ } static void usage(int exitval) { XrmOptionDescRec *opt; const char **usageptr = usagestr; const char **sv = SUBST_VAL; const char *str1; const char *str2; const char *sorted_options[XtNumber(options)]; char buf[256]; char *s; int col, n; size_t nopt = 0, k; for (opt = options; opt < options + XtNumber(options); ++opt) { str1 = opt->option; if (*str1 != '-') continue; ASSERT(*usageptr != USAGESTR_END_MARKER, "Too few elements in usageptr[]"); str2 = NULL; if (opt->argKind != XrmoptionNoArg) { str2 = *usageptr++; if (str2 == SILENT) continue; if (str2 == SUBST) { str1 = *sv++; str2 = NULL; } } #if 0 fprintf(stderr, "str1: %s, str2: %s\n", str1, str2); #endif for (;;) { if (str2 == NULL) sprintf(buf, "[%.80s]", str1); else sprintf(buf, "[%.80s <%.80s>]", str1, str2); /* fprintf(stderr, "number of options: %d; len of usagestr: %d\n", */ /* XtNumber(options), XtNumber(usagestr)); */ ASSERT(nopt < XtNumber(options), "index out of range"); /* fprintf(stderr, "sorted: %d=%s\n", nopt, buf); */ sorted_options[nopt++] = xstrdup(buf); if (**usageptr != '^' || strcmp(*usageptr + 1, opt->option) != 0) break; ++usageptr; str1 = *usageptr++; str2 = NULL; } } ASSERT(*usageptr == USAGESTR_END_MARKER, "Too many elements in usageptr[]"); /* fprintf(stderr, "elems in sorted options: %d\n", nopt); */ qsort((void*)sorted_options, nopt, sizeof(sorted_options[0]), compare_strings); s = xstrdup("Usage: "); s = xstrcat(s, XDVI_PROGNAME); /* use `xdvi' here, not `xdvik' or `xdvi-xaw.bin' or ... */ s = xstrcat(s, " [+[]] [-h | --help] [-v | --version] [-license]"); col = strlen(s); fputs(s, stdout); for (k = 0; k < nopt; ++k) { n = strlen(sorted_options[k]); if (col + n < 80) putc(' ', stdout); else { fputs("\n\t", stdout); col = 8 - 1; } fputs(sorted_options[k], stdout); col += n + 1; } /* put this in an extra line, to emphasize that it must come last */ fputs("\n\t[dvi_file]\n", stdout); xdvi_exit(exitval); } static void display_bug_reporting_info(void) { printf("Please send bug reports, feature requests etc. to one of:\n" " http://sourceforge.net/tracker/?group_id=23164&atid=377580\n" " tex-k@tug.org (http://tug.org/mailman/listinfo/tex-k)\n\n" "\n"); } static void display_licensing_info(void) { fputs("Licenses: X Consortium license, GNU Library General Public\n" "License, GNU General Public License (use option `-license'\n" "for more details). There is NO WARRANTY of anything.\n\n", stdout); } static void display_long_licensing_info(void) { fputs("The major parts of Xdvik are licensed under the X Consortium license.\n" "Parts (encoding.c) are licensed under the GNU General Public License.\n" "Xdvik uses the following libraries:\n" "- The kpathsea library, licensed in part under the GNU General Public\n" " License, in part under the GNU Library General Public License.\n" "- t1lib, licensed in parts under the GNU Library General Public License,\n" " in parts under the X Consortium license.\n" "There is NO WARRANTY of anything.\n\n", stdout); } static char * is_good_dvi_file(const char *filename, Boolean from_history) { static char canonical_path[MAXPATHLEN + 1]; Boolean tried_dvi_extension = False; /* following allocates real_filename */ char *real_filename = find_dvi_file(filename, &tried_dvi_extension, from_history); char *ret; FILE *f = NULL; dviErrFlagT errflag; if (real_filename == NULL) return NULL; if ((ret = REALPATH(real_filename, canonical_path)) == NULL) { /* REALPATH failed, use real_filename */ strncpy(canonical_path, real_filename, MAXPATHLEN); canonical_path[MAXPATHLEN] = '\0'; ret = canonical_path; } free(real_filename); /* check for correct DVI files */ if ((f = XFOPEN(ret, OPEN_MODE)) != NULL) { TRACE_EVENTS((stderr, "watching: new file opened successfully.")); if (process_preamble(f, &errflag) && find_postamble(f, &errflag) && read_postamble(f, &errflag, False #if DELAYED_MKTEXPK , False #endif )) { fclose(f); return ret; } fclose(f); if (!from_history) XDVI_FATAL((stderr, "%s: %s.", filename, get_dvi_error(errflag))); return NULL; } else { if (!from_history) XDVI_FATAL((stderr, "Could not open `%s': %s.", filename, strerror(errno))); return NULL; } } static char * get_filename_from_history(int *pageno) { size_t i; /* loop through history, trying to get a good file */ for (i = 0; i < file_history_size(); i++) { char *ret, *test; if ((test = file_history_get_elem(i, pageno)) == NULL) return NULL; TRACE_FILES((stderr, "HISTORY %lu: |%s|", (unsigned long)i, test)); if ((ret = is_good_dvi_file(test, True)) != NULL) { TRACE_FILES((stderr, "SUCCESS: |%s|", test)); return ret; } } return NULL; } static void warn_about_prerelease_versions(void) { int unstable_version = 0; if (strstr(XDVI_VERSION_INFO, "-cvs") != NULL) unstable_version = 1; else if (strstr(XDVI_VERSION_INFO, "-beta") != NULL) unstable_version = 2; if (unstable_version > 0) { printf("\n**********************************************************************\n"); printf("%s version %s,\n%s version.\n\n", XDVIK_PROGNAME, XDVI_VERSION_INFO, unstable_version == 1 ? "an unstable development" : "a beta testing"); printf("Want a stable version instead?\n" " -> please visit one of:\n" " http://xdvi.sourceforge.net/cvs-upgrade.html\n" " http://sourceforge.net/project/showfiles.php?group_id=23164\n\n" "Found a bug?\n" " -> please report it to:\n" " http://sourceforge.net/tracker/?group_id=23164&atid=377580\n\n" "Thanks for your support!\n"); printf("**********************************************************************\n"); } } /* Initialize internal data (most of them global ...) according to the values of resources/command-line arguments, warning user about illegal values etc. */ static void init_check_resources(void) { size_t i; if (resource.mfmode != NULL) { char *p; p = strrchr(resource.mfmode, ':'); if (p != NULL) { unsigned int len; char *p1; ++p; len = p - resource.mfmode; p1 = xmalloc(len); memcpy(p1, resource.mfmode, len - 1); p1[len - 1] = '\0'; resource.mfmode = p1; resource.pixels_per_inch = atoi(p); } } if (currwin.shrinkfactor < 0) { XDVI_ERROR((stderr, "Invalid shrink factor: %d.", currwin.shrinkfactor)); usage(EXIT_FAILURE); } if (resource.density <= 0) { XDVI_ERROR((stderr, "Invalid shrink density: %d.", resource.density)); usage(EXIT_FAILURE); } if (resource.pixels_per_inch <= 0) { XDVI_ERROR((stderr, "Invalid dpi value: %d.", resource.pixels_per_inch)); usage(EXIT_FAILURE); } if (resource.link_style < 0 || resource.link_style > 3) { XDVI_ERROR((stderr, "Unrecognized value %d for resource \"linkstyle\" (valid range is 0 - 3); assuming 3.", resource.link_style)); resource.link_style = 3; } if (currwin.shrinkfactor > 1) { mane.shrinkfactor = currwin.shrinkfactor; /* otherwise it's 1 */ } #ifdef RGB_ANTI_ALIASING #warning Note: RGB Anti-aliasing enabled /* subpixel rendering */ resource.subpixel_order = SUBPIXEL_NONE; if (resource.sub_pixels != NULL) { int sum; if (memicmp(resource.sub_pixels, "rgb", 3) == 0) resource.subpixel_order = SUBPIXEL_RGB; else if (memicmp(resource.sub_pixels, "bgr", 3) == 0) resource.subpixel_order = SUBPIXEL_BGR; else if (memicmp(resource.sub_pixels, "none", 3) == 0) resource.subpixel_order = SUBPIXEL_NONE; else { XDVI_ERROR((stderr, "Unrecognized value \"%s\" for resource subpixels\n" "(possible values are: \"rgb\" or \"bgr\").", resource.sub_pixels)); xdvi_exit(EXIT_FAILURE); } /* get the energy distribution */ if (resource.subpixel_order == SUBPIXEL_RGB || resource.subpixel_order == SUBPIXEL_BGR) { const char *ptr = resource.sub_pixels + 3; while (isspace(*ptr)) ptr++; fprintf(stderr, "ptr: |%s|\n", ptr); resource.subpixel_energy[0] = 33.333; resource.subpixel_energy[1] = 33.333; resource.subpixel_energy[2] = 0.0; if (*ptr != '\0') { if (sscanf(ptr, "%f %f %f", &(resource.subpixel_energy[0]), &(resource.subpixel_energy[1]), &(resource.subpixel_energy[2])) != 3) { XDVI_ERROR((stderr, "Illegal color mask `%s' for resource subpixels (should be: `n n n')\n", ptr)); } } sum = (int)(resource.subpixel_energy[0] + 2 * resource.subpixel_energy[1] + 2 * resource.subpixel_energy[2]); if (sum < 99 || sum > 100) { XDVI_WARNING((stderr, "energy values %f + 2 * %f + 2 * %f don't sum up to 100%%!\n", resource.subpixel_energy[0], resource.subpixel_energy[1], resource.subpixel_energy[2])); exit(1); } resource.subpixel_energy[0] /= 100.0; resource.subpixel_energy[1] /= 100.0; resource.subpixel_energy[2] /= 100.0; fprintf(stderr, "subpixel order: %s = %d; [%f %f %f]\n", resource.sub_pixels, resource.subpixel_order, resource.subpixel_energy[0], resource.subpixel_energy[1], resource.subpixel_energy[2]); } } #endif /* margins */ if (resource.sidemargin) resource.sidemargin_int = atopix(resource.sidemargin, False); if (resource.topmargin) resource.topmargin_int = atopix(resource.topmargin, False); resource.xoffset_int = resource.xoffset ? atopix(resource.xoffset, True) : resource.pixels_per_inch; resource.yoffset_int = resource.yoffset ? atopix(resource.yoffset, True) : resource.pixels_per_inch; /* paper type */ if (!set_paper_type(resource.paper)) { const char **p; char *helpmsg = xstrdup("Possible paper types are:\n "); const char **paper_types = get_paper_types(); for (p = paper_types; p < paper_types + get_paper_types_size(); p += 2) { if (**p == '\0') { /* next line of list */ helpmsg = xstrcat(helpmsg, "\n "); } else { helpmsg = xstrcat(helpmsg, *p); helpmsg = xstrcat(helpmsg, " "); } } helpmsg = xstrcat(helpmsg, "\n(the names ending with `r' are `rotated' or `landscape' variants).\n" "Alternatively, you can specify the dimensions as `WIDTHxHEIGHT', followed " "by a dimension unit (one of: pt pc in bp cm mm dd cc sp)."); /* also dump it to stderr ... */ fprintf(stderr, "Unrecognized value `%s' for paper type option; using %s instead.\n%s\n", resource.paper, DEFAULT_PAPER, helpmsg); popup_message(globals.widgets.top_level, MSG_WARN, helpmsg, "Unrecognized value `%s' for paper type option; using a4 instead.", resource.paper); set_paper_type(DEFAULT_PAPER); } /* magnifier sizes */ for (i = 0; i < get_magglass_items(); ++i) { if (resource.mg_arg[i] != NULL) { char *s; int n = atoi(resource.mg_arg[i]); set_magglass_widht(i, n); set_magglass_height(i, n); s = strchr(resource.mg_arg[i], 'x'); if (s != NULL) { set_magglass_height(i, atoi(s + 1)); if (get_magglass_height(i) <= 0) set_magglass_widht(i, 0); } } } #ifdef PS if (resource.safer) { resource.allow_shell = False; # ifdef PS_GS resource.gs_safer = True; # endif /* PS_GS */ } # ifdef PS_GS { const char *CGMcgm = "CGMcgm"; const char *cgmp; cgmp = strchr(CGMcgm, resource.gs_palette[0]); if (cgmp == NULL) XDVI_FATAL((stderr, "Invalid value %s for gs palette option", resource.gs_palette)); if (cgmp >= CGMcgm + 3) { static char gsp[] = "x"; gsp[0] = *(cgmp - 3); resource.gs_palette = gsp; } } # endif /* PS_GS */ #endif /* PS */ /* The old `-expert' flag overrides resource.expert_mode, `+expert' (or not setting it) just uses expert_mode. */ if (resource.expert) resource.expert_mode = XPRT_SHOW_NONE; /* fprintf(stderr, "++++++++ initializing resource.expert_mode: %d\n", resource.expert_mode); */ update_expert_mode(); if (resource.hush) { resource.hush_chars = resource.hush_chk = resource.hush_stdout = resource.hush_bell = True; } } /* a custom error handler that makes it easier to catch X errors in the debugger (by setting a breakpoint to this function, plus using the -sync option). Also, Motif sometimes gives non-fatal errors that we want to ignore ... */ static int x_error_handler(Display *display, XErrorEvent *error) { char buf[1024], req_buf[1024]; if (error->request_code < 128) { char num[LENGTH_OF_INT]; sprintf(num, "%d", error->request_code); XGetErrorDatabaseText(display, "XRequest", num, "", req_buf, 1024); } else { req_buf[0] = '\0'; } XGetErrorText(display, error->error_code, buf, sizeof buf); /* XtCloseDisplay(DISP); */ if (error->error_code == BadWindow || error->error_code == BadPixmap || error->error_code == BadCursor || error->error_code == BadFont || error->error_code == BadDrawable || error->error_code == BadColor || error->error_code == BadGC || error->error_code == BadIDChoice || error->error_code == BadValue || error->error_code == BadAtom) { XDVI_WARNING((stderr, "X protocol error: %s\n X Request %d (%s), Value=0x%x.", buf, error->request_code, req_buf, (unsigned int)error->resourceid)); } else { XDVI_WARNING((stderr, "X protocol error: %s\n X Request %d (%s).", buf, error->request_code, req_buf)); } return 0; } static void display_version_info(void) { printf("%s version %s ", XDVIK_PROGNAME, XDVI_VERSION); #ifdef MOTIF printf("(%s, runtime version %d.%d)\n", /* XmVERSION, XmREVISION, XmUPDATE_LEVEL, */ XmVERSION_STRING, xmUseVersion / 1000, xmUseVersion % 1000); #else printf("%s\n", XDVI_GUI); #endif printf("Libraries: %s, T1lib version %s\n", kpathsea_version_string, T1LIB_VERSIONSTRING); } static void check_early_arguments(int argc, char **argv) { /* This checks arguments that need to work before the X machinery is * started (e.g. if no display is available, or for information that is * needed before the X defaults are evaluated), so the `options' structure * can't be used for them. * * We need to loop through all arguments in case xdvi is aliased, * or called via a shell script (like in teTeX) that adds things * like `-name' at the beginning of the arglist. */ int i; Boolean install_err_handler = True; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "+help") == 0 || strcmp(argv[i], "--help") == 0) { printf("%s version %s\n", XDVIK_PROGNAME, XDVI_VERSION_INFO); printf("A DVI file previewer for the X window system.\n\n"); display_licensing_info(); display_bug_reporting_info(); usage(0); } else if (strcmp(argv[i], "-license") == 0) { display_long_licensing_info(); xdvi_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "--version") == 0 || strcmp(argv[i], "-version") == 0 || strcmp(argv[i], "-v") == 0) { display_version_info(); xdvi_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "--default-xerr-handler") == 0) { /* hook to disable custom handler */ install_err_handler = False; } } if (install_err_handler) { (void)XSetErrorHandler(x_error_handler); } } /* initialize global variables with default values. */ static void init_globals(void) { globals.program_name = NULL; globals.dvi_name = NULL; globals.cwd = xgetcwd(); globals.orig_locale = NULL; globals.debug = 0L; globals.pageno_correct = 1; globals.curr_paper = NULL; globals.curr_editor = NULL; globals.curr_browser = NULL; globals.ev.flags = EV_IDLE; globals.ev.ctr = 0; globals.pausing.num = 0; globals.pausing.num_save = NULL; globals.pausing.flag = False; globals.win_expose.min_x = 0; globals.win_expose.max_x = 0; globals.win_expose.min_y = 0; globals.win_expose.max_y = 0; globals.gc.rule = NULL; globals.gc.fore = NULL; globals.gc.inverted = NULL; globals.gc.high = NULL; globals.gc.linkcolor = NULL; globals.gc.visited_linkcolor = NULL; globals.gc.fore2 = NULL; globals.gc.fore2_bak = NULL; globals.gc.fore2_bak1 = NULL; globals.gc.copy = NULL; globals.gc.ruler = NULL; globals.gc.do_copy = False; globals.cursor.flags = 0; globals.src.fwd_box_page = -1; /* -1 means no box */ globals.src.fwd_string = NULL; globals.widgets.top_level = 0; globals.widgets.draw_widget = 0; globals.widgets.draw_background = 0; globals.widgets.clip_widget = 0; globals.widgets.x_bar = 0; globals.widgets.y_bar = 0; #ifdef MOTIF globals.widgets.main_window = 0; globals.widgets.main_row = 0; globals.widgets.tool_bar = 0; globals.widgets.top_row = 0; globals.widgets.menu_bar = 0; #else globals.widgets.vport_widget = 0; globals.widgets.form_widget = 0; globals.widgets.paned = 0; #endif globals.page.w = 0; globals.page.h = 0; globals.page.unshrunk_w = 0; globals.page.unshrunk_h = 0; globals.dvi_file.dirname = NULL; globals.dvi_file.dirlen = 0; globals.dvi_file.bak_fp = NULL; globals.dvi_file.time = 0; #if defined(LESSTIF_VERSION) globals.broken_motif_event_handling = True; #elif defined(MOTIF) /* was: && XmVersion <= 1002 - better use runtime information:*/ if (xmUseVersion <= 1002) globals.broken_motif_event_handling = True; else globals.broken_motif_event_handling = False; #else globals.broken_motif_event_handling = False; #endif } #ifdef GREY /* * Convert string to yes/no/maybe. Adapted from the X toolkit. */ static Boolean XdviCvtStringToBool3(Display *dpy, XrmValuePtr args, Cardinal *num_args, XrmValuePtr fromVal, XrmValuePtr toVal, XtPointer *closure_ret) { String str = (String) fromVal->addr; static Bool3 value; UNUSED(args); UNUSED(num_args); UNUSED(closure_ret); if (memicmp(str, "true", 5) == 0 || memicmp(str, "yes", 4) == 0 || memicmp(str, "on", 3) == 0 || memicmp(str, "1", 2) == 0) value = True; else if (memicmp(str, "false", 6) == 0 || memicmp(str, "no", 3) == 0 || memicmp(str, "off", 4) == 0 || memicmp(str, "0", 2) == 0) value = False; else if (memicmp(str, "maybe", 6) == 0) value = Maybe; else { XtDisplayStringConversionWarning(dpy, str, XtRBoolean); return False; } if (toVal->addr != NULL) { if (toVal->size < sizeof(Bool3)) { toVal->size = sizeof(Bool3); return False; } *(Bool3 *) (toVal->addr) = value; } else toVal->addr = (XPointer) & value; toVal->size = sizeof(Bool3); return True; } #endif /* ************************************************************ ************************************************************ main routine ************************************************************ ************************************************************ */ int main(int argc, char **argv) { int i; static struct startup_info info; const char *file_name = NULL; const char *file_name2 = NULL; /* Hack to have command-line options override ~/.xdvirc stuff: * Parse and merge them again from argv_bak, a copy of the command-line options, * via XrmParseCommand(). I think the only alternative would be to merge in all * resources manually instead of using XtInitialize(), similar to what's done in gv, * but that looks like too much trouble. */ #define COMMANDLINE_OVERRIDE_HACK 1 #if COMMANDLINE_OVERRIDE_HACK int argc_bak; char **argv_bak; #endif setup_signal_handlers(True); /* catch USR1 early */ info.file_idx = 0; info.page_arg = NULL; /* BEGIN_TIMER_LOOP; */ init_globals(); /* * Step 1: Process command-line options and resources. */ globals.program_name = xstrdup(argv[0]); { /* get filename from program_name if it contains a path */ char sep; char *ptr; #ifdef VMS sep = ']'; #else sep = '/'; #endif if ((ptr = strrchr(globals.program_name, sep)) != NULL) { globals.program_name = ++ptr; } #ifdef VMS if ((ptr = strchr(globals.program_name, '.')) != NULL) *ptr = '\0'; #endif } #if COMMANDLINE_OVERRIDE_HACK /* create a copy of argv[] */ argc_bak = argc; argv_bak = xmalloc((1 + argc_bak) * sizeof *argv_bak); for (i = 0; i < argc_bak; i++) { argv_bak[i] = xstrdup(argv[i]); } argv_bak[i] = NULL; #endif /* Arguments that need to be checked early, like `help', `version' and `sync'. The former don't even require an X connection. */ check_early_arguments(argc, argv); warn_about_prerelease_versions(); /* We need to set up SIGALRM before calling XtAppAddTimeOut() (inside sfSelFile, or called from XtInitialize() in Motif), otherwise we'll die with the error message `Alarm clock'. However, we mustn't install SIGPOLL before the forking is done below, otherwise xdvi may hang forever waiting for input. So the signal handler setup is split in 2 parts: setup_sigalarm(), and setup_signal_handlers() below. */ setup_sigalarm(); /* get the debug value (if any) from the environment (it's too early to get it from the command line) */ globals.debug = parse_debugging_option(getenv("XDVIDEBUG")); /* to make input of non-latin characters work */ XtSetLanguageProc(NULL, (XtLanguageProc)NULL, NULL); globals.widgets.top_level = XtInitialize(globals.program_name, "XDvi", options, XtNumber(options), &argc, argv); globals.app = XtWidgetToApplicationContext(globals.widgets.top_level); XtAppAddActions(globals.app, get_actions(), get_num_actions()); /* create_magnifier(); */ if ((globals.orig_locale = setlocale(LC_ALL, "")) != NULL) globals.orig_locale = xstrdup(globals.orig_locale); /* note: never free'd */ else /* fallback */ globals.orig_locale = xstrdup(setlocale(LC_ALL, NULL)); /* Override LC_NUMERIC, otherwise sscanf(), strtod() etc. won't work for floats inside specials for locales like LANG=de_DE which uses `,' instead of `.' as decimal separator. (Strangely, using LC_CTYPE | LC_COLLATE doesn't work?) Regression: xdvik/regression/special-pics/pictest.dvi */ setlocale(LC_NUMERIC, "C"); /* at this point, all known options will have been consumed; so the only ones remaining should be: +pageno, and the dvi name. Exit with usage message if this is not the case. The convention is that the last argument is always treated as filename (even if it starts with '-'), so we throw an error if there's more than one unknown argument at the end. */ for (i = 1; i < argc; i++) { /* skip argv[0] */ if (*(argv[i]) == '+') { if (info.page_arg != NULL) { XDVI_ERROR((stderr, "Unrecognized option `%s'.", argv[i])); usage(EXIT_FAILURE); } else { info.page_arg = argv[i] + 1; } } else if (file_name == NULL) { file_name = xstrdup(argv[i]); /* leaks, but never mind ... */ } else { /* we had already seen a filename */ XDVI_ERROR((stderr, "Unrecognized option `%s'.", argv[i - 1])); /* safe because we started at argv[1] */ usage(EXIT_FAILURE); } } DISP = XtDisplay(globals.widgets.top_level); SCRN = XtScreen(globals.widgets.top_level); #ifdef GREY XtSetTypeConverter(XtRString, XtRBool3, XdviCvtStringToBool3, NULL, 0, XtCacheNone, NULL); #endif #ifdef MOTIF /* we'll take care of that ourselves */ XtVaSetValues(globals.widgets.top_level, XmNdeleteResponse, XmDO_NOTHING, NULL); { /* Hack to work around #884290 (drag&drop freezes file selector, see comment in xm_filesel.c): Disable drag&drop altogether (we don't need it). Could also be done via Xdefaults as follows: XDvi*dragInitiatorProtocolStyle: XmDRAG_NONE XDvi*dragReceiverProtocolStyle: XmDRAG_NONE */ Widget display = XmGetXmDisplay(DISP); XtVaSetValues(display, XmNdragInitiatorProtocolStyle, XmDRAG_NONE, XmNdragReceiverProtocolStyle, XmDRAG_NONE, NULL); } #else G_accels_cr = XtParseAcceleratorTable("Return:set()notify()unset()\n" "q:set()notify()unset()\n" "Escape: set()notify()unset()"); #endif /* get the no_init_file resource first: This needs to be done * before the call to XtGetApplicationResources() below, which populates * the `resource' struct with the actual application resources (which * may be merged from ~/.xdvirc). */ XtGetApplicationResources(globals.widgets.top_level, (XtPointer)&resource, xdvirc_resources, XtNumber(xdvirc_resources), (ArgList)NULL, 0); if (!resource.no_init_file) { /* Read user preferences from ~/.xdvirc. */ read_user_preferences(globals.widgets.top_level, ".xdvirc"); } #if COMMANDLINE_OVERRIDE_HACK /* see above */ { XrmDatabase cmdline_db = XrmGetDatabase(DISP); XrmParseCommand(&cmdline_db, options, XtNumber(options), "xdvi", &argc_bak, argv_bak); for (i = 0; i < argc_bak; i++) { free(argv_bak[i]); } free(argv_bak); argc_bak = 0; } #endif /* COMMANDLINE_OVERRIDE_HACK */ load_app_resources(False); /* musn't do this, 0 is 'fit to window' (bug #1454648) */ /* if (resource.shrinkfactor == 0) /\* protect against division by 0 *\/ */ /* resource.shrinkfactor = 1; */ currwin.shrinkfactor = resource.shrinkfactor; globals.curr_use_color = resource.use_color; globals.curr_gamma = resource.gamma; globals.curr_paper = xstrdup(resource.paper); /* never free()d */ globals.curr_editor = NULL; globals.curr_browser = NULL; globals.curr_mode = NO_MODE_ACTIVE; /* Initialize `globals.debug' as early as possible. Note: earlier * calls to TRACE_* or tests for `if (globals.debug)' will only work if the * XDVIDEBUG environment variable is set! */ globals.debug |= parse_debugging_option(resource.debug_arg); kpathsea_debug = globals.debug / DBG_STAT; if (globals.debug) fprintf(stderr, "KPATHSEA_DEBUG = %d\n", kpathsea_debug); kpse_init_prog("XDVI", resource.pixels_per_inch, resource.mfmode, resource.alt_font); TRACE_FILES((stderr, "Initializing kpathsearch with program name '%s'", xdvi_kpse_prog_name)); kpse_set_program_name(argv[0], xdvi_kpse_prog_name); if (globals.debug & DBG_EXPAND) { const char *texmfcnf = kpse_path_expand("$TEXMFCNF"); const char *texmfmain = kpse_path_expand("$TEXMFMAIN"); fprintf(stderr, "\n%s:%d: KPATHSEA variables:\n", __FILE__, __LINE__); fprintf(stderr, "%s:%d: SELFAUTOLOC=\"%s\"\n", __FILE__, __LINE__, getenv("SELFAUTOLOC")); fprintf(stderr, "%s:%d: SELFAUTODIR=\"%s\"\n", __FILE__, __LINE__, getenv("SELFAUTODIR")); fprintf(stderr, "%s:%d: SELFAUTOPARENT=\"%s\"\n", __FILE__, __LINE__, getenv("SELFAUTOPARENT")); fprintf(stderr, "%s:%d: TEXMFCNF=\"%s\"\n", __FILE__, __LINE__, texmfcnf); fprintf(stderr, "%s:%d: TEXMFMAIN=\"%s\"\n\n", __FILE__, __LINE__, texmfmain); } if (resource.regression) { /* currently it just turns on everything; what we'd like here is output that's usable for automatic diffs (e.g. independent of window manager state) */ globals.debug = DBG_ALL; } /* Check early for whether to pass off to a different xdvi process * (-sourceposition argument for reverse source special lookup). */ property_initialize(); #if 0 /* def RGB_ANTI_ALIASING */ /* error checking and setting of resources according to command line arguments */ if (resource.sub_pixels != NULL && memicmp(resource.sub_pixels, "unknown", 4) == 0) { #ifdef __GNUC__ #warning TODO: implement callbacks #endif choice_dialog_sized(globals.widgets.top_level, MSG_QUESTION, SIZE_MEDIUM, NULL, #ifndef MOTIF NULL, /* TODO: xaw ret_action_str */ #endif NULL, NULL, /* pre callback */ "Enable", NULL, NULL, "Disable", NULL, NULL, "This version of xdvi can optimize the anti-aliased font display " "when running on an LCD monitor, such as a notebook screen or a TFT flat screen." "\n\n" "If you are using such a monitor, click `Enable' to enable optimized display; otherwise click `Disable'." "\n\n" "You can change this setting later via the Menu `Options -> Anti-Aliasing'."); /* enter event loop */ do_pages(); } else { #endif init_check_resources(); TRACE_FILES((stderr, "file history: |%s|", resource.file_history)); file_history_init(); #if !DELAYED_MKTEXPK /* Notify users that fonts might be created. This is just a hack and no replacement for true asynchronous font creation since it doesn't give details (is just invoked if startup takes somewhat longer) and freezes during font creation. */ /* register_font_popup(); */ #endif if (file_name == NULL) { /* no filename argument */ if (resource.no_file_arg_use_history) { static char buf[LENGTH_OF_INT]; /* so that we can pass its address */ int pageno; if ((file_name = get_filename_from_history(&pageno)) != NULL) { SNPRINTF(buf, LENGTH_OF_INT, "%d", pageno + 1); /* pageno is 0-based */ info.page_arg = buf; } } TRACE_FILES((stderr, "got from history: |%s|", file_name)); if (file_name != NULL) { run_dvi_file(file_name, &info); } else { /* get filename from file selector */ /* static so that we can pass its address */ static struct filesel_callback cb = { NULL, NULL, "Xdvi: Open file", "Open file:", "OK", "Cancel", NULL, "*.dvi", True, True, NULL, NULL }; cb.func_ptr = run_dvi_file; cb.data = &info; cb.browse_fname = xt_strdup(globals.cwd); if (cb.shell == NULL) cb.shell = XsraSelFile(globals.widgets.top_level, &cb); XsraSelFilePopup(&cb); /* enter event loop */ do_pages(); } } else if ((file_name2 = is_good_dvi_file(file_name, False)) != NULL) { run_dvi_file(file_name2, &info); } #if 0 /* def RGB_ANTI_ALIASING */ } #endif /* notreached */ return 0; } xdvik-ja-22.84.16-j1.40/texk/xdvik/gf.c0000664000175000017500000002134411032450154016722 0ustar uwabamiuwabami/*========================================================================*\ Copyright (c) 1990-2004 Paul Vojta 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 PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE 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. \*========================================================================*/ /* * GF font reading routines. * Public routines are read_GF_index and read_GF_char. */ #include "xdvi-config.h" #include "xdvi.h" #include "dvi-init.h" #include "util.h" #define PAINT_0 0 #define PAINT1 64 #define PAINT2 65 #define PAINT3 66 #define BOC 67 #define BOC1 68 #define EOC 69 #define SKIP0 70 #define SKIP1 71 #define SKIP2 72 #define SKIP3 73 #define NEW_ROW_0 74 #define NEW_ROW_MAX 238 #define XXX1 239 #define XXX2 240 #define XXX3 241 #define XXX4 242 #define YYY 243 #define NO_OP 244 #define CHAR_LOC 245 #define CHAR_LOC0 246 #define PRE 247 #define POST 248 #define POST_POST 249 #define GF_ID_BYTE 131 #define TRAILER 223 /* Trailing bytes at end of file */ static FILE *GF_file; static void expect(ubyte ch) { ubyte ch1 = get_byte(GF_file); if (ch1 != ch) XDVI_FATAL((stderr, "Bad GF file: %d expected, %d received.", ch, ch1)); } static void too_many_bits(ubyte ch) { XDVI_FATAL((stderr, "Too many bits found when loading character %d", ch)); } /* * Public routines */ static void read_GF_char(struct font *fontp, wide_ubyte ch) { struct glyph *g; ubyte cmnd; int min_m, max_m, min_n, max_n; bmUnitT *cp, *basep, *maxp; int bytes_wide; Boolean paint_switch; #define White False #define Black True Boolean new_row; int count; int word_weight; g = &fontp->glyph[ch]; GF_file = fontp->file; if (globals.debug & DBG_PK) printf("Loading gf char %d", ch); for (;;) { switch (cmnd = get_byte(GF_file)) { case XXX1: case XXX2: case XXX3: case XXX4: fseek(GF_file, (long)get_bytes(GF_file, (int)(cmnd - XXX1 + 1)), SEEK_CUR); continue; case YYY: (void)get_bytes(GF_file, 4); continue; case BOC: (void)get_bytes(GF_file, 4); /* skip character code */ (void)get_bytes(GF_file, 4); /* skip pointer to prev char */ min_m = get_lbytes(GF_file, 4); max_m = get_lbytes(GF_file, 4); g->x = -min_m; min_n = get_lbytes(GF_file, 4); g->y = max_n = get_lbytes(GF_file, 4); g->bitmap.w = max_m - min_m + 1; g->bitmap.h = max_n - min_n + 1; break; case BOC1: (void)get_byte(GF_file); /* skip character code */ g->bitmap.w = get_byte(GF_file); /* max_m - min_m */ g->x = g->bitmap.w - get_byte(GF_file); /* ditto - max_m */ ++g->bitmap.w; g->bitmap.h = get_byte(GF_file) + 1; g->y = get_byte(GF_file); break; default: XDVI_FATAL((stderr, "Bad BOC code: %d", cmnd)); } break; } paint_switch = White; if (globals.debug & DBG_PK) printf(", size=%dx%d, dvi_adv=%ld\n", g->bitmap.w, g->bitmap.h, g->dvi_adv); alloc_bitmap(&g->bitmap); cp = basep = (bmUnitT *) g->bitmap.bits; /* * Read character data into *basep */ bytes_wide = ROUNDUP((int)g->bitmap.w, BMBITS) * BMBYTES; maxp = ADD(basep, g->bitmap.h * bytes_wide); memset(g->bitmap.bits, 0, g->bitmap.h * bytes_wide); new_row = False; word_weight = BMBITS; for (;;) { count = -1; cmnd = get_byte(GF_file); if (cmnd < 64) count = cmnd; else if (cmnd >= NEW_ROW_0 && cmnd <= NEW_ROW_MAX) { count = cmnd - NEW_ROW_0; paint_switch = White; /* it'll be complemented later */ new_row = True; } else switch (cmnd) { case PAINT1: case PAINT2: case PAINT3: count = get_bytes(GF_file, (int)(cmnd - PAINT1 + 1)); break; case EOC: if (cp >= ADD(basep, bytes_wide)) too_many_bits(ch); return; case SKIP1: case SKIP2: case SKIP3: basep += get_bytes(GF_file, (int)(cmnd - SKIP0)) * bytes_wide / sizeof(bmUnitT); /* *((char **)&basep) += get_bytes(GF_file, WIDENINT cmnd - SKIP0) * bytes_wide; */ case SKIP0: new_row = True; paint_switch = White; break; case XXX1: case XXX2: case XXX3: case XXX4: fseek(GF_file, (long)get_bytes(GF_file, (int)(cmnd - XXX1 + 1)), SEEK_CUR); break; case YYY: (void)get_bytes(GF_file, 4); break; case NO_OP: break; default: XDVI_FATAL((stderr, "Bad command in GF file: %d", cmnd)); } /* end switch */ if (new_row) { basep += bytes_wide / sizeof(bmUnitT); /* *((char **)&basep) += bytes_wide; */ if (basep >= maxp || cp >= basep) too_many_bits(ch); cp = basep; word_weight = BMBITS; new_row = False; } if (count >= 0) { while (count) if (count <= word_weight) { #ifndef WORDS_BIGENDIAN if (paint_switch) *cp |= bit_masks[count] << (BMBITS - word_weight); #endif word_weight -= count; #ifdef WORDS_BIGENDIAN if (paint_switch) *cp |= bit_masks[count] << word_weight; #endif break; } else { if (paint_switch) #ifndef WORDS_BIGENDIAN *cp |= bit_masks[word_weight] << (BMBITS - word_weight); #else *cp |= bit_masks[word_weight]; #endif cp++; count -= word_weight; word_weight = BMBITS; } paint_switch = 1 - paint_switch; } } /* end for */ } void read_GF_index(struct font *fontp, wide_bool hushcs) { int hppp, vppp; ubyte ch, cmnd; struct glyph *g; long checksum; fontp->read_char = read_GF_char; GF_file = fontp->file; if (globals.debug & DBG_PK) printf("Reading GF pixel file %s\n", fontp->filename); /* * Find postamble. */ fseek(GF_file, (long)-4, SEEK_END); while (get_bytes(GF_file, 4) != ((unsigned long)TRAILER << 24 | TRAILER << 16 | TRAILER << 8 | TRAILER)) fseek(GF_file, (long)-5, SEEK_CUR); fseek(GF_file, (long)-5, SEEK_CUR); for (;;) { ch = get_byte(GF_file); if (ch != TRAILER) break; fseek(GF_file, (long)-2, SEEK_CUR); } if (ch != GF_ID_BYTE) XDVI_FATAL((stderr, "Bad end of font file %s", fontp->fontname)); fseek(GF_file, (long)-6, SEEK_CUR); expect(POST_POST); fseek(GF_file, get_lbytes(GF_file, 4), SEEK_SET); /* move to postamble */ /* * Read postamble. */ expect(POST); (void)get_bytes(GF_file, 4); /* pointer to last eoc + 1 */ (void)get_bytes(GF_file, 4); /* skip design size */ checksum = get_bytes(GF_file, 4); if (checksum != fontp->checksum && checksum != 0 && fontp->checksum != 0 && !hushcs) XDVI_WARNING((stderr, "Checksum mismatch (dvi = %lu, gf = %lu) in font file %s", fontp->checksum, checksum, fontp->filename)); hppp = get_lbytes(GF_file, 4); vppp = get_lbytes(GF_file, 4); if (hppp != vppp && (globals.debug & DBG_PK)) printf("Font has non-square aspect ratio %d:%d\n", vppp, hppp); (void)get_bytes(GF_file, 4); /* skip min_m */ (void)get_bytes(GF_file, 4); /* skip max_m */ (void)get_bytes(GF_file, 4); /* skip min_n */ (void)get_bytes(GF_file, 4); /* skip max_n */ /* * Prepare glyph array. */ fontp->glyph = xmalloc(256 * sizeof(struct glyph)); memset((char *)fontp->glyph, 0, 256 * sizeof(struct glyph)); /* * Read glyph directory. */ while ((cmnd = get_byte(GF_file)) != POST_POST) { int addr; ch = get_byte(GF_file); /* character code */ g = &fontp->glyph[ch]; switch (cmnd) { case CHAR_LOC: /* g->pxl_adv = get_lbytes(GF_file, 4); */ (void)get_bytes(GF_file, 4); (void)get_bytes(GF_file, 4); /* skip dy */ break; case CHAR_LOC0: /* g->pxl_adv = get_byte(GF_file) << 16; */ (void)get_byte(GF_file); break; default: XDVI_FATAL((stderr, "Non-char_loc command found in GF preamble: %d", cmnd)); } g->dvi_adv = fontp->dimconv * get_lbytes(GF_file, 4); addr = get_bytes(GF_file, 4); if (addr != -1) g->addr = addr; if (globals.debug & DBG_PK) printf("Read GF glyph for character %d; dy = %ld, addr = %x\n", ch, g->dvi_adv, addr); } } xdvik-ja-22.84.16-j1.40/libs/0000775000175000017500000000000011742726711015024 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/0000775000175000017500000000000011742735216016037 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/configure0000775000175000017500000055202011742727602017752 0ustar uwabamiuwabami#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for T1lib for TeX Live 5.1.2. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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. as_myself= 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. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $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 tex-k@tug.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: 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 STATUS 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=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&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'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/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='T1lib for TeX Live' PACKAGE_TARNAME='t1lib-for-tex-live' PACKAGE_VERSION='5.1.2' PACKAGE_STRING='T1lib for TeX Live 5.1.2' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' ac_unique_file="t1lib-5.1.2/lib/t1lib/t1base.c" # 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 T1LIB_TREE T1LIB_CFLAGS T1LIB_DEFINES T1LIB_DATA_DIR T1_INT32 T1_INT16 EGREP GREP CPP WARNING_CFLAGS RANLIB am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC build_FALSE build_TRUE T1LIB_VERSIONSTRING T1LIB_PATCHLEVEL T1LIB_REVISION T1LIB_VERSION MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE 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_maintainer_mode enable_dependency_tracking enable_compiler_warnings ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # 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= ;; *) 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 T1lib for TeX Live 5.1.2 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/t1lib-for-tex-live] --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 T1lib for TeX Live 5.1.2:";; 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] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-compiler-warnings=[no|min|yes|max|all] Turn on compiler warnings [default: yes if maintainer-mode, min otherwise] Some influential environment variables: CC C compiler command CFLAGS 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 (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. 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 T1lib for TeX Live configure 5.1.2 generated by GNU Autoconf 2.68 Copyright (C) 2010 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_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; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # 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; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # 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; } > conftest.i && { 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; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # 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; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $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 eval \${$3+:} false; 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; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; 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; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type 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 T1lib for TeX Live $as_me 5.1.2, which was generated by GNU Autoconf 2.68. 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 $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" 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 $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" 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 $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" 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 $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" 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 # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac 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 /dev/null != "$ac_site_file" && 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" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } 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. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && 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 # 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 ac_aux_dir= for ac_dir in ../../build-aux "$srcdir"/../../build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../build-aux \"$srcdir\"/../../build-aux" "$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. am__api_version='1.11' # 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 ${ac_cv_path_install+:} false; 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 ${ac_cv_prog_STRIP+:} false; 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 ${ac_cv_prog_ac_ct_STRIP+:} false; 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 ${ac_cv_path_mkdir+:} false; 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 test -d ./--version && rmdir ./--version 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. 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 ${ac_cv_prog_AWK+:} false; 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 eval \${ac_cv_prog_make_${ac_make}_set+:} false; 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='t1lib-for-tex-live' VERSION='5.1.2' # 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. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE T1LIB_VERSION=5 T1LIB_REVISION=1 T1LIB_PATCHLEVEL=2 T1LIB_VERSIONSTRING='"5.1.2"' ac_config_headers="$ac_config_headers lib/t1lib/sysconf.h" if test "x$enable_build" != xno; then build_TRUE= build_FALSE='#' else build_TRUE='#' build_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 ${ac_cv_prog_CC+:} false; 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 ${ac_cv_prog_ac_ct_CC+:} false; 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 ${ac_cv_prog_CC+:} false; 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 ${ac_cv_prog_CC+:} false; 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 ${ac_cv_prog_CC+:} false; 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 ${ac_cv_prog_ac_ct_CC+:} false; 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 fi rm -f conftest.er1 conftest.err $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. */ int main () { ; 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" # 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 whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&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 if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $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 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $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; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $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 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 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="$ac_clean_files conftest.out" # 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; } if test "$cross_compiling" != yes; then { { 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; } if { ac_try='./conftest$ac_cv_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 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: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; 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 ${ac_cv_c_compiler_gnu+:} false; 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 ${ac_cv_prog_cc_g+:} false; 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 ${ac_cv_prog_cc_c89+:} false; 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 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='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi 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 ${am_cv_CC_dependencies_compiler_type+:} false; 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'. rm -rf conftest.dir 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 ;; msvc7 | msvc7msys | 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 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 ${ac_cv_prog_RANLIB+:} false; 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 ${ac_cv_prog_ac_ct_RANLIB+:} false; 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 # Check whether --enable-compiler-warnings was given. if test "${enable_compiler_warnings+set}" = set; then : enableval=$enable_compiler_warnings; fi case $enable_compiler_warnings in #( no | min | yes | max | all) : ;; #( *) : if test "x$enable_maintainer_mode" = xyes; then : enable_compiler_warnings=yes else enable_compiler_warnings=min fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking what warning flags to pass to the C compiler" >&5 $as_echo_n "checking what warning flags to pass to the C compiler... " >&6; } if ${kpse_cv_warning_cflags+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$GCC" = xyes; then kpse_cv_warning_cflags= if test "x$enable_compiler_warnings" != xno; then kpse_cv_warning_cflags="-Wimplicit -Wreturn-type" case `$CC -dumpversion` in #( 3.4.* | 4.*) : kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wdeclaration-after-statement" ;; #( *) : ;; esac case `$CC -dumpversion` in #( 3.[234].* | 4.*) : kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wno-unknown-pragmas" ;; #( *) : ;; esac if test "x$enable_compiler_warnings" != xmin; then kpse_cv_warning_cflags="-Wall -Wunused $kpse_cv_warning_cflags" kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wmissing-prototypes -Wmissing-declarations" if test "x$enable_compiler_warnings" != xyes; then kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith" kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wcast-qual -Wcast-align -Wwrite-strings" case `$CC -dumpversion` in #( 3.4.* | 4.*) : kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wold-style-definition" ;; #( *) : ;; esac if test "x$enable_compiler_warnings" != xmax; then kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wshadow" fi fi fi fi elif test "x$enable_compiler_warnings" = xno; then kpse_cv_warning_cflags= else kpse_cv_warning_cflags= # FIXME: warning flags for non-GNU C compilers fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_warning_cflags" >&5 $as_echo "$kpse_cv_warning_cflags" >&6; } WARNING_CFLAGS=$kpse_cv_warning_cflags { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sqrt" >&5 $as_echo_n "checking for library containing sqrt... " >&6; } if ${ac_cv_search_sqrt+:} false; 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 sqrt (); int main () { return sqrt (); ; return 0; } _ACEOF for ac_lib in '' m; 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_sqrt=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sqrt+:} false; then : break fi done if ${ac_cv_search_sqrt+:} false; then : else ac_cv_search_sqrt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sqrt" >&5 $as_echo "$ac_cv_search_sqrt" >&6; } ac_res=$ac_cv_search_sqrt if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" 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 ${ac_cv_prog_CPP+:} false; 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.i 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.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i 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.i 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.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i 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 { $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 ${ac_cv_path_GREP+:} false; 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 ${ac_cv_path_EGREP+:} false; 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 ${ac_cv_header_stdc+:} false; 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 " if eval test \"x\$"$as_ac_Header"\" = 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 whether char is unsigned" >&5 $as_echo_n "checking whether char is unsigned... " >&6; } if ${ac_cv_c_char_unsigned+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((char) -1) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_char_unsigned=no else ac_cv_c_char_unsigned=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5 $as_echo "$ac_cv_c_char_unsigned" >&6; } if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then $as_echo "#define __CHAR_UNSIGNED__ 1" >>confdefs.h fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5 $as_echo_n "checking size of char... " >&6; } if ${ac_cv_sizeof_char+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" "$ac_includes_default"; then : else if test "$ac_cv_type_char" = yes; 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 77 "cannot compute sizeof (char) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_char=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5 $as_echo "$ac_cv_sizeof_char" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_CHAR $ac_cv_sizeof_char _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 $as_echo_n "checking size of short... " >&6; } if ${ac_cv_sizeof_short+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : else if test "$ac_cv_type_short" = yes; 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 77 "cannot compute sizeof (short) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_short=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 $as_echo "$ac_cv_sizeof_short" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; 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 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } if ${ac_cv_sizeof_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long" = yes; 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 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 $as_echo "$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 $as_echo_n "checking size of long long... " >&6; } if ${ac_cv_sizeof_long_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long_long" = yes; 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 77 "cannot compute sizeof (long long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 $as_echo "$ac_cv_sizeof_long_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5 $as_echo_n "checking size of float... " >&6; } if ${ac_cv_sizeof_float+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : else if test "$ac_cv_type_float" = yes; 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 77 "cannot compute sizeof (float) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_float=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5 $as_echo "$ac_cv_sizeof_float" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_FLOAT $ac_cv_sizeof_float _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 $as_echo_n "checking size of double... " >&6; } if ${ac_cv_sizeof_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : else if test "$ac_cv_type_double" = yes; 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 77 "cannot compute sizeof (double) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_double=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 $as_echo "$ac_cv_sizeof_double" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_DOUBLE $ac_cv_sizeof_double _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5 $as_echo_n "checking size of long double... " >&6; } if ${ac_cv_sizeof_long_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : else if test "$ac_cv_type_long_double" = yes; 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 77 "cannot compute sizeof (long double) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_double=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5 $as_echo "$ac_cv_sizeof_long_double" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 $as_echo_n "checking size of void *... " >&6; } if ${ac_cv_sizeof_void_p+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : else if test "$ac_cv_type_void_p" = yes; 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 77 "cannot compute sizeof (void *) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_void_p=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 $as_echo "$ac_cv_sizeof_void_p" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOID_P $ac_cv_sizeof_void_p _ACEOF T1LIB_CFLAGS= if test "x$GCC" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc strength-reduce bug" >&5 $as_echo_n "checking for gcc strength-reduce bug... " >&6; } if ${ac_cv_c_gcc_strength_bug+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_gcc_strength_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { static int Array[3]; unsigned int B = 3; int i; for(i=0; i&5 $as_echo "$ac_cv_c_gcc_strength_bug" >&6; } if test "x$ac_cv_c_gcc_strength_bug" = xyes; then T1LIB_CFLAGS="-fno-strength-reduce" fi fi T1LIB_DEFINES="-DT1LIB_NO_X11_SUPPORT" if test "x$ac_cv_sizeof_short" = x2; then T1_INT16=short elif test "x$ac_cv_sizeof_int" = x2; then T1_INT16=int else as_fn_error $? "Sorry, no usable 16 bit integer type" "$LINENO" 5 fi T1LIB_DEFINES="$T1LIB_DEFINES -DT1_AA_TYPE16=$T1_INT16" if test "x$ac_cv_sizeof_int" = x4; then T1_INT32=int elif test "x$ac_cv_sizeof_long" = x4; then T1_INT32=long else as_fn_error $? "Sorry, no usable 32 bit integer type" "$LINENO" 5 fi T1LIB_DEFINES="$T1LIB_DEFINES -DT1_AA_TYPE32=$T1_INT32" if test "x$ac_cv_sizeof_long" = x8; then T1_INT64=long elif test "x$ac_cv_sizeof_long_long" = x8; then T1_INT64="'long long'" else T1_INT64= fi test -z "x$T1_INT64" || \ T1LIB_DEFINES="$T1LIB_DEFINES -DT1_AA_TYPE64=$T1_INT64" T1LIB_DATA_DIR="${datadir}/t1lib" { $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 ${ac_cv_c_const+:} false; 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 ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi T1LIB_TREE=t1lib-5.1.2 if test -f $srcdir/$T1LIB_TREE/lib/t1lib/t1lib.h; then as_fn_error $? "Sorry, you must remove the file $T1LIB_TREE/lib/t1lib/t1lib.h" "$LINENO" 5 fi ac_config_files="$ac_config_files lib/t1lib/t1lib.h:$T1LIB_TREE/lib/t1lib/t1lib.h.in" ac_config_links="$ac_config_links t1lib.h:lib/t1lib/t1lib.h" ac_config_files="$ac_config_files 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 if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} 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= U= 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 "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${build_TRUE}" && test -z "${build_FALSE}"; then as_fn_error $? "conditional \"build\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 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__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. as_myself= 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 STATUS 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=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&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 T1lib for TeX Live $as_me 5.1.2, which was generated by GNU Autoconf 2.68. 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_links="$ac_config_links" 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 --config print configuration, 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 links: $config_links Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ T1lib for TeX Live config.status 5.1.2 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 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=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= 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 ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; 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"` ;; '') as_fn_error $? "missing file argument" ;; 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 "lib/t1lib/sysconf.h") CONFIG_HEADERS="$CONFIG_HEADERS lib/t1lib/sysconf.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "lib/t1lib/t1lib.h") CONFIG_FILES="$CONFIG_FILES lib/t1lib/t1lib.h:$T1LIB_TREE/lib/t1lib/t1lib.h.in" ;; "t1lib.h") CONFIG_LINKS="$CONFIG_LINKS t1lib.h:lib/t1lib/t1lib.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES 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_LINKS+set}" = set || CONFIG_LINKS=$config_links 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= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # 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 {' >"$ac_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 >>"\$ac_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 >>"\$ac_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 < "$ac_tmp/subs1.awk" > "$ac_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 sole $(srcdir), # ${srcdir} and @srcdir@ entries 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[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// 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 >"$ac_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_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 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 :L $CONFIG_LINKS :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="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "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 >"$ac_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 "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_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 ;; :L) # # CONFIG_LINK # if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then : else # Prefer the file from the source tree if names are identical. if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then ac_source=$srcdir/$ac_source fi { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 $as_echo "$as_me: linking $ac_source to $ac_file" >&6;} if test ! -r "$ac_source"; then as_fn_error $? "$ac_source: file not found" "$LINENO" 5 fi rm -f "$ac_file" # Try a relative symlink, then a hard link, then a copy. case $ac_source in [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; *) ac_rel_source=$ac_top_build_prefix$ac_source ;; esac ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || ln "$ac_source" "$ac_file" 2>/dev/null || cp -p "$ac_source" "$ac_file" || as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 fi ;; :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 1 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 xdvik-ja-22.84.16-j1.40/libs/t1lib/l047016t.pfa0000664000175000017500000023042511742726711017636 0ustar uwabamiuwabami%!PS-AdobeFont-1.0: LuxiMono-Bold 1.1000 %%CreationDate: Mon Nov 12 2001 % Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. % Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. 12 dict begin /FontInfo 10 dict dup begin /version (1.1000) readonly def /Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def /Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def /FullName (Luxi Mono Bold) readonly def /FamilyName (Luxi Mono) readonly def /Weight (Bold) readonly def /ItalicAngle 0.0 def /isFixedPitch true def /UnderlinePosition -88 def /UnderlineThickness 83 def end readonly def /FontName /LuxiMono-Bold def /PaintType 0 def /WMode 0 def /FontBBox {0 -211 714 1012} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 198 /AE put dup 140 /OE put dup 216 /Oslash put dup 196 /Adieresis put dup 193 /Aacute put dup 192 /Agrave put dup 194 /Acircumflex put dup 195 /Atilde put dup 197 /Aring put dup 199 /Ccedilla put dup 208 /Eth put dup 203 /Edieresis put dup 201 /Eacute put dup 200 /Egrave put dup 202 /Ecircumflex put dup 207 /Idieresis put dup 205 /Iacute put dup 204 /Igrave put dup 206 /Icircumflex put dup 209 /Ntilde put dup 214 /Odieresis put dup 211 /Oacute put dup 210 /Ograve put dup 212 /Ocircumflex put dup 213 /Otilde put dup 138 /Scaron put dup 220 /Udieresis put dup 218 /Uacute put dup 217 /Ugrave put dup 219 /Ucircumflex put dup 221 /Yacute put dup 222 /Thorn put dup 159 /Ydieresis put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 230 /ae put dup 156 /oe put dup 248 /oslash put dup 223 /germandbls put dup 228 /adieresis put dup 225 /aacute put dup 224 /agrave put dup 226 /acircumflex put dup 227 /atilde put dup 229 /aring put dup 231 /ccedilla put dup 235 /edieresis put dup 233 /eacute put dup 232 /egrave put dup 234 /ecircumflex put dup 239 /idieresis put dup 237 /iacute put dup 236 /igrave put dup 238 /icircumflex put dup 241 /ntilde put dup 246 /odieresis put dup 243 /oacute put dup 242 /ograve put dup 244 /ocircumflex put dup 245 /otilde put dup 154 /scaron put dup 252 /udieresis put dup 250 /uacute put dup 249 /ugrave put dup 251 /ucircumflex put dup 253 /yacute put dup 240 /eth put dup 254 /thorn put dup 255 /ydieresis put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 48 /zero put dup 163 /sterling put dup 36 /dollar put dup 162 /cent put dup 131 /florin put dup 128 /Euro put dup 165 /yen put dup 185 /onesuperior put dup 178 /twosuperior put dup 179 /threesuperior put dup 46 /period put dup 58 /colon put dup 133 /ellipsis put dup 44 /comma put dup 59 /semicolon put dup 145 /quoteleft put dup 148 /quotedblright put dup 147 /quotedblleft put dup 132 /quotedblbase put dup 33 /exclam put dup 161 /exclamdown put dup 63 /question put dup 191 /questiondown put dup 187 /guillemotright put dup 171 /guillemotleft put dup 155 /guilsinglright put dup 139 /guilsinglleft put dup 47 /slash put dup 45 /hyphen put dup 173 /sfthyphen put dup 150 /endash put dup 151 /emdash put dup 40 /parenleft put dup 41 /parenright put dup 91 /bracketleft put dup 93 /bracketright put dup 38 /ampersand put dup 167 /section put dup 134 /dagger put dup 135 /daggerdbl put dup 42 /asterisk put dup 39 /quotesingle put dup 34 /quotedbl put dup 64 /at put dup 35 /numbersign put dup 176 /degree put dup 43 /plus put dup 215 /multiply put dup 247 /divide put dup 61 /equal put dup 153 /trademark put dup 182 /paragraph put dup 164 /currency put dup 130 /quotesinglbase put dup 146 /quoteright put dup 123 /braceleft put dup 125 /braceright put dup 170 /ordfeminine put dup 186 /ordmasculine put dup 177 /plusminus put dup 189 /onehalf put dup 188 /onequarter put dup 190 /threequarters put dup 37 /percent put dup 137 /perthousand put dup 92 /backslash put dup 168 /dieresis put dup 180 /acute put dup 96 /grave put dup 136 /circumflex put dup 152 /tilde put dup 184 /cedilla put dup 169 /copyright put dup 174 /registered put dup 32 /space put dup 160 /nbspace put dup 149 /bullet put dup 60 /less put dup 62 /greater put dup 172 /logicalnot put dup 94 /asciicircum put dup 124 /bar put dup 166 /brokenbar put dup 95 /underscore put dup 126 /asciitilde put dup 181 /mu put readonly def /UniqueID 5078984 def currentdict end currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED 2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E 44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF 9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83C82A2DC38F66F08FF34 E7B34FBD496A97F0AE69763627499CD43525BDD2FA2EA9DDE51C821C26AC69EA AF027BC54141332FA165BFDE024DBE6CD20A8E4EF56F52F260AEC28695FE9141 7E7F100CCF64993650A81C0856688B1D101418D3B0926F70BBDCCAF43FF4B16A B8328A5C459C7D6DD6FEEA1AD5049C4EF32D91C30962146E922D498E4D38D172 CCFFA8F084C6BD440ED2C77C1B574CF8CE25AC39D2B18C91E596994081B36688 EF1C949FBA04376ECBE32C3E29ACF83A8C36569C315CACB3DAAFC2FC8FF68839 D9BF2A301E3E8F5B27EB82D8DF5D70444998F05B99D26AD632FC21A81D887E9C 80BDDB95A1C0FB1F43386515E0F2903E3623B19F363F35885143893761E54BD7 C9EDB5940386C62FA7A8919B57E4A4F0D9F3B4A4EA82C071BAB90B57C7A0F553 BEC3A57EEB877476FACBBB61DB74A76D95DCE4D5C46F9686AA5176D6B65F0FFA 37E1850A881EF057A62E3092D923107C691D32F3D619B05DB75B337EB54D5505 2B7669A69A162DE45E9F900FB8BCC2BFB7AC5CCC64DF94DA97386D4E4AECAA28 A9CFF3C9CE3031CC890E563F7A110D4690CDC5BBD49F7ED21C6E635952FE3ACB 02373DD80C2C653E01525504AC37C849D6C5F25DF0C5C762C45A83233517EF9B D7F67A77881F6B46BE10E458FBDD73D225A6047095AB3B7AFE9FE2113751B732 950B7865DE7DE98DDEC75D3D0311E902C2D7FD4A7F08F481ACB695078B930EC3 6F3669F4E50345CE0A4CF1C739BD8A92BA29CF5FF0C3A85B687C0BC0BBBDB8D5 DB96AF1962948038D1EC4ADD39D3DF966ABB57CA3017A28EB9B2148D1AB72F08 899F5686A2013D69F6D3F5ACFB0503DCDF2D93CC7722D3F7D7486466F32741C0 17F3D8F2D64063A9CBEBB462D4CF8569EFE4DEBE6DF3CD2F3C2AC955D8A20B1E A0199D05C93CE0F92ED01330A7C9E65E7ACE079CBF7616F24ED2AF540FA4A1FD 5CCC7A1057ECFB91B02A84499F9209CE5989021F4D27B2B20D4793F6C81591CF ECBCC22005F89BCD1A089C36E659BF3BB92558ACE98DBDF10F0F6C7514356F54 5A8BD7EA0E326494BDE14D91C6C74224FCBB42FC22FF8F819AC8CEFF7F28A56E A86FA3DADB388D04A015B0E703553CA2C2E5B688DD49DA92FD89107B744BDE7F 85986FC9C688B97C67C0C4C555EC943D5C6CBB8BDA89ECEBA41037A92BDC075C 3C2CC573B084B19EC7FF10FBE814B0226E216452BAF96DC3503218F49ED279D3 CDC0369901B7764918E8071258114002152AD47B0ACA19066B5DDFC7AC37A6D9 E49FC3A5C16F51A5B86663E15139A063C5D408C562951934700371469A49A940 FA7074CAB31DF454BD990124F5E70B4B6D62DAFF949FD73DC758598B34376867 3F7BCCB83086D6AED4460D71BFB2395A94A27CF34DACF70BEB4906BC6DC19203 5512F6948158915E228603A5D4B906997D51EEA9BAD01BE45C36BC39D9C70778 D6F8619B3814F7A3E9E0524C8DD61EC63E8B4E15C42FBBBDF8257442E5D2CEC0 890F6B2476340387E8A4E21A09805F82A17392D2AB3CF3429DB5FFEFB093165C 63525A9BE659AA22C7FA5DCB894DCA8D1560668636FAF723B4F618936EE634D5 EF823BEEC25B274EB5E8912BF186A537D3EDDE38F09801E74D5885919850F48E A7A8AABBF6625CF2B0A9843E5D9A499C1047C490EDF9774F02A5CFE926BDBAE4 18843FD4575E8634B27E536FAE9E09084D3F73FB29B9E4AC002E709986A90995 B4EE10012F74A0BCFF2A6C0A69D945C19DF4F7070D60E3EF03508AF8793BD70D 5D4BFC8BF5A29B4339C799EA8AA64ACA925A37EEE489C7FC8A31F5131F386A23 C63F7D3C6BB60E204B169AA01EA12B590B9F0FAAD50D030381CD0C6177D28538 377F92029F2A448F7586C7B14BA5BA08543D8216E6875AD18E974B39A53B5D3F 157CACE3442B1948D2C44DCD88D1604D3AAF4487B4919349B7F0E01302261204 50380294937386246EC4444C08955919A30118566A9B9D409F58255604A90782 0583591C68296746D4DA1BFD0184029B73EC4C955C7F0BDCA08D8B85FBFA4CBA 336BA29DF59226DB39C3B02AC5A906857EFB7A227A09FFE63BA35DE73434BDAB C11BE30C59E650592C518C0F533FA0CABAF3E2CAD23E69776879CC7A9225A086 281FDF2C1F72FCA1723A5C2492BA061FB6D73F6240AE5708521AAB52F736863B B05E53ECB5C64A26B277F106FF2E0C9699719335BD32842806F0F866CE4818FA F61D141532738ADC2C8BCC1145BACFDF3BE1CFD92914C3945126847769D6DD0D 6F44FC9D966F224AA72C22D0EF953B2A43C93E581DD907B611F3005D62C25162 FD2149DEF7894A112449FF5F43D8F30CD7DA81D408E85F89DA78C4998BB8A24A 38B9F346E5FBC6D09EDF332B8B7F8EAC363D0D01708C24655412AEB148E28D99 D9F41076F0E7BBF10AB96BBD72FD05BA982F673D3D79270107C040707C6316E6 11E4FB04A320621B6C3E10575FF97A28B60B30B840A877A5BEB0EFCCE0EF03BC F247ADE0F509EAFD6CD7F70B523E6E145EEF8AC9C17614BE65934DDC17545C4B 50770418C185606C0A01B2622CADD9CBBB97E14A92D5230FB7ABE7D0D8CE9047 F64225C6D488695FB9801EF4C76E20340721F7734AC114B3E6041D4C76C11F19 3326FB3DE6CBF4B4C1F18B3388D6DDC000F04E195827F68CDCA2E0C411788B05 4AAD40E3E09EDECA7817AE2B29316063C8579A90CF67D93AC158E940B14FCDBA 3B82EBE2D4BBC8A8B22AB531DDDCEF6E4104314DDC2DF028E2F09436CFCFD32D 0238D1C9C0404FD97DC627773CD8022632E4914D40283AAA5FFDF86914140D42 0C4350BA37D3CD49E1D79081462E3701DC0A9E9AC67D712BF7CEC27C1200138C 9729AAADB724BB9FFD5B831ABABEE5BE8C270A1ADF85A246ABB9612F181730A2 30B9886D897C2EAD9AF7E6A47DA049373049E5E4C29F5B7DCF2258A1AF341CB8 C5F464EA85663A9B8132775E4B8620420750161C419F88594908C64A2BE265B9 84A950C8B63C065B1FD4F78121F582EC875F396E0EC8F6851AB87C36C56EBE7E 036ABC0D89D9FE8E626646AC65DC5445EF3FB60CC5C50A5118F9F248FA15B3B8 C8A88E168BCC5488D10CED157A8EEF8EEEADDA64372B76B944685B686DE8AFC0 F4A376200790E0D0DB2172C80E6BF90052DE847633912F72840A5C745DA4E774 014841DBB53EDB729DA7AAC1D3FA428DBFF252F91BDCFE3AC31C2CAEEAE29045 DE7F0795D6D924180292E18B3955FA93DCC555683FCB5FDECA34EF0D0885ABA3 C7BF9CC897C6E5737AF9448C952269D18AAA18FD1D3C2F5DB49D652F43E6CB21 D22F7ACA596DE470A1264FA065C0B2CE3C58DDD168BD28D6A2FE2A41045F3219 AE87AF49E363AEA5164C7107CDFEB8BACAF39C795D98F9855E35BEA4482F78B3 8A62DEA5A26336671AE7D96AD413A2A5E98111D319AFF427420906C75D4E16E7 AB85A37972380840CE59C78273A510C819EF376534266081CDCF3313C83D7089 71BF31000698E853973A6D275A8F215677CE9EEC26B5FC21E481AB9C189C37FA 2F7E2A63B4286E1AAB933C0CCE1AEA78E1F7B9F7A16DDCFCF350514F1E671D3F DDBB3CB3324AA85E9373060D2FEC1F218A06E4A1E6F5DA7E3B72511C5F0F348D A221902C405AD22CF96C4A14F09BE984C710AE0472E90ED804C33BC2797D5F30 F31B250C791B0CDCFBA202DBEDEF03C144D31D7431B7667F88C1AFD9E218A08C 46811F871812FA17AB468062FB0E478B8AB84B9C06208C8ACAC16E34B42E8B9F 747F8BBDAAE6736A5A4BC9C494EE15356CF6F02FCD2F52D4A3F9CD5B472AA89D BF371F08DDF4FAD324B46BEA792CFD4E148E33CD0CD5C74A76CD5CB4EC885420 AB9DF5D757C33BE1CE9AD32E6B0179C4C511CC984A5365E50E12CEBB8CC71CAB 572054A7DAEB7EFF1025B60BBF1ACA5C3A701396DA00C6F77E7B86F1BD246393 1030F1B6A8D13F6A0D3FC3825DDBD7CE36CE55612D3516EC214AADC5ADAC59AC 054743534AC8068A67C09695C7D04341D22F5AAAC4086CF370583B93F417579D 7392D7B57928230688C7C5B1931E26E843B8FC5D2D5D09A3005C1803BEACFD54 F5A8BF2A6CF7852616F93E05913D188AC4E2F9AC3F2C1C455B0F0D1E32D9752E 331E7ED9F777FDEEE5ECA4FA4A27354C1D5E7E388008D7C45456CB361F3E4D0C AB08D54AEC00286398730911A5F145D7DDA76D696F1DC17C0965A4B0899E8B4A 7AD364ADCA31D1A0714ACCEBD2BB7FD77A4025EB94D4436925DC5E460EEB013B 359983AEF8637A929A04D9D5A963AE764FF82C42C62FB220530FE59018A89D0F CC8C3E2E4B918FB14279F5D0ABEE4756C3E79C1CA70359FDA92487D42B7A2943 3ADF2FDED43EEEF0108E7EC8778E14C4C0BD06B6687C08C1AEC415477176C892 496E84FD5E9A7E4DB11287A9605F5F0CE1B71D3C198900C67B9B333D10F5F331 CFC638F80E03CD59C5DC5862BF8A18B6ABA8435936A3E2406AE848EA94716472 A726D75C94BBA07926745B20EFAC14EAC276B477B94FACFD9D664365B1CAAC7A DB2BA6B75F4F83339CD645428F0A5F498677108DC473CA984370A7D6A9E295AD AA68CE2D5B435915EB0F6B72A9F4D49E356050223F524A270A9DEDD0B8B66822 C8E94A311C4A055EA18BF0292CD25EAE689C8F932226643B5085E72F5FE0A232 6064C6850F189B2C46F9EB94966600A8B7205C654F33737ECAF9B4F3FB3CA0FA 44A85FE7A9AAB211C6B4062052C4C01685F58F0D2786585CE0FFDD1B348F2FDC A19E31CEC44C59BFA74997E570EE0FD56629135F3BD7CB2B6466E2F031DA6E8F 11813E7118A232D38AA3EDC86ACA1328FB9F870174F4D1BF511531FFF0E23278 9D29E817441F255261318894BB2CEDD0E6F8B3339D888A2C401D7009E7879D5A 7C6DF9C8D97C5221DC65181A96992EDF4C983DA8C0669F3D0BAA4DCA2FB17848 F34F69182E6A129A983A1FC394EBFC31551185A750114B383E01E61CED8637FC B4765F1791D121B8B1D08035B6D8ECB2856FDB43B25101444D160E02588E80A6 10D55BA3B76B5B9C6B97B4C07A0AEB124459603BFCF1C50DD19776543EE9891D 9FAA53093A933077B5D3C0280679818348E77835C679C603F46714478BAFD156 803B736D4CCB3F1C1FC2192B2EC1CF78C36FED5E0496B5A8F0CB1B72407BE183 0BAB9171EF79069EC940B9B13F69F952EE781A811EA4A0A7FC8A5E5BE4FC60DF 45874393CD027EB52EA2DC1EC163152F3B74B7E7D62E042093CF3119F4F50179 302EEBB352C362A6C2DAE8A251156664B492FB60A1DBB7801DB26476BCE9E78C 444040DBB110FDA2783A62FBAD6A95AB513B292920960E7F630CF7F5C2A5785D 5BE65897155D32CC657E231FFEE30CCEBFC00C375E105A5B613FD2C27A6FF7D3 92C00B7E0BDCC70A6E80F5BA164F116A2732526B669E50F5F6BA575E37FDC9C3 38A49BA0522EA697F517D74D533BA28F928565985AF5E32B84BAF188F2B9B952 0C291440B04DBA34354177783CDD82AFB65DE0E179E638FE1BD2EB3EB20D5344 C4B6E5D639DFAA78A77433D36FED5462B6B090E3434034B8BF00BF7EF35407EA 9F122694EBC6B6B4214EB779C94E6BBB04998AA57249B8D84353E0BDC605CA98 492862A8239E8875A9BB5ADFEB966F0D7FCC355E3F0428E227D8B41945257F63 9F6A6A69B7A902DDBE08D9FEC8233E11BCF15C1458C19F9E487314C26517D162 9AFD021C75353FE5A161EF3EC7E06B616AF1447602483A3486788298AF766714 939A160EAABF06B61D86CB02F6A958690D38C86BE7998B444B7A2B74C6BF72E1 B9A59AB78D20C121D1AACD208531FBB2BE37BE529FBCE24D229CC242A1FA721E AC762979A4B92565B6BC94EFFA2CD84985F8FFCFA1BB44503BF1265D52370C53 4B445AEC55B12E40F05DF383B356CED44B5345007B9F3454950F12C8E87E41FB 72715838A27013F689D6B55925C49D92E0E14CBE59D9585BACC8CE5D62F86F27 B51E89884EF529F27CF4C61A28BAAE981524CE3714368D664AC4773FF8B71728 88C3E8878032EE246359A97DA80F1DED34DF09EE5F249B364BBA41BF81D16AAA 9ACFE092E3E491ABE1C40A53B1A50B88788AE14870079175C14AEAF7EE777437 8F4A7A03178AAC032EB320DBD8E0C19C0071B262C76913B787E1B3FBEF926A49 CF96ADF8E3BBCC3F679294B5DBB5005DA2294848229A557865E0116AADB4E6AE 94AAC10394B4FA2872BBEBDDC869163E50CE3BB2925B554235B6BDE9A29CEDB3 07DFCC3D8AD0CFEBA9C7AE10314771DA1E6C3B927FB950ADE62D1FB8AE7A3CC9 C9E0F4484D61A6C9F353B9AA91A186DB859385059544FC85C15E1A3357BEC89D 92AF74938D1B56B7120B934297A71F1D92E93658C69E7FD4B338F59FA6F6C337 427532AB1A4EADAA5FF1A8C7A84F444F81D60557808ECF3DB67C052EAF4A9FF1 0538A114857BBE83BE784E9865B00EE8B407AD9E2B65E402EE6CF733C9B31603 25F2C97BE78D94A51CA51F28ED9E840F13057B1F21C30F77ED6FF458C8EE4DFC 493B64190AA9C8B22C5977FE16F31C3ACD5CEE976839E2456916EC66FCB30B44 8FEF1B63D552E1B0F049C48445DE8C80F8563E9870134038DA5546C7E7E3A1BA 1879235D0F328957290810F18037833D7A83558C94EE9856D3D82A3AD00659C9 3E9587751B5BF2535FA1D1A508FBF86DBF7FC7009E1A542150F8F0EA356689A9 DAA05EACE716C3496D4D23F326D4634B24A419F483154FFA9B81DFBFCEB31624 1C87449BC00AADF4DA13A25955485D0C7C5CB9AAF29E1940B0DDA19594A8F7F0 033C60CA8C9057879F10A6116BE5991F332AC272834D99344B0E476F9B2034BD EEBEAD5D1437C0B9E10DD38A002BCB01218A40844A91FAF28940BA11A40F2BAC EAFD82E977AA41B4971C69E82232A5018A31F71C1E60F2635D59DC40B233FE47 C29D0A2A906955CC69BCB72BCA6D80E9B84F06F618BA1C7EFE99A75FE35AE359 730863494339E0F2239191B6E7C5E8FED2F43EF6B5789872128DC528CCC2D023 AE7A0BC6F9C194E642F09B78D898D63EE3EAFA611DC428C24CF363F78A174C45 8C3C91CA391D7F1AE652C2D81DBB7F1A5AAB745AB08EB93BB316CCFD7D353023 4B7CF322F928CDD5A413D60669D062E5C59A0F2C1D6BAD36CA9C5F5D50BF48A8 AB77EBE65D054FECE72D08CE3A0C1916AAB4202D5BF4F07998534C1CFC49350C 095D98A12E1E1E6A5BB2D3F3B6E6DFFD926A647DA7DA8EE687AF44DDC9FE4A00 18D679F66287FA26D6AE4075E430BE22684B42EF75CD59AD72C2E97383D5AD52 1867C37AF8855A4A5428D125DD22AE0B2757781A80EE7D425B7271AD95B96B81 2092E92DA4D04D9E711AF88292C56E35E7FD15C0D12BFB7F244BF4CE5B589CAF 89807DEA042EB5CD7615FA6551DEC1CAB933A6218E08C02443AB912C915A5E95 DE3E2B66C64846F9FF403DA1642BFE9F5FDF0DA4BEB832D07FE6552394558903 82ECF4DFB28B7E5FED973A99C0AE3CC792EBD9E7F53C84783AECAC10F9AC8661 F023093A9F37141E27811C6B33FF8614AFA7DFFEC2E01F0B3D60442F6C62ACF4 7274D7F52AA594A3A096EAEAA2C161FCB10E0AF00ECBF9D7EA6A4533B7F8EC31 FABA55E1AACA89E5D02114E7FFEBA84528FEFE356A48090A59AC39F358FD8800 0AB1486BBE16BED95607ED284CE271D6D9239F3F23FD403304C19E3132E2F3F2 B7E1323468C66444B2E296E42365A9276FCB51DE065D6196CD4ED0E45A096DA3 C45D8DC05C009C1C335ADE0D874F714C8EC74121B386483D2E67B8E7466A8ECB DFE911178ACC242FCF9DB814498ED313CC6199DE67133ED4EE9253C6EFE87DFE CC9E4C6F2950F1F9A93834BC359215BB37EFFDE944344F922B2AFD7723A45F44 DEFA4E344C6E8772EB6F9D89E850E853E8119860A6871668C8A062869E15EE11 64EDC397E138D823F520B8475FB6703098E3F779FD6446B2E2B27289B5D569E2 C2B5FD00FC05A609572F57D14801C5EC159423E4B0AE61ECDA938424F47E99AE BEC534EAEF22396119C3E79AAB1194F71044A8973FF94FEDC317CACE3FC26E25 8514B5C039CAD5B2E83C049D31C135EA4BC2167C44EA92AF8F45BB777BC56EAF BE7CB54F02AF2263EC1AF29C7E8D548ECF88BC262AA04D6F7DF26E5EC5E2919C 52B5A8CE42AA960EC9CDFB35F2DC8FA31E0DD5FE5BC18A7A5FBAB0A509CB7451 DD4230D95D6ABB2B914A93F42D0B17AC931E4814AA939F90E389EA9DF311F834 8A0A1A86602B07EB1CAECA4178A885C11CAA3710B6DF83DA05AC6169364E6EF2 BB75559A056929BFDCAD8C30CE83AFB66266D24D308A8A510FF245BE51B49A0C C608B08EFB13973C7BE9CBBC46838DE5BEBA093863CC9B896C1761E6DABC0CC8 889BA134FFDA108C9B101AEB88E18B52FB151DD631ACB1CACC164306CF909452 C967430620DE41E0BA22C811F5D6D728781DAA43B2279C9E301096D58DBED1B3 EBE39E8444AE50AF6AD2929AC1C2FBA27497A0AED80A72D515403B46DDBEC309 7A8F8A7E1D840E4D7F7FF390A0176E85D09A5AECE75D167594FA3F7C670068FC 31B055894450460F91CF36780916C17E8644C05EFE80D525B2CCFA1FD1B5FBA9 2CA3A87AEF0867E8F135086BF78C43BED284339040754E8091EE2FB26E58DCFC 9025C55C286E99D5CD2B1C0767F1FE0D89BE87146C8D9C21118267CA2D9E15E5 4DF80A9E709C6E4D284AC29AB032FCE2AC173A4381E47FC8876716DB39C63380 E0D5417D1D1ECA49D5414E93DA59754653498A27B796C04CA3B3DA37D326EB09 5646C20F0CF2D34D45758CF49BD7CFF0D71294BEF0584E87D06D4C069A7D9256 B5AC4005F524A46A97574FC42EF2F0FD8382C26A385A3437FF85525F80711A14 B928853A5DB29B64475D06B1CF33ED36396BC1FDA09B35E0857B2424584D5E9F A1CD56B852D910C67EC88AB907BDD4F94A6CDC9FCD1CA1ADF7D2D3D3F4C8EB88 EDDB632D8430B157546038CC69FEDD9FBD7E58BEA5507520C9D55910A656511F 273BBBD804DB9AC2CAF9D0D02F6F9420C7E3974B2A7C57D74B562155FE7D1679 904503BF008E32DE50A007251D27461F62277E50DE498C0432B48F3F8AE9B589 919EE62872BFF2DE14850773B86331895AB20BD96412A52E9B87D06DFAD62EC4 ED02516D2FD8866B41140D53B4AB65DFABD08B96E7FF634DFAFFF3403BB6ADAE 947387754DE0337BEBB7CBCC8CD4D0BE5A2FECC73DBEB5A3684979939F352E06 CB07BBDE49096A91872C1B77BFEA8B6686354E53009577C2AB75BA32D9E6A6D9 1D2324B105428EE06BB04B862127F0DE5A849AF6647AD7722B86E1E42C58A940 F3A7CE22C828D84B84D80BB7A3AD87E1A16C2BEDC68E9E3ECA734840614E1480 F70C26D8D185830FE5C1B2E6FD3AA633E5F856A4496574405310C3FD709BF92F 23353CE76FF2C5D22B5345C3AB129F107D478063807E9EC522EB4905F59F72C9 31012EE90C7A4412D01832AAB0F8B0A84C532ABA1F6EA8EB84C91F16C5EFC2D1 3A9C2F5DAEFCB1B00936DEA1988049FB1655BD5C1912399621DD755D506845FE A59C625AB92649383BDDF1CD48B33CBD8E207CC63D7B4EB314354F5609A68713 5EE512AAFE98A7329AB516F89FBA8BFC6AF3AAF189CDB905ED3F63F479CDAA3B 27A384522D571226623E887756EAF7539BD2FEA33ED6A30656A3EFE0264C2E0C 44E065EFD20E0961F86B2067FC7B60A3201F789E8712D79528CC5449D8A4BDFF A16F13C8E077A259CC71DEA56691BE117BBF356B78074CED1F54C9E16DD2CE48 501444BA0AF54B1C84F5415CE7863DBBE37CA30688D5B6542E9E743F8EFA5A46 4F46FFD30F801D02ED63B52C6C0AA0750FD82ED149C8D35DB524C424B2DE7D17 A886FCAD0D9A0EDF04EA5C4072ABB8D07A6589E9AEC0C9E1933B94DDF9350751 A6954226F040D8D13F7F34ABEA21CCA64D59076F61885116C307A95E74F52324 8B1E8A05358FADE97BE4703CE7AA80047BD200F59F4CAB6EADB05A892469C4BB 3816C606D39BF8B7CD0B69A5CBCBAF35E7C9670FBD4CF8A5E11ED3794308568B 174D42AA69F3FFE58333619BF448FB0951D9E627DE153FEA9A4F2312EC701C2A 9915D9434205857AE251095E8E856D01C4F1CAEEAEF2A7F2B974F1C27EAD3976 7479273E36A7AFF9D4EA352ECF7642CD0CC31982D945EC00720286E2ABE0F9E1 199033AAA3F9F0142F285B88B091E01249472F339FD8A9BE3ABB16DA3DF606E4 2467780732D6CD6C20101FDE86391D4CF8BDCBDC0A112E9339FC5E928792B62E 4FBE7770C4EC526C4F5CEAFD25B3E4D1A0B4F06B516971A099299D8005C9231E D06688D4AAA4550604F7D1C9294B74B159B6B0B15CA2A5395EF6EE355E59BB68 DD8B01A0CC19ABEFD5337B00E8079FBD5E5CB3188C414E015DB57FAAF330FD45 E62887ED507092202F32CC49757032D13444DF1F619FB561379FAF4931BFDF62 3FABFE5B949829267190F61A4318678A07403A5FD9FC8C2F10EBD819D6EE9C73 EE3D852B1DB42EDA74C3C63EE61762EE0C8D5582332AFAAD3A3BA0B5FDB17836 9BF11422BCD69EBF2F11C67780BF0533353DD045AA551757111F11F4FBC067C7 84486CB7A486B602F9D7C56EF84A804AA08A740E3BD2D647D1DCE018B4D225BD DC9607D21377E450CBF76AECAEFE4C4FEF2F72A4A44E90B28D2F46FC8E549C1F 312CBB690F9D96FBBBD77827158FB5C2DE80DE51D17BB86A4E634EB917ADAF1B 00038B6028D3FCFE6805A72DD10B17C7A434C68744F19A260BFCE7C040D1930E B4B35E0A3A8330A6E197F359CCAF0EF03502846C784ACB3068280CB7D3095977 9BB914063E289DB7BDD5F8D50B9D8B64A6259AA947FA3AAAF20FBEB3B020B169 8A2A68D6C899F8CE32BCA97D75E9921883663DDE2735439F8BB5B62BF61463AE 947A0E4862D480D9197054727BA1C1D3E34A0310DC8D30F24AF051A384D5CFDF 4DEA1DC83277553715A026F0B676FA651D6036886319455F265C4AD78FE72B41 9C8A0B613A4FAED194DFE836C15F10E4EBDF0D2779B0337D54628F4CE0EB0AB9 2D67DF7D287D233815462CBA378BB4D05AEA230DD884BBFEA756954EB0A6F304 5169129B2D3A55D3ADAE8017B3D9CFC5687F2CE00BE59D084AB6ADDC8D8DF76D B9449917623FFB4F924EE1BD40A536E1380F22BD07260D3BE827E62220E0FCAE E21094047696EC4378722E62F696C4FFA6CC92D1D5F719E472CFF99995CE95BC 7D3BD9A6172195243343868EC7FC4C51DDF43BE6649F096C4DDDBF6498BF6208 A7FD124B9D7CE06E89C45EE3162C8505255DA806684280C4A7487692862096C9 ECCA26F72DA251733B700261FCEEEB7DDE3542FA852B39707044F5E34AA80AEA C4F54814C72C5480AC15478E28D7898557F7FAC89720BE0C02B726F674ACD9FD 635A87EEB2BE08765AEADD636E261625FA9E93E77D954E5DBA6A2A75D431879E 5936B3E396B3E681F393669F20884B1D75CFA3714D967A7C6DA12D31E26FC12C 96CAADA06D701DC45E00C1903A8D9BCE04B19DF613B54AF7B6DE33678078C03D F1B0C31A9B87FA42FB434F105633C646E2A45617D8352BA18F5F9EFA6DFE5A0A 2FBF4F79A0CC5ED15F8B9EFE6BFBD2F7F7ACC99A7162F1D0491ED4208F2A7E23 1165C3D65FAE7B3513818BC46A9A2277100867AAE0DE763FB6C7319C933F92D1 4A8F8B5B5460200FA193805D3972F18B4B3DE7398F8C0A4462EB53C54A4CA42F 93E671584DFAF63AB8B91FE0EB29A8E525C1F137E7673F632B0E1E3864E1AA54 D22252FC1EEFA76092E85680AB35DF214E761395744BC84E03D6F2E50D15D1FD 6B0C0914E661159BA887B856C49C04993C4F3FF4530F45CE0323752EA175F97A F4C5CF8E8F103FBB38295D016E639C931E1421762C075133DA533E5F5ADB6CF6 AB5BB6C69A761BB71398C0E1C15E112489367193FF3464271F439E4ACA94F47B 8855971F042AD99F97B049F6D57FDDDF401551B4793C4217851444D674E2E61D 98D1D55CE1B7B00A82E16C25766195167C01E3BA58CAE1A5675B4E9DE80EDCD0 96DB71DC7C2E8B147A22E683B900DD3EBE402F2DBAA6DDB847E5AE7D0D95D4A3 0E5EE6E1514391A69ABCA5078C96E0895047D2242316792BC99D59EE40293A25 AEE147A96C9B8CE778C4ED454D1E1BBB351966B1684FEFD4A8E707FDD5EC675D 96181FD81641BB578C486A0529FA2EEF184B0402BB93BC400B1A29DF5ABBBB03 774499655178A19FF518E5241C86719B1AD5C04A0775C0620F23BF19A1DF3864 9219F74D06410CC1C85DE0E172DA953238F83BB44ED46C37FA1841D2282D16F2 5C3C9D3A3897F880D49BB65E9A12432F517175C2F3F12C5F44DBFF1094EA2CF9 0AF10CFEC825F1DDBE0331DC70EB7AB9736DFBE1D6C3448B5245AD469DB40B64 D1B89F7E083156D3B44E7C27ACBC411413D69D515FE03C7EBAED6DBC7CB3FB7D DDE6239F8A21E6329C07E0C601D4B114BC3964D921D3C15BACAB7AF7EE202B20 3FEAAC53D13F088A932409337991D5CE4D4D55FDE4D515EAFFB5E47ACA6207B2 F059EE7A93965F859AAD0EEF2A6FDBB45408834E885747349244741526882DBA 7AA940C038AF5D0909C1B6F163CCC5A9601E6F7BC13AD1DE6A699100F9E2BC5F EDDCD46C3147E747C6D6006C05988AA402A7C123F015A271C9199E3338B7FD85 B73B31611FC6ECC10F203C91605279EB6894304A0FF6B67A7CE10BD48E44C0BF 04395105279961D56E6D3CBB3F5ABEE1F069FF512D70BD9C81BEEB62710FA967 2AC750075845E2EC4B7826F170023D7BEC4719EA2028AAA3EE91D3E212DBE02D 53CDA397F61A4CFA58543FF5A5AE88D410EABEF0AA0CA8170AD71922181CD387 96ECBC28C88C3199618DDBDADAB8FD6B87621B731D91FD6DCA973F2CB347C2AC 110544A352FBC02B408AF4475AC4A5792455416A6E9184C861B4EB02F6D565DC EBA2A752C0C9EEF51CC5C0EB286ECEBC7FE5303AA411F14DF5B569A271BE0650 BA2061861610C64BA81442A8C98B5334CC41603B00FC7D49CBAA7E6257EA6F13 72A7FB4FEE1F7EE3B6226D7564B105D7902B3DF2BB43286B6C71A5F70A67E926 706F301CA4CDF22411A6C91BA7EF405FA5EECA8865E2A12290BC2485714D891E CB9EA86E36EF1C7CC6BE96AFBEF493420FAB5195DBE4DC80BC075C17A1DC6565 AE1949B72A9E26D9E832C08CDCFB37B73BB0C80C452EAD2145E1C217A53C1E43 6D7EB4F6D035DD6A6852F33E561043F8C9ABF09AC746E936B522522D1B5A4A70 7A0566D6F3BF82A29918D3C01EB69EF77776236EB876853CD9C599D81E0ADBE1 F909101A47927116919FD881015CC23E7280DF2AACB0D0D442B337952A691393 7A7D996477A04A0A7893B22E6DF75C912518C0E80CC57D2F3011F7CA639FCD2B 5B69DAADF0882629EB56CA6823680B247C5131EA52B097977AE71829EB7D60E0 9190E3B34BA4022932F24166659795E75AE0E286268D84F7D57F1ECA608EB49D 04B7BD31A76337C487DD156A131BCD19154ACBB7C36FD5E11FD3DD7D57684E4A 45861AEEB590967ED45ACC06D360188912A89BF7F01CF4430DC196B32F29414C 8BD6A961882B3999A3EC9CED31B063AEA557667AF65595B67ECBA01F488FD07F 4684052C4BAA9D038B4CC8FE1C1381083CB1A2F7DF95A213C46A272C45F7AE94 47A605265A776BB5B81CA6A87875B3BF33A2E055F54E73FBB3FBC63CA47C64C8 21D776FB9AD5FBAF9482E4A24A556B1C1F92B3984105C1C466B340DCEAAB9A41 7869FA344F7AC673AF6D49752B7391260762B8525F43221A86D87FC74EC3F92E BF23C1F2B04CC63F9751471E3B399B683318762DA5742988FD122D1263064645 079F1DC46F7F66039AE0B9D42CC2B387C7C47758426CC1E35A249DB3875A8466 198155C887D5502FAF403650E6E336CD5366FDA28662B818BF5C5E2BF484E207 498C3CF05C037BCDC3B68D0FC718D9EDBEE4B27CABFBA52DA116A60EB766AEAF 3D16F3DBCFA065720704DB80A7045FBBCB219A4F679179B5B7E5851A4CBAF2E5 20B4FA5B5382EED902E6CCA8EC283E2B39726C5B79AA72B45CFDF9E30EC4D5CE 7FFF76A90F2A3EBE77E017CF6418C4CA1E6DA141D974360FA597273013ABDDBC A340524C822A2DBFC5E9551D79745595105EE1FF49A6A1E33516390A2C59FB71 E394B13481C5179DFBC6A7E698C0364D93A8830F2BDC3C7B4B603D64BB53BC7C 67270C93AC504557DFA97050029D6D7B85EDD9719CFF04581004BC908B358FDB 6DFBEE6183A0F7AFB84040299B04C560ADA8AED59E43C2036F6DA09F3044A781 DA12A23145719FA0B2C6AB6E10CFE84D8466BBD176EB17B5FEB793A917B3B604 271F299780A5F33E212CE334756D9768339FE866DA429858CC7A6551B192C80C 659A3627BB903D74E8ABC3910A662793BF0BA13CCBB5361ED6D1B4AB6AD299D9 DB7CD8E592D2D3D9615AEE2BAA6E67A46327E29298B0E91DB801832D66788D18 47CFC4A5C9B8CD41AEA2366E8D7D19E605D0474D6A2D9C1AB44CF5CEDFF9A678 9B74A83724CB185EAE4A58BDD2ADB9941B41640EEBA42C3E105393639D84152F 8E26E93EF7D35E028244785683C8A4D59566AB8D2FF2906C0BF7C4856AA9C3B9 E000677FDEBAABE33B23F13077EA25E1699519624C03916E3CC0136CF3A3A468 F328D43F7BD1C6DF305206F302936B12F3529421A81D0D5026FEA5B811029790 42ACE0E4AA1D401D15B283E2959F3E130ADBC3262F73DD1CBC94EF659860A2DC 1D9ADB113C701867A4E62886C63FC43BEC3461205A37F1307061C62EBE4509A0 24A95211B890842C00ADACE0B75EEAD4031AEE5EC113B7303AE4C42D0A263021 8882592E518CB3274E367B937274A5F7FCC9F6E9D36B83784C4E17888FCDA3B1 CC0F9E41246CB830D282370137AC001D9E4ED0351BBB39DDD7F19A78FEC3CBE3 B875543006CEA3BF1724314ECC6AF4932DD9B5CD64A91D5A72CC2487A2F4298A 34A1DF796D1E32DE2A7F12685B33992F92886647B4CACD145FDC35C5C8317DEE C9F58DC50E135F65B1A0A1862EAE22F1056EF92A2ABACDAF4A701543F274700F 4FD59D4033BAC20817F1C97B41466ABDAB3AF22DC3F60A5A5C1096A2ED73E84D F5ED5392ACB5FE5027D0C3B1D47249D809D5D7C7FFCB0AD72C6E54438CEB4AFF E7F1C42D158C78144B7073B8A1AA4AF5707CAD9E9EE68C45C32B1F2B2C876624 163DB24823427080D1F81F52BAA3C0BDBA113AA6F24AC2F01E7E70D6F7754BC4 BD2DE4C46D398DA4C94DA7F8A38AA2EE20A9D124291FB3649DEBB4A5476FC536 56E85EBACF09E3B129BD41748FD8972F124DBB5821EA6BD7F26EE1DCF086D847 82D0C7D60583B1424EC98A3B436A9939ACD437CB3B0F5DF18B4BAC9FB1F4AF87 0854FE355E5C8790F5A5BDD2DDC835BF8FAACC22FBAA6589E843E04C2E8FE52E AD35EA2608BBE0D77184EB4B4D211FF2CC58D37E3D7638A57551D4961F9E2264 A7DDC677F263450D357D482B61D91D2B1EC15F6DE08864A5693707AD46266ED3 46C1E5C8D14962B82FB881FCDD2C2C20A1AAE200E39FE74E8CAF7E396F1FCBC0 5A0CA7EC0D2FED67B17DDE349A72923D2692B565D5B752336F4F49370878AD9C 772386F42C7E2FD66F4B8C9558F9E2C078B7D140A5E6B0D8C48E5F0196CC5D66 553EE79C3596349568293464FC361AF011F8148B47BEB397A4F8A0552E416F02 03FD3967E0AD6A928DC1DA73488D2A093E7D587A404F909D24A57CE63F2EE6EE C945CFB2297EA4E331F41A6B8F67843B61C9226FC429EA62FDA4F91C98C4D7EA D2EC09399998F08AC9C2A3602018CD28B3411218D90A7BD6A310427EE54B19D0 2FF1A39B7363D31D6BCEE6394174BCF0CAA755B2EFEC05B962B7E28A73BE0BED 9D33189E82D125D4EB6E5CB370705430B78324A079769FBF7B4DABCF305924AD 1A8559ECEEAC4D0967AC739420C712B213B9A84C5D930A7265728931CB35C4DB 1889EE886BBA68383E8926821C7EBD13CA2AAF9BE7C5090F9D301AAFB1001C75 C52BFFE1B81E7F415C38F560E902653714B853FEB28125DAA168ABF2EE66B6B7 E4C0AA21E4B936F9F757188899EB4BB6AB3D708429954F706B12D928E264AD64 1C4AB1A5C4D209D757DA7857B383FE9AC3319A9380603348A700BBEE4849D9A4 2D7C6D49145FDAA73074B8F568BCE751C0A9023124C71F8ED7D8CEC4FB01E841 EDEE9C56BAC00DD17E83CDF905D1B8667BF13C3B8DF717D23C6676840A152215 ED17A14B0DB3602DF9170F979D8098412345BA610888F3FE450387CC46D47FCE 2241F9180024331FF12D713DFCE680F167E8AEAE710C765FE0F791C065DCE040 676C53C797AE7F26C52CBACB82AA12DA9A14846EAA73A6F0F98A628CAAE12718 A9C30F2B1D13A4FF3BAB73CE32593FD459A9ACC4FE7EAC78E893C9A37BCC8363 D8DAA0049F383F1848F037F0250F5D9A07E0D6271F771AEFEA2FDD6E298DA77D 41CAC0CBF6871D2D8891B297AF8927D33D6E7A16974B97B7BEE5FE92ACFB9442 3DBFC1A323C2DECA0AABE3C44C4E5FC67E31AFA32A2E384F9A158C5F5A7DC04C C6342B7D88308F4BD0C813A8A8FF6D44E8B6FF5073F11EE1FA41FBBF07CE8E72 CAAE5FD345A00CD4E0DF5B80A44DA6A11B271CBE994935937BC477AE4862E0E4 0F55BD2214CA9F7186885EC69811F821109428BB851C01D1FB2F38341408D262 F5DDC76451A7C107A725B609DC363270EAE8E75CF6BC1877F2B2BA1455EDE408 159506B7727F9ED61D807CB758C0BC165EBA7C734EE4BA55AC6F42B6BB930FFE DD0AA0A34F994AB151BA1815BEDB828AA1BF85DCFF99404FE4898548F2FD6DCA E1A338E6446093AEA135A75832AB0D268A3B56C8C20F29341CE6A48D5F5CA445 91CEBBC1E344CED028FB823437CBADEEDA3B322077A05573D60D7BD016240153 6C28F065CB849F8CECD24377C69B42B00D01D388363B99330AF05226758AAA2C B34BACF2F63EF54FB718B001C5AC90C9BD85DE8CC38398621AAACDA2FCFE3784 B3257A9DCB63773B8B99076F2D969C0D7AA09478DCA4A6B3F7D8D95CEC5208CE ECAD3A540AC0C067733557B5134B7DE5C75D2B5673CC9E3F08DE0B9AE76C829E 97E3BCE64918E5F1687046D0318EAC32659629DCB7CCA135A2A7B450E14A9A1F D89F5C9793A4FE2AD7719037418ACDB24643ECD71D70FEC1D529A87B89847945 F4BB9E9919386DA70484036A926DC3DE7FED1612C4B89B701EF4409979CA914E 5FB3ACD50E15AC6B4B22BE79954F45DB6BEC4CF3670414540C7F394BE2CE8F34 1E8D02282357B6BB6DCC14B6E1CDFCE52FE38BF7FD091F44E3309D88C2CC2014 3AAFFF868E201F1729C0303F62F5E21EF7581674C46DB63F615A57C4310B5F07 A591A293340497C59D73365152F4F1ADD62DF144C0B2F4BBA9C04819D74CF5D6 E5DED166D9065438C89ACFB14744EEFF77FF21A5DC2E60F8FAD10DF69556219D 3D5039A505D5DA8A35EE75094EA3930417E7F92BBB14C0948D347FAB53BD7077 3FC6CC7EF5541D2082507130932FA415218BDD959004B5D1D9C6AC7A6D62AFCD CEEC5F43688EF251A1D7FD4A9DA3018ED9A63520C0A0E4910C2D5B2F9FF03712 EF45FC4AC93DDEBE9E1F434EC1D86938253F736F7991FA0E20500961EA080DCD D2A9164A8CF2FB7546EBB59DACE8B6BA5F9438A8FE29223341EB1B1592607BE7 E6E7FB761FB4B198F8D346ADE3B6C7F31192541D688518969AAF7C2A1EB51563 0A233BFB89F1C2F8736E89A46DF07D64E68CD0F58CE1D698675E4A3F504F5D63 E58854608EE83814127A760695FF30281D2C4648D5808C8C8548854474CF2F0B 94E15450CDE2CA5D5CA333BA71163E202F54DB4E6B3AFF1948FF2A5758A9BDB6 9F004B02C13211A86F6B382A809BB726A22AE41C4E6210B61FDE76D99A5E6890 BB1C522D0DCEB8916506622083567680F405E687C7FEE05577A8E7C02B30161B A775FE0DB6168AD93C19B83AF6E95761BF57EF046642FD3C47CA1EDDFB426533 5022A78E85A91D86F3B78E463B01CC30807204AEBC0E622B383DD5E2A093188B 62CBFB1CDC759D4FD7A66CDE922671D6F6F2122F39DB3C4CF73F3E16C1003688 21838863DFFFB77EED7093A1B22CAFF89443AAA734B788F7F64BEB8B7C6E9579 0389ACE038CF73D46AE11F9D653820FB3EEA99144CFDD4C6A28B3A86621F664F 9441664E4B2EAAA897F0FC577344FBEF2AE0AE4DB43C0CF12CE089AA00D6925D BC8537F52868FC9EA59DF56FBD7AFD6A4DB12BD17E4B47556DA97DC1931AC87A 38A1EAD3D3AD8B462C1A76F830D7EB0621CC8B4FE740AC409EACC48BB7324B92 1F5B2093F0F6575E4A903E2EE134E77874F70DA87C073FEE5191C118EF6E75CE 42E143037A40F8D5B5C92C55B497C134B61BFCE61D8E7AA93E66F74F0BC2F725 A8BFD5795BC47B0B46F526E772917BE1FD164181B5731E27CB13D8DFAD0E8D9E BE4436C6921E7AC96953F20CCEA3C2E6450E51FB088E16DA8DF471ED8AE84F48 71433349B7EB58332DE9CB7126906B6FCC08CF2047D39986D4DE9BC1B2F2FDBE 163C73C9DF62D1335EFC64F38D42E2E4EE9A422718174189082A4E83B5C5D04D E34ED308A2D7F8907571A40A0BF77B4990D7C1BF1CC0474C0A41876F2CA0633B 42D5A037E87BB056483D0E88298260265AB723B24DDF8E4220C8E7F3E681B883 E94EEC6B2E77BF249CA69E12AEE9E03569D6E99D63FEAD2ADA9135B62793AFD2 B7CCB2CF2D1144BA7FB613F00C6DB9736720CE1BBBC49AF359FD56F9E98253FC 57E2CD93BBDAFDA1FFBF9A33E427B37B333BC48844B9F7A757398D146133B416 58DA341B54FF74D097DFB950D0C850E11D85522BF8D10BBA53A99117CC4A4B72 A1636FEBD444F0D61397039ABDB39CC4D969910F46AD2EFB671C05C66B0C6FE5 5FE8FACDACF7AD619A44B49800B287170D086BCAD5597BF592521B51603CF4BA A286F141942C67471B47D67FCC581CE2F96D3C8152D4A86F9BA90EE6D5F06730 CBCAFFB91FD653675DF525C3948EEA1F09CB6CD084D7D34F00826975368373A0 A05CBF4F7425C9F57F0EB5F1BBEBFEC259BCA347D47BC00F90EC77A06C0787F5 6FE2264D2E37615E28C74B5B1B96B950243C32CCFCA6925F42E921819C57D387 819BEAF8250E117B9475D4A8FAC24ACC0EC44CD4C9597F0F852781C9C1817C14 F38F8280AC2415268B3BFFABE7AF59B50DC33F7ADB38308F67F50EA4A74B81D2 5FC9C14894963F82D10525E0926DFCBFBE775B85DAB7A4BF4D13E422643109AA A93E559CBAD1DCFB01C24037672B2AA2E06433528915C03F222C8523E06A7BB5 90049A82D9E930E77DD4BCA67A765B24E7274C45331E07D9AB8544C7112327F1 538C7E19BB37C05C42A2AF30EE19D10E4137B75594EE6D6CDB9431B3AAA6950B 99CE785EDE29C89F94F3C0A395DC4CE31D058732DE45B6FC3D15E12E474AAF6D D43D56FD939A8719B432D4ABC752E1201A8C1A66866465AD9DFD2D9B3AA029F7 9B95EF7B4459F360F4F515D11149942717CE8137F0DCB4ED01F74E474FB91718 4AFE6342F4D4597ACBADCB5E40EA16B86D4DADFDB970149C0177A943038CAA99 D07C82504696F1A87046160F9C0AC7DC0F3C8496CD63B31E56F51BEF07C6E7E4 C73FD39EE686C0B833315629060DFA6DEA06DC6BE6958C3F9BD1F007F64525BF 7F1F1B1D17C682BCAF0B581F0B986BD12A8C843DA6CFB65E901BA8BCBFA7CE64 9F1E86EC50417744825150D56F2FF41E8B34D07B7EA3B19CDF906BF67DFAF212 73EAAAE9015C8DFFC0C6EB7934DF360ADAB6BF70FF5B18F2A571B9E42A113F11 38EA6A07CE358D0B2F4EC4FA45D3C441CF21D465CE936FAA1033E7AA407DBBDC 4A44306ACB55017E136D70DA322A115FAAE9FF0A07A3D588E48B1A571D2585BC C7AA26DF65D9416A3C5DE75324CBFE52A76F3B74507DE787C9E9DF41FEA9A02D 7DD35547E56BD3FF30B12668BD2804F93CA6199B4AFBEC7EA51EFC9EE14AFDE1 91C69B76727373D40C5D66129896314959DC47D672ED6B3F977E671E020BF01F 1A838631CA10118F13F91CF616BA7EBAE0C06EA8AEE25C73D4CCB7203FCFB0C8 6884A1E23FE5ADFBFB0FFF19C532C2571062CBA81D3570761E3E00BE5556CA1B 25F2292F689E5B950288B794BAE1E15FB3284AA76731772CCD6C6085C394C5B0 3ACF82A852A32989A638054C2E75B0E6893A880241498D3627B55F3E58761B83 34208FA0A34738A75A67E5DEAA16597E0264A75BF6E05CE3C3B8B1B5A9BAC508 B282B2B77CA0F5EDC38EF2D3DA6DF7646AF3C9ACB62DD0F59F50D0EDC193D847 F8A5D40956C169468F5FC14E3D527AB047E8E5A223A8BA05270700AE1A07C3A4 ACA5ABA29958F3CB2D1CAA9B5A0643012681D0A32048458BFBF2E3BE88C326FE 5F6AD9C996F3C82F186B5D77B4E31498CAC8EA4F6B3AA6BF524B38FBC53A2B04 3F27EEB7854861B3EFD8C5DF19D2DE5D9C44540AD64AC3EFE729F4BE0CD144A2 8A1DA61C8CC27BB6B861DDBB25782E44A33EC1D507D7127B51B17C7BB260937B C4267B4CCEDF56B1FF949DAE7C5E5C3F061B6CE47BC4BEDAD0A78A952A33F339 ED8654918143FE913EA90B9ADCB9B5C9C140DDE7E2E692B19A49AC15E7ABE60D 29453E54AEA9381B981EFD66CD957936D6C7F54CBD6306B82D13B8A716DABB77 465EC55DFBF33839D5F37B47B634CA94489BF050000ACDEE4019C668C6EDE0EB 42985CA668123F764789075C18934790B1D1D9191E72D748F2E30E0AAAE07451 E4D294C0106CFFBED91600DA5FFFFA3F6DA6F7C5CF3502FBB2DC37ABF30F04FD 6283BEC78FC7865D1B428F0698672E431D2A20E9FE24B1833C0EB0E82A34A1D9 23C4791E6F8C17911A579DE17A289D904ED8AA16C8A365481D8235613B9C71A4 26679333F179886DF86BEA8F3FB599294CA1A9859BA59E42B061255C93ECD97C AC0E4A89EEB16A25A5FF625713F8A5792A2E6A0F537D3436F603D7F464B61470 DA712B94735254FC69C4F4E0A66A36170EB151353CBCC3E55D392D78DFA3FFCA EFF08200F1B222D9D9C4BF8329DEBB42D651E826BEB449BF8DEDEF0F9CDA4105 8406F1E26BB06F60B7B00E92CAD3BF4EF06B9553688B099106932B18F7239DAA 27B747808CF11D151C28C9DA11678CC1E140DA40049190B194851F753CB82993 349CE659FA85B8AB585EB7FF322499C5940C026FE8DEA5EBC9DE866B03C98F79 D36AF4901182DA9E9995FE8400AF094906D52D3CFE28088B14675F2A6F846CE6 5D5869A70EBA2AAD1D0C538E0EF7779C801F866EB96C7B5E19C67354BD364263 B67D82983106C682E0D9A3BB0D5E60EDD6452393FF2724739D426295CD40AEED 882153073D356E2AB1F543E20F2AC2BEDDBACA73BDB5E8610E58BE6D704E5274 D5C252A0669C56261555D0642C0937EE08329B8BBA2F807284B8777E1C2D73F2 31E897BAD03DF7587757BE939038E75B25137471552DE0B7B3842760F441FCAB 0557EE93F87FC7079457AC62402B55E51ECE8D50F94566B1671675F0215C37DD 31FFFAE9B27B48798FFBF14D18A2C6F1306522CD8E8C0D8CFC228B3F1C17A827 1E5273E3B5B20C2792275DDD7C17053AE8DB61B679ED2780740E947D5DC47B27 D35F9B5DE0166539FAE75DA2179F3F9EEB39ED0452E49A35A1E1083683BFAFFD 9A066C4CEA4DE699EDF570C9208892E0ABA87784EFB455238BE1A6A376F64252 82EA5B523A8B2E7812E3253C2B6E1CC4681656561179A4C95B48E97CA5F9A39C D255209D9F7D80DF55AA3FB99908B46B101D509F3BD513568A4949920DBDCC6C 70ECD3BA39C44423D02B4E5B13E9F434545979F7ECABE6A6FBD131E169C914A4 8063C6C9748D32E71D0A25FB40C764ED26450EF49735E12DE893F302FA491B29 D5154B441D5C61AA4AED88F06C63D52409DE17D7D97C572F7579296D297B9942 880FFF44810390ACD46FD1E090A6412F7BF21DA7CD3B166A845890CD887F607A 1F04BCC7F4BC3107BCAECD61825A959B61E62795CF4E458EC63F1F2235C64D60 C62FE46E4A913685CEB2DD7B25494832542059ED9DD0849029BC1272582D630E 4310F978FE6569A4B9B97A7BB4BD602D5D32E79727ACF46429CFF0F7BB8EB39C DE55DB6246DD9DAB7863DBA6DD21EF340E19727D5AFE9026C284326BA0D4D9CA E015056824B392BE8B930D04BA60B58CF4A683FA14850B6B24787958D1A7A42C 7C33C1362DF20AF31CB88F0F11BEA022C609D9575F71EE270440480E0AEF6207 733236DBE9454F088CD4A01F63B6B2C6270DD08A13108ADA783F2E7067B7DE4C C34AE192B05F68B0022F5F30583D9D68754782186E5B8FF76ABC451DC9EEA08C 52C12642165408AEB813C00DDF6C27F4053435F2CCD8CAEE50704DBA37A4AE42 9B7960169B0C865E92D270A714449FDF13D8835FC1D4C03D7FB376ABF7201BE8 A593576476D8AB905076237BCE2630179D158F04568CE4C85734FD0A1C8E3D90 272F3A65B556C7C803FAE8A0C82756B99C35C06673210766A8042682C873F811 CCDBC015005336EC438C3476B4AE13715DDF6F7034D032D29F2383E005F6FB4E 19AFD4A02BB7A79917D54519D37BE66ABBC156464898583522A4D63FA6DEF194 BD4B90C83470330F8B5233C24E80CB64C13C0CFFEE81E3087A4BEB84FC8B152F 44A9FE7D4393C652799B12A2C0FC0842861B1F1B656E802CF0C40DBE95350BA6 32341D0503CC7CC3348953723981ACFAD95E18348CBAE09B630DE4247F3F7A7D E4A0095D461854E4CB12840D355912AAC33A5A04C833E20005C2A71509AF51EF 697773C2D5C8F958893B26BC64215E4EBB7350166482F29539AF54D860C68F3D 1C60ADEA814E869E974E1B78114B091134589C089A2CBF12ECF1E31C4122155E A90587849A11C46DAB620284D66BBEE187B61413740176EA8F914D6923AA0A0D 3C3383D95EC1FE1587DDFEF289B4BBA9EE208408BACBF5FA0A53BFFD88BC0529 10631201650A258809DCBD5D136E038110AE4B818783716501CC5DDCF42ADC23 86382A06F7FD13F6E99935F9CFA67D49BD51A2D28E1C605DEDBEFD24BA337407 00029CDD5E8808F6EC2FE5BAF3BD3995414E9D390092ABDC355B9CD4E80A8DE0 F104658871D0CC6A7F06CD149A0FB36F4C1F484D5A43AB44394934F65C216EB6 C33002BF7D0283E798813065C84BB8EBF6E19A0855F0E146A7ED9B4B11C9B89E 48465EBDA7CAB38EA818991CA0B07182AEA5438ACC95823656CE47CF932851EA 3B0A9A2DBCD3FBD926D904749F62E27C4725410E297D9CB2CE16ED4B32AA41B6 888B1480C538548FB6EA68D3E8221626AE219EE5E998B310D8820AC61CB9D9AE D5C1AEC7C3CDC305A5E88E028AD21C6DEAF272ACB93916AFB42081E9C46F0C2D 98081D7D0CCFDF2A3062F218582CF432DD75BE9622B1DADB99B5801F709E2267 BD5E0E1511912DA7D888FDC49C2137F65D5C1A0AE5E10961CC392307890FFA8C 3CC9CE5B898812BB6F0AA59557E352735A2B11D6CA98017C7C118D1D460585E9 C6A2C132A522F0632B5B66CCDD2572EE7378ABD5EEC211CF82EF19D151D290E5 0A0B3328C699746960A0A7BBF540E6F6CD9544581D879186CA576E3CC0164930 264C26785042123F5784D2CAE377233A1387A3B4F8D868B40171EAFE7BEA628E 7ACC740937076C878F76BB8EDF36ABE98111D319AFF427713EF3CB8F16464228 C083113FCEACDFAB97AA3E193E8FA750FA5024B674F63CFC58073BA959137339 4B6958AD894CD17C4DAB82CCCCF154343270CEE203E13322D3808321FC02051F 90CB293FC80FE9BCB853738AAD70563E124CB39F9935AF590ACF3F5FA8560169 2572D275F36192A5ECE86B988D6133B0A1745D6D386937989850DAE1E62D09CE 7D24EE2066814DB161F6103247EC2E8E065940F82E1E984942184E68E556A120 23F52C75017514BD176AD60F29DB768E9F1B3DBD72C89E895432C39D2EDEB089 3692507DCD57FCEAB7031D391E5CEC454D5266D140D7EE0CD151F9CB042E044F FC95CA7AC869B4B04DCE1AE9D5202C36E343B1A2AD786F5B7D0F1AD1E42C4C1B 6E6BDBF86F022D90840FAFD81604C02689B3550AC41AE36435B29CB823D255E2 EE9BC538502D18ECA40E1F340D0E9BF70C58E9C775D86DBB6BAE3D3EA1BCF920 6ACACBD4D2E960723EA3376AB2B077010C1E685F759A56E9B0A84BBDBBD9A0D0 FB4B0806861C272DE667F219D8645EE294FC321D8E373021BA63C1003CE2D689 D5855861A575696ED7FD601D114E602735DEF72049400119E933DE8A1198DD94 8457A24FBD19FF5D21D169FD99B6F6F6A2824F8D1653A13D5BBCB9B11E36B8F4 2F9DAB2CAA39AA9453279F8D222EC4AC8114CAF0F7F58736D457BC01DD915ACF 7D9B4AD3D90F93256C4C9E41CC15A43B71E26A8DAB324639FCCD3E082B580CC7 B7F2A695D029161D2F3A2A8963EC8BDC0E6D256BA06F08B6D48682CC9ED169B3 58B063D8D7265C15B59C3DC91EB307F33FFF73C3101AF250F3CCA40A161FB3A9 B698F261E9F7299F2418D1DCAA1400F7BD3C74AB55316F22593595649F3E9C26 6F903C6C0B74D96CB7F92CD33D610F0AFDE14516105B49F1A43BFA558BBEF71C 2FE095E954125172B6CFE4C6390F701738232605A38671424723A68F13F2B94E 2FF970C51633660D9F5B00FE64046C85722B40515F34E44F32D18ADA4C85315C 2461D81D8F34BA7B13227E865B7C24236A16D9C6E1F428998C22A43D3D0332BC 55AF05204EA352710B199C0F1F710C96C72370CA7203A2882310A629995B5D78 D57D695B654A718C5268E9751C7F848CBCF87776ED10DEEEAA32F50769CF5BF6 58455F8CB9C793290D7F8A38320743F0E87CF2BAE8A07BC2DADAA9F61ED6EF01 6E24883E78AFD03E23D3A9E77C62147447BB772B4C80C1022727A9C863CB8A7D 5C54C057BE3E148FDF79659CAA77229C438A163D366F5CA9F857ADF98F9377DB 8CA7CE8F361E5A553B4541763D9A6102467A059DFE0004C350EBA6C8FAAD15A9 3C68C30AD52BC1496C4C214B5ED4E537C3B25DF46166E1B22B0185FBA3F9507E 7ED64C77517B077164E6661D73E441ABBE1BA0F68D8B53BC8337879EB8C08F47 A579D32D0EDCCD91CF143F05CDE56B87E1F2868D001648513BE0FF3700732AB6 CEC0CA78BE25810FE125B5542E407A984E758EBF4A3FCECEA2434815F64425D8 C8D0862CD06D88B613434DA7CADDD3D6D4F1739E744B4DBB99C08CAD6112F0E5 4FDFAC2B8D0D75A7A7AA5CFBE2C3966284E9D33CA71043357CB951808B3453B3 B140807FBABE8F6B89A99B329D84E21F14F5D0022C0AD05D24B00CC2DD560C03 AFC9AE7BF337FCEA66C41BC6A6D3768172C30F45DE176C1B4EA57828702857ED DDC1953FD25CC900941214ACC73A8878EFE63AE700ABEB0AAF8113675B12D8EF E370EBC067F82917498DD9A5C6B080AC066FB0B209C52448CD68713AB98D78A4 7ED37127959969CE4C18D686B8FC5312BCC6B5F4B375DE186E927F42AEB377F4 E96381BF6906E4A24328DA33A3C33F00C7034C53B10CEC70058D312D3EBDF1B7 C81E0972E77259376669C71141162CDE55F5EF7E4A8A95A16AEBF41D00740055 FA8CADB6CCAF1BF0850C4A11F905AD3287BB90D66E2878C58F00A71DFE1334B3 3FEF4A33513070FB9AF215BD26E039563DF3BFD597B8723545C52570E863DA43 8303766D7B0CC6EC75676C77516470F9D83908C0F91AB5DDF2041BCC68B1D3F1 652153EE95DB246F151F63D85410B6B5FA265937B373A085AE2C42542287C17E 7FEEC7246F98BF641ABA0006F8658956222A9E5CF6605A3A93E5C0C97F43E679 321F598CB94963C49AE48BA497D99B304D53F40D605D17DC12D966837825B070 6AF66368D569B2BA9FD4066A155970E0A9BFD8F9E4645A41EE98391C5A2819A4 CA09ACF8A056B5F65A4EC08DB490EC4BCCABF6D5ED8DDADD250A704D8D0B70F5 D54C83A4E971792EB7A807172475F195836A9184EAB13020A8924232C95C8C54 5852CACDC34481E182F98C3A3102EB6979B8D81A2FDA248D74E76B3C8900D6EE 9EB9AB23DCE457ABB1829C514F5AFBB43435FB2B4E83E6FB0CF79F24E93591FF 59AFC759E491A9B569A1B1EE3D61CA858357BE7215484F4504C6098EB705BA7B A38C7B683FBF36EBD39987C5447C4F5074893D934C59A056D72AE4F0A363BA09 EAC3C4AB6EECF15BAD98A0201CDB4F836206F64FE1B84E590D6D4119D2F7B548 36A2B3EDED5A8BBCD95509EAD11F6F43FEC653F131CB4AD546A6B7096353B016 FAE4C3C0C8AFE9E541291104425A1DBBF7091AACF5F539F29CF261F27DB2F2E9 96B170EBD139D7D9BD009D6DC3EED26EFD5F0FD4F46F590B3D218F0F54F324A5 C4FA31B4DA7340302287C8A3F2417F02C6324F2EF4A7BA2612F343EF11A4B4D8 C3D6CF3DBCD272010AC01B525420CADFFBF2341F22B018515D954AA24E026A00 AB3B5045E73440ACD6A2957BC5835009A310C7C85DA385C498D5D847469563D4 146E97EC0FE9F8B5244B6F9C83B6E1DAFD109EB7FB1AA5AAA3A3ABCBF4B4FD5C 07B5524EA0501EAEC5D280688D6FBF1441317C2EB2DF818120427B4FB62A6AB2 68FB208350BE986F805CC893E6C3F0B2936152B1E7E19001913C0A9F821C345D 6873A92FDF009CF16B72FAB99632B783DD3EE5317C30D3363C10569FED1519C6 78F6A2343B3152C4303321F6E2158C040C7877C7514F30A15F052D3C0EB1794D 17A5BA81039F0B0F3CB0093CF6FA0D7389DB279018806C1957154952901F41D5 C9786A7C0EE76E57189A58925CC11B9F79C17687198674B2CDBD77AF4E0C528F 21E588FBDAE805AB5ADE20E37242C55D6ECB9574C82A6044BBF8C649A39C5512 D500006733919C4FDDCB5BF3F586E6C0DADDE28524039187CD1551FC7E193DD8 B912AC9D6DAE8B1FC859C46D871FC08408E2ADAEF7A361A47DA2DC64DAE45B96 AB720474BFE8ECB8A524FCEBA21ED5A28A01F90F6D28A7D40A4F1A9C2A7A9820 12FE8B0E532D637F1FD9E939F124A8322AB92792AC25B2C6D5964F54FBC0E882 9B4BBDEBB7895CCC4DE40159121E2BBEECBEFC1E83E2C386654997A9E9947B7D 38EE4C03C5145167E554DA0A7EB0FC8F4B80D822C321D7574D05A1289494271A 501FDE3325B7C87E1D24C34E08B799A073AC8361C9D49A02B564126065A7D550 07E36365337A08E65AC7130BA92D6C9B97B12300F2C8886F55EE9C434F7768BE 5B9BD13D87F2063E39747F10C2CDF8A60B9196FCAAE79FEFCA552919AE988A2B B16705FD84EFB22DC538ADECFCCBBE8E1F58BED0588678CE1A0005FB3F5BCB82 E5519E9D23ED670D2D6BDE06E36D0EEEE7D78F99BFE25E1A89145B138612C8A4 90D0B41453AFA81C62DDF3B21CAFE3C9807275BA3C5A25E74FFBD61A092958FB CB84C171EBA5F91D31123B578780AED7E074BCAE8DEB9C10900F2261F198ACAD 72621D416CA2768A0851FC0F5483895FC84FD629F1C32212528C966DA662FE7B 8DE8D4B261723F8853A5BAF63276EA472698079F7C8E09908C614A0B8BC680F5 9EBD5DEB3866EE4DE76926BC31DCD160224A056BB6EB98843D2AA129A3B35999 3A31A60727B74218771BC7594DD1494E8B385F037F1CEEF0E1F413507E89F426 A88D4D599B8B7D40E7C90A2CE00EC61E35AE94FD68E165AA4B30F3163DA0B493 18FCC396151A860D96AF51C1BCEBBCD15C711BFB5A33692D7FB570F044386748 6BF849598D52C58F4E963263CE9A9F64E8EFABAD9FE77B69C1F62A418E7DC918 87470BE747148D5D3B5C718F9F49E2F398E7A2CDC59216AAB2F16FDFBA741F9A 9E0FDD43CF376DDEDC8FE833FE4CB1D5E27B7CF160F2F22A05A117F348B632CE B9C299669607C6A08C86187B78A6AC4A70C5D6A204153B346D2AF6E4DF9175F2 31607B29E99B5641BF3A818AE6173008066844469A0837A35C227DA9863D9ADE DD2314224B8C3296B93D698D0B5F980EF4E1B62C30EC9760CBDBFC0277A242B7 CE7989E0BA910E13734EDA04992F06A0A77E8B20C87EF6AC80A2AB7C7FEA5768 46D2BAD6C8CF1D70B9CAD91EE7FB2F88562D6280C12A1B4D32FDA0A422E248CF 220ADA5A2AB5597B312386A58F8A21C3ADCE6D5FEE3F9D2A4363835B07527BE5 BABF7FD63B05217FFC7ADCF2EC311F6B91AB091C6C963255B4B8453897C5D8E4 B67CEA88C09C23A3FEFCA3AECE9B7ECF02DF65A99750A337D1FC2F13D198247A D892F0D9A6A06265820AEFABB3F0729AC4AF8062B916DD3ADB87121EB799965E A07438A72CED4E5320E6706DC2CE33BA6085DF0F9C788A176571DA3501A15929 C2214FFA20A0470B9CE8952CA671C1B717A57B48CC839F5DB4A6D66248D182FE C6D0C89A8CBE513E0AA41595376F70DC4EEA7ECA38B8E44EF6BAD64F6C15103F A7692126DF2BB08AA38C4B90DD6C39B0B462A4B37729CC59B85105D5C6309749 F1C93F8B2EF214F2CBB58922F050A80C2EF0F7A0D332B5F5D0209D7EB3779828 F94760FC65E0F1547CCEC5159B7F751637F8A73FFF9860547CDC94040F432FF3 0BA714B6665EE9F20A8A56C3D3E6225C3CF95D24079E41797913B7BC1869D27E 32212E244C9E9184CF56CD15A8F1EA694C92FC45997426F19201EE37CBC2B24A A8015D92E29308FFDF9901CFD5061DE67D85AB5E9E5752356F4C98AB864AF589 389E6B85C439670B28609810859B5EADD6173159903FC65125EE9F444ADD967A CCB73B5C4E153C81110C5578C552D914E05DD3A18395087CB147B1985AABB2A5 A2D97BD3D050EC2729E4B2E05F5204C06E266F552ECBC4472B0710D7A431C3E1 0B7F89FBB561D42487527024D0F9AAAB4CC4233DA4900FABA883A595CD445101 45B5F4088B21B546BCD6C0D6B757BD8114A7AFBDDEDCF923016671015D3DE3D3 3759EE001C9828684374E20D6EECA756DE290F6A020E09D8C411353231FBD7AC E02EC25A5B7AB5C681FB95A03D79AA01CD91B0F58CD3E3C723BD40ABD4B9459C 4AADA21BC33C4F5161874616818BE67923E3FD3D65BD18D4F90691F491B4EF3C 34DBBD11D03D396A086FE67F18928C5409FC0298D21AAB0779CFA7440FD3A083 7C3414740EF7654EEAEF51253FEAEBCD7C0D5958E1EE340A298902E4B23E5BA0 AB47D6B8A41DCE006A4E3671840A4C077E9E948AC9C1FF7AE26D09575727C2FC 8A2EC23A7736665DC4AE2BB65B475640BE71AC6D66BA0971128E7840654E715B EA8C8277C1BC221590A283EE764584DA9AEF65CBB1E52CC41736378F1E294C44 0701F1977AD8F5F8F2D060DEB4FA32D9D9FC53408522F74640D3444BABB39209 68C1873D6E0C0E3E10483D67CF70570F55FF4A111F0F4EB54557AAA79115E31D 8D682671241914FC07D431201AD76319A849D53640C5E517AF616A157A056CF0 ECBBA141AED25FF648829604626D52BE98AA9B29EF2E2382ADCF9704D0B2216E D7408C359B159E84389B5454AD8E10E4C62C592E052590DFEBE546B02E2C100B 599FFA2942872097FB093540BF7786E7D45A8B5EEAD6D1C1118FEED2635012CA 178A40DF6F626F6596CC773954472F5D4CBC310CCC041E384304ABD270BA8ECB D04051004C71FEB557C434CF3773FA9750F5C2757B7F1CD17DEE48B1437B59BC 30E690522C3045943D45EA6E51A4EBF8FCC557261689C562BF8705780986D2FA C866A3FC22F941DAD2820912C97510B1CBB1BA36839EEF82DCF7368E382A4EFA 0ADD7FE767994941E9A5D7CC44570DAE3CE7A785D65AE2784B079BAA5DF1D7ED C870EB560B792467C72C874601061E0FB3BF003101EAF8BCF7BF01F6DC3A71BE 32D391649160BE738A739FC07BE94A0241BB41CBE04A5F794C37E2F5C258CA81 9126D73B4471411D4251283EC936EBE3F8C28EC36BA0E38FD4136F779635E95D 8D5E5C4E14C680D855DDBB8C1F90FF30BDC971919C7E6A93074A36D88561114E 6C999B1CBED051B7675B6264E27EC4A015CDE54B0A986250A21271BFF242B675 9AD36175B01E120D43F8A60FEB9DAED5A70BB4FA975450097B966F1C95F2BA44 3071E1057B6996F53199879DF834EC867B161334FD281CCF75CA1480F04DDC4F 511E6EA992114990629034D590C97A6409B520A5E78BF118E11B2BB74F1374FD F3415AF23290A4FC3DF6683F1D5663B17260850FB1E307D670CD527E53BB2CB4 40A4452BEE0F4BE7C62B0A7074A5303B534F3BBAEF96C818A3BCCC30B082B502 55B5A82FC5E0C6EE660EF38167D9AFD853D48500839B16E1FEE13BB232D55040 0805F63323C6D228E192B6DDBFC0A54C19C3059E16EA511F33278AE666C403B3 BBEC3B9F435A9752984B43DC4DC6C5AED25A3D2E73B10B01BA097BCFD167D4EC 937DEAF6D992D924FC03B53A70EDE75494FC0EC27A34EF8B637357BFE6081EC4 9731750F93B4AC3D1B3B6FAE7AE7D71DE3F2C0CF4D734CD43DA41A24DA7E7C46 A1E76C9C1005C0313797A2C620DB3EA13E924BC71B2916C308533834030CEBE2 E2CAF5AFBC7FC6D6F0D12FFB290A461F7D262A1F620AAFF509F05705D48FCC67 B143ECD4F2B0D61AA00A69B700209F2DE4988323112836FC1A75409516F86D16 3D36C7B1E7C4995E19F0370586B4C6242C64E9604D541B1DBC252F782D4F5BEE A81FBFF9D7A49307E2265AAC20501FDE30BA6E9C949D5095DAF00ADAF7BD67A3 77BEE10C62F19F9CC3B0763A9B1A62EBF43FAB15425E7D7AD7E29D9B40FCA346 096549B43EF7BAAD35FA663928050E3E82551D502403105F7881257039A8D67F 1B5934CB7FF76D879DC26D6D9F8DB1412E04A18CCC4E30600EEEF35557E73FF0 B9583317CE899891CC608D3E5332E0CF05C754FDB2256BC946EE256607A1550C 75907D32C995B1B54A243617AE98E2BA9C042B7ACFB4919970505E7482653F4F F780ACE9308C9BEA60C891C5FF175E108C45301C588D4636C09AF8D6AF016450 F66E262673314125FD1459282BA9A0EC01A7305A8ACFB6FCC254BE58DF6CD19B 98483D77048A3DE933F94DB60CB3D89A7404939FCCF918464032EC47402AB1C0 DB66E1F48AADE6A3DA6D77D6124D75B84C5CF556AAAB07FCC2DB87262E5454C6 4814F1933591DD4C29841719D334BB11281B94E5D44D234212C3A7A42C2FF04A 9766AD45A1B0498D0DE841D0DCD7C02428806F6F158B7C69B92743892FC693AE 4A147EE4E79D6F47017DB95262BBC9787D330D3A4A8A85EAFB909E197177EC4E F2DF74F543EB7D97B5EB6534D7BF16D16560908D8408777D96D88741604B2697 67E91C3041645C0843815BB87E0C6CF3BE2F8244A24017E6C2114EF0F51BFA97 15353712C0F388552A853B285DFDE41F352F5ACF474B8D86491C2F2977FDDB43 1F00F9C05C87ACF8D9F9B56C3617FEA2E7D8D9195C2C553A6863C734145D156E FCC1D17572AAAEB4B0BE5CE51D10BD4273020DFF43E0F1FD270BFEEC8B2BDC3A F16B43FBDFADB690685A6891B497412EDC358CED9589836AB173BD20E984CCF3 59759CBCAE3825BE4A428BEF168DD88717837503804BDECF675BDB8174DA3EAF EF5ABC8BAE00FDCA6F1AFEA1C03C14902D0FD9BD67EEB2F344A374688117858C DFD1AB9A50E7F4BE806C5C5BAE3F07B8A7F3D4F54A29187BC6C38520895A823C 4B5B184FBA09CAA547CD661F6B4BF98E68A630D403D214374C554737AD7D5994 81149DB2480176D618EF15E0517D56BA02FC995E85F2DBBCBD046F723D52903F 14B617472E7305E9F6C223D78A2F477C9D065181AA86FE051F70F7B52A3D82F7 ECF18D48DA8C17870E8B7E543470AC7BE549759A1B27F31AB30C68ACE22BC9AC E147F8C182255E7262EAC0D1DD1B8FA888D0D5CE9E2780C0280C519AD761AEB9 C5C3FE40DBC65147F680F9D2F6B9AF3BFB5D075E91CF3A092249EA71774FBDFA FC479A7148B477BE528C3667F0C3CD9C1CB9ADDF4F4AC8F93E1FDAAF3FE1793A 24F95BD0EFFDCD59298BA7BD8DD48A718C660E195C765E450380F771183B302F F5F27514863F9FC48CBC94306556B6DAF16D54F9CEA9C45A8D28AC6CE2CF954B 771BD117CB67E8F93D933BD0693AC61D82BA1381D51AC427425F8791B779AEC6 20AA9905734C7688F1B1EAB3F1F713B14883C48EBA0E91A64C7EDC850C1A6D7D 186F405C48125A77377DE45AE05B6BB2FC42849EACF6F6F9C003EA93D00B89DA 79E540A2B9BD52113D41618D7483068F923B847718FD6C516000B5B51769787C 8DF0B33977F61AB477861AB8D493ACCFF30D4F39511B0D9BFDE188FBDAE805AB 5ADE2C628E6E047CCE9EC352CB63964DC90905AF18DC3C7874C337AD2184267B DF974A6237B97451A0C77410EFBB3A8A3D55643CA08A8EA2E0AC5F0A9375C461 E4B343F80CEC40568C521447BDCE1A2E5D45408B47E5058D328C8BC323DAAE9B 274E797685343E37583F2F631BB07A8B954A5124FB9B90EAA7E22DEE4EA616F0 C65C57864A3AE70F4E7C09328B845F53AAB943138E005B560EAA306EF67AACDB 122F74773D084FC0FE926AD1FC0C3EBC9BA82904EC2D6596EA65F4B3E4B5BEEF 74C3CE3CD45EAC63D7202E2FB9EE03AE4DF5B30E0C78AA18F38EAC73045DF537 03D558AFD6CF63271F3AE844614482BAC4A34CECBB873F13888C35B29652E763 30087613B8C3CF47008FF0C2B4DCE7B4FB86D0B968AC4E98882EAB48F41F7197 9AD42A9C46648EE7F0F270C203E125C92CD0FAF9ADCFA05AEB08A69DCCB712CE 75D6B6BE60839492D18BA28DA2251A5E5D3D9504100501B32AB001F5D4AA2991 ED06C8F063F93B888D504C5596CD273307730460EB46BC5FAC040123AE2837CF 59E9BA4C2B1E83412CE3F9CB5E2FC7DB0D15607276D93B3738C549619B17C0D8 357FD5094A703B74DB8D61525C3FC1DCCAD810F5E5278897DEFAD47FE30350D0 C9D3D830D5447A8E52AD2DAEFFD2279EE01FC95F4C38EF18A6EE079727FF62F8 7F4D2BE5B80CB0B14DF3281A312EEEF077584D7FD2F0C06B6047934D745F3396 AA7ED80DD3B1E3D1FA27D68C68F1317D30FB14C6D9D5F31EEC05578C08949A0A 866D434E4C62087DC082C036BEC3F9DAD2A26BF89687D537B58A9001CF3324A7 75022AD2F66C9F4200A5EDE0314190F6638E8F7703B25C0912681695CEF8AE5C E0A8D860526C6AAD0B0C3CA9CEABA721C69D93D5240F186B849BF50843DC098D 9F57A70E3B2F0961B304D771FFBDBE2B5B737FFCE21DB8EAC51594138F63A104 9994DB21D186FC4C317A14FE9FE9FDA16B9B9B2F94E1E8A9DB232DF8B23C3704 53164F61CCC22789D30C7145B6FAEC3D0501AF29B4FFE749A091BA859EE5CAE9 9A404B19E949311CE275101FC885408CDC12C46AD88F530DEB6FC3DBC7929613 C5FDB899B93807527A6CD8842B09E701E3C2BDCB75945C4B2E473BC4DE2C9B07 5DBF4243D35E70B03A26DCD0EF55282E7993032441E8B6EBC5EA8923931B48AF 3A9618E3E6759C2CF32332BE904D74B41A46B53EC579A8CD490E2D94BBE4131A 89BDA47D0809830EAAA4C6BD50D146AC79909979E5716F768D1D95919C6AC4C1 A63AF5CFE0C31F4E8CA5BE704EB74876DD3E8BCA2CC14DFF2C6D3F15A5A66564 2416789B275E6FDC2E93EBAB3FE9448FB38AF02F3D37D1C9105B03A49DB0A86D 275CD3CFF32C1250335100991700B0973F3D5E54C39D07D260C2FF3E054D2D5A 728CA8DF72801940AF4F129FB2E5C4F32DAB16258C3DDF41B41334304C99D25C D164D565E687B6FBAA406E001BD778939720B725B29B0444EBB2E22AF08A50FF 0C00EA68F9D4EC2C0DAE1D0CEDDB9C7417A413F5173326DC5CB8275021CE6F04 5A9B58A4D50832A861CDF9C9D31525D35A943AAF66A34877DF57FB6B156AAB19 3EF93C8C4B8394FC0A51732AF46FEC3497D2D84B19F64AFC3BC52B054231D5B9 A34D45FDBC25501D52C6ECC63492962B685FEE3BBB6C2DD70A84D704CA35D745 467E73C8E5B6A2DD66C370D412525628174D5E10201C84C9C4DC77D0FC4EFF73 293ECBD31C01A74379DD9C4F90EAAE5FF84ACE13643356755405F66C7361A2AD 8600BE9E98A52536FFA517A2D4AF896663E6B930A66E2DFFF2C57D4D7A5C9F69 F3154F6F8375E9803060CE0D4C45AF6475E53920957BF365961DDC2DF476F74B 5149BD0687AFE0786B18D2BACC769E28A6E2E8BB1E3F284992AD1F1DC058AF02 CC94EE0845124DAE980E6D9ECEAAEE1849027B0684DF492F168C5DE0DEADF4D8 9800BAEAEAC9168846D852C49387968E86D65ECE24D6AA3B60A64CF86484DE06 F540D5FBFA86BF810EF5DA04473E8E25345AC9A12424150EB621CEED8B1EB090 C76FA51610E7CBE23C6CDF040AD880B73F3331F85824319DDE430C00AD7F809D D408879B1FFFFDA10384BCC19C8F3499B63C19DCAF99A5D0C2A948A7CB69E094 5D3A79A06DCD7FE2122D3B3E646ED2032B8F82DBAD82A8563C5667A5F015D31F 8FA8AF22D4728672AEED085F88DD7DE8BD13B0E7D0306969AF29AD850E149889 2B4F81D1592CC36DA27A29097B8F720F477E6F9E26DE7C265A54BE07E036B7F4 ED5E303876C82496C2C5396679DF6A91802452F079AA8E653D13438B214AB47A 282D714843AFF0B74BF1F72C4F7EE4A012EAEE04A82AD8B2EFAAA33A87977644 AC4F6E5CD474A6C8B08EADCC1665E3FFD09C78FF30CB4929CA140E04795686BB C985F7CEB0363FA650137E7DA8226A45810CA44175E66ADA50A0743211D3FC9B 11B4EF4B5DED09A3CA69E48E0ADCFA5EAF749DF18AEDE11F9046A8629880C9D6 38BA9498CC17F4DECF25ABC9AD80335ACCFDC534C82A9A479EC9074A1D9A01DD 96D464E1D630688755587DCCB5E8C1AD4032B4EFF0E645E2E2329D08128E3D11 C8D22F4CD4E4783DAC3D6BE9AAEBC2F4AF3DDB05020796C972677AB90AD7E8EB 9FE96669A4615BFE4BB77CC787C941B7A0FD430AD5B9D7B63A26E954A28F60CB E380AD0BB4724D99F3F46E73160555A2BDD7FF5BE83A2312F7B04055EBE5B2A0 08FD96C4C90DD9A06DB0B3D5F570E8CF4E9FD7FAEF7B5042A5513C1988E63ABF B3C8E1D8704041E279CBBF208AC23385E97A6EAC8BC634E3F9BEDCB3EAC4C57A EDA544E06719AF5BEF69257CCA51FA7840BE8E21F66707EF31300DDC70717F44 EB2DF6070007E7B93D1357ECF8ABF097B757524E92D31524638E69E63B2DB200 4BA1E338B284936557D6DF04AB23741BCA5CE6B34099FCBA07CAA9595DAF1E8D F10FCA58FEBBE12F8E2FE6A0680EA5E6CE0CDBF9A1C872621CA4C10AC91E3F55 14C3918E1D32A2078CCF4D109ACB79C3FC55E3D222B9BC8E1D0CCBA5DFF91B1D 76367940D4CB4CDEC260F3152E03A86FEF74DA6A1DB82522B496C177A77EE9C8 652B0B6DF023E60401AD8614ED9D77224D822F4B961EEAB6D9911922311131B4 49167FEAD3E3EC5E251618F7D1986069847C7F1E7503E04B48DFE249135CA5D2 8903F8C25A141CBD2E7117332EE320DE0DBF03946FBA0DA27F8DF4AF8771699F 696C489E8AA7EEE92B7824B5A03D8B297F9C606E64BC376B10C5C606106CA8C8 B764BFAB04512AA9510A361CE189858A9A565276CF007EC6BC1C7ADCD6C4CCE5 CDF512143002C6C2376D3CB2624095DB10CE42032BAFBFF7FFB6BC8AC5EBE973 02520AE31D24A36AF5C897965EE3922C280FB056A36B802E1FD49A7C590F9A3A 2D699F0DA5D50F8EF5C01779953A5BB88EEAFD3DB8C428C6514146B1B55348E1 E2CE1D3D4A13A84A240C40084EA97B971EFA414370BFBFAB6F6342425A324388 7DB7E4A7BF1FB654BC7DCB56C7E1FAB0848828B86F5CC8B069055B76986391C9 76CCF12F945173646F85C1676235855107EBAD75BDA3CB3E655BC81AFDF3F629 F79687F72BDA04FBF6ADD00F9A1F21C0007599A177F46140D6004D06F6CDA03F F087938716D4D6B2806985ADCC344B17B976547AE0F745FBF4B8663EE4F39196 4B21F9AA8442DF78B1BEF23166510DBCE4405A20DAF5AEB09C4ADBE05169A52D 839BA7B8CC777A0E4F685686F344716E2AC2940282FBC795966BEB564B018DD8 FC56F588AD42CC2630ACDB1957CD2F3A461AAC09E95A549144809DD7533812A5 7A8BF8BE337EB618E11D24B0B2C34CB39BA93DBF0A588DF611669ED72B92144F FAC3BE40B7B1E56B38068008B17DAC0C6648E5868A965166A798B9C918B5FC67 E60AF10D6191FCB156411ADCCC75010D56E7A87C95F7C1CB33EAAC7231BAA719 B927473D40BB980F3E9D304567305A653290423E74BE544D39BFE92E0CE23BE9 0ECCBDD14E74EDC3C19B121128E807299C64E68391F13A96CB1A418A450AA9C0 982B3B3CAC83E11C8A6CABC01F5F358F2BB79578D8298FDB47151007756597FF 0574F3357B719AC0E368A14CC91F6E65108FE1AF6797DA6AE4CA52E1B15890B0 888D8082B70CA6B7BC5FB7AD9262CEA6FD18611AA1D7378735E923A6A45D1869 81801E21906A4D73AF8D397B6DFA28F52355FBF16BCBACA72DAF170FE4CED247 F8A80C1CB66BD33BBE1AD30182305ADB2A88BD5F9B435B472AD6564845EA9CD8 84738801D498CF826C540664BC8E87B868C982E49D77916CB87E10AC669FBD19 2CAEFD9113127041479C98CF1B2987A45A22ED99B048EB76AB183714E069D51E 6DA757A9A4E17E07AB37FFEA7618ED5E583F4910C7EC87042E8180DDBA7CF58A B8417BBCCF198AFB196124807215030A9204771B3CAFA90876A5193F954D73ED F0BAB43D936D0617D804B6B2CACCE9FACD2035141808E583A6E4AD03FC1719B8 7BC89A97156B32033B9A3538E348C8D7A59183132E9BADA34F1E77B2FC8CF783 3ECF3E24FEAC7C7BE1E236A94C9C44CEC78DA17D4D33BEEAE1A76CB5D4F0DD8D 93E332D493C6D6ECE0FC03CBBD275441D61AF9A42443355A369A0C495CDB74E5 AE071679D9DFA6715543D3FC1B6E4F66E5557428C616047C498DA9F50EFA1683 AADCF6B403F0EF9A78F1F8F1ACC478D0B5B66FD60322C5AFC4C79557998FC714 41AAF6009A53424935C0EEEAED8CB4513D8CF9AD3B52CF941989591FAF2696CC 40F1887F8EA77AEEDF67CD3BAB4BF1DB2E57087D50A1F5944942CA5CB7085240 1929A28CF489F26F59B850FC78A647287740EF2755A91C7196E4A53063C42BC3 575061B2CC994D41EFA131FCB266A9AD1E18DBD854F2B99846EC903AFBBEAA98 B32671B08856D84FBB7BCF5B82D245F7DD6459CB437B4183ACA555B4B274A63E 158F68D8873925660D260B4C7884014E735B72EF322D646C4CF5EA4917CAAA18 3FF6ABC26D16ED118DC4F1B85B3405A6EBD15C1A186D7C7A9A8D22F6F03B5DED F11167C738C758092C6BEE44D03532AD27708884E6F3EBD040A906D59E81FDEB BF0C0AD4030D661DDC3048CF4883A59C362229EAB078978F7E62B9AFD9E329B4 822CCFC1DCBC7D0714E5EF2B7BAA7126894612E5D1F4CE7421DB0580E8C3CCCA BEC8DFD6392E9575607C895CD9FA1D78E92B634D62F3FB5DA75BA65958F720A8 C0006A580F39D8B63D7351BE480B24B3E10318BE8780D486D3AE2E510217A5A0 3936E396AD22D01D611DDE5F0F5140BB003D24599E9238397939ABC3833B8B79 5C2B8CF9DEA9F3DB71377EA34DFF4A7062E91BA9E090A815AAB4EE3CE94A4619 488EB722ACB22B32C391633A9B6BFFE656C75BC7A9DEF0E02CDC56DAEA9597E9 360562717D81560E24972ED5E8C9CDF7F54B30792829A9136D2CC9B1348504C7 A2F500383EC033F4756FE20A8EC0B1B0643F8644C1D871AFE21412EF88BB7497 C79E3905528B6B2F744B9C9F10988BE7D061F5A5F56C72EBFB94A5FFE994A2C5 D0BBD6F79F2BBFC9B811D6B4AAF40FE1D3FA6DE3EC49E0F24EA9490D6E3F81E0 B56FC8B4D6EA1A0E899A9C1ADE24693A6D7E4C214D0847E8C0D5B31FB133F4B0 F77BC331474486F8E4A69E970054D0802BFBEFA856550D95FC2CA900F5D6D3D1 38A892C66D541937D24D9FAF5F54F169E5E78BF181F2C2E2B2E2B5D6E0F21727 1E420D2E69203BD76417DE9A70685382A0F3329FC26C671537CB07764D1165A7 6E4403882716938A18DEDF1292F688F657E27FA8E5D86821978DB65B0166FC49 E7CD5C8D1C6AE1B78EF02E8A81B51B20EF5BFA1EC1F2B80017292FBB6168CC82 871CA253ACEF6AC823372F41CC766617377ADB19FD677C46D7CCABF870DC5DC5 0366E0A5750ED38A2A86811F9852E9878A95D3BA0F6CE7FA2670480B6523BAA2 ABAD6A9C2D43E2BD21F2EE7222D21DBC394EF4CA9FE693A5A77CEC2EA60645ED BA3BF1ACC360B253C970F7BB86281CA813563CDEE08817DBBA24059FF290B550 4F803469E990F5ABC2F66726E7D04E00D8E634CEC60EFF5FB69ECCAC20C2986D 65F5ECD610BAF2EA2AB937056DC724FEAE337F5777258FB5462F3C94AA7E94D0 FCA0B0684F884D7EC6ED8BFD0AB95BD5830CB4ACBFE139AB0A0C1C288A318B59 A9A3E79A5D1D8A13ED7F632C7E52216E16A331101EF404489B2B095C0F787063 9370950775CA15495982D882396417FAC4FF86355E203F53B33F35D4A5175EAC A78FC91C980A6AA5BD49D87043C4686B224D0535C816ADD1D48BB45EE7529E64 0EDB35B4A27C167DFE994EDFB41D9D166802E37318CB6D4CDDBC73F7CB30816D E9C645E32C1B7513199F8D099CF39BB8DD762B6A947AC26242B3D51B11971F72 DA4F942EB19C883CC0749E1596CB89A1E6EACCB35594FD8E272F1DB7529B059F FB204FC404789EE182D117AB303A886EAACAC08999B19367801BA5622F5443E5 1EB2903D603F215C9355DEEE42A5DD29C5CBAF1BA1FD52B9F8E1FC5DED7DE91F 34A4461661549339B595FEF063BA44CC0DE7428E131CA38106279246F5B9FFAF B127B9B46B1F5E050133071924005746AD3D6AA91E4A0E75E5056AC983A6141D D3DE44D5B37461A76EF6A8906210456F13FCD15203A80AC071FE10B2F064145D 0C7FCF12AC9EDAD42EDF4E327FA57D6BA92607F41B7E34A7DD27945B4AB2F0EA 532AA886EC057F98964EC0CC1E4BE095ADCF030B1952293B7B6465919A833D52 F24EF2D9BEE963F7A33320CE29D54471526D4592CB09B0DED834AEDCAE0B629C 5BE4E13337BA87E9D64D744CA5CE709E528F7BBB7C35A3444D643B1ACDED2F6C F4CE7ABD757F477BB4F64459886814743C8872DD2312EB952D5DAD81B0A6E52E AF1915A81D5DE395BE25B24412ACFA3C65B7E447BC4B801B5531218BCA18B0B8 D72809B5B3DC921B2BB0B76B91618064F45F614C3B3E0506CB24DF52FF8F2555 6B231AD0088DBDDE51908430A8102E0246EE56870D08C960E00B9D49CFD7D751 697625B30027C82D4B3AD0AD5CB90CEE2A2FF301608967581CC45FE77D67EFFB 2508905DFB42A0C335D1FFF2FDA1DEBE81C39628F53601D9ABAA6211D044F930 70378306273D11DA99BE820BFF208CE0A7A81447056FA422428A6A21389CCFDC 5FC34E06B4EA5D9C5DA9AA401F1733E2CF6669B438134AF47130FB9838208A83 668067B89C9025CC059E73C6B4C332E1D70BA59A83EB7E4407D000167DFDEC42 8B86B4B1D5772DBC673CE5F8128858E46EAD3A675BB5BACF61E0D1114D5AC0A7 D4BA9FD5C37FE37D6823A517F39B1FB14B01E38597E51BC93CB836825ED1A3B5 B841CAF361302234A2C3560FDC71BCF6D8832A1D74AE60806863BC1F3271640D 73A10720CD078DAF15652B50716C0BE61EBDBA0AAA8A6DAFAAA327C69C29321B 251BF50D418596E84DC3BE92542887BC0785F6128085F019C1FE9EF33E02A968 DB0504FAF26E033A05C4C37E5946EC500C5941F83318E765DCBCD06D4A09B208 56F226B0C8A9C55B6EB087C936F7237FB2A3D2A262E9C6F95D454AB92801BF57 B5788CD2C0FBAAF274BF5A8BA908CA18EC8FB5C52368DDBEC42F9C3E6FA16AD9 6D4CB47C2359309BA3B458BD05FD4FB40EDF6B495DCE6A091E780B328BFA995F 869B5ED92BF513511C6DD88690114C5F3626CC6824ADD9E2BBF528158995DB9C 08888D928E420016C254485603C49FEA0D26E34850843A066F5628509183FB4F 78C3E0FFDF61E91C984D23DBC5677442559540A798E820E3F1BCC192456E9B53 72F2EE0EFE321115375F0E43AB35256C770F5DC063DC7DD4CC59CECE9E7F3BAE BD474CC7AA33FAEB2920A44D78A51D3B75964A4310F30CC0E33018D3E365F947 A69434C67400EA09F40706320D603F292862AC24A488AAFAB0392C470C84C912 11BD82A3A5A3B70D3DE85F3095A6AB122A930F8014AF527B71B424D29E91123B 0934BAA13F0765A883CED744E967B810EF265AAB4F7097A817E94C580068AF35 C141EEBC26D24754BEC2FF730ADA142BEAD3DE4292E93A359E701D90EC594E6C D1FC795EE82FEC8FEAB7D21C656D079645F36FC9FC9D7C8B35B0BF424FFCD466 65CAD025F6C31398018304AF29117430B8745D8372FAE966404129C8BDD5F31B BD827695C491C7E6D7B15867AB4C5DF488CB9628C6C8C114293337043B1616D5 6F6B6C5F75238B27ABBB0773565A686BFAD3593BF53BA7C8272E1C597DBA0D6F D16517424581069689EEBF47641F9A0E3E7367423FDD88FDFCE78426A0D3F0D9 942F66169B84E5418C80585989E407B5415EEDD8961BABB8AE61BDD51AE60BCF 033F5360E7294430CDEB05DFB40C382D28C9834782B68F73FE9C129B7AAEDC38 E3B6DD8DC041408FA064E0AC4EE68A7C07D96A51A1B7C65CA28951E38B58B774 0312CE987BBEC2B3C6F20556F7E8066353CC46D8AF15DA8D7CEC2DBA8A3038B0 BC09C733C76D095F8BBA0EF44D6C1E397B19A866364DF8EAD8E2E0E7531C7525 8A6451008591A02C59FC1DAA7C83A3689A79037EB90522FEE181763D496A716E C01C78642DFFE2589D3980574220F09B144072E6135DEF2919CC852056C82B8B 7F8EAC363D0D89CBDFA1B40505F3D356EE16E5170FBEA46B426E3D88FEBD8E23 59C2FEDC109DC7A300FAC3EBA750BF6071DAF7327884D3C7467A15189AF18DAE 17F6605DDE4E2B2F3AFC641503E4DFE27F462705B356F7C17E1AA0E3D26C56EB DADA9BF8B1E7149459B958001093DE38391374A78BEF8951DB54A69964525693 63C5017ADE86C0E2CA89BB581FF57D0370F8AED9C95E326F88533E690B1C591F ED30E893431F6F615ABB187130634BDAF94568E2E17613658D02B29A25F35F06 7FFA714B60A56D2E9D586D4A4DBCFF440A2B47B179CD456EF099A34A56AF169E 5CFBC9C59516407286B2E11184F91EF25925C9274A6EBCA6BF38EEEA96E27616 5AF1E9F5E84D9888F8EE35119C43CD7F02DA23C130A2D1A753A2D1E25E0F7478 1ED3F6BFE62714F53DB12D15138189D0DA31E79F18CDE3FC84CD6D6B5EAF9E23 F90A1703C6C9B435623FD375F926C8D013620432174B8C765299F6F08897EF92 F129CDBDC3006D3755D3EB5D2953E182015BED56819D5A7A1773CE22214CC7D6 0ACECC81DB66E1C6AE9AB70B77F6DABCC09111F559DF0911A87726B44AB063FC 1CD60C964334A97E2A6604CDA700C112450389FADEC5DCFC12980381CF6BD92D 772BC45964247E3E39D087B52FB67077AA8197EDDA4F613DD43D1A3EB7D6F686 8528F7024C7A22B61A33E43502CD37E91605E0EF16D28A9A2806518B839433F8 1802738E0B1BF0C7E95C4C1500887FB099834FE6DF4CD9A9D7547341A6D8CF21 F49B9F8E7A9D602644B31396A7270C989F1A5BA9E3E225BE1F592D02D8AECA8D 79C304CB010A2645158654387C77AB0083D08A3C0A41B29453908AC57C181431 101C6EF00A8A55B6CB8513DC8ADC5E2D6FDF41990E6B3DADBB607CF37411345E 42D0DC8AE568B2DAC69CF347B18C175C0E91CD34ECBBBF3DB1B5E6CBC17AC9F2 8F77337D91885D14FDA32EE7A7367A3A382E8A894A9AD550DE350398FFF2BEFB C05BB7A915B8DC4AA5AAFECCBF716F518CC608E1E76588CC77359CA228596279 F95055FB260502B1377E1AD575D3C1FA65DC158057E071A56D2BA3BD77998B43 938DC18257C526FF2F9625CCD7DF0AA3D50730B35720E75777DEA2175017A503 A49509775646DC8D8926A75D64548B9E9C01AC33502A7BE04BA31441D5F39CCA F889AA4D6B0CBDB9023F05B39DD7CCCA53608173E9DC5D45E772A3F7B4F7C4E8 C3F7E7DE51770B2C887F14C473EB4F1A2FA420F64F4DBA1A6B651625F2AEAEA7 8A030BC2B65BC4237AEE381DCD24B6E9940F39EF1D4BF81DA1A25140BBA7E1ED FA371277B13A016B264B14833BCBD14E6B3F71FA822CD0E1B174B569ABDB6C6D CAFF1A208C8E409623A051033AC99A06FE1FDA685CAEFEAB404804A701A702DE 79EFA5F9DBE3587A2B8434BAFF152B9F18C574FDA77AB286FBE21AE741813B4A CEA10B071946CD4EC410BEDE7C68CD0B5142C2A99C836861A5B6A07FFE60E7E4 1201B9966CABE2B10E71888FB8FC43FDCCB882DC2792994AE178B6129F23FC45 32BFF56904E68A53B85FB8DC55D917C7DDA412625BB28CCD6A74273F5204CC07 962DF7D462C57DF81738A8AE709F63BAE35532607CDDBA7CAC46F6789CE52010 D84412E3CA30A0B8DDDE45A1E9956B4A7A8199D3177B5CF715A120FBA413CFDD ECB451EDF3DE65A8FC8069D4D1F65890EA6D6969D8663C5909ABAC85D4941312 CCDE68C63BAE2DC990B6D119FB0A8ECBD5A11C503A668FD66168BD051E55CCF8 D0022F58FCD3B6020A70838B97BA5A54436F41D26F4FB60EFA36F9E632BA44A8 A21F57BD665EEAF35BA65A4F2090F3D831E14B9164183C0565DE2352C00C1649 0796E84BDB6B679DA065AAFFFBFA67CA8AE9D024A3700959262EB552C67FC216 E61CEE4ADF9BADF3A38B4A618BFEF4CE0F96C5C382641C99B706A9BE793B24F8 78CD09F4CCF19795F93B8B35AF5598470124204927C7EE6D3A87E05F40626F07 B9521BFD489B136B01F406BCAC98D60130A298C5C455B0B2CF05465D268C55AE 26CAB1A2D4D740EF3D90914D334910DB05B5BB62B6863A4CFAE3834014D94C38 F8E20C677C6A8B6BFA4B1EAC29EC87CE9E3E08C458219FB6B719089AB6982F75 ACF33109F84FC1C7F0F542FB61F78587B7010265B411CCF63F00EE397C6C9D39 2E33E50B1182385C79773956ACCB5970A8758638FE8069401540EA209B2D5AFB 3B20D9B33A51EECF3D65F0DA2C2063BA2A2AE9164761FFB5D1D36F2E21F29F31 D2852443F8C6316545C9D413F64466CD7CB3D0DC23B5C282FF5E2F91B63B7486 83800E8CF3D07434DF16557AD530DDFEACF3CEDE34C7C4ABA3278E815297C7E1 DBCBA8FA4291D43F1D1AF0E35B0E09A2AC97F10A93AB9F2510BB690E3C635D2C 986179ACA326D19BB958BC60382A9E8C765A978A148CF02403C2C9866D78F05C 3DCD029540EDDFE623C9F016734B8BC19BDFB039BFF4FFF409DFF33F62508298 B152FE332127EEF6B236AD5C1EF9B145849788311477ACC365D9E5848626DB26 773F93F0C44AEA8B014A5A7125D09E28761A8720DA53966B251BE1C1534599F9 B246763A28D4F9E3C52C33670EE390FCCD476419FA1C4429B31C055EB8072D74 0C1FF3311293F931EA7F73A35E870F6D81D0FEA3CC445C841BED7089A64EA42D 947359421B7EBDB671E2E30306912EB99A754AE5BEC90783DBB14BB0FB3FBF95 25BF143F7C9D9D6DE690C88CFF219075D9F9698D23A5C428F7418DE625217393 0B79113E1D56E74ECE402015E0AA9FC320E447AE0345FF429359C48D617CC9B4 6FBF2F72C9DBC94794BD9584E23F757C49425E7665A1A97CCB278AF1016E4969 C813A40590E738E70C5B732537F477E9B80B3860B6FFD35A631DA0B6BC84E4A3 8C1576C9EE90FE2E5FFF30F1ADB9581C6296D442FE1D3B3526780C5F70F73E07 0233A3C769F74334BA6560ED81163307DC4AE74060B736C49BD83A837CCD7EF7 44EC891EA5828026982D9E56834A3663150A462939E6557A5AA30C47C4EAB037 589BC1710A9F042AC39006A5170B0DB0A952257D231498633D99B3D405C2A4CA D064E43E50ADABA18A80301460C2F17965C5EA3DA09A7C96274AA1915FA9E98F 059358763626AC7EDFAE84B026CC16BF40296FA76396148C57F5C0E219B759A9 33A46A922233E0AD0FC248DFEAD35B8B6EA330B97BFB4A6AA6DC27DF5082AFC1 C17A6DED72F61D0C7F4DE52A3AB13734E55A875946F6D36703BDF1B917A758B1 C1B4D00A52E890C43A7B8C0BF725F82FD416DC8EF9BB6E0487D7682F79DAAC6A C9595E33481A87C6CFED013243C5BF92AAF6D700006F608E30CF70FE9E9E0835 255F9ADC616A0218C7D4892B9188C61C801889291E17344448ED2D8C56095302 E71CBCA27D70DC38B8BDEBCD7109D47FC1B6E6399F07AC085BE592FF9B5E4960 02FDEF5F965785540CF412743E0C71126A68272CB23128133090E757249854BB 3F271F2DD8D7FA66985F9C380C104FC3A1A69A0CC03E2AE81E1EB3C7A2C3C297 BF91DD1A6E2B0D3798C3535717F8046E92EACDBBA1ABA7D68D08AD31AE673BD7 D10BCAF3324CC5A668199904ED903BC88746F2995ED2F5B1B49C73C34607C632 37FA574A1F09D9C42789077425B8153E8F7F36589B1EB8917C87FC29A5E97E14 3FAB4DA5EC20C38DE0CD0863683B58DA5C412A72C1BB8280A9236A1600BAC9E4 BB930318B55E3006E5371157B1E2567C9AC8FD1FE196AB8AA86EC2A27B5207F9 81AF2F85115BBF22287BD8A041DCEB89B3F5DAE811F1740D010C345F53FCC8C7 BA7C7D685ADB01AFDB0D30CE7CB0E3BA122B9C8FA4F2CF4C5BB5793439E57137 9D2E63B6132100B459F31D822AA742DBA61B8CDACE93DA530A66C034125344F2 DCAE69E08FE774A5E09B29466898ED616EAE3458478888DEAEE12B6C1E2B1228 A8A7C9AD6658D0BDA20DDFB0B4D831AC61CD216A60DE294C7408F7E34487487B B462888649DA65F548C6EDE671FF2967FE50331006EB5E3636EA8998384CFFFE 0CE6AE5DF4E49ACC5574C73223CA5904DABBF73437D55E2353AF9F7B17E33771 775F67FF5C53C5D45C40E60252F70ACBDDC054CB3867AF0BA7B01EFACB67933A 404D56C53520278826DC106956E120A34A7E2B9AFF2B46C2AB3E64FB38776E2C 456B5901398E5BEFC7CEFC35AA61E497CCEADE62360A0EE94D0273636A6CA4F8 F144CBA6697FE4707361E09ABBA371A5FB8D8FDD319ABEAB87A5C3AF9889AA70 B53E3C5A9565AC1A2F275EA303D579A0221004365CE864634BBBDBF5036CBE63 3B5358E8DDDF56C65BB54A9FDBA710A10F9E6C505A2D8D11A6A17551616EEAD5 679126F3C7D52B17EDF2AFE286454580A34F1BD963699F1AB742DF7CD9EE4D34 17DD8BA2497BEE1933B02EBED1161165924F04915D1A9D227B719AD876995D88 7C67DF53C14C7FABDC5B4D773CCF361BC58413765E7DD21A439E86B74795203E 24ED7491AE6C9FD9CF3310D3FD1E91FD3F714013722CA2B13DA3EAFC49A2506B 58B3B2984A1933CADDFDD10C628BEA54C798AA4E0A84FB4639494814FA18D79C 147BE5E688F182B901F9730DA6C8CF362F915F69CC74ED4B436E5DE3924D7DB1 6B4728BC39E8F9E0841865BFB0AEDCD7404D48ADE9EAE74F6C1E9FADE513539D 9056DF8B2F6168A86405EA4635C19E128DB67D6F7323BC14A983FF1CE808B4C1 F9226F3C6521310DED43A16EA768C8395E6584E90C5F24857BD989C1C6C2C248 06D4BCD3C2E271C7AF22210EC2A3EB1A73509082819760E2AE9950D761828F9C 0D1DE7B23A9DE64AC61F48D45956B5894815F0DE950FF02FD0A4E0355900C665 D1FE0B411D4E34B093E17AA8087B606AFE7B2E909AED96B799922953C8416148 7C3CF96E27365C3A4CCCD78849CD9D9D498D7747EB8AE8137B16178BB67B7B36 E41780DE90DC23072DB8916BC8C778B79215212719A88744DFF9AF40980996AF 379552BC08C8FFDF6605FEBF9B3CFB6D3D27D07C49554DE4844981DBF08A43A5 DDBC572CAAF60EF7F8C4137C38B057E1AD5D953FA64E6844EF770A9B19B7E643 F376273E028EDAA0729CD722C57F05023957F93B281F91510ACBD72F476572F8 B66681AFF60DE653F4C8BFFB5A9076447AA5676C08828D7C6AB803AE9063423E 3FC8F0E7DF5F8238EE36A7B8DBFBB88DFDD587D5C9133B69C6E4B86D4FE42886 F0BAA809350CC835274614E4DCFAB77A8AA83916E5B65351273A69E6F9B5DB39 205E3A62C2C4F483B3D8BB2C4C7C72E2ECB6E024A275DBD82F5A1A9ACEDEFF4B 9C5175BDE3DC023253026E5E321A0F5867654B8F11076CBD6D49F2A7A1F45420 9CDD551806DF00372B4D0426EF46BEA85816AB39246F38427431D513FEF9E143 64F3A06ED9F59F1F0C250C9C6D45FD2B6C69375E9E0B89A4478A5EC458E132FC 433E8A93D3497DAE9E1AA0AA7CA895B8AF67913CF0D13310DB883D388AE9A35F F5780A0AB6D55CD9B976014689C185E9455AB5B9697DBA8B9132C517133CEA4F CE40FC2BD4D9DE31A6A5F60E00C781F6763DC03DE8D159CA70048B8CF6D1EBB2 2BA6966CF523579CF5FE324AC1C7C12A50A8EE71A55B3A6078AC0EE02E877A02 18F886CAF9FB51F29D01E3F4AB961E5515454D05490F4C57AFFC4E63C0D1FFE6 C4BCEF8F67066A4284ADB88E569F0E7D36269A6A0DA678CAA5C1B1A4BDD3800D FA3E3624A3698300BE00884235A996F611644E19AF114AF29E045FF2E4BE248B 7BE9FB19B64B2DED77D5CFF8D85A332A33EF073BC94E30BD78AACE2B40C9E04E 1E88D9EF0F0116E27E9432D461B64FD5F4055EB420963FDA20CB8D746B6AFD30 4C70C4DD1AE440D04C6DE4F876BA09591D1A7F7F5755DB5DBDF1AF0FBB9744A7 051885F2F13400F77297D66BED2FB53CCE01B56A7B0F7A74DF38BBAC0BB556BC 9EF9F4FE429DFA89650BF6453FD1B6F472427FF2F91DFC218BA4690C55CD23FA C7E2B86EEEA984E0DF8ABE65813C6E9068B878F22467E7D981601238F82A43AE 4F61CD56ED2C3828D7DD53AF88655ED8E00FB33795EB13F5A166626D35A94AFA 3EA4331C79B44C8AD4E85E8A58248B83FF91BFB89C64CAE2AA2EEB95677B075E 3772681DF3F512E315C7266B9B6DD3C38619E8F0813451BF48660E137FC76714 F799E17380CDE5813B4B6217B0D0A7763A754065E2CE172EE6DA76FF5038C614 0050F3BC4DD98CFD8C0BF526ACA742F4B79B53708DD52EBE58B00CBAB52BE921 C131A671AD85BBCDE61B97CB147D9786EB2C01DB4425E827C3297F9886BA6354 C526D89B6B4629CF7DBC38AEF5D3EB58E92A7BBC14F796778BB3ACFC654E3CD6 9B0C5EB8B24C3279D46CCC0A3EEBAC870EFECBAB222233E62E76022E9C80C109 70517E245561033028135DE10E1BD8FA0BB9E5FC89AA5197CEE50A98EB778B63 BF0E7A97BF243FC8D6952C78192F19753BE77B576486D491344D4DC5172F9655 EC6D86C591840E8B90AB507C63A7942A88C5301C8E7C9AA2EB41BFDEBBF19DB8 A905B90FEBB86086E2E01600FB897AA3EB954761045B00DF247C796EBD4E8E18 41894D9F62E4C8551944FEF97BED212B29FF795A02979ABF453C0E83C00AA39B E95AFEFCEE23B58571795F0358912C7396AD8E05373E5DAC0F76AF1B7A5406CD 2D82ED5E0F014AD1512DC75D71DCD22443E7A071E27A52329A04A18E12E4191C 57DED26A8573ED0BBCF6417D993269E56241E45E05A61CE72C63252D908DBBB7 ADCABD21921CD36B6C2B1C4A5D8E6ED8F29B8F6AC9B8097F477AD77CE01C51BA 00BE8E44D5B3D3389E4ED09A7327763E7F50426CECA5424D243AA8BC7E7B5529 9D14434148B294C2441DD0A926B678211EFC6A48EFE84130BD4D15BBD2CF1388 B5EF11940CEF3CDD4AEE073AC131947B960D716973E63BB928977EEAD41B80E9 BF08B06F0F107B4DE2828FECF7370578FC116F03ED602FFCE688FA6D25E274D5 519B1EF07165FDB10CB32D3748C33CFB601C98D17F274887B554A596FA9B3C3E 63A7C426779220BF013EFA2B30448FD9B20790F87A069E0704A1EB4188A4298D 6A7ECAABF7F0454E3E7EB98650C2BB14D2B08F2265B439FB20C74BD93007DA70 EC6C445351BD0607997666DA0A56A186859237F9BCCE4F4E594BC8A81E6E22EE 5A58C7B349DDCF0F753B3DEF9484B841DD1428881B625A4E28CE54CF896711C9 4D380F508081C26CC9090E09C9C6BA12FAECD7074E2549779CB6FB88EB1368A6 F709F6A2CECFFC5CCF48CA2985BFB1CE3E0FA2CF5C3B0F612869171F3649ABE0 20837D908FF436B01AB54EE132A8F0D0ABB4C1015FE6ED45575B1573AA3F9D64 66B521470DCD5C73ADBDA46E86D6EC5667D2AEEB5F7938F42018E1541822E475 B11180512375AE63EC7BB000883043513928140A23CBB26658A6B0521F8B8DBE 2007353A924E762BD8DD3AD901D81DBADAA3DF3C2ED5AA2163167AEBD049390A F4459FAD558F3FBB3B805EB1EF332FB14F0C677FF9CFF7831F203383DE4CE7BB 8CBA629180AFF36228D3997BFC97E051F2390791B6F5AC0B5AF929107EF3CEF3 00894DE1693653C33B012583EC5FAED006BF9410510A709594D34E558DF5290C 4A36633EA935D67A351630E6F75FCCFEC361A8298DD7C9DA2326C8EF247481EF 20B8C91013AD02613FB321DC00C7B9EF87ED8AF212D769C0EC1D8F116950A60F 3FB2273E4EB993A8CFD3787C86AAF54CE86DD44A9A652307B7EF8BDFF73942DF F52AE037D5D9FAD5E2D673F4346921B642EADD945164F8B8116C24D7A5EF8845 0D1199AA2D6C6346075E1FEA51B351F6688DB0F9D3DA6489C34C9E1493038281 D5929568721CF3A309C21FACDB7B4AC9BE329935446212E060629507D78CE8C4 C5BA819D284C6AEEFD81CFF819A14C445BA6DFC9549CAAD4CF56FFB4FFD46716 C60DA7F437EC08CEA0FD4711D745892ECC7AC2FD5422CB464D42977F991BC3DF 52E26CCF63B0A0D73AF537712F551DF4C8A9EB5837C6CD11119603EE13228E6E 3326A8A9484B9FBEF42D121304FD19581085459FE250BB3CFF7B689EE65EFAF9 9CB50E6DF0DE0F2785EDA4C7B9E7AA036CAD799C8451C72C8387EE5BB933851F ABE54FD373AAA654DF7B5646427BB0165303DA86B8A778F4FAB052928B6ED9F6 083D9DFFC0FBADB4BA284BF9E3D0F45337EE4E52138044E8D2D9B09D1B3BF028 C9EAFE1E2D352CF101B1CB1546A455C3264E951519FEE78C35BACB2A4103D5F4 78A555C6E7B706E40B55115364E3690C7A7632B74CAC15C54D97662DAB2E7549 777A7D0F70F1D20C5DB19E77FF69AEEE8DDCC120783D327817D3BA0E2BB98D02 123CFF3299A4475153DD03AC6ECCD53B7395EF1BBD235E4E635BD925B46E5E9E DD4E3818F1092525B84F504450523420B40140F7AB6FBC8441779B724B371939 CBBC534E8AD2EAD3561DFAE319F1455D8F4D6F9A20A73A79FCAA449F067A1AAC 90D25E25BE199A9AB789D2B130605CB19CD2F3D97130B38B6B493DF57325B885 467EAF56A17FB05542CD9567B0E04E291EE8E9E19ED3EAEC6FB270FA3F477B65 4B60FD0A5A0ECE6D822290233D2FD6D0ED1BBBD82E5F0222A18417773597F999 D3619B41BDEDC612072E87FBEF1ACECF313C297F4D6B27837C60FD840353C902 31CE101BFB0B80450E991D466C0D33093450F373EF24A82EDCED7B9D0BD658FB 8C7422C078FFE08CACA51E7C14795759B2F8A100D042FA3BDA944E6412659973 4037B9A540A20DABC38FB0F6A346E50E04D530115AC770669BF34FD88238EF5F A80C403CDA940AE1CA5213E8A06E387EEF3C7D4941D634C3B3BBEB133BABEFD4 28D3FDB15075E1A6626F90303D4E3DD558B910308D9CF699AD02DB06629C894E B09D7EDDB076FBC42ECBC07B8C248F653BA031FBAE56D61762B48ECC3DE15CF8 7FD07380AA03FA30DB29CED313D5EC2F8C21F74A337E76C097AF48463869D0A7 20F46A5FE98359236E7DEBF231916B70AFC44E201F13215D4C0A017EA43ACA63 F86A6458D0AA360E451DC4E3F864F33ACC0D5187DA632DCBEACF296C6C85A42B A31E58EFD9F8B19893B59525B1DAEC780A71CA6FD27CA22C23733382E6D46689 9AB673C87D7C6302C34FABC19B4BD25CAF910BA2A2957DC98917CA2BFB27636C 80F2A056CFDC2CB868CDA68F342AAC19538BA177B228B3736D6050298F868F8A E9F0 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark xdvik-ja-22.84.16-j1.40/libs/t1lib/version.ac0000664000175000017500000000065711742726711020041 0ustar uwabamiuwabamidnl dnl Copyright (C) 2011 Peter Breitenlohner dnl dnl This file is free software; the copyright holder dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl -------------------------------------------------------- dnl dnl m4-include this file to define the current t1lib version m4_define([t1lib_version], [5.1.2]) xdvik-ja-22.84.16-j1.40/libs/t1lib/type1afm.test0000775000175000017500000000063111742726711020471 0ustar uwabamiuwabami#! /bin/sh # Copyright (C) 2009 Peter Breitenlohner # You may freely use, modify and/or distribute this file. rm -f l047016t.afm x047016t.afm test -f x047016t.pfa \ || cp $srcdir/l047016t.pfa x047016t.pfa \ || exit 1 ./type1afm ./x047016t.pfa || exit 1 sed -e '/^Comment File creation date:/d' x047016t.afm >l047016t.afmx \ && diff l047016t.afmx $srcdir/l047016t.xafm \ || exit 1 xdvik-ja-22.84.16-j1.40/libs/t1lib/README0000664000175000017500000000106611742726711016722 0ustar uwabamiuwabami Building t1lib-5.1.2 as part of the TL tree ============================================= This directory libs/t1lib/ uses a proxy Makefile.am to build the t1lib library from the unmodified(*) source tree in libs/t1lib/t1lib-x.y.z/, bypassing the original build system. As far as applicable, the tests in libs/t1lib-x.y.z/configure.in have been copied to libs/t1lib/configure.ac. ----------------------------- (*) almost unmodified, the file lib/t1lib/t1lib.h has been removed! ============================= 2009-02-05 Peter Breitenlohner xdvik-ja-22.84.16-j1.40/libs/t1lib/configure.ac0000664000175000017500000000754211742726711020335 0ustar uwabamiuwabamidnl Process this file with autoconf to produce a configure script. dnl dnl Copyright (C) 2009, 2011 Peter Breitenlohner dnl dnl This file is free software; the copyright holder dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl m4_include([version.ac])[] dnl define t1lib_version AC_INIT([T1lib for TeX Live], t1lib_version, [tex-k@tug.org]) AC_PREREQ([2.65]) AC_CONFIG_SRCDIR([t1lib-]t1lib_version[/lib/t1lib/t1base.c]) AC_CONFIG_AUX_DIR([../../build-aux]) AC_CONFIG_MACRO_DIR([../../m4]) AM_INIT_AUTOMAKE([foreign no-define]) AM_MAINTAINER_MODE KPSE_LIB_VERSION([t1lib])[]dnl AC_SUBST([T1LIB_VERSION], [t1lib_major])[]dnl AC_SUBST([T1LIB_REVISION], [t1lib_minor])[]dnl AC_SUBST([T1LIB_PATCHLEVEL], [t1lib_micro])[]dnl AC_SUBST([T1LIB_VERSIONSTRING], '"t1lib_version"') AC_CONFIG_HEADERS([lib/t1lib/sysconf.h]) AM_CONDITIONAL([build], [test "x$enable_build" != xno]) dnl **** Check for some programs and libraries **** AC_PROG_CC AC_PROG_RANLIB KPSE_COMPILER_WARNINGS AC_SEARCH_LIBS([sqrt], [m]) dnl **** Check for some compiler/system characteristics AC_C_CHAR_UNSIGNED AC_CHECK_SIZEOF([char]) AC_CHECK_SIZEOF([short]) AC_CHECK_SIZEOF([int]) AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([long long]) AC_CHECK_SIZEOF([float]) AC_CHECK_SIZEOF([double]) AC_CHECK_SIZEOF([long double]) AC_CHECK_SIZEOF([void *]) dnl **** Check for gcc strength-reduce bug **** T1LIB_CFLAGS= if test "x$GCC" = xyes; then AC_CACHE_CHECK([for gcc strength-reduce bug], [ac_cv_c_gcc_strength_bug], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[]], [[static int Array[3]; unsigned int B = 3; int i; for(i=0; i ## ## This file is free software; the copyright holder ## gives unlimited permission to copy and/or distribute it, ## with or without modifications, as long as this notice is preserved. ## ACLOCAL_AMFLAGS = -I ../../m4 # Rebuild .PHONY: rebuild rebuild: all ## We want to re-distribute the whole original t1lib source tree. ## ## With current automake (1.10.2) 'make distcheck' fails when ## DISTFILES contains a directory and files in that directory. ## Thus nodist_* for all files in $(T1LIB_TREE). EXTRA_DIST = $(T1LIB_TREE) ## Changes applied to the original source tree ## EXTRA_DIST += $(T1LIB_TREE)-PATCHES # in case of an SVN repository dist-hook: rm -rf `find $(distdir) -name .svn` rm -f $(distdir)/$(T1LIB_TREE)/ac-tools/config.guess \ $(distdir)/$(T1LIB_TREE)/ac-tools/config.sub \ $(distdir)/$(T1LIB_TREE)/ac-tools/install-sh \ $(distdir)/$(T1LIB_TREE)/ac-tools/ltmain.sh \ $(distdir)/$(T1LIB_TREE)/ac-tools/mkinstalldirs \ $(distdir)/$(T1LIB_TREE)/lib/t1lib/t1lib.h INCLUDES = -Ilib -I$(top_srcdir)/$(T1LIB_TREE) AM_CPPFLAGS = $(T1LIB_DEFINES) AM_CPPFLAGS += -DT1LIB_IDENT=\"@T1LIB_VERSIONSTRING@\" AM_CPPFLAGS += -DGLOBAL_CONFIG_DIR=\"@T1LIB_DATA_DIR@\" AM_CFLAGS = $(T1LIB_CFLAGS) # $(WARNING_CFLAGS) LDADD = libt1.a noinst_LIBRARIES = libt1.a nodist_libt1_a_SOURCES = $(lib_t1lib_sources) $(lib_type1_sources) lib_t1lib_sources = \ $(T1LIB_TREE)/lib/t1lib/parseAFM.c \ $(T1LIB_TREE)/lib/t1lib/parseAFM.h \ $(T1LIB_TREE)/lib/t1lib/t1aaset.c \ $(T1LIB_TREE)/lib/t1lib/t1aaset.h \ $(T1LIB_TREE)/lib/t1lib/t1afmtool.c \ $(T1LIB_TREE)/lib/t1lib/t1afmtool.h \ $(T1LIB_TREE)/lib/t1lib/t1base.c \ $(T1LIB_TREE)/lib/t1lib/t1base.h \ $(T1LIB_TREE)/lib/t1lib/t1delete.c \ $(T1LIB_TREE)/lib/t1lib/t1delete.h \ $(T1LIB_TREE)/lib/t1lib/t1enc.c \ $(T1LIB_TREE)/lib/t1lib/t1enc.h \ $(T1LIB_TREE)/lib/t1lib/t1env.c \ $(T1LIB_TREE)/lib/t1lib/t1env.h \ $(T1LIB_TREE)/lib/t1lib/t1extern.h \ $(T1LIB_TREE)/lib/t1lib/t1finfo.c \ $(T1LIB_TREE)/lib/t1lib/t1finfo.h \ $(T1LIB_TREE)/lib/t1lib/t1global.h \ $(T1LIB_TREE)/lib/t1lib/t1load.c \ $(T1LIB_TREE)/lib/t1lib/t1load.h \ $(T1LIB_TREE)/lib/t1lib/t1misc.h \ $(T1LIB_TREE)/lib/t1lib/t1outline.c \ $(T1LIB_TREE)/lib/t1lib/t1outline.h \ $(T1LIB_TREE)/lib/t1lib/t1set.c \ $(T1LIB_TREE)/lib/t1lib/t1set.h \ $(T1LIB_TREE)/lib/t1lib/t1subset.c \ $(T1LIB_TREE)/lib/t1lib/t1subset.h \ $(T1LIB_TREE)/lib/t1lib/t1trans.c \ $(T1LIB_TREE)/lib/t1lib/t1trans.h \ $(T1LIB_TREE)/lib/t1lib/t1types.h lib_t1lib_generated = \ lib/t1lib/sysconf.h \ lib/t1lib/t1lib.h lib_t1lib_unused = \ $(T1LIB_TREE)/lib/t1lib/t1libx.h \ $(T1LIB_TREE)/lib/t1lib/t1x11.c \ $(T1LIB_TREE)/lib/t1lib/t1x11.h \ $(T1LIB_TREE)/lib/type1/t1intf.h lib_type1_sources = \ $(T1LIB_TREE)/lib/type1/Xstuff.h \ $(T1LIB_TREE)/lib/type1/arith.c \ $(T1LIB_TREE)/lib/type1/arith.h \ $(T1LIB_TREE)/lib/type1/blues.h \ $(T1LIB_TREE)/lib/type1/cluts.h \ $(T1LIB_TREE)/lib/type1/curves.c \ $(T1LIB_TREE)/lib/type1/curves.h \ $(T1LIB_TREE)/lib/type1/digit.h \ $(T1LIB_TREE)/lib/type1/ffilest.h \ $(T1LIB_TREE)/lib/type1/font.h \ $(T1LIB_TREE)/lib/type1/fontfcn.c \ $(T1LIB_TREE)/lib/type1/fontfcn.h \ $(T1LIB_TREE)/lib/type1/fontfile.h \ $(T1LIB_TREE)/lib/type1/fontmisc.h \ $(T1LIB_TREE)/lib/type1/fonts.h \ $(T1LIB_TREE)/lib/type1/fontstruct.h \ $(T1LIB_TREE)/lib/type1/fontxlfd.h \ $(T1LIB_TREE)/lib/type1/fsmasks.h \ $(T1LIB_TREE)/lib/type1/hdigit.h \ $(T1LIB_TREE)/lib/type1/hints.c \ $(T1LIB_TREE)/lib/type1/hints.h \ $(T1LIB_TREE)/lib/type1/lines.c \ $(T1LIB_TREE)/lib/type1/lines.h \ $(T1LIB_TREE)/lib/type1/objects.c \ $(T1LIB_TREE)/lib/type1/objects.h \ $(T1LIB_TREE)/lib/type1/paths.c \ $(T1LIB_TREE)/lib/type1/paths.h \ $(T1LIB_TREE)/lib/type1/paths_rmz.h \ $(T1LIB_TREE)/lib/type1/pictures.h \ $(T1LIB_TREE)/lib/type1/regions.c \ $(T1LIB_TREE)/lib/type1/regions.h \ $(T1LIB_TREE)/lib/type1/scanfont.c \ $(T1LIB_TREE)/lib/type1/spaces.c \ $(T1LIB_TREE)/lib/type1/spaces.h \ $(T1LIB_TREE)/lib/type1/spaces_rmz.h \ $(T1LIB_TREE)/lib/type1/strokes.h \ $(T1LIB_TREE)/lib/type1/t1hdigit.h \ $(T1LIB_TREE)/lib/type1/t1imager.h \ $(T1LIB_TREE)/lib/type1/t1io.c \ $(T1LIB_TREE)/lib/type1/t1snap.c \ $(T1LIB_TREE)/lib/type1/t1stdio.h \ $(T1LIB_TREE)/lib/type1/t1stub.c \ $(T1LIB_TREE)/lib/type1/token.c \ $(T1LIB_TREE)/lib/type1/token.h \ $(T1LIB_TREE)/lib/type1/tokst.h \ $(T1LIB_TREE)/lib/type1/trig.h \ $(T1LIB_TREE)/lib/type1/type1.c \ $(T1LIB_TREE)/lib/type1/types.h \ $(T1LIB_TREE)/lib/type1/util.c \ $(T1LIB_TREE)/lib/type1/util.h lib_type1_unused = \ $(T1LIB_TREE)/lib/type1/bstring.c \ $(T1LIB_TREE)/lib/type1/t1intf.h if build check_PROGRAMS = type1afm dist_check_SCRIPTS = type1afm.test TESTS = type1afm.test endif build nodist_type1afm_SOURCES = $(T1LIB_TREE)/type1afm/type1afm.c EXTRA_DIST += l047016t.pfa l047016t.xafm CLEANFILES = l047016t.afmx x047016t.afm x047016t.pfa xdvik-ja-22.84.16-j1.40/libs/t1lib/Makefile.in0000664000175000017500000025037311742727603020117 0ustar uwabamiuwabami# Makefile.in generated by automake 1.11.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : @build_TRUE@check_PROGRAMS = type1afm$(EXEEXT) subdir = . DIST_COMMON = README $(am__configure_deps) \ $(am__dist_check_SCRIPTS_DIST) \ $(srcdir)/../../build-aux/depcomp \ $(srcdir)/../../build-aux/install-sh \ $(srcdir)/../../build-aux/missing $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure \ $(top_srcdir)/lib/t1lib/sysconf.h.in \ ../../build-aux/config.guess ../../build-aux/config.sub \ ../../build-aux/depcomp ../../build-aux/install-sh \ ../../build-aux/ltmain.sh ../../build-aux/missing \ ../../build-aux/texinfo.tex ../../build-aux/ylwrap ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/../../m4/kpse-lib-version.m4 \ $(top_srcdir)/../../m4/kpse-warnings.m4 \ $(top_srcdir)/version.ac $(top_srcdir)/configure.ac 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 = $(top_builddir)/lib/t1lib/sysconf.h CONFIG_CLEAN_FILES = lib/t1lib/t1lib.h t1lib.h CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libt1_a_AR = $(AR) $(ARFLAGS) libt1_a_LIBADD = am__objects_1 = parseAFM.$(OBJEXT) t1aaset.$(OBJEXT) \ t1afmtool.$(OBJEXT) t1base.$(OBJEXT) t1delete.$(OBJEXT) \ t1enc.$(OBJEXT) t1env.$(OBJEXT) t1finfo.$(OBJEXT) \ t1load.$(OBJEXT) t1outline.$(OBJEXT) t1set.$(OBJEXT) \ t1subset.$(OBJEXT) t1trans.$(OBJEXT) am__objects_2 = arith.$(OBJEXT) curves.$(OBJEXT) fontfcn.$(OBJEXT) \ hints.$(OBJEXT) lines.$(OBJEXT) objects.$(OBJEXT) \ paths.$(OBJEXT) regions.$(OBJEXT) scanfont.$(OBJEXT) \ spaces.$(OBJEXT) t1io.$(OBJEXT) t1snap.$(OBJEXT) \ t1stub.$(OBJEXT) token.$(OBJEXT) type1.$(OBJEXT) \ util.$(OBJEXT) nodist_libt1_a_OBJECTS = $(am__objects_1) $(am__objects_2) libt1_a_OBJECTS = $(nodist_libt1_a_OBJECTS) nodist_type1afm_OBJECTS = type1afm.$(OBJEXT) type1afm_OBJECTS = $(nodist_type1afm_OBJECTS) type1afm_LDADD = $(LDADD) type1afm_DEPENDENCIES = libt1.a am__dist_check_SCRIPTS_DIST = type1afm.test DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/lib/t1lib depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(nodist_libt1_a_SOURCES) $(nodist_type1afm_SOURCES) DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ 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@ MAINT = @MAINT@ 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@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ T1LIB_CFLAGS = @T1LIB_CFLAGS@ T1LIB_DATA_DIR = @T1LIB_DATA_DIR@ T1LIB_DEFINES = @T1LIB_DEFINES@ T1LIB_PATCHLEVEL = @T1LIB_PATCHLEVEL@ T1LIB_REVISION = @T1LIB_REVISION@ T1LIB_TREE = @T1LIB_TREE@ T1LIB_VERSION = @T1LIB_VERSION@ T1LIB_VERSIONSTRING = @T1LIB_VERSIONSTRING@ T1_INT16 = @T1_INT16@ T1_INT32 = @T1_INT32@ VERSION = @VERSION@ WARNING_CFLAGS = @WARNING_CFLAGS@ 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@ 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@ ACLOCAL_AMFLAGS = -I ../../m4 EXTRA_DIST = $(T1LIB_TREE) $(T1LIB_TREE)-PATCHES l047016t.pfa \ l047016t.xafm INCLUDES = -Ilib -I$(top_srcdir)/$(T1LIB_TREE) AM_CPPFLAGS = $(T1LIB_DEFINES) -DT1LIB_IDENT=\"@T1LIB_VERSIONSTRING@\" \ -DGLOBAL_CONFIG_DIR=\"@T1LIB_DATA_DIR@\" AM_CFLAGS = $(T1LIB_CFLAGS) # $(WARNING_CFLAGS) LDADD = libt1.a noinst_LIBRARIES = libt1.a nodist_libt1_a_SOURCES = $(lib_t1lib_sources) $(lib_type1_sources) lib_t1lib_sources = \ $(T1LIB_TREE)/lib/t1lib/parseAFM.c \ $(T1LIB_TREE)/lib/t1lib/parseAFM.h \ $(T1LIB_TREE)/lib/t1lib/t1aaset.c \ $(T1LIB_TREE)/lib/t1lib/t1aaset.h \ $(T1LIB_TREE)/lib/t1lib/t1afmtool.c \ $(T1LIB_TREE)/lib/t1lib/t1afmtool.h \ $(T1LIB_TREE)/lib/t1lib/t1base.c \ $(T1LIB_TREE)/lib/t1lib/t1base.h \ $(T1LIB_TREE)/lib/t1lib/t1delete.c \ $(T1LIB_TREE)/lib/t1lib/t1delete.h \ $(T1LIB_TREE)/lib/t1lib/t1enc.c \ $(T1LIB_TREE)/lib/t1lib/t1enc.h \ $(T1LIB_TREE)/lib/t1lib/t1env.c \ $(T1LIB_TREE)/lib/t1lib/t1env.h \ $(T1LIB_TREE)/lib/t1lib/t1extern.h \ $(T1LIB_TREE)/lib/t1lib/t1finfo.c \ $(T1LIB_TREE)/lib/t1lib/t1finfo.h \ $(T1LIB_TREE)/lib/t1lib/t1global.h \ $(T1LIB_TREE)/lib/t1lib/t1load.c \ $(T1LIB_TREE)/lib/t1lib/t1load.h \ $(T1LIB_TREE)/lib/t1lib/t1misc.h \ $(T1LIB_TREE)/lib/t1lib/t1outline.c \ $(T1LIB_TREE)/lib/t1lib/t1outline.h \ $(T1LIB_TREE)/lib/t1lib/t1set.c \ $(T1LIB_TREE)/lib/t1lib/t1set.h \ $(T1LIB_TREE)/lib/t1lib/t1subset.c \ $(T1LIB_TREE)/lib/t1lib/t1subset.h \ $(T1LIB_TREE)/lib/t1lib/t1trans.c \ $(T1LIB_TREE)/lib/t1lib/t1trans.h \ $(T1LIB_TREE)/lib/t1lib/t1types.h lib_t1lib_generated = \ lib/t1lib/sysconf.h \ lib/t1lib/t1lib.h lib_t1lib_unused = \ $(T1LIB_TREE)/lib/t1lib/t1libx.h \ $(T1LIB_TREE)/lib/t1lib/t1x11.c \ $(T1LIB_TREE)/lib/t1lib/t1x11.h \ $(T1LIB_TREE)/lib/type1/t1intf.h lib_type1_sources = \ $(T1LIB_TREE)/lib/type1/Xstuff.h \ $(T1LIB_TREE)/lib/type1/arith.c \ $(T1LIB_TREE)/lib/type1/arith.h \ $(T1LIB_TREE)/lib/type1/blues.h \ $(T1LIB_TREE)/lib/type1/cluts.h \ $(T1LIB_TREE)/lib/type1/curves.c \ $(T1LIB_TREE)/lib/type1/curves.h \ $(T1LIB_TREE)/lib/type1/digit.h \ $(T1LIB_TREE)/lib/type1/ffilest.h \ $(T1LIB_TREE)/lib/type1/font.h \ $(T1LIB_TREE)/lib/type1/fontfcn.c \ $(T1LIB_TREE)/lib/type1/fontfcn.h \ $(T1LIB_TREE)/lib/type1/fontfile.h \ $(T1LIB_TREE)/lib/type1/fontmisc.h \ $(T1LIB_TREE)/lib/type1/fonts.h \ $(T1LIB_TREE)/lib/type1/fontstruct.h \ $(T1LIB_TREE)/lib/type1/fontxlfd.h \ $(T1LIB_TREE)/lib/type1/fsmasks.h \ $(T1LIB_TREE)/lib/type1/hdigit.h \ $(T1LIB_TREE)/lib/type1/hints.c \ $(T1LIB_TREE)/lib/type1/hints.h \ $(T1LIB_TREE)/lib/type1/lines.c \ $(T1LIB_TREE)/lib/type1/lines.h \ $(T1LIB_TREE)/lib/type1/objects.c \ $(T1LIB_TREE)/lib/type1/objects.h \ $(T1LIB_TREE)/lib/type1/paths.c \ $(T1LIB_TREE)/lib/type1/paths.h \ $(T1LIB_TREE)/lib/type1/paths_rmz.h \ $(T1LIB_TREE)/lib/type1/pictures.h \ $(T1LIB_TREE)/lib/type1/regions.c \ $(T1LIB_TREE)/lib/type1/regions.h \ $(T1LIB_TREE)/lib/type1/scanfont.c \ $(T1LIB_TREE)/lib/type1/spaces.c \ $(T1LIB_TREE)/lib/type1/spaces.h \ $(T1LIB_TREE)/lib/type1/spaces_rmz.h \ $(T1LIB_TREE)/lib/type1/strokes.h \ $(T1LIB_TREE)/lib/type1/t1hdigit.h \ $(T1LIB_TREE)/lib/type1/t1imager.h \ $(T1LIB_TREE)/lib/type1/t1io.c \ $(T1LIB_TREE)/lib/type1/t1snap.c \ $(T1LIB_TREE)/lib/type1/t1stdio.h \ $(T1LIB_TREE)/lib/type1/t1stub.c \ $(T1LIB_TREE)/lib/type1/token.c \ $(T1LIB_TREE)/lib/type1/token.h \ $(T1LIB_TREE)/lib/type1/tokst.h \ $(T1LIB_TREE)/lib/type1/trig.h \ $(T1LIB_TREE)/lib/type1/type1.c \ $(T1LIB_TREE)/lib/type1/types.h \ $(T1LIB_TREE)/lib/type1/util.c \ $(T1LIB_TREE)/lib/type1/util.h lib_type1_unused = \ $(T1LIB_TREE)/lib/type1/bstring.c \ $(T1LIB_TREE)/lib/type1/t1intf.h @build_TRUE@dist_check_SCRIPTS = type1afm.test @build_TRUE@TESTS = type1afm.test nodist_type1afm_SOURCES = $(T1LIB_TREE)/type1afm/type1afm.c CLEANFILES = l047016t.afmx x047016t.afm x047016t.pfa all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): lib/t1lib/sysconf.h: lib/t1lib/stamp-h1 @if test ! -f $@; then rm -f lib/t1lib/stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) lib/t1lib/stamp-h1; else :; fi lib/t1lib/stamp-h1: $(top_srcdir)/lib/t1lib/sysconf.h.in $(top_builddir)/config.status @rm -f lib/t1lib/stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status lib/t1lib/sysconf.h $(top_srcdir)/lib/t1lib/sysconf.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f lib/t1lib/stamp-h1 touch $@ distclean-hdr: -rm -f lib/t1lib/sysconf.h lib/t1lib/stamp-h1 lib/t1lib/t1lib.h: $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $@ clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libt1.a: $(libt1_a_OBJECTS) $(libt1_a_DEPENDENCIES) $(EXTRA_libt1_a_DEPENDENCIES) -rm -f libt1.a $(libt1_a_AR) libt1.a $(libt1_a_OBJECTS) $(libt1_a_LIBADD) $(RANLIB) libt1.a clean-checkPROGRAMS: -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) type1afm$(EXEEXT): $(type1afm_OBJECTS) $(type1afm_DEPENDENCIES) $(EXTRA_type1afm_DEPENDENCIES) @rm -f type1afm$(EXEEXT) $(LINK) $(type1afm_OBJECTS) $(type1afm_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arith.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curves.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fontfcn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hints.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lines.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/objects.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseAFM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paths.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scanfont.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spaces.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1aaset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1afmtool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1base.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1delete.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1enc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1env.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1finfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1load.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1outline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1set.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1snap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1stub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1subset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1trans.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/token.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/type1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/type1afm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` parseAFM.o: $(T1LIB_TREE)/lib/t1lib/parseAFM.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parseAFM.o -MD -MP -MF $(DEPDIR)/parseAFM.Tpo -c -o parseAFM.o `test -f '$(T1LIB_TREE)/lib/t1lib/parseAFM.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/parseAFM.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/parseAFM.Tpo $(DEPDIR)/parseAFM.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/parseAFM.c' object='parseAFM.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parseAFM.o `test -f '$(T1LIB_TREE)/lib/t1lib/parseAFM.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/parseAFM.c parseAFM.obj: $(T1LIB_TREE)/lib/t1lib/parseAFM.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parseAFM.obj -MD -MP -MF $(DEPDIR)/parseAFM.Tpo -c -o parseAFM.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/parseAFM.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/parseAFM.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/parseAFM.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/parseAFM.Tpo $(DEPDIR)/parseAFM.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/parseAFM.c' object='parseAFM.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parseAFM.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/parseAFM.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/parseAFM.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/parseAFM.c'; fi` t1aaset.o: $(T1LIB_TREE)/lib/t1lib/t1aaset.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1aaset.o -MD -MP -MF $(DEPDIR)/t1aaset.Tpo -c -o t1aaset.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1aaset.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1aaset.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1aaset.Tpo $(DEPDIR)/t1aaset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1aaset.c' object='t1aaset.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1aaset.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1aaset.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1aaset.c t1aaset.obj: $(T1LIB_TREE)/lib/t1lib/t1aaset.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1aaset.obj -MD -MP -MF $(DEPDIR)/t1aaset.Tpo -c -o t1aaset.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1aaset.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1aaset.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1aaset.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1aaset.Tpo $(DEPDIR)/t1aaset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1aaset.c' object='t1aaset.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1aaset.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1aaset.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1aaset.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1aaset.c'; fi` t1afmtool.o: $(T1LIB_TREE)/lib/t1lib/t1afmtool.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1afmtool.o -MD -MP -MF $(DEPDIR)/t1afmtool.Tpo -c -o t1afmtool.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1afmtool.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1afmtool.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1afmtool.Tpo $(DEPDIR)/t1afmtool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1afmtool.c' object='t1afmtool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1afmtool.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1afmtool.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1afmtool.c t1afmtool.obj: $(T1LIB_TREE)/lib/t1lib/t1afmtool.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1afmtool.obj -MD -MP -MF $(DEPDIR)/t1afmtool.Tpo -c -o t1afmtool.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1afmtool.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1afmtool.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1afmtool.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1afmtool.Tpo $(DEPDIR)/t1afmtool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1afmtool.c' object='t1afmtool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1afmtool.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1afmtool.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1afmtool.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1afmtool.c'; fi` t1base.o: $(T1LIB_TREE)/lib/t1lib/t1base.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1base.o -MD -MP -MF $(DEPDIR)/t1base.Tpo -c -o t1base.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1base.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1base.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1base.Tpo $(DEPDIR)/t1base.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1base.c' object='t1base.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1base.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1base.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1base.c t1base.obj: $(T1LIB_TREE)/lib/t1lib/t1base.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1base.obj -MD -MP -MF $(DEPDIR)/t1base.Tpo -c -o t1base.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1base.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1base.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1base.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1base.Tpo $(DEPDIR)/t1base.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1base.c' object='t1base.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1base.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1base.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1base.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1base.c'; fi` t1delete.o: $(T1LIB_TREE)/lib/t1lib/t1delete.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1delete.o -MD -MP -MF $(DEPDIR)/t1delete.Tpo -c -o t1delete.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1delete.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1delete.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1delete.Tpo $(DEPDIR)/t1delete.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1delete.c' object='t1delete.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1delete.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1delete.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1delete.c t1delete.obj: $(T1LIB_TREE)/lib/t1lib/t1delete.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1delete.obj -MD -MP -MF $(DEPDIR)/t1delete.Tpo -c -o t1delete.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1delete.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1delete.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1delete.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1delete.Tpo $(DEPDIR)/t1delete.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1delete.c' object='t1delete.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1delete.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1delete.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1delete.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1delete.c'; fi` t1enc.o: $(T1LIB_TREE)/lib/t1lib/t1enc.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1enc.o -MD -MP -MF $(DEPDIR)/t1enc.Tpo -c -o t1enc.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1enc.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1enc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1enc.Tpo $(DEPDIR)/t1enc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1enc.c' object='t1enc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1enc.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1enc.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1enc.c t1enc.obj: $(T1LIB_TREE)/lib/t1lib/t1enc.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1enc.obj -MD -MP -MF $(DEPDIR)/t1enc.Tpo -c -o t1enc.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1enc.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1enc.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1enc.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1enc.Tpo $(DEPDIR)/t1enc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1enc.c' object='t1enc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1enc.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1enc.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1enc.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1enc.c'; fi` t1env.o: $(T1LIB_TREE)/lib/t1lib/t1env.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1env.o -MD -MP -MF $(DEPDIR)/t1env.Tpo -c -o t1env.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1env.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1env.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1env.Tpo $(DEPDIR)/t1env.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1env.c' object='t1env.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1env.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1env.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1env.c t1env.obj: $(T1LIB_TREE)/lib/t1lib/t1env.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1env.obj -MD -MP -MF $(DEPDIR)/t1env.Tpo -c -o t1env.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1env.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1env.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1env.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1env.Tpo $(DEPDIR)/t1env.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1env.c' object='t1env.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1env.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1env.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1env.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1env.c'; fi` t1finfo.o: $(T1LIB_TREE)/lib/t1lib/t1finfo.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1finfo.o -MD -MP -MF $(DEPDIR)/t1finfo.Tpo -c -o t1finfo.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1finfo.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1finfo.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1finfo.Tpo $(DEPDIR)/t1finfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1finfo.c' object='t1finfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1finfo.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1finfo.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1finfo.c t1finfo.obj: $(T1LIB_TREE)/lib/t1lib/t1finfo.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1finfo.obj -MD -MP -MF $(DEPDIR)/t1finfo.Tpo -c -o t1finfo.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1finfo.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1finfo.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1finfo.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1finfo.Tpo $(DEPDIR)/t1finfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1finfo.c' object='t1finfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1finfo.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1finfo.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1finfo.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1finfo.c'; fi` t1load.o: $(T1LIB_TREE)/lib/t1lib/t1load.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1load.o -MD -MP -MF $(DEPDIR)/t1load.Tpo -c -o t1load.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1load.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1load.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1load.Tpo $(DEPDIR)/t1load.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1load.c' object='t1load.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1load.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1load.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1load.c t1load.obj: $(T1LIB_TREE)/lib/t1lib/t1load.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1load.obj -MD -MP -MF $(DEPDIR)/t1load.Tpo -c -o t1load.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1load.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1load.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1load.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1load.Tpo $(DEPDIR)/t1load.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1load.c' object='t1load.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1load.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1load.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1load.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1load.c'; fi` t1outline.o: $(T1LIB_TREE)/lib/t1lib/t1outline.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1outline.o -MD -MP -MF $(DEPDIR)/t1outline.Tpo -c -o t1outline.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1outline.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1outline.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1outline.Tpo $(DEPDIR)/t1outline.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1outline.c' object='t1outline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1outline.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1outline.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1outline.c t1outline.obj: $(T1LIB_TREE)/lib/t1lib/t1outline.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1outline.obj -MD -MP -MF $(DEPDIR)/t1outline.Tpo -c -o t1outline.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1outline.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1outline.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1outline.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1outline.Tpo $(DEPDIR)/t1outline.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1outline.c' object='t1outline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1outline.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1outline.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1outline.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1outline.c'; fi` t1set.o: $(T1LIB_TREE)/lib/t1lib/t1set.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1set.o -MD -MP -MF $(DEPDIR)/t1set.Tpo -c -o t1set.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1set.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1set.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1set.Tpo $(DEPDIR)/t1set.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1set.c' object='t1set.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1set.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1set.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1set.c t1set.obj: $(T1LIB_TREE)/lib/t1lib/t1set.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1set.obj -MD -MP -MF $(DEPDIR)/t1set.Tpo -c -o t1set.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1set.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1set.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1set.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1set.Tpo $(DEPDIR)/t1set.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1set.c' object='t1set.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1set.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1set.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1set.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1set.c'; fi` t1subset.o: $(T1LIB_TREE)/lib/t1lib/t1subset.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1subset.o -MD -MP -MF $(DEPDIR)/t1subset.Tpo -c -o t1subset.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1subset.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1subset.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1subset.Tpo $(DEPDIR)/t1subset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1subset.c' object='t1subset.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1subset.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1subset.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1subset.c t1subset.obj: $(T1LIB_TREE)/lib/t1lib/t1subset.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1subset.obj -MD -MP -MF $(DEPDIR)/t1subset.Tpo -c -o t1subset.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1subset.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1subset.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1subset.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1subset.Tpo $(DEPDIR)/t1subset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1subset.c' object='t1subset.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1subset.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1subset.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1subset.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1subset.c'; fi` t1trans.o: $(T1LIB_TREE)/lib/t1lib/t1trans.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1trans.o -MD -MP -MF $(DEPDIR)/t1trans.Tpo -c -o t1trans.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1trans.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1trans.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1trans.Tpo $(DEPDIR)/t1trans.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1trans.c' object='t1trans.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1trans.o `test -f '$(T1LIB_TREE)/lib/t1lib/t1trans.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/t1lib/t1trans.c t1trans.obj: $(T1LIB_TREE)/lib/t1lib/t1trans.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1trans.obj -MD -MP -MF $(DEPDIR)/t1trans.Tpo -c -o t1trans.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1trans.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1trans.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1trans.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1trans.Tpo $(DEPDIR)/t1trans.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/t1lib/t1trans.c' object='t1trans.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1trans.obj `if test -f '$(T1LIB_TREE)/lib/t1lib/t1trans.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/t1lib/t1trans.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/t1lib/t1trans.c'; fi` arith.o: $(T1LIB_TREE)/lib/type1/arith.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT arith.o -MD -MP -MF $(DEPDIR)/arith.Tpo -c -o arith.o `test -f '$(T1LIB_TREE)/lib/type1/arith.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/arith.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/arith.Tpo $(DEPDIR)/arith.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/arith.c' object='arith.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o arith.o `test -f '$(T1LIB_TREE)/lib/type1/arith.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/arith.c arith.obj: $(T1LIB_TREE)/lib/type1/arith.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT arith.obj -MD -MP -MF $(DEPDIR)/arith.Tpo -c -o arith.obj `if test -f '$(T1LIB_TREE)/lib/type1/arith.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/arith.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/arith.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/arith.Tpo $(DEPDIR)/arith.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/arith.c' object='arith.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o arith.obj `if test -f '$(T1LIB_TREE)/lib/type1/arith.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/arith.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/arith.c'; fi` curves.o: $(T1LIB_TREE)/lib/type1/curves.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curves.o -MD -MP -MF $(DEPDIR)/curves.Tpo -c -o curves.o `test -f '$(T1LIB_TREE)/lib/type1/curves.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/curves.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/curves.Tpo $(DEPDIR)/curves.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/curves.c' object='curves.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curves.o `test -f '$(T1LIB_TREE)/lib/type1/curves.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/curves.c curves.obj: $(T1LIB_TREE)/lib/type1/curves.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curves.obj -MD -MP -MF $(DEPDIR)/curves.Tpo -c -o curves.obj `if test -f '$(T1LIB_TREE)/lib/type1/curves.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/curves.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/curves.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/curves.Tpo $(DEPDIR)/curves.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/curves.c' object='curves.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curves.obj `if test -f '$(T1LIB_TREE)/lib/type1/curves.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/curves.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/curves.c'; fi` fontfcn.o: $(T1LIB_TREE)/lib/type1/fontfcn.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fontfcn.o -MD -MP -MF $(DEPDIR)/fontfcn.Tpo -c -o fontfcn.o `test -f '$(T1LIB_TREE)/lib/type1/fontfcn.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/fontfcn.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/fontfcn.Tpo $(DEPDIR)/fontfcn.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/fontfcn.c' object='fontfcn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fontfcn.o `test -f '$(T1LIB_TREE)/lib/type1/fontfcn.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/fontfcn.c fontfcn.obj: $(T1LIB_TREE)/lib/type1/fontfcn.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fontfcn.obj -MD -MP -MF $(DEPDIR)/fontfcn.Tpo -c -o fontfcn.obj `if test -f '$(T1LIB_TREE)/lib/type1/fontfcn.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/fontfcn.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/fontfcn.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/fontfcn.Tpo $(DEPDIR)/fontfcn.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/fontfcn.c' object='fontfcn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fontfcn.obj `if test -f '$(T1LIB_TREE)/lib/type1/fontfcn.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/fontfcn.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/fontfcn.c'; fi` hints.o: $(T1LIB_TREE)/lib/type1/hints.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hints.o -MD -MP -MF $(DEPDIR)/hints.Tpo -c -o hints.o `test -f '$(T1LIB_TREE)/lib/type1/hints.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/hints.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hints.Tpo $(DEPDIR)/hints.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/hints.c' object='hints.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hints.o `test -f '$(T1LIB_TREE)/lib/type1/hints.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/hints.c hints.obj: $(T1LIB_TREE)/lib/type1/hints.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hints.obj -MD -MP -MF $(DEPDIR)/hints.Tpo -c -o hints.obj `if test -f '$(T1LIB_TREE)/lib/type1/hints.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/hints.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/hints.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hints.Tpo $(DEPDIR)/hints.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/hints.c' object='hints.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hints.obj `if test -f '$(T1LIB_TREE)/lib/type1/hints.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/hints.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/hints.c'; fi` lines.o: $(T1LIB_TREE)/lib/type1/lines.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lines.o -MD -MP -MF $(DEPDIR)/lines.Tpo -c -o lines.o `test -f '$(T1LIB_TREE)/lib/type1/lines.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/lines.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/lines.Tpo $(DEPDIR)/lines.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/lines.c' object='lines.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lines.o `test -f '$(T1LIB_TREE)/lib/type1/lines.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/lines.c lines.obj: $(T1LIB_TREE)/lib/type1/lines.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lines.obj -MD -MP -MF $(DEPDIR)/lines.Tpo -c -o lines.obj `if test -f '$(T1LIB_TREE)/lib/type1/lines.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/lines.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/lines.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/lines.Tpo $(DEPDIR)/lines.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/lines.c' object='lines.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lines.obj `if test -f '$(T1LIB_TREE)/lib/type1/lines.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/lines.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/lines.c'; fi` objects.o: $(T1LIB_TREE)/lib/type1/objects.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT objects.o -MD -MP -MF $(DEPDIR)/objects.Tpo -c -o objects.o `test -f '$(T1LIB_TREE)/lib/type1/objects.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/objects.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/objects.Tpo $(DEPDIR)/objects.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/objects.c' object='objects.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o objects.o `test -f '$(T1LIB_TREE)/lib/type1/objects.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/objects.c objects.obj: $(T1LIB_TREE)/lib/type1/objects.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT objects.obj -MD -MP -MF $(DEPDIR)/objects.Tpo -c -o objects.obj `if test -f '$(T1LIB_TREE)/lib/type1/objects.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/objects.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/objects.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/objects.Tpo $(DEPDIR)/objects.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/objects.c' object='objects.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o objects.obj `if test -f '$(T1LIB_TREE)/lib/type1/objects.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/objects.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/objects.c'; fi` paths.o: $(T1LIB_TREE)/lib/type1/paths.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT paths.o -MD -MP -MF $(DEPDIR)/paths.Tpo -c -o paths.o `test -f '$(T1LIB_TREE)/lib/type1/paths.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/paths.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/paths.Tpo $(DEPDIR)/paths.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/paths.c' object='paths.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o paths.o `test -f '$(T1LIB_TREE)/lib/type1/paths.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/paths.c paths.obj: $(T1LIB_TREE)/lib/type1/paths.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT paths.obj -MD -MP -MF $(DEPDIR)/paths.Tpo -c -o paths.obj `if test -f '$(T1LIB_TREE)/lib/type1/paths.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/paths.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/paths.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/paths.Tpo $(DEPDIR)/paths.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/paths.c' object='paths.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o paths.obj `if test -f '$(T1LIB_TREE)/lib/type1/paths.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/paths.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/paths.c'; fi` regions.o: $(T1LIB_TREE)/lib/type1/regions.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regions.o -MD -MP -MF $(DEPDIR)/regions.Tpo -c -o regions.o `test -f '$(T1LIB_TREE)/lib/type1/regions.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/regions.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/regions.Tpo $(DEPDIR)/regions.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/regions.c' object='regions.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regions.o `test -f '$(T1LIB_TREE)/lib/type1/regions.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/regions.c regions.obj: $(T1LIB_TREE)/lib/type1/regions.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regions.obj -MD -MP -MF $(DEPDIR)/regions.Tpo -c -o regions.obj `if test -f '$(T1LIB_TREE)/lib/type1/regions.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/regions.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/regions.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/regions.Tpo $(DEPDIR)/regions.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/regions.c' object='regions.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regions.obj `if test -f '$(T1LIB_TREE)/lib/type1/regions.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/regions.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/regions.c'; fi` scanfont.o: $(T1LIB_TREE)/lib/type1/scanfont.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scanfont.o -MD -MP -MF $(DEPDIR)/scanfont.Tpo -c -o scanfont.o `test -f '$(T1LIB_TREE)/lib/type1/scanfont.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/scanfont.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/scanfont.Tpo $(DEPDIR)/scanfont.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/scanfont.c' object='scanfont.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scanfont.o `test -f '$(T1LIB_TREE)/lib/type1/scanfont.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/scanfont.c scanfont.obj: $(T1LIB_TREE)/lib/type1/scanfont.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scanfont.obj -MD -MP -MF $(DEPDIR)/scanfont.Tpo -c -o scanfont.obj `if test -f '$(T1LIB_TREE)/lib/type1/scanfont.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/scanfont.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/scanfont.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/scanfont.Tpo $(DEPDIR)/scanfont.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/scanfont.c' object='scanfont.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scanfont.obj `if test -f '$(T1LIB_TREE)/lib/type1/scanfont.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/scanfont.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/scanfont.c'; fi` spaces.o: $(T1LIB_TREE)/lib/type1/spaces.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spaces.o -MD -MP -MF $(DEPDIR)/spaces.Tpo -c -o spaces.o `test -f '$(T1LIB_TREE)/lib/type1/spaces.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/spaces.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/spaces.Tpo $(DEPDIR)/spaces.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/spaces.c' object='spaces.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spaces.o `test -f '$(T1LIB_TREE)/lib/type1/spaces.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/spaces.c spaces.obj: $(T1LIB_TREE)/lib/type1/spaces.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spaces.obj -MD -MP -MF $(DEPDIR)/spaces.Tpo -c -o spaces.obj `if test -f '$(T1LIB_TREE)/lib/type1/spaces.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/spaces.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/spaces.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/spaces.Tpo $(DEPDIR)/spaces.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/spaces.c' object='spaces.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spaces.obj `if test -f '$(T1LIB_TREE)/lib/type1/spaces.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/spaces.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/spaces.c'; fi` t1io.o: $(T1LIB_TREE)/lib/type1/t1io.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1io.o -MD -MP -MF $(DEPDIR)/t1io.Tpo -c -o t1io.o `test -f '$(T1LIB_TREE)/lib/type1/t1io.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/t1io.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1io.Tpo $(DEPDIR)/t1io.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/t1io.c' object='t1io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1io.o `test -f '$(T1LIB_TREE)/lib/type1/t1io.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/t1io.c t1io.obj: $(T1LIB_TREE)/lib/type1/t1io.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1io.obj -MD -MP -MF $(DEPDIR)/t1io.Tpo -c -o t1io.obj `if test -f '$(T1LIB_TREE)/lib/type1/t1io.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/t1io.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/t1io.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1io.Tpo $(DEPDIR)/t1io.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/t1io.c' object='t1io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1io.obj `if test -f '$(T1LIB_TREE)/lib/type1/t1io.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/t1io.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/t1io.c'; fi` t1snap.o: $(T1LIB_TREE)/lib/type1/t1snap.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1snap.o -MD -MP -MF $(DEPDIR)/t1snap.Tpo -c -o t1snap.o `test -f '$(T1LIB_TREE)/lib/type1/t1snap.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/t1snap.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1snap.Tpo $(DEPDIR)/t1snap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/t1snap.c' object='t1snap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1snap.o `test -f '$(T1LIB_TREE)/lib/type1/t1snap.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/t1snap.c t1snap.obj: $(T1LIB_TREE)/lib/type1/t1snap.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1snap.obj -MD -MP -MF $(DEPDIR)/t1snap.Tpo -c -o t1snap.obj `if test -f '$(T1LIB_TREE)/lib/type1/t1snap.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/t1snap.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/t1snap.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1snap.Tpo $(DEPDIR)/t1snap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/t1snap.c' object='t1snap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1snap.obj `if test -f '$(T1LIB_TREE)/lib/type1/t1snap.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/t1snap.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/t1snap.c'; fi` t1stub.o: $(T1LIB_TREE)/lib/type1/t1stub.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1stub.o -MD -MP -MF $(DEPDIR)/t1stub.Tpo -c -o t1stub.o `test -f '$(T1LIB_TREE)/lib/type1/t1stub.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/t1stub.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1stub.Tpo $(DEPDIR)/t1stub.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/t1stub.c' object='t1stub.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1stub.o `test -f '$(T1LIB_TREE)/lib/type1/t1stub.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/t1stub.c t1stub.obj: $(T1LIB_TREE)/lib/type1/t1stub.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT t1stub.obj -MD -MP -MF $(DEPDIR)/t1stub.Tpo -c -o t1stub.obj `if test -f '$(T1LIB_TREE)/lib/type1/t1stub.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/t1stub.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/t1stub.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/t1stub.Tpo $(DEPDIR)/t1stub.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/t1stub.c' object='t1stub.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o t1stub.obj `if test -f '$(T1LIB_TREE)/lib/type1/t1stub.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/t1stub.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/t1stub.c'; fi` token.o: $(T1LIB_TREE)/lib/type1/token.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT token.o -MD -MP -MF $(DEPDIR)/token.Tpo -c -o token.o `test -f '$(T1LIB_TREE)/lib/type1/token.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/token.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/token.Tpo $(DEPDIR)/token.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/token.c' object='token.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o token.o `test -f '$(T1LIB_TREE)/lib/type1/token.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/token.c token.obj: $(T1LIB_TREE)/lib/type1/token.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT token.obj -MD -MP -MF $(DEPDIR)/token.Tpo -c -o token.obj `if test -f '$(T1LIB_TREE)/lib/type1/token.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/token.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/token.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/token.Tpo $(DEPDIR)/token.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/token.c' object='token.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o token.obj `if test -f '$(T1LIB_TREE)/lib/type1/token.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/token.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/token.c'; fi` type1.o: $(T1LIB_TREE)/lib/type1/type1.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT type1.o -MD -MP -MF $(DEPDIR)/type1.Tpo -c -o type1.o `test -f '$(T1LIB_TREE)/lib/type1/type1.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/type1.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/type1.Tpo $(DEPDIR)/type1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/type1.c' object='type1.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o type1.o `test -f '$(T1LIB_TREE)/lib/type1/type1.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/type1.c type1.obj: $(T1LIB_TREE)/lib/type1/type1.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT type1.obj -MD -MP -MF $(DEPDIR)/type1.Tpo -c -o type1.obj `if test -f '$(T1LIB_TREE)/lib/type1/type1.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/type1.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/type1.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/type1.Tpo $(DEPDIR)/type1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/type1.c' object='type1.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o type1.obj `if test -f '$(T1LIB_TREE)/lib/type1/type1.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/type1.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/type1.c'; fi` util.o: $(T1LIB_TREE)/lib/type1/util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT util.o -MD -MP -MF $(DEPDIR)/util.Tpo -c -o util.o `test -f '$(T1LIB_TREE)/lib/type1/util.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/util.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/util.Tpo $(DEPDIR)/util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/util.c' object='util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o util.o `test -f '$(T1LIB_TREE)/lib/type1/util.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/lib/type1/util.c util.obj: $(T1LIB_TREE)/lib/type1/util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT util.obj -MD -MP -MF $(DEPDIR)/util.Tpo -c -o util.obj `if test -f '$(T1LIB_TREE)/lib/type1/util.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/util.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/util.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/util.Tpo $(DEPDIR)/util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/lib/type1/util.c' object='util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o util.obj `if test -f '$(T1LIB_TREE)/lib/type1/util.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/lib/type1/util.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/lib/type1/util.c'; fi` type1afm.o: $(T1LIB_TREE)/type1afm/type1afm.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT type1afm.o -MD -MP -MF $(DEPDIR)/type1afm.Tpo -c -o type1afm.o `test -f '$(T1LIB_TREE)/type1afm/type1afm.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/type1afm/type1afm.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/type1afm.Tpo $(DEPDIR)/type1afm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/type1afm/type1afm.c' object='type1afm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o type1afm.o `test -f '$(T1LIB_TREE)/type1afm/type1afm.c' || echo '$(srcdir)/'`$(T1LIB_TREE)/type1afm/type1afm.c type1afm.obj: $(T1LIB_TREE)/type1afm/type1afm.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT type1afm.obj -MD -MP -MF $(DEPDIR)/type1afm.Tpo -c -o type1afm.obj `if test -f '$(T1LIB_TREE)/type1afm/type1afm.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/type1afm/type1afm.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/type1afm/type1afm.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/type1afm.Tpo $(DEPDIR)/type1afm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(T1LIB_TREE)/type1afm/type1afm.c' object='type1afm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o type1afm.obj `if test -f '$(T1LIB_TREE)/type1afm/type1afm.c'; then $(CYGPATH_W) '$(T1LIB_TREE)/type1afm/type1afm.c'; else $(CYGPATH_W) '$(srcdir)/$(T1LIB_TREE)/type1afm/type1afm.c'; 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 check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi 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 $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -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=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(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_OPT=$${XZ_OPT--e} 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 $(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) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(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) gzip -dc $(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" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(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: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { 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 $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \ $(dist_check_SCRIPTS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LIBRARIES) 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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-checkPROGRAMS clean-generic clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr 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 -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -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: check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am am--refresh check check-TESTS check-am \ clean clean-checkPROGRAMS clean-generic clean-noinstLIBRARIES \ ctags dist dist-all dist-bzip2 dist-gzip dist-hook dist-lzip \ dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \ distclean distclean-compile 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 maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Rebuild .PHONY: rebuild rebuild: all # in case of an SVN repository dist-hook: rm -rf `find $(distdir) -name .svn` rm -f $(distdir)/$(T1LIB_TREE)/ac-tools/config.guess \ $(distdir)/$(T1LIB_TREE)/ac-tools/config.sub \ $(distdir)/$(T1LIB_TREE)/ac-tools/install-sh \ $(distdir)/$(T1LIB_TREE)/ac-tools/ltmain.sh \ $(distdir)/$(T1LIB_TREE)/ac-tools/mkinstalldirs \ $(distdir)/$(T1LIB_TREE)/lib/t1lib/t1lib.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: xdvik-ja-22.84.16-j1.40/libs/t1lib/lib/0000775000175000017500000000000011742726711016605 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/lib/t1lib/0000775000175000017500000000000011742731011017605 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/lib/t1lib/sysconf.h.in0000664000175000017500000000440111742727602022061 0ustar uwabamiuwabami/* lib/t1lib/sysconf.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_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 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 header file. */ #undef HAVE_SYS_STAT_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 /* 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 /* The size of `char', as computed by sizeof. */ #undef SIZEOF_CHAR /* The size of `double', as computed by sizeof. */ #undef SIZEOF_DOUBLE /* The size of `float', as computed by sizeof. */ #undef SIZEOF_FLOAT /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `long double', as computed by sizeof. */ #undef SIZEOF_LONG_DOUBLE /* The size of `long long', as computed by sizeof. */ #undef SIZEOF_LONG_LONG /* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* The size of `void *', as computed by sizeof. */ #undef SIZEOF_VOID_P /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if type `char' is unsigned and you are not using gcc. */ #ifndef __CHAR_UNSIGNED__ # undef __CHAR_UNSIGNED__ #endif /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `unsigned int' if does not define. */ #undef size_t xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/0000775000175000017500000000000011742726712017514 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/examples/0000775000175000017500000000000011742726711021331 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/examples/.dependencies0000664000175000017500000000010511742726711023754 0ustar uwabamiuwabamisubset.lo: subset.c ../lib/t1lib/t1lib.h t1example1.lo: t1example1.c xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/examples/subset.c0000664000175000017500000001573011742726711023010 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: subset.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2007-12-22 ----- Description: This file is part of t1lib. The program subset reads a font file name and a string from the commandline and creates a subset of the font which is sufficient to display the string. It is an example of how to use font subsetting. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2007. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #include #include #include /* Note: We include t1lib.h from lib/t1lib. That way the objectfile does only need to be rebuild when the header itself changes and not each time the library has been recompiled */ #include "../lib/t1lib/t1lib.h" void printusage( void); int main(int argc, char *argv[]) { int i, j, result; int realargs=0; int logfile=0; char mask[256]; int flags=T1_SUBSET_DEFAULT; char *subset=NULL; unsigned long ofsize=0; FILE *ofp=stdout; char** encoding = 0; char* encodingfile = 0; int doreencode = 0; int reresult = 0; if (argc==1){ printusage(); return(0); } /* If we want to log anything, then log all */ T1_SetLogLevel(T1LOG_DEBUG); realargs=argc-1; for (j=1; j] [ ...] string\n"); fprintf(stdout, "\n"); fprintf(stdout, "Subset source fontfile(s) according to `string' and write result\nto stdout (T1Lib-%s)!\n\n", T1_GetLibIdent()); fprintf(stdout, "Options: -l Write a log-file t1lib.log.\n"); fprintf(stdout, " -a Create ASCII-encrypted file (default).\n"); fprintf(stdout, " -b Create Binary-enrypted file.\n"); fprintf(stdout, " -f Force reencoding of the font subset, even if\n"); fprintf(stdout, " the source font uses internal StandardEncoding.\n"); fprintf(stdout, " -s Skip reencoding of the font subset, even if the\n"); fprintf(stdout, " source font defines a font-specific encoding.\n"); fprintf(stdout, " -e Load an encoding from specified file and reencode\n"); fprintf(stdout, " source font before starting to create the subset.\n"); fprintf(stdout, " This option also implies [-f].\n"); return; } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/examples/t1example1.c0000664000175000017500000000227611742726711023465 0ustar uwabamiuwabami#include #include #include /* All needed declarations */ #ifdef VMS # define LOCAL_CONFIG "t1libvms.config" #else # define LOCAL_CONFIG "./t1lib.config" #endif int main( void) { GLYPH *glyph; int i; char * my_config = malloc(25); sprintf(my_config, "T1LIB_CONFIG=%s",LOCAL_CONFIG); /* Set our environment to an existent config file directory */ putenv( my_config); /* Pad bitmaps to 16 bits, the default being 8 bits */ T1_SetBitmapPad( 16); /* Initialize t1lib and return if error occurs. No logfile will be generated */ if ((T1_InitLib(NO_LOGFILE)==NULL)){ fprintf(stderr, "Initialization of t1lib failed\n"); return(-1); } /* For every font in the database, generate a glyph for the string "Test" at 25 bp. Use Kerning. Then dump an ASCII representation of the glyph to stdout */ for( i=0; i .dependencies clean: dummy $(RM) $(TARGET1) $(TARGET2) *.o *.lo .libs/* *~ \#*\# *.log *.bak -rmdir .libs install: dummy uninstall: dummy dummy: # Dependencies of object files include .dependencies xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/examples/FontDataBase0000664000175000017500000000012611742726711023546 0ustar uwabamiuwabami8 bchr.afm bchri.afm bchb.afm bchbi.afm dcr10.afm dcti10.afm dcbx10.afm dcbxti10.afm xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/configure0000775000175000017500000306243111742726711021433 0ustar uwabamiuwabami#! /bin/sh # From configure.in configure.in 1.00. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59. # # Copyright (C) 2003 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 Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; 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 # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. 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 ;; 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 { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); 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 sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # 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'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac echo=${ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string="`eval $cmd`") 2>/dev/null && echo_test_string="`eval $cmd`" && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi tagnames=${tagnames+${tagnames},}CXX tagnames=${tagnames+${tagnames},}F77 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="lib/t1lib/t1base.c" # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS LDLIBS PROGEXT CFLAGS LDFLAGS T1LIB_LT_CURRENT T1LIB_LT_REVISION T1LIB_LT_AGE T1LIB_DATA_DIR T1LIB_IDENTIFIER MAIN_TARGET MAIN_HEADER OPTIONS no_x CC T1_AA_TYPE16 T1_AA_TYPE32 T1_AA_TYPE64 T1_INT16 T1_INT32 XSUBDIRS T1LIBX_OBJS T1LIBX_SRCS T1LIBX_HEADERS XOBJS T1LIB_VERSION T1LIB_REVISION T1LIB_PATCHLEVEL T1LIB_VERSIONSTRING SET_MAKE CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP CXX CXXFLAGS ac_ct_CXX CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -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 ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # 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 echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | 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 if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP ac_env_CXX_set=${CXX+set} ac_env_CXX_value=$CXX ac_cv_env_CXX_set=${CXX+set} ac_cv_env_CXX_value=$CXX ac_env_CXXFLAGS_set=${CXXFLAGS+set} ac_env_CXXFLAGS_value=$CXXFLAGS ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} ac_cv_env_CXXFLAGS_value=$CXXFLAGS ac_env_CXXCPP_set=${CXXCPP+set} ac_env_CXXCPP_value=$CXXCPP ac_cv_env_CXXCPP_set=${CXXCPP+set} ac_cv_env_CXXCPP_value=$CXXCPP ac_env_F77_set=${F77+set} ac_env_F77_value=$F77 ac_cv_env_F77_set=${F77+set} ac_cv_env_F77_value=$F77 ac_env_FFLAGS_set=${FFLAGS+set} ac_env_FFLAGS_value=$FFLAGS ac_cv_env_FFLAGS_set=${FFLAGS+set} ac_cv_env_FFLAGS_value=$FFLAGS # # 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 this package 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 \`..'] _ACEOF cat <<_ACEOF 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] --datadir=DIR read-only architecture-independent data [PREFIX/share] --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] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-x use the X Window System --without-athena do not use Athena widgets --with-athena-includes=DIR Athena include files are in DIR --with-athena-libraries=DIR Athena libraries are in DIR --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] --with-tags[=TAGS] include additional configurations [automatic] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style 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 elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF Copyright (C) 2003 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 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { 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` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&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_sep= 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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$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 ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. 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, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # 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 # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 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 { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`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. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers lib/t1lib/sysconf.h:lib/t1lib/sysconf.h.in" ac_aux_dir= for ac_dir in ac-tools $srcdir/ac-tools; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in ac-tools $srcdir/ac-tools" >&5 echo "$as_me: error: cannot find install-sh or install.sh in ac-tools $srcdir/ac-tools" >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. T1LIB_LT_CURRENT=6 T1LIB_LT_REVISION=2 T1LIB_LT_AGE=1 T1LIB_IDENTIFIER="5.1.2" T1LIB_VERSION=5 T1LIB_REVISION=1 T1LIB_PATCHLEVEL=2 T1LIB_VERSIONSTRING=\""5.1.2"\" # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- ## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 ## Free Software Foundation, Inc. ## Originally by Gordon Matzigkeit , 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 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. # serial 47 AC_PROG_LIBTOOL # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) # ----------------------------------------------------------- # If this macro is not defined by Autoconf, define it here. # AC_PROG_LIBTOOL # --------------- # AC_PROG_LIBTOOL # _AC_PROG_LIBTOOL # ---------------- # _AC_PROG_LIBTOOL # AC_LIBTOOL_SETUP # ---------------- # AC_LIBTOOL_SETUP # _LT_AC_SYS_COMPILER # ------------------- # _LT_AC_SYS_COMPILER # _LT_AC_SYS_LIBPATH_AIX # ---------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # _LT_AC_SYS_LIBPATH_AIX # _LT_AC_SHELL_INIT(ARG) # ---------------------- # _LT_AC_SHELL_INIT # _LT_AC_PROG_ECHO_BACKSLASH # -------------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. # _LT_AC_PROG_ECHO_BACKSLASH # _LT_AC_LOCK # ----------- # _LT_AC_LOCK # AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works # AC_LIBTOOL_COMPILER_OPTION # AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ------------------------------------------------------------ # Check whether the given compiler option works # AC_LIBTOOL_LINKER_OPTION # AC_LIBTOOL_SYS_MAX_CMD_LEN # -------------------------- # AC_LIBTOOL_SYS_MAX_CMD_LEN # _LT_AC_CHECK_DLFCN # -------------------- # _LT_AC_CHECK_DLFCN # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ------------------------------------------------------------------ # _LT_AC_TRY_DLOPEN_SELF # AC_LIBTOOL_DLOPEN_SELF # ------------------- # AC_LIBTOOL_DLOPEN_SELF # AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) # --------------------------------- # Check to see if options -c and -o are simultaneously supported by compiler # AC_LIBTOOL_PROG_CC_C_O # AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) # ----------------------------------------- # Check to see if we can do hard links to lock some files if needed # AC_LIBTOOL_SYS_HARD_LINK_LOCKS # AC_LIBTOOL_OBJDIR # ----------------- # AC_LIBTOOL_OBJDIR # AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) # ---------------------------------------------- # Check hardcoding attributes. # AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH # AC_LIBTOOL_SYS_LIB_STRIP # ------------------------ # AC_LIBTOOL_SYS_LIB_STRIP # AC_LIBTOOL_SYS_DYNAMIC_LINKER # ----------------------------- # PORTME Fill in your ld.so characteristics # AC_LIBTOOL_SYS_DYNAMIC_LINKER # _LT_AC_TAGCONFIG # ---------------- # _LT_AC_TAGCONFIG # AC_LIBTOOL_DLOPEN # ----------------- # enable checks for dlopen support # AC_LIBTOOL_DLOPEN # AC_LIBTOOL_WIN32_DLL # -------------------- # declare package support for building win32 dll's # AC_LIBTOOL_WIN32_DLL # AC_ENABLE_SHARED([DEFAULT]) # --------------------------- # implement the --enable-shared flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. # AC_ENABLE_SHARED # AC_DISABLE_SHARED # ----------------- #- set the default shared flag to --disable-shared # AC_DISABLE_SHARED # AC_ENABLE_STATIC([DEFAULT]) # --------------------------- # implement the --enable-static flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. # AC_ENABLE_STATIC # AC_DISABLE_STATIC # ----------------- # set the default static flag to --disable-static # AC_DISABLE_STATIC # AC_ENABLE_FAST_INSTALL([DEFAULT]) # --------------------------------- # implement the --enable-fast-install flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. # AC_ENABLE_FAST_INSTALL # AC_DISABLE_FAST_INSTALL # ----------------------- # set the default to --disable-fast-install # AC_DISABLE_FAST_INSTALL # AC_LIBTOOL_PICMODE([MODE]) # -------------------------- # implement the --with-pic flag # MODE is either `yes' or `no'. If omitted, it defaults to `both'. # AC_LIBTOOL_PICMODE # AC_PROG_EGREP # ------------- # This is predefined starting with Autoconf 2.54, so this conditional # definition can be removed once we require Autoconf 2.54 or later. # AC_PATH_TOOL_PREFIX # ------------------- # find a file program which can recognise shared library # AC_PATH_TOOL_PREFIX # AC_PATH_MAGIC # ------------- # find a file program which can recognise a shared library # AC_PATH_MAGIC # AC_PROG_LD # ---------- # find the pathname to the GNU or non-GNU linker # AC_PROG_LD # AC_PROG_LD_GNU # -------------- # AC_PROG_LD_GNU # AC_PROG_LD_RELOAD_FLAG # ---------------------- # find reload flag for linker # -- PORTME Some linkers may need a different reload flag. # AC_PROG_LD_RELOAD_FLAG # AC_DEPLIBS_CHECK_METHOD # ----------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics # AC_DEPLIBS_CHECK_METHOD # AC_PROG_NM # ---------- # find the pathname to a BSD-compatible name lister # AC_PROG_NM # AC_CHECK_LIBM # ------------- # check for math library # AC_CHECK_LIBM # AC_LIBLTDL_CONVENIENCE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will # be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with # '${top_srcdir}/' (note the single quotes!). If your package is not # flat and you're not using automake, define top_builddir and # top_srcdir appropriately in the Makefiles. # AC_LIBLTDL_CONVENIENCE # AC_LIBLTDL_INSTALLABLE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl installable library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-install to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided and an installed libltdl is not found, it is # assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' # and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single # quotes!). If your package is not flat and you're not using automake, # define top_builddir and top_srcdir appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. # AC_LIBLTDL_INSTALLABLE # AC_LIBTOOL_CXX # -------------- # enable support for C++ libraries # AC_LIBTOOL_CXX # _LT_AC_LANG_CXX # --------------- # _LT_AC_LANG_CXX # _LT_AC_PROG_CXXCPP # --------------- # _LT_AC_PROG_CXXCPP # AC_LIBTOOL_F77 # -------------- # enable support for Fortran 77 libraries # AC_LIBTOOL_F77 # _LT_AC_LANG_F77 # --------------- # _LT_AC_LANG_F77 # AC_LIBTOOL_GCJ # -------------- # enable support for GCJ libraries # AC_LIBTOOL_GCJ # _LT_AC_LANG_GCJ # --------------- # _LT_AC_LANG_GCJ # AC_LIBTOOL_RC # -------------- # enable support for Windows resource files # AC_LIBTOOL_RC # AC_LIBTOOL_LANG_C_CONFIG # ------------------------ # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. # AC_LIBTOOL_LANG_C_CONFIG # AC_LIBTOOL_LANG_CXX_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. # AC_LIBTOOL_LANG_CXX_CONFIG # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) # ------------------------ # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. # AC_LIBTOOL_POSTDEP_PREDEP # AC_LIBTOOL_LANG_F77_CONFIG # ------------------------ # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. # AC_LIBTOOL_LANG_F77_CONFIG # AC_LIBTOOL_LANG_GCJ_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. # AC_LIBTOOL_LANG_GCJ_CONFIG # AC_LIBTOOL_LANG_RC_CONFIG # -------------------------- # Ensure that the configuration vars for the Windows resource compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. # AC_LIBTOOL_LANG_RC_CONFIG # AC_LIBTOOL_CONFIG([TAGNAME]) # ---------------------------- # If TAGNAME is not passed, then create an initial libtool script # with a default configuration from the untagged config vars. Otherwise # add code to config.status for appending the configuration named by # TAGNAME from the matching tagged config vars. # AC_LIBTOOL_CONFIG # AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------------------- # AC_LIBTOOL_PROG_COMPILER_NO_RTTI # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # --------------------------------- # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) # --------------------------------------- # AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) # ------------------------------------ # See if the linker supports building shared libraries. # AC_LIBTOOL_PROG_LD_SHLIBS # _LT_AC_FILE_LTDLL_C # ------------------- # Be careful that the start marker always follows a newline. # _LT_AC_FILE_LTDLL_C # _LT_AC_TAGVAR(VARNAME, [TAGNAME]) # --------------------------------- # old names # This is just to silence aclocal about the macro not being used ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ # LT_AC_PROG_SED # -------------- # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. test -z "$LDLIBS" && LDLIBS=-lm test -z "$PROGEXT" && PROGEXT="" test -z "$CFLAGS" test -z "$LDFLAGS" T1LIB_DATA_DIR="${datadir}/t1lib" echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" 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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no 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 $as_executable_p "$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" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.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. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 -std1 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 -std1. */ int osf4_cc_array ['\x00' == 0 ? 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 # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f 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 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 echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for X" >&5 echo $ECHO_N "checking for X... $ECHO_C" >&6 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then withval="$with_x" fi; # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then # Both variables are already set. have_x=yes else if test "${ac_cv_have_x+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -fr conftest.dir if mkdir conftest.dir; then cd conftest.dir # Make sure to not put "make" in the Imakefile rules, since we grep it out. cat >Imakefile <<'_ACEOF' acfindx: @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' _ACEOF if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl; do if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && test -f $ac_im_libdir/libX11.$ac_extension; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /lib) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -fr conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Intrinsic.h. # First, try using that file with no special directory specified. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # We can compile using X headers with no special include directory. ac_x_includes= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Intrinsic.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lXt $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { XtMalloc (0) ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 LIBS=$ac_save_LIBS for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl; do if test -r $ac_dir/libXt.$ac_extension; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then # Didn't find X anywhere. Cache the known absence of X. ac_cv_have_x="have_x=no" else # Record where we found X for the cache. ac_cv_have_x="have_x=yes \ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" fi fi fi eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then echo "$as_me:$LINENO: result: $have_x" >&5 echo "${ECHO_T}$have_x" >&6 no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes \ ac_x_includes=$x_includes ac_x_libraries=$x_libraries" echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. cat >>confdefs.h <<\_ACEOF #define X_DISPLAY_MISSING 1 _ACEOF X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . case `(uname -sr) 2>/dev/null` in "SunOS 5"*) echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_R_nospace=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_R_nospace=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $ac_R_nospace = yes; then echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_R_space=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_R_space=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $ac_R_space = yes; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 X_LIBS="$X_LIBS -R $x_libraries" else echo "$as_me:$LINENO: result: neither works" >&5 echo "${ECHO_T}neither works" >&6 fi fi LIBS=$ac_xsave_LIBS esac fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XOpenDisplay (); int main () { XOpenDisplay (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dnet_ntoa (); int main () { dnet_ntoa (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dnet_dnet_ntoa=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dnet_dnet_ntoa=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 if test $ac_cv_lib_dnet_dnet_ntoa = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dnet_ntoa (); int main () { dnet_ntoa (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dnet_stub_dnet_ntoa=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. echo "$as_me:$LINENO: checking for gethostbyname" >&5 echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 if test "${ac_cv_func_gethostbyname+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define gethostbyname to an innocuous variant, in case declares gethostbyname. For example, HP-UX 11i declares gettimeofday. */ #define gethostbyname innocuous_gethostbyname /* System header to define __stub macros and hopefully few prototypes, which can conflict with char gethostbyname (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef gethostbyname /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname (); /* 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_gethostbyname) || defined (__stub___gethostbyname) choke me #else char (*f) () = gethostbyname; #endif #ifdef __cplusplus } #endif int main () { return f != gethostbyname; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_gethostbyname=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 if test $ac_cv_func_gethostbyname = no; then echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname (); int main () { gethostbyname (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_nsl_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_nsl_gethostbyname=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 if test $ac_cv_lib_nsl_gethostbyname = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname (); int main () { gethostbyname (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_bsd_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_bsd_gethostbyname=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 if test $ac_cv_lib_bsd_gethostbyname = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. echo "$as_me:$LINENO: checking for connect" >&5 echo $ECHO_N "checking for connect... $ECHO_C" >&6 if test "${ac_cv_func_connect+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define connect to an innocuous variant, in case declares connect. For example, HP-UX 11i declares gettimeofday. */ #define connect innocuous_connect /* System header to define __stub macros and hopefully few prototypes, which can conflict with char connect (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef connect /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char connect (); /* 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_connect) || defined (__stub___connect) choke me #else char (*f) () = connect; #endif #ifdef __cplusplus } #endif int main () { return f != connect; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_connect=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_connect=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 echo "${ECHO_T}$ac_cv_func_connect" >&6 if test $ac_cv_func_connect = no; then echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 if test "${ac_cv_lib_socket_connect+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char connect (); int main () { connect (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_socket_connect=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_socket_connect=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 if test $ac_cv_lib_socket_connect = yes; then X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. echo "$as_me:$LINENO: checking for remove" >&5 echo $ECHO_N "checking for remove... $ECHO_C" >&6 if test "${ac_cv_func_remove+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define remove to an innocuous variant, in case declares remove. For example, HP-UX 11i declares gettimeofday. */ #define remove innocuous_remove /* System header to define __stub macros and hopefully few prototypes, which can conflict with char remove (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef remove /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char remove (); /* 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_remove) || defined (__stub___remove) choke me #else char (*f) () = remove; #endif #ifdef __cplusplus } #endif int main () { return f != remove; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_remove=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_remove=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 echo "${ECHO_T}$ac_cv_func_remove" >&6 if test $ac_cv_func_remove = no; then echo "$as_me:$LINENO: checking for remove in -lposix" >&5 echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 if test "${ac_cv_lib_posix_remove+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char remove (); int main () { remove (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_posix_remove=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_posix_remove=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 if test $ac_cv_lib_posix_remove = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. echo "$as_me:$LINENO: checking for shmat" >&5 echo $ECHO_N "checking for shmat... $ECHO_C" >&6 if test "${ac_cv_func_shmat+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shmat to an innocuous variant, in case declares shmat. For example, HP-UX 11i declares gettimeofday. */ #define shmat innocuous_shmat /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shmat (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shmat /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shmat (); /* 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_shmat) || defined (__stub___shmat) choke me #else char (*f) () = shmat; #endif #ifdef __cplusplus } #endif int main () { return f != shmat; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shmat=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shmat=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 echo "${ECHO_T}$ac_cv_func_shmat" >&6 if test $ac_cv_func_shmat = no; then echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 if test "${ac_cv_lib_ipc_shmat+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shmat (); int main () { shmat (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_ipc_shmat=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_ipc_shmat=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 if test $ac_cv_lib_ipc_shmat = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char IceConnectionNumber (); int main () { IceConnectionNumber (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_ICE_IceConnectionNumber=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi athena_includes= athena_libraries= # Check whether --with-athena or --without-athena was given. if test "${with_athena+set}" = set; then withval="$with_athena" fi; if test "$with_athena" = "no" then athena_includes=no athena_libraries=no fi # Check whether --with-athena-includes or --without-athena-includes was given. if test "${with_athena_includes+set}" = set; then withval="$with_athena_includes" athena_includes="$withval" fi; # Check whether --with-athena-libraries or --without-athena-libraries was given. if test "${with_athena_libraries+set}" = set; then withval="$with_athena_libraries" athena_libraries="$withval" fi; echo "$as_me:$LINENO: checking for Athena" >&5 echo $ECHO_N "checking for Athena... $ECHO_C" >&6 # # # Search the include files. # if test "$athena_includes" = ""; then if test "${ice_cv_athena_includes+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ice_athena_save_LIBS="$LIBS" ice_athena_save_CFLAGS="$CFLAGS" ice_athena_save_CPPFLAGS="$CPPFLAGS" ice_athena_save_LDFLAGS="$LDFLAGS" # LIBS="$X_PRE_LIBS -lXaw -lXmu -lXext -lXt -lX11 $X_EXTRA_LIBS $LIBS" CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" LDFLAGS="$X_LIBS $LDFLAGS" # cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { int a; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then # X11/Xaw/Text.h is in the standard search path. ice_cv_athena_includes= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # X11/Xaw/Text.h is not in the standard search path. # Locate it and put its directory in `athena_includes' # # /usr/include/Motif* are used on HP-UX (Motif). # /usr/include/X11* are used on HP-UX (X and Athena). # /usr/dt is used on Solaris (Motif). # /usr/openwin is used on Solaris (X and Athena). # Other directories are just guesses. for dir in "$x_includes" "${prefix}/include" /usr/include /usr/local/include \ /usr/include/Motif2.0 /usr/include/Motif1.2 /usr/include/Motif1.1 \ /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 \ /usr/dt/include /usr/openwin/include \ /usr/dt/*/include /opt/*/include /usr/include/Motif* \ "${prefix}"/*/include /usr/*/include /usr/local/*/include \ "${prefix}"/include/* /usr/include/* /usr/local/include/*; do if test -f "$dir/X11/Xaw/Text.h"; then ice_cv_athena_includes="$dir" break fi done fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # LIBS="$ice_athena_save_LIBS" CFLAGS="$ice_athena_save_CFLAGS" CPPFLAGS="$ice_athena_save_CPPFLAGS" LDFLAGS="$ice_athena_save_LDFLAGS" fi athena_includes="$ice_cv_athena_includes" fi # # # Now for the libraries. # if test "$athena_libraries" = ""; then if test "${ice_cv_athena_libraries+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ice_athena_save_LIBS="$LIBS" ice_athena_save_CFLAGS="$CFLAGS" ice_athena_save_CPPFLAGS="$CPPFLAGS" ice_athena_save_LDFLAGS="$LDFLAGS" # LIBS="$X_PRE_LIBS -lXaw -lXmu -lXext -lXt -lX11 $X_EXTRA_LIBS $LIBS" CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" LDFLAGS="$X_LIBS $LDFLAGS" # cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { XtToolkitInitialize(); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then # libXaw.a is in the standard search path. ice_cv_athena_libraries= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # libXaw.a is not in the standard search path. # Locate it and put its directory in `athena_libraries' # # # /usr/lib/Motif* are used on HP-UX (Motif). # /usr/lib/X11* are used on HP-UX (X and Athena). # /usr/dt is used on Solaris (Motif). # /usr/openwin is used on Solaris (X and Athena). # Other directories are just guesses. for dir in "$x_libraries" "${prefix}/lib" /usr/lib /usr/local/lib \ /usr/lib/Motif2.0 /usr/lib/Motif1.2 /usr/lib/Motif1.1 \ /usr/lib/X11R6 /usr/lib/X11R5 /usr/lib/X11R4 /usr/lib/X11 \ /usr/dt/lib /usr/openwin/lib \ /usr/dt/*/lib /opt/*/lib /usr/lib/Motif* \ "${prefix}"/*/lib /usr/*/lib /usr/local/*/lib \ "${prefix}"/lib/* /usr/lib/* /usr/local/lib/*; do if test -d "$dir" && test "`ls $dir/libXaw.* 2> /dev/null`" != ""; then ice_cv_athena_libraries="$dir" break fi done fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext # LIBS="$ice_athena_save_LIBS" CFLAGS="$ice_athena_save_CFLAGS" CPPFLAGS="$ice_athena_save_CPPFLAGS" LDFLAGS="$ice_athena_save_LDFLAGS" fi # athena_libraries="$ice_cv_athena_libraries" fi # Add Athena definitions to X flags # if test "$athena_includes" != "" && test "$athena_includes" != "$x_includes" && test "$athena_includes" != "no" then X_CFLAGS="-I$athena_includes $X_CFLAGS" fi if test "$athena_libraries" != "" && test "$athena_libraries" != "$x_libraries" && test "$athena_libraries" != "no" then case "$X_LIBS" in *-R\ *) X_LIBS="-L$athena_libraries -R $athena_libraries $X_LIBS";; *-R*) X_LIBS="-L$athena_libraries -R$athena_libraries $X_LIBS";; *) X_LIBS="-L$athena_libraries $X_LIBS";; esac fi # # athena_libraries_result="$athena_libraries" athena_includes_result="$athena_includes" test "$athena_libraries_result" = "" && athena_libraries_result="in default path" test "$athena_includes_result" = "" && athena_includes_result="in default path" test "$athena_libraries_result" = "no" && athena_libraries_result="(none)" test "$athena_includes_result" = "no" && athena_includes_result="(none)" echo "$as_me:$LINENO: result: libraries $athena_libraries_result, headers $athena_includes_result" >&5 echo "${ECHO_T}libraries $athena_libraries_result, headers $athena_includes_result" >&6 # Check whether --enable-shared or --disable-shared was given. if test "${enable_shared+set}" = set; then enableval="$enable_shared" p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi; # Check whether --enable-static or --disable-static was given. if test "${enable_static+set}" = set; then enableval="$enable_static" p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi; # Check whether --enable-fast-install or --disable-fast-install was given. if test "${enable_fast_install+set}" = set; then enableval="$enable_fast_install" p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi; # Make sure we can run config.sub. $ac_config_sub sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6 if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_build_alias=$build_alias test -z "$ac_cv_build_alias" && ac_cv_build_alias=`$ac_config_guess` test -z "$ac_cv_build_alias" && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6 build=$ac_cv_build build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6 if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_host_alias=$host_alias test -z "$ac_cv_host_alias" && ac_cv_host_alias=$ac_cv_build_alias ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6 host=$ac_cv_host host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 if test "${lt_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && break cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done fi SED=$lt_cv_path_SED echo "$as_me:$LINENO: result: $SED" >&5 echo "${ECHO_T}$SED" >&6 echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 if test "${lt_cv_ld_reload_flag+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_reload_flag='-r' fi echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then reload_cmds='$CC -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 if test "${lt_cv_path_NM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/${ac_tool_prefix}nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac esac fi done IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 echo "${ECHO_T}$lt_cv_path_NM" >&6 NM="$lt_cv_path_NM" echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6 fi echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 if test "${lt_cv_deplibs_check_method+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix4* | aix5*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump'. lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | kfreebsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case "$host_cpu" in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; sco3.2v5*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac fi echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 5500 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case "`/usr/bin/file conftest.o`" in *32-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 if test "${lt_cv_cc_needs_belf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_cv_cc_needs_belf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 lt_cv_cc_needs_belf=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext 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 fi echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; esac need_locks="$enable_libtool_lock" echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #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)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF 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=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_ext=cc 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 -n "$ac_tool_prefix"; then for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl 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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl 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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CXX" && break done test -n "$ac_ct_CXX" || ac_ct_CXX="g++" CXX=$ac_ct_CXX fi # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="-g" echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cxx_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$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 for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi ac_ext=cc 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 -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cc 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 echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$CXXCPP" >&6 ac_preproc_ok=false for ac_cxx_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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=cc 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 fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then echo "$as_me:$LINENO: result: $F77" >&5 echo "${ECHO_T}$F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_F77="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 echo "${ECHO_T}$ac_ct_F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_F77" && break done F77=$ac_ct_F77 fi # Provide some information about the compiler. echo "$as_me:6735:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 if test "${ac_cv_f77_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_f77_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else FFLAGS=-g cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_f77_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_f77_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi G77=`test $ac_compiler_gnu = yes && echo yes` 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 # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 if test "${lt_cv_sys_max_cmd_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* ) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for *BSD fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` ;; *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 else echo "$as_me:$LINENO: result: none" >&5 echo "${ECHO_T}none" >&6 fi # Check for command to grab the raw symbol name followed by C symbol from nm. echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Transform the above into a raw symbol and a C symbol. symxfrm='\1 \2\3 \3' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32*) symcode='[ABCDGISTW]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux*) if test "$host_cpu" = ia64; then symcode='[ABCDGIRSTW]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris* | sysv5*) symcode='[BDRT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Now try to grab the symbols. nlist=conftest.nm if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then echo "$as_me:$LINENO: result: failed" >&5 echo "${ECHO_T}failed" >&6 else echo "$as_me:$LINENO: result: ok" >&5 echo "${ECHO_T}ok" >&6 fi echo "$as_me:$LINENO: checking for objdir" >&5 echo $ECHO_N "checking for objdir... $ECHO_C" >&6 if test "${lt_cv_objdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 echo "${ECHO_T}$lt_cv_objdir" >&6 objdir=$lt_cv_objdir case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e s/^X//' sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then echo "$as_me:$LINENO: result: $AR" >&5 echo "${ECHO_T}$AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi AR=$ac_ct_AR else AR="$ac_cv_prog_AR" fi 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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi 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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ;; *) old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo "$as_me:$LINENO: checking for file" >&5 echo $ECHO_N "checking for file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi else MAGIC_CMD=: fi fi fi ;; esac enable_dlopen=no enable_win32_dll=no # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic or --without-pic was given. if test "${with_pic+set}" = set; then withval="$with_pic" pic_mode="$withval" else pic_mode=default fi; test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= lt_save_CC="$CC" 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 # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}\n' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # # Check for any special shared library compilation flags. # lt_prog_cc_shlib= if test "$GCC" = no; then case $host_os in sco3.2v5*) lt_prog_cc_shlib='-belf' ;; esac fi if test -n "$lt_prog_cc_shlib"; then { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : else { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} lt_cv_prog_cc_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 if test "${lt_prog_compiler_static_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_prog_compiler_static" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 else lt_prog_compiler_static_works=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 if test x"$lt_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:7796: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:7800: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) lt_prog_compiler_pic='-qnocommon' lt_prog_compiler_wl='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic='-Kpic' lt_prog_compiler_static='-dn' ;; solaris*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 echo "${ECHO_T}$lt_prog_compiler_pic" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8039: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8043: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 if test x"$lt_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8099: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8103: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag= enable_shared_with_static_runtimes=no archive_cmds= archive_expsym_cmds= old_archive_From_new_cmds= old_archive_from_expsyms_cmds= export_dynamic_flag_spec= whole_archive_flag_spec= thread_safe_flag_spec= hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no hardcode_shlibpath_var=unsupported link_all_deplibs=unknown hardcode_automatic=no module_cmds= module_expsym_cmds= always_export_symbols=no export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds="$tmp_archive_cmds" fi else ld_shlibs=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_libdir_separator=':' link_all_deplibs=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec=' ' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs=no ;; esac fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=no hardcode_shlibpath_var=no ;; ia64*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=no hardcode_shlibpath_var=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; *) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld='-rpath $libdir' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; openbsd*) hardcode_direct=yes hardcode_shlibpath_var=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; sco3.2v5*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag=' -z text' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4.2uw2*) archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=no hardcode_shlibpath_var=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv5*) no_undefined_flag=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec= hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs" >&5 echo "${ECHO_T}$ld_shlibs" >&6 test "$ld_shlibs" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 echo "${ECHO_T}$archive_cmds_need_lc" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var" || \ test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action" >&5 echo "${ECHO_T}$hardcode_action" >&6 if test "$hardcode_action" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* 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_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* 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_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # Report which librarie types wil actually be built echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler \ CC \ LD \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_prog_compiler_no_builtin_flag \ export_dynamic_flag_spec \ thread_safe_flag_spec \ whole_archive_flag_spec \ enable_shared_with_static_runtimes \ old_archive_cmds \ old_archive_from_new_cmds \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ archive_cmds \ archive_expsym_cmds \ postinstall_cmds \ postuninstall_cmds \ old_archive_from_expsyms_cmds \ allow_undefined_flag \ no_undefined_flag \ export_symbols_cmds \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ hardcode_automatic \ module_cmds \ module_expsym_cmds \ lt_cv_prog_compiler_c_o \ exclude_expsyms \ include_expsyms; do case $var in old_archive_cmds | \ old_archive_from_new_cmds | \ archive_cmds | \ archive_expsym_cmds | \ module_cmds | \ module_expsym_cmds | \ old_archive_from_expsyms_cmds | \ export_symbols_cmds | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" { echo "$as_me:$LINENO: creating $ofile" >&5 echo "$as_me: creating $ofile" >&6;} cat <<__EOF__ >> "$cfgfile" #! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 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 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. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler # Is the compiler the GNU C compiler? with_gcc=$GCC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # ### END LIBTOOL CONFIG __EOF__ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" 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 CC="$lt_save_CC" # Check whether --with-tags or --without-tags was given. if test "${with_tags+set}" = set; then withval="$with_tags" tagnames="$withval" fi; if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} else { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in "") ;; *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 echo "$as_me: error: invalid tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} { (exit 1); exit 1; }; } fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cc 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 archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_automatic_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= # Source file extension for C++ test sources. ac_ext=cc # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes if test "$GXX" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_CXX=yes else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_CXX=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX=' ' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes if test "$GXX" = yes ; then lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_CXX=no ;; esac fi ;; dgux*) case $cc_basename in ec++) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd12*) # C++ shared libraries reported to be fairly broken before switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | kfreebsd*-gnu) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC) archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_CXX='+b $libdir' hardcode_libdir_separator_CXX=: ;; ia64*) hardcode_libdir_flag_spec_CXX='-L$libdir' ;; *) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case "$host_cpu" in hppa*64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; *) hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC) case "$host_cpu" in hppa*64*|ia64*) archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case "$host_cpu" in ia64*|hppa*64*) archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; irix5* | irix6*) case $cc_basename in CC) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: ;; linux*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; cxx) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' ;; osf3*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ $rm $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sco*) archive_cmds_need_lc_CXX=no case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.0-5 | solaris2.0-5.*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system # linker. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac link_all_deplibs_CXX=yes # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' fi ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) archive_cmds_need_lc_CXX=no ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" for p in `eval $output_verbose_link_cmd`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" \ || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $rm -f confest.$objext case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) lt_prog_compiler_pic_CXX='-qnocommon' lt_prog_compiler_wl_CXX='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | kfreebsd*-gnu) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux*) case $cc_basename in KCC) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; icpc) # Intel C++ lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; cxx) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; sco*) case $cc_basename in CC) lt_prog_compiler_pic_CXX='-fPIC' ;; *) ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; unixware*) ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:12579: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:12583: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_CXX=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_CXX=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:12639: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:12643: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ test -n "$runpath_var_CXX" || \ test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 echo "${ECHO_T}$hardcode_action_CXX" >&6 if test "$hardcode_action_CXX" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* 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_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* 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_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_CXX \ CC_CXX \ LD_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ export_dynamic_flag_spec_CXX \ thread_safe_flag_spec_CXX \ whole_archive_flag_spec_CXX \ enable_shared_with_static_runtimes_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ postinstall_cmds_CXX \ postuninstall_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ export_symbols_cmds_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ hardcode_automatic_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ lt_cv_prog_compiler_c_o_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX; do case $var in old_archive_cmds_CXX | \ old_archive_from_new_cmds_CXX | \ archive_cmds_CXX | \ archive_expsym_cmds_CXX | \ module_cmds_CXX | \ module_expsym_cmds_CXX | \ old_archive_from_expsyms_cmds_CXX | \ export_symbols_cmds_CXX | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU C compiler? with_gcc=$GCC_CXX # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_CXX # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_CXX old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_CXX # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_CXX # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_CXX # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_CXX # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_CXX" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" 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 CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # Code to be used in simple compile tests lt_simple_compile_test_code=" subroutine t\n return\n end\n" # Code to be used in simple link tests lt_simple_link_test_code=" program t\n end\n" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC compiler_F77=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) test "$enable_shared" = yes && enable_static=no ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 test "$ld_shlibs_F77" = no && can_build_shared=no GCC_F77="$G77" LD_F77="$LD" lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) lt_prog_compiler_pic_F77='-qnocommon' lt_prog_compiler_wl_F77='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic_F77='-Kpic' lt_prog_compiler_static_F77='-dn' ;; solaris*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14935: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:14939: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_F77=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 if test x"$lt_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_F77=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14995: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:14999: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_F77= enable_shared_with_static_runtimes_F77=no archive_cmds_F77= archive_expsym_cmds_F77= old_archive_From_new_cmds_F77= old_archive_from_expsyms_cmds_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= thread_safe_flag_spec_F77= hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_direct_F77=no hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported link_all_deplibs_F77=unknown hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= always_export_symbols_F77=no export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_F77=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_F77=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds_F77="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds_F77="$tmp_archive_cmds" fi else ld_shlibs_F77=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_F77=yes else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_F77=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77=' ' archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # see comment about different semantics on the GNU ld section ld_shlibs_F77=no ;; bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_F77=yes ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported whole_archive_flag_spec_F77='' link_all_deplibs_F77=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_F77=no ;; esac fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; freebsd1*) ld_shlibs_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_F77='+b $libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; ia64*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=no hardcode_shlibpath_var_F77=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; *) hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: link_all_deplibs_F77=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; openbsd*) hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi hardcode_libdir_separator_F77=: ;; sco3.2v5*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag_F77=' -z text' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4.2uw2*) archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag_F77='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv5*) no_undefined_flag_F77=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec_F77= hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 echo "${ECHO_T}$ld_shlibs_F77" >&6 test "$ld_shlibs_F77" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_F77=no else archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || \ test -n "$runpath_var_F77" || \ test "X$hardcode_automatic_F77" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 echo "${ECHO_T}$hardcode_action_F77" >&6 if test "$hardcode_action_F77" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_F77 \ CC_F77 \ LD_F77 \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_static_F77 \ lt_prog_compiler_no_builtin_flag_F77 \ export_dynamic_flag_spec_F77 \ thread_safe_flag_spec_F77 \ whole_archive_flag_spec_F77 \ enable_shared_with_static_runtimes_F77 \ old_archive_cmds_F77 \ old_archive_from_new_cmds_F77 \ predep_objects_F77 \ postdep_objects_F77 \ predeps_F77 \ postdeps_F77 \ compiler_lib_search_path_F77 \ archive_cmds_F77 \ archive_expsym_cmds_F77 \ postinstall_cmds_F77 \ postuninstall_cmds_F77 \ old_archive_from_expsyms_cmds_F77 \ allow_undefined_flag_F77 \ no_undefined_flag_F77 \ export_symbols_cmds_F77 \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_ld_F77 \ hardcode_libdir_separator_F77 \ hardcode_automatic_F77 \ module_cmds_F77 \ module_expsym_cmds_F77 \ lt_cv_prog_compiler_c_o_F77 \ exclude_expsyms_F77 \ include_expsyms_F77; do case $var in old_archive_cmds_F77 | \ old_archive_from_new_cmds_F77 | \ archive_cmds_F77 | \ archive_expsym_cmds_F77 | \ module_cmds_F77 | \ module_expsym_cmds_F77 | \ old_archive_from_expsyms_cmds_F77 | \ export_symbols_cmds_F77 | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU C compiler? with_gcc=$GCC_F77 # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_F77 # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_F77 old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_F77 # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_F77 # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_F77 # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_F77 # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_F77" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" 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 CC="$lt_save_CC" else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o objext_GCJ=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}\n" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC compiler_GCJ=$CC # GCJ did not exist at the time GCC didn't implicitly link libc in. archive_cmds_need_lc_GCJ=no ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_no_builtin_flag_GCJ= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17034: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:17038: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_static_GCJ='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_GCJ='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_GCJ=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_GCJ=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_GCJ='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' else lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) lt_prog_compiler_pic_GCJ='-qnocommon' lt_prog_compiler_wl_GCJ='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_GCJ='-non_shared' ;; newsos6) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-static' ;; ccc*) lt_prog_compiler_wl_GCJ='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_GCJ='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic_GCJ='-Kpic' lt_prog_compiler_static_GCJ='-dn' ;; solaris*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sunos4*) lt_prog_compiler_wl_GCJ='-Qoption ld ' lt_prog_compiler_pic_GCJ='-PIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_GCJ='-Kconform_pic' lt_prog_compiler_static_GCJ='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic_GCJ='-pic' lt_prog_compiler_static_GCJ='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_GCJ=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_GCJ" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17277: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:17281: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_GCJ=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in "" | " "*) ;; *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; esac else lt_prog_compiler_pic_GCJ= lt_prog_compiler_can_build_shared_GCJ=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_GCJ= ;; *) lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_GCJ=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17337: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:17341: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_GCJ=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_GCJ= enable_shared_with_static_runtimes_GCJ=no archive_cmds_GCJ= archive_expsym_cmds_GCJ= old_archive_From_new_cmds_GCJ= old_archive_from_expsyms_cmds_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= thread_safe_flag_spec_GCJ= hardcode_libdir_flag_spec_GCJ= hardcode_libdir_flag_spec_ld_GCJ= hardcode_libdir_separator_GCJ= hardcode_direct_GCJ=no hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=unsupported link_all_deplibs_GCJ=unknown hardcode_automatic_GCJ=no module_cmds_GCJ= module_expsym_cmds_GCJ= always_export_symbols_GCJ=no export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_GCJ= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_GCJ=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_GCJ=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_GCJ=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_GCJ=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_GCJ=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_GCJ='-L$libdir' allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=no enable_shared_with_static_runtimes_GCJ=yes export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_GCJ=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; sunos4*) archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds_GCJ="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds_GCJ="$tmp_archive_cmds" fi else ld_shlibs_GCJ=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac if test "$ld_shlibs_GCJ" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_GCJ= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=yes archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_GCJ=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_GCJ=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_GCJ='' hardcode_direct_GCJ=yes hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_GCJ=yes else # We have old collect2 hardcode_direct_GCJ=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_GCJ=yes hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_libdir_separator_GCJ= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_GCJ=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_GCJ='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_GCJ="-z nodefs" archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_GCJ=' ${wl}-bernotok' allow_undefined_flag_GCJ=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_GCJ=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_GCJ=' ' archive_cmds_need_lc_GCJ=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # see comment about different semantics on the GNU ld section ld_shlibs_GCJ=no ;; bsdi[45]*) export_dynamic_flag_spec_GCJ=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_GCJ=' ' allow_undefined_flag_GCJ=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_GCJ='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_GCJ=yes ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_GCJ=no hardcode_direct_GCJ=no hardcode_automatic_GCJ=yes hardcode_shlibpath_var_GCJ=unsupported whole_archive_flag_spec_GCJ='' link_all_deplibs_GCJ=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_GCJ=no ;; esac fi ;; dgux*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; freebsd1*) ld_shlibs_GCJ=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no ;; ia64*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; *) hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: link_all_deplibs_GCJ=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; newsos6) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_shlibpath_var_GCJ=no ;; openbsd*) hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' ;; *) archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes allow_undefined_flag_GCJ=unsupported archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_GCJ='-rpath $libdir' fi hardcode_libdir_separator_GCJ=: ;; sco3.2v5*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag_GCJ=' -z text' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_shlibpath_var_GCJ=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_GCJ=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; sysv4) case $host_vendor in sni) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_GCJ='$CC -r -o $output$reload_objs' hardcode_direct_GCJ=no ;; motorola) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv4.3*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_GCJ=yes fi ;; sysv4.2uw2*) archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag_GCJ='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv5*) no_undefined_flag_GCJ=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec_GCJ= hardcode_shlibpath_var_GCJ=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; *) ld_shlibs_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 echo "${ECHO_T}$ld_shlibs_GCJ" >&6 test "$ld_shlibs_GCJ" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_GCJ" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_GCJ=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_GCJ in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_GCJ compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ allow_undefined_flag_GCJ= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_GCJ=no else archive_cmds_need_lc_GCJ=yes fi allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var_GCJ" || \ test "X$hardcode_automatic_GCJ" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_GCJ" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && test "$hardcode_minus_L_GCJ" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_GCJ=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_GCJ=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_GCJ=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 echo "${ECHO_T}$hardcode_action_GCJ" >&6 if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* 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_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* 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_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_GCJ \ CC_GCJ \ LD_GCJ \ lt_prog_compiler_wl_GCJ \ lt_prog_compiler_pic_GCJ \ lt_prog_compiler_static_GCJ \ lt_prog_compiler_no_builtin_flag_GCJ \ export_dynamic_flag_spec_GCJ \ thread_safe_flag_spec_GCJ \ whole_archive_flag_spec_GCJ \ enable_shared_with_static_runtimes_GCJ \ old_archive_cmds_GCJ \ old_archive_from_new_cmds_GCJ \ predep_objects_GCJ \ postdep_objects_GCJ \ predeps_GCJ \ postdeps_GCJ \ compiler_lib_search_path_GCJ \ archive_cmds_GCJ \ archive_expsym_cmds_GCJ \ postinstall_cmds_GCJ \ postuninstall_cmds_GCJ \ old_archive_from_expsyms_cmds_GCJ \ allow_undefined_flag_GCJ \ no_undefined_flag_GCJ \ export_symbols_cmds_GCJ \ hardcode_libdir_flag_spec_GCJ \ hardcode_libdir_flag_spec_ld_GCJ \ hardcode_libdir_separator_GCJ \ hardcode_automatic_GCJ \ module_cmds_GCJ \ module_expsym_cmds_GCJ \ lt_cv_prog_compiler_c_o_GCJ \ exclude_expsyms_GCJ \ include_expsyms_GCJ; do case $var in old_archive_cmds_GCJ | \ old_archive_from_new_cmds_GCJ | \ archive_cmds_GCJ | \ archive_expsym_cmds_GCJ | \ module_cmds_GCJ | \ module_expsym_cmds_GCJ | \ old_archive_from_expsyms_cmds_GCJ | \ export_symbols_cmds_GCJ | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_GCJ # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_GCJ # Is the compiler the GNU C compiler? with_gcc=$GCC_GCJ # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_GCJ # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_GCJ # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_GCJ pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_GCJ # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_GCJ old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_GCJ archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_GCJ module_expsym_cmds=$lt_module_expsym_cmds_GCJ # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_GCJ # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_GCJ # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_GCJ # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_GCJ # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_GCJ # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_GCJ # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_GCJ # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_GCJ # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_GCJ # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_GCJ" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_GCJ # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_GCJ # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_GCJ # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_GCJ # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" 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 CC="$lt_save_CC" else tagname="" fi ;; RC) # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o objext_RC=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC compiler_RC=$CC lt_cv_prog_compiler_c_o_RC=yes # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_RC \ CC_RC \ LD_RC \ lt_prog_compiler_wl_RC \ lt_prog_compiler_pic_RC \ lt_prog_compiler_static_RC \ lt_prog_compiler_no_builtin_flag_RC \ export_dynamic_flag_spec_RC \ thread_safe_flag_spec_RC \ whole_archive_flag_spec_RC \ enable_shared_with_static_runtimes_RC \ old_archive_cmds_RC \ old_archive_from_new_cmds_RC \ predep_objects_RC \ postdep_objects_RC \ predeps_RC \ postdeps_RC \ compiler_lib_search_path_RC \ archive_cmds_RC \ archive_expsym_cmds_RC \ postinstall_cmds_RC \ postuninstall_cmds_RC \ old_archive_from_expsyms_cmds_RC \ allow_undefined_flag_RC \ no_undefined_flag_RC \ export_symbols_cmds_RC \ hardcode_libdir_flag_spec_RC \ hardcode_libdir_flag_spec_ld_RC \ hardcode_libdir_separator_RC \ hardcode_automatic_RC \ module_cmds_RC \ module_expsym_cmds_RC \ lt_cv_prog_compiler_c_o_RC \ exclude_expsyms_RC \ include_expsyms_RC; do case $var in old_archive_cmds_RC | \ old_archive_from_new_cmds_RC | \ archive_cmds_RC | \ archive_expsym_cmds_RC | \ module_cmds_RC | \ module_expsym_cmds_RC | \ old_archive_from_expsyms_cmds_RC | \ export_symbols_cmds_RC | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_RC # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_RC # Is the compiler the GNU C compiler? with_gcc=$GCC_RC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_RC # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_RC # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_RC pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_RC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_RC old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_RC archive_expsym_cmds=$lt_archive_expsym_cmds_RC postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_RC module_expsym_cmds=$lt_module_expsym_cmds_RC # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_RC # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_RC # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_RC # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_RC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_RC # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_RC # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_RC # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_RC # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_RC # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_RC # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_RC # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_RC # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_RC # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_RC" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_RC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_RC # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_RC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_RC # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" 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 CC="$lt_save_CC" ;; *) { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 echo "$as_me: error: Unsupported tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 echo "$as_me: error: unable to update list of available tagged configurations." >&2;} { (exit 1); exit 1; }; } fi fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' # Prevent multiple expansion # 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. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 $as_executable_p "$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 ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether char is unsigned" >&5 echo $ECHO_N "checking whether char is unsigned... $ECHO_C" >&6 if test "${ac_cv_c_char_unsigned+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((char) -1) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_char_unsigned=no else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_char_unsigned=yes fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_char_unsigned" >&5 echo "${ECHO_T}$ac_cv_c_char_unsigned" >&6 if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then cat >>confdefs.h <<\_ACEOF #define __CHAR_UNSIGNED__ 1 _ACEOF fi echo "$as_me:$LINENO: checking for char" >&5 echo $ECHO_N "checking for char... $ECHO_C" >&6 if test "${ac_cv_type_char+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((char *) 0) return 0; if (sizeof (char)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_char=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_char=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_char" >&5 echo "${ECHO_T}$ac_cv_type_char" >&6 echo "$as_me:$LINENO: checking size of char" >&5 echo $ECHO_N "checking size of char... $ECHO_C" >&6 if test "${ac_cv_sizeof_char+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_char" = yes; then # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (char))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (char))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (char))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_char=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (char), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (char), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (char)); } unsigned long ulongval () { return (long) (sizeof (char)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (char))) < 0) { long i = longval (); if (i != ((long) (sizeof (char)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (char)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_char=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (char), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (char), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val else ac_cv_sizeof_char=0 fi fi echo "$as_me:$LINENO: result: $ac_cv_sizeof_char" >&5 echo "${ECHO_T}$ac_cv_sizeof_char" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_CHAR $ac_cv_sizeof_char _ACEOF echo "$as_me:$LINENO: checking for short" >&5 echo $ECHO_N "checking for short... $ECHO_C" >&6 if test "${ac_cv_type_short+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((short *) 0) return 0; if (sizeof (short)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_short=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_short=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5 echo "${ECHO_T}$ac_cv_type_short" >&6 echo "$as_me:$LINENO: checking size of short" >&5 echo $ECHO_N "checking size of short... $ECHO_C" >&6 if test "${ac_cv_sizeof_short+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_short" = yes; then # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_short=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (short), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (short)); } unsigned long ulongval () { return (long) (sizeof (short)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (short))) < 0) { long i = longval (); if (i != ((long) (sizeof (short)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (short)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_short=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (short), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val else ac_cv_sizeof_short=0 fi fi echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 echo "${ECHO_T}$ac_cv_sizeof_short" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF echo "$as_me:$LINENO: checking for int" >&5 echo $ECHO_N "checking for int... $ECHO_C" >&6 if test "${ac_cv_type_int+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((int *) 0) return 0; if (sizeof (int)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_int=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_int=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 echo "${ECHO_T}$ac_cv_type_int" >&6 echo "$as_me:$LINENO: checking size of int" >&5 echo $ECHO_N "checking size of int... $ECHO_C" >&6 if test "${ac_cv_sizeof_int+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_int" = yes; then # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_int=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (int), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (int)); } unsigned long ulongval () { return (long) (sizeof (int)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (int))) < 0) { long i = longval (); if (i != ((long) (sizeof (int)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (int)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_int=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (int), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val else ac_cv_sizeof_int=0 fi fi echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 echo "${ECHO_T}$ac_cv_sizeof_int" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF echo "$as_me:$LINENO: checking for long" >&5 echo $ECHO_N "checking for long... $ECHO_C" >&6 if test "${ac_cv_type_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((long *) 0) return 0; if (sizeof (long)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_long=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_long=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 echo "${ECHO_T}$ac_cv_type_long" >&6 echo "$as_me:$LINENO: checking size of long" >&5 echo $ECHO_N "checking size of long... $ECHO_C" >&6 if test "${ac_cv_sizeof_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_long" = yes; then # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_long=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (long)); } unsigned long ulongval () { return (long) (sizeof (long)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (long))) < 0) { long i = longval (); if (i != ((long) (sizeof (long)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (long)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_long=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val else ac_cv_sizeof_long=0 fi fi echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 echo "${ECHO_T}$ac_cv_sizeof_long" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF echo "$as_me:$LINENO: checking for long long" >&5 echo $ECHO_N "checking for long long... $ECHO_C" >&6 if test "${ac_cv_type_long_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((long long *) 0) return 0; if (sizeof (long long)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_long_long=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_long_long=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5 echo "${ECHO_T}$ac_cv_type_long_long" >&6 echo "$as_me:$LINENO: checking size of long long" >&5 echo $ECHO_N "checking size of long long... $ECHO_C" >&6 if test "${ac_cv_sizeof_long_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_long_long" = yes; then # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long long))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_long_long=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long long), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (long long)); } unsigned long ulongval () { return (long) (sizeof (long long)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (long long))) < 0) { long i = longval (); if (i != ((long) (sizeof (long long)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (long long)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_long_long=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long long), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val else ac_cv_sizeof_long_long=0 fi fi echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_long" >&5 echo "${ECHO_T}$ac_cv_sizeof_long_long" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long _ACEOF echo "$as_me:$LINENO: checking for float" >&5 echo $ECHO_N "checking for float... $ECHO_C" >&6 if test "${ac_cv_type_float+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((float *) 0) return 0; if (sizeof (float)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_float=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_float=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_float" >&5 echo "${ECHO_T}$ac_cv_type_float" >&6 echo "$as_me:$LINENO: checking size of float" >&5 echo $ECHO_N "checking size of float... $ECHO_C" >&6 if test "${ac_cv_sizeof_float+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_float" = yes; then # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (float))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (float))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (float))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (float))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (float))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_float=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (float), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (float), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (float)); } unsigned long ulongval () { return (long) (sizeof (float)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (float))) < 0) { long i = longval (); if (i != ((long) (sizeof (float)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (float)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_float=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (float), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (float), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val else ac_cv_sizeof_float=0 fi fi echo "$as_me:$LINENO: result: $ac_cv_sizeof_float" >&5 echo "${ECHO_T}$ac_cv_sizeof_float" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_FLOAT $ac_cv_sizeof_float _ACEOF echo "$as_me:$LINENO: checking for double" >&5 echo $ECHO_N "checking for double... $ECHO_C" >&6 if test "${ac_cv_type_double+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((double *) 0) return 0; if (sizeof (double)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_double=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_double=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_double" >&5 echo "${ECHO_T}$ac_cv_type_double" >&6 echo "$as_me:$LINENO: checking size of double" >&5 echo $ECHO_N "checking size of double... $ECHO_C" >&6 if test "${ac_cv_sizeof_double+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_double" = yes; then # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (double))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (double))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (double))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (double))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (double))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_double=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (double), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (double), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (double)); } unsigned long ulongval () { return (long) (sizeof (double)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (double))) < 0) { long i = longval (); if (i != ((long) (sizeof (double)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (double)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_double=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (double), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (double), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val else ac_cv_sizeof_double=0 fi fi echo "$as_me:$LINENO: result: $ac_cv_sizeof_double" >&5 echo "${ECHO_T}$ac_cv_sizeof_double" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_DOUBLE $ac_cv_sizeof_double _ACEOF echo "$as_me:$LINENO: checking for long double" >&5 echo $ECHO_N "checking for long double... $ECHO_C" >&6 if test "${ac_cv_type_long_double+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((long double *) 0) return 0; if (sizeof (long double)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_long_double=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_long_double=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_long_double" >&5 echo "${ECHO_T}$ac_cv_type_long_double" >&6 echo "$as_me:$LINENO: checking size of long double" >&5 echo $ECHO_N "checking size of long double... $ECHO_C" >&6 if test "${ac_cv_sizeof_long_double+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_long_double" = yes; then # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long double))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long double))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long double))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long double))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (long double))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_long_double=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long double), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long double), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (long double)); } unsigned long ulongval () { return (long) (sizeof (long double)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (long double))) < 0) { long i = longval (); if (i != ((long) (sizeof (long double)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (long double)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_long_double=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (long double), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long double), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val else ac_cv_sizeof_long_double=0 fi fi echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_double" >&5 echo "${ECHO_T}$ac_cv_sizeof_long_double" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double _ACEOF echo "$as_me:$LINENO: checking for void *" >&5 echo $ECHO_N "checking for void *... $ECHO_C" >&6 if test "${ac_cv_type_void_p+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((void * *) 0) return 0; if (sizeof (void *)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_void_p=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_void_p=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_void_p" >&5 echo "${ECHO_T}$ac_cv_type_void_p" >&6 echo "$as_me:$LINENO: checking size of void *" >&5 echo $ECHO_N "checking size of void *... $ECHO_C" >&6 if test "${ac_cv_sizeof_void_p+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_void_p" = yes; then # The cast to unsigned long works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (void *))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_void_p=$ac_lo;; '') { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (void *), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } ;; esac else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default long longval () { return (long) (sizeof (void *)); } unsigned long ulongval () { return (long) (sizeof (void *)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) exit (1); if (((long) (sizeof (void *))) < 0) { long i = longval (); if (i != ((long) (sizeof (void *)))) exit (1); fprintf (f, "%ld\n", i); } else { unsigned long i = ulongval (); if (i != ((long) (sizeof (void *)))) exit (1); fprintf (f, "%lu\n", i); } exit (ferror (f) || fclose (f) != 0); ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_void_p=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77 See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (void *), 77 See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f conftest.val else ac_cv_sizeof_void_p=0 fi fi echo "$as_me:$LINENO: result: $ac_cv_sizeof_void_p" >&5 echo "${ECHO_T}$ac_cv_sizeof_void_p" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_VOID_P $ac_cv_sizeof_void_p _ACEOF if test "x${GCC}" = "xyes" then CFLAGS="$CFLAGS" echo "$as_me:$LINENO: checking \"for gcc strength-reduce bug\"" >&5 echo $ECHO_N "checking \"for gcc strength-reduce bug\"... $ECHO_C" >&6 if test "${ac_cv_c_gcc_strength_bug+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_c_gcc_strength_bug="yes" else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main(void) { static int Array[3]; unsigned int B = 3; int i; for(i=0; i&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_gcc_strength_bug="no" else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_c_gcc_strength_bug="yes" fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_cv_c_gcc_strength_bug" >&5 echo "${ECHO_T}$ac_cv_c_gcc_strength_bug" >&6 if test "$ac_cv_c_gcc_strength_bug" = "yes" then CFLAGS="$CFLAGS -fno-strength-reduce" fi fi echo "$as_me:$LINENO: checking \"whether external symbols need an underscore prefix\"" >&5 echo $ECHO_N "checking \"whether external symbols need an underscore prefix\"... $ECHO_C" >&6 if test "${ac_cv_c_extern_prefix+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else saved_libs=$LIBS LIBS="conftest_asm.s $LIBS" cat > conftest_asm.s <conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ extern int ac_test; int main () { if (ac_test) return 1 ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_extern_prefix="yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_extern_prefix="no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$saved_libs fi echo "$as_me:$LINENO: result: $ac_cv_c_extern_prefix" >&5 echo "${ECHO_T}$ac_cv_c_extern_prefix" >&6 if test "$ac_cv_c_extern_prefix" = "yes" then cat >>confdefs.h <<\_ACEOF #define NEED_UNDERSCORE_PREFIX 1 _ACEOF fi echo "$as_me:$LINENO: checking \"which ANSI integer type is 16 bit\"" >&5 echo $ECHO_N "checking \"which ANSI integer type is 16 bit\"... $ECHO_C" >&6 if test "${ac_16bit_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_16bit_type= else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main(void) { if (sizeof(short)==2) return(0); else if (sizeof(int)==2) return(1); else return(2); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_16bit_type="short" else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_16bit_type="int" fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_16bit_type" >&5 echo "${ECHO_T}$ac_16bit_type" >&6 if test "$ac_16bit_type" = "short" then T1_AA_TYPE16="-DT1_AA_TYPE16=short" T1_INT16="short" else T1_AA_TYPE16="-DT1_AA_TYPE16=int" T1_INT16="int" fi echo "$as_me:$LINENO: checking \"which ANSI integer type is 32 bit\"" >&5 echo $ECHO_N "checking \"which ANSI integer type is 32 bit\"... $ECHO_C" >&6 if test "${ac_32bit_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_32bit_type= else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main(void) { if (sizeof(int)==4) return(0); else if (sizeof(long)==4) return(1); else return(2); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_32bit_type="int" else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_32bit_type="long" fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_32bit_type" >&5 echo "${ECHO_T}$ac_32bit_type" >&6 if test "$ac_32bit_type" = "int" then T1_AA_TYPE32="-DT1_AA_TYPE32=int" T1_INT32="int" else T1_AA_TYPE32="-DT1_AA_TYPE32=long" T1_INT32="long" fi echo "$as_me:$LINENO: checking \"which ANSI integer type is 64 bit\"" >&5 echo $ECHO_N "checking \"which ANSI integer type is 64 bit\"... $ECHO_C" >&6 if test "${ac_64bit_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main(void) { if (sizeof(long)==8) return(0); else return(1); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_64bit_type="long" else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_64bit_type="" fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi echo "$as_me:$LINENO: result: $ac_64bit_type" >&5 echo "${ECHO_T}$ac_64bit_type" >&6 if test "$ac_64bit_type" = "long" then T1_AA_TYPE64="-DT1_AA_TYPE64=long" else T1_AA_TYPE64= fi CFLAGS="${CFLAGS} -DT1LIB_IDENT=\"\\\"${T1LIB_IDENTIFIER}\\\"\" -DGLOBAL_CONFIG_DIR=\"\\\"${T1LIB_DATA_DIR}\\\"\"" echo "$as_me:$LINENO: checking whether stat file-mode macros are broken" >&5 echo $ECHO_N "checking whether stat file-mode macros are broken... $ECHO_C" >&6 if test "${ac_cv_header_stat_broken+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if defined(S_ISBLK) && defined(S_IFDIR) # if S_ISBLK (S_IFDIR) You lose. # endif #endif #if defined(S_ISBLK) && defined(S_IFCHR) # if S_ISBLK (S_IFCHR) You lose. # endif #endif #if defined(S_ISLNK) && defined(S_IFREG) # if S_ISLNK (S_IFREG) You lose. # endif #endif #if defined(S_ISSOCK) && defined(S_IFREG) # if S_ISSOCK (S_IFREG) You lose. # endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "You lose" >/dev/null 2>&1; then ac_cv_header_stat_broken=yes else ac_cv_header_stat_broken=no fi rm -f conftest* fi echo "$as_me:$LINENO: result: $ac_cv_header_stat_broken" >&5 echo "${ECHO_T}$ac_cv_header_stat_broken" >&6 if test $ac_cv_header_stat_broken = yes; then cat >>confdefs.h <<\_ACEOF #define STAT_MACROS_BROKEN 1 _ACEOF fi echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 x; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; ccp = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++ccp; p = (char**) ccp; ccp = (char const *const *) p; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6 if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi echo "$as_me:$LINENO: checking for size_t" >&5 echo $ECHO_N "checking for size_t... $ECHO_C" >&6 if test "${ac_cv_type_size_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((size_t *) 0) return 0; if (sizeof (size_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_size_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 echo "${ECHO_T}$ac_cv_type_size_t" >&6 if test $ac_cv_type_size_t = yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned _ACEOF fi if test "$no_x" = "yes" then MAIN_TARGET="libt1.la" MAIN_HEADER="t1lib.h" XSUBDIRS="" T1LIBX_OBJS="" T1LIBX_SRCS="" T1LIBX_HEADERS="" XOBJS="" else MAIN_TARGET="libt1.la libt1x.la" MAIN_HEADER="t1lib.h t1libx.h" XSUBDIRS="xglyph" T1LIBX_OBJS="t1lib/t1x11.lo" T1LIBX_SRCS="t1lib/t1x11.c" T1LIBX_HEADERS="t1lib/t1x11.h t1lib/t1libx.h" XOBJS="t1x11.lo" fi if test "$no_x" = "yes" then CFLAGS="${CFLAGS} -DT1LIB_NO_X11_SUPPORT" MAKEFILES="Makefile \ lib/Makefile \ lib/type1/Makefile \ lib/t1lib/Makefile \ type1afm/Makefile \ examples/Makefile \ doc/Makefile" else MAKEFILES="Makefile \ lib/Makefile \ lib/type1/Makefile \ lib/t1lib/Makefile \ xglyph/Makefile \ type1afm/Makefile \ examples/Makefile \ doc/Makefile" fi ac_config_files="$ac_config_files $MAKEFILES lib/t1lib/t1lib.h" 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, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi DEFS=-DHAVE_CONFIG_H 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_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $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} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; 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 # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. 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 ;; 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 { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); 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 sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # 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'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet 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 Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done 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 if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "$MAKEFILES" ) CONFIG_FILES="$CONFIG_FILES $MAKEFILES" ;; "lib/t1lib/t1lib.h" ) CONFIG_FILES="$CONFIG_FILES lib/t1lib/t1lib.h" ;; "lib/t1lib/sysconf.h" ) CONFIG_HEADERS="$CONFIG_HEADERS lib/t1lib/sysconf.h:lib/t1lib/sysconf.h.in" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@LDLIBS@,$LDLIBS,;t t s,@PROGEXT@,$PROGEXT,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@T1LIB_LT_CURRENT@,$T1LIB_LT_CURRENT,;t t s,@T1LIB_LT_REVISION@,$T1LIB_LT_REVISION,;t t s,@T1LIB_LT_AGE@,$T1LIB_LT_AGE,;t t s,@T1LIB_DATA_DIR@,$T1LIB_DATA_DIR,;t t s,@T1LIB_IDENTIFIER@,$T1LIB_IDENTIFIER,;t t s,@MAIN_TARGET@,$MAIN_TARGET,;t t s,@MAIN_HEADER@,$MAIN_HEADER,;t t s,@OPTIONS@,$OPTIONS,;t t s,@no_x@,$no_x,;t t s,@CC@,$CC,;t t s,@T1_AA_TYPE16@,$T1_AA_TYPE16,;t t s,@T1_AA_TYPE32@,$T1_AA_TYPE32,;t t s,@T1_AA_TYPE64@,$T1_AA_TYPE64,;t t s,@T1_INT16@,$T1_INT16,;t t s,@T1_INT32@,$T1_INT32,;t t s,@XSUBDIRS@,$XSUBDIRS,;t t s,@T1LIBX_OBJS@,$T1LIBX_OBJS,;t t s,@T1LIBX_SRCS@,$T1LIBX_SRCS,;t t s,@T1LIBX_HEADERS@,$T1LIBX_HEADERS,;t t s,@XOBJS@,$XOBJS,;t t s,@T1LIB_VERSION@,$T1LIB_VERSION,;t t s,@T1LIB_REVISION@,$T1LIB_REVISION,;t t s,@T1LIB_PATCHLEVEL@,$T1LIB_PATCHLEVEL,;t t s,@T1LIB_VERSIONSTRING@,$T1LIB_VERSIONSTRING,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@CPP@,$CPP,;t t s,@X_CFLAGS@,$X_CFLAGS,;t t s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t s,@X_LIBS@,$X_LIBS,;t t s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t s,@build_os@,$build_os,;t t s,@host@,$host,;t t s,@host_cpu@,$host_cpu,;t t s,@host_vendor@,$host_vendor,;t t s,@host_os@,$host_os,;t t s,@EGREP@,$EGREP,;t t s,@LN_S@,$LN_S,;t t s,@ECHO@,$ECHO,;t t s,@AR@,$AR,;t t s,@ac_ct_AR@,$ac_ct_AR,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@CXX@,$CXX,;t t s,@CXXFLAGS@,$CXXFLAGS,;t t s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@CXXCPP@,$CXXCPP,;t t s,@F77@,$F77,;t t s,@FFLAGS@,$FFLAGS,;t t s,@ac_ct_F77@,$ac_ct_F77,;t t s,@LIBTOOL@,$LIBTOOL,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_HEADER section. # # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } # Do quote $f, to prevent DOS paths from being IFS'd. echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. sed 's/[ ]*$//' $ac_file_inputs >$tmp/in _ACEOF # Transform confdefs.h into two sed scripts, `conftest.defines' and # `conftest.undefs', that substitutes the proper values into # config.h.in to produce config.h. The first handles `#define' # templates, and the second `#undef' templates. # And first: Protect against being on the right side of a sed subst in # config.status. Protect against being in an unquoted here document # in config.status. rm -f conftest.defines conftest.undefs # Using a here document instead of a string reduces the quoting nightmare. # Putting comments in sed scripts is not portable. # # `end' is used to avoid that the second main sed command (meant for # 0-ary CPP macros) applies to n-ary macro definitions. # See the Autoconf documentation for `clear'. cat >confdef2sed.sed <<\_ACEOF s/[\\&,]/\\&/g s,[\\$`],\\&,g t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp t end s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp : end _ACEOF # If some macros were called several times there might be several times # the same #defines, which is useless. Nevertheless, we may not want to # sort them, since we want the *last* AC-DEFINE to be honored. uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs rm -f confdef2sed.sed # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >>conftest.undefs <<\_ACEOF s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, _ACEOF # Break up conftest.defines because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS echo ' :' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.defines >/dev/null do # Write a limited-size here document to $tmp/defines.sed. echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#define' lines. echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/defines.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines echo ' fi # grep' >>$CONFIG_STATUS echo >>$CONFIG_STATUS # Break up conftest.undefs because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #undef templates' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.undefs >/dev/null do # Write a limited-size here document to $tmp/undefs.sed. echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#undef' echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/undefs.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail rm -f conftest.undefs mv conftest.tail conftest.undefs done rm -f conftest.undefs cat >>$CONFIG_STATUS <<\_ACEOF # 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. */ if test x"$ac_file" = x-; then echo "/* Generated by configure. */" >$tmp/config.h else echo "/* $ac_file. Generated by configure. */" >$tmp/config.h fi cat $tmp/in >>$tmp/config.h rm -f $tmp/in if test x"$ac_file" != x-; then if diff $ac_file $tmp/config.h >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } rm -f $ac_file mv $tmp/config.h $ac_file fi else cat $tmp/config.h rm -f $tmp/config.h fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: 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 || { (exit 1); exit 1; } fi echo echo "Configure finished!" echo " Do: 'make' to compile the t1lib-package." echo " Do: 'make without_doc' to compile if you do not have LaTeX." echo " Do: 'make install' to install the t1lib-package." echo "" xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/etc/0000775000175000017500000000000011742726711020266 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/etc/README0000664000175000017500000000030711742726711021146 0ustar uwabamiuwabamiThis directory is intended as a container for files which have turned to be handy during development. It is not for using t1lib. 2002-12-08, RMz xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/etc/charpath2.ps0000664000175000017500000002675511742726711022525 0ustar uwabamiuwabami% 3. /xa 100 def /ya 100 def /xb 100 def /yb 400 def /xc 500 def /yc 750 def /xd 500 def /yd 100 def % 4. /xa 100 def /ya 300 def /xb 100 def /y5 400 def /xc 500 def /yc 300 def /xd 300 def /yd 300 def % 1. /xa 100 def /ya 100 def /xb 300 def /yb 150 def /xc 300 def /yc 500 def /xd 550 def /yd 600 def % 2. /xa 100 def /ya 100 def /xb 100 def /yb 400 def /xc 300 def /yc 550 def /xd 500 def /yd 600 def %% t1lib test %100 100 translate /TimesRoman findfont 25 scalefont setfont /line1 20 string def % t1lib test . segment 1 /xa 139.000000 def /ya 118.000000 def /xb 104.000000 def /yb 118.000000 def /xc 75.000000 def /yc 90.000000 def /xd 75.000000 def /yd 54.000000 def % t1lib test . segment 2 /xa 75.000000 def /ya 54.000000 def /xb 75.000000 def /yb 18.000000 def /xc 104.000000 def /yc -9.000000 def /xd 139.000000 def /yd -9.000000 def % t1lib test Bitstream Charter BT Roman Character R: curve ppoints 19 ... 22 /xa 404.000000 def /ya 192.000000 def /xb 425.000000 def /yb 128.000000 def /xc 429.000000 def /yc 63.000000 def /xd 477.000000 def /yd 21.000000 def % test a straight line, slope 45 degrees /xa 100.0 def /ya 100.0 def /xb 150.0 def /yb 125.0001 def /xc 200.0 def /yc 150.0 def /xd 250.0 def /yd 175.0 def % t1lib test Bitstream Charter BT Roman Character R: curve ppoints 29 ... 32 /xa 656.000000 def /ya 39.000000 def /xb 653.000000 def /yb 39.000000 def /xc 650.000000 def /yc 39.000000 def /xd 647.000000 def /yd 39.000000 def % t1lib test Bitstream Charter BT Roman Character R: curve ppoints 29 ... 32 /xa 656.000000 def /ya 39.000000 def /xb 653.000000 def /yb 39.000000 def /xc 650.000000 def /yc 39.000000 def /xd 647.000000 def /yd 39.000000 def % t1lib test Bitstream Charter BT Roman Character R: curve ppoints 19 ... 22 /xa 404.000000 def /ya 192.000000 def /xb 425.000000 def /yb 128.000000 def /xc 429.000000 def /yc 63.000000 def /xd 477.000000 def /yd 21.000000 def /xa 404.000000 def /ya 192.000000 def %/xb 424.90100 def % critical location where tmp2 approx. equals btmp3 /xb 424.90666 def % critical location where tmp2 approx. equals btmp3 /yb 128.000000 def /xc 429.000000 def /yc 63.000000 def /xd 477.000000 def /yd 21.000000 def /xa 305.000000 def /ya 652.000000 def /xb 395.000000 def /yb 652.000000 def /xc 507.000000 def /yc 648.000000 def /xd 507.000000 def /yd 503.000000 def /xa 435.000000 00 sub def /ya 340.000000 def /xb 532.000000 00 sub def /yb 364.000000 def /xc 610.000000 00 sub def /yc 425.000000 def /xd 610.000000 00 sub def /yd 503.000000 def /xa 458.000000 def /ya 357.000000 def /xb 555.000000 def /yb 376.000000 def /xc 624.000000 def /yc 440.000000 def /xd 624.000000 def /yd 514.000000 def /xa 327.000000 def /ya 89.000000 def /xb 335.000000 def /yb 78.000000 def /xc 348.000000 def /yc 62.000000 def /xd 348.000000 def /yd 56.000000 def /linewidth 30 def % compute distance from Bezier_A to Bezier_B /dista xb xa sub dup mul yb ya sub dup mul add sqrt def % compute distance from Bezier_C to Bezier_D /distd xd xc sub dup mul yd yc sub dup mul add sqrt def /diameter linewidth 2 div def % compute resulting limit values of thick curve at end points /dxa yb ya sub diameter mul dista div def /dya xb xa sub diameter mul dista div neg def /dxd yd yc sub diameter mul distd div def /dyd xd xc sub diameter mul distd div neg def % draw curve as rendered by ghostscript xa ya moveto xb yb xc yc xd yd curveto %linewidth 40 div setlinewidth linewidth setlinewidth 0 setlinecap stroke % correct right path end points /xar xa dxa add def /yar ya dya add def /xdr xd dxd add def /ydr yd dyd add def % correct left path end points /xal xa dxa sub def /yal ya dya sub def /xdl xd dxd sub def /ydl yd dyd sub def /x1 xa xb add 0.5 mul def /y1 ya yb add 0.5 mul def /x2 xb xc add 0.5 mul def /y2 yb yc add 0.5 mul def /x3 xc xd add 0.5 mul def /y3 yc yd add 0.5 mul def /x4 xa xb 2 mul add xc add 4 div def /y4 ya yb 2 mul add yc add 4 div def /x5 xd xc 2 mul add xb add 4 div def /y5 yd yc 2 mul add yb add 4 div def /x6 xa xb 3 mul add xc 3 mul add xd add 8 div def /y6 ya yb 3 mul add yc 3 mul add yd add 8 div def 0 0 0 setrgbcolor newpath xa ya 2.0 0 360 arc closepath fill newpath xb yb 2.0 0 360 arc closepath fill newpath xc yc 2.0 0 360 arc closepath fill newpath xd yd 2.0 0 360 arc closepath fill 1 0 0 setrgbcolor newpath x1 y1 2.0 0 360 arc closepath fill newpath x2 y2 2.0 0 360 arc closepath fill newpath x3 y3 2.0 0 360 arc closepath fill 0 1 0 setrgbcolor newpath x4 y4 2.0 0 360 arc closepath fill newpath x5 y5 2.0 0 360 arc closepath fill 0 0 1 setrgbcolor newpath x6 y6 2.0 0 360 arc closepath fill % compute right-side normal vector /nabs diameter x5 x4 sub dup mul y5 y4 sub dup mul add sqrt div def /nxr y5 y4 sub nabs mul def /nyr x4 x5 sub nabs mul def % calculate location and direction vectors of lines to intersect /bloc1x 4 nxr x6 add mul xar 2 mul sub xdr add 3 div def /bloc1y 4 nyr y6 add mul yar 2 mul sub ydr add 3 div def /bdir1x xc xd add xa sub xb sub def /bdir1y yc yd add ya sub yb sub def /bloc2x xar def /bloc2y yar def /bdir2x xb xa sub def /bdir2y yb ya sub def % calculate determinant and inverse /bdet bdir2x bdir1y mul bdir2y bdir1x mul sub def %bdet 0.0 eq bdet abs 0.001 le { /xbr xb nxr add def /ybr yb nyr add def /bnu 0.0 def /bmu 0.0 def } { /binvdet 1 bdet div def % calculate inverse of dir matrix /binvdir2x bdir1y binvdet mul def /binvdir2y bdir2y binvdet mul neg def /binvdir1x bdir1x binvdet mul neg def /binvdir1y bdir2x binvdet mul def % calculate mu and nu value (nu actually is not required) /bmu binvdir2x bloc1x bloc2x sub mul binvdir1x bloc1y bloc2y sub mul add def /bnu binvdir2y bloc1x bloc2x sub mul binvdir1y bloc1y bloc2y sub mul add def /xbr bloc2x bmu bdir2x mul add def /ybr bloc2y bmu bdir2y mul add def } ifelse % calculate location and direction vectors of lines to intersect /cloc1x 4 nxr x6 add mul xar add xdr 2 mul sub 3 div def /cloc1y 4 nyr y6 add mul yar add ydr 2 mul sub 3 div def /cdir1x xc xd add xa sub xb sub def /cdir1y yc yd add ya sub yb sub def /cloc2x xdr def /cloc2y ydr def /cdir2x xc xd sub def /cdir2y yc yd sub def % calculate determinant and inverse /cdet cdir2x cdir1y mul cdir2y cdir1x mul sub def %cdet 0.0 eq cdet abs 0.001 le { % curve is just a straight line /xcr xc nxr add def /ycr yc nyr add def /cmu 0.0 def } { /cinvdet 1 cdet div def % calculate inverse of dir matrix /cinvdir2x cdir1y cinvdet mul def /cinvdir2y cdir2y cinvdet mul neg def /cinvdir1x cdir1x cinvdet mul neg def /cinvdir1y cdir2x cinvdet mul def % calculate mu and nu value (mu actually is not required) /cmu cinvdir2x cloc1x cloc2x sub mul cinvdir1x cloc1y cloc2y sub mul add def /cnu cinvdir2y cloc1x cloc2x sub mul cinvdir1y cloc1y cloc2y sub mul add def /xcr cloc2x cmu cdir2x mul add def /ycr cloc2y cmu cdir2y mul add def } ifelse % Analyse coefficients and decide how to compute displacements bmu 0.1 le { /xbr 8 nxr x6 add mul xar sub xdr sub 3 div xcr sub def /ybr 8 nyr y6 add mul yar sub ydr sub 3 div ycr sub def } if cmu 0.1 le { /xcr 8 nxr x6 add mul xar sub xdr sub 3 div xbr sub def /ycr 8 nyr y6 add mul yar sub ydr sub 3 div ybr sub def } if % % display debug info on page 10 625 moveto (xa = ) show xa line1 cvs show 10 600 moveto (ya = ) show ya line1 cvs show 10 575 moveto (xb = ) show xb line1 cvs show 10 550 moveto (yb = ) show yb line1 cvs show 10 525 moveto (xc = ) show xc line1 cvs show 10 500 moveto (yc = ) show yc line1 cvs show 10 475 moveto (xd = ) show xd line1 cvs show 10 450 moveto (yd = ) show yd line1 cvs show % display debug info on page 10 425 moveto (xar = ) show xar line1 cvs show 10 400 moveto (yar = ) show yar line1 cvs show 10 375 moveto (xbr = ) show xbr line1 cvs show 10 350 moveto (ybr = ) show ybr line1 cvs show 10 325 moveto (xcr = ) show xcr line1 cvs show 10 300 moveto (ycr = ) show ycr line1 cvs show 10 275 moveto (xdr = ) show xdr line1 cvs show 10 250 moveto (ydr = ) show ydr line1 cvs show 10 1150 moveto (bdir1x = ) show bdir1x line1 cvs show 10 1125 moveto (bdir1y = ) show bdir1y line1 cvs show 10 1100 moveto (bdir2x = ) show bdir2x line1 cvs show 10 1075 moveto (bdir2y = ) show bdir2y line1 cvs show 10 1050 moveto (cdir1x = ) show cdir1x line1 cvs show 10 1025 moveto (cdir1y = ) show cdir1y line1 cvs show 10 1000 moveto (cdir2x = ) show cdir2x line1 cvs show 10 975 moveto (cdir2y = ) show cdir2y line1 cvs show 210 1150 moveto (bloc1x = ) show bloc1x line1 cvs show 210 1125 moveto (bloc1y = ) show bloc1y line1 cvs show 210 1100 moveto (bloc2x = ) show bloc2x line1 cvs show 210 1075 moveto (bloc2y = ) show bloc2y line1 cvs show 210 1050 moveto (cloc1x = ) show cloc1x line1 cvs show 210 1025 moveto (cloc1y = ) show cloc1y line1 cvs show 210 1000 moveto (cloc2x = ) show cloc2x line1 cvs show 210 975 moveto (cloc2y = ) show cloc2y line1 cvs show 10 925 moveto (bdet = ) show bdet line1 cvs show 10 900 moveto (cdet = ) show cdet line1 cvs show 10 850 moveto (bmu = ) show bmu line1 cvs show 10 825 moveto (cmu = ) show cmu line1 cvs show 10 800 moveto (bnu = ) show bnu line1 cvs show 10 775 moveto (cnu = ) show cnu line1 cvs show 210 850 moveto (nabs = ) show nabs line1 cvs show 210 825 moveto (nxr = ) show nxr line1 cvs show 210 800 moveto (nyr = ) show nyr line1 cvs show 10 700 moveto (P1 = \( ) show x1 line1 cvs show ( , ) show y1 line1 cvs show ( \)) show 10 675 moveto (P2 = \( ) show x2 line1 cvs show ( , ) show y2 line1 cvs show ( \)) show 10 650 moveto (P3 = \( ) show x3 line1 cvs show ( , ) show y3 line1 cvs show ( \)) show 310 700 moveto (P4 = \( ) show x4 line1 cvs show ( , ) show y4 line1 cvs show ( \)) show 310 675 moveto (P5 = \( ) show x5 line1 cvs show ( , ) show y5 line1 cvs show ( \)) show 310 650 moveto (P6 = \( ) show x6 line1 cvs show ( , ) show y6 line1 cvs show ( \)) show % define delta values /dxb xbr xb sub def /dyb ybr yb sub def /dxc xcr xc sub def /dyc ycr yc sub def 2 setlinewidth % show shifted line x4 nxr add y4 nyr add moveto x5 nxr add y5 nyr add lineto x4 nxr sub y4 nyr sub moveto x5 nxr sub y5 nyr sub lineto stroke 1 0 0 setrgbcolor 0.5 setlinewidth % stroke right curve xar yar moveto xb dxb add yb dyb add xc dxc add yc dyc add xdr ydr curveto stroke % stroke left curve xal yal moveto xb dxb sub yb dyb sub xc dxc sub yc dyc sub xdl ydl curveto stroke %0.2 0.5 0.8 setrgbcolor %newpath bloc2x bloc2y 5.0 0 360 arc closepath fill %bloc2x 10 bdir2x mul sub bloc2y 10 bdir2y mul sub moveto %bloc2x 10 bdir2x mul add bloc2y 10 bdir2y mul add lineto stroke %0.5 0.5 0.5 setrgbcolor %newpath bloc1x bloc1y 5.0 0 360 arc closepath fill %bloc1x 10 bdir1x mul sub bloc1y 10 bdir1y mul sub moveto %bloc1x 10 bdir1x mul add bloc1y 10 bdir1y mul add lineto stroke 0 0 1 setrgbcolor %1 setlinewidth %[5 5] 0 setdash 0.1 setlinewidth [1 0] 0 setdash xa ya moveto xb yb lineto stroke xd yd moveto xc yc lineto stroke xar yar moveto xb dxb add yb dyb add lineto stroke xdr ydr moveto xc dxc add yc dyc add lineto stroke xal yal moveto xb dxb sub yb dyb sub lineto stroke xdl ydl moveto xc dxc sub yc dyc sub lineto stroke %xa diameter add ya moveto %xa diameter add yb diameter 2 div sub xc diameter 2 div add yc diameter sub xd yd diameter sub curveto %stroke %xa diameter sub ya moveto %xa diameter sub yb diameter 2 div add xc diameter 2 div sub yc diameter add xd yd diameter add curveto %stroke %/TimesItalic findfont 500 scalefont setfont %/Hershey-Gothic-English findfont 500 scalefont setfont %100 400 moveto %(a) true charpath stroke %0 0 0 setrgbcolor %0.5 setlinewidth %100 400 moveto %(a) true charpath stroke %(T) show showpage xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/0000775000175000017500000000000011742726711020260 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1_data.eps0000664000175000017500000006444211742726711022320 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-2.0 %%Title: t1_data.eps %%Creator: fig2dev Version 3.2 Patchlevel 0-beta3 %%CreationDate: Fri Oct 16 19:05:50 1998 %%For: rainer@mman (Rainer Menzner) %%Orientation: Portrait %%BoundingBox: 0 0 612 467 %%Pages: 0 %%BeginSetup %%EndSetup %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save -13.0 469.0 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /reencdict 12 dict def /ReEncode { reencdict begin /newcodesandnames exch def /newfontname exch def /basefontname exch def /basefontdict basefontname findfont def /newfont basefontdict maxlength dict def basefontdict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName newfontname put newcodesandnames aload pop 128 1 255 { newfont /Encoding get exch /.notdef put } for newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat newfontname newfont definefont pop end } def /isovec [ 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde 8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis 8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron 8#220 /dotlessi 8#230 /oe 8#231 /OE 8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling 8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis 8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot 8#255 /endash 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus 8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph 8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine 8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf 8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute 8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring 8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute 8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute 8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve 8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply 8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex 8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave 8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring 8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute 8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute 8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve 8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide 8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex 8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def /Helvetica-Narrow-Bold /Helvetica-Narrow-Bold-iso isovec ReEncode /Helvetica-Narrow /Helvetica-Narrow-iso isovec ReEncode /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc closepath savematrix setmatrix } def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog $F2psBegin 10 setmiterlimit n -1000 8437 m -1000 -1000 l 10912 -1000 l 10912 8437 l cp clip 0.06299 0.06299 sc % Polyline 7.500 slw n 6750 1125 m 7650 1125 l 7650 675 l 6750 675 l cp gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 7200 855 m gs 1 -1 sc (External Encoding) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 7200 1005 m gs 1 -1 sc (\(optional\)) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline n 7740 1125 m 8640 1125 l 8640 675 l 7740 675 l cp gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 8190 855 m gs 1 -1 sc (Internal Type 1) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 8190 1005 m gs 1 -1 sc (Data Structures) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline n 5310 1935 m 5940 1935 l 5940 1710 l 5310 1710 l cp gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 5625 1845 m gs 1 -1 sc (KernMap) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline n 6210 1935 m 6840 1935 l 6840 1710 l 6210 1710 l cp gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 6525 1845 m gs 1 -1 sc (EncMap) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline n 7650 4365 m 8550 4365 l 8550 3870 l 7650 3870 l cp gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 8100 4140 m gs 1 -1 sc (glyphs[256]) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline gs clippath 7479 3840 m 7623 3870 l 7479 3900 l 7665 3900 l 7665 3840 l cp clip n 5940 3555 m 6750 3555 l 6750 3870 l 7650 3870 l gs col0 s gr gr % arrowhead n 7479 3840 m 7623 3870 l 7479 3900 l 7503 3870 l 7479 3840 l cp gs 0.00 setgray ef gr col0 s % Polyline n 7650 3105 m 8550 3105 l 8550 2610 l 7650 2610 l cp gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 8100 2880 m gs 1 -1 sc (glyphs[256]) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline gs clippath 7479 2580 m 7623 2610 l 7479 2640 l 7665 2640 l 7665 2580 l cp clip n 5940 2295 m 6750 2295 l 6750 2610 l 7650 2610 l gs col0 s gr gr % arrowhead n 7479 2580 m 7623 2610 l 7479 2640 l 7503 2610 l 7479 2580 l cp gs 0.00 setgray ef gr col0 s % Polyline n 4950 6075 m 5940 6075 l gs col0 s gr % Polyline n 4950 6255 m 5940 6255 l gs col0 s gr % Polyline n 4950 6435 m 5940 6435 l gs col0 s gr % Polyline n 4950 6615 m 5940 6615 l gs col0 s gr % Polyline n 4950 6795 m 5940 6795 l gs col0 s gr % Polyline n 4950 5895 m 5940 5895 l 5940 6975 l 4950 6975 l cp gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 6030 m gs 1 -1 sc (pFontCache) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 6210 m gs 1 -1 sc (pNextFontSizeDeps) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 6390 m gs 1 -1 sc (pPrevFontSizeDeps) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 6570 m gs 1 -1 sc (pCharSpaceLocal) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 6750 m gs 1 -1 sc (float size) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 6930 m gs 1 -1 sc (int antialias) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline n 7650 6795 m 8550 6795 l 8550 6300 l 7650 6300 l cp gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 8100 6570 m gs 1 -1 sc (glyphs[256]) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline gs clippath 7479 6270 m 7623 6300 l 7479 6330 l 7665 6330 l 7665 6270 l cp clip n 5940 5985 m 6750 5985 l 6750 6300 l 7650 6300 l gs col0 s gr gr % arrowhead n 7479 6270 m 7623 6300 l 7479 6330 l 7503 6300 l 7479 6270 l cp gs 0.00 setgray ef gr col0 s % Polyline n 4950 3645 m 5940 3645 l gs col0 s gr % Polyline n 4950 3825 m 5940 3825 l gs col0 s gr % Polyline n 4950 4005 m 5940 4005 l gs col0 s gr % Polyline n 4950 4185 m 5940 4185 l gs col0 s gr % Polyline n 4950 4365 m 5940 4365 l gs col0 s gr % Polyline n 4950 3465 m 5940 3465 l 5940 4545 l 4950 4545 l cp gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 3600 m gs 1 -1 sc (pFontCache) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 3780 m gs 1 -1 sc (pNextFontSizeDeps) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 3960 m gs 1 -1 sc (pPrevFontSizeDeps) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 4140 m gs 1 -1 sc (pCharSpaceLocal) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 4320 m gs 1 -1 sc (float size) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 4500 m gs 1 -1 sc (int antialias) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline n 4950 2385 m 5940 2385 l gs col0 s gr % Polyline n 4950 2565 m 5940 2565 l gs col0 s gr % Polyline n 4950 2745 m 5940 2745 l gs col0 s gr % Polyline n 4950 2925 m 5940 2925 l gs col0 s gr % Polyline n 4950 3105 m 5940 3105 l gs col0 s gr % Polyline n 4950 2205 m 5940 2205 l 5940 3285 l 4950 3285 l cp gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 2340 m gs 1 -1 sc (pFontCache) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 2520 m gs 1 -1 sc (pNextFontSizeDeps) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 2700 m gs 1 -1 sc (pPrevFontSizeDeps) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 2880 m gs 1 -1 sc (pCharSpaceLocal) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 3060 m gs 1 -1 sc (float size) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 5445 3240 m gs 1 -1 sc (int antialias) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline n 450 2655 m 2070 2655 l gs col0 s gr % Polyline n 450 2475 m 2070 2475 l 2070 4455 l 450 4455 l cp gs col0 s gr % Polyline n 450 2835 m 2070 2835 l gs col0 s gr % Polyline n 450 3015 m 2070 3015 l gs col0 s gr % Polyline n 450 3195 m 2070 3195 l gs col0 s gr % Polyline n 450 3375 m 2070 3375 l gs col0 s gr % Polyline n 450 3915 m 2070 3915 l gs col0 s gr % Polyline n 450 4095 m 2070 4095 l gs col0 s gr % Polyline n 450 4275 m 2070 4275 l gs col0 s gr /Helvetica-Narrow-iso ff 135.00 scf sf 1260 2610 m gs 1 -1 sc (struct DeviceSpecifics) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 135.00 scf sf 1260 2790 m gs 1 -1 sc (int T1_Up) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 135.00 scf sf 1260 2970 m gs 1 -1 sc (int T1aa_bpp) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 135.00 scf sf 1260 3150 m gs 1 -1 sc (int SetFuncRequestID) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 135.00 scf sf 1260 3510 m gs 1 -1 sc (Filename) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 135.00 scf sf 1260 3690 m gs 1 -1 sc (Searchpath) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 135.00 scf sf 1260 3870 m gs 1 -1 sc (Stuff) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 135.00 scf sf 1260 4050 m gs 1 -1 sc (char err_warn_msg_buf[1024]) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 135.00 scf sf 1260 4230 m gs 1 -1 sc (FILE *t1lib_log_file) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 135.00 scf sf 1260 4410 m gs 1 -1 sc (int t1lib_log_level) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 135.00 scf sf 1260 3330 m gs 1 -1 sc (int T1_errno) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline n 450 630 m 1530 630 l gs col0 s gr % Polyline n 450 810 m 1530 810 l gs col0 s gr % Polyline n 450 990 m 1530 990 l gs col0 s gr % Polyline n 450 1170 m 1530 1170 l gs col0 s gr % Polyline n 450 1350 m 1530 1350 l gs col0 s gr % Polyline n 450 450 m 1530 450 l 1530 1710 l 450 1710 l cp gs col0 s gr % Polyline n 450 1530 m 1530 1530 l gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 990 585 m gs 1 -1 sc (int no_fonts_ini) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 990 765 m gs 1 -1 sc (int no_fonts) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 990 945 m gs 1 -1 sc (int no_fonts_limit) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 990 1125 m gs 1 -1 sc (int bitmap_pad) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 990 1305 m gs 1 -1 sc (int endian) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 990 1665 m gs 1 -1 sc (pFontArray) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 990 1485 m gs 1 -1 sc (char **default_enc) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline n 2700 6300 m 3870 6300 l gs col0 s gr % Polyline n 2700 6480 m 3870 6480 l gs col0 s gr % Polyline n 2700 6660 m 3870 6660 l gs col0 s gr % Polyline n 2700 6840 m 3870 6840 l gs col0 s gr % Polyline n 2700 7020 m 3870 7020 l gs col0 s gr % Polyline n 2700 6120 m 3870 6120 l gs col0 s gr % Polyline n 2700 5940 m 3870 5940 l gs col0 s gr % Polyline n 2700 5760 m 3870 5760 l gs col0 s gr % Polyline n 2700 5580 m 3870 5580 l gs col0 s gr % Polyline n 2700 5400 m 3870 5400 l 3870 7200 l 2700 7200 l cp gs col0 s gr % Polyline n 2700 7200 m 2700 7380 l gs col0 s gr % Polyline n 3870 7200 m 3870 7380 l gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 5535 m gs 1 -1 sc (pFontFileName) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 6255 m gs 1 -1 sc (pKernMap) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 6075 m gs 1 -1 sc (pEncMap) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 5895 m gs 1 -1 sc (pType1Data) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 5715 m gs 1 -1 sc (pAFMData) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 6435 m gs 1 -1 sc (pFontEnc) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 6615 m gs 1 -1 sc (vm_base) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 6795 m gs 1 -1 sc (pFontSizeDeps) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 6975 m gs 1 -1 sc (double FontMatrix[4]) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 7155 m gs 1 -1 sc (double FontTransform[4]) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 7335 m gs 1 -1 sc (float slant) dup sw pop 2 div neg 0 rm col0 sh gr % Polyline n 2700 1215 m 3870 1215 l gs col0 s gr % Polyline n 2700 1395 m 3870 1395 l gs col0 s gr % Polyline n 2700 1575 m 3870 1575 l gs col0 s gr % Polyline n 2700 1755 m 3870 1755 l gs col0 s gr % Polyline n 2700 1935 m 3870 1935 l gs col0 s gr % Polyline n 2700 2115 m 3870 2115 l gs col0 s gr % Polyline n 2700 2295 m 3870 2295 l gs col0 s gr % Polyline n 2700 2475 m 3870 2475 l gs col0 s gr % Polyline n 2700 2655 m 3870 2655 l gs col0 s gr % Polyline n 2700 2835 m 3870 2835 l gs col0 s gr % Polyline n 2700 3015 m 3870 3015 l gs col0 s gr % Polyline n 2700 3195 m 3870 3195 l gs col0 s gr % Polyline n 2700 1035 m 3870 1035 l gs col0 s gr % Polyline n 2700 855 m 3870 855 l gs col0 s gr % Polyline n 2700 675 m 3870 675 l gs col0 s gr % Polyline n 2700 495 m 3870 495 l gs col0 s gr % Polyline n 2700 3555 m 3870 3555 l gs col0 s gr % Polyline n 2700 3735 m 3870 3735 l gs col0 s gr % Polyline n 2700 3915 m 3870 3915 l gs col0 s gr % Polyline n 2700 4095 m 3870 4095 l gs col0 s gr % Polyline n 2700 3375 m 3870 3375 l gs col0 s gr % Polyline n 2700 315 m 3870 315 l 3870 4275 l 2700 4275 l cp gs col0 s gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 450 m gs 1 -1 sc (pFontFileName) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 1170 m gs 1 -1 sc (pKernMap) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 990 m gs 1 -1 sc (pEncMap) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 810 m gs 1 -1 sc (pType1Data) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 630 m gs 1 -1 sc (pAFMData) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 1350 m gs 1 -1 sc (pFontEnc) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 1530 m gs 1 -1 sc (vm_base) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 1710 m gs 1 -1 sc (pFontSizeDeps) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 1890 m gs 1 -1 sc (double FontMatrix[4]) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 2430 m gs 1 -1 sc (float extend) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 2610 m gs 1 -1 sc (float UndrLnPos) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 2790 m gs 1 -1 sc (float UndrLnThick) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 2970 m gs 1 -1 sc (float OvrLnPos) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 3150 m gs 1 -1 sc (float OvrLnThick) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 3330 m gs 1 -1 sc (float OvrStrkPos) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 3510 m gs 1 -1 sc (float OverStrkThick) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 3690 m gs 1 -1 sc (unsigned short physical) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 3870 m gs 1 -1 sc (unsigned short refcount) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 4050 m gs 1 -1 sc (short space_position) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 4230 m gs 1 -1 sc (short info_flags) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 2250 m gs 1 -1 sc (float slant) dup sw pop 2 div neg 0 rm col0 sh gr % Ellipse n 5400 5310 45 45 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr % Ellipse n 5400 5490 45 45 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr 0.000 slw % Ellipse n 3298 4577 45 45 0 360 DrawEllipse gs 0.00 setgray ef gr % Ellipse n 3298 4712 45 45 0 360 DrawEllipse gs 0.00 setgray ef gr % Ellipse n 3285 5310 45 45 0 360 DrawEllipse gs 0.00 setgray ef gr % Ellipse n 3285 5175 45 45 0 360 DrawEllipse gs 0.00 setgray ef gr % Ellipse n 3298 4410 45 45 0 360 DrawEllipse gs 0.00 setgray ef gr % Polyline 7.500 slw gs clippath 2529 375 m 2673 405 l 2529 435 l 2715 435 l 2715 375 l cp clip n 1530 1440 m 2070 1440 l 2070 405 l 2700 405 l gs col0 s gr gr % arrowhead n 2529 375 m 2673 405 l 2529 435 l 2553 405 l 2529 375 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 8220 504 m 8190 648 l 8160 504 l 8160 690 l 8220 690 l cp clip n 3870 765 m 4950 765 l 4950 405 l 8190 405 l 8190 675 l gs col0 s gr gr % arrowhead n 8220 504 m 8190 648 l 8160 504 l 8190 528 l 8220 504 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 9210 504 m 9180 648 l 9150 504 l 9150 690 l 9210 690 l cp clip n 3870 585 m 4500 585 l 4500 315 l 9180 315 l 9180 675 l gs col0 s gr gr % arrowhead n 9210 504 m 9180 648 l 9150 504 l 9180 528 l 9210 504 l cp gs 0.00 setgray ef gr col0 s % Polyline [60] 0 sd n 4275 45 m 4275 7425 l gs col0 s gr [] 0 sd % Polyline [60] 0 sd n 4275 1080 m 6525 1080 l 6525 1215 l 9900 1215 l gs col0 s gr [] 0 sd % Polyline n 8730 1125 m 9630 1125 l 9630 675 l 8730 675 l cp gs col0 s gr % Polyline [60] 0 sd n 225 45 m 9900 45 l 9900 7425 l 225 7425 l cp gs col0 s gr [] 0 sd % Polyline [60] 0 sd n 4275 2115 m 9900 2115 l gs col0 s gr [] 0 sd % Polyline gs clippath 6579 870 m 6723 900 l 6579 930 l 6765 930 l 6765 870 l cp clip n 3870 1305 m 4050 1305 l 4050 900 l 6750 900 l gs col0 s gr gr % arrowhead n 6579 870 m 6723 900 l 6579 930 l 6603 900 l 6579 870 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 5430 1539 m 5400 1683 l 5370 1539 l 5370 1725 l 5430 1725 l cp clip n 3870 1125 m 4140 1125 l 4140 1260 l 5400 1260 l 5400 1710 l gs col0 s gr gr % arrowhead n 5430 1539 m 5400 1683 l 5370 1539 l 5400 1563 l 5430 1539 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 6330 1539 m 6300 1683 l 6270 1539 l 6270 1725 l 6330 1725 l cp clip n 3870 945 m 4185 945 l 4185 1215 l 6300 1215 l 6300 1710 l gs col0 s gr gr % arrowhead n 6330 1539 m 6300 1683 l 6270 1539 l 6300 1563 l 6330 1539 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 4779 3525 m 4923 3555 l 4779 3585 l 4965 3585 l 4965 3525 l cp clip n 5940 2475 m 6300 2475 l 6300 3420 l 4500 3420 l 4500 3555 l 4950 3555 l gs col0 s gr gr % arrowhead n 4779 3525 m 4923 3555 l 4779 3585 l 4803 3555 l 4779 3525 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 4798 2378 m 4928 2311 l 4835 2425 l 4980 2309 l 4943 2262 l cp clip n 5940 3915 m 6120 3915 l 6120 3330 l 4725 3330 l 4725 2475 l 4950 2295 l gs col0 s gr gr % arrowhead n 4798 2378 m 4928 2311 l 4835 2425 l 4835 2387 l 4798 2378 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 4779 5955 m 4923 5985 l 4779 6015 l 4965 6015 l 4965 5955 l cp clip n 4500 5535 m 4500 5985 l 4950 5985 l gs col0 s gr gr % arrowhead n 4779 5955 m 4923 5985 l 4779 6015 l 4803 5985 l 4779 5955 l cp gs 0.00 setgray ef gr col0 s % Polyline n 5940 6345 m 6120 6345 l 6120 5580 l gs col0 s gr % Polyline gs clippath 4798 3638 m 4928 3571 l 4835 3685 l 4980 3569 l 4943 3522 l cp clip n 6120 5085 m 6120 4680 l 6120 4590 l 4725 4590 l 4725 3735 l 4950 3555 l gs col0 s gr gr % arrowhead n 4798 3638 m 4928 3571 l 4835 3685 l 4835 3647 l 4798 3638 l cp gs 0.00 setgray ef gr col0 s % Polyline n 5940 3735 m 6300 3735 l 6300 4680 l 4500 4680 l 4500 5085 l gs col0 s gr % Polyline gs clippath 4779 2265 m 4923 2295 l 4779 2325 l 4965 2325 l 4965 2265 l cp clip n 3870 1845 m 4050 1845 l 4050 2295 l 4950 2295 l gs col0 s gr gr % arrowhead n 4779 2265 m 4923 2295 l 4779 2325 l 4803 2295 l 4779 2265 l cp gs 0.00 setgray ef gr col0 s % Polyline n 4275 5445 m 4277 5446 l 4283 5448 l 4292 5452 l 4306 5457 l 4323 5463 l 4344 5471 l 4366 5479 l 4389 5487 l 4411 5495 l 4434 5503 l 4456 5510 l 4477 5517 l 4499 5524 l 4520 5530 l 4542 5537 l 4566 5543 l 4590 5550 l 4608 5555 l 4626 5560 l 4646 5565 l 4667 5570 l 4688 5575 l 4711 5581 l 4735 5586 l 4759 5592 l 4785 5597 l 4812 5603 l 4840 5608 l 4868 5614 l 4897 5619 l 4927 5624 l 4956 5628 l 4986 5633 l 5017 5637 l 5047 5641 l 5077 5644 l 5106 5647 l 5136 5649 l 5165 5651 l 5194 5653 l 5223 5654 l 5251 5655 l 5280 5655 l 5309 5655 l 5338 5654 l 5367 5653 l 5397 5651 l 5427 5649 l 5458 5647 l 5489 5644 l 5521 5641 l 5553 5638 l 5585 5634 l 5618 5630 l 5650 5626 l 5682 5622 l 5714 5618 l 5745 5613 l 5776 5609 l 5806 5604 l 5835 5600 l 5863 5596 l 5890 5592 l 5916 5588 l 5941 5584 l 5964 5581 l 5987 5578 l 6009 5575 l 6030 5573 l 6056 5570 l 6081 5567 l 6106 5566 l 6130 5564 l 6154 5564 l 6178 5563 l 6203 5564 l 6229 5564 l 6255 5565 l 6282 5567 l 6310 5569 l 6336 5571 l 6361 5573 l 6384 5575 l 6403 5577 l 6417 5578 l 6427 5579 l 6432 5580 l 6435 5580 l gs col0 s gr % Polyline n 4275 5040 m 4278 5040 l 4283 5042 l 4292 5043 l 4306 5046 l 4324 5050 l 4344 5053 l 4367 5058 l 4390 5062 l 4413 5067 l 4436 5071 l 4458 5075 l 4481 5079 l 4503 5083 l 4525 5087 l 4548 5091 l 4572 5096 l 4598 5100 l 4616 5103 l 4636 5107 l 4656 5110 l 4678 5114 l 4700 5117 l 4724 5121 l 4749 5125 l 4775 5129 l 4802 5133 l 4830 5137 l 4859 5141 l 4888 5145 l 4919 5148 l 4949 5152 l 4980 5155 l 5011 5159 l 5042 5162 l 5073 5164 l 5104 5167 l 5134 5169 l 5165 5171 l 5194 5172 l 5224 5173 l 5253 5174 l 5281 5175 l 5310 5175 l 5339 5175 l 5367 5174 l 5396 5173 l 5426 5172 l 5455 5171 l 5486 5169 l 5516 5167 l 5547 5164 l 5578 5162 l 5609 5159 l 5641 5155 l 5672 5152 l 5703 5148 l 5733 5145 l 5763 5141 l 5792 5137 l 5820 5133 l 5848 5129 l 5874 5125 l 5899 5121 l 5924 5117 l 5947 5114 l 5969 5110 l 5990 5107 l 6011 5103 l 6030 5100 l 6057 5096 l 6082 5091 l 6107 5087 l 6131 5083 l 6155 5079 l 6179 5075 l 6204 5071 l 6230 5067 l 6257 5062 l 6283 5058 l 6309 5053 l 6333 5050 l 6353 5046 l 6370 5043 l 6381 5042 l 6387 5040 l 6390 5040 l gs col0 s gr /Helvetica-Narrow-Bold-iso ff 225.00 scf sf 4500 225 m gs 1 -1 sc (Level 1: Size-Independent Font Data) col0 sh gr /Helvetica-Narrow-Bold-iso ff 225.00 scf sf 450 225 m gs 1 -1 sc (Level 0: Global Data Area) col0 sh gr /Helvetica-Narrow-Bold-iso ff 225.00 scf sf 4500 7290 m gs 1 -1 sc (Level 2: Size-Dependent Font Data) col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 9180 990 m gs 1 -1 sc (DataStructures) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 9180 855 m gs 1 -1 sc (Adobe Font Metric) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-Bold-iso ff 225.00 scf sf 6795 1440 m gs 1 -1 sc (Level 1b: Mapping Tables) col0 sh gr /Helvetica-Narrow-Bold-iso ff 225.00 scf sf 1305 2340 m gs 1 -1 sc (Global Variables) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 150.00 scf sf 3285 4905 m gs 1 -1 sc (Structure-Array of) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 150.00 scf sf 3285 5085 m gs 1 -1 sc (size no_fonts_limit) dup sw pop 2 div neg 0 rm col0 sh gr /Helvetica-Narrow-iso ff 120.00 scf sf 3285 2070 m gs 1 -1 sc (double FontTransform[4]) dup sw pop 2 div neg 0 rm col0 sh gr $F2psEnd rs xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/extentv.eps0000664000175000017500000000054611742726711022473 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-1.2 %%BoundingBox: 0 0 200 200 %%EndComments /TimesRoman findfont 150 scalefont setfont 100 100 translate gsave [ 1 0 0 1.4 0 0] concat 0 0 moveto 100 0 rlineto 0 0 moveto 0 100 rlineto stroke 0 0 moveto (g) show grestore [ 3 3 ] 2 setdash 0 0 moveto 100 0 rlineto 0 0 moveto 0 100 rlineto stroke 0 0 moveto (g) true charpath stroke xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/shearh.eps0000664000175000017500000000054611742726711022250 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-1.2 %%BoundingBox: 0 0 200 200 %%EndComments /TimesRoman findfont 150 scalefont setfont 100 100 translate gsave [ 1 0 0.5 1 0 0] concat 0 0 moveto 100 0 rlineto 0 0 moveto 0 100 rlineto stroke 0 0 moveto (g) show grestore [ 3 3 ] 2 setdash 0 0 moveto 100 0 rlineto 0 0 moveto 0 100 rlineto stroke 0 0 moveto (g) true charpath stroke xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1lib_doc.tex0000664000175000017500000000666211742726711022654 0ustar uwabamiuwabami%---------------------------------------------------------------------------- % ----- File: t1lib_doc.tex % ----- Author: Rainer Menzner (Rainer.Menzner@web.de) % ----- Date: 2005-05-18 % ----- Description: This file is part of the t1lib-documentation. % ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. % As of version 0.5, t1lib is distributed under the % GNU General Public Library Lincense. The % conditions can be found in the files LICENSE and % LGPL, which should reside in the toplevel % directory of the distribution. Please note that % there are parts of t1lib that are subject to % other licenses: % The parseAFM-package is copyrighted by Adobe Systems % Inc. % The type1 rasterizer is copyrighted by IBM and the % X11-consortium. % ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) % ----- Credits: I want to thank IBM and the X11-consortium for making % their rasterizer freely available. % Also thanks to Piet Tutelaers for his ps2pk, from % which I took the rasterizer sources in a format % independ from X11. % Thanks to all people who make free software living! %---------------------------------------------------------------------------- \documentclass[11pt,a4paper]{article} \usepackage[english]{babel} \usepackage{makeidx} \topmargin-1cm \oddsidemargin0cm \textwidth16cm \textheight24cm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Added by NGUYEN-DAI Quy and edited by RMz) %% %% - Adapted to recent TeX developments according to suggestions %% of Reinhard Kotucha, a well-known TeX-Guru (2004-11-27, RMz) %% \ifx\pdfoutput\undefined\chardef\pdfoutput=0 \fi \ifcase\pdfoutput \usepackage{graphicx} \or \usepackage{graphicx} \usepackage[a4paper,pageanchor,hyperfigures,breaklinks,% colorlinks,citecolor=blue,urlcolor=red,linkcolor=magenta]{hyperref} \pdfcompresslevel=9 \fi \setcounter{tocdepth}{3} \setcounter{secnumdepth}{3} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %--- Some definitions \def\tonelib{{\mdseries\ttfamily t1lib}}\relax \def\libversion{5.1.0}\relax \def\libdate{Mai, 18, 2005}\relax \def\precorr{\par\vbox\bgroup}\relax \def\postcorr{\unskip\vskip-2mm\hrule \vbox to 0pt{\kern-17.7pt\parskip0pt\noindent\llap{\fbox{$\mathcal{F}()\Rightarrow$}\kern0pt}\vss} \vskip3mm\egroup\noindent}\relax \makeindex % %- hyphenation exceptions: \hyphenation{bit-maps bit-map} % \begin{document} \thispagestyle{empty} \begin{center} \leavevmode \vskip2cm {\Huge\bfseries T1Lib}\\[5mm] {\Large\sl Version \libversion\ -- \libdate}\\[2.5cm] {\LARGE\bf A Library for Generating}\\[5mm] {\LARGE\bf Character Bitmaps from}\\[5mm] {\LARGE\bf Adobe Type 1 Fonts}\\[2cm] {\Large\sc Rainer Menzner}\\[2mm] \end{center} \newpage \tableofcontents %-- Introduction \input intro.tex %-- Getting started \input getstart.tex %-- Program xglyph \input xglyph.tex %-- Program type1afm \input type1afm.tex %-- Using t1lib \input ut1lib.tex %-- X11-Interface \input xinterface.tex %-- Internals \input internals.tex %-- Print an alphabetically sorted function index \def\indexname{Function Index\addcontentsline{toc}{section}{\hskip1emFunction Index}}% \printindex \end{document} xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlines.fig0000664000175000017500000000446311742726711022620 0ustar uwabamiuwabami#FIG 3.2 Landscape Center Metric A4 100.00 Single -2 1200 2 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 450 2250 45 45 450 2250 495 2250 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 1350 2250 45 45 1350 2250 1395 2250 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 900 1800 45 45 900 1800 945 1800 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 900 900 45 45 900 900 945 900 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 1350 450 45 45 1350 450 1395 450 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 1620 180 45 45 1620 180 1665 180 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 2880 180 45 45 2880 180 2925 180 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3150 450 45 45 3150 450 3195 450 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3600 900 45 45 3600 900 3645 900 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3600 1800 45 45 3600 1800 3645 1800 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 3150 2250 45 45 3150 2250 3195 2250 1 3 0 1 0 7 100 0 0 0.000 1 0.0000 4050 2250 45 45 4050 2250 4095 2250 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2 3150 2250 1350 2250 2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2 450 2250 1350 2250 2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2 1350 2250 4050 2250 2 1 2 1 0 7 100 0 -1 3.000 0 0 -1 0 0 2 1350 2250 900 1800 2 1 2 1 0 7 100 0 -1 3.000 0 0 -1 0 0 2 1350 450 900 900 2 1 2 1 0 7 100 0 -1 3.000 0 0 -1 0 0 2 1350 450 1620 180 2 1 2 1 0 7 100 0 -1 3.000 0 0 -1 0 0 2 3150 450 2880 180 2 1 2 1 0 7 100 0 -1 3.000 0 0 -1 0 0 2 3150 450 3600 900 2 1 2 1 0 7 100 0 -1 3.000 0 0 -1 0 0 2 3150 2250 3600 1800 3 0 0 1 0 7 100 0 -1 0.000 0 0 0 4 1350 2250 900 1800 900 900 1350 450 0.000 1.000 1.000 0.000 3 0 0 1 0 7 100 0 -1 0.000 0 0 0 4 1350 450 1620 180 2880 180 3150 450 0.000 1.000 1.000 0.000 3 0 0 1 0 7 100 0 -1 0.000 0 0 0 4 3150 450 3600 900 3600 1800 3150 2250 0.000 1.000 1.000 0.000 4 0 0 100 0 20 10 0.0000 4 120 195 360 2160 P1\001 4 0 0 100 0 20 10 0.0000 4 120 195 1440 2430 P2\001 4 0 0 100 0 20 10 0.0000 4 120 195 630 1800 P3\001 4 0 0 100 0 20 10 0.0000 4 120 195 630 900 P4\001 4 0 0 100 0 20 10 0.0000 4 120 195 1080 450 P5\001 4 0 0 100 0 20 10 0.0000 4 120 195 1710 135 P6\001 4 0 0 100 0 20 10 0.0000 4 120 195 2970 180 P7\001 4 0 0 100 0 20 10 0.0000 4 120 195 3285 450 P8\001 4 0 0 100 0 20 10 0.0000 4 120 195 3690 945 P9\001 4 0 0 100 0 20 10 0.0000 4 120 285 3690 1890 P10\001 4 0 0 100 0 20 10 0.0000 4 120 285 3060 2475 P11\001 4 0 0 100 0 20 10 0.0000 4 120 285 4050 2475 P12\001 xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/manipulate.pdf0000664000175000017500000004603711742726711023124 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ3Ð3T0A(œËU„&F¦†z–æ`!CsK=CKC=sc#C (mRªd¦à’Ï„CLendstream endobj 5 0 obj 59 endobj 3 0 obj << /Type /Page /MediaBox [0 0 426 172] /Parent 2 0 R /Resources << /ProcSet [/PDF /ImageB] /XObject<> >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 8 0 obj << /CreationDate (D:20010110083104) /Producer (GNU Ghostscript 5.10) >> endobj 6 0 obj << /Type /XObject /Name /R6 /Subtype /Image /Length 7 0 R /ColorSpace /DeviceGray/Width 607/Height 244/BitsPerComponent 1 >> stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ‡ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó‡ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó‡ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó‡ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÏÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÏÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÏÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÏÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãïÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãïÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãïÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿþ~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿð~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÀ~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÿÀ~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿñ€~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿÁ€~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿþ€~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿü€~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿü€~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿü€~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿü€~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ¿ü€~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆ?ü‚~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ?ü£~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÀ?ü£þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒÿ€?ü£þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ü£þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?üãþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ?ýãþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ?ýãþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ?ÿ‡ãþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ?ÿ‡ãþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþ?ÿ‡çþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþ?ÿ‡çþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþ?ÿ‡Çþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿÿü~ÿÿ‡ÇþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿÿø0~ÿÿƒÇþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÿÿøx~GÿÿƒÇþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøxÇÿÿƒÇþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿøxÇÿÿƒÇþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿøü?ÇÿÿÃÇþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿøü?ÇÿÿÃÇþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxÿÿÿðü?ÇÿÿÃÏþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþx~ÿðü?ÇÿÿÃÏþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþx~ÿðþ?ÇÿÿÃþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüp~ÿñþ?ÇÿÿÃþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüp~ÿñþ?ÇÿÿÃþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüp~8ÿñþ?ÇÿÿÃþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüøp|ñÿøÿÿãÿñøÿÿÿÿðñÿãþ?ñüñÿÿÿãÿÇÿÿƒþøÿÿÿÿÿÿÿÿÿÿÿÿÿÿøñú8ãþ?ñÿÿÇî>ñÿøÿÿãÿñøÿÿÿÿðñÿãþ?ñüñÿÿÿãÿÇÿÿƒþøÿÿÿÿùÿÿÿÿÿÿÿ÷þøñþ{ãþ?ñÿÿÇÎ<ñÿøÿÿãÿñøÿÿÿÿðñÿãþ?ñüðÿÿÿãþÇÿÿÃþùüÿÿÿÿùÿÿÿÿÿÿùáøùàþãþ?ñÿÿÃÎ<ÿñÿøÿÿãÿñøÿÿÿÿðñÿãþ?ñüðÿÿÿãþÇÿÿÃþùüŸÿÿÿÿùÿÿÿÿðáÁøøàþãþ?ñÿÿÃÎ<ÿñÿøÿÿãÿñøÿÿÿÿðñÿãþ?ñüðÿïÿáþ?ÇÿÿÃþùüŸÿÿÿÿñÿÿÿÿÀÁÁñü?àþãþ?ñÿÿÃÎ<ÿñÿøÿÿãÿñøÿÿÿÿøñÿãþ?ñüðÿïÿáþ?ÇÿÿÃþùüŸÿÿÿÿñÿÿÿÿ€áþ?àüãþ?ñÿÿãÎ<ÿñÿøÿÿãÿñøÿÿóøðÿãþ?ñüðÿïÿáþ?ÇÿÿÃþÿüÿÿÿÿÿñÿÿÿð ãþ?Èüÿãþ?ãÿÿãÎÿñÿøÿÿãÿñøÿÿóøðÿãþ?ñüðÿßÿñþ?ÇÿÿÃþÿüþð€ÿÿþ?ðãÿÈ|ÿãþ?ãÿÿãŸÿñÿøÿÿãÿñøÿÿóøðÿãþ?ñüøÿßÿñþ?ÇÿÿÃþÿüüð€ÿÿþ?ðÿÇÿÌ|ÿãþ?‡ãÿÿãŸÿñÿøÿÿãÿñüÿÿóøðÿãþ?ñüøßÿñü?ÇÿÿÁþÿüøøöñÿÿÿþ?ñÿÇÿ‡Ì|ÿãþ?ÇÃÿÿãŸÿñÿøÿÿãÿñüÿÿóøøÿãþ?áüøŸÿñü?ÇÿÿÁþÿüñü~ŸñÿÿÿüñÿÇÿ‡œxÿãþ?ÃÇÿÿáŸÿñÿøÿÿãÿñüÿÿóøøÿãþ?áüøŸÿðü?ÇÿÿÁþÿüãþñÿÿÿüñÿÇÿÇœyÿãþ?Á‡ÿÿáŸÿñÿøÿÿãÿñüÿÿóùøáþ?áüøŸÿðüÇÿÿÁþÿüãþ?†?ñÿÿÿüñÿÇÿÇž9ÿãþ?àÿÿñŸÿñÿøÿÿãÿñü?÷ÿóùøáü?ÁüøÿðøÇÿÿÁþÿüçþ?†ñÿÿÿü?ñÿÇÿÇž9ÿãþ?àÿÿñ? ÿñÿøÿÿãÿñü?÷ÿóñøáü?Áüø?ÿðø‡ÿÿ>ÿüÇþ?Àñÿÿÿþ?ñÿÇÿÃ>9ÿãþ?ð?ÿÿñ?‰ÿñÿøÿÿãÿñü?÷ÿóñøáü?üø?ÿøx~†ÿý€>ÿüÀ?àÿñÿÿÿþ?ñÿÇÿÃ>1ÿãþ?øÿÿÿñ?ÿñÿøÿÿãÿñü?çÿóñø?áø?üü>ÿøp~†ÿü€>ÿüÀ?àÿñÿÿÿþñÿÇÿã>3ÿãþ?ùÿÿÿñ?ƒÿñÿøÿÿãÿñþçÿóñø?ðø?üüÿø0~ÿü€>ÿüÇÿÿàÿñÿÿÿÿ?ñÿÇÿã?ÿãþ?óÿÿÿð?ƒÿñÿøÿÿãÿñþÇÿóñüðò?l'ü ÿøþÿü€>ÿüÇÿÿàñÿÿÿÿ€ñÿÇÿâÿãþ?óÿÿÿð?ƒÿñÿøÿÿáÿñþÇÿóáüðâ70`ü?ÿøþÿü€>ÿüÇÿÿÄ?ñÿÿÿÿáÿñÿÇÿàÿãþ?ñÿÿÿøƒÿñÿøÿÿáÿñþ‡ÿñãüðB€0`ü?ÿüþÿü€>ÿüÃÿÿŒ?ñÿÿÿÿÏÿñÿÃþ?àÿãþ?ð?ÿÿøƒÿðÿøÿÿàï °ßÿðƒüð€0`þ?ÿüþÿü€>ÿüãÿÿžñÿÿÿÿÏÿñÿãþ?ðÿãþ?ðÿÿøÃÿð÷‡øoÿà €?ÿðþð€p`þÿüþÿü€>ÿüãÿÿñÿÿÿÿ‡ÿñÿáü?ðÿ‡ÿãþ?ðÿÿøÃýðÀÿà€?ÿðþð€p`þÿüþÿü€>ÿüáÿ¾?ñÿ‡ÿÿ€?ñÿñøðÿ‡ÿáþðÿÿøÇüðÀÿà€?€ÿðþø€p`þÿþþÿü€>ÿüð~<ðÿÿÿÀðïðpÿðÿ‡øp÷ÿÿøÇüðÀÿð€?€?ÿðÿøÀð`ÿÿÿþþÿü€>ÿàøpðÿÿ¸€øÿøÿøpï€ÿÿøÿÇüø Àÿð€?À?ÿøÿøÁð`ÿÿÿþþÿü€>ÿàþðøƒÿþ€þÿùÿøpÏàÿüÿÇüøÀÿøx€?Àÿüÿ‡üÁð`ÿÿÿÿþÿü€>ÿÿÿÿÿÿÿÿÿÿãÿüÃÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿþÿïü?ÿãÿÿÿÿƒÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿãÿüãÿÿÿÿÿÿÿÿÿÿÿÿÿŸøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÇÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿãÿüÿãÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿçÿøÿãÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÏÿøãÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿŸÿøçÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþ?ÿü?Çÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ endstream endobj 7 0 obj 18545 endobj xref 0 9 0000000000 65535 f 0000000371 00000 n 0000000312 00000 n 0000000162 00000 n 0000000015 00000 n 0000000144 00000 n 0000000507 00000 n 0000019209 00000 n 0000000420 00000 n trailer << /Size 9 /Root 1 0 R /Info 8 0 R >> startxref 19230 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/arbitrary.pdf0000664000175000017500000000253611742726711022760 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœmT¹ŽÜ0 íý*“b¢Ž6@>`3Ó©&ȱØ)¶Úß) ã±ôHñÓÎ…ð¬ýþØ^7.ü}Û^ s‘rÑrÇi£}vkåÂ4w€ÇÆÁ{ÇzùŸÔÉ »Ðµ<ÁE¸?¶û£|¾mŸ¾¶ÂÍÊí§Çá¡ <åB»t<@ÔÕ(ÞÛãï·çíËÍ~+Jø/BåÇæ¦ß|IIòPäÄ/ÿðc“ä_7îd…mN·Š°5÷w”›v ÛšÂÌOï×^jÝ)Wªª¡4›N¿H›‡ZMäÂ5dÀg ysàZ—åE«y\àL7#U±Ô”qU‘b,.Ã}€ÁcI¹&ŒÀŵüwbœþ’ªÃOÄ EÊid"‘œ– <ÓU)×Àc 8Ñî Ii(¦†6 2~‚oa¨“K·émB¤5uƒHótË­e¾Ä·t‚‰³B»2®92FÝG‡˜r¨ÒDﲨ%…àæJCè”.󞥺‚0–ìQNë©°­|A½Z‹‚8ê–—–¾/ŠëhY@èB¯ÿ }A« %ÚÇBÕç ·œ±e¾\½¢}èè¢ûö=zÎŽ—Á9Zv$•Ù#”Úû$ÂöyÒÌáê~@o(8Œš˜§q”nˆ°¡¿Ñ‰*‹ðNëeìJ¼ˆ6"¯'eÊ[Ä(‘”#ÜýÈ!{xFݤ†ÐŠöB†å˜:¿JN–HRÌ€7¬ÁÃaÅ\VË4ëŒü&æ5†þ=s§þEs9}-Ê~4N">µ‘µ¸%¼ù=º ëö´ý¨Tˆendstream endobj 5 0 obj 618 endobj 3 0 obj << /Type /Page /MediaBox [0 0 200 200] /Parent 2 0 R /Resources << /ProcSet [/PDF /Text] /Font << /R6 6 0 R >> >> /Contents 4 0 R >> endobj 6 0 obj <> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 7 0 obj << /CreationDate (D:20010110083032) /Producer (GNU Ghostscript 5.10) >> endobj xref 0 8 0000000000 65535 f 0000001002 00000 n 0000000943 00000 n 0000000722 00000 n 0000000015 00000 n 0000000703 00000 n 0000000870 00000 n 0000001051 00000 n trailer << /Size 8 /Root 1 0 R /Info 7 0 R >> startxref 1138 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/xglyph.tex0000664000175000017500000006530311742726711022324 0ustar uwabamiuwabami%---------------------------------------------------------------------------- % ----- File: xglyph.tex % ----- Author: Rainer Menzner (Rainer.Menzner@web.de) % ----- Date: 2003-01-04 % ----- Description: This file is part of the t1lib-documentation. % ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2002. % As of version 0.5, t1lib is distributed under the % GNU General Public Library License. The % conditions can be found in the files LICENSE and % LGPL, which should reside in the toplevel % directory of the distribution. Please note that % there are parts of t1lib that are subject to % other licenses: % The parseAFM-package is copyrighted by Adobe Systems % Inc. % The type1 rasterizer is copyrighted by IBM and the % X11-consortium. % ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) % ----- Credits: I want to thank IBM and the X11-consortium for making % their rasterizer freely available. % Also thanks to Piet Tutelaers for his ps2pk, from % which I took the rasterizer sources in a format % independent from X11. % Thanks to all people who make free software living! %---------------------------------------------------------------------------- \newpage \section{The Program {\ttfamily xglyph}} \label{xglyph}% \verb+xglyph+ is a tool which makes most of the functionality of \tonelib\ visible to the user without the need of having to write an own program and without the need of having to understand most of the library before. This program---as the name indicates---needs X11. It is thus only build if X11 is installed on the target system and if X11 support has not explicitly been disabled. All necessary resources are set internally to default values so that the program can be run out of the box without any installation. In case the user did not already create a custom configuration file and an associated font database file, the program should be started from the subdirectory \verb+xglyph+ of the distribution. When starting, \verb+xglyph+ checks for the environment entry \verb+T1LIB_CONFIG+ and if it does not exist it adds the association \verb+T1LIB_CONFIG=./t1lib.config+ to the environment. In other words it expects a valid configuration file in the current directory. There are several widgets which may be categorized into 5 types. \subsection{Common Parameter Dialogs and Toggle Buttons} These buttons modify the internal state of the program by setting some global variables. These variables affect the execution of all rastering functions in contrast to the buttons described in the next subsection which only take influence on the X11 rastering functions. When changing one of the following parameters nothing seems to happen at first. All actions are deferred to the time when an action button is clicked. Here is a list of the dialogs and toggles: \begin{itemize} \item \fbox{{\bfseries FontID}}\\ This dialog allows to specify the font ID that will be used when the next action takes place. The allowed IDs range from 0 to $n-1$, where $n$ is the number of fonts declared in the font database file. If using the default configuration file together with the default font database file, 8 fonts are declared. If an invalid ID is specified, the next action generates an error message. \item \fbox{{\bfseries Font-Size}}\\ Here, the size of the font is specified. The value is interpreted in bigpoints, the default PostScript unit. If the size specified is invalid, an appropriate error message is generated at the time of the next action. \item \fbox{{\bfseries Slant-Factor}}\\ A slant factor $s$ may be specified. It is interpreted the following way. A point described by the coordinate-pair $(x,y)$ is transformed to the point with the coordinates $(x+sy,y)$. For instance, specifying a slant factor $s=1$ will generate a font slanted by $45^\circ$. Since version 0.3-beta slanted are nearly fully supported. For a discussion of the remaining problems see \ref{transformations} on page \pageref{transformations}. \item \fbox{{\bfseries Extension-Factor}}\\ Horizontal extension of a font may be realized using this dialog. The default value is 1 which means the characters are presented at their natural width. Specification of an invalid value will generate an error message at the time of the next action. \item \fbox{{\bfseries Transformation-Matrix}}\\ This dialog gives complete Control over the transformation matrix that will be used in consequent rasterizations. The values have to be specified separated by commas. A specified rotation is still applied after this matrix. \item \fbox{{\bfseries Res [DPI]}}\\ The resolution of the output device (screen) may be specified in this dialog. Using the default value of 72 dpi means one bp in size corresponds to exactly one device pixel. \item \fbox{{\bfseries S-Width}}\\ This dialog field allows to setup the penwidth used for stroking characters. If this field is zero, which is the default, the characters are filled, unless, the font under consideration is a stroked font, that is, it has \verb+PaintType = 1+. \item \fbox{{\bfseries Encoding-File}}\\ The name of an encoding file may be specified. Included in the distribution is only one file, \verb+IsoLatin1.enc+. It contains the standard X11 encoding in a format acceptable by \tonelib. If no name is given here, or the file with the name given here cannot not be parsed as an encoding file, the encoding is switched back to the fonts internal encoding. Again, this is done at the time of the next action. \item \fbox{{\bfseries Angle}}\\ The angle at which the next character or string is rastered is specified here. There are no restrictions concerning the angle. Rotation is applied after setting the transformation matrix (see above). \item \fbox{{\bfseries Space-Off}}\\ The value specified here represents an offset added to the spacewidth when rastering the next string. For this, it is interpreted in PostScript charspace units and thus subject to scaling. \item \fbox{{\bfseries Character}}\\ A number between 0 and 255 inclusive should be specified here. It is used as the index into the current encoding vector when rasterizing a character. This gives the user access to all currently encoded characters, regardless of the current X11 keyboard mapping. If an index is given whose encoding entry would produce no black pixels, an error message is generated at the next character-rastering time. The default value is 65, which corresponds to the character ``A'' in most encoding vectors. \item \fbox{{\bfseries Test-String}}\\ In this dialog, a complete string may be specified. It will be rastered when the next string-rastering button is pressed. It can be of arbitrary length (well, almost). If this field is left empty, the standard string ``Test'' will be used for rastering. \item \fbox{{\bfseries Kerning}}\\ This is a toggle button. Its state determines whether pairwise kerning information from the AFM file will be used to correct the horizontal spacing during string rastering or not. A typical example is the word ``Test''; enabling kerning should---at least in fonts of good quality---move the ``T'' and the ``e'' significantly closer together. \item \fbox{{\bfseries Ligature}}\\ This is a toggle button. Its state specifies whether the string is checked for ligatures prior to rastering it. Suitable character sequences are replaced with the corresponding ligature. For a good example, you should switch to font ID 4 and type in the string \verb+--difficult---+. If ligature detection is switched on, the two hyphens should be converted to an en-dash ``--'', the three hyphens should be converted to an em-dash ``---'' and the character series ``\verb+ffi+'' should be replaced with the ligature ``ffi'', rather than to be displayed as ``f{}f{}i''. \item \fbox{$|\longrightarrow$} / \fbox{$\longleftarrow|$} This button allows to change the writing direction that \tonelib\ will use in subsequent calls to the string rastering functions, the default being {\em Left To Right} as used in most European languages. This item is simply meant to demonstrate the capabilities of \tonelib. The package does not come with fonts that are intended to be used for {\em Right To Left} typesetting. \item \fbox{{\bfseries Underline}}\\ This toggle button determines whether strings are underlined or not. \item \fbox{{\bfseries Overline}}\\ Same as above for overlining. \item \fbox{{\bfseries Overstrike}}\\ Same as above for overstriking. \item \fbox{{\bfseries AA-Low}}/\fbox{{\bfseries AA-High}}\\ This button allows to select the subsampling factor for antialiasing in subsequent rastering operations. {\em AA-Low} means subsampling by factor 2 which gives 5 gray values including black and white, whereas {\em AA-High} means subsampling by 4 which yields 17 gray values including black and white. \end{itemize} Notice that, aside from the latter, the toggle buttons only affect the string rastering functions. \subsection{Buttons that Influence the X11 Rastering Functions} The X11 rastering functions introduced in version 0.3-beta provide a considerably higher level of abstraction than the standard rastering functions. To show the effect in \verb+xglyph+, a few additional buttons are provided. \begin{itemize} \item \fbox{{\bfseries Transparent}}/\fbox{{\bfseries Opaque}}\\ This button allows to switch between transparent and opaque mode in the X11 rastering functions. In transparent mode, only non-background pixels are drawn and all other pixels are left untouched. In opaque mode the entire area that the bitmap will require is first filled with the background color and then the bitmap is placed on this area. \item \fbox{{\bfseries Foreground}}\\ This is a label field with six color fields to the right and one color field to the left. Clicking on one of the color fields located on the right side will set the foreground color to the respective value (white, black, gray, red, green or blue). The color field on the left side always shows the current color selection. \item \fbox{{\bfseries Background}}\\ This also is a label field with six color fields to the right and one color field to the left. It works in analogy to the above and sets the current background color. Note that in order make the background color active, the drawing mode must be set to ``opaque''. \end{itemize} \subsection{Buttons that Generate Actions} There are 10 buttons generating actions visible to the user. \begin{itemize} \item \fbox{{\bfseries Char}}\\ This button generates a bitmap of the character specified in the \fbox{{\bfseries Character}}-dialog box. All parameters changed earlier become effective at this time. The resulting bitmap is then shown in the output window of \verb+xglyph+. Some information about the generated bitmap and elapsed time etc.\ is given in the message window. If an error occurred, the old contents of the output window are kept and a message is given to the user. \item \fbox{{\bfseries String}}\\ This button generates a bitmap of the string specified in the \fbox{{\bfseries Test-String}}-dialog box. In addition to rastering characters, kerning and ligature settings may now take influence on the result of the operation (see \ref{fonts}). If no error occurs, the bitmap is shown in the output window and additional information is shown in the message area. Otherwise, an appropriate error message is given. \item \fbox{{\bfseries AAChar}} \item \fbox{{\bfseries AAString}}\\ Both of these buttons do exactly the same as their non-antialiased counterparts. The only difference consists in the generation of an antialiased bitmap. The result is not a bitmap in fact. There are at least 8 bits per pixel and at most 32 bits per pixel in the resulting glyph. This depends on the depth of the X11-visual you use when starting xglyph. The result may consume quite a bit of memory if a {\ttfamily TrueColor} or {\tt DirectColor} visual is active. \item \fbox{{\bfseries CharX}} \item \fbox{{\bfseries StringX}} \item \fbox{{\bfseries AACharX}} \item \fbox{{\bfseries AAStringX}}\\ These functions basically do the same as the counterparts lacking the ``X'' in the name. But internally the X11 rastering functions are called to produce the output bitmap/pixmap. As a consequence the current foreground color, background color and drawing mode are taken into account. For a more complete discussion of the X11 rastering functions see \ref{x11interface} on page \pageref{x11interface}. \item \fbox{{\bfseries Font Table}}\\ A character table of size $16 \times 16$ is shown in the output window. Each cell contains an antialiased representation of the character indexed by the field number. The function \verb+T1_AASetCharX()+ is used for drawing these characters. Current foreground and background colors are respected as well as are most other parameters accepted by the character rastering functions. Only the angle specification is ignored since I assume that it is not very useful to have an overview over a font at any angle different from 0. Notice that the default size (100) is probably too large to make the output window fit on the screen. No care is taken about this. The recommended size for viewing a font's character map is between 20 and 30 points at 72 dpi resolution. \item \fbox{{\bfseries About}}\\ Shows an `about' message telling you that you are using \verb+xglyph+ and \tonelib\ in the current version. \item \fbox{{\bfseries Exit Program}}\\ This button does what it says and exits the program. \end{itemize} \subsection{The Message Window} This area is located below the dialog box for the test string. Information potentially useful to the user is given here. There should be nothing needed to be said about the info---it is self-explaining. But two things should be noted: \begin{itemize} \item The elapsed time that is displayed is exactly the time spent in the respective rastering function. There might have been other actions in force which might make the user believe the time value given as being incorrect.\footnote{For example, there might have been size-dependent data to be deleted and recreated, or an encoding file might have needed to be loaded before rastering.} Moreover, the transfer to the X-server may become significant if 32 bits per pixel are used, the image is large and the program is running on a remote machine. \item The message \verb+t1lib: Couldn't generate Bitmap, T1_errno=...!+ simply tells the user that no bitmap could be generated. There may be several reasons. E.g., the \verb+FontID+-value given might have been out of range. Another possibility is that you have specified a character index which has no encoded character associated. The value of \verb+T1_errno+ might give a hint of what the problem was. \end{itemize} If a character map is displayed, the message window is giving no information apart from the font name and the final value of \verb+T1_errno+ because there have been executed up to 256 rastering operation and it would be impossible to keep track of all single operations. \subsection{The Output Window} The output window shows the output of the rastering operations. Its type is different for the standard and the X11 rastering functions. For the standard rastering functions, it is always adapted to the size of the glyph which is displayed plus a margin of 5 pixels on each side. For this reason, leading and trailing white space is not shown in the output window, it only shows up in the glyph's metrics in the message windows. The X11 rastering functions generate an output window of constant size (\hbox{600 $\times $ 400} pixels) with a logical origin in its center. This center is marked by a cross-hair of color cyan. The glyph is placed with respect to this origin. If it is too large to fit, the glyph simply is clipped. A second cross-hair is shown at the place where the origin of the next glyph would be located in color magenta. If a character map of a font is displayed, the output window contains a map of $16\times 16$ cells whose size depends on the metrics of the font that is displayed. \subsection{{\tt xglyph} Commandline Parameters} The syntax of the \verb+xglyph+ commandline is \begin{verbatim} xglyph [options] [fontfile1 [fontfile2 [...]]] \end{verbatim} If no options and no font files are specified on the commandline \verb+xglyph+ reads the fonts from the font database file. The details depend on which configuration file is found and on this file's contents. If at least one font file is specified on the commandline, the font database---being existent and accessible or not---is ignored and the database is built using the fonts from the commandline. \verb+fontfile1+ is assigned the font ID 0, \verb+fontfile2+ is assigned the ID 1 and so forth. Files that cannot be opened for some reason are simply skipped. \verb+xglyph+ also recognizes a few options. Notice that these options are not intended for an average user. Rather, they provide a means of (a) controlling debugging output from the rasterizer, (b) controlling generation and verbosity of the \tonelib-logfile, (c) disabling certain features of the rasterizer and (d) checking some \tonelib\ functions which otherwise would not be required because of the limited functionality of \verb+xglyph+. All commandline arguments that start with ``\verb+--+'' are considered to be options to \verb+xglyph+. The following is a complete list of valid options and a brief description of their effect: \begin{itemize} \item\verb+--help+: Display the commandline syntax of \verb+xglyph+ as well as a brief list of the available options for an average user and exit. \item\verb+--Help+: Display the commandline syntax of \verb+xglyph+ as well as a brief list of all available options. \item\verb+--noGrid+: The cross-hairs marking start and end position of a glyph in the output of one of the X11 rastering functions will be suppressed. This might be useful at small sizes because the grid overwrites the glyphs' pixels. \item\verb+--setPad+: The padding value \verb+xglyph+ should use can be specified here. This has to be followed by either ``8'', ``16'' or ``32'', separated by a space. Notice that the value ``32'' might be rejected as described in \ref{queryconfiguration}. The value actually used can be found by writing a logfile and examining this after a session. \item\verb+--logError+: \item\verb+--logWarning+: \item\verb+--logStatistic+: \item\verb+--logDebug+: These options firstly instruct \verb+xglyph+ to create a \tonelib\ logfile and secondly set the loglevel to the respective value (see \ref{logfile}). Without specifying one of these options, no logfile will be generated. \item\verb+--ignoreForceBold+: Instructs the rasterizer to ignore a {\tt ForceBold} hint in the Type 1 font file. \item\verb+--ignoreFamilyAlignment+: Instructs the rasterizer always to compute font level alignment according to \verb+BlueValues+ and \verb+OtherBlues+, even if \verb+FamilyBlues+ and \\ \verb+FamilyOtherBlues+ exist and all conditions for substitution are fulfilled for that combination of font and size. \item\verb+--ignoreHinting+: Instructs the rasterizer to omit hinting completely. \item\verb+--ignoreAFM+: The use of AFM information is ignored, no matter whether it could be accessed via an appropriate AFM file or self-generated. When using this option the string functions would not work. It may, however, be useful because self-generation of AFM data fails as soon as at least one character of all defined characters can not be processed and thus, the font will refuse to load. Using this option, consequently, one has access to all character that are processible, e.g., for generating a font table. characters that can be rasterized \item\verb+--debugLine+: \item\verb+--debugRegion+: \item\verb+--debugPath+: \item\verb+--debugFont+: \item\verb+--debugHint+: All these instruct the rasterizer to write particular debug messages from intermediate steps of rasterization to the terminal. In order to understand and interprete them, a thorough understanding of the Type 1 font format specification and this special rasterizer implementation is crucial. \item\verb+--checkPerformance+: This option affects the X11 string rastering functions. An additional output window is created and the output of before-mentioned functions is directly written into this window. Note that this window is not managed as might be expected. Text is only drawn at the visible parts and after partially or completely hiding and again raising the respective areas are lost. This mechanism should simply give an idea of how fast the X11 rastering function work, admittedly a critical topic in \tonelib. \item\verb+--checkCopyFont+: This option is used to check the proper functioning of the \verb+T1_CopyFont()+ function. It copies all fonts from the database to new logical fonts and slants these fonts by 0.3. Finally an additional fontfile is added to the database. For each step the new font ID is printed to the terminal and the initial and final number of fonts are printed. \item\verb+--checkConcatGlyphs+: This option affects the buttons \fbox{\bf String} and \fbox{\bf AAString}. The requested string glyph is generated twice, first time using the current value of font ID and second time using this values plus 1. Both resulting glyphs are concatenated and the result is shown in the output window. \item\verb+--checkConcatOutlines+: This option, too, affects the standard string rastering functions. The current test string will be fetched as an outline using the current font ID. The result is then concatenated with a horizontal movement of 1000 charspace unit which is followed by the identical string using a font ID advanced by 1. The result of the concatenated outlines is then filled and converted to a \tonelib-glyph. For details on outline handling and what it is meant for see \ref{outlines}. When \verb+--checkConcatGlyphs+ and \verb+--checkConcatOutlines+ both are specified on commandline, the \verb+--checkConcatGlyphs+ is respected. \item\verb+--checkBadCharHandling+: This option provides a means of examining the effects of problematic/bad characters on string handling in \tonelib with \verb+xglyph+. It affects only the \fbox{\bf String} button. The character to be specified in the test character field is inserted in the middle of the test string. This enables the user to insert arbitrary character codes in the middle of a test string and to watch the effect in \verb+T1_SetString()+. For example, starting \verb+xglyph+ with this option exclusively and immediately clicking \fbox{\bf String} will show the string {\em TeAt} in the output window because the character `s' has been overwritten by character $65_{10}$ (`A'), the default test character. \item\verb+--checkDefaultEncoding+: This option proves that the default encoding feature works correct. If set, all fonts should be encoded in IsoLatin1 encoding immediately after startup and without any slow down at startup. \item\verb+--checkSmartAntialiasing+: Enables smart antialiasing as described in \ref{antialiasing}. The effect is that \tonelib\ will determine the antialiasing level by itself. For sizes below 20~bp, $4\times$ antialiasing will be used and up to 60~bp $2\times$ antialiasing is used. For size of 60~bp and larger a ``bytemap'' is created which in fact consists only of pure background and foreground pixels. When this options has been specified, toggling the antialiasing level has no effect. \item\verb+--checkAACaching+: This option enables caching of antialiased character glyphs. For a discussion of this issue see \ref{aacaching}. The string rastering functions are not affected by this option. \item \verb+--checkSetRect+: This option allows to check the rectangle drawing functions of \tonelib. If specified, the character drawing buttons will produce an em unit square of the current font instead of the expected character. \item \verb+--cacheStrokedGlyphs+: If this option is specified, \verb+xglyph+ will cache stroked glyphs whereas filled ones are not cached. \end{itemize} For those who are wondering about special X11 options like ``\verb+-display+'', \verb+xglyph+ does not support these. The widgets are built straight ahead and the layout is fixed. \verb+xglyph+ is meant to be a tool for testing some of the functionalities of \tonelib\ and nothing more. Of course, a display other than \verb+localhost:0.0+ may be specified by environment variable \verb+DISPLAY+. \subsection{Fonts Included in the \tonelib-Package} \label{fonts}% Included in the \tonelib-package are 8 fonts of two families which are freely available. \begin{enumerate} \item The CharterBT-fonts in Roman, Italic, Bold and BoldItalic variants. These are good quality fonts containing kerning information. Notable kerning pairs are ``T''--``e'', ``A''--``V'' and ``A''--``T''. \item The ComputerModern-fonts by Donald E.~Knuth in the variants Roman, Italic, BoldExtended and BoldExtendedItalic. In addition to kerning information, there are many ligatures in these fonts. Most people will know about the present ligatures from using \TeX, the typesetting system. Notable examples are: \verb+--+ $\rightarrow$ ``--'', \verb+---+ $\rightarrow$ ``---'', \verb+fi+ $\rightarrow$ ``fi'' and \verb+ffi+ $\rightarrow$ ``ffi''. These fonts have the disadvantage that no ordinary space character is included, only a visible space. \TeX\ itself does not need a dedicated space character. \end{enumerate} Note that working with ligatures requires the ligatures to be encoded at the positions they are expected. Thus, if you reencode one of the dc-fonts with the IsoLatin1-encoding funny effects may occur. \subsection{Some General Remarks on {\tt xglyph}} The program \verb+xglyph+ is just intended to check whether \tonelib\ works on a particular system. It is written straight forward and does not care much on performance and such. Especially, it is not a typical application for a rasterizer library. The bitmaps are generated and then the output window is adapted to the size of the bitmap/pixmap generated by the rastering function. This contradicts the X11 principle of ``drawing into a drawable'' and requires some overhead if one wants a fitted output window. In that sense, the performance of the X11 rastering functions is not directly comparable to the performance of the standard rastering functions. This should always be kept in mind. %%% Local Variables: %%% mode: latex %%% TeX-master: "t1lib_doc" %%% End: xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/ut1lib.tex0000664000175000017500000061404311742726711022212 0ustar uwabamiuwabami%---------------------------------------------------------------------------- % ----- File: ut1lib.tex % ----- Author: Rainer Menzner (Rainer.Menzner@web.de) % ----- Date: 2005-05-18 % ----- Description: This file is part of the t1lib-documentation. % ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. % As of version 0.5, t1lib is distributed under the % GNU General Public Library License. The % conditions can be found in the files LICENSE and % LGPL, which should reside in the top level % directory of the distribution. Please note that % there are parts of t1lib that are subject to % other licenses: % The parseAFM-package is copyrighted by Adobe Systems % Inc. % The type1 rasterizer is copyrighted by IBM and the % X11-consortium. % ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) % ----- Credits: I want to thank IBM and the X11-consortium for making % their rasterizer freely available. % Also thanks to Piet Tutelaers for his ps2pk, from % which I took the rasterizer sources in a format % independ from X11. % Thanks to all people who make free software living! %---------------------------------------------------------------------------- \newpage \section{Using \tonelib} This section describes in detail how to use \tonelib. I have tried to to describe the stuff in the order a new user would learn best and a new user would need to use the functions. \subsection{Compiling and Linking \tonelib-Programs} \label{compilingprograms}% A program that wants to use functions from the library must include the appropriate headers at compile time and then be linked with the appropriate libraries. Since V. 0.6-beta the X11 interface is separated from the \tonelib\ pivotal stuff. This yields advantages for programs that don't use the X11 rastering functions on systems where X11 is installed. The following applies to programs that do not use the X11 rastering functions: \begin{itemize} \item Include the file \verb+t1lib.h+. All definitions and declarations needed at compile time are included in this file. \item \verb+libt1.a+ or \verb+libt1.so+ respectively must be linked to the program. \end{itemize} In contrast, a program that uses the X11 interface must adhere to the following scheme: \begin{itemize} \item \verb+t1lib.h+ and \verb+t1libx.h+ must be included in this order. Furthermore, \verb+t1libx.h+ includes \verb+X11/Xlib.h+ if it is not already included. \item The libraries \verb+libt1.a+/\verb+libt1.so+ and \verb+libt1x.a+/\verb+libt1x.so+ must be linked to the executable. The correct order is \verb+-lt1x -lt1+ since the X interface uses functions from the latter. Also, the X11 library must appear in the library list after \verb+-lt1x+. \end{itemize} The Makefiles for \verb+xglyph+ and \verb+type1afm+ are typical examples for both configurations. \subsection{Querying and Setting Fundamental Configuration Parameters of \tonelib} \label{queryconfiguration}% It might be necessary to know whether \tonelib\ is compiled with or without X11 interface. At compile time a programmer can check for the X11 interface by stating \begin{verbatim} #ifdef T1LIB_X11_SUPPORT \end{verbatim} after including \verb+t1libx.h+. If \verb+T1LIB_X11_SUPPORT+ is not defined, the X11 interface is not configured and compiled. At runtime, a program can check for the X11 interface by a call to \precorr \begin{verbatim} int T1_QueryX11Support( void) \end{verbatim}\index{\verb+T1_QueryX11Support()+}\postcorr It returns \verb+1+ if the X11 interface is present and \verb+0+ otherwise. Notice that querying X11 support at runtime and compile time tends to be pretty useless starting with V.~0.6-beta. Any decision can be done by examining the existence of the \verb+t1x+-library and the \verb+t1libx.h+ header file. The definition and the function described above are thus only provided for compatibility with pre-0.6 versions of \tonelib. Some remarks on the general data format of bitmaps and should be given here. \tonelib\ internally always generates bitmaps in the way that appears to be natural for them: The first pixel corresponds to the least significant bit in a byte (or word/longword). Bytes are always arranged in memory the way, that the first byte is at the lowest address and the next byte at the following address. This convention is called LSBFirst which stands for Least Significant Bit/Byte First. It is the natural way of data alignment on machines with {\em Little Endian} data representation. In contrast MSBFirst stands for Most Significant Bit/Byte First which is the natural kind of data representation on Big Endian machines. A glyph's scanlines are always aligned in LSBFirst-type, no matter on what machine \tonelib\ is running. What has been said above, strictly does only apply to non antialiased glyphs, i.e., real bitmaps. Antialiased glyphs have their gray values coded in the representation that is natural for the machine \tonelib\ is running on. For example, if \tonelib\ runs on a Big Endian machine, the gray values are in Big Endian. The X11 displaying functions automatically handle this correct. Scanlines of \tonelib-glyphs may be padded to 8, 16 or 32 bit. Padding to higher values will consume more memory for the glyphs, but might speed up concatenating of bitmaps as described in \ref{generatingbitmaps}. This applies to machines with Little Endian representation as, for example, Intel's $x$86 series. On these machines 16 or 32 bits can be placed into the target bitmap in one step. On machines with Big Endian representation, for example, Motorola 680$x$0 series, this is currently not possible. However, using a higher padding value could still yield a better performance since the application could work on larger units than a byte. The default padding value in \tonelib\ is 8 bit. The padding value can be specified at runtime by means of calling \precorr \begin{verbatim} int T1_SetBitmapPad( int pad) \end{verbatim}\index{\verb+T1_SetBitmapPad()+}\postcorr \verb+pad+ must be one of `8', `16' or `32'. The call will only be successful if executed before initialization of \tonelib. This a security mechanism which prevents from having glyphs with distinct padding values. The return value is 0 if successful and -1 if \verb+pad+ was invalid or \tonelib\ had already been initialized. There is a further restriction concerning the padding value. Setting it to 32 is only possible if the machine has an ANSI C integer type of 64 bits. This condition is automatically checked by the \verb+configure+ script of \tonelib. If such an integer type is not present (or has to be emulated as e.g.\ \verb+long long+ in \verb+gcc+) there would not result any performance gain. If a specified padding value is rejected, \verb+T1_errno+ is set appropriately. An application can query the current padding value by calling \precorr \begin{verbatim} int T1_GetBitmapPad( void) \end{verbatim}\index{\verb+T1_GetBitmapPad()+}\postcorr The returned value is the padding value. This function can be called before or after initialization of \tonelib. Another function usually be called near initialization is \precorr \begin{verbatim} int T1_SetDeviceResolutions(float x_res, float y_res) \end{verbatim}\index{\verb+T1_SetDeviceResolutions()+}\postcorr This function allows setting the resolution of your device (screen). The values must be given in dpi. The default resolution, 72 dpi, implies that a pixel in device space equals 1 bp. This function may be called before or after initialization. The only restriction is that no size dependent data must be available. Changing the resolution when bitmaps are already cached would result in inconsistent bitmap-sizes for bitmaps generated before and after the call to \verb+T1_SetDeviceResolutions()+. The function checks whether initialization has already been done. If not, all is OK since no size-dependent data for any font can exist. If initialization has been done, it checks for every font whether size dependent data exists. If there's any size dependent data for any font, \verb+T1_SetDeviceResolutions()+ will return \verb+-1+ without having set the new resolution. Otherwise the specified resolution will be set and the function will return \verb+0+. If you really need to set another resolution in the middle of a session, all size-specific data should explicitly be removed from memory beforehand. This can be achieved using \verb+T1_DeleteAllSizes()+ (see \ref{deletingdata}). Notice that the device resolution need not be set at all if the default resolution of 72 dpi in horizontal and vertical direction is OK. This function is primarily intended to be prepared for applications with a device aspect ratio different from 1. \subsection{Initialization of \tonelib\ and Related Things} \label{initialization}% In this section we should cover the initialization, part of which has already been described in \ref{runtimesetup} in some more detail. This gives the user the chance to fine-tune the initialization for specific applications. Prior to be able to do anything useful with \tonelib, the library has to be initialized. Generally speaking, the purpose of the initialization is to tell \tonelib\ which font files are associated with which font ID's. The existence or accessibility of the font files is also assured at this point. Hence, file name search paths for Type 1 font files, AFM files and encoding files have also to be known at this time. The configuration file and the font database file play a central r\^ole during initialization. While the configuration file contains path specifications and a font database specification, the font database file specifies the relation between font ID's and font filenames. The format of both these files is described in \ref{runtimesetup} and not repeated here. A further purpose of the initialization is to set certain flags that prevent other quantities from being modified at a later time. For example, the padding value must be unique to all glyphs and consequently it is not allowed to be changed after initialization has been performed. The initialization is started by a call to the function \precorr \begin{verbatim} void *T1_InitLib( int log) \end{verbatim}\index{\verb+T1_InitLib()+}\postcorr The parameter \verb+log+ can be interpreted as a mode specification that influences certain parts of the initialization. In fact it should consist of one or more \verb+#define+s from \verb+t1lib.h+. At minimum, \verb+log+ should be either \verb+LOGFILE+ or \verb+NO_LOGFILE+. If \verb+LOGFILE+ is specified, a log file is written while the application runs, and \verb+NO_LOGFILE+ suppresses the generation of a logfile. For information the \tonelib-logfile see \ref{logfile}. In addition to this, \verb+IGNORE_CONFIGFILE+ and \verb+IGNORE_FONTDATABASE+ can be bitwise OR'ed (using ``\verb+|+'') to the \verb+log+-value. The purpose of this is described later in this section. A further flag that might find its way into the value of \verb+log+ is \verb+T1_AA_CACHING+. A discussion of this topic is given in \ref{aacaching}. The \verb+T1_NO_AFM+ completely suppresses usage of AFM data, no matter if an AFM file could have been found using the current search paths or not. This saves time for loading a font and is recommended if an application is known to be restricted on functions that do not access AFM data. The consequences of using this flag are covered somewhat more detailed in \ref{generatingafminfo}. \subsubsection{Standard Initialization} \label{standardinitialization}% The term ``standard initialization'' means, that none of the path manipulating and font database manipulating actions described later has been performed. Also, a standard initialization excludes the use of \verb+IGNORE_CONFIGFILE+ and \verb+IGNORE_FONTDATABASE+. If these conditions are met, the following happens at initialization time: \begin{enumerate} \item The padding value, either being the default value or a value specified by the user before, is assigned. \item Next, depending on the value of \verb+log+, a logfile is tried to be opened. From this point on, depending on the loglevel and the value of \verb+log+ the actions are logged. \item The endianess of the machine \tonelib\ is running on is checked. \item A configuration file is searched in the following order: \begin{itemize} \item The process' environment is checked for the entry \verb+T1LIB_CONFIG+ and if found, its value is interpreted as the filename of the configuration file (see \ref{runtimesetup}). \item If no file was found, the user's home directory is searched for a file named \verb+.t1librc+. In case it exists, it is used as a \tonelib-configuration file. \item If still no configuration file was found, the global configuration file will be tried to be opened. \item If this also does not succeed, all file search paths are left to be ``.'' and the default font database is \verb+FontDataBase+. \end{itemize} It should be noted that the first match wins when searching the configuration file. Only the first one found is examined. \item The font database file(s) are tried to be opened and read. This process is in detail described in \ref{fontdatabase}. If after scanning the complete list of font databases, no font definitions have been performed, \verb+T1_InitLib()+ will return with a \verb+NULL+ pointer indicating the initialization has failed. \item The number of fonts declared in the database is stored. Note that this number of declared fonts must be greater than zero. \item A flag is set to indicate \tonelib\ is initialized and the pointer to the top most area of the global data structures is returned to the application. This pointer is guaranteed to be not \verb+NULL+. \end{enumerate} For some applications, the described initialization scheme appears to be too inflexible and overkill. It is well suited for large applications that use lots of fonts and where it should be possible to add new fonts without modifying the application itself. For small commandline applications like \verb+type1afm+ (see \ref{type1afm}), which are designed to read a few font file names from the commandline, the overhead in configuration file searching and path reading is much too large. Moreover, to insist on a font database file might grow to a real disadvantage. In the subsequent paragraphs we should thus discuss how we can deviate from the initialization scheme described above. \subsubsection{Fine Control over Font Databases and File Search Paths} \label{manipulatingpaths}% First, it is important to mention that it is generally possible to force \verb+T1_InitLib()+ to skip steps 4 and / or 5 as described above. The configuration file is discarded by OR'ing the parameter \verb+log+ of \verb+T1_InitLib()+ with \verb+IGNORE_CONFIGFILE+. The default paths or the paths explicitly specified by the application before are then left untouched during initialization. Discarding the font database specification from the configuration file is achieved by bitwise OR'ing \verb+log+ with \verb+IGNORE_FONTDATABASE+. The result after initialization will be an empty database. This is valid in V.\ 0.5 and newer since fonts may be added to the database at runtime. Using the two flags described above, an installed setup can be ignored and an application may have complete control over its search paths. There are a number of functions for this purpose and each of these functions allows to specify exactly {\em one} path element at a given time. Using special characters like white space or path separators in a path element is thus not an issue. The font database may explicitly be specified by the application using \precorr \begin{verbatim} int T1_SetFontDataBase( char *filename) \end{verbatim}\index{\verb+T1_SetFontDataBase()+}\postcorr \verb+filename+ is the pointer to a string containing the name of the font database file that is to be examined. This function replaces any set of font databases setup previously and is thus usually to be called before \verb+T1_InitLib()+. A call to this function after initialization will return the result -1 and \verb+T1_errno+ will be set to \verb+T1ERR_OP_NOT_PERMITTED+. For the special case that the font database is still epmty after initialization this function may also be called after initialization. But in any case, the database must be empty! For the latter cases, fonts specified in the new database file are then immediately inserted into the database. In case of success, the number of available fonts is returned. There is also the function \precorr \begin{verbatim} int T1_AddFontDataBase( int mode, char *filename) \end{verbatim}\index{\verb+T1_AddFontDataBase()+}\postcorr It can be called at any time and \verb+filename+ is the string of the new font database's file name. If called before initialization, the parameter \verb+mode+ can be either \verb+T1_APPEND_PATH+ or \verb+T1_PREPEND_PATH+ and the name of the new font database simply is either appended or prepended to the existing list of font databases. Then, the function returns $0$. If the function is called after initialization, the parameter \verb+mode+ is ignored and the new database is appended in any case, because this is the only meaningful action. Furthermore, the new database is immediately loaded and the function returns a number indicating the number of available fonts (which can also be 0). In the case of an error, \verb+T1_AddFontDataBase()+ returns $-1$. There is also a pair of functions that act on the list of XLFD font database files, \precorr \begin{verbatim} int T1_SetFontDataBaseXLFD( char *filename) \end{verbatim}\index{\verb+T1_SetFontDataBaseXLFD()+}\postcorr \precorr \begin{verbatim} int T1_AddFontDataBaseXLFD( char *filename) \end{verbatim}\index{\verb+T1_AddFontDataBaseXLFD()+}\postcorr These functions have exactly the same syntax and semantics as the functions just described above. Standard font database files and XLFD font database files are handled in separate lists internally, so that setting the XLFD font database will not affect explicit standard font database settings. However, the default standard font database (\verb+./FontDataBase+) will be cleared when at least one XLFD font database is specified. This is because the default font database is meant as a fallback, and the fallback case is no longer given if a XLFD font database has been specified. A similar manipulation as just described for font database files, is possible for the searchpaths. (Re-)Defining a search path is done by calling \precorr \begin{verbatim} int T1_SetFileSearchPath( int type, char *pathname) \end{verbatim}\index{\verb+T1_SetFileSearchPath()+}\postcorr before calling \verb+T1_InitLib()+, or respectively, before the database contains any fonts. An attempt to set the file searchpaths when the database is no longer empty is denied. The reason is that it is not wise to override the searchpaths which had been valid previously during the verification of the existence of font files. Such paths should thus not be removed. The parameter \verb+pathname+ points to the string that contains the pathname that should be used as searchpath. The parameter \verb+type+ is any OR'ed combination of \verb+T1_PFAB_PATH+, \verb+T1_AFM_PATH+ and \verb+T1_ENC_PATH+. These tell the function to set the search paths for Type 1 font files, AFM files and encoding files, respectively. In case of an error \verb+-1+ is returned and otherwise \verb+0+. Extending the file searchpaths before {\em and} after initialization is possible using \precorr \begin{verbatim} int T1_AddToFileSearchPath( int pathtype, int mode, char *pathname) \end{verbatim}\index{\verb+T1_AddToFileSearchPath()+}\postcorr This might be useful to locate font files that were of no interest at the time of initialization. \verb+pathname+ is the pointer to the string that should be added to the searchpaths. Only {\em one} particular path element may be specified in one call. What searchpaths are affected is determined by the parameter \verb+pathtype+. Again, similar to described above, any OR'ed combination of \verb+T1_PFAB_PATH+, \verb+T1_AFM_PATH+ and \verb+T1_ENC_PATH+ is valid. There are two ways to extend an existing searchpath which are specified by the \verb+mode+ parameter. It must be either \verb+T1_APPEND_PATH+ or \verb+T1_PREPEND_PATH+, which causes the new path element to be appended or prepended to the existent path respectively. Since an existent path specification is not overwritten by \verb+T1_AddToFileSearchPath()+, this function may be called at any time before or after initialization. It might also be of interest to query the current file search paths and font databases. \tonelib\ provides \precorr \begin{verbatim} char *T1_GetFileSearchPath( int type) \end{verbatim}\index{\verb+T1_GetFileSearchPath()+}\postcorr for querying search paths. Again, the parameter \verb+type+ determines what search path is returned. Exactly one of \verb+T1_PFAB_PATH+, \verb+T1_AFM_PATH+, \verb+T1_ENC_PATH+ and \verb+T1_FDB_PATH+ should be specified. If more than one path is specified, the first match wins and only one path is returned. The types will be checked in the order \verb+T1_PFAB_PATH+, \verb+T1_AFM_PATH+, \verb+T1_ENC_PATH+ and \verb+T1_FDB_PATH+. Here, \verb+T1_FDB_PATH+ indicates an interest in the list of font databases. The paths are separated using the current path separator. \subsubsection{Adding Fonts to the Database} \label{addingfonts}% Extending the font database is possible at any time after initialization. In addition to using \verb+T1_AddFontDataBase()+ (see above), it is done via a call to \precorr \begin{verbatim} int T1_AddFont( char *fontfilename) \end{verbatim}\index{\verb+T1_AddFont()+}\postcorr \verb+fontfilename+ is the pointer to the filename string. The following actions take place: \begin{itemize} \item The font file is searched using the current search path specifications. \item If the file has been located, it is checked whether the font database contains enough memory to hose an additional font. If so, the font filename is stored and the function returns \verb+new_ID+, which is the font ID that will be associated with this font in the future. \item If there was no free memory for an additional font, the memory is reallocated to a greater size. This involves also resetting the new area. Finally the value \verb+new_ID+ is returned. \end{itemize} If a negative value is returned the function failed. \verb+-1+ indicates the font file could not be located. \verb+-2+ or \verb+-3+ are returned if a memory allocation failure occurs. \subsubsection{Summary of Search Path Handling} Since the exact handling of search path specifications at the several stages may appear somewhat confusing we shall summarize the exact rules now: \begin{enumerate} \item {\bfseries Before Initialization}\\ Default paths are not yet setup. Each call of one of the \verb+T1_Set...()+ functions described above establishes a completely new respective path. Each call of one of the \verb+T1_Add...()+ functions extends the respective path in the desired manner, or creates a new respective path if previously no path existed. \item {\bfseries At the Beginning of the Initialization}\\ Each path type for which a path had not already been explicitly created using the\\ \verb+T1_Set...()+ or \verb+T1_Add...()+ functions receives a default value. This is ``\verb+.+'' for the file search paths and \verb+./FontDataBase+ for the font database. \item {\bfseries During Initialization}\\ Each path element read from the configuration file overwrites an existing respective default path but preserves an existing respective explicitly setup path by appending to the latter. The newly setup search path is used to locate files while scanning the font database file(s). \item {\bfseries After Inititialization but before the Database is being filled}\\ At this stage, all \verb+T1_Set...()+ and \verb+T1_Add...()+ functions still work as described under~(1). Notice that this phase usually is not accessible when using the standard initialization scheme. It only becomes accessible if no fonts have been added during initialization. \item {\bfseries After at least one Font is insterted into the Database}\\ Once there are fonts in the database, the paths setup up to now must be preserved in any case. Hence, the \verb+T1_Set...()+ may not be called any longer. The \verb+T1_Add...()+ functions {\em extend} the current set of search paths. In particular, possibly existing default search path elements, then, are not overwritten any longer because they might have been used before to verify the existance of required files. \end{enumerate} A call to \verb+T1_AddFontDataBase()+ will not only append the specified file name to the existing list of databases, but will also immediately locate the fonts specified therein and assign additional font IDs. \subsubsection{Bypassing the \tonelib\ File Search Machinery} \label{afmfilenames}% Usually, \tonelib\ takes care for locating files according to the path specifications in the configuration file. There might, however, arise the need to explicitly tell \tonelib\ which particular file to use. Forcing \tonelib\ to use particular Type 1 font files can be achieved using the function \verb+T1_AddFont()+, described just above. If a pathname passed to this function is a complete path, \tonelib\ will use this complete path to locate the font file, forgetting about its own search path list. A filename path is assumed to be complete if \begin{itemize} \item it starts with the directory separator character, usually ``\verb+/+''. In this case it is an {\em absolute} path specification, meaning that the start point is at the root of the filesystem, or \item if it starts with ``\verb+./+'' or ``\verb+../+'' (where it is assumed that ``\verb+/+'' is the directory separator character). Here we have a {\em relative} path specification in which ``\verb+.+'' refers to the current working directory while ``\verb+..+'' refers to the parent directory of the current working directory. Since the notion of the {\em current working directory} is fundamental for every process that has access to a filesystem, a relative path specification also uniquely identifies one particular file in the filesystem. \end{itemize} If a font file whose complete path had been specified could not be found by \tonelib, the paths from the configuration file are searched as a fallback mechanism. What can be done for the Type 1 font files is also possible for AFM files, which are needed on a per-font basis. The function \precorr \begin{verbatim} int T1_SetAfmFileName( int FontID, char *afm_name) \end{verbatim}\index{\verb+T1_SetAfmFileName()+}\postcorr allows to set the complete path of the AFM file belonging to the font identified by \verb+FontID+, overriding the internal search mechanism. This function is to be called after initialization but before the font \verb+FontID+ is loaded. It returns 0 if all goes right and $-1$ otherwise. In the latter case \verb+T1_errno+ will also be set appropriately. Notice that \verb+FontID+ must also be valid with respect to its upper limit, it is an error condition if the font database has less than \verb+FontID+ entries. There is also the function \precorr \begin{verbatim} char *T1_GetAfmFileName( int FontID) \end{verbatim}\index{\verb+T1_GetAfmFileName()+}\postcorr which allows to query the AFM filename of a font. It returns a pointer to the filename if it had explicitly been specified or \verb+NULL+ otherwise. \verb+NULL+ will also be returned if \verb+FontID+ was invalid. In this case also \verb+T1_errno+ will be set. Just for the sake of completeness we should mention that what has been said about absolute and relative path specification also applies to pathnames for encoding files (see \ref{encoding}). \subsection{The \tonelib-Logfile} \label{logfile}% Since version 0.2-beta \tonelib\ supports a runtime logfile. It implements an uncomplicated way to keep track of errors, warnings, statistics and debug messages without overloading stdout/stderr. As seen in \ref{initialization} the user must specify whether or not to use a logfile when calling \verb+T1_InitLib()+. Specifying \verb+LOGFILE+ as argument leads to using a logfile and \verb+NO_LOGFILE+ suppresses the use of a logfile. The name of this logfile is by default \verb+t1lib.log+. This name is defined in \verb+t1misc.h+ and can be changed there as the user likes. Basically \tonelib\ distinguishes 4 types of runtime messages. Each type is associated a ``loglevel'': \begin{itemize} \item {\sl Errormessages/Level1:}\/ They are considered that important that the user is in any case informed. Example: During initialization the memory allocation for one of the basic data structures of \tonelib\ failed. \item {\sl Warningmessages/Level2:}\/ They are considered important but it is not absolutely necessary to inform the user. Example: An AFM file could not be loaded for a given font. This imposes several restrictions on what can be done with that font but it is possible to generate bitmaps. \item {\sl Infomessages/Level3:}\/ They do not indicate a problem. Rather, the user is notified about some facts and statistics that might be of interest. Example: After loading a font the consumption of virtual memory is displayed. \item {\sl Debugmessages/Level4:}\/ These can be pointers, numerical data etc. Example: Print out the pointers that point to the memory area where the PostScript dictionaries for a font just loaded are located. \end{itemize} The decision what message to put into the logfile is done by examining the value of an integer variable whose values can be \verb+T1LOG_ERROR+ (=1), \verb+T1LOG_WARNING+ (=2), \verb+T1LOG_STATISTIC+ (=3) or \verb+T1LOG_DEBUG+ (=4). All messages whose level is below or equal to this value are put into the logfile. The user may set this loglevel by calling \precorr \begin{verbatim} void T1_SetLogLevel( int level) \end{verbatim}\index{\verb+T1_SetLogLevel()+}\postcorr The default value is \verb+T1LOG_WARNING+ which means that error and warning messages are stored in the logfile. If the usage of a logfile has been specified, \tonelib\ tries first to open it in the current directory. If this fails for some reason \tonelib\ tries to create it in the user's home directory. If this fails too, an error message is printed to stderr and no logfile is used. If the application programmer chose not to create a logfile, it would be hardly possible for a user to track down possible problems, e.g. in file searching. To overcome this disadvantage, the user may set an environment variable \verb+T1LIB_LOGMODE+ at runtime. This variable is evaluated by \tonelib\ when \verb+T1_InitLib()+ is called. If its value is one of the four strings \verb+logDebug+, \verb+logStatistic+ \verb+logWarning+ and \verb+logError+, the respective loglevel is set by \tonelib\ and a log file is created, even if the programmer chose not to do so. However, if the programmer had altered the log level after calling \verb+T1_InitLib()+, this cannot be catched by setting the environment variable. A log file is created anyhow so that at least error messages will be logged. The user himself may also put some messages into the logfile. This can be achieved using \precorr \begin{verbatim} void T1_PrintLog( char *func_ident, char *msg_txt, int level, ...) \end{verbatim}\index{\verb+T1_PrintLog()+}\postcorr where \verb+func_ident+ is a pointer to a string identifying the function that generates the message. \verb+msg_txt+ points to the text string to put out. The distinction between a function identifier and a message text is only formal, indicating the user should identify the function that generates the message. The string \verb+msg_txt+ may contain format character sequences, \verb+%..+ , as known from the \verb+printf+- or \verb+scanf+ standard \verb+C+ functions. In this case, the ellipses indicate that a variable list of further arguments may follow. The \verb+level+ specification works as described above: The message is only put out if the internal loglevel is equal or greater than \verb+level+. Here is a typical example of a log file after a (short) \verb+xglyph+-session in which the loglevel was set \verb+T1LOG_STATISTIC+. Among several informative messages of type S, also two messages of type W have been generated. They stem from trying to raster the character ``\ss'' which was not in the current encoding. \par\noindent {% \tiny \begin{verbatim} (S) (Mon Jul 14 18:27:34 1997) T1_InitLib(): Initialization started (S) (Mon Jul 14 18:27:34 1997) T1_InitLib(): Initialization succesfully finished (S) (Mon Jul 14 18:27:44 1997) T1_LoadFont(): VM for Font 0: 35132 bytes (S) (Mon Jul 14 18:27:44 1997) CreateNewFontSize(): New Size 100.000000 created for FontID 0 (antialias=0) (S) (Mon Jul 14 18:27:53 1997) CreateNewFontSize(): New Size 100.000000 created for FontID 0 (antialias=1) (S) (Mon Jul 14 18:27:53 1997) CreateNewFontSize(): New Size 200.000000 created for FontID 0 (antialias=0) (W) (Mon Jul 14 18:27:53 1997) T1_SetChar(): No black pixels found for character 223 from font 0, returning NULL (W) (Mon Jul 14 18:27:53 1997) T1_SetStringX(): T1_SetChar() returned NULL-pointer! (S) (Mon Jul 14 18:27:55 1997) T1_DeleteSize(): Size 200.000000 deleted for FontID 0 (antialias=0) (S) (Mon Jul 14 18:27:55 1997) T1_DeleteSize(): Size 100.000000 deleted for FontID 0 (antialias=0) (S) (Mon Jul 14 18:27:55 1997) T1_DeleteSize(): Size 100.000000 deleted for FontID 0 (antialias=1) \end{verbatim} } \subsection{Generating Bitmaps} \label{generatingbitmaps}% At this point, you are able to generate a bitmap. As said before, a character- or string-bitmap is given to the user as an object of type \verb+GLYPH+. We should briefly explain \verb+GLYPH+ here. The type is defined by \begin{verbatim} typedef struct { char *bits; struct { int ascent; int descent; int leftSideBearing; int rightSideBearing; int advanceX; int advanceY; } metrics; void *pFontCacheInfo; unsigned long bpp; } GLYPH; \end{verbatim} \verb+bits+ is a pointer to the bitmap data. The bitmap is organized in lines, starting with the uppermost line. Each bitmap pixel is usually represented by one bit. If the width of the bitmap is not an integer multiple of 8, the lines are padded with zeros, so that each line starts at a byte boundary. Note that the bitmap has no margins taken into account. The bitmap occupies the minimum area the character needs to be painted. The bitmap pointer may also be the \verb+NULL+-pointer. In this case, the glyph contains no foreground pixels. The metrics of the corresponding glyph should be valid, though. Typically, this appears for the space character as well as in situations where an undefined or unencoded character had been substituted by the \verb+.notdef+-character within the rastering functions. Note that the \verb+pixmap+-entry which has been present in version 0.3-beta, has been removed with version 0.4-beta. See the discussion on the X11-interface in \ref{x11interface} for an explanation of this. The struct \verb+metrics+ contains metric information that is needed to position the character and to describe the character origin with respect to the bitmap. The members in detail: \begin{itemize} \item \verb+metrics.ascent+: describes how many lines the bitmap ranges above the line $y=0$. \item \verb+metrics.descent+: describes how many lines the bitmap ranges below the line $y=0$. Width below $y=0$ counts negative so that the difference \verb+ascent+ $-$ \verb+descent+ is the total height of the bitmap, the number of lines. \item \verb+metrics.leftSideBearing+: The amount of spacing between the origin of a character and the x-coordinate of its leftmost painted pixel. One could also name it ``left margin'' of the character. \item \verb+metrics.rightSideBearing+: The horizontal difference between the origin of a character and the x-coordinate of its rightmost painted pixel. This definition stands in contrast to some other interpretations of the right side bearing, where it is assumed as the difference between the glyph's width and its right most pixel. \item \verb+metrics.advanceX+: The amount of position increment in horizontal direction after this character bitmap (or string bitmap) has been placed. It is almost always larger than the bitmap width because most characters contain a certain amount of margins. Note that this value is not suitable for internal computations of character positions since it contains the horizontal escapement rounded to the pixel grid. Using this value for such computations leads to accumulating positioning errors. \item \verb+metrics.advanceY+: The amount of position increment in vertical direction after this character bitmap (or string bitmap) has been placed. Upper direction counts positive. \end{itemize} As seen, the width of the bitmap is given as the difference between \verb+rightSideBearing+ and \verb+leftSideBearing+ and the values \verb+metrics.leftSideBearing+, \verb+metrics.descent+,\\ \verb+metrics.rightSideBearing+ and \verb+metrics.ascent+ effectively describe the bounding box of the glyph. The entry \verb+pFontCacheInfo+ is not currently used but will probably later when font caching is really implemented. Moreover, there's a certain chance that some other entry will be added in future releases. The member \verb+bpp+ is used to store the depth of the bitmap. For true bitmaps, it is always 1. See \ref{antialiasing} for an explanation. There are three basic functions which produce pointer to glyph objects. In order to generate the glyph for a single character you would use the function \precorr \begin{verbatim} GLYPH *T1_SetChar( int FontID, char charcode, float size, T1_TMATRIX *transform) \end{verbatim}\index{\verb+T1_SetChar()+}\postcorr As in most other functions, \verb+FontID+ is a valid identification number of a font. It can range from 0 to $n-1$, where $n$ is number of fonts declared in the font database file. The second argument \verb+charcode+ determines the character that will be rasterized. As mentioned earlier, the encoding mechanism is used for accessing the output character. This means, if \verb+'A'+ is given as the character code, the machine representation of \verb+'A'+ is used as an index into the current encoding vector. In this encoding vector, the characters' name is looked up. Encoding vectors may be changed by the user (see \ref{encoding}). The parameter \verb+size+ is interpreted in Postscript's bigpoint-unit (bp). By default, 1 bp equals one device pixel. \verb+transform+ specifies the transformation that will be applied to the character before rastering. If this pointer is \verb+NULL+, no transformation is used. Otherwise it should point to a valid \tonelib-transformation matrix. Please refer to \ref{transformations} for information on how to easily create \verb+T1_TMATRIX+ matrices. Hinting is only performed if the transformation is a pure rotation and if the the angle is one of 0, 90, 180 or 270 degrees. Otherwise font level and character level hinting information is ignored. Bitmaps of transformed characters are never saved in cache memory since I assume that they are rarely needed. The overhead to manage transformed characters in cache would be overkill and would significantly increase memory consuming. Anyhow, this would only work for some dedicated transformations. \verb+T1_SetChar()+ in fact does some more things than simply rastering the specified character: \begin{itemize} \item It checks whether the font in question is already loaded. If not, it is loaded. \item If the size dependent data structures for the size in question do not exist, it creates them and inserts them in the linked list of size dependent data structures. \item It checks if the character is already existent in cache. If so, it returns the data from cache. \end{itemize} Some words concerning memory management: The memory used by the \verb+GLYPH+-structure is static in this function. The memory required for the bitmap is also allocated by the function itself. This means, the user doesn't need to free any memory by himself. Every time \verb+T1_SetChar()+ is called, it starts by giving the memory needed for the last generated glyph free or respectively setting metric values to 0. Thus, do not free the returned glyph pointer since later \verb+T1_SetChar()+ will free memory that is no more allocated and probably used for some other purpose. If you really like to free the memory, set the pointer to \verb+NULL+ afterwards. If an error occurs at some point, \verb+T1_SetChar()+ returns a NULL-pointer to the user. Frequently it is advantageous to raster a series of characters at once. This has the advantage that internal accuracy may be used and the overhead for the user is minimal. For such cases, the function \precorr \begin{verbatim} GLYPH *T1_SetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform) \end{verbatim}\index{\verb+T1_SetString()+}\postcorr is provided. It can be considered an extended version of \verb+T1_SetChar()+. The same as said above applies to the arguments \verb+FontID+, \verb+size+ and \verb+transform+. But a few additional arguments are needed here. \verb+string+ is a series of bytes representing the indices into the current encoding vector. The \verb+len+-parameter is needed because we cannot imply that string is always an object like a string in C. For example, the Computer Modern Roman fonts contain the uppercase Greek Gamma (\char0) at position 0 in their internal encoding. In a string to be typeset the value 0 is thus a valid value and deserves no special treatment. Hence, we cannot not use the C-function \verb+strlen()+ to compute the length of the string. However, since in most usual encodings the special value 0 is not encoded (``\verb+.notdef+''), it makes sense to switch between standard situations and non-standard situations: \begin{itemize} \item If \verb+string+ is a string conforming with C-semantics, \verb+len+ can be set to 0. Then, the length of the string is internally computed. \item If \verb+string+ contains one or more control characters which make processing impossible, the \verb+len+-value must be specified explicitly. \end{itemize} The \verb+spaceoff+ parameter is important for word processing purposes. The value specified here is interpreted as an offset to the space width used during rastering. It is interpreted in charspace units, i.e., $1/1000$ bp. Every time a space character is requested, this amount of horizontal escapement is added to the natural spacewidth of the current font. Note that the space character itself is actually not rastered. All requests to the character with the charactername ``\verb+space+'' are caught by \tonelib\ and converted to a simple horizontal escapement. For computation of the resulting spacewidth, the width of the space-character is taken from the AFM data and merged with the specified offset, which may also be negative.\footnote{One consequence of this handling is, that---with a little tricking---fonts that do not define a space character themselves may be used for typesetting. This applies to the dc-fonts, which only define a visible space, but no real space (see \ref{fonts}).} The \verb+modflag+ argument may be used to specify some option to the rastering function. It is generally 0 or an OR'ed combination of the following names: \begin{itemize} \item \verb+T1_KERNING+: As the name implies, this argument determines that pairwise kerning information from the AFM file is to be taken into account during string rastering. Not specifying \verb+T1_KERNING+ means: ``omit kerning''. It is generally recommended to use kerning information since this improves the optical appearance. However, many lower quality fonts do not have kerning information. With \tonelib\ V.\ 0.4-beta, kerning information is accessible much faster than before because it is based on char codes rather than on characternames. \item \verb+T1_RIGHT_TO_LEFT+: Setting this flag will invert the writing direction. In {\em Right-To-Left} mode the escapement in writing direction (left) is inserted before placing the character with the result that the character laps over to the left side. This principle is kept for all characters in the string. Note that metrics of fonts that are intended for {\em Right-To-Left} typesetting have the same meaning as for fonts intended for standard ({\em Left-To-Right}) typesetting. \item \verb+T1_UNDERLINE+: The string to be rastered is to be underlined according to the line specifications of the current font. \item \verb+T1_OVERLINE+: The string to be rastered is to be over lined. \item \verb+T1_OVERSTRIKE+: Same here for overstriking. \end{itemize} For a description of underlining and such, see \ref{underlining}. Notice also that the \verb+modflag+ argument is a replacement of the \verb+kerning+ argument from pre-0.7 versions of \tonelib. Concerning glyph-memory considerations, the same applies as said under the description of \verb+T1_SetChar()+: Never free a pointer to memory which was returned by \verb+T1_SetString()+. Or, alternatively, if freeing the pointer cannot be avoided set it to NULL after freeing it.\footnote{For example, {\tt XDestroyImage()} gives the pixel memory for the image data free although it might not have been allocated by any X11-function.} There are two generic ways how a string-glyph can be produced. The first is to take the paths of all characters needed, concatenate them, insert space and kerning amounts as needed and raster the resulting whole path. This will yield the best results since the average position accuracy of the pixels will be optimal. This applies especially for rotated strings. The drawback is, that every character must be rastered every time it is needed. There is no way to access the bitmap data of a character inside a rastered string separate from others. And the caching of string-glyphs at this programming level doesn't make any sense. So this principle takes significantly longer than concatenating bitmaps from a cache area. However, it is done when the specified rotation angle is not equal to $0^\circ$ or when even further transformation are to be applied. This condition should limit the total number of situations when this happens to an amount we can easily bear. If the \verb+transform+-argument is \verb+NULL+ we know transformations or rotation should not be applied and another approach is used. We are then able to construct the resulting bitmap by adjusting already existent bitmaps into proper positions. If a character does not already exist in the cache, it is generated just the way \verb+T1_SetChar()+ works. The calculation of the character-bitmap positions in the output bitmap is done with char space-precision. Nonetheless, there may be differences in the output compared with output of the above method. These are caused by the fact that rounding to pixel accuracy has already been achieved when generating the character bitmap. Thus, the output of the above principle should always be better since the positions of the black pixels are rounded with respect to the whole string, and not with respect to a single character glyph. On the other hand, concatenating character glyphs takes significantly less time than rastering a complete string. Theoretically, differences of up to two pixels horizontal shift may appear in the output of the two principles. You can check the effect by running the program \verb+xglyph+. Specify a string of enough length and raster it at angle $0^\circ$. Then specify a very small angle from 0 different, say, $0.001^\circ$, and raster the string again with the new setting. You might find that the representation of the string is a little different now. The third function that creates a glyph object is \precorr \begin{verbatim} GLYPH* T1_SetRect( int FontID, float size, float width, float height, T1_TMATRIX *transform) \end{verbatim}\index{\verb+T1_SetRect()+}\postcorr Calling this function yields a filled rectangle. It is intended for situations where a \TeX-style \verb+\vrule+ would be appropriate, or, for equations in mathematical typesetting. First, the argument \verb+FontID+ identifies a valid font. At this time, it is not obvious why a valid font is required in order to create a rectangular glyph. The reason is, that some of the parameters that are associated to a particular font are also relevant for creating rectangles in the context of that font. Hence, specifying a font identifier in this case is a means of stating ``{\em draw a rectangle that visually fits to the style of the font \verb+FontID+}''. Aside from this, I assume that each application that uses \tonelib\ deals with at least {\em one} font so that the \verb+FontID+ parameter actually does not hurt. The size of the rectangle is to be specified in charspace units by means of the parameters \verb+width+ and \verb+height+, and is moreover subject to scaling through the parameter \verb+size+. By definition, the typographical fundamental area of a font, known as the {\em em-square}, is just as high and as wide as the design size of the font. In charspace units, this rectangle exactly maps to a $1000 \times 1000$ grid. Or alternatively spoken, one charspace unit is 0.001bp (Big Point). For example, in order to draw an em-square for some font at 13 points, the correct parameters are \hbox{\verb+size+ $= 13$}, \hbox{\verb+width+ $= 1000$} and \hbox{\verb+height+ $= 1000$}. If absolute physical dimensions are desired, the scaling explicitly must be calculated by the user. For instance, in order to produce a $ 1 \mathrm{cm} \times 1 \mathrm{cm}$ square we find \begin{displaymath} h = w = 1\mathrm{cm} \frac{72\mathrm{bp}/\mathrm{in} \times 1000\mathrm{cs}/\mathrm{bp}}{2.54\mathrm{cm}/\mathrm{in}} \approx 28346\;\mathrm{cs.} \end{displaymath} Here ``cs'' designates charspace units and \verb+size+ is assumed to be $1$. Note that still the device resolution must be properly setup in order to make the dimensions appear accurately on the device. The parameter \verb+transform+ is a pointer to a \tonelib\ transformation matrix. If it is \verb+NULL+, the current transformation of the font in question is used. Depending on the kind of actual transformation, the rectangle might also image as a nonrectangular shape. This happens, if the current font is slanted, then the rectangle will be skewed. Glyphs produced by the rectangle function are never cached because there is no means in doing so. With respect to memory management, the same applies as for \verb+T1_SetChar()+ and \verb+T1_SetString()+. Since rectangles rarely are used to produce normal text flow, the glyphs produced by the rectangle function do not cause any escapement. If two glyphs with arbitrary orientation exist, \precorr \begin{verbatim} GLYPH *T1_ConcatGlyphs( GLYPH *glyph1, GLYPH *glyph2, int x_off, int y_off, int modflag) \end{verbatim}\index{\verb+T1_ConcatGlyphs()+}\postcorr can be used to concatenate them. First the size of the resulting glyph is computed and its metric values are filled. Then, the two glyphs are placed at their appropriate positions in the newly created bitmap. In order to be able to work, the following conditions must be met: \begin{enumerate} \item Either glyph must be different from \verb+NULL+. \item Both glyphs must have identical \verb+bpp+-values. If antialiased and non-antialiased glyphs are to be concatenated, have a look at \item There must be enough memory for the new glyph (naturally). \end{enumerate} The quantities \verb+x_off+ and \verb+y_off+ describe the $x$- and $y$-component of an optional offset to be inserted between the two glyphs. This offset is interpreted as device pixels. The \verb+modflag+ argument is used to specify the direction in which the two glyphs are to be concatenated. That is, only the bit \verb+T1_LEFT_TO_RIGHT+ / \verb+T1_RIGHT_TO_LEFT+ is respected by this function. If problems occur, \verb+NULL+ is returned. It is generally not recommended to produce large glyphs with this function because the char space precision in placing the character bitmaps is lost. For example, three times rounding up an advance by 0.3 pixels accumulates to 1 pixel position error. A similar effect shows up when two rotated and underlined glyphs are concatenated with this function. There might be a slight shift in the baseline at the point where the two glyphs touch. A dilemma occurs, if two antialiased bitmaps have distinct background colors. Then, it is not clear what the transparent color is. \verb+T1_ConcatGlyphs()+ always assumes the {\em current} background color to be transparent. There is one more function that generates pointers to glyphs: \precorr \begin{verbatim} GLYPH *T1_CopyGlyph(GLYPH *glyph) \end{verbatim}\index{\verb+T1_CopyGlyph()+}\postcorr As mentioned earlier, the user doesn't have the possibility of keeping the glyphs longer than to the next call of the respective rastering function. If someone wants to keep a bitmap some time longer, \verb+T1_CopyGlyph()+ may be used to copy the glyph to another area which is then completely under user's control. This function simply does the following: \begin{itemize} \item Allocates the memory for the glyph-structure. \item If bitmap data is present, it allocates memory for the bitmap data, taking the member \verb+bpp+ into account (see \ref{antialiasing}). \item Copies the structure and the bitmap data to the respective locations. \item Initializes the pointer \verb+glyph.bits+. \end{itemize} Return value is the pointer to the allocated glyph-structure. If something goes wrong, NULL is returned to indicate an error. A glyph pointer, returned by a call to this function should be freed by a call to \verb+T1_FreeGlyph()+ (see \ref{deletingdata}). \subsection{Loading Fonts Explicitly} \label{loading}% Usually there is no need for a user to load a font into memory since this is done automatically as needed by the rastering functions. But there are two situations where it makes sense to explicitly load a font before generating any size dependent data: \begin{itemize} \item A font is to be reencoded immediately after loading (see \ref{encoding}). \item A font is to be transformed (see \ref{transformations}). \end{itemize} These operations require a font being loaded but not having any size specific data. Loading a font explicitly is done by the function \precorr \begin{verbatim} int T1_LoadFont( int FontID) \end{verbatim}\index{\verb+T1_LoadFont()+}\postcorr Loading a font involves several actions: \begin{itemize} \item Locating and loading the Type 1 font file. \item Locating and loading the font metrics data from AFM file. \item Computing and filling the values of the \verb+FONTPRIVATE+ structure as described in section \ref{internals}. \item Setting up some tables for fast access of metrics information. \end{itemize} \verb+T1_LoadFont()+ returns \verb+0+ if successful or \verb+-1+ if the font could not be loaded. A failure may be due to \tonelib\ not having been initialized or due to problems with file locations and file parsing. If a font refuses to load, the logfile should be examined first. Furthermore, in case of a failure \verb+T1_errno+ will be set appropriately. \subsection{Functions for Encoding Handling} \label{encoding}% As mentioned earlier, the encoding mechanism used in the PostScript-language allows a font to contain more than 256 different characters, although only 256 are accessible at a given time. The characters which are accessible are given by the elements of the current {\em encoding vector}. In order to maximize flexibility, \tonelib\ allows for changing the current encoding vector. This is also called ``Reencoding a font''. A new encoding vector is defined and made known to the library by creating an encoding-file and loading its contents into memory. Before describing the functions needed for this, we should briefly describe the format of an encoding file. An encoding file is an ASCII text file. No assumptions about filename extensions are made. Here are the rules for scanning the file: \begin{itemize} \item The file contents are completely ignored until a line is encountered that starts with the string \verb+Encoding=+. This string may optionally be immediately followed by a string that is assumed to be the identifier of the {\em encoding scheme} that this file defines. Any further text on this line is ignored. \item Now, 256 lines have to follow, each line describing one character's name. The string ranging from the beginning of the line to the first white space character is assumed to be a character name. The remainder of the lines is ignored and may (should) be used for comments, thereby describing the current character code. \item All further lines of text are ignored. \end{itemize} As well known from PostScript, non-existent characters have to be named \verb+.notdef+. Here's an example of such an encoding file: \begin{verbatim} Sample encoding file for t1lib! The first two lines are considered to be comments! Encoding=ISOLatin1Encoding .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ . . . . . . greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ . . . . . . yacute /* '375 253 "FD */ thorn /* '376 254 "FE */ ydieresis /* '377 255 "FF */ \end{verbatim} Since V.~1.2, \tonelib\ is also able to load encoding files in the format used by \verb+dvips+. This makes a large set of existing encoding files available to the user. When parsing \verb+dvips+ encoding files, \tonelib\ requires PostScript syntax. This means white space may be interspersed freely and line comments are defined by the character \%. The mark-characters, \verb+[+ and\verb+]+, are considered as special tokens and need not be preceded or followed by white space. Similarly, the literal escape character \verb+/+ delimits a preceding token without interspersed white space. When parsing \verb+dvips+ encoding files, \tonelib\ tolerates less than 256 character name definitions. If characters are missing, they are substituted by \verb+.notdef+ until the counter reaches $256$. Aside from comments, no PostScript tokens are allowed after the encoding definition in a \verb+dvips+ encoding file is complete. With the defining terms above, it turns out that a file which has successfully been scanned as a \verb+dvips+ encoding file, cannot specify a valid \tonelib\ encoding after the PostScript encoding definition is complete (because no valid character name can start with \% and because at least a line such as \verb+Encoding=+, would have to follow the PostScript encoding). Hence the file format are mutually exclusive and it is possible to read both format using one function. In a first pass \tonelib\ tries to read the file as a \verb+dvips+ encoding file, and if that fails, it assumes to have a \tonelib\ encoding file. Once such an encoding file of either type has been created, it can be loaded into memory. This is done with the function \precorr \begin{verbatim} char **T1_LoadEncoding( char *filename) \end{verbatim}\index{\verb+T1_LoadEncoding()+}\postcorr The function will use the search path definitions read from the configuration file during initialization (see \ref{runtimesetup}, \verb+ENCODING=+). If no errors occur, an array of pointers to strings is created and initialized. The start address of this pointer array is returned as a double pointer to a char. This pointer is intended to be used to reencode a font via \verb+T1_ReencodeFont()+. If the encoding data structure could not be created, \verb+NULL+ is returned to indicate the error. The memory allocated by \verb+T1_LoadEncoding()+ is organized in two continuous blocks. One block is the pointer array of size 257\footnote{This number results from 256 charactername pointers plus one pointer to the encoding scheme identifier.} and the other block contains the character name strings plus the encoding scheme specification, separated by ASCII-zeros. This memory can be returned to the system using the function \precorr \begin{verbatim} int T1_DeleteEncoding( char **Encoding) \end{verbatim}\index{\verb+T1_DeleteEncoding()+}\postcorr \tonelib\ does not check whether a valid pointer value was passed. So be careful to pass the correct pointer. An error in this function should almost always be followed by a segmentation violation. A newly loaded encoding is applied to an existent font by calling \precorr \begin{verbatim} int T1_ReencodeFont( int FontID, char **Encoding) \end{verbatim}\index{\verb+T1_ReencodeFont()+}\postcorr \verb+FontID+ must be a valid font identification and \verb+Encoding+ a pointer returned from a successful call to \verb+T1_LoadEncoding()+. There are two requirements in order to reencode a font: \begin{enumerate} \item The font must already have been loaded into memory. \item No size-dependent data exists for this font. If it does, it must be removed explicitly prior to calling \verb+T1_ReencodeFont()+. \end{enumerate} It follows that there are two ways to reencode a font. The first is to load a font explicitly and reencode it before any size dependent data is created. The second is to use an automatically loaded font and delete all of its size dependent data before reencoding it. The user may also specify the special pointer NULL as the \verb+Encoding+-argument. This would reencode the font to its internal encoding vector. In case of success, the function returns 0, otherwise -1 is returned. Reencoding a font takes a considerable amount of time since the mapping tables have to be reorganized. In situations where it is \`a priori foreseeable that the font will be reencoded using some standard encoding vector, it makes sense to assign that particular encoding vector as the default encoding vector, thereby overwriting the internal encoding vector of each font at load time before the mapping tables are setup. Setting the default encoding can be achieved using \precorr \begin{verbatim} int T1_SetDefaultEncoding( char **Encoding) \end{verbatim}\index{\verb+T1_SetDefaultEncoding()+}\postcorr Here \verb+Encoding+ encoding is assumed to be a valid \tonelib\ encoding vector, e.g., created by a call to \verb+T1_LoadEncoding+. \verb+T1_SetDefaultEncoding()+ has to be called after initialization. It returns \verb+0+ if this condition is fulfilled and \verb+-1+ otherwise. In the latter case \verb+T1_errno+ is set appropriately. Notice that the internal encoding of the font is still accessible by reencoding the font using \verb+NULL+ as encoding specification (see above). Note further that the default encoding vector is only applied to those font that have \verb+StandardEncoding+ as internal encoding. This is to prevent fonts like ZapfDingbats, Symbol or Sonata\footnote{A musical notation font.} from being reencoded automatically at load time because this would be surely inappropriate for such fonts. It is also possible to query the encoding scheme that the font associated with \verb+FontID+ uses. This is achieved with the function \precorr \begin{verbatim} char *T1_GetEncodingScheme( int FontID) \end{verbatim}\index{\verb+T1_GetEncodingScheme()+}\postcorr The return value is a pointer to a string which describes the encoding scheme in question. The are 3 possible cases: \begin{itemize} \item The font uses Adobe StandardEncoding, which is internally known by the rasterizer. Then, \verb+StandardEncoding+ is returned. \item The font defines its own encoding by \hbox{\verb+dup+ $n$ {\em LiteralName} \verb+put+} statements. In this case no particular name is associated with the encoding scheme and \verb+FontSpecific+ is returned. \item The encoding is externally loaded by \verb+T1_LoadEncoding()+. Then the encoding scheme entry of this file is returned. If this (optional) entry is not specified in the file, \verb+Unspecified+ is returned. \end{itemize} Notice that the name of the encoding scheme is also accessible as \verb+Encoding[256]+ where \verb+Encoding+ is the pointer returned by a successful call to \verb+T1_LoadEncoding()+. \subsection{Deleting Data} \label{deletingdata}% In frequently appearing cases, it may be wise to return some memory which was explicitly or automatically allocated by the library back to the system.\footnote{This is especially true, since there is presently no caching algorithm which automatically takes care of this.} For this purpose some functions are available. To understand how size dependent data for a font is organized, see (\ref{internals}). The memory amount required by the size-dependent data of \verb+size+ and font \verb+FontID+ is freed by calling the function \precorr \begin{verbatim} int T1_DeleteSize( int FontID, float size) \end{verbatim}\index{\verb+T1_DeleteSize()+}\postcorr The data deleted includes the metric information for 256 characters, some pointers, associated bitmap data (if already existent) as well as the font matrix for that size. As described in section \ref{internals}, the data structures containing size-dependent information of a particular font are organized as a linked list. \verb+T1_DeleteSize()+ takes care that a properly linked list is left after deleting the data. If the combination of \verb+size+ and \verb+FontID+ does not exist, -1 is returned. If the operation was successful, the return value is 0. For the purpose of removing all size-dependent data for a particular font, there is the function \precorr \begin{verbatim} int T1_DeleteAllSizes( int FontID) \end{verbatim}\index{\verb+T1_DeleteAllSizes()+}\postcorr It recursively removes all size-dependent data for the font \verb+FontID+. This may be appropriate if a user knows some font not to be needed any longer. This function is also to be used, if one intends to reencode a font for which size dependent data has already been generated. In addition, font transformations such as {\em slanting} and {\em extending} require a font having no size-specific data. \verb+T1_DeleteAllSizes()+ recursively calls \verb+T1_DeleteSize()+ to do its job. It returns the number of sizes removed (including 0 if no sizes were existent) or -1 if an error occurred. It is also possible to remove the entire data associated with a particular font from memory using \precorr \begin{verbatim} int T1_DeleteFont( int FontID) \end{verbatim}\index{\verb+T1_DeleteFont()+}\postcorr \verb+T1_DeleteFont()+ goes one step beyond the above functions and removes all the data associated with the font \verb+FontID+. This includes: \begin{itemize} \item All size dependent data. \item All data from the Type 1 font program, held in memory. \item All AFM data kept in memory. \end{itemize} The memory reserved for a font in hierarchy-level 1 is not returned to the system since it is simply one element in the array of structures of type \verb+FONTPRIVATE+ (see \ref{internals}). But all entries in this structure are reset to initial values. Whether it is useful or not, a font that has been removed using \verb+T1_DeleteFont()+ may also be loaded again, explicitly or implicitly. There is a restriction, which has not yet been mentioned: A font may only be removed if it is a physical font (to be explained later) to which no logical fonts refer or if it is a logical font.\footnote{See \ref{logicalfonts} for explanation of logical fonts.} A reference counter is maintained in each physical font to check for this. If the font to be removed is a logical font, the \verb+FONTPRIVATE+ area is reset and the reference counter of the referenced physical font is decremented. Of course, size dependent data is removed in every case. \verb+T1_DeleteFont()+ returns 0 if the font has been removed correctly or if the font was not loaded. $n$ ($>0$) is returned if the font was physical and was referenced by $n$ logical fonts. A return value -1 indicates an invalid \verb+FontID+. The function \precorr \begin{verbatim} int T1_FreeGlyph( GLYPH *glyph) \end{verbatim}\index{\verb+T1_FreeGlyph()+}\postcorr returns memory allocated by \verb+T1_CopyGlyph()+ back to the system. This function should not be applied to the pointer to a glyph returned by one of the rastering functions. As said earlier, these functions manage the memory areas by themselves. Similarly, the function \precorr \begin{verbatim} int T1_FreeCompCharData( T1_COMP_CHAR_INFO *cci) \end{verbatim}\index{\verb+T1_FreeCompCharData()+}\postcorr returns memory associated to the composite caracter data structures, as allocated and returned by \verb+T1_GetCompCharData()+ or \verb+T1_GetCompCharDataByIndex()+ (see Section~\ref{subsec:CompositeCharacters}), to the system. In order to avoid memory leaks, each call of the latter two functions should be followed by a call to this function. In order to close the library and return all memory to the system, \precorr \begin{verbatim} int T1_CloseLib( void) \end{verbatim}\index{\verb+T1_CloseLib()+}\postcorr should be used. If no problems occur, 0 is returned. The value 1 indicates problems during freeing data. In this case the logfile should be examined. After having freed all data the file search paths, if different from the defaults, are restored. Last, the logfile is closed. \subsection{Underlining, Overlining and Overstriking} \label{underlining}% \tonelib\ supports underlining, overlining and overstriking for the string rastering functions. These lines are always drawn on the fly as the bitmaps are generated. In writing direction, the lines range from the glyph's origin to the glyph's width. The vertical dimensions are set the following way by default when a font is loaded: \begin{itemize} \item {\bf Underlining}: Underline position and thickness are taken from the Fontinfo dictionary of the respective font. The rule is vertically centered with respect to the mathematical line given by the position value. \item {\bf Overlining}: The position is computed to be $y=a+|u|$ where $a$ corresponds to the typographic ascender and $u$ is the underline position from the Fontinfo dictionary. As above, the rule is vertically centered around this position value. The thickness is set to underline thickness. \item {\bf Overstriking}: The position is $y=a/2$ where again $a$ is the typographic ascender of the font and vertical alignment of the rule is done by centering around the computed position. The thickness is set to underline thickness. \end{itemize} As all information in AFM files, thickness and position specifications are interpreted in charspace units. Notice that the typographic ascender is not determined by the Type 1 font program. It has to be guessed by \tonelib. The problem of guessing the typographic ascender is discussed in more detail in \ref{writingafmfiles}. When loading a font, this typographic ascender is assumed to be the vertical coordinate of the upper right corner of the bounding box of the letter ``d''. This is not as advanced as the procedure described in \ref{writingafmfiles}, but it suffices because the underlining positions can later be overwritten by the user (see below). From the mathematical point of view, the line rules are an integral part of the rastered path. It follows that line rules may appear sheared if a font has been artificially slanted and the size and/or thickness is sufficiently large. A look into real Type 1 font files shows that even fonts of the same family possess incompatible values for underlining. For example, Bitstream Charter Roman defines underline thickness to be 61 and its bold variant assigns a value of 90. Underlining text consisting of Roman and bold words will not be very pleasing using these values. For this reason \tonelib\ provides a way for explicitly setting and overwriting the default values for line ruling on a per-font level. The functions \precorr \begin{verbatim} int T1_SetLinePosition( int FontID, int linetype, float value) \end{verbatim}\index{\verb+T1_SetLinePosition()+}\postcorr and \precorr \begin{verbatim} int T1_SetLineThickness( int FontID, int linetype, float value) \end{verbatim}\index{\verb+T1_SetLineThickness()+}\postcorr set the respective value for font \verb+FontID+ to \verb+value+. The \verb+linetype+ argument is assumed to be an OR'ed combination of \verb+T1_UNDERLINE+, \verb+T1_OVERLINE+ and \verb+T1_OVERSTRIKE+. While it generally does not make sense to specify identical positions for two or three distinct line rule types, it is meaningful to specify identical thickness values for two or all rules types. However both functions accept combinations of linetype specification. It follows that consistent line ruling for several fonts can be achieved by setting the line rule parameters of the involved fonts to identical respective values. Currently active line rule parameters can be queried using the functions \precorr \begin{verbatim} float T1_GetLinePosition( int FontID, int linetype) \end{verbatim}\index{\verb+T1_GetLinePosition()+}\postcorr and \precorr \begin{verbatim} float T1_GetLineThickness( int FontID, int linetype) \end{verbatim}\index{\verb+T1_GetLineThickness()+}\postcorr In case more than one line rule type is specified for \verb+linetype+ the first matching value is returned, since obviously the functions can only return {\em one} value. The order the argument is checked is \verb+T1_UNDERLINE+, \verb+T1_OVERLINE+ and finally \verb+T1_OVERSTRIKE+. These functions called with \verb+T1_UNDERLINE+ as line type argument should not be confused with the functions \verb+T1_GetUnderlinePosition()+ and \verb+T1_GetUnderlineThickness()+ respectively. The latter functions will always return the values from the Fontinfo dictionary as opposed to the former which will return the currently active values. Since line ruling is done on the fly, it is possible to change the involved parameters in the middle of a session without confusing the cache or removing size dependent data. \subsection{Common Information on Fonts and Characters} \label{common}% This subsection describes some functions making common information available. This includes Type 1 and AFM data. Thus, these functions partially depend on the existence of AFM data. In order not to have to specify this data every time, here are a few conventions: \begin{enumerate} \item \verb+FontID+ is the valid ID of a declared font. \item All functions that require a character index as argument use the currently active encoding vector to determine the character's name belonging to this index and use the character's name to search for the information required. \item Some functions do not allow to use the return value for error checking. For this reason every function described in this subsection will set \verb+T1_errno+ appropriately if something goes wrong. See \ref{errorhandling} for the description of the possible values of \verb+T1_errno+. \item None of the functions described in this subsection will load a font automatically. \end{enumerate} \subsubsection{Information from FontInfo-Dictionary} \label{fontinfodict}% \precorr \begin{verbatim} char *T1_GetFontName( int FontID) \end{verbatim}\index{\verb+T1_GetFontName()+}\postcorr This function returns the string object \verb+FontName+ from the fontinfo-dictionary of the specified font or a NULL pointer if the font is not loaded. The memory for the returned string is static in this function and should thus not be freed by the user. As another consequence, the returned string is only constant until the function is called the next time. \precorr \begin{verbatim} char *T1_GetFullName( int FontID) \end{verbatim}\index{\verb+T1_GetFullName()+}\postcorr This function returns the string object \verb+FullName+ from the fontinfo-dictionary of the specified font or a NULL pointer if the font is not loaded. The memory for the returned string is static in this function and should thus not be freed by the user. As another consequence, the returned string is only constant until the function is called the next time. \precorr \begin{verbatim} char *T1_GetFamilyName( int FontID) \end{verbatim}\index{\verb+T1_GetFamilyName()+}\postcorr This function returns the string object \verb+FamilyName+ from the fontinfo-dictionary of the specified font or a NULL pointer if the font is not loaded. The memory for the returned string is static in this function and should thus not be freed by the user. As another consequence, the returned string is only constant until the function is called the next time. \precorr \begin{verbatim} char *T1_GetWeight( int FontID) \end{verbatim}\index{\verb+T1_GetWeight()+}\postcorr It returns the Weight entry from fontinfo dictionary. It is a string entry and represents a verbatim classification of the font rather than a numerical quantity. In case of an error \verb+NULL+ is returned. \precorr \begin{verbatim} float T1_GetItalicAngle( int FontID) \end{verbatim}\index{\verb+T1_GetItalicAngle()+}\postcorr The returned value is the italic angle of the font in degrees as a float. Notice that the meaning of ItalicAngle is related to the slanting of fonts, but not in the sense of \tonelib\ (see \ref{transformations}). An italic font may be artificially slanted and an artificially slanted font in the sense of \tonelib\ may have an italic angle of zero. \precorr \begin{verbatim} int T1_GetIsFixedPitch( int FontID) \end{verbatim}\index{\verb+T1_GetIsFixedPitch()+}\postcorr This function returns 0 if the font's spacing is proportional and 1 if it is fixed. \precorr \begin{verbatim} BBox T1_GetFontBBox( int FontID) \end{verbatim}\index{\verb+T1_GetFontBBox()+}\postcorr This function returns the bounding box of the font identified by \verb+FontID+. It is the bounding box that results if all characters of a font are overlayed with their reference point falling on the point (0,0). All values are in charspace units. The members \verb+lly+ and \verb+urx+ represent the fonts overall descent and ascent, respectively. The font's bounding box is part of the AFM information as well as member in the font's private dictionary. It turns out that the information from \verb+.afm+- and \verb+.pfa+/\verb+.pfb+-file is not consistent for some fonts. \tonelib\ returns the information stored in the font-file itself, since I assume it is more consistent to the font's data. \precorr \begin{verbatim} float T1_GetUnderlinePosition( int FontID) \end{verbatim}\index{\verb+T1_GetUnderlinePosition()+}\postcorr This function returns the underline position of the specified font as given in the fontinfo-dictionary. The value is to be interpreted in charspace units. If the font is not loaded, 0 is returned since an underline position of 0 can be considered impossible for most fonts. \precorr \begin{verbatim} float T1_GetUnderlineThickness( int FontID) \end{verbatim}\index{\verb+T1_GetUnderlineThickness()+}\postcorr This function returns the thickness of the underlining rule for this font or 0 if the font is not loaded. 0 is a safe index for an error since a rule of height 0 would not be visible anyhow. \precorr \begin{verbatim} char *T1_GetVersion( int FontID) \end{verbatim}\index{\verb+T1_GetVersion()+}\postcorr The version string from the Type 1 font file is returned. The memory where the string is located is managed by the function itself. \precorr \begin{verbatim} char *T1_GetNotice( int FontID) \end{verbatim}\index{\verb+T1_GetNotice()+}\postcorr The notice string from the Type 1 font file is returned. Again the user should not touch the memory where the string is located. \subsubsection{Metric Information on Glyphs} \label{metricinformation}% \precorr \begin{verbatim} int T1_GetCharWidth( int FontID, char char1) \end{verbatim}\index{\verb+T1_GetCharWidth()+}\postcorr The character width according to the AFM information is returned in charspace units. If no AFM information is available, 0 is returned. The width of a character is the amount of horizontal escapement that the next character is shifted to the right with respect to the current position. This information is not given in the character's bounding box. Also, the width corresponds to the entry \verb+characterWidth+ in the \verb+glyph+-structure, as described in \ref{generatingbitmaps}. But since \verb+T1_GetCharWidth()+, returns its result in charspace units, the accuracy is much higher than using the value of the \verb+glyph+-structure which has only pixel-accuracy. If there is an extension specified for the font in question, the characters width is corrected correspondingly. \precorr \begin{verbatim} BBox T1_GetCharBBox( int FontID, char char1) \end{verbatim}\index{\verb+T1_GetCharBBox()+}\postcorr The character's bounding box of \verb+char1+ is returned with the elements to be interpreted in charspace units. The bounding box of a character is defined to be smallest rectangle aligned parallel to the $x$- and $y$-axis of the character coordinate system which encloses the painted area of the character completely. This rectangle is completely specified by specifying its lower left and its upper right corner. From a programmer's point of view, a characters bounding box is defined by the following struct of type \verb+BBox+: \begin{verbatim} typedef struct { int llx; /* lower left x-position */ int lly; /* lower left y-position */ int urx; /* upper right x-position */ int ury; /* upper right y-position */ } BBox; \end{verbatim} In case the character is not encoded or no AFM data is available, a box containing only zeros is returned. The bounding box is corrected if an extension value has been applied to the font in question. Since version 0.3-beta, slanted fonts are fully supported, meaning that for slanted fonts too a correct bounding box will be returned. This is however quite time expensive since the characters' real outline must be considered. See the discussion on slanting a font (\ref{transformations}) for an explanation of this. \precorr \begin{verbatim} int T1_GetStringWidth( int FontID, char *string, int len, long spaceoff, int kerning) \end{verbatim}\index{\verb+T1_GetStringWidth()+}\postcorr \precorr \begin{verbatim} BBox T1_GetStringBBox( int FontID, char *string, int len, long spaceoff, int kerning) \end{verbatim}\index{\verb+T1_GetStringBBox()+}\postcorr These two functions represent the complement to the above functions on the level of strings. All parameters that take influence on the resulting width and bounding box must be given in the argument list. Their meaning is identical to the meaning they have when calling string rastering functions (see \ref{generatingbitmaps}). \precorr \begin{verbatim} METRICSINFO T1_GetMetricsInfo( int FontID, char *string, int len, long spaceoff, int kerning) \end{verbatim}\index{\verb+T1_GetMetricsInfo()+}\postcorr In certain situations bounding box and width of a glyph are required both. In these cases it is more convenient to call \verb+T1_GetMetricsInfo()+ which returns a structure that contains all information. \verb+METRICSINFO+ is defined in \verb+t1lib.h+ as: \begin{verbatim} typedef struct { int width; BBox bbox; int numchars; int *charpos; } METRICSINFO; \end{verbatim} All numbers are to be interpreted in character space units --- they are directly taken from AFM data. \verb+width+ is the glyph's width and \verb+bbox+ its bounding box which in turn is a struct as defined some paragraphs above. \verb+numchars+ is assigned number of characters in string. If the argument \verb+len+ is different from 0, \verb+numchars+ is assigned that value. \verb+charpos+ is a pointer to an integer array of size \verb+numchars+ allocated by \verb+T1_GetMetricsInfo()+. During execution this array is filled step by step with the horizontal escapement in character space units of the respective character relative to the start point of the string glyph which corresponds to 0. \verb+charpos+ remains valid until \verb+T1_GetMetricsInfo()+ is called the next time. The user should not free this memory because this is handled automatically. The terms concerning the bounding box of slanted fonts mentioned under the description of \verb+T1_GetCharBBox()+ apply here as well. The first and the last character of \verb+string+ have to be observed spending high effort. But nevertheless the correct bounding box is returned. \precorr \begin{verbatim} int T1_GetKerning( int FontID, char char1, char char2) \end{verbatim}\index{\verb+T1_GetKerning()+}\postcorr This function returns the amount of kerning for the specified character pair \verb+char1+ and \verb+char2+. If an extension has been specified for the font (see \ref{transformations}), the amount of kerning is automatically corrected using the extension factor. The value returned has to be interpreted in charspace units. If no AFM information is available for the font in question, simply 0 is returned. The same applies if the font is not loaded. The implementation of this function requires that the kerning pairs in the AFM file are sorted in alphabetical order. I am not sure whether this condition is found in the specification of the AFM file format. If this function doesn't work although AFM kerning data is available, this might be the reason. \precorr \begin{verbatim} int T1_QueryLigs( int FontID, char char1, char **successors, char **ligatures) \end{verbatim}\index{\verb+T1_QueryLigs()+}\postcorr This function implements the interface to the ligature information in the AFM data. Ligatures are special character-symbols which are substituted if special pairs, triples or whatever groups of characters appear in a string. For example, ``f{}i'' is replaced with the ligature ``fi''. In this example, the ``i'' is called {\em successor} and the ``fi'' is the associated ligature. \verb+char1+ is the character which has to be checked for ligatures, i.e., the first character of a possible ligature group. \verb+successors+ and \verb+ligatures+ should be addresses of pointers to \verb+char+s. These pointers are modified by the \verb+T1_QueryLigs()+. First, \verb+T1_QueryLigs()+ checks how many ligatures are defined for the character given by \verb+char1+. Assuming this number is $n$, it then defines memory for two arrays of type \verb+char+ with size $n$. These arrays are filled with the indices of the successor-characters and with the indices of the associated ligatures, respectively. The current encoding vector is used for this. The addresses of these two arrays are written to the addresses of the respective pointers \verb+successors+ and \verb+ligatures+. They are thus later available to the user in order to access the memory where the successor-character and ligatures are specified. The value $n$ is returned in order to tell the user how many ligatures were found and to give the user information about the end of the two arrays. If the font is not loaded or AFM data is not available, -1 is returned. Since this may seem to be a little complicated, here is a programming example: \begin{verbatim} char *succ, *lig; int n_lig, i; char char1='f'; /* Get ligature information of character 'f' in font 0: */ n_lig=T1_QueryLig( 0, char1, &suc, &lig); /* print out indices of characters and their ligatures */ for ( i=0; i ligatur: %d\n", char1, succ[i], lig[i]); \end{verbatim} Notice that the arrays where the successor indices and the respective ligature indices are stored are static in \verb+T1_QueryLigs()+. Thus, they may not be freed and moreover they are only valid until the next time \verb+T1_QueryLigs()+ is called. \subsubsection{Character-Encoding Relation} \label{characterencodingrelation}% \precorr \begin{verbatim} char *T1_GetCharName( int FontID, char char1) \end{verbatim}\index{\verb+T1_GetCharName()+}\postcorr This function returns the name of the character indexed by \verb+char1+ according to the current encoding vector. As said above, the memory where the string is stored is static to this function so that the user should not free the returned pointer. If the font is not loaded, NULL is returned. \precorr \begin{verbatim} int T1_GetEncodingIndex( int FontID, char *char1) \end{verbatim}\index{\verb+T1_GetEncodingIndex()+}\postcorr This function is the complement to the above function. It returns the lowest index of the character with the specified name in the current encoding vector as an \verb+int+. If the charactername is not found in the current encoding vector or if the font is not loaded, the value -1 is returned. \precorr \begin{verbatim} int *T1_GetEncodingIndices( int FontID, char *char1) \end{verbatim}\index{\verb+T1_GetEncodingIndices()+}\postcorr This function is an extension of the above function. It is meant for cases where all appearences of \verb+char1+ in the encoding vector are requested. The return value is an integer array whose elements contain the encoding indices where \verb+char1+ appears in increasing order. The first negative entry in this array indicates that no more valid indices will follow. In the most extreme case we can think of (i.e., where the complete encoding vector is occupied by {\em one} character), \verb+T1_GetEncodingIndices()+ will return an array of size 257 where the first 256 elements bear their own index and the 257th element is $-1$. If font \verb+FontID+ is not loaded, this function returns \verb+NULL+ and \verb+T1_errno+ will be set appropriately. If \verb+char1+ was not found in the encoding vector, a valid array is returned but the first element will be $-1$. \precorr \begin{verbatim} char **T1_GetAllCharNames( int FontID) \end{verbatim}\index{\verb+T1_GetAllCharNames()+}\postcorr As described in \ref{encoding}, not all characters of a font need to be encoded. A Type 1 may contain the outlines of an arbitrary number of characters, but only 256 can be encoded---and thus accessed---simultaneously. Since the characternames are inside the encrypted portion of the Type 1 font file, there is no easy way to find out which characters a font defines. \tonelib\ provides \verb+T1_GetAllCharNames()+ for situations where a programmer needs to know what characters are defined in the font file identified by \verb+FontID+. The value returned is a pointer to an array of \verb+char+ pointers which in turn point to the characternames. The array's size is $(n+1)$ where $n$ is the number of defined outlines. The $(n+1$)th pointer is \verb+NULL+ to indicate the end of the array. An application programmer may use these characternames to construct a specialized encoding vector. Here is an example of how to use \verb+T1_GetAllCharNames()+. It prints a list of all defined characternames in font 0. \begin{verbatim} char **ptr; int i; . . . ptr=T1_GetAllCharNames( 0); i=0; while (ptr[i]!=NULL){ printf("Charstring %d = %s\n", i, ptr[i]); i++; } \end{verbatim} The memory for storing the pointers and the charactername strings is static in\\ \verb+T1_GetAllCharNames()+. Thus it remains valid until the function is called the next time. The user should not free this memory or if he does, he should set the pointer to \verb+NULL+ to indicate the memory has already been freed. \precorr \begin{verbatim} int T1_GetNoKernPairs( int FontID) \end{verbatim}\index{\verb+T1_GetNoKernPairs()+}\postcorr This function returns the number of kerning pairs defined for the font identified by \verb+FontID+. The number -1 is returned if an error occured and \verb+T1_errno+ will be set. All positive numbers including 0 should be considered valid return values. \subsubsection{Administrative Information} \label{administrativeinformation}% \precorr \begin{verbatim} int T1_GetNoFonts( void) \end{verbatim}\index{\verb+T1_GetNoFonts()+}\postcorr Usually, this function returns the number of fonts declared in the font database file, i.e., the integer quantity from the first line of the font database file. However, if some new fonts have been created using \verb+T1_CopyFont()+ (see \ref{logicalfonts}) or if some fonts have been added to the database after initialization (see \ref{addingfonts}), these are also taken into account. The number returned by \verb+T1_GetNoFonts()+ minus 1 is thus the largest valid font ID specification. \precorr \begin{verbatim} int T1_CheckForInit( void) \end{verbatim}\index{\verb+T1_CheckForInit()+}\postcorr Use this function in order to check whether \tonelib\ is initialized. It returns $0$ if initialization has already happened and $-1$ otherwise. \precorr \begin{verbatim} int T1_CheckForFontID( int FontID) \end{verbatim}\index{\verb+T1_CheckForFontID()+}\postcorr This functions gives information on the load status of the font associated to \verb+FontID+. It returns $0$ if the font \verb+FontID+ has not yet been loaded, $1$ if it has already been loaded. Finally, a return value of $-1$ indicates that either \verb+FontID+ is an invalid specification or \tonelib\ is not initialized. \precorr \begin{verbatim} char *T1_GetFontFileName( int FontID) \end{verbatim}\index{\verb+T1_GetFontFileName()+}\postcorr This function returns a pointer to the fontfilename identified by \verb+FontID+. In no case, this pointer may be freed since the memory is static to this function. The string also is only valid up to the next call of this function. \precorr \begin{verbatim} char *T1_GetFontFilePath( int FontID) \end{verbatim}\index{\verb+T1_GetFontFilePath()+}\postcorr This function returns a pointer to the fully qualified path of the font file identified by \verb+FontID+. In no case, this pointer may be freed since the memory is static to this function. The string also is only valid up to the next call of this function. \precorr \begin{verbatim} char *T1_GetAFMFilePath( int FontID) \end{verbatim}\index{\verb+T1_GetAFMFilePath()+}\postcorr This function returns a pointer to the fully qualified path of the AFM file of the font identified by \verb+FontID+, as used by \tonelib. In case of an error \verb+NULL+ is returned. It may also happen that there exists no AFM file for the font either because AFM information was generated on the fly at the time the font was loaded, or because AFM processing had been disabled at initialization time. For those cases \verb+T1_errno+ is not set. In no case, the returned pointer may be freed since the memory is static to this function. The string also is only valid up to the next call of this function. \precorr \begin{verbatim} char *T1_GetLibIdent( void) \end{verbatim}\index{\verb+T1_GetLibIdent()+}\postcorr This function returns the identifier string for the version of \tonelib. For example, this could be \verb+0.8-beta+. The string is static in this function and should thus not be freed by the user. \subsection{Transformation of Fonts} \label{transformations}% Transformation of Type 1 fonts is generally accomplished by means of concatenating so-called transformation matrices. For example, rotation is equivalent to concatenation of the standard transformation matrix with a special matrix whose elements are trigonometric functions evaluated at the rotation angle. In the sense of \tonelib, we distinguish between {\em fontlevel transformations} and {\em characterlevel transformations}. \subsubsection{Fontlevel Transformations} \tonelib\ supports three transformations that operate globally on a font's data. After applying such a transformation to a font all characters generated from then on will be rendered according to that transformation. Moreover, these transformed characters are saved in cache for fast future access. This principle is thus meant for transformed fonts which are semantically used as ordinary text fonts. Creating a font Times-Oblique by slanting a Times-Roman would be a typical example. The first fontlevel transformation is called ``extension'' since it extents a font horizontally---makes its characters wider. A font is extended by a call to the function \precorr \begin{verbatim} int T1_ExtendFont( int FontID, double extend) \end{verbatim}\index{\verb+T1_ExtendFont()+}\postcorr A font that is to be extended may not have size dependent data. If size dependent data exists, it must explicitly be removed before applying an extension-factor. This is simply a security mechanism which prevents the user from mixing up extended and non-extended bitmaps. If the font is not loaded or size-dependent data is existent, -1 is returned. Otherwise, the function returns 0. All information on character metrics is automatically adapted to an extension-factor different from 1 (see \ref{common}). Applying an extension-factor to a font is implemented by replacing the current extension-factor---initially 1---with the supplied value. Thus, an extension can be deleted by specifying a factor 1. Moreover, extending a font two times, say, with factor 2, does not yield a font extended by 4. Rather the last specified extension, here 2, is applied. The second type of fontlevel transformation supported by \tonelib\ is {\em slanting}. It is done by a call to the function \precorr \begin{verbatim} int T1_SlantFont( int FontID, double slant) \end{verbatim}\index{\verb+T1_SlantFont()+}\postcorr The slant-factor $s$ tells the rastering algorithm to advance the $x$-coordinate of a given point by the product of $s$ with the $y$-coordinate of that point. Such fonts are sometimes called {\em oblique}. Another interpretation is that we state: $s=\tan(\alpha)$, where $\alpha$ is the well-known italic-angle of the font. Just as above, no size-dependent data may be existent and the font must be loaded. In that case 0 is returned, otherwise -1. As above, the slanting operation is implemented by {\em setting} the slant-factor so that a slant may be reset by means of specifying a slant-factor of 0. There is one thing that makes handling of slanted fonts more difficult than handling of extended fonts. When typesetting strings by concatenating bitmaps, exact information on character metrics is necessary. By slanting a character the character's width is not affected. But the bounding box is. And while extension---which means strictly horizontal scaling independent of the respective y-coordinate---simply leads to an extension of the bounding box, there is no way to compute the bounding box of a slanted character from the bounding box of the respective unslanted character. Here is an example. \begin{itemize} \item Let the character be \verb+\+. When slanting this character with a value of 1, the resulting character will be similar to a vertical line. The bounding box will thus be small in horizontal direction. \item If character is \verb+/+, the resulting slanted character will tend to be more horizontal. Thus the resulting bounding box will be much extended in horizontal direction. \end{itemize} In conclusion we can say that the effect of slanting on the bounding box of a given character depends on the shape of the character itself. Since version 0.3-beta the problem with the bounding box of slanted characters is handled as follows. The character in question is internally rastered at 1000 bp and the bounding box of the resulting ``edgelist'' is examined. But no bitmap is generated for the character, this limits the computational effort. However the difference in time performance between getting a bounding box from a ``simple-shaped'' slanted character like ``i'' and getting a bounding box of a ``complex-shaped'' character like ``Q'' is clearly noticeable. The positioning algorithm for string bitmaps has been slightly improved in \tonelib\ V.\ 0.3-beta so that now exclusively bitmap metrics are used where the bounding boxes are needed. The limitation of slanted fonts appears thus only if a user explicitly requests a bounding box of a character/string in an artificially slanted font. The third and most common type of fontlevel transformation allows arbitrary linear transformations. This is done by a call to the function \precorr \begin{verbatim} int T1_TransformFont( int FontID, T1_TMATRIX *matrix) \end{verbatim}\index{\verb+T1_TransformFont()+} \postcorr The transformation is specified by \verb+matrix+ (as described below). This function acts by setting the font's transformation matrix to the matrix pointed to by \verb+matrix+. As a final consequence of what has been described so far in this section it turns out that \verb+T1_TransformFont()+ overrides whatever slant and extension values might have been set before. Conversely, if \verb+T1_SlantFont()+ or \verb+T1_ExtendFont()+ are applied to a font after a call to \verb+T1_TransformFont()+, the respective values are simply overridden, there will be no concatenation. In the following description of transformation matrices and their usage, we will also describe how to concatenate an arbitrary series of linear transformations. There are also functions for querying the current values of the quantities described above for fontlevel transformations. \precorr \begin{verbatim} double T1_GetExtend( int FontID) \end{verbatim}\index{\verb+T1_GetExtend()+}\postcorr and \precorr \begin{verbatim} double T1_GetSlant( int FontID) \end{verbatim}\index{\verb+T1_GetExtend()+}\postcorr return the current extension and slant values. The function \precorr \begin{verbatim} T1_TMATRIX T1_GetTransform( int FontID) \end{verbatim}\index{\verb+T1_GetTransform()+}\postcorr Returns the current transformation matrix as a structure of type \verb+T1_TMATRIX+ which will be described in detail in the next subsubsection. \subsubsection{Transformation at Rastering Time} This kind of transformation is the most generic one and allows arbitrary transformations. A transformation $(x',y')^T$ of a given location $(x,y)^T$ is given by the following set of linear equations: \begin{eqnarray*} x' & = a_{11} x + a_{21} y \\ y' & = a_{12} x + a_{22} y \end{eqnarray*} Here, the matrix \begin{displaymath} \mathbf{A}= \left( \begin{array}{cc} a_{11} & a_{21} \\ a_{12} & a_{22} \end{array} \right) \end{displaymath} is referred to as the {\em transformation matrix}. In \tonelib\ the following type definition is used for such transformation matrices: \begin{verbatim} typedef struct { double cxx; /* corresponds to a11 */ double cyx; /* corresponds to a21 */ double cxy; /* corresponds to a12 */ double cyy; /* corresponds to a22 */ } T1_TMATRIX; \end{verbatim} Each of the rastering functions expects to get a pointer to an object of type \verb+T1_MATRIX+, or \verb+NULL+ if no transformation is to be applied. If any transformation has been specified, the resulting glyph is never kept in cache memory. Thus, if for some reason caching should be disabled for non-transformed characters, simply a pointer to the unity matrix %$\left( %\begin{array}{cc} %1.0 & 0 \\ %0 & 1.0 %\end{array} %\right)$ could be specified to the rastering function to achieve this. The user has the possibility of either allocating and creating the transformation matrices by himself or to use predefined functions of \tonelib. There are 8 different functions for generating transformed characters. Figure \ref{figure:transformations} gives an example of each function using the character ``g''. \begin{figure}[t] \hfill \includegraphics[scale=0.5]{mirrorh} \hfill \includegraphics[scale=0.5]{mirrorv} \hfill \includegraphics[scale=0.5]{shearh} \hfill\break \noindent\vrule width 0pt\hfill\verb+T1_MirrorHMatrix()+\hfill \verb+T1_MirrorVMatrix()+\hfill \verb+T1_ShearHMatrix()+\hfill\break % line 2 \vskip0.5cm \hfill \includegraphics[scale=0.5]{shearv} \hfill \includegraphics[scale=0.5]{extenth} \hfill \includegraphics[scale=0.5]{extentv} \hfill\break \noindent\vrule width 0pt\hfill\verb+T1_ShearVMatrix()+\hfill \verb+T1_ExtendHMatrix()+\hfill \verb+T1_ExtendVMatrix()+\hfill\break % line 3 \vskip0.5cm \hfill \includegraphics[scale=0.5]{rotate} \hfill \includegraphics[scale=0.5]{arbitrary} \hfill\break \noindent\vrule width 0pt\hfill\verb+T1_RotateMatrix()+\hfill \verb+T1_TransformMatrix()+\hfill\break \vskip3mm \hrule\vskip3mm\small \caption{\label{figure:transformations}Typical examples for the predefined functions for generating transformation matrices in \tonelib, applied to the character ``g''.} \end{figure} Before describing each particular function we should discuss the first argument because this is common to all matrix transformation functions. This first argument, in case it is not \verb+NULL+, is expected to be a pointer to an already existent valid \verb+T1_TMATRIX+ object. The transformation to be applied is then done by multiplying the existent matrix with the new matrix. In other words, the existent matrix is replaced by the concatenation of the two matrices. If a \verb+NULL+ is specified as argument, the new matrix is allocated by the respective function and then set to the concatenation of the unity matrix with the desired transformation. Thus, to remove a matrix from memory, the pointer simply has to be given to \verb+free()+, no matter how many transformations have been applied to this matrix before. We should now describe the functions for generating transformation matrices: \precorr \begin{verbatim} T1_TMATRIX *T1_MirrorHMatrix( T1_TMATRIX *matrix) \end{verbatim}\index{\verb+T1_MirrorHMatrix()+}\postcorr and \precorr \begin{verbatim} T1_TMATRIX *T1_MirrorVMatrix( T1_TMATRIX *matrix) \end{verbatim}\index{\verb+T1_MirrorVMatrix()+}\postcorr simply change the sign of the matrix coefficients $a_{11}$ and $a_{22}$ respectively. This has the optical effect of mirroring the character at the horizontal line $y=0$ or at the vertical line $x=0$, respectively. These functions represent a specialized form of \precorr \begin{verbatim} T1_TMATRIX *T1_ExtendHMatrix( T1_TMATRIX *matrix, float extent) \end{verbatim}\index{\verb+T1_ExtendHMatrix()+}\postcorr and \precorr \begin{verbatim} T1_TMATRIX *T1_ExtendVMatrix( T1_TMATRIX *matrix, float extent) \end{verbatim}\index{\verb+T1_ExtendVMatrix()+}\postcorr These functions allow arbitrary scaling in the respective coordinate direction. Specifying \\ \verb+extent=-1+ exactly yields mirroring at the corresponding axis. Furthermore, there are two transformations where one coordinate depends on itself and on the other coordinate. This is called shearing, slanting or also obliqueing. It is possible in both directions using the functions \precorr \begin{verbatim} T1_TMATRIX *T1_ShearHMatrix( T1_TMATRIX *matrix, float shear) \end{verbatim}\index{\verb+T1_ShearHMatrix()+}\postcorr and \precorr \begin{verbatim} T1_TMATRIX *T1_ShearVMatrix( T1_TMATRIX *matrix, float shear) \end{verbatim}\index{\verb+T1_ShearVMatrix()+}\postcorr In case of horizontal shearing, the factor \verb+shear+ is equal to $\tan(\alpha)$, where $\alpha$ may be interpreted as the italic angle. It is measured from the positive vertical axis in mathematical negative direction. Correspondingly, for vertical shearing \verb+shear+ equals $\tan(\beta)$, where $\beta$ is the angle measured from the horizontal axis in mathematically positive direction. Rotation of glyphs is achieved using \precorr \begin{verbatim} T1_TMATRIX *T1_RotateMatrix( T1_TMATRIX *matrix, float angle) \end{verbatim}\index{\verb+T1_RotateMatrix()+}\postcorr This function evaluates the trigonometric functions at the value of \verb+angle+ and concatenates the transformation matrix with \begin{displaymath} \left( \begin{array}{cc} \cos(\alpha) & -\sin(\alpha) \\ \sin(\alpha) & \cos(\alpha) \end{array} \right) \end{displaymath} $\alpha$ is expected to be specified in degrees. It is measured according standard mathematical conventions. There is one more function which allows to set all matrix coefficients explicitly. It gives thus complete control over the transformation. This might be necessary to typeset text in a circle, for example. The syntax of this function is \precorr \begin{verbatim} T1_TMATRIX *T1_TransformMatrix( T1_TMATRIX *matrix, float cxx, float cyx, float cxy, float cyy) \end{verbatim}\index{\verb+T1_TransformMatrix()+}\postcorr \subsubsection{{\tt t1lib} and PostScript: Notes on Transformation Matrices} In order to avoid confusion about transformation matrices, we should briefly discuss the differences between \tonelib- and PostScript transformation matrices. In \tonelib-nomenclature a coordinate description is assumed to be represented by a column vector $(x,y)^T$. In contrast, PostScript assumes a coordinate to be represented by a row vector $(x,y)$. This leads to an exchanged meaning of the second and third matrix element between \tonelib\ and PostScript. From the mathematical point of view this is caused by matrix transposition. To make this clear, let me quote the matrix \begin{displaymath} \mathbf{A}_{\mbox{\footnotesize PostScript}}= \left( \begin{array}{ccc} a & b & 0\\ c & d & 0\\ t_x & t_y & 1 \end{array} \right) \end{displaymath} from the PostScript Language Reference Manual (Adobe, Red Book). If we forget about translation which in this sense is not implemented by \tonelib, we only have to consider the top left submatrix consisting of $a$, $b$, $c$ and $d$. The \tonelib-equivalent to this matrix would be written as \begin{displaymath} \mathbf{A}_{\mbox{\tt\footnotesize t1lib}}= \left( \begin{array}{cc} a & c \\ b & d \\ \end{array} \right) \end{displaymath} I.e., the meaning of $b$ and $c$ is exchanged. Notice that font matrices as found in Type 1 font files have to be interpreted according to the PostScript notation. But a user should never come close to something other than the \tonelib\ transformation matrices \subsection{Stroking of Character Outlines} \label{stroking}% Most available Type 1 fonts internally specify the numeric value \verb+PaintType+ as $0$. This indicates that the mathematical outline definitions of the characters consist of paths that represent the left and right---or inner and outer---borders of the character area to be filled with ink. In particular, this means that every subpath of a character definition must be closed. When filling characters, the curves that describe the outline are infinitely thin and the area between paths is of interest. By contrast, there are fonts that specify \verb+PaintType+ as $1$. These are also known as {\em stroked fonts}. Basically, their characters' shapes are generated by travelling along the mathematically thin defining curves using a pen with some finite width. The penwidth used here usually is specified in the font itself by means of the quantity \verb+StrokeWidth+. Using a somewhat unusual implementation, \tonelib\ can \begin{itemize} \item image stroked fonts with \verb+PaintType+ 1, \item stroke fonts that have \verb+PaintType+ 0, \item deal with variable strokewidths for both paint types. \end{itemize} In particular at low resolutions and when using large penwidths, the results of stroking may fall short of the quality of other general graphics tools like e.g.~native PostScript interpreters. Also hinting generally is disabled when creating stroked character outlines. For the interested reader, the implementation of stroking is outlined in \ref{strokingimplementation} (page~\pageref{strokingimplementation}). The process of stroking in \tonelib\ is treated similar to the process of transformation. Therefore, firstly, a font can be generally switched to be a stroked font. This is achieved using \precorr \begin{verbatim} int T1_StrokeFont( int FontID, int dostroke) \end{verbatim}\index{\verb+T1_StrokeFont()+}\postcorr Here, \verb+FontID+ identifies the font to be switched. The parameter \verb+dostroke+ determines the future rastering behavior. If it equals 0, the font's characters will be filled and for any other value the characters will be stroked. The function returns 0 in case of success. \verb+T1_StrokeFont()+ requires the font \verb+FontID+ to be loaded. If the font is not loaded \verb+T1_errno+ will be set appropriately and the function returns -1. After switching a font to {\em stroked}, its characters are cached as usual. It is therefore important that, at the time where \verb+T1_StrokeFont()+ is called, no size-dependent data does exist. If this condition is violated, the function will fail too and set \verb+T1_errno+ to \verb+T1ERR_OP_NOT_PERMITTED+. The second method to control the rasterizer mode for the font \verb+FontID+ is to use the function pair \precorr \begin{verbatim} int T1_SetStrokeFlag( int FontID) \end{verbatim}\index{\verb+T1_SetStrokeFlag()+}\postcorr and \precorr \begin{verbatim} int T1_ClearStrokeFlag( int FontID) \end{verbatim}\index{\verb+T1_ClearStrokeFlag()+}\postcorr for enabling and disabling stroking, respectively. These two functions return 0 on successful completion and -1 in case of a failure. They can only fail if \verb+FontID+ is not valid, in which case \verb+T1_errno+ is set to \verb+T1ERR_INVALID_FONTID+. Using these functions, switching the stroking is hence possible at any time. The netto effect is that caching will be disabled if the actually selected rasterizer mode does not match the one of the cached characters. The performance then will degrade for the rasterizer mode that is not the base mode of the font in question. If stroked characters and filled characters are required for one particular font while preserving good performance, using logical fonts is the tool of choice (see Sec.~\ref{logicalfonts}, page~\pageref{logicalfonts}). The currently active rasterizer mode for the font \verb+FontID+ can also be queried. This is done using \precorr \begin{verbatim} int T1_GetStrokeMode( int FontID) \end{verbatim}\index{\verb+T1_GetStrokeMode()+}\postcorr If \verb+FontID+ is not valid, $-1$ is returned and \verb+T1_errno+ is set to \verb+T1ERR_INVALID_FONTID+. In any other case, the following values may be returned: \begin{itemize} \item \verb+0+: The rasterizer mode is {\em Fill} and filled characters are cached. For stroked fonts with a \verb+PaintType+ of $1$, of course, the characters are stroked and these stroked characters are cached anyhow. \item \verb+1+: Stroking is enabled, while filled characters are cached. Each rasterization request is performed on the fly, as for nontrivial transformations. \item \verb+2+: Filling is enabled but stroked characters are cached. Rasterization again is performed on the fly. \item \verb+3+: Stroking is enabled and stroked characters are cached. \end{itemize} The width of the virtual pen used to trace the character outlines can also be adjusted. The function \precorr \begin{verbatim} int T1_SetStrokeWidth( int FontID, float strokewidth) \end{verbatim}\index{\verb+T1_SetStrokeWidth()+}\postcorr sets up \verb+strokewidth+ as the pen width used to stroke characters from font \verb+FontID+. It is interpreted in charspace units and hence directly comparable to the \verb+StrokeWidth+ parameter of stroked fonts. If this function succeeds, $0$ is returned. The function call might also be unsuccessful, in which case $-1$ is returned. The value of \verb+T1_errno+ then gives a hint to the reason of the failure. If set to \verb+T1ERR_INVALID_FONTID+, the font was not loaded. The value \verb+T1ERR_INVALID_PARAMETER+ indicates that a negative strokewidths has been specified. Finally, \verb+T1ERR_OP_NOT_PERMITTED+ may appear if stroked characters are cached for the font in question, size dependent data exists, and the requested strokewidth did not equal the one used at the time where the cache data initially has been built. Allowing to setup an arbitrary strokewidth under the latter circumstances might fillup the cache for one font with characters rasterized using inconsistent strokewidths, which has to be avoided. From this discussion it becomes suggesting not to cache stroked character at all, if stroking should be done using variable strokewidths. The pen width for a given font \verb+FontID+ may be queried at any time using \precorr \begin{verbatim} float T1_GetStrokeWidth( int FontID) \end{verbatim}\index{\verb+T1_GetStrokeWidth()+}\postcorr If the value $0.0$ is returned, this either indicates that the characters are filled or that the font in question is not loaded. Then, \verb+T1_errno+ is also set to \verb+T1ERR_INVALID_FONTID+. \subsection{Antialiasing} \label{antialiasing}% \subsubsection{General Description} When fonts are displayed on screen at low sizes, the shapes of characters often get damaged because of rounding errors---a pixel can generally present two states: painted or non-painted. But the human eye can be fooled in a way that it ``thinks'' sub-pixel accuracy is given on the screen. This is done by considering which pixels are filled with ink to what degree and giving the physical pixel an appropriate shade of gray. For example, a pixel whose area would be covered 50\% would get a 50\% gray shade. This technique is called {\em antialiasing}. There are several ways to implement antialiasing. \tonelib\ implements antialiasing by internally generating a bitmap larger than needed and then subsampling. Depending on the subsampling factor which may be 2 or 4, this principle yields glyphs with 5 or 17 shades of gray including black and white. There are three functions for generating antialiased glyphs: \precorr \begin{verbatim} GLYPH *T1_AASetChar( int FontID, char charcode, float size, T1_TMATRIX *transform) \end{verbatim}\index{\verb+T1_AASetChar()+}\postcorr \precorr \begin{verbatim} GLYPH *T1_AASetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform) \end{verbatim}\index{\verb+T1_AASetString()+}\postcorr \precorr \begin{verbatim} GLYPH* T1_AASetRect( int FontID, float size, float width, float height, T1_TMATRIX *transform) \end{verbatim}\index{\verb+T1_AASetRect()+}\postcorr Note the ``\verb+AA+'' in the functions names which stand for \underline{A}nti\underline{A}liasing. The usage is identical to the usage of the functions \verb+T1_SetChar()+, \verb+T1_SetString()+ and \verb+T1_SetRect()+. So see \ref{generatingbitmaps} for an explanation of the arguments and their interpretation. When an antialiased glyph is requested, the supplied \verb+size+-value is multiplied by the current subsampling factor. For now, let us assume it is 2. Then the respective function for generating non-antialiased glyphs is called with all other arguments unchanged. The result is a bitmap twice as high and twice as wide as the user requested. Now, a $2\times2$ mask is moved over this bitmap and the number of painted pixels in this mask is considered at each place. According to the number of painted pixels one of 5 different gray shades is assigned to the resulting pixel. Since the mask is moved with an increment of 2 pixels in horizontal and vertical direction, the bitmap is at the same time subsampled by 2. Thus, the resulting bitmap is just of the size the user requested and its pixels each contain one of 5 gray shades. Conceptually, the same applies for subsampling with 4. In this case the mask is of size $4\times4$ and there will be 17 distinct gray shades including black and white. The computational effort is considerably larger so that 4 $\times$ subsampling should only be used for very small sizes. When moving the mask over double-sized bitmap it is aligned properly with respect to the characters' baseline (zero height) rather than with the characters' top or bottom line. This principle ensures, that the most important visual guideline in running text, the baseline, is represented in a consistent manor. This is especially important if one is using a serif-font. Thanks to Raph Levien, the algorithm described above in a verbose manor has been replaced by a much faster lookup-algorithm in \tonelib\ V.\ 0.4-beta. \subsubsection{Setting Operating Parameters} Applications can use both $2\times$ and $4\times$ antialiasing arbitrary mixed. Switching between the two modes is achieved using \precorr \begin{verbatim} int T1_AASetLevel( int level) \end{verbatim}\index{\verb+T1_AASetLevel()+}\postcorr The argument \verb+level+ should be either \verb+T1_AA_LOW+ ($=2$) or \verb+T1_AA_HIGH+ ($=4$). Any other values are ignored and \verb+T1_errno+ is set appropriately. This function is to be called after initialization. The default value after initialization is \verb+T1_AA_LOW+. The current value can also be queried by issuing a call to \precorr \begin{verbatim} int T1_AAGetLevel( void) \end{verbatim}\index{\verb+T1_AASetLevel()+}\postcorr The returned value is current level. Switching between the two antialiasing modes should be quite fast since apart from a little error checking essentially only one simple variable is set. There is one more value that may be specified for \verb+level+, namely \verb+T1_AA_NONE+. \verb+T1_AA_NONE+ is identical to 1 which means that no subsampling at all is done. But the resulting glyph, having only fore- and background colors is returned as a bytemap instead of as a bitmap. This is intended for situtations where an antialiased glyph should be concatenated with a (possibly large) non-antialiased glyph using the function \verb+T1_ConcatGlyphs()+. In that case, the depths of the two glyphs have to be identical. There is probably not much more sense in setting \verb+level+ to \verb+T1_AA_NONE+. As described before, the result of the \verb+T1_AASet..()+ functions is strictly spoken no longer a bitmap since more than one bit is used to represent one pixel. The function \precorr \begin{verbatim} int T1_AASetBitsPerPixel( int bpp) \end{verbatim}\index{\verb+T1_AASetBitsPerPixel()+}\postcorr allows the user to specify how many bits should be used to represent one pixel. Allowed values for \verb+bpp+ are 8, 16, 24 and 32. However, if 24 is specified, internally 32 will be used since the pixel are then addressed as objects of type \verb+long+. Antialiased glyphs may grow quite large, especially when using \verb+bpp+ = 32. The value of \verb+bpp+ is written into the member \verb+bpp+ of the \verb+glyph+-structure (see \ref{generatingbitmaps} on page \pageref{generatingbitmaps}). That way a user can check whether a glyph is antialiased or not. It is possible to work with antialiased and non-antialiased glyphs at the same time. It is also possible to directly query the value of bits per pixel by using \precorr \begin{verbatim} int T1_AAGetBitsPerPixel( void) \end{verbatim}\index{\verb+T1_AAGetBitsPerPixel()+}\postcorr The value returned is the number of bits per pixel used. In order to make the handling of antialiased glyphs as flexible as possible, the values to be written into the pixels for different gray values may (and must) be explicitly specified. For low level antialiasing this is done by calling the function \precorr \begin{verbatim} int T1_AASetGrayValues( unsigned long white, unsigned long gray75, unsigned long gray50, unsigned long gray25, unsigned long black) \end{verbatim}\index{\verb+T1_AASetGrayValues()+}\postcorr For lower \verb+bpp+ values only the lower bits are used. For high level antialiasing this kind of graylevel specification is not economical since 17 arguments would have to be specified. Instead, another function is used which expects a pointer an array of \verb+unsigned long+'s: \precorr \begin{verbatim} int T1_AAHSetGrayValues( unsigned long *grayvals) \end{verbatim}\index{\verb+T1_AAHSetGrayValues()+}\postcorr The array \verb+grayvals+ points to must contain 17 entries. Element 0 is expected to specify the background color's pixel value and element 16 represents the foreground color. Calling one of these two functions involves also a new setup of the lookup tables. It should thus only be done if some color value really has changed. In case the antialiasing level is set to \verb+T1_AA_NONE+ as described above, the function \precorr \begin{verbatim} int T1_AANSetGrayValues( unsigned long bg, unsigned long fg) \end{verbatim}\index{\verb+T1_AANSetGrayValues()+}\postcorr must be used to set foreground and background color. In conclusion, it turns out that each antialiasing level has its own lookup tables which have to be initialized as soon as either foreground color, background color or both have changed. Each of the three graylevel sets described above can also be queried by the user. This is done using one of the functions \precorr \begin{verbatim} int T1_AAGetGrayValues( long *pgrayvals) \end{verbatim}\index{\verb+T1_AAGetGrayValues()+}\postcorr \precorr \begin{verbatim} int T1_AAHGetGrayValues( long *pgrayvals) \end{verbatim}\index{\verb+T1_AAHGetGrayValues()+}\postcorr \precorr \begin{verbatim} int T1_AANGetGrayValues( long *pgrayvals) \end{verbatim}\index{\verb+T1_AANGetGrayValues()+}\postcorr Here, \verb+pgrayvals+ is the start address of an array of \verb+long+-values to which the respective grayvalues are written. This memory must thus be supplied by the user. These functions will write 5 (\verb+T1_AAGetGrayValues+), 17 (\verb+T1_AAHGetGrayValues+) and 2 (\verb+T1_AANGetGrayValues+) respectively to the location given by \verb+pgrayvals+. These functions are to be called after initialization. If something goes wrong -1 is returned and \verb+T1_errno+ will be set accordingly. Otherwise 0 is returned. \subsubsection{Smart Antialiasing} \label{smartantialiasing}% Antialiasing improves legibility for small sizes but is not that much useful for large sizes. To make a compromise between computation time, system resources and optical appearance it might be advantageous to use \verb+T1_AA_HIGH+ for small sizes, \verb+T1_AA_LOW+ for medium sizes and \verb+T1_AA_NONE+ for large sizes. Of course, for large sizes the non-antialiasing functions could be used which still need less resources. In order to free the user from having to switch the antialiasing level explicitly, \tonelib\ can be told to do this switching automatically, depending on the size requested. This is called {\em Smart Antialiasing}. It is disabled by default and can be toggled by a call to \precorr \begin{verbatim} int T1_AASetSmartMode( int smart) \end{verbatim}\index{\verb+T1_AASetSmartMode()+}\postcorr The quantity \verb+smart+ should be either be \verb+T1_YES+ (which corresponds to 1) or \verb+T1_NO+ (which corresponds to 0. Notice that the current antialiasing level as set by \verb+T1_AASetLevel()+ is not affected by this. After having switched off smart antialiasing the former antialiasing level is restored. When smart antialiasing is active still has to take care for setting the lookup tables after a color change has happened. The numerical limits of the requested size at which \tonelib\ will switch between the different antialiasing levels may be specified using \precorr \begin{verbatim} int T1_AASetSmartLimits( float limit1, float limit2) \end{verbatim}\index{\verb+T1_AASetSmartLimits()+}\postcorr Here, \verb+limit1+ is the value of size at which \tonelib\ switches from \verb+T1_AA_HIGH+ to \verb+T1_AA_LOW+ and \verb+limit2+ is the value of size at which \tonelib\ switches from \verb+T1_AA_LOW+ to \verb+T1_AA_NONE+. The default values are 20.0 for \verb+limit1+ and 60.0 for \verb+limit2+. This means for sizes smaller than 20.0 \verb+T1_AA_HIGH+ will be used and for sizes equal to or greater than 60.0 \verb+T1_AA_NONE+ will be used. The intermediate range is covered by \verb+T1_AA_LOW+. These values are suitable for applications that display on screen when the device resolution has been left at the default value of 72 dpi. \subsubsection{Caching of Antialiased Character Glyphs} \label{aacaching}% Generally, antialiased glyphs are not cached in \tonelib\ because this involves several problems which are hardly to solve. One main problem is shown in figure \ref{figure:subpixelpositioning}. \begin{figure} \centerline{\includegraphics[scale=10]{Tee}}\relax \vskip3mm \hrule\vskip3mm\small \caption{\label{figure:subpixelpositioning} The string ``Tee'' (which is the German word for ``tea'') rastered at 13~bp, using $4\times$ antialiasing. Notice the different representations of the character ``e''.} \end{figure} Obviously the character ``e'' appears twice in different representations. This is intentional and is referred to as sub pixel positioning. In the left ``e'' the letter is perceived somewhat more to the left with respect to the pixels that represent the character. Conversely, the second ``e'' seems to lie somewhat more to the right within the pixels. The advantage of this technique is that characters can be shifted by some fractional amount of a pixel at low sizes.\footnote{The opinions whether this and antialiasing in general is of advantage for readability vary, so please consider this the opinion of the author. } On the other hand the problem is introduced that each character can have more than one representation in graylevels, depending on how much subpixel shift is needed. One further problem caused by subsampling is that certain information is irreversibly lost in the graylevel representation. For example, if you have a graylevel pixel of intensity 50\% (whatever the real color is), then, in case of $2\times$ antialiasing, you will know that in the $2\times 2$ input bitmap two pixels had been set to foreground, but you would not know {\em which} two these had been. But this information is important for concatenating and blitting of antialiased bitmaps: it may well happen that two pixels with 50\% gray that lie over each other had to produce an output pixel of 50\%, 75\% or 100\% gray (where 100\% gray means full foreground intensity). To avoid these problems, \tonelib\ generally does not cache antialiased glyphs. Instead, it works on true bitmaps which are then subsampled at the last possible stage to an antialiased glyph. Applications that do not use anything more than the functions that yield char bitmaps or bytemaps, could profit from caching of antialiased characters. Such applications could specify \verb+T1_AA_CACHING+ as an additional ingredient to the \verb+log+ argument of the function \verb+T1_InitLib()+ which initializes \tonelib. This is done by OR'ing the value of \verb+log+ with \verb+T1_AA_CACHING+ as described in \ref{initialization}. If this flag had been specified at initialization time, \verb+T1_AASetChar()+ will cache the bytemaps it has generated and will take them from cache in future requests. When caching antialiased glyphs, each size gets up to four distinct cache areas, one for bitmaps and one for $1\times$, $2\times$ and $4\times$ subsampled bytemaps each. As soon as a string-generating function is called these cached antialiased glyphs cannot be used for the reasons discussed before. The developer of an application should thus carefully think about whether a possibly marginal performance gain is really worth this much higher effort. If in doubt, simply check it out. Applications like \verb+xdvi+ which place isolated character glyphs on a sheet could use this feature, however, and profit from it. \subsection{Interface to Outlines} \label{outlines}% Although \tonelib\ is meant for generating bitmaps from Type 1 outline fonts, there is a set of functions for accessing outline data. There are several reasons for this. Firstly, outline descriptions are, within the given arithmetic constraints, mathematically exact. Secondly and related to the previous point, in certain cases where exact subpixel positioning is needed, the functionality of grid-fitting before rasterization is needed. This can only be done accurately based on outlines. To illustrate this, consider figure \ref{figure:whyoutlines}. % -parameters for this figure: size 50.0 % angle 35 % arg: --checkConcat[Glyphs|Outlines] % \begin{figure}[t] \hfill a) \includegraphics[scale=1.0]{concatglyphs} \hfill b) \includegraphics[scale=1.0]{concatoutlines} \hfill\break \vskip3mm \hrule\vskip3mm\small \caption{\label{figure:whyoutlines}Two concatenated bitmaps, a) concatenation done based on bitmaps by blitting and b) based on outlines and then filled.} \end{figure} When looking at the concatenated glyph a), it appears that the underline rule has a small step where the two words touch.\footnote{Depending on the resolution and quality of the hardcopy you are reading, the effect might be hardly or not all noticeable.} The reason is, that the second part of the glyph had been rastered with respect to a pixel coordinate of exactly $(0,0)$. Since the start of the second word in the resulting glyph does not exactly fall on an integer pixel location, bitmap blitting causes an artifact in the visual line of the underlining rule. Strings rotated at angles that are not multiples of $90^\circ$ are prone to produce such effects. In contrast the concatenated glyph b) does not show such effects because both partial glyphs are placed mathematically exact and then filled. Thirdly, if the outline of a character is available, it can be used for whatever. For example, the outline can be filled by another rasterizer, it can by altered, it can be stroked and so on. \tonelib\ makes outlines as they are internally used by the rasterizer available. We will discuss how to interprete and access outlines in the remainder of this section. \subsubsection{Outline Format} \label{outlineformat}% Before going into implementation details the general structure of a Type 1 outline is described. We will consider the simple fictive character whose outline is shown in figure \ref{figure:generaloutline}. \begin{figure}[t] \hfill \includegraphics[scale=1.0]{outlines} \hfill\break \vskip3mm \hrule\vskip3mm\small \caption{\label{figure:generaloutline}The outline of a fictive character.} \end{figure} We assume that scaling, grid fitting and hinting has already been carried out. Then, the outline is given by set of points $P_i$ and segments connecting those points. There are: \begin{itemize} \item Move-segments (type = \verb+T1_PATHTYPE_MOVE+): These are straight segments which cause the current position to be displaced by some offset. Since the starting point of a segment is always implicitly the current point, only one argument is needed, $P_{dest}$, the destination point. In the figure, $P_1$--$P_2$ and $P_{2}$--$P_{12}$ are Move-segments. In this simple case they displace from the characters origin to some starting point of the outline and from the ending point of the outline to the point where the next character would have to be placed (the horizontal escapement). \item Line-segments (type = \verb+T1_PATHTYPE_LINE+): These are part of the path to be filled later. In analogy to the Move-segment, one argument, $P_{dest}$, is required for Line-segments. In the figure, $P_{11}$--$P_2$ is a Line-segment. \item Bezier-segments (type = \verb+T1_PATHTYPE_BEZIER+): These are curve segments. Their shape is defined by a starting point (always the current point here), an ending point $P_{dest}$ and two control points $P_B$, $P_C$. These four points are the parameters of what is called a third order Bezier spline.\footnote{The mathematical defining equation represents a special case of a Bernstein polynom which was exploited by {\sc Bezier} in the context of solid modeling. The curve especially has the property that it may be approximated efficiently by straight line segments in a few iterations.} The resulting curve has the following properties: \begin{itemize} \item It starts at the first point $P_{current}$. \item It ends at the fourth point $P_{dest}$. \item The line that goes through the points $P_{current}$ and $P_{B}$ is the tangent to the curve from the right side at the starting point $P_{current}$. \item In analogy, the line that goes through the points $P_{C}$ and $P_{dest}$ is the tangent to the curve from the left side at the ending point $P_{dest}$. \item The resulting curve will be enclosed completely by the convex area that is defined by connecting the definition points with straight line segments. \end{itemize} Our fictive character outline in figure \ref{figure:generaloutline} has three Bezier-segments, $P_{2}$--$P_{3}$--$P_{4}$--$P_{5}$, $P_{5}$--$P_{6}$--$P_{7}$--$P_{8}$ and $P_{8}$--$P_{9}$--$P_{10}$--$P_{11}$. Notice that it is easily possible to achieve a smooth tangent transition from one curve-segment to the next by choosing the involved points from a straight line. \end{itemize} For Type 1 fonts in general, the following rules for interpreting coordinate specifications hold: \begin{itemize} \item All point specifications are relative to the {\em current point}. \item For Bezier-segments, $P_{B}$, $P_{C}$ and $P_{dest}$ all are relative to $P_{current}$. \item Initially, i.e. when a character outline is started, the current point is at the origin $(0,0)$ of the character. \end{itemize} Additionally, for this special rasterizer implementation, the following terms apply: \begin{itemize} \item The vertical coordinate is---in contrast to PostScript---inverted, i.e., the $y$-axis points down. \item Once hinted and gridfitted, the outline point coordinates are described in {\em fractional pixels}. A ``fractpel'' is of type \verb+long+ and describes the location in $2^{16}$th fractions of a pixel. To convert from pixel to fractional pixel and vice versa, the macros \verb+T1_TOPATHPOINT(p)+\index{\verb+T1_TOPATHPOINT()+} and \verb+T1_NEARESTPOINT(fp)+\index{\verb+T1_NEARESTPOINT()+} are provided. \end{itemize} Before describing the functions for retrieving outlines the format in which outlines are presented in C will be described. A point specification is done in the following structure: \begin{verbatim} typedef struct { T1_int32 x; T1_int32 y; } T1_PATHPOINT; \end{verbatim} \verb+x+ and \verb+y+ are fractional pixels as described above. An outline is represented by a linked list of structures which describe path segments of the type described above. Line- and Move-segments are described by the following structure: \begin{verbatim} typedef struct pathsegment { char type; unsigned char flag; short references; unsigned char size; unsigned char context; struct pathsegment *link; struct pathsegment *last; T1_PATHPOINT dest; } T1_PATHSEGMENT; \end{verbatim} \verb+type+ is either \verb+T1_PATHTYPE_MOVE+ or \verb+T1_PATHTYPE_LINE+. \verb+flag+, \verb+references+, \verb+size+ and \verb+context+ are internally used by the rasterizer. \verb+link+ is a pointer to the next segment structure or \verb+NULL+ in case it is the last structure in the list. Finally, the \verb+last+-entry is a pointer to the last structure in the linked list. \verb+last+ is only set in the first segment and is reset to \verb+NULL+ in the remaining segment structures. A Bezier-segment is described by the following structure: \begin{verbatim} typedef struct bezierpathsegment { char type; unsigned char flag; short references; unsigned char size; unsigned char context; T1_PATHSEGMENT *link; T1_PATHSEGMENT *last; T1_PATHPOINT dest; T1_PATHPOINT B; T1_PATHPOINT C; } T1_BEZIERSEGMENT; \end{verbatim} Obviously, the format is identical to that for straight path segments, extended by the entries \verb+B+ and \verb+C+ which specify the control points as described earlier in this subsection. The common return type for the outline retrieving functions is a pointer to \verb+T1_OUTLINE+, which is in fact identical to \verb+T1_PATHSEGMENT+. This purely for convention. Although it is quite unlikely, an outline might start with a Bezier-segment. To access Bezier-segment elements, a cast must be used. \subsubsection{Using Outlines} \label{usingoutlines}% \tonelib\ provides three functions for retrieving outlines. The first is \precorr \begin{verbatim} T1_OUTLINE *T1_GetCharOutline( int FontID, char charcode, float size, T1_TMATRIX *transform) \end{verbatim}\index{\verb+T1_GetCharOutline()+}\postcorr The meaning of the arguments is as in the \verb+T1_SetChar()+-function. Notice that the size specification is also required here. Outlines are, by their nature in Type~1, generally defined in a $1000\times 1000$ grid and then scaled down by the fontmatrix to 1 bp. The space is known as the charspace. The reason for specifying a size at this place, instead of scaling the outline later, is, that hinting is performed according to the scaled outline. The returned outline is then hinted for the given size. If necessary, it may still be scaled later. The outline for a complete string can be retrieved by \precorr \begin{verbatim} T1_OUTLINE *T1_GetStringOutline( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform) \end{verbatim}\index{\verb+T1_GetStringOutline()+}\postcorr The meaning of the arguments is as in \verb+T1_SetString()+. Finally the ``outline'' for a displacement is available by the function \precorr \begin{verbatim} T1_OUTLINE *T1_GetMoveOutline( int FontID, int deltax, int deltay, int modflag, float size, T1_TMATRIX *transform) \end{verbatim}\index{\verb+T1_GetMoveOutline()+}\postcorr This function is intended to be used for concatenation of outlines. It needs all the arguments because some quantities which are given on the font level are required for constructing the outline. \verb+deltax+ and \verb+deltay+ are the horizontal and vertical displacement measured in charspace units. From the \verb+modflag+-argument, especially the underlining parameters are evaluated. Although $x$- and $y$-displacement may be specified, the resulting outline is still subject to scaling with \verb+size+ and transformation according to \verb+transform+. Arbitrary outlines may be concatenated by using the function \precorr \begin{verbatim} T1_OUTLINE *T1_ConcatOutlines( T1_OUTLINE *path1, T1_OUTLINE *path2) \end{verbatim}\index{\verb+T1_ConcatOutlines()+}\postcorr Notice that this concatenation is done with high precision so that we can expect that visual artefacts are reduced to a minimum (remember figure \ref{figure:whyoutlines}). Scaling of outlines is done by the function \precorr \begin{verbatim} T1_OUTLINE *T1_ScaleOutline( T1_OUTLINE *path, float scale) \end{verbatim}\index{\verb+T1_ScaleOutline()+}\postcorr \verb+T1_ScaleOutline+ does nothing more than linearly scaling the coordinate data with \verb+scale+ and storing the result in fractional pixels. No care is taken for hinting (see above). An outline may be duplicated using the function \precorr \begin{verbatim} T1_OUTLINE *T1_CopyOutline( T1_OUTLINE *path) \end{verbatim}\index{\verb+T1_CopyOutline()+}\postcorr This is a direct entrypoint into the rasterizer. It works by allocating and duplicating each segment of \verb+path+. This function may be useful if one wants to do several things with one outline because the process of filling an outline also consumes that outline. An outline that that a user decides not to fill can be destroyed by the function \precorr \begin{verbatim} void T1_FreeOutline( T1_OUTLINE *path) \end{verbatim}\index{\verb+T1_FreeOutline()+}\postcorr It iterates through the segment list and frees each segment. This must not be done after filling an outline because the filling process consumes the outline! Finally, there are two functions that produce glyphs from outlines, namely \precorr \begin{verbatim} GLYPH *T1_FillOutline( T1_OUTLINE *path, int modflag) \end{verbatim}\index{\verb+T1_FillOutline()+}\postcorr and \precorr \begin{verbatim} GLYPH *T1_AAFillOutline( T1_OUTLINE *path, int modflag) \end{verbatim}\index{\verb+T1_AAFillOutline()+}\postcorr Their usage does not need any explanation. The value of \verb+modflag+ is required for {\em Right-To-Left} typesetting. If the bit \verb+T1_RIGHT_TO_LEFT+ is set, the dimension of the glyph are recomputed accordingly. All other bits from \verb+modflag+ are ignored such that in the usual case of {\em Left-To-Right} typesetting simply 0 can be specified. While \verb+T1_FillOutline()+ produces bitmaps of depth 1, \verb+T1_AAFillOutline()+ produces antialiased bytemaps of the current graphics depth. It should be mentioned that Smart Antialiasing (see \ref{smartantialiasing}) does not work with this function. The reason is that \tonelib\ has no notion of the quantity ``size'' when it gets the outline to process. Hence, Smart Antialiasing can't work in this case. As noted above, the outline is consumed by the filling functions so that there is no need to free it explicitly. \subsubsection{Manipulation of Outlines} \label{outlinemanipulation}% \tonelib\ provides some limited further functionality to process outlines. First of all, a user would expect a character to be defined in a coordinate system in which $x$ points to the right and $y$ points up. Further, a representation of the glyph where all points are specified in absolute coordinates would be advantageous for manipulating outline-points. This is because most transformations, linear or nonlinear, need to have an absolute $x$-value to compute an $y$-value or vice versa. The function \precorr \begin{verbatim} void T1_AbsolutePath( T1_OUTLINE *rpath) \end{verbatim}\index{\verb+T1_AbsolutePath()+}\postcorr does exactly what has been described just before, (a) conversion of relative coordinates into absolute coordinates and (b) inverting the $y$-direction. Once a path has been converted into an absolute path, it is suitable for possibly nonlinear manipulation.\footnote{A linear manipulation of path points would rather be realized using the transformation matrices as described in \ref{transformations}.} As an example of what can be done, have a look at figure \ref{figure:manipulation}. \begin{figure}[t] \hfill \includegraphics[scale=1.0]{manipulate} \hfill\break \vskip3mm \hrule\vskip3mm\small \caption{\label{figure:manipulation}A string with nonlinearly scaled coordinates.} \end{figure} The string displayed has been generated by essentially applying the transformation $y'= y(1+cx^2)$, with appropriate $c$. To allow such transformations by the user, \tonelib\ provides the function \precorr \begin{verbatim} void T1_ManipulatePath( T1_OUTLINE *path, void (*manipulate)(long *x,long *y, int type)) \end{verbatim}\index{\verb+T1_ManipulatePath()+}\postcorr Here, \verb+path+ should be an absolute path as described above. Notice that \tonelib\ has no way to check whether the path is relative or absolute, this is in the responsibility of the user. The second argument is a pointer to a function that has a return type of \verb+void+ and that expects three arguments: two pointers to \verb+long+-values one integer \verb+type+. \verb+T1_ManipulatePath()+ works by iterating through all outline points of \verb+path+ and calling the function \verb+*manipulate()+ for each outline point. When the function \verb+*manipulate()+ is called, \verb+x+ and \verb+y+ are pointers to the $x$- and $y$-coordinates respectively of the outline point to be processed. That way, \verb+*manipulate()+ can alter the outline points arbitrarily. The \verb+type+-argument will be set to the segment type by \verb+T1_ManipulatePath()+. As described earlier, the segment type can be one of \verb+T1_PATHTYPE_MOVE+, \verb+T1_PATHTYPE_LINE+ and \verb+T1_PATHTYPE_BEZIER+. Of course, the function \verb+manipulate()+ has to be written by the user. To make it clear, we consider a function which stretches an outline horizontally by 1.5. The code fragment for this could be: \begin{verbatim} . . . void h_stretch( long *x, long *y, int type) { double dx; dx=(double)*x; dx *=1.5; /* scale x coordinate by 1.5 */ *x=(long)dx; } . . . T1_OUTLINE *path=NULL; path=T1_GetStringOutline(FontID,(char *)SomeString, 0,0,T1_KERNING,20.0,NULL); T1_AbsolutePath( path); T1_ManipulatePath( path, &h_stretch); T1_RelativePath( path); glyph=T1_FillOutline( path, Modflag); . . . \end{verbatim} As the example above already has shown, an absolute path, manipulated or not, must converted back to a relative path before it finally can be interpreted by the rasterizer. This conversion is done using \precorr \begin{verbatim} void T1_RelativePath( T1_OUTLINE *apath) \end{verbatim}\index{\verb+T1_RelativePath()+}\postcorr As already mentioned with respect to \verb+T1_AbsolutePath()+, \tonelib\ cannot check whether the \verb+path+ specified is really absolute. The user has to take care for this. A few general comments about manipulating paths are appropriate. Although the mechanism implemented by \verb+T1_ManipulatePath()+ allows arbitrary manipulation of path points, one must be very careful in doing so. Figure \ref{figure:outlineproblems} exhibits some of the problems that may arise. A text string aligned to a sine function is displayed. %- parameters of figure: string: Text aligned along a sine wave function % size: 50 % kerning on \begin{figure}[t] \hfill a) \includegraphics[scale=0.5]{outlineproblems1} % period=500, \hfill\break \hfill b) \includegraphics[scale=0.5]{outlineproblems2} % period=200 \hfill\break \hfill c) \includegraphics[scale=0.5]{outlineproblems3} % period=100 \hfill\break \hfill d) \includegraphics[scale=0.5]{outlineproblems4} % period=50 \hfill\break \hfill e) \includegraphics[scale=0.5]{outlineproblems5} % period=500 \hfill\break \hrule\vskip3mm\small \caption{\label{figure:outlineproblems}The string ``Text aligned along a sine wave function'' using a period of (a) 500, (b) 200, (c) 100, (d) 50 pixels and (e) again 500 pixels with underlining. The sine amplitude was 30 pixels (in screen resolution).} \end{figure} In part (a), a pleasing smooth text flow is shown and this also applies for (b) where the period of the sine has been reduced to 200 pixels. In (c), where the period has been reduced to 100 pixels, some artefacts already show up. For example, the top bar of the uppercase ``T'' has noticeable variance in thickness. In (d), where the period has been reduced again, the result is hardly readable. Another artefact appears in figure \ref{figure:outlineproblems} (e): since the underlining rule is defined by four points only, these points and nothing else is transformed with the result that the out coming line is still straight and not curved as we would like. From this discussion we conclude, that such transformations can only be done with reasonable results if the maximum distance between the outline points of a shape is small compared to the variance of the outline points that the transformation results in. This rule, although being very fuzzy and non-mathematical, should give a good estimation of which transformations are valid. Another completely independent topic is that, at the level where \tonelib\ provides outlines, their representation is strictly descriptive with respect to points and their connections. There are no such things like \verb+closepath+-segments which would take care that a path is really closed, no matter what the transformation had been. This means, that identical points $P_1 = P_2$ have to be transformed to identical points $P_1'=P_2'$, no matter where they appear in the outline. However, if the transformation is done by by a function $(x',y')=f(x,y)$ as suggested, this should never be a problem. Finally, one should remember that all computations in the user function \verb+manipulate()+ have to be done in units of fractional pixels, rather than in pixels. When designing a sine wave as in figure \ref{figure:outlineproblems}, this must be taken into account with respect to periodicity. \subsection{Logical Fonts} \label{logicalfonts}% It sometimes may be necessary to have a font and an extended or slanted variant simultaneously. To enable such configurations without needing to declare the fonts two or even more times in the font database file, \tonelib\ provides the function \precorr \begin{verbatim} int T1_CopyFont( int FontID) \end{verbatim}\index{\verb+T1_CopyFont()+}\postcorr It copies the top level data structure of the font given by \verb+FontID+ to another location. The newly created font refers in fact to the same physical memory as the font \verb+FontID+ as far as Type 1 and AFM data are concerned. However, no size specific data is copied from font \verb+FontID+, you can thus do with the new font whatever you want to. It will get its own size-specific memory area when the first bitmap is generated using its ID. It is also possible to reencode a copied font without affecting the original font. This is possible because a logical font gets its own mapping tables. This allows configurations with one font at different encodings simultaneously. In order to keep track that another font is referring to data from font \verb+FontID+, a reference counter is managed for every font. The reference counter for font \verb+FontID+ is incremented after a call to \verb+T1_CopyFont()+. If the font \verb+FontID+ is not loaded into memory, the function returns $-1$. Only {\em physical} fonts---those fonts defined in the font database file or added via \verb+T1_AddFont()+---may be copied to another font. If a user tries to copy a font which is already logical, the function returns $-2$. If no memory is available for the new font the function return $-3$. But this should not happen. If all goes the right way, \verb+T1_CopyFont()+ returns an integer---lets call it \verb+new_ID+---which is from now on a valid font identification number. \subsection{Missing or Invalid AFM Files} \label{missingafmfiles}% \tonelib\ heavily relies on AFM information every time the relative position of bitmaps is of importance. Because AFM information is of high resolution, accumulating positioning errors are avoided in contrast to what the X11 text drawing functions do. On the other hand, there are many freely available Type~1 font programs that come without AFM files. This problem has been addressed in \tonelib\ 0.5. \tonelib\ is now able to generate AFM information on the fly and it even can generate AFM files from Type 1 font files. \subsubsection{Remarks on AFM Files} \label{remarksonafmfiles}% Information in AFM files is only relevant for placing character glyphs but not for rasterizing. The metric values are based on the same coordinate system as used in Type 1 font files, the so called {\em charspace coordinate system}. One unit is $1/1000 \mbox{bp}$ when a font is not scaled or scaled to 1~bp, respectively. Information in AFM files can divided into several groups: \begin{enumerate} \item {\em Global Font Information:} This information is generally not needed to place characters. Furthermore, most of this information is also contained in a Type 1 font file itself. This area is thus of marginal importance for \tonelib. \item {\em Character Width's and Bounding Boxes:} These both are crucial for accurately placing the character glyphs. Fortunately, these are dimensions are exactly defined by the character outlines themselves. It is thus possible to compute them spending some computational effort. \item {\em Ligature Information:} For \ae sthetic reasons, certain character groups are often replaced by ligatures and a font file may define several ligatures. It is however not intuitively clear what character groups should be replaced by what ligatures.\footnote{Well, at least not without some expert knowledge like ``I know this ligature's name is `f{}i', so I replace every series of `f' and `i' with it.''} Fortunately, ligatures are not crucially needed for quality typesetting. \item {\em Pair Kerning Information:} This information is quite important for \ae sthetic reasons but it is entirely independent from the outline descriptions and can thus not be extracted from a font file. \item {\em Track Kerning Information:} This information gives hints of how to typeset text generally closer or wider at varying point sizes. \tonelib\ does not use track kerning information and I personally do not consider using track kerning a good typographical style. \item {\em Composite Character Data:} This is needed to construct characters from two single characters. Typical examples are accented characters. \tonelib\ currently does not deal with composite characters. Most of the composite characters needed are already existent internally. \end{enumerate} To come to a conclusion, for our purposes it is sufficient to generate the characters' widths and their bounding boxes and we have all information we need to construct string glyphs. \subsubsection{Generation of AFM Information} \label{generatingafminfo}% Next lets consider how to generate the AFM information. It is a series of entirely independent steps: \begin{itemize} \item When we generate AFM information, we want to do this once and forever when the font is loaded. Consequently all characters, have to be examined, not only those that are currently encoded. We start by fetching all character names the font defines. This done with \verb+T1_GetAllCharNames()+ (see \ref{characterencodingrelation}). This yields a list of possibly more than 256 character names. \item Each of the character addressed by the names above is now rastered at size 1000~bp. By rastering at 1000~bp we match exactly the charspace coordinate system which the character outline descriptions are based on. Width and bounding box are easily examined and saved at appropriate places. \item The kerning pair area and ligatures are explicitly set to zero. \end{itemize} At the end of this procedure, there is a data area identical to what would have been built when reading an AFM file without kerning-section and ligature specifications. The decision of building AFM data is done on the fly without any user interaction. Here is what happens on the metrics-area when loading a font: \begin{itemize} \item \tonelib\ tries to open an AFM file reading metrics and kerning pair information. \item If this does not succeed, it tries to rescan the AFM file in a {\em sloppy} way, only requesting metrics information. \item If this fails too, metrics information is generated on the fly as described above. \end{itemize} It should be noted that generating metric information the way described above takes significant amount of time since every character has to be rastered at 1000~bp. %~derekn If the \verb+T1_NO_AFM+ flag is passed to \verb+T1_InitLib()+, \tonelib\ will neither attempt to open AFM files nor generate AFM information. This is useful to speed up applications which do not need the metrics data. However, this slows down access to certain features, mostly related to the string processing functions, and completely disables the features that only are contained in AFM files (like kerning and ligatures). Obivously, the \tonelib\ functions that use the AFM data will not work correctly in this case and should not be used. %~derekn \subsubsection{Writing AFM Files} \label{writingafmfiles}% In order to reduce the situations where AFM data has to be generated on the fly, \tonelib\ provides the following function: \precorr \begin{verbatim} int T1_WriteAFMFallbackFile( int FontID) \end{verbatim}\index{\verb+T1_WriteAFMFallbackFile()+}\postcorr It writes an AFM file for the font identified by \verb+FontID+. This is done executing the following steps: \begin{enumerate} \item The AFM filename is constructed by taking the fontfilename, cutting off the extension and appending \verb+.afm+. \item A pointer array of size $256 + n$, where $n=\mbox{number of characters}$, is allocated and set to NULL. The leading 256 entries are reserved to point to encoded characters' metrics. The remaining entries are intended to point to metrics of unencoded characters. We see that this is a worst case speculation: The pointer array is large enough for the extremely unusual case that no characters are encoded. \item Next the function steps through all character names and gets their encoding index $i$. If $i\geq0$, the character is encoded and the $i$th pointer element in the array is set to point to the metrics of this character. If $i=-1$, the character is not encoded and the lowest unused pointer in the second area is set to point to the metrics of this character. \item Next the AFM file is opened and the header information as well as a comment by \tonelib\ are written. There are 5 entries that are not trivially to extract from the font file: \verb+Ascender+, \verb+Descender+, \verb+XHeight+, \verb+CapHeight+ and \verb+EncodingScheme+. Their discussion is deferred to later in this section. \item After the header, the metrics information is written in the format required for AFM files. This is done by stepping through the pointer array until the first NULL pointer in the unencoded characters' area is reached. \end{enumerate} The result is a list of char-dimensions entries which is leaded by the encoded characters in ascending order of their encoding index, followed by a list of unencoded characters in alphabetical order. As seen above, the current encoding takes influence on the order the characters appear in the AFM file. One should thus not produce AFM files from reencoded fonts, although this is possible. This yields non-standard AFM files and gives no performance gain, even not when used with \tonelib. The entry \verb+EncodingScheme+ is not always contained in the fontfile itself. It is generated by comparison between encodings. \tonelib\ has only one builtin encoding, \verb+AdobeStandardEncoding+, which is recognized. Every further encoding, defined by the font itself or applied by a user, is always marked as \verb+FontSpecific+. The entries \verb+CapHeight+, \verb+XHeight+ \verb+Ascender+ and \verb+Descender+ are not fully determined by a Type 1 font file although they are existent with high probability. As rough definitions can be considered: \begin{itemize} \item \verb+CapHeight+: The height a capital `H' reaches to. \item \verb+XHeight+: The height a lower case `x' reaches to. \item \verb+Ascender+: The height a lower case `d' reaches to. \item \verb+Descender+: The depth a lower case `p' reaches down. \end{itemize} It is obvious that these definitions make only sense in certain font definitions. For example, a musical notation font might not necessarily define an ascender since no capital letters are provided. In the Type 1 notion these dimensions are referred to as top alignment and bottom alignment values respectively. The corresponding alignment ``zone'', i.e., an interval, is defined by the alignment height and a corresponding overshoot position. The alignment zones are specified in the BlueValues array for top alignment zones and the OtherBlues array for bottom alignment zones. A Type 1 font may define up to 7 top alignment zones and 5 bottom alignment zones. It is unfortunately not defined which of these alignment zones refer to \verb+CapHeight+, \verb+XHeight+, \verb+Ascender+ and \verb+Descender+. \tonelib\ tries to get out of this dilemma by making a best guess: \begin{enumerate} \item For each of the characters `H', `x' and `d' it fetches the largest y-value and compares the result with each alignment zone in the BlueValues array. The alignment zone closest to the observed character dimension is assumed a candidate for the respective quantity. \item It checks whether the difference between the alignment zone just selected and the character dimension is within a certain tolerance area. This tolerance width is $\pm 30$ charspace units. If the result is positive, the quantity in question is assigned the numerical value of the standard height (not the overshoot) of this alignment zone. Since we are currently considering top alignment zone, this will always be the lower value. \item If the value is out of tolerance or the font even does not define the character, the corresponding entry in the AFM file is left out. \item A comparable procedure is then done for \verb+Descender+, this time examining the OtherBlues array. \end{enumerate} Note that if the values do not seem to be correct, the corresponding lines can be removed from the AFM file without doing any harm. These entries are optional only. \verb+T1_WriteAFMFallBackFile()+ can indicate a number of error conditions by returning appropriate values. These are: \begin{itemize} \item \verb+0+: No error occurred, AFM file was successfully written. \item \verb+-1+: The AFM data for the font in question has been generated by reading an AFM file, there is no need to generate a new one. If you really want to force an AFM file to be written, take care that \tonelib\ does not find an AFM file when loading the font. \item \verb+-2+: The font in question is not loaded. \item \verb+-3+: The font in question is loaded but AFM data has not been generated. This definitely is an error condition because it indicates not all characters of the font could be rastered, either because the font file is damaged or because there were insufficient system resources. In any case the application should generate a logfile and this file should be examined. \item \verb+-4+: The AFM file could not be opened. This could be a permission problem or something else. The file is always opened in the current working directory. \item \verb+-5+: The file has successfully been opened but there was an error writing to the file. \item \verb+-6+: A memory allocation error occurred. This should not happen because it indicates there are no system resources. \end{itemize} \subsection{Font Subsetting} \label{Font Subsetting}% When applications have to setup Postscript files for printing, the problem is that these files often grow large. Each font which is not known to the Postscript interpeter, i.e., usually each font that is not part of the set of 35 standard fonts, has to be downloaded as part of the file. The size of a particular font file often can be reduced by font subsetting, because usually only a small subset of the available character descriptions is actually needed. \subsubsection{Font File Organization and Subsetting} \label{Font File Organization and Subsetting}% Each Type~1 font file is a special Postscript program defining three Postscript-dictionaries: \begin{itemize} \item \verb+FontInfo+\\ Global font information like font and family name and encoding scheme is stored here. This data is required even for a subsetted font. However, as will be described later, the encoding scheme may be reduced to those characters that are in the desired subset. \item \verb+Private+\\ This dictionary is in the encrypted part of the file and stores global font data too. This data includes quantities parameterizing hinting and subroutines that might be called by the character descriptions. This data is required also. \item \verb+Charstrings+\\ For each character defined in the font a binary and encrypted byte string (charstring) coding the character outline is stored in this dictionary. The number of charstrings may be considerably larger than the size of the encoding vector. This dictionary usually constitutes the largest part of the font file and, consequently, it is the place to reduce storage requirements. \end{itemize} The main principle in subsetting is to decrypt the font and reorganize it, leaving out charstrings that are not required in the current context. For example, if a document uses only the character 'A' from the font Garamond, then this font may be subsetted preserving the character outline for 'A' only. The resulting file, which will be much smaller than the original file, can then be included verbatim into the Postscript file containing the document. At the same time, optionally, the encoding vector could be redefined to contain only the entry for 'A' at the appropriate location and \verb+.notdef+ otherwise. A still more consequent subsetting would involve leaving out those subroutines from the \verb+Private+-dictionary that are not needed by the preserved charstrings. Leaving out some subroutines on the other hand would require to interprete and check all charstrings for the subroutines they require and all preserved charstrings would have to be adapted to the reorganized index. Since the subroutines usually do not consume that much memory this is not considered worth the effort. \subsubsection{Functions for Subsetting} \label{Functions for Subsetting}% There are two ways to obtain a subsetted font from an existing file. The user can (1)~do it step by step which requires reading, decrypting, reorganizing and encrypting of the font file, and (2)~use a high level function to do it without having to know anything about the details. For font subsetting, \tonelib\ provides the function \precorr \begin{verbatim} char *T1_SubsetFont( int FontID, char *mask, unsigned int flags, int linewidth, unsigned long maxblocksize, unsigned long *bufsize) \end{verbatim}\index{\verb+T1_SubsetFont()+}\postcorr It returns a pointer to a memory block containing the subset data. The memory is allocated in the function and it is the responsability of the user to free this memory. The parameter \verb+FontID+ as usual is used to tell \tonelib\ which file or font is to be used for the operation. \verb+mask+ points to an array of characters which has to be setup by the user. This array must comprise exactly 256 characters and for the index of each non-zero entry the charstring resulting from the current encoding is preserved in the subsetted font. To give an instance, if the subset should consist in the character 'A' only and we assume the current font specifies \verb+StandardEncoding+, then the \verb+mask+-array should be initialized to zeroes and \verb+mask['A']=1+ or some other non-zero value. The \verb+flags+ parameter allows to control the subsetting operation. It usually should be set to \verb+T1_SUBSET_DEFAULT+. In this case, the subset is ASCII-hex encrypted, that is, as in a \verb+.pfa+-file. It is thus well-suited for the verbatim insertion into a Postscript file. If the source font file in question defines the encoding to be \verb+StandardEncoding+, the encoding is not adjusted to the subset specified by \verb+mask+. By contrast, if the font defines a \verb+FontSpecific+ encoding, this encoding will be adjusted according to the subset. This default behavior---which mimics what e.g.~\verb+dvips+ seems to do---may be overwritten by OR'ing \verb+flags+ with \verb+T1_SUBSET_FORCE_REENCODE+, which leads to adjusting the encoding vector in any case. Conversely, reencoding can be suppressed unconditionally by OR'ing \verb+flags+ with \verb+T1_SUBSET_SKIP_REENCODE+. If \verb+flags+ is OR'ed with \verb+T1_SUBSET_ENCRYPT_BINARY+, a buffer of mixed ASCII, binary and EOF segment types is created and encryption is performed in binary mode. The buffer's contents in this case represents a valid compact binary format file (\verb+.pfb+). It is considerably smaller than a comparable \verb+.pfa+-file but it is not suitable to be inserted into Postscript files. The parameter \verb+linewidth+ is used to specify the line length if ASCII-hex encryption is used. Since---according to the Adobe speification---the first 8 encrypted bytes have to be stored one after the other without interspersed white space, the allowed range of \verb+linwidth+ is limited to 8 at the lower bound. It is also limited at the upper bound by 1024, because writing that long lines does not preserve the readability of the produced file. The parameter \verb+maxblocksize+ is important if binary encryption is used. Then, this value specifies the maximum allowed segment size. For similar reasons as discussed above, this value must be equal to or larger than~4. There is no limit at the upper bound, because the maximum segment size can be derived automatically follows from the target font file. \verb+bufsize+ must be a valid pointer to an \verb+unsigned long int+ in the context of the calling function. The size of the memory area to which the function returns a pointer, is written to \verb+bufsize+. The calling function needs this number to process to buffers contents, e.g., to write it to a file. If errors occur in this function, \verb+NULL+ is returned and \verb+T1_errno+ is set to an appropriate value. If the font corresponding to \verb+FontID+ is not loaded, \verb+T1_errno+ is set to \verb+T1ERR_INVALID_FONTID+. \verb+T1ERR_INVALID_PARAMETER+ is used to indicate that one of the further arguments is out of range. \verb+T1ERR_ALLOC_MEM+ and \verb+T1ERR_FILE_OPEN_ERR+ may also be set in this function. Finally, \verb+T1ERR_UNSPECIFIED+ may also be set if the charstring definition for \verb+.notdef+ could not be located. This is considered to be a fatal error. An example of how to use the function described above is given in the file \verb+subset.c+ in the \verb+examples/+ subdirectory of the distribution. \subsubsection{Further Functions for Subsetting} \label{Further Functions for Subsetting}% For the sake of completeness, there are a few further functions in the subsetting module. The function \precorr \begin{verbatim} char *T1_GetCharString( int FontID, char *charname, int *len) \end{verbatim}\index{\verb+T1_GetCharString()+}\postcorr returns a pointer to the charstring of the character with name \verb+charname+ of the font identified by \verb+FontID+. In case of an error, \verb+NULL+ is returned and \verb+T1_errno+ is set to \verb+T1ERR_ALLOC_ERR+ if there was not enough memory for storing the charstring, \verb+T1ERR_UNSPECIFIED+ if the charstring was not found in the dictionary, \verb+T1ERR_INVALID_FONTID+ if the font in question is not loaded or \verb+T1ERR_INVALID_PARAMETER+ if \verb+charname+ or \verb+len+ is \verb+NULL+. The memory pointer which is returned is managed static in this function. Thus, it should not be free'd by the user, or, in case the memory block is free'd, the pointer must be set to \verb+NULL+. In order to decrypt a charstring, the \verb+lenIV+-value of the font in question must be known. It can be obtained using the function \precorr \begin{verbatim} int T1_GetlenIV( int FontID) \end{verbatim}\index{\verb+T1_GetLenIV()+}\postcorr The returned value indicates how many leading random bytes are used for charstring encryption in the font \verb+FontID+. According to an undocumented Adobe convention, the value $-1$ is also valid and indicates that the charstring is not encrypted at all. Hence the return value $-2$ is used to indicate an error. In this case, \verb+T1_errno+ is set to \verb+T1ERR_INVALID_FONTID+, which indicates that the font in question is not loaded. \subsection{Composite Characters} \label{subsec:CompositeCharacters}% This section discusses the composite character information that may be present in AFM files and how this information is represented, accessed and handled in \tonelib. \subsubsection{General remarks} \label{subsubsec:General Remarks}% Composite characters are defined by the fact that they are constructed from at least two independent symbols. In practice there frequently appear two components, a base character and an accent, e.g., as in ``\"A''. Usually, the accents (or secondary pieces) of a composite character are typeset first without causing any horizontal escapement and finally the base character itself is typeset and causes its escapement to become the escapement of the whole composite character. Although some people recommend that the character definition of an accent itself should not cause escapement, this generally is not respected in real fonts and \tonelib\ does not require this condition to be fulfilled. In order to construct a composite character the characters to be put together have to be known and metric information about how to put these characters together has to be known too. \tonelib\ defines two structures as new data types for this purpose. The first is \begin{verbatim} typedef struct { int compchar; int numPieces; T1_COMP_PIECE *pieces; } T1_COMP_CHAR_INFO; \end{verbatim} Here, \verb+compchar+ is the index in the encoding vector of the composite character. \verb+numPieces+ specifies how many pieces are required to build the composite character. The third element is a pointer to an array of type \verb+T1_COMP_PIECE+, whose actual length is given by \verb+numPieces+: Each piece (or symbol) receives one slot in this array. \verb+T1_COMP_PIECE+ is defined by \begin{verbatim} typedef struct { int piece; int deltax; int deltay; } T1_COMP_PIECE; \end{verbatim} It contains the encoding index of the symbol in \verb+piece+ and information where to place this symbol with respect to the composite character's orgin in \verb+deltax+ and \verb+deltay+. The first slot is filled by what I refer to as the base character, it is the one that causes spacing. As can be seen in these data structures, composite character handling in \tonelib\ is based on encoding indices rather than on character names, which, by contrast, are used for the definition of composite character data in AFM files. The presence of composite character information in AFM files does not tell anything about whether a font has an internal definition of this character or not. For example, the font \verb+TimesRoman+ internally defines the CharString \verb+Adieresis+ and hence this font provides the letter ``\"A'', assuming an appropriate encoding, without any knowledge about composite characters. However, the file \verb+TimesRoman.afm+ may still provide composite character information for \verb+Adieresis+, just to tell an application that this glyph consists of more elementary pieces and how to construct it. On the other hand, if \verb+TimesRoman+ had no CharString-definition for \verb+Adieresis+, the composite character information of \verb+Adieresis+ provides an application with enough information to be able construct \verb+Adiereis+ from the elementary units \verb+A+ and \verb+dieresis+ that the font provides. \subsubsection{Accessing Composite Character Data} \label{subsubsec:Accessing Composite CHaracter Data}% This section describes a few functions that provide access to composite character data of a font file. The data they return can be considered a mapping of the original AFM data with respect to the current encoding. As usual, \verb+FontID+ must be the identifier of a font loaded into memory, otherwise an appropriate error indicator is returned. The functions described in the following may also return some other error types. Firstly, \precorr \begin{verbatim} int T1_GetNoCompositeChars( int FontID) \end{verbatim}\index{\verb+T1_GetNoCompositeChars()+}\postcorr tells the user how many composite character definitions are given in the AFM file. This, of course, does not depend on the current encoding vector and it is even possible that the current encoding vector does not incorporate any composite character at all. The function \precorr \begin{verbatim} int T1_QueryCompositeChar( int FontID, char char1) \end{verbatim}\index{\verb+T1_QueryCompositeChar()+}\postcorr checks whether composite character information exists for the encoding index \verb+char1+. If so, it returns the index within in the AFM composite character data array as a number equal to or greater than zero. If the result is valid but no composite character information has been found for \verb+char1+, $-1$ is returned. In case of an error, $-2$ is returned and \verb+T1_errno+ is set to an appropriate value. The previous function does not tell anything about whether the font \verb+FontID+ incorporates a character definition for the composite char or not. This can be queried using \precorr \begin{verbatim} int T1_IsInternalChar( int FontID, char char1) \end{verbatim}\index{\verb+T1_IsInternalChar()+}\postcorr It returns $1$ if there exists a CharString for \verb+char1+ and $0$ if not. In the latter case, the application is responsible for the construction of the composite character (see later). \verb+T1_IsInternalChar()+ also might return $-1$ and set \verb+T1_errno+, which indicates that the font in question is not loaded. The information required to construct a composite character is retrieved by calling the function \precorr \begin{verbatim} T1_COMP_CHAR_INFO *T1_GetCompCharData( int FontID, char char1) \end{verbatim}\index{\verb+T1_GetCompCharData()+}\postcorr It returns a pointer to a meaningfully filled struct of type \verb+T1_COMP_CHAR_INFO+ as described above. The composite character and the number of pieces as well as a pointer to the array of type \verb+T1_COMP_PIECE+ are stored in this structure. Once this information is obtained the composite character can be constructed by \begin{itemize} \item placing the accent symbols in a loop that ranges from $1$ to \verb+numPieces+$-1$. In practice this loop will often be executed only once. The initial current point must always be restored. In this loop positioning information is accessed by \verb+ptr->pieces[+$i$\verb+].deltax+ and \verb+ptr->pieces[+$i$\verb+].deltay+, where \verb+ptr+ is the pointer returned by the above function. \item placing the base character (\verb+pieces[0]+), which then also causes the horizontal escapement of the composite character. \end{itemize} In cases where \verb+char1+ is not a composite character, the \verb+compchar+ entry is set to \verb+char1+ itself and \verb+numPieces+ becomes $1$, as would be expected. The \verb+pieces+ pointer is then set to \verb+NULL+. In case of errors, this function returns \verb+NULL+ and \verb+T1_errno+ is setup correspondingly. The pointer returned by this function should always be free'd using \verb+T1_FreeCompCharData()+ in order to avoid memory leaks (see also Section~\ref{deletingdata}). A function that provides the same functionality is \precorr \begin{verbatim} T1_COMP_CHAR_INFO *T1_GetCompCharDataByIndex( int FontID, int index) \end{verbatim}\index{\verb+T1_GetCompCharDataByIndex()+}\postcorr In this case, the information is requested by means of an index \verb+index+ in the AFM composite character data array. This function is thus well-suited for scanning the complete composite character information of a given font in a given encoding. \verb+index+ may, for example, be obtained by a call to \verb+T1_QueryCompCharData()+ as described above. The valid range for \verb+index+ is from $0$ to the value returned by \verb+T1_GetNoCompositeChars()+ minus one. The range of \verb+index+ is validated and in case of an error \verb+T1_errno+ is to \verb+T1ERR_INVALID_PARAMETER+. There may also appear other errors and under any erroneous condition, \verb+NULL+ is returned. The parameter \verb+compchar+ of the \verb+T1_COMP_CHAR_INFO+ structure that is referenced by the returned pointer, bears somewhat more information for this function than in the case of \\ \verb+T1_GetCompCharData()+. As said it contains the index in the encoding vector where the composite glyph is encoded. It may also have the vaue $-1$, which means that the composite character is not encoded. Note that this is not an error condition. \subsubsection{Transparent Handling of Composite Characters and User Extensions} \label{subsubsec:Transparent Handling of Composite Characters and User Extensions}% Aside from the fact that composite character information may be accessed in \tonelib, \tonelib\ can automatically---and completely transparently with respect to the user---compose characters if it finds information on how to do so. To give an instance, let us examine the font ComputerModern Roman (cmr10). Because this font is specially encoded for the use with early (7-bit) \TeX-systems, it does not incorporate a definition for \verb+Adieresis+. The definition simply was not required because \TeX\ itself constructed the composite character by means of its \verb+\accent+-primitive. If a font like cmr10 is reencoded e.g.~to IsoLatin1 encoding, the character ``\"A'' will show up as a blank because there is no definition for \verb+Adieresis+. Now, if the corresponding AFM file is extended with the following lines, it becomes possible to access an \verb+Adieresis+: \begin{verbatim} StartComposites 1 CC Adieresis 2; PCC A 0 0; PCC dieresis 100 200; EndComposites \end{verbatim} This line in an AFM file provides information about how to construct an \verb+Adieresis+ from the \verb+A+ and \verb+dieresis+ glyphs, and \tonelib\ can utilize this information to construct the requested glyph without that this will be be noticed by the user. Composite character are treated just the same way as standard characters. They are cached, they can be scaled, transformed etc. Let us assume that the cache is still empty and a character, identified by its encoding index, now is to be rastered. The following happens in the rastering function: \begin{enumerate} \item \tonelib\ looks up the character's name in the encoding vector and tries to locate the CharString for that character. If this succeeds all works as usual, notwithstanding the fact that there might have been composite character information for that char. This means, font-internal CharString-definitions have highest priority: One cannot, for example, re-define an \verb+Adieresis+ by raising the umlaut ``\"{ }'' via a composite character definition, if \verb+Adieresis+ is defined internally. \item However, if the CharString is not found, composite character information is examined and if possible, elementary units are used to construct the requested composite character by concatenating paths. \end{enumerate} In any case, the resulting character is put into the cache and is from then on available as any other character. If pieces of a composite character are not found in the CharStrings dictionary, those pieces are substituted by \verb+.notdef+, so that for extreme cases the whole composite character might be substituted by a \verb+.notdef+. Then, an appropriate message is put into the log file with priority \verb+T1LOG_WARNING+ and \verb+T1_errno+ is set to \verb+T1ERR_COMPOSITE_CHAR+. In the same way \tonelib\ composes characters without user intervention, the functions for character metrics are aware of composite character information and the returned result are also valid for those functions. \subsubsection{Caveats} \label{subsubsec:Caveats}% Although handling of composite character is widely automated, problems may arise. Most importantly it is the responsibility of the user to take care that font file and AFM file provide consistent data. Alas, this is not always true for existing font and AFM files. If, for example, an AFM file is extended by composite character definitions and these composite character definitions reference symbols that are not defined in the CharsStrings dictionary, errors will result. If composite character information is added to an AFM file, the following rules have to be respected: \begin{itemize} \item The name of the composite character has to be encoded because it could not be accessed otherwise. Furthermore, no internal definition in the CharStrings dictionary may exist because this would override the composite character definition from the AFM file. \item The user should verify that all components of a composite character definition have entries in the CharStrings dictionary. This can be checked for example by using\\ \verb+T1_GetAllCharNames()+ or by disassembling the font file. \item Even being more restrictive, the user should take care that all pieces of a composite character are encoded. For \tonelib\, this is really irrelevant because, internally, characters may be accessed by the name of their CharString. This means \tonelib\ simultaneously has access to all characters defined in a font. However, an application that exports PostScript files can only access character definitions via their position in the encoding vector. Composing a character from pieces of different encodings will require two font definitions in a exported PostScript file for typesetting one character, which cannot be termed a clean strategy. \end{itemize} \subsection{Error Handling} \label{errorhandling}% Although every function usually returns meaningful values, there are situations where indicating an error via the return value is not possible. For example, requesting a charspace bounding box from a char of a font which is not loaded will return a bounding box containing all zeroes. This cannot be considered an error-condition since for characters like ``space'' it is correct to return a bounding box containing all zeroes. Furthermore, there's no consistent scheme which value should indicate what type of error. In order to allow a unified error handling in applications, the global variable \verb+T1_errno+ has been introduced. The functionality of \verb+T1_errno+ is analogous to that of the global \verb+errno+ in C programs. \verb+T1_errno+ is once set to 0 when the library is initialized and never reset by any \tonelib-function. It is set to specific values when specific types of errors appear. An application may then act appropriately and reset \verb+T1_errno+. The errors that might appear can be roughly split into three categories as described below. \subsubsection{Type 1 Font File Scan-Errors} These types of errors can only appear at the time a font file is loaded. These kinds of errors are indicated by negative values: \begin{itemize} \item \verb+T1ERR_SCAN_FONT_FORMAT+ (-5): A Multiple Master Font was attempted to be loaded. These are not supported by \tonelib. \item \verb+T1ERR_SCAN_FILE_OPEN_ERR+ (-4): This value indicates that the Type 1 font file could not be opened by the parser. It usually does not mean that the file does not exist because this problem would have shown up at the time the font database had been built. It is more likely a permission problem. Anyhow, the C library variable \verb+errno+ should be examined for getting an idea of what the problem was. \item \verb+T1ERR_SCAN_OUT_OF_MEMORY+ (-3): A Type 1 font program required more than 262144 bytes of VM. This is a limit imposed by \tonelib\ because it usually means there goes something wrong. Typical values of VM consumption are between 30000 and 60000 bytes depending on the fonts' complexity. If this limit really does not suffice the constant \verb+MAXTRIAL+ (defined in \verb+lib/type1/fontfcn.c+) may be set to some larger value. \item \verb+T1ERR_SCAN_ERROR+ (-2): An error occurred during scanning the font file. It usually means that the font file is damaged or does not comply to the conventions of Type 1 font files. For example, an encountered token might have been too long. Another reason could be, a literal name follows a literal name where a number was expected. There is no way to recover from this error. One last resort could be to disassemble the font (e.g., using \verb+t1disasm+ from the \verb+t1utils+ package) and scan the resulting human-readable file for possible violations of the Type 1 font format specifications. However, some knowledge about the format is in force. \item \verb+T1ERR_SCAN_FILE_EOF+ (-1): A premature end of file was encountered during parsing. The file is damaged. \end{itemize} \subsubsection{Path Generation Errors} Small positive number are reserved for errors that might appear during path construction and rasterization. \begin{itemize} \item \verb+T1ERR_PATH_ERROR+ (1): An error occurred during path construction. The font file is most probably damaged. \item \verb+T1ERR_PARSE_ERROR+ (2): This kind of error describes a kind of ``semantic'' error in the font file. A typical candidate for this is a font that does not define a character named \verb+.notdef+, although this is required by the format specification. Since under usual conditions the \verb+.notdef+ character is never accessed, this error would not show up. But if for some reason the \verb+.notdef+ has to be substituted for some other character the problem becomes evident. \item \verb+T1ERR_TYPE1_ABORT+ (3): The \verb+abort()+-function of the rasterizer has been called. This may happen at several places during hinting, converting to edgelists etc. There is a certain chance that unfreed memory has been left. If this error appears and a logfile is used, an error string giving some more info is placed into the logfile. This error should not appear, normally. If it does, either the font file is damaged or the font contains invalid outline descriptions such as unclosed paths. Especially the latter is quite unlikely. Of course this error can be raised, when an outline has been modified manually in an invalid way and is then rastered (see.~\ref{outlinemanipulation}). \end{itemize} \subsubsection{\tonelib-Errors} The remaining types of errors are detected by the management of \tonelib. Their numbering starts with 10 (decimal). The list could be extended in future releases. \begin{itemize} \item \verb+T1ERR_INVALID_FONTID+ (10): An invalid font ID has been specified. The exact meaning of this error depends on the specific situation, in any case the operation requested cannot be realized with the identified font. Possible reasons are: \begin{itemize} \item The font ID points to a font which is not loaded and which must be loaded in order to perform the operation. \item The specified font ID is a number which is generally out of the range of the valid font IDs, either because it is $<0$ or because it is $>$ the value of \verb+no_fonts+. \item The library is not yet initialized so that no font ID at all is valid. \end{itemize} \item \verb+T1ERR_INVALID_PARAMETER+ (11): One or more of the parameters specified to a function call were assigned invalid values. For example, a size-value specified to a rastering function must always be $>0$. Just the same way, \verb+T1_ConcatGlyphs()+ cannot concatenate two glyphs if one of them is the \verb+NULL+ pointer. \item \verb+T1ERR_OP_NOT_PERMITTED+ (12): An operation that was not allowed {\em at that time} has been requested. This error could result, for example, if an application tries to set a new bitmap padding value after \tonelib\ has been initialized. \item \verb+T1ERR_ALLOC_MEM+ (13): This error indicates that \tonelib\ ran out of memory and a memory allocation failed. This error should not appear. \item \verb+T1ERR_FILE_OPEN_ERR+ (14): A file that was needed could not be opened by \tonelib. The file might have been necessary for reading data or writing data. For example, \verb+T1_WriteAFMFallbackFile()+ returns this value if the AFM file could not be opened for writing and \verb+T1_LoadEncoding()+ returns it if the encoding file specified as argument could not be opened. Notice that there is no indication of the reason why the file opening failed. The C library variable \verb+errno+ should be examined to analyze this further. It should be mentioned that \verb+T1ERR_FILE_OPEN_ERR+ is only set if a file operation failed which was really in force. This means that at the time a font is loaded a missing AFM file does not cause \verb+T1_errno+ caused to be set to \verb+T1ERR_FILE_OPEN_ERR+. This is because \tonelib\ can automatically recover from this by generating AFM information on the fly (at the cost of computation time). \item \verb+T1ERR_UNSPECIFIED+ (15): This value indicates nothing apart from that an error occurred and this error was not one the other errors. It can be considered a fallback. \item \verb+T1ERR_NO_AFM_DATA+ (16): A function has been called which needs AFM information and AFM information is not available, either because all attempts to generate AFM data failed or because the flag \verb+T1_NO_AFM+ has been specified as part of the flag for \verb+T1_InitLib()+. \item \verb+T1ERR_X11+ (17): An error in an X11 library function occured. This could be caused by calling a function of the X11 interface without prior initialization of the X11 interface via \verb+T1_SetX11Params()+. \item \verb+T1ERR_COMPOSITE_CHAR+ (18): A request to compose a composite character could not be fulfilled without problems because at least one part of the composite character was not found in the \verb+CharStrings+ dictionary. This is bad because it indicates that font file and AFM file do match. Further errors or unsatisfactory rastering results have to be expected. \item \verb+T1ERR_SCAN_ENCODING+ (19): Scanning an encoding file failed. Since \tonelib\ uses a fallback approach---DVIPS-encoding is tried first and afterwards \tonelib-encoding---it is not clear at which place exactly a failure occured. However, further hints about what \tonelib\ thought about the file in question may be found in the log file. \end{itemize} In analogy to the Standard C Library function \verb+strerror()+, \tonelib\ provides the function \precorr \begin{verbatim} const char *T1_StrError( int t1err) \end{verbatim}\index{\verb+T1_StrError()+}\postcorr It returns a pointer to a string describing the error corresponding to \verb+t1err+. Usually, the argument should be directly specified as \verb+T1_errno+. The memory where the returned string is stored is static in \tonelib\ so that it may not be \verb+free()+'d. \subsection{Other Useful Functions} \label{otherfunctions}% This subsection describes a few functions that had not been described up to now but which however could be useful. \precorr \begin{verbatim} int T1_CheckEndian( void) \end{verbatim}\index{\verb+T1_CheckEndian()+}\postcorr This function may be used to check the endianess of the hardware \tonelib\ is running on. The return value is \verb+0+ for Little Endian and \verb+1+ for Big Endian machines. \precorr \begin{verbatim} void T1_DumpGlyph( GLYPH *glyph) \end{verbatim}\index{\verb+T1_DumpGlyph()+}\postcorr This function might be useful for debugging and testing \tonelib. It dumps an ASCII representation of the glyph pointed to by \verb+glyph+ to the standard output. A background pixel is represented by \verb+.+ while a foreground pixel is represented by \verb+X+. After the number of bits that correspond to the current padding value, an empty column is inserted. See the output of the programming example in \ref{programmingexample}. In this case the padding values has been 16. Note that the size of the glyph should be small enough that its padded width does not exceed the terminals line width. Otherwise the result might become illegible. \precorr \begin{verbatim} void T1_DumpPath( T1_OUTLINE *path) \end{verbatim}\index{\verb+T1_DumpPath()+}\postcorr This function dumps a description of an outline to the standard output. It is exclusively intended for debugging purposes. \precorr \begin{verbatim} void T1_SetRasterFlags( int flags) \end{verbatim}\index{\verb+T1_SetRasterFlags()+}\postcorr This function allows to enable or disable certain features of the rasterizer. Let me emphasize that this is exclusively intended for debugging and error tracking. The default value of \verb+flags+ is 0 which means that no debugging output is shown and hinting is performed as suggested in the {\em Adobe Type Font Format}. However there may arise situations where fiddling with the \verb+flags+ might be helpful in rasterizer and font debugging. \verb+flags+ usually is an OR'ed combination of the following definitions: \begin{itemize} \item \verb+T1_IGNORE_FORCEBOLD+ \item \verb+T1_IGNORE_FAMILYALIGNMENT+ \item \verb+T1_IGNORE_HINTING+ \item \verb+T1_DEBUG_LINE+ \item \verb+T1_DEBUG_REGION+ \item \verb+T1_DEBUG_PATH+ \item \verb+T1_DEBUG_FONT+ \item \verb+T1_DEBUG_HINT+ \end{itemize} The \verb+T1_IGNORE_...+ types allow to selectively disable hinting. They might be useful if parts of a font are not properly rendered. For example, substituting a font's alignment zones by the family's alignment zones might result in visual artifacts if the values for \verb+FamilyBlues+ are not correct. Disabling family alignment might reveal the problem in such cases. The \verb+T1_DEBUG_...+ types produce debugging output from the intermediate rasterizing steps. Notice that to understand this output a thorough understanding of what happens in the rasterizer is in force. Moreover, be prepared that thousands of lines might be written to the terminal, depending on the particular option. %%% Local Variables: %%% mode: latex %%% TeX-master: "t1lib_doc" %%% End: xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/intro.tex0000664000175000017500000002534211742726711022143 0ustar uwabamiuwabami%---------------------------------------------------------------------------- % ----- File: intro.tex % ----- Author: Rainer Menzner (Rainer.Menzner@web.de) % ----- Date: 2001-06-03 % ----- Description: This file is part of the t1lib-documentation. % ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. % As of version 0.5, t1lib is distributed under the % GNU General Public Library License. The % conditions can be found in the files LICENSE and % LGPL, which should reside in the toplevel % directory of the distribution. Please note that % there are parts of t1lib that are subject to % other licenses: % The parseAFM-package is copyrighted by Adobe Systems % Inc. % The type1 rasterizer is copyrighted by IBM and the % X11-consortium. % ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) % ----- Credits: I want to thank IBM and the X11-consortium for making % their rasterizer freely available. % Also thanks to Piet Tutelaers for his ps2pk, from % which I took the rasterizer sources in a format % independent from X11. % Thanks to all people who make free software living! %---------------------------------------------------------------------------- \newpage \section{Introduction} \subsection{What Does \tonelib\ Do?} \tonelib\ is a library written in the C programming language allowing a programmer to generate bitmaps from Adobe (TM) Type 1 fonts quite easily. These bitmaps are returned in a data structure with type {\ttfamily GLYPH}. This special {\ttfamily GLYPH}-type is also used in the X11 window system to describe character bitmaps. It contains the bitmap data as well as some metric information. But \tonelib\ is in itself entirely independent of the X11-system or any other graphical user interface. Given that the X11-system is probably the most frequently used window system in the UNIX-world, and furthermore assuming that most graphical applications run under window systems, it appears that \tonelib\ implements functionality already provided by the graphical user interface, the X11-system. Thus the question arises: Why not use X11 directly for rastering characters? Well, the answer is quite simple; the X11 Font machinery appears to be too {\em static} in order to use it for certain purposes. Moreover X11-calculations and positioning of characters are based on bitmap dimensions and are thus subject to error accumulation. Here is a list of features which are supported in the current release of \tonelib. \begin{itemize} \item Rasterizing is done as characters get requested. The X11-server, in contrast, rasters a font completely at a given size when it is loaded. {\em Rastering on demand} saves time when the font is loaded the first time and saves memory since often only the alphabetic letters and a few other characters are needed. \item The encoding mechanism of PostScript is fully supported. The user may use the fonts' internal or some other encoding. Additional encoding files can be loaded at runtime and fonts can be reencoded at runtime. The syntax of encoding files is straight-forward and simple. \item The library makes use of Adobe Font Metric data in the form of AFM files. This may seem a disadvantage, but in order to make decent typesetting possible, some more information than that contained in Type 1 font files is needed. Besides, Adobe makes these AFM files freely available on their ftp-server for all registered Type 1 fonts. \item In case AFM files are missing, \tonelib\ is able to generate metrics information in charspace accuracy by rastering each character at 1000~bp. \item In addition to generation of character bitmaps, there is a way to directly raster strings of any length in a given font. The space-width may explicitly be corrected by the user. This may be needed by word processing applications. \item Strings may be rastered optionally using pairwise kerning information from the AFM file. Kerning is an important feature of good quality typesetting. Kerning information can also be requested by the user without rasterization. \item Ligature information is made available to the user in an efficient way. Use of Ligatures is another characteristic of good typesetting. As to my knowledge, only \TeX\ and all related macro-packages are able to handle ligatures in a natural and efficient way. \item Rotation and arbitrary transformation on the fly is supported. \item \tonelib\ supports antialiasing. In this case, a pixel is represented as a byte, word or double word. Antialiasing is implemented by subsampling with factor 2 or 4 alternatively. If you use the X11-interface introduced in \tonelib\ V.\ 0.3-beta, even colored antialiasing between any pair of colors is provided in a completely transparent way. \item In addition to transformation on the fly, two transformation types---{\em slanting} and {\em extending}---are possible on the fontlevel including bitmap caching. Horizontal expansion of fonts is fully supported and since version 0.3-beta also {\em slanting} of fonts is nearly fully supported. For restrictions and drawbacks of slanting fonts see \ref{transformations} on page \pageref{transformations}. \item Paths, the library searches for the different needed file types are specified at runtime by means of a configuration file. They may thus be changed without needing to recompile the application. For example, the directories of the X11-system's Type 1 font files may be specified there in order to use these fonts with the library. A user may have his own configuration file and as a fallback/default there is a system wide configuration file. This should be setup when the library is installed. \item Since of version 0.3-beta a special set of functions is provided which implements a more comfortable X11-interface. This is due to the fact that X11 is the only standard window system in the UNIX world. However, as before \tonelib\ may be compiled and used without even having X11 installed. \item Some decorations like {\em underlining} are supported by simply setting a flag for the rastering functions. \item {\em Right To Left} typesetting is supported. \item Font subsetting is easily achieved using a high level function. This makes it easier for application to efficiently export Postscript files. \item Composite character information can be retrieved. Moreover, \tonelib\ transparently handles and realizes composite character definitions from AFM files. \end{itemize} There are also some problems and features not yet implemented, but likely to be implemented in the future. The main problem up to now is: \begin{itemize} \item The font cache isn't a font cache really. At this time all bitmaps are saved by always allocating more memory from the system. No automatic removal of bitmaps no longer needed is done. However, the user has the possibility of explicitly removing data, if he thinks it is not needed anymore. \end{itemize} \subsection{Copyrights and Credits} There are some copyrights on parts of the library and there are some programmers (or corporations) which I want to give credit. The library uses: \begin{itemize} \item[--] all internal parts of the X11-rasterizer donated to the X11-project by IBM. This rasterizer does the {\em real} hard work of scan-conversion. \item[--] the modifications to the rasterizer done by Piet Tutelaers in his ps2pk-package. The main purpose was decoupling the sources from the X11-system sources. \item[--] the \verb+parse_AFM+ software which was made freely available by Adobe. This is used to parse the AFM files (what a surprise) and to generate the data structures the information is saved in. \end{itemize} Raph Levien (\verb+raph@acm.org+) contributed an algorithm for sampling down non-antialiased bitmaps to antialiased bitmaps in a very efficient manor. This makes antialiasing a lot faster. Fred L.\ Drake, Jr. (\verb+fdrake@acm.org+) wrote a Python interface to \tonelib, which is distributed with \tonelib. This wrapper is called \verb+t1python+ and allows Python-programmers to use Type 1 fonts. I can not tell anything more on this topic since I do not know the Python language. All questions concerning the Python interface should thus be addressed to Fred L.\ Drake, Jr. Evgeny Stambulchik (\verb+fnevgeny@plasma-gate.weizmann.ac.il+), maintainer of the \verb+grace+-project---a descendent of \verb+xmgr+, never gets tired of finding and reporting (and fixing) bugs in \tonelib. Other members of this project spent time in porting \tonelib\ to further systems: \begin{itemize} \item Ed Vigmond (\verb+vigmonde@IGB.UMontreal.CA+): IRIX-port, \item John Hasstedt (\verb+John.Hasstedt@sunysb.edu+): VMS-port, \item Alexander Mai (\verb+st002279@hrzpub.tu-darmstadt.de+): OS/2-port. \end{itemize} Hirotsugo Kakugawa (\verb+h.kakugawa@computer.org+) added support for GNU \verb+libtool+ to \tonelib. David Huggins-Daines (\verb+bn711@freenet.carleton.ca+) spent effort in finding memory leaks and maintains a Debian-package of \tonelib. \begin{center} \Large Thanks to all these people \\ and to all those contributors not mentioned here! \end{center} \subsection{Motivation} The idea of writing this library was due to the SciTeXt-project which was founded in 1996. They needed a font raster system with some more functionality than X11 provided. You may find that some things (for example the format of the font database file) is really closely related to SciTeXt. In February '{}97 the SciTeXt developers decided to migrate from C to Java and did not need a font rasterizer any more. Since I thought there could be other applications for this library I continued the work on it and voila. I have removed the history description which followed at this place in some previous versions. The history can be roughly viewed in the file \verb+Changes+ which is located in the toplevel directory of the distribution. \subsection{How to Reach the Author/How to Get \tonelib} If you have questions, comments or bug reports, you can reach me by eMail. The address is \begin{center} \verb+Rainer.Menzner@web.de+ \end{center} If you have bug-reports, it would be best if you could reproduce the error using the test program \verb+xglyph+ (see \ref{xglyph}). \tonelib\ is available by anonymous ftp as\\[5mm] \verb+ftp://sunsite.unc.edu/pub/Linux/libs/graphics/t1lib-+$x.y[.z]$\verb+.tar.gz+ \\[5mm] Here, $x.y.z$ is the version identifier and the brackets around $z$ indicate that this entry is optional. %%% Local Variables: %%% mode: latex %%% TeX-master: "t1lib_doc" %%% End: xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/shearv.pdf0000664000175000017500000000250011742726711022240 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœUT¹r1 íù,“fƒƒàÑz&àH]&•2¹Æ*\ù÷ƒpG–v@<Äa:¸þöûv/¯…ëoÿ½•×ÊT͵Lç!“k¨Þ‹$xù§àP]êsré=·>]˧/=l®?<á»Ñ×û‡Ÿ¯Êç«ó¿V%|¿U¡úÝ{>n–;þÆ/ÿéã%©¿dp N÷Æ`Ø\Ç;É› ;L‚`æ§·Âm4—úpÉIM5HSðÒ¥Ž—ç¡Ö9C¸… ôLadNÜÚö¼e5O€[8”ån¤)-­Dœ*¦BŒ‡Ûð˜PðÜV΄x¢¸–˜&g¼”Úôñžr:Y($§'¯ GMêÄõðÜ. E8CQúðl5Ø€¨XÄ ½…£AnÝÃdô“ÞÕ¢ÌË=÷žõÜ3&Î Љɢ£ïsÀL9¨´:š#j)!¹µËœSÒíþ”3²4'ã‘"Êé}¢ô¾µA/èWïÑGÃáÒ2Ž-q›=¾!uñþß0€à F%Ñ17jÖãÖ3·¬—ÓƇÎ)º•_˜ Èk L¸ ®Ùs"©®©´ŽÚ§¾'Ý—qíéô‚Ãè‰yg† ;æ “¨²Ÿ´Q'É¡Ä[è3êêpQ–¼GŽE9ÓÝÙÏ\²û‰WôMa ]¡/ 4aZ®©ë›äf‰ä"ÅØyÃ6<6ìe³,°®¨obÞk¸·—î7М,`ÜsN"?µ™½¼%¢ù=†=þ]Êsù øˆDendstream endobj 5 0 obj 588 endobj 3 0 obj << /Type /Page /MediaBox [0 0 200 200] /Parent 2 0 R /Resources << /ProcSet [/PDF /Text] /Font << /R6 6 0 R >> >> /Contents 4 0 R >> endobj 6 0 obj <> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 7 0 obj << /CreationDate (D:20010110083248) /Producer (GNU Ghostscript 5.10) >> endobj xref 0 8 0000000000 65535 f 0000000972 00000 n 0000000913 00000 n 0000000692 00000 n 0000000015 00000 n 0000000673 00000 n 0000000840 00000 n 0000001021 00000 n trailer << /Size 8 /Root 1 0 R /Info 7 0 R >> startxref 1108 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/shearh.pdf0000664000175000017500000000247711742726711022237 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœUT¹r1 íù,“fƒƒàÑz&àH]&•2¹Æ*\ù÷ƒpåD–v@<Äa:¸þöûv/¯…ëoÿ½•×ÊÐY¾âÐȪ÷½¼«Hh.õùäÒ;·>]˧/½‚yýQ"ÞᾃßõþáçÇëŸòùêü¯U ßoî³~/îåÍi‰`òÀ/ÿéã%©¿äl N÷Æ`Ø\Ç?’=$6@v(˜ÁÌOo…Ûh.õá’“šj¦à¥K/ÏC­%r†p è™ÂÉœ¸µíyËjž·p(ËÝHS“E7Fß瀙rPiu4GÔRBrk—!8§¤Ûý)gdiNÆ#'D”ÓûDé'|kƒ^Яޣ!ކ%Â¥e[â6{6|Cêâý¿aÁŒ J¢cnԬǭgnY/§7ŒSt+¿0טp0\³çDR]#RiµO!|?Nº/ãÚÓè‡Ñó2Î: vÌ &Qe >i£N’C‰·ÐgÔÕá¢,y%Šr¦»³Ÿ¹d÷¯è› ºB1^@h´\S×7ÉÍÉEаó†m ylØËfY`]Qßļ×pn/Ýo 9YÀ¸çœD~j3{yKDó{ {üº”çòørDendstream endobj 5 0 obj 587 endobj 3 0 obj << /Type /Page /MediaBox [0 0 200 200] /Parent 2 0 R /Resources << /ProcSet [/PDF /Text] /Font << /R6 6 0 R >> >> /Contents 4 0 R >> endobj 6 0 obj <> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 7 0 obj << /CreationDate (D:20010110083243) /Producer (GNU Ghostscript 5.10) >> endobj xref 0 8 0000000000 65535 f 0000000971 00000 n 0000000912 00000 n 0000000691 00000 n 0000000015 00000 n 0000000672 00000 n 0000000839 00000 n 0000001020 00000 n trailer << /Size 8 /Root 1 0 R /Info 7 0 R >> startxref 1107 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1_data.pdf0000664000175000017500000012725711742726711022306 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœí< —^ÕU”ÌäËÌ7+€Q˜–¾TJ2·çý ¤I‚Iƒ„’ú „×…š€5T-¶¨¨õý„ZØÖVžûqö¹çÞù&Öd™År±ÈÜ»ï>ûìsÎ~ž³Ï§:=Sø_ù{âÔò‹Ëzöì²ë¢qÆÏ¾ºì´Ñ]²3›“îl˜ùº¬g&ÙÎy?{é©å‡—_œi¢"NœšÝulùs_˜éÙ±“ËB| œö]ž9£:?;vê¶«®þĶÏ{n9!α'o[œlÇW L¯;&KÓã/¬\5Ý1=þÒÂÎÉ5Ókñ³Éª|Ÿ^‡ïkV›Y¶ù ú®±ë'oÛ9Ý5aòñ©µvü²sÊä ¦#ß¾xlöв‹ÎwnëFžLû‘ÿö“e”Ĥ7™ƒ…ëWoXØ5]üÔ'iÀÚ¸YvøùÆO/•1&Æ_Ú}ÓÍÛxLe–¶—9¡—Î$7°ô·8ÝSçÀ ¢gÖEÝÁ¼Ù@âL; ’.y¬É™YŸà_˜„ÏL¹ï$31½e÷ÒtWß„¹iëúOÿ•þ‹\ ût!¥.º™ÎNu.˺[ zðVøžm»€^WÄÍ•µÂ%½u²gá§Y. ôg&?;=~Ûôøg+O^>ºŒTƒ6jfŒµÈJy"˜®WI XCoÇ(QPbic@üöÂÈ.Øó`hΫZŸª–B ë=8èLFH™Ûò0h{˜+eˆ™8Šžâ }ű¶³ ‘Ðn.ÓY_>y{kÐ.[7§ûáEë:¢£ôG4l[&:V™ÈkLOí¢ @Eq~„âÂPt¬ n„¤MPþb¢csMè¤ä Ë¡²Qt™l}¿¦MûŠcb§B³¦óp˜Î&¢³õÝœ—ÃI$ÎG -Ó$°`E—»}ƒ%+ØÐyžK -–7¶3Z7Xi±œÊ]Áï±Òbªs V@! I¶˜K·ÓÚ€±ÍŽ­æ®½·ïÛ9Ù1e¯æ‹¨¯uK0Þ·NÉ#;­É%îRŸûôâ" í¦Å»‰nÚ{mëîÌ¢ºÐw±Û[³‚m™Ž½šÜSŽâÝJCR‹Ûú ’ÉÉZwët‰=¼µý®) fq¯;ñAâ’5ç¤i¤&‘#›µ¾B„m` Jx“+<3}÷ƒø&z­ÓêÛ©¦Øèä¹÷lpš"[bù‚ÚR¯•a…­ÉŠj䣺ÃhÌÁ©!‚+ l†Á_Äæeˆÿ”kmž@z›½wÁ6&¯6Z<`¤ó&6¦¨o-( OkK´¥PÙÄÞmu'½µƒèÂáßÞªd`U ˜‘ÐÚ1 °tˆim¢@XÊÛ.µöU -–Ä~=–@XÉ`8¹5ÆÎ¸xÉÖÎ^¹ÖÎ}tkg¶ÀÚ¹ËjíD¬†|"´b"VL¬ŠÕ´B.‘ëTHO#˜2ÀJ &ÞµX2À*ñgƒU ¬¦'¦-’_ ªý#½îŠòÕW¾ôjÏ;ViU”8­#˜À\!(%‚¥S‚o  ,8@´SEFÅdå:cBi ™˜U—|‹U ¬cçb‹U ,‘³Ê-V ° ë²k± d€¥58¦ÐbÈ`rŽœ. –@Ö/U[:œè  .i’÷ßA; eIï\80É?¿÷ÐÊÔ]¤ ®ˆÀÉ¡•»¿xÏ¡•ò¥h×½ûéÝzAL,ŽºÆŽw±Øð÷ûòÊÏÝxáƒ?ÿ=„’#í»o >xxáÈê‘•~iåžUF‡9Ù”ðÝG­äý©;WîÛw@ý‚:´úðÁ;gè1DBýó̤Ť:"à!–ØŒGhZøùÐÁûö9øåûqÿ°Î¥ÿ»Z9rôŽA x@=ºzÏÂ`ãÑ22º»æÇî\¸—°M™Vz[ó¨¬LòÀÞG޼crèèßÁó\öÑXùÅûá 9˘8úåÓô š! ¾ÿøqZŒPè^øÊÊ/­üòê¯p?©úÛ‡ÏGÙõûÕ•_{òÄþ¼ÿ𠢆VäKÐÛ#­¸<µòÄê+÷>v×€©ÁÔ•ñ™M—8?vxõn¯Û>}íóà¸Ï•Ò¶pâ:9Ä00¡y"µ‘R¼•C<‹&”™å7+hOm°UÎdË-Y 1q¬VIŽ=ZƒU ,ɉk‘ÐâØ Ê4H`%›»Ð’È+ ƒŒÕ¿F`<@X?°¡6šÀÑk%U —h_ îm:[‚ɱ²sr’½“™­é ΪúîTüèž…“¼éëíµ¼ÌFÏwU“màtwNçö’dc~Çpc¾8ß°i¦úÑg±Ð|úAz E6·S‘7Ó3<îzR°­ôÎÔv/Aqrº ¼û5D*æM‡²£/'Z&œ{ ²ØÃ]ª_D·Ÿ½y{k6xo_ ‘j\´VÆa0µ}õ¹ÇŸ{üš …nΪ,MgeÆ’™3Æ“Äøñ—匪ÉO«ˆ[¿MÂ*8A\Râ+Hi±\Æ ±Ð` ¤Å²Pºä,´X&¤N“ –@Z¬d=ÄÂ-–@Z¬ìRgsÛ£@Z,­‚fó#X`éèÙ”U¬`yÌÃgц.'r·tÔ¸k€sªŸ>ÝYKö!Ä©Îhƒt vÔ®ÃðÏC0ˆq¾'Äí|&§‹ó†»‹ß/MžÞ½X"0¿¾쟹ºœti«EÍnyôˆQÑ‹Ô$᪫QòúÏ6U ß5)gcê“ÓŸ_b+`UQ¸%V+˜ÃJmòìúíûn9¸%Ýe*¸.“ŒºWFÉ æ‰…p Oï>9yâò=ûxx)ôiÍ<ݽéæqî±÷ÆçûÜR9¡} X»Ùô™ÒWǼø©–l,¶ϯ¢lkô³÷ Þ5“Xé…²_¶$¼_¬ïš‚Hßׯòáaá0·‡YQs­ôð¬ñéÝÄäV•‡[k›§Rõ—S)¦ž‡mŒ”ÍÆÛmFŒL‹îh›»1-ZŽª*V€Ð?ë«@X>¹Î·vQ ¬r´Ù`ÈËzøÖ °ê‰JŪ'* –¶Öµñ]óŠ2È ‹y­I_5¯ƒ¤¯`Õ¤¯b ’>1Õ’ôõ¦ºMúŠuS6uª¥%,&ª­ÁcÈËàÑËÀ,ÈËFŒ¦$ x¯ •÷zÚ`ÉíìÀÈ«&¬k°¬š°V¬AÂZ°jŠ\±)rq!%‰?cÐߺKÞbçà\à¬öÿÃÇË9X<ʱùƒÍ1„É´™7mÁipLl((þf}²mï¯?Aòößða‡²Wï,³àÍ@Út‹M)Ø¿czýê­oÛ\p@^^,²R×åb<Ñ®ÝK§ÝÂöÇ€à^;­é;¤)5ÇMz~d·£á'~z‚œX".%Js–úŘÇIÉ´.‘í¢ŒÆFÙÝÖºýa? ux5YªÃó¦N÷ äBöA¥Çë¶8½f÷HZJ¬`D’·Avuëô†i#i]»ëCMàæ’õØœü° Š–ÇÍ b¨m&š¶æ|ÐÝd»%Ó± ¸-ãéIÐç²ûkEÑiÖ¸F­DmÂ{Óǵ­âî˜Ã{ͼ)‰iÞÇ¡-M®Ûã0åÆdm 2krîpÌ:ÏD1¹óx”€eZø®mKc‰ Ø]y?-¼ç‚á,· òÎ}` Å-„B´ÜBúàwl!\†p)†ã8‡§ßÁîGb¬æ˜®‡§:÷c{Ôù¾[~mF&ß Ûµ¹¼sÍÀðÔÁ÷ã2À¥n殼7ãªÂa!0ÂpÍ>Nã:½¬sô˜ è¤ ¶£sÄL)ÎÁb’ŽÕ<↘[Ëë Àj±ù®3£Kóò^:À1†”ö¸¥B Jå*†ð\ ‡@ËÕÂhNÂz ¡¡ª!ÃrľßòÞŒ¬bÈЄ‚¼sÍÐ"„íÔBæ‚}ÓN¿7c«Â¥PŽ£ .ðÇj?zk¿Îò”T­0’;cû¡³áAU Ȩ…PwÑíÂÚßS`ëÐ÷!ö£çB0„K¡0ÇppÎÂŒÄvpN;®²(dÒxô];.ïÍà*Fa½RwÃú;ÓÎùÄ-¤~oW1„K¡0ÇP,³6œÏ÷Ò‹Uqº•Õª ôÚ¥|e’æå½tÐÈd6‘”ö¥T¥vPÞ‘¬Âs!0kTDå ›æš'zj‹ 0*uκŠõcoG(¾´ë9¯”ª?Ifxº+õ AðïzŸÒWH_L¥] £䥋tªìñÉ´í+Þ``XEmçâ0Q9Õåëæô†U2^V Ÿók|Y%SQ’¡¤Rï–UØ8,™@Y6“ã¼Uê·U±ª¯$-õR‡æ•I¨ys ÍöŒ¬›W à1w¼ÑÖc'ÍØ^©Üå§¡ˆhNdHg´n—¯›+yÝ,x%OÛZQ¹·f d½‡8™Ó­Ûåëæ ^7‡$Ò †£€qK¬WHo»l²©³qdÞº%0/&¶Z±ë„&‰]l'Tpú ѯÛeëfúgåÂ> nà»]Òs^P¼£„d2% º@ÑCRT6,èeécÃ’fUfÚ™Ïj¤Šyds½/T“lÓÁ½„ð[ϵŸE‰Êbu÷׃dzÈF­‚~a™½}ÓX”î´o…~N!²‰^mq§ûˉÙv&µb+^lÛR©±1-7•ËÓÀ Úœ‡ ¢<6¦nl€% c:F©·¤õ&·¤…mb˜C34éTl‡sâèYôo#¤/¸¸eQÇyèœi4‡Í•y¢ `w§B=ZÓMÒ1Môrë»9Ý\“º‰êŠê¤ŸÊªE!eæÈ552§¡É5ãëÎXŽ?Dq~ŒìØp»j¸çniõõA¸gÛܤ@úܤ·Â·Ë¬gÈ NQÖ¦qE0¾+ªÉÊ:‡‰lb¶¸ÓMî̇”M»N%,?Ì\èˆw§’Øx܉ÆTÖ{Þƒ/¦³hS!ÈfÞÿ4ÞÒÅkè!ÐÁȰ|â­(¼9a@º¨t8s(ÍÚÐÎ#A =îŸ8Ž3ò‡w©˜pÄŸªÀ3 ÌUÜ&@OC–Jädi?ÙhUœTÔ„%à>B JQt´J­°Ìë P]¨¯4~ˆãr(q«ou@Ÿ™÷l÷…ÔØ¦DH–¨ž"ÑÎ9®î; ¤ e<‡Éx5"&¾°f¨MŽñfˆI¾ôÅÛ$ t NãýK&]($ËHVß “ÀÕxÉ7²]H¸ª5„Íž-… ´~X#ÏóŽóT#FϳŸÇU§» ‘k¼LÎTr Ƿ笂éå+.Ì!¸qO71ÊâXå2¯iè3R©¨‰-keC—D EDC¤Ï×F4_ù³˜k;*ÖUÌŒ¥.±Ò"óU!«}æ ÉñL&â$ v5èHŠ-%†.óôà‚îµT2]áD6]ÀÑ)EÏ ¬æ& ÇhxÈ­ÖQAÊZGnñfjj§Æ2JI\hñ‡UˆŽ+¥‹Ö©T–¡h„u}>BBáÐÁ¤Ó]Çjd1Ü6´âd’ XyK8^¡Â ð1™HÃ’¤¨kï<36ÖƒqÁÙ …¸¯¦{ µ¾²è¨:*þ¦ ””*ëé_` Ñ·†KrÊî¸XÕ*Œ ù´HŽWJ´ rF…Í‚?õ@<9Ž ¡­) ÉPéäÙX´n3À í9w¶1FÚ/Ÿø’@;Tk,^kV¶e'9aÙðf’MЗ":ŠýH@訾«4á9qjç"ƒÁ£õ¾ÈPYÃkË{½Õgx­‹BŸÆÌÓÀ«Ãð 9º: 0+±¨Úä0<øz0rlîHzÄ0$o€9”.Ê^¼ Ì*ƒÃ —]HfÃêÀˆKªè&jé‡Á͋ώïùF 8-+™¡_A€ÂE%oÁÑ%n£•ýüHå½ñ¬ÏT¤Kg¢ÑvÅ5*0ÀÚdÃQ” òMÆ\ƒ¢ÙtÐûPD6ûvƒbƒü--îåÑal.î-á~¾’¶‘g0¤l@q lЧ_‡BXŒ=¡'ÂØrtêK*@áRDÿÇ[…e({MVÊ5Ư¶øúѰbÅÙâïÛ0a;v/É“‡v°ê,æ% ÅWÏàÀβPÏ€–iò„П Ú¤À§ÌÜv=u^¯¿ÎÕB DQn)~¡RÁ[0ÙµamIr-/wêZn …@ýˆÀxób×Q[ŒÑB31 ³üÖ¹sŠË^úùuø[3±]|" ®Ëä@³­i–ÒâïƒxÊrƒW`ƒ^EÂz´#©—ëÁ)Ó–Åã×á³xJ¬l# à)<‹£È° JÄsö«çμúʹß:÷µó¿ýõ×ôïóæð?=½ú—ßúæœÿÖyüûí?¼ðö[G/pa¤—íZç˜Ö­?þ“W^ÿÖùwÎ_8÷Ê9ÀÿÓ·^øó?û‹ï<æÍ åþßKKæâí¿|³åâÛuæÕ7ÎBßÄˈ¤ÈÕ«XšiqC HÕ÷ú[€“RœçÕ~ØŸú~¶–<]?Ü‹ÕçÏLk±ùô–Ý‹Ü)î |@9ɯA¦€%‡ýÄ=ó&,ÂÙwÎíü_ÿÍ…soœãük°û÷÷Í çÞ9ÿÊãgÞü©D·3ðãØ²™ä·ÿñŸ.œûN÷Úëlˆî±Ä‹ËVÿY½»ï½ðÝÉ¿¬¾»ï»ê½ð=õ¯T%+7˜ÿíÔ{á½ðï“ÿøÏ÷'ß/5Ò 7–jnpô‡4/¥Tø¿h¸a¶ÆCøÞ¹©÷'?Vßß÷¾úÑä]"‹» ôñ\v.¸?~ð¿Ký-¿ÿ°ÔßÒËÿœ¥W² 6ÑZ TÊ›Òr;«ü¶Òÿ(`¶endstream endobj 5 0 obj 6064 endobj 3 0 obj << /Type /Page /MediaBox [0 0 612 467] /Parent 2 0 R /Resources << /ProcSet [/PDF /ImageB /Text] /Font << /A 7 0 R >> >> /Contents 4 0 R >> endobj 7 0 obj <>/FontBBox[0 -77 85 111]/FontMatrix[1 0 0 1 0 0]/Widths[ 0 0 33 0 31 0 0 35 0 0 0 34 39 0 0 0 0 0 0 0 0 0 0 0 38 0 60 0 36 0 52 41 0 0 0 0 0 0 0 0 0 0 0 42 30 0 45 0 43 25 0 0 0 0 26 0 0 0 0 27 0 0 0 47 0 0 0 0 0 54 0 0 0 0 50 0 0 51 0 0 46 0 0 0 0 0 0 0 28 24 0 0 0 0 0 0 0 0 0 0 58 0 0 0 0 0 0 37 49 59 0 0 29 0 0 48 0 0 63 0 64 65 0 72 0 0 0 71 0 77 0 0 0 0 32 0 0 73 0 0 79 0 0 0 84 57 0 0 90 0 56 0 89 0 92 0 76 0 97 0 0 95 0 0 85 0 0 0 0 0 0 0 0 0 0 0 68 0 0 0 0 0 0 0 0]>> endobj endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 193 0 obj << /CreationDate (D:20010110083258) /Producer (GNU Ghostscript 5.10) >> endobj 6 0 obj <> endobj 8 0 obj <> stream 0 0 0 0 33 54 d1 33 0 0 54 0 0 cm BI /IM true/W 33/H 54/BPC 1/F/CCF/DP<> ID & ×ÿòI?ÿÿÿÿÿä_ÿÿ’Iÿÿÿÿÿù³_ÿ EI endstream endobj 9 0 obj <> stream 0 0 0 14 33 54 d1 33 0 0 40 0 14 cm BI /IM true/W 33/H 40/BPC 1/F/CCF/DP<> ID 63¨ß´¯[[¥¾éo¶•ëkzÚÞ±Ú¾­z~Ÿ§’VõuzWÞ•÷¥}é_n—I° EI endstream endobj 10 0 obj <> stream 33 0 0 0 0 0 d1 endstream endobj 11 0 obj <> stream 0 0 0 3 19 55 d1 19 0 0 52 0 3 cm BI /IM true/W 19/H 52/BPC 1/F/CCF/DP<> ID $8@×ÖGuÿÿÿÿÿÿÿÿÿÿ› æeÿÿÿü@ EI endstream endobj 12 0 obj <> stream 31 0 0 0 0 0 d1 endstream endobj 13 0 obj <> stream 0 0 0 13 35 55 d1 35 0 0 42 0 13 cm BI /IM true/W 35/H 42/BPC 1/F/CCF/DP<> ID 5 8AÓ§\‹î‚ éé7ý=~?ëú Ðk¿É§ý×ÿußêÚí+k†•ŽÕ«V Â€€ EI endstream endobj 14 0 obj <> stream 0 0 0 13 24 54 d1 24 0 0 41 0 13 cm BI /IM true/W 24/H 41/BPC 1/F/CCF/DP<> ID >_ÿÿÿÿÿÿÿÿÿïïïxy!ÈC_ß}÷  EI endstream endobj 15 0 obj <> stream 35 0 0 0 0 0 d1 endstream endobj 16 0 obj <> stream 0 0 0 13 34 54 d1 34 0 0 41 0 13 cm BI /IM true/W 34/H 41/BPC 1/F/CCF/DP<> ID >GRÿÿÿÿÿÿÿÿÿÿÿÿÿ¿þ×í-û ’W]®ÔC EI endstream endobj 17 0 obj <> stream 0 0 0 13 36 55 d1 36 0 0 42 0 13 cm BI /IM true/W 36/H 42/BPC 1/F/CCF/DP<> ID $ NpƒL&¨>Õ`–Eñ´~ú~ÿïÿÛ÷ï°~C²†;Áä¸y&;ÿ>ÿ¿­´°ÂØíjÔ0¡… EI endstream endobj 18 0 obj <> stream 0 0 0 0 13 54 d1 13 0 0 54 0 0 cm BI /IM true/W 13/H 54/BPC 1/F/CCF/DP<> ID >_ÿÿÿÿÿÿÿÿÿÿÿÿø€ EI endstream endobj 19 0 obj <> stream 34 0 0 0 0 0 d1 endstream endobj 20 0 obj <> stream 39 0 0 0 0 0 d1 endstream endobj 21 0 obj <> stream 0 0 0 13 33 55 d1 33 0 0 42 0 13 cm BI /IM true/W 33/H 42/BPC 1/F/CCF/DP<> ID :‰:pžéѺ Ò}uo_ÒøÿÿÿÿíK¯ïºïº[[ ,v¯jP€€ EI endstream endobj 22 0 obj <> stream 0 0 0 13 35 55 d1 35 0 0 42 0 13 cm BI /IM true/W 35/H 42/BPC 1/F/CCF/DP<> ID 5 8AÓ§O"öoMÒôõ½?ÿI¿ÿÿÿÿûÝ/ÿkzÚÛ­­°–;V­C P EI endstream endobj 23 0 obj <> stream 0 0 0 0 34 55 d1 34 0 0 55 0 0 cm BI /IM true/W 34/H 55/BPC 1/F/CCF/DP<> ID :‹ ›$ºzè‰Ã„é=>é¿¥ÿÿÿÿÿýî¿ö¯Ú¶¶¬K[ía¬0±ÿÿÿÀ@ EI endstream endobj 24 0 obj <> stream 0 0 0 0 13 54 d1 13 0 0 54 0 0 cm BI /IM true/W 13/H 54/BPC 1/F/CCF/DP<> ID >_ÿÿÿÿÿÿÿÿÿß/ÿÀ@ EI endstream endobj 25 0 obj <> stream 0 0 0 13 34 71 d1 34 0 0 58 0 13 cm BI /IM true/W 34/H 58/BPC 1/F/CCF/DP<> ID :‹ éÓÝ„¤ý½}ãïÍCÁ§§¡¬‹Ôzué×§ÿKßÿÿÿõÿ½ý~÷[VÖ±,{[íma„H À@ EI endstream endobj 26 0 obj <> stream 0 0 0 0 21 71 d1 21 0 0 71 0 0 cm BI /IM true/W 21/H 71/BPC 1/F/CCF/DP<> ID ]/J¿UÕ}/ézýzÿõ_ÿÿÿÿÿûïÿ÷íÿoßwÝý¿o EI endstream endobj 27 0 obj <> stream 0 0 0 13 35 70 d1 35 0 0 57 0 13 cm BI /IM true/W 35/H 57/BPC 1/F/CCF/DP<> ID <_ÿÿÿÿÿ8/>ŸOÞ/!ùá>›ÓÿMÿ_ûÿÿÿÿÿ~—ÿµõµÚXk’W]®Âˆa@@ EI endstream endobj 28 0 obj <> stream 0 0 0 -1 19 70 d1 19 0 0 71 0 -1 cm BI /IM true/W 19/H 71/BPC 1/F/CCF/DP<> ID 8íûwß·ý¿»ýûýÿý÷ÿÿÿÿׯúþºô¿ÕuëªëÒô  EI endstream endobj 29 0 obj <> stream 0 0 0 0 7 54 d1 7 0 0 54 0 0 cm BI /IM true/W 7/H 54/BPC 1/F/CCF/DP<> ID #—ÿÿÿÿÿÿÿÿÿÿÿÿþ  EI endstream endobj 30 0 obj <> stream 0 0 0 0 40 54 d1 40 0 0 54 0 0 cm BI /IM true/W 40/H 54/BPC 1/F/CCF/DP<> ID # ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ› Oÿ EI endstream endobj 31 0 obj <> stream 0 0 0 14 33 70 d1 33 0 0 56 0 14 cm BI /IM true/W 33/H 56/BPC 1/F/CCF/DP<> ID >X{ßÜVý÷»ú×~¹1ßÿ[Óþ·ý?ëzÖÿ§÷_úzßÿI¿ÿ½+ÿé7þ  EI endstream endobj 32 0 obj <> stream 38 0 0 0 0 0 d1 endstream endobj 33 0 obj <> stream 0 0 0 1 17 54 d1 17 0 0 53 0 1 cm BI /IM true/W 17/H 53/BPC 1/F/CCF/DP<> ID (/ÿÿÿÿÿÿÿÿüŽ ÿœ÷÷À@ EI endstream endobj 34 0 obj <> stream 60 0 0 0 0 0 d1 endstream endobj 35 0 obj <> stream 0 0 0 0 37 54 d1 37 0 0 54 0 0 cm BI /IM true/W 37/H 54/BPC 1/F/CCF/DP<> ID & ß‡½ï%«á¾·Ûÿ}ÿÛÿÿþßÿÿÿÿÿþ½ý}¯Ký.¼%ÂXõ…¬,@ EI endstream endobj 36 0 obj <> stream 36 0 0 0 0 0 d1 endstream endobj 37 0 obj <> stream 0 0 0 -1 41 55 d1 41 0 0 56 0 -1 cm BI /IM true/W 41/H 56/BPC 1/F/CCF/DP<> ID 5ƒÂtéÓ¢ï= Ý/O«Ý/þ¿ñ](XX%¤`g‚PJ‚ T ˆb´C—‚Â¥õÈ3ëÿþÚúëmv•†jÕ¨aC  EI endstream endobj 38 0 obj <> stream 52 0 0 0 0 0 d1 endstream endobj 39 0 obj <> stream 41 0 0 0 0 0 d1 endstream endobj 40 0 obj <> stream 0 0 0 14 34 55 d1 34 0 0 41 0 14 cm BI /IM true/W 34/H 41/BPC 1/F/CCF/DP<> ID : 3Œ'ÞžŸ"÷ Æ“ï^ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ EI endstream endobj 41 0 obj <> stream 0 0 0 13 32 55 d1 32 0 0 42 0 13 cm BI /IM true/W 32/H 42/BPC 1/F/CCF/DP<> ID : œ'ºtD÷„OI¿úüW Ad0b„@°X* Zä2ÿý[]®Ò±êö5 (€ EI endstream endobj 42 0 obj <> stream 0 0 0 0 36 54 d1 36 0 0 54 0 0 cm BI /IM true/W 36/H 54/BPC 1/F/CCF/DP<> ID &¤A‹¥þ—®¾ºô¿Òõ××^—®¾ºî¶–×uµõµÅk$?µßµÛ÷Ûí÷íûíöû}¾ßû}¾ßoßo¿n  EI endstream endobj 43 0 obj <> stream 0 0 0 0 50 54 d1 50 0 0 54 0 0 cm BI /IM true/W 50/H 54/BPC 1/F/CCF/DP<> ID >D2$¿ýÿë÷ÿ¯ÿ&ïÿ×úÿo×ÿúï×úÿoÿ×úÿo×ÿúï×úÿo×ÿúÿo×úÿ[ÿúÿ~8þŸþ½ÿë EI endstream endobj 44 0 obj <> stream 0 0 0 0 34 54 d1 34 0 0 54 0 0 cm BI /IM true/W 34/H 54/BPC 1/F/CCF/DP<> ID >GRÿÿÿÿÿÿÿÿÿÿÿÿÿ¿þýn¶¸k’W]®× ÿÿÿÿ€€ EI endstream endobj 45 0 obj <> stream 0 0 0 0 18 69 d1 18 0 0 69 0 0 cm BI /IM true/W 18/H 69/BPC 1/F/CCF/DP<> ID >ÿ“ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù kÿ€€ EI endstream endobj 46 0 obj <> stream 0 0 0 1 35 54 d1 35 0 0 53 0 1 cm BI /IM true/W 35/H 53/BPC 1/F/CCF/DP<> ID 8 ü’‡ûö÷ovíØvì;v7n·n½»~û> stream 0 0 0 2 35 55 d1 35 0 0 53 0 2 cm BI /IM true/W 35/H 53/BPC 1/F/CCF/DP<> ID :„'AÓôE£ÓtŸMë«ÿ¶?ÿëSæ¿Ú[\0–+ë&8Wkƒ±ÿÿ¿òßþÿÀ@ EI endstream endobj 48 0 obj <> stream 0 0 0 1 35 55 d1 35 0 0 54 0 1 cm BI /IM true/W 35/H 54/BPC 1/F/CCF/DP<> ID 5„:téä¤×I½?ëtÿþ¿ÿý¯[úí-®K&8û^»[ +†þîj?íoïÚV×iXíZµjP EI endstream endobj 49 0 obj <> stream 0 0 0 0 16 69 d1 16 0 0 69 0 0 cm BI /IM true/W 16/H 69/BPC 1/F/CCF/DP<> ID 8ÿ(?ÿÿÿÿÿÿÿÿÿÿÿÿÿóð EI endstream endobj 50 0 obj <> stream 0 0 0 0 31 54 d1 31 0 0 54 0 0 cm BI /IM true/W 31/H 54/BPC 1/F/CCF/DP<> ID &¥ÿÿÿÿÿÿÿÿü†dÿòJÿÿÿÿÿÿ Òkÿà EI endstream endobj 51 0 obj <> stream 42 0 0 0 0 0 d1 endstream endobj 52 0 obj <> stream 30 0 0 0 0 0 d1 endstream endobj 53 0 obj <> stream 0 0 0 -1 45 55 d1 45 0 0 56 0 -1 cm BI /IM true/W 45/H 56/BPC 1/F/CCF/DP<> ID "ÂtéÓ§D!ÞzMÒ}7Þ—¦ÿ_MÿúDH7ÿÿÿÿþßÿeY?i~ß×i[ì0–[jÕ«P†@ EI endstream endobj 54 0 obj <> stream 45 0 0 0 0 0 d1 endstream endobj 55 0 obj <> stream 0 0 0 0 35 54 d1 35 0 0 54 0 0 cm BI /IM true/W 35/H 54/BPC 1/F/CCF/DP<> ID &¤Aõý_×õäÇëéééééééééééééééÅ_×õýX€ EI endstream endobj 56 0 obj <> stream 43 0 0 0 0 0 d1 endstream endobj 57 0 obj <> stream 25 0 0 0 0 0 d1 endstream endobj 58 0 obj <> stream 0 0 0 14 32 54 d1 32 0 0 40 0 14 cm BI /IM true/W 32/H 40/BPC 1/F/CCF/DP<> ID 8û$"íÛöíßvï»wÝ»~Ý¿nß·oÛž ¯ü@ EI endstream endobj 59 0 obj <> stream 0 0 0 0 33 54 d1 33 0 0 54 0 0 cm BI /IM true/W 33/H 54/BPC 1/F/CCF/DP<> ID &¥ÿÿÿÿÿÿÿÿä Ò÷òU>·ßþ÷ÿÿÿýzëׄ±ëZ€€ EI endstream endobj 60 0 obj <> stream 0 0 0 14 33 54 d1 33 0 0 40 0 14 cm BI /IM true/W 33/H 40/BPC 1/F/CCF/DP<> ID :–ýwëòc¿Òû¯«ï_Þ¾õýéëûþž·þô¯ÿ¤þÿÞ•ÿ€€ EI endstream endobj 61 0 obj <> stream 0 0 0 0 28 54 d1 28 0 0 54 0 0 cm BI /IM true/W 28/H 54/BPC 1/F/CCF/DP<> ID &¡™ÿò@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð EI endstream endobj 62 0 obj <> stream 26 0 0 0 0 0 d1 endstream endobj 63 0 obj <> stream 0 0 0 0 19 55 d1 19 0 0 55 0 0 cm BI /IM true/W 19/H 55/BPC 1/F/CCF/DP<> ID 3/ÿÿÿÿÿÿÿÿÿÿÿÿ6ÿÌËÿÿûÈSWÝÀ€ EI endstream endobj 64 0 obj <> stream 0 0 0 0 36 46 d1 36 0 0 46 0 0 cm BI /IM true/W 36/H 46/BPC 1/F/CCF/DP<> ID 5‚ƒ„é‚§Õî½~:¨J ‚PJ„‚ Y…õÍEÿí+®دjÕ¨jP EI endstream endobj 65 0 obj <> stream 0 0 0 -12 22 46 d1 22 0 0 58 0 -12 cm BI /IM true/W 22/H 58/BPC 1/F/CCF/DP<> ID ::"ªëÈò¿ÿÿÿÿÿÿÿÿÿÿÎþN_ÿÿÿÿ EI endstream endobj 66 0 obj <> stream 0 0 0 0 19 45 d1 19 0 0 45 0 0 cm BI /IM true/W 19/H 45/BPC 1/F/CCF/DP<> ID #—ÿÿÿÿÿÿÿÿÿÿýÿ½ü=ä‡!Mwý÷ÜC€€ EI endstream endobj 67 0 obj <> stream 27 0 0 0 0 0 d1 endstream endobj 68 0 obj <> stream 0 0 0 1 30 46 d1 30 0 0 45 0 1 cm BI /IM true/W 30/H 45/BPC 1/F/CCF/DP<> ID 3 œ$ž½èr'á:O¾õïÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿø€ EI endstream endobj 69 0 obj <> stream 0 0 0 0 37 46 d1 37 0 0 46 0 0 cm BI /IM true/W 37/H 46/BPC 1/F/CCF/DP<> ID )Ä‚ƒ§Nh„÷„ô›ï§¯«ß×¢ 7ÿÿÿÿ·ù¬½¿[«kµ¶•Wµj†  EI endstream endobj 70 0 obj <> stream 0 0 0 -16 43 45 d1 43 0 0 61 0 -16 cm BI /IM true/W 43/H 61/BPC 1/F/CCF/DP<> ID .ðxx{Þò:ŸÃ}¾ý¿÷÷ßþûÿÿíÿÿÿÿÿÿÿë×ÿþ¾ºÿ¥þ—^— ÂX­kXXX(€ EI endstream endobj 71 0 obj <> stream 47 0 0 0 0 0 d1 endstream endobj 72 0 obj <> stream 0 0 0 0 40 46 d1 40 0 0 46 0 0 cm BI /IM true/W 40/H 46/BPC 1/F/CCF/DP<> ID )ƒ„éî´BMá¤Þž•÷×úúÿ ÖkÿÉéo¿ÿío[í®Ò°Ââ­^Õ¨aC  EI endstream endobj 73 0 obj <> stream 0 0 0 1 38 45 d1 38 0 0 44 0 1 cm BI /IM true/W 38/H 44/BPC 1/F/CCF/DP<> ID )Ç_¿_ºä‡û¥ÿ·Kÿoô¿}ëëí×þ›ý}_zþôõýÿO[ÿz_¿ EI endstream endobj 74 0 obj <> stream 0 0 0 -16 7 45 d1 7 0 0 61 0 -16 cm BI /IM true/W 7/H 61/BPC 1/F/CCF/DP<> ID #—ÿÿÿÿÿÿÿÿÿÿçÃärÿÿ EI endstream endobj 75 0 obj <> stream 0 0 0 -18 47 47 d1 47 0 0 65 0 -18 cm BI /IM true/W 47/H 65/BPC 1/F/CCF/DP<> ID *ÎD Ðp:tCò=ÓÒoO_Mÿ×ëÿŠéV‚Á)$`(„¡* Q õ" ˆ‚¢%RÖ¿!ÿÿ×[]ÕµØ[idÕŽÕ« Ô)Pp EI endstream endobj 76 0 obj <> stream 0 0 0 0 32 63 d1 32 0 0 63 0 0 cm BI /IM true/W 32/H 63/BPC 1/F/CCF/DP<> ID &¥ÿÿÿÿÿÿÏ Â§Óéâ÷óé½>›ÓÿWß_ûÿÿÿÿÿö½ký¥ý„°×’Úízᨆ  EI endstream endobj 77 0 obj <> stream 54 0 0 0 0 0 d1 endstream endobj 78 0 obj <> stream 0 0 0 -17 22 45 d1 22 0 0 62 0 -17 cm BI /IM true/W 22/H 62/BPC 1/F/CCF/DP<> ID '/ÿÿÿÿÿÿÿÿÿÿÿÿÿœ?üœ¿ÿÿ÷¼‡5}ðáÀ@ EI endstream endobj 79 0 obj <> stream 0 0 0 0 30 45 d1 30 0 0 45 0 0 cm BI /IM true/W 30/H 45/BPC 1/F/CCF/DP<> ID &¤S—ÿÿÿÿÿÿÿÿÿÿÿÿÿýÿ÷ë}¥¿aqä‡]û]®ÔC  EI endstream endobj 80 0 obj <> stream 0 0 0 -16 46 45 d1 46 0 0 61 0 -16 cm BI /IM true/W 46/H 61/BPC 1/F/CCF/DP<> ID Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþpü@ EI endstream endobj 81 0 obj <> stream 0 0 0 -15 21 45 d1 21 0 0 60 0 -15 cm BI /IM true/W 21/H 60/BPC 1/F/CCF/DP<> ID :ÿÿÿÿÿÿÿÿÿÿ0îN;¾þþ  EI endstream endobj 82 0 obj <> stream 50 0 0 0 0 0 d1 endstream endobj 83 0 obj <> stream 0 0 0 52 43 56 d1 43 0 0 4 0 52 cm BI /IM true/W 43/H 4/BPC 1/F/CCF/DP<> ID 6ÿ€€ EI endstream endobj 84 0 obj <> stream 0 0 0 -16 41 47 d1 41 0 0 63 0 -16 cm BI /IM true/W 41/H 63/BPC 1/F/CCF/DP<> ID )Ît‚ƒ„éÓ¢o ÐA½=&ôôŸÞŸõýÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø€ EI endstream endobj 85 0 obj <> stream 51 0 0 0 0 0 d1 endstream endobj 86 0 obj <> stream 0 0 0 0 41 46 d1 41 0 0 46 0 0 cm BI /IM true/W 41/H 46/BPC 1/F/CCF/DP<> ID :PPƒM©éö¨AdYªAôOþýÿý÷÷ï°~C²ßc¼<§ ò @…½üÐÿÿ]­´±ûV­C P EI endstream endobj 87 0 obj <> stream 0 0 0 -16 32 46 d1 32 0 0 62 0 -16 cm BI /IM true/W 32/H 62/BPC 1/F/CCF/DP<> ID $ &¤}>ŸO¼‡ŸMéôÞŸú¾úÿÛÿÿÿÿÿÿµëû_í/ì%†¸¬ÿ]®× v ÿÿÿÿÿà EI endstream endobj 88 0 obj <> stream 46 0 0 0 0 0 d1 endstream endobj 89 0 obj <> stream 0 0 0 -16 37 45 d1 37 0 0 61 0 -16 cm BI /IM true/W 37/H 61/BPC 1/F/CCF/DP<> ID .?ÿÿÿÿÿÿÿÿÿþA¦ÿÿùÿÿÿÿÿÿä4Íü@ EI endstream endobj 90 0 obj <> stream 0 0 0 -16 44 45 d1 44 0 0 61 0 -16 cm BI /IM true/W 44/H 61/BPC 1/F/CCF/DP<> ID .2LOáÿõþ¿ÿÿÿÿÿÿÿ×ý.¼.+ZÖ°÷‘ˆ|?o·ßþûÿÿÿÿþ¿é…á,zÖµ…‚€€ EI endstream endobj 91 0 obj <> stream 0 0 0 0 38 63 d1 38 0 0 63 0 0 cm BI /IM true/W 38/H 63/BPC 1/F/CCF/DP<> ID #eÿÿÿþS‰„ô½ d_¤'¯t¿ßÒÿÿÿÿÿÿí_ÿµ~ÖÕ†6C@÷ÚÚÚÀ€ EI endstream endobj 92 0 obj <> stream 0 0 0 -16 9 45 d1 9 0 0 61 0 -16 cm BI /IM true/W 9/H 61/BPC 1/F/CCF/DP<> ID .?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿð EI endstream endobj 93 0 obj <> stream 0 0 0 -16 7 45 d1 7 0 0 61 0 -16 cm BI /IM true/W 7/H 61/BPC 1/F/CCF/DP<> ID #—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿø€ EI endstream endobj 94 0 obj <> stream 0 0 0 0 50 45 d1 50 0 0 45 0 0 cm BI /IM true/W 50/H 45/BPC 1/F/CCF/DP<> ID #‘¨Ž¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷­§÷Úia¦¸$9 ã®ïÚk´×i¨†a@@ EI endstream endobj 95 0 obj <> stream 0 0 0 -16 30 45 d1 30 0 0 61 0 -16 cm BI /IM true/W 30/H 61/BPC 1/F/CCF/DP<> ID #‘¬¿ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûõºÚá®<ë¿®× vÿÿÿÿÿÀ@ EI endstream endobj 96 0 obj <> stream 28 0 0 0 0 0 d1 endstream endobj 97 0 obj <> stream 24 0 0 0 0 0 d1 endstream endobj 98 0 obj <> stream 0 0 0 1 53 45 d1 53 0 0 44 0 1 cm BI /IM true/W 53/H 44/BPC 1/F/CCF/DP<> ID :Œè?ÿÝ?¯ýÓúäÇÿ“×ß·ÿ__®¾ý¿úúêëÿ÷í¯þéuÿÿmn¿ë¯ûøî¯ÿÕn¿ßÿªoõýð EI endstream endobj 99 0 obj <> stream 0 0 0 0 39 64 d1 39 0 0 64 0 0 cm BI /IM true/W 39/H 64/BPC 1/F/CCF/DP<> ID )Ä‚Nt÷Z!=áÐo][×Þ>ü§ÂOOO]E'§Iéý^¿õzÿÿÿÿÿ_½ý~÷[VÖ±ÈlÖû[ p EI endstream endobj 100 0 obj <> stream 0 0 0 -16 13 62 d1 13 0 0 78 0 -16 cm BI /IM true/W 13/H 78/BPC 1/F/CCF/DP<> ID & Ÿü—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù5ÿÀ@ EI endstream endobj 101 0 obj <> stream 0 0 0 -15 40 47 d1 40 0 0 62 0 -15 cm BI /IM true/W 40/H 62/BPC 1/F/CCF/DP<> ID %Ü €ƒ„éî± A½=&ûë«zÿVõÿÿý&ÿÿÿÿÿÿÿÿýºëÿþßÒþû¥¾ë´­® %cµjÕ¨aH:  EI endstream endobj 102 0 obj <> stream 0 0 0 -15 40 45 d1 40 0 0 60 0 -15 cm BI /IM true/W 40/H 60/BPC 1/F/CCF/DP<> ID <_þÉ$þï»~Þ»vá‡n÷ ØpÝ»Ãvïnû¿Ÿ&ÿþÿ÷ízëmv•µÁ‚V;V­XPÂn  EI endstream endobj 103 0 obj <> stream 0 0 0 -15 40 45 d1 40 0 0 60 0 -15 cm BI /IM true/W 40/H 60/BPC 1/F/CCF/DP<> ID ) ÿÿÿÿüðiü–¤¿íÿ·þßoý¿öûûíÿ·ßß}¿öûûïã½ýýïïï EI endstream endobj 104 0 obj <> stream 0 0 0 -16 19 62 d1 19 0 0 78 0 -16 cm BI /IM true/W 19/H 78/BPC 1/F/CCF/DP<> ID < ÿËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ< ÿ€€ EI endstream endobj 105 0 obj <> stream 0 0 0 -16 33 45 d1 33 0 0 61 0 -16 cm BI /IM true/W 33/H 61/BPC 1/F/CCF/DP<> ID #ƒWÿÈÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ EI endstream endobj 106 0 obj <> stream 0 0 0 -16 39 45 d1 39 0 0 61 0 -16 cm BI /IM true/W 39/H 61/BPC 1/F/CCF/DP<> ID .¿ÿ#ÿÿÿÿÿÿÿù (ÿÿä`ÿÿÿÿÿÿÈjÿÿ€€ EI endstream endobj 107 0 obj <> stream 0 0 0 -16 28 8 d1 28 0 0 24 0 -16 cm BI /IM true/W 28/H 24/BPC 1/F/CCF/DP<> ID $#EM:iþÚ_¶—«¯pƒäœ·°°ÖÿÀ@ EI endstream endobj 108 0 obj <> stream 58 0 0 0 0 0 d1 endstream endobj 109 0 obj <> stream 0 0 0 0 40 46 d1 40 0 0 46 0 0 cm BI /IM true/W 40/H 46/BPC 1/F/CCF/DP<> ID #„ éÓ§O"~‚ éé7ý=oOÿÖéÿÿÿÿÿí+ÿë¾éo¶–Öà cµjÕ« (€ EI endstream endobj 110 0 obj <> stream 0 0 0 60 37 64 d1 37 0 0 4 0 60 cm BI /IM true/W 37/H 4/BPC 1/F/CCF/DP<> ID 0_€€ EI endstream endobj 111 0 obj <> stream 0 0 0 13 51 54 d1 51 0 0 41 0 13 cm BI /IM true/W 51/H 41/BPC 1/F/CCF/DP<> ID >D2!—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß÷ÿ¦·u»]„×$8‘¸®ïê»Mvšˆh0  EI endstream endobj 112 0 obj <> stream 0 0 0 0 35 55 d1 35 0 0 55 0 0 cm BI /IM true/W 35/H 55/BPC 1/F/CCF/DP<> ID 5‹> stream 0 0 0 0 43 54 d1 43 0 0 54 0 0 cm BI /IM true/W 43/H 54/BPC 1/F/CCF/DP<> ID 6E!{k×í¯ýoºúý¿¥û~=_ëß$Õý¯«ûúWÿµ½Jþþ•ýÿº_Çký_ø€ EI endstream endobj 114 0 obj <> stream 0 0 0 0 25 21 d1 25 0 0 21 0 0 cm BI /IM true/W 25/H 21/BPC 1/F/CCF/DP<> ID 'Ïp°ö·­­ë«TàÂY!Ë…‡ÂÃÇÿ€€ EI endstream endobj 115 0 obj <> stream 37 0 0 0 0 0 d1 endstream endobj 116 0 obj <> stream 49 0 0 0 0 0 d1 endstream endobj 117 0 obj <> stream 59 0 0 0 0 0 d1 endstream endobj 118 0 obj <> stream 0 0 0 1 35 54 d1 35 0 0 53 0 1 cm BI /IM true/W 35/H 53/BPC 1/F/CCF/DP<> ID ! ÿÿÿÿç£ÿ“ —}¿öý÷íÿ·þßoý¿öûûïï·ßÇ{ûûûÀ@ EI endstream endobj 119 0 obj <> stream 0 0 0 0 35 55 d1 35 0 0 55 0 0 cm BI /IM true/W 35/H 55/BPC 1/F/CCF/DP<> ID (8AÓ ëO!(è ún“é¿éëû§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ EI endstream endobj 120 0 obj <> stream 29 0 0 0 0 0 d1 endstream endobj 121 0 obj <> stream 0 0 0 0 34 54 d1 34 0 0 54 0 0 cm BI /IM true/W 34/H 54/BPC 1/F/CCF/DP<> ID >GAé¥þ—ú_ézë믮»­®ë¾²Cývûöû~û}¾ý¿}¾ßo¿¾?ÿÿÿÿà EI endstream endobj 122 0 obj <> stream 0 0 0 -1 49 55 d1 49 0 0 56 0 -1 cm BI /IM true/W 49/H 56/BPC 1/F/CCF/DP<> ID %ÃÁ á:téÑ w„¤MÒ}7Kíë«ûÓÿõôßÿÿÿÿÿÚWÿý¯«®þ•¿imm¥l.JÅZµjÔ0 Â€€ EI endstream endobj 123 0 obj <> stream 48 0 0 0 0 0 d1 endstream endobj 124 0 obj <> stream 0 0 0 0 64 102 d1 64 0 0 102 0 0 cm BI /IM true/W 64/H 102/BPC 1/F/CCF/DP<> ID 8ÿÿÿü_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð EI endstream endobj 125 0 obj <> stream 0 0 0 25 65 104 d1 65 0 0 79 0 25 cm BI /IM true/W 65/H 79/BPC 1/F/CCF/DP<> ID #Aå g‚:pƒ§N=ÖžëO Þ|zA½t›ÓÿOQúþºÿäMÿÿä'µþ¯ÿkÿV×û[imv•† Ž×µkÚµjÕ¨j†Pd8@ EI endstream endobj 126 0 obj <> stream 63 0 0 0 0 0 d1 endstream endobj 127 0 obj <> stream 0 0 0 27 67 102 d1 67 0 0 75 0 27 cm BI /IM true/W 67/H 75/BPC 1/F/CCF/DP<> ID &Šï×î¿~»õûõÞAÇ×ÿn—ÿ}é~ÿ_¾®¿ûzëûïKÿ¾õõ«û×_ý½uý÷¯¯ßzú¿Õýë¯þßé~÷ EI endstream endobj 128 0 obj <> stream 64 0 0 0 0 0 d1 endstream endobj 129 0 obj <> stream 65 0 0 0 0 0 d1 endstream endobj 130 0 obj <> stream 0 0 0 0 20 102 d1 20 0 0 102 0 0 cm BI /IM true/W 20/H 102/BPC 1/F/CCF/DP<> ID 6 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà EI endstream endobj 131 0 obj <> stream 72 0 0 0 0 0 d1 endstream endobj 132 0 obj <> stream 0 0 0 1 40 102 d1 40 0 0 101 0 1 cm BI /IM true/W 40/H 101/BPC 1/F/CCF/DP<> ID *ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóa©ÿÿÿ”iÔ ¸w}ßß÷À@ EI endstream endobj 133 0 obj <> stream 0 0 0 29 24 102 d1 24 0 0 73 0 29 cm BI /IM true/W 24/H 73/BPC 1/F/CCF/DP<> ID <ÿÿÿÿ•¿ÿÿÿç€ÿÿÿÿð EI endstream endobj 134 0 obj <> stream 0 0 0 -3 69 105 d1 69 0 0 108 0 -3 cm BI /IM true/W 69/H 108/BPC 1/F/CCF/DP<> ID #BJ°Ù%Ã28 éÂ:téÓ§éú!™ï ¢­ á='Ó}ôô¿öëÿúüuÕT% ‚Ș5Áe 6A(,„¡a*T¨*T…@°TCY$A¤MÁ`°T°¾¾¹úÿÿ뺿×~×¥mp× %d w}_V­Z½…jÔ0¡… (0R$@ EI endstream endobj 135 0 obj <> stream 71 0 0 0 0 0 d1 endstream endobj 136 0 obj <> stream 0 0 0 -1 20 102 d1 20 0 0 103 0 -1 cm BI /IM true/W 20/H 103/BPC 1/F/CCF/DP<> ID 6 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÍ‚ÿÿÿÿø€ EI endstream endobj 137 0 obj <> stream 77 0 0 0 0 0 d1 endstream endobj 138 0 obj <> stream 0 0 0 27 60 102 d1 60 0 0 75 0 27 cm BI /IM true/W 60/H 75/BPC 1/F/CCF/DP<> ID <ÿÿÿ²ÞÞíßvíßvïovï»vï»w·»w·»wÝ»ÛÝ»ÛÝ»ÍKÿÿÿÿÿð EI endstream endobj 139 0 obj <> stream 0 0 0 53 39 71 d1 39 0 0 18 0 53 cm BI /IM true/W 39/H 18/BPC 1/F/CCF/DP<> ID > _ÿÿÿø€ EI endstream endobj 140 0 obj <> stream 0 0 0 0 21 102 d1 21 0 0 102 0 0 cm BI /IM true/W 21/H 102/BPC 1/F/CCF/DP<> ID 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà EI endstream endobj 141 0 obj <> stream 0 0 0 25 59 102 d1 59 0 0 77 0 25 cm BI /IM true/W 59/H 77/BPC 1/F/CCF/DP<> ID 0 •¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿö¿}¯Ã[KúùÇ_íwõÚív»\0¢P`  EI endstream endobj 142 0 obj <> stream 32 0 0 0 0 0 d1 endstream endobj 143 0 obj <> stream 0 0 0 0 60 104 d1 60 0 0 104 0 0 cm BI /IM true/W 60/H 104/BPC 1/F/CCF/DP<> ID %ÂA„˜.zzzzzéèzë¢ ?:AééÒé÷­_ëýýzÿÿÿÿ×ÿþÿuûÿ[ÝoµÕ†¶V=÷Ù AïµÖÖøkaa¬0°`±ÿÿÿÿÿÿÀ@ EI endstream endobj 144 0 obj <> stream 0 0 0 25 63 131 d1 63 0 0 106 0 25 cm BI /IM true/W 63/H 106/BPC 1/F/CCF/DP<> ID 0 ÿÿÿÿÿÿÿÿÿÿÈa8 | øAôú}?}>Ÿ¼{ûù ¯xAð›ÓéûzûëíÿOÿÿW¿ÿÿÿÿÿÿý¯õþ»ÿµõµþ×ia…à ŠúúÈ.?×kµþ×k°»]…ƒ EI endstream endobj 145 0 obj <> stream 73 0 0 0 0 0 d1 endstream endobj 146 0 obj <> stream 0 0 0 6 40 103 d1 40 0 0 97 0 6 cm BI /IM true/W 40/H 97/BPC 1/F/CCF/DP<> ID *pPª«¯¯ü­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüàiÿÿÿç@_ÿÿÿÿÿÿÿà EI endstream endobj 147 0 obj <> stream 0 0 0 0 64 102 d1 64 0 0 102 0 0 cm BI /IM true/W 64/H 102/BPC 1/F/CCF/DP<> ID 8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8Ïÿÿÿÿÿÿ AWÿÿÿÿÿÿÿÿ Vkÿÿÿÿ€€ EI endstream endobj 148 0 obj <> stream 79 0 0 0 0 0 d1 endstream endobj 149 0 obj <> stream 0 0 0 25 63 104 d1 63 0 0 79 0 25 cm BI /IM true/W 63/H 79/BPC 1/F/CCF/DP<> ID $ÂÈ0Ït'N:téÓôéú _ÞOI½=&ôÿÓÖÿ§ÿý¤ÿÿÿÿÿÿÿö¯_þþ·­¯ö¶ë®[i`ÁlWµ}Zµ{V¬+V¡… (0¤˜x€ EI endstream endobj 150 0 obj <> stream 0 0 0 0 76 102 d1 76 0 0 102 0 0 cm BI /IM true/W 76/H 102/BPC 1/F/CCF/DP<> ID 8Yepðð÷‡½ï{ûÞA‚þáû}û}ûûïþßûÿßÿßÿÿÿoÿÿÿÿÿÿÿÿÿ^¿ÿÿ¯ý¯ú_ëþ—^½.¼%Áq_ZúÖµ­k X,,†Ù€ EI endstream endobj 151 0 obj <> stream 0 0 0 25 57 104 d1 57 0 0 79 0 25 cm BI /IM true/W 57/H 79/BPC 1/F/CCF/DP<> ID :‚2€a¡=:ßN©®ê‡ëò;„Iô¾Ÿýûÿýÿ¾ÿ÷ï°ü?Ù Ïàû±ûÞððyR¬3dhH g½ï#‚ýÿïÿ]û[k† Š¿Õí{V­Zµ + )  EI endstream endobj 152 0 obj <> stream 84 0 0 0 0 0 d1 endstream endobj 153 0 obj <> stream 57 0 0 0 0 0 d1 endstream endobj 154 0 obj <> stream 0 0 0 1 57 105 d1 57 0 0 104 0 1 cm BI /IM true/W 57/H 104/BPC 1/F/CCF/DP<> ID *Ç"x@á:téÓ§]ÓôýÙo‚~Þž—Ûþž¿½}ÿ_þÿý}ÿúþÿÿÿÿÿÿÿÿÿÿÿÿ«ÿþ×ÿÿ¯ßþ××ïíÒ·ízØia‚⯫ÚÕíZµjÔ0¬(0¥Xà EI endstream endobj 155 0 obj <> stream 0 0 0 -3 79 105 d1 79 0 0 108 0 -3 cm BI /IM true/W 79/H 108/BPC 1/F/CCF/DP<> ID "£0Ï Î éè<&«§§§Þž†º ÑÙ ­( ðƒ ž'§W§­^½ë_zý^¿ü¨ ?ô¿ÿÿÿÿÿÿÊXoÿ»ÿþýþù(·õßkêÚío[[k†•°»JÁ…È4b±Úµ«ÚµjÔ0­C Ô0 ÁA‚‘q` EI endstream endobj 156 0 obj <> stream 90 0 0 0 0 0 d1 endstream endobj 157 0 obj <> stream 0 0 0 0 63 104 d1 63 0 0 104 0 0 cm BI /IM true/W 63/H 104/BPC 1/F/CCF/DP<> ID #a Ìá§Óéôýôñ!•ï>z}?oO¯ý½}ÿ¯þ÷ÿúÿÿþÿÿý~ëÿë¿®ë®ý®ÒØ\\W××È.:õÚïÚívk°¸ap`¸ÿÿÿÿÿÿÿÿÿÀ@ EI endstream endobj 158 0 obj <> stream 56 0 0 0 0 0 d1 endstream endobj 159 0 obj <> stream 0 0 0 0 85 102 d1 85 0 0 102 0 0 cm BI /IM true/W 85/H 102/BPC 1/F/CCF/DP<> ID <ÉXë÷º_þêëý÷®¿Ý_ë¾õþ¶+ÿkû_û_ÚþÈ0_ºÿî–ÿÞºïýë®û×_ï½ußzÿ[¯õ·_ý×uÿÝ-ÿ¿Šþ×÷×¾¿µýõý¯ï¨€ EI endstream endobj 160 0 obj <> stream 89 0 0 0 0 0 d1 endstream endobj 161 0 obj <> stream 0 0 0 25 39 102 d1 39 0 0 77 0 25 cm BI /IM true/W 39/H 77/BPC 1/F/CCF/DP<> ID 0 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûûÞ÷‡ƒÈjÿò ýÿßß}Ä88€ EI endstream endobj 162 0 obj <> stream 92 0 0 0 0 0 d1 endstream endobj 163 0 obj <> stream 0 0 0 1 63 102 d1 63 0 0 101 0 1 cm BI /IM true/W 63/H 101/BPC 1/F/CCF/DP<> ID >þÿûþÈ)îß·»v÷nÞ»víÛ·aÛ·nÝ»víÛ‡·nöïnû½íûûïs0_ÿÿÿÿm­¯ö·Kk†Á‚Xõ}^Ö¯jÕ« Ô0¡… FÊ  EI endstream endobj 164 0 obj <> stream 76 0 0 0 0 0 d1 endstream endobj 165 0 obj <> stream 0 0 0 0 85 102 d1 85 0 0 102 0 0 cm BI /IM true/W 85/H 102/BPC 1/F/CCF/DP<> ID 6 šƒP/¯ÿýÿÿ¯ÿÿëÿßÿÿëÿßÿ!Çúÿÿ·ÿÿõúÿ·ÿÿõúÿÿ·ÿõÿúÿ·ÿõÿúÿßïÿõÿúÿ·ÿõÿúÿ·ÿõÿÿúßïÿõÿúÿ·ÿõÿÿúßïõÿÿúßïÿõÿÿñ±ýÿ½ÿ½ÿû€€ EI endstream endobj 166 0 obj <> stream 97 0 0 0 0 0 d1 endstream endobj 167 0 obj <> stream 0 0 0 25 60 133 d1 60 0 0 108 0 25 cm BI /IM true/W 60/H 108/BPC 1/F/CCF/DP<> ID *$`7‚:téÓ§N»®è‚Šp¼'ÓÕ½?ÿûßò &xO éééëÞººè‚§Iééý'úÿ^Ÿÿÿÿÿÿÿí}ÿÖÿµu¿[VÖÖ+ûÈj}¯ÚÚÚß -¬D˜n @ EI endstream endobj 168 0 obj <> stream 0 0 0 0 73 102 d1 73 0 0 102 0 0 cm BI /IM true/W 73/H 102/BPC 1/F/CCF/DP<> ID #@Gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþx¿ÿÿÿð EI endstream endobj 169 0 obj <> stream 95 0 0 0 0 0 d1 endstream endobj 170 0 obj <> stream 0 0 0 25 56 104 d1 56 0 0 79 0 25 cm BI /IM true/W 56/H 79/BPC 1/F/CCF/DP<> ID !Êpo á ÐtëNžëOäŸAðƒë¤ýºÿÿQ¨()&² å8jÂÁ*ÂU¥J‚¥…KA`²  £X-ar Ò_ÿúÛúXapÂØ¯í{V­ZµjÔ0 ÁIpH€ EI endstream endobj 171 0 obj <> stream 0 0 0 0 79 102 d1 79 0 0 102 0 0 cm BI /IM true/W 79/H 102/BPC 1/F/CCF/DP<> ID "`ÇÝÝ~ëþëþë÷_÷\†î¿õöëÿún¿ýÒÿÝ/¿¿×Óû¯ý7úÿÓ¯ÿtŸþÿIÿßëÿMþ¿ôÝûÓ×ÿ¾ô¿¯§÷úú¯Û­p EI endstream endobj 172 0 obj <> stream 85 0 0 0 0 0 d1 endstream endobj 173 0 obj <> stream 0 0 0 0 45 72 d1 45 0 0 72 0 0 cm BI /IM true/W 45/H 72/BPC 1/F/CCF/DP<> ID )ÂN€D pN:!tCë Ò}7KÓûIþ¿ÿÿÒ­a(X% ÃD@Ä„¡@¨Ø1È`š……KëòLÿÿußÒßuÚV× %`ÁlV­Z†¬(aJq  EI endstream endobj 174 0 obj <> stream 0 0 0 7 25 71 d1 25 0 0 64 0 7 cm BI /IM true/W 25/H 64/BPC 1/F/CCF/DP<> ID 5"Õuבz¿ÿÿÿÿÿÿÿÿÿÿÿüðgÿòÿÿÿÿÿ€€ EI endstream endobj 175 0 obj <> stream 0 0 0 19 23 70 d1 23 0 0 51 0 19 cm BI /IM true/W 23/H 51/BPC 1/F/CCF/DP<> ID 0?ÿÿÿÿÿÿÿÿÿÿÿýÿ¿½ïyä9¯ï¿ï¸‡ Ѐ EI endstream endobj 176 0 obj <> stream 0 0 0 21 35 71 d1 35 0 0 50 0 21 cm BI /IM true/W 35/H 50/BPC 1/F/CCF/DP<> ID ' 3ăÓ×O½“ôéÒÞ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ EI endstream endobj 177 0 obj <> stream 0 0 0 20 42 71 d1 42 0 0 51 0 20 cm BI /IM true/W 42/H 51/BPC 1/F/CCF/DP<> ID "ÂtéÓ­“zI½u}7ú_~‘Hÿÿÿÿÿoò0~ß×[~Öõµ°ÂØ­^Ô5aA… EI endstream endobj 178 0 obj <> stream 0 0 0 20 37 71 d1 37 0 0 51 0 20 cm BI /IM true/W 37/H 51/BPC 1/F/CCF/DP<> ID !‡„ éÓ§NˆJt¤ún“ÿM××Çúý|†©¯ÿÈÂ[¯ÿ¯íþ¶·]ÕµÚV[íZ†¬(0  EI endstream endobj 179 0 obj <> stream 0 0 0 40 19 48 d1 19 0 0 8 0 40 cm BI /IM true/W 19/H 8/BPC 1/F/CCF/DP<> ID &¡Ÿÿð EI endstream endobj 180 0 obj <> stream 0 0 0 2 55 70 d1 55 0 0 68 0 2 cm BI /IM true/W 55/H 68/BPC 1/F/CCF/DP<> ID <)Ûõêþþ•ýÿº_ßÒ¿¿Õ×øíkÿdu¯ïº_ßt¿ûKûî—÷Þºþßë­¿×]÷ýu±ëß^ÿ^ð EI endstream endobj 181 0 obj <> stream 0 0 0 20 38 71 d1 38 0 0 51 0 20 cm BI /IM true/W 38/H 51/BPC 1/F/CCF/DP<> ID 3C(@Âiéªzkz"PHîƒè=_Oþÿïÿï¿¿}ƒò Ód4^Áö8xy 6H€yV%ïåËÿ÷þë¿il-V­Z†0  EI endstream endobj 182 0 obj <> stream 0 0 0 21 43 90 d1 43 0 0 69 0 21 cm BI /IM true/W 43/H 69/BPC 1/F/CCF/DP<> ID '{ûùXâ÷ß·ý¿ïºý×ï×y!õýë«ûþº¿½u¥öÿúWßõôßëêûþ¾¯½zzþõ÷¯ì@ EI endstream endobj 183 0 obj <> stream 0 0 0 20 37 71 d1 37 0 0 51 0 20 cm BI /IM true/W 37/H 51/BPC 1/F/CCF/DP<> ID !…„ Ó§O!?Aôô›ÓÖôÿ¤ßÿúMÿÿÿÿÿÿ¶—ÿý­ëkûimm¥m,v­Zµ (a@@ EI endstream endobj 184 0 obj <> stream 68 0 0 0 0 0 d1 endstream endobj 185 0 obj <> stream 0 0 0 1 25 70 d1 25 0 0 69 0 1 cm BI /IM true/W 25/H 69/BPC 1/F/CCF/DP<> ID $ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÿ$ÿÿÿïì+»¸p EI endstream endobj 186 0 obj <> stream 0 0 0 0 41 51 d1 41 0 0 51 0 0 cm BI /IM true/W 41/H 51/BPC 1/F/CCF/DP<> ID )ÃÁ á:{­‡xA½=_W¿×ëŠáBP²‚PJ„A`¨ƒ×Aa}sXÿë®û®ÒÚØíjÔ5j(€ EI endstream endobj 187 0 obj <> stream 0 0 0 -18 9 50 d1 9 0 0 68 0 -18 cm BI /IM true/W 9/H 68/BPC 1/F/CCF/DP<> ID .?ÿÿÿÿÿÿÿÿÿÿÿó@ßþ\ÿà EI endstream endobj 188 0 obj <> stream 0 0 0 1 41 50 d1 41 0 0 49 0 1 cm BI /IM true/W 41/H 49/BPC 1/F/CCF/DP<> ID >_þÈŠvíûvï»wÝ»îÝ÷nö÷{{·}Û¾íßs@jÿð EI endstream endobj 189 0 obj <> stream 0 0 0 20 35 70 d1 35 0 0 50 0 20 cm BI /IM true/W 35/H 50/BPC 1/F/CCF/DP<> ID .20ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿß­ýmv¸k‘Ž+¿®×kµ€€ EI endstream endobj 190 0 obj <> stream 0 0 0 77 48 82 d1 48 0 0 5 0 77 cm BI /IM true/W 48/H 5/BPC 1/F/CCF/DP<> ID 8à EI endstream endobj 191 0 obj <> stream 0 0 0 2 9 70 d1 9 0 0 68 0 2 cm BI /IM true/W 9/H 68/BPC 1/F/CCF/DP<> ID .?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ@ EI endstream endobj 192 0 obj <> stream 0 0 0 0 56 50 d1 56 0 0 50 0 0 cm BI /IM true/W 56/H 50/BPC 1/F/CCF/DP<> ID .3XÍCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿ¾ÿûM{íRÝûA®F8‘G÷í5Ú®Ðk´ÔCA… EI endstream endobj xref 0 194 0000000000 65535 f 0000009172 00000 n 0000009113 00000 n 0000006169 00000 n 0000000015 00000 n 0000006149 00000 n 0000009310 00000 n 0000006324 00000 n 0000010547 00000 n 0000010726 00000 n 0000010923 00000 n 0000010987 00000 n 0000011164 00000 n 0000011228 00000 n 0000011427 00000 n 0000011605 00000 n 0000011669 00000 n 0000011854 00000 n 0000012063 00000 n 0000012229 00000 n 0000012293 00000 n 0000012357 00000 n 0000012552 00000 n 0000012749 00000 n 0000012945 00000 n 0000013114 00000 n 0000013328 00000 n 0000013515 00000 n 0000013719 00000 n 0000013907 00000 n 0000014069 00000 n 0000014243 00000 n 0000014442 00000 n 0000014506 00000 n 0000014678 00000 n 0000014742 00000 n 0000014940 00000 n 0000015004 00000 n 0000015225 00000 n 0000015289 00000 n 0000015353 00000 n 0000015538 00000 n 0000015740 00000 n 0000015949 00000 n 0000016164 00000 n 0000016353 00000 n 0000016534 00000 n 0000016732 00000 n 0000016931 00000 n 0000017141 00000 n 0000017314 00000 n 0000017493 00000 n 0000017557 00000 n 0000017621 00000 n 0000017832 00000 n 0000017896 00000 n 0000018098 00000 n 0000018162 00000 n 0000018226 00000 n 0000018408 00000 n 0000018597 00000 n 0000018786 00000 n 0000018961 00000 n 0000019025 00000 n 0000019204 00000 n 0000019408 00000 n 0000019592 00000 n 0000019770 00000 n 0000019834 00000 n 0000020018 00000 n 0000020214 00000 n 0000020421 00000 n 0000020485 00000 n 0000020685 00000 n 0000020875 00000 n 0000021045 00000 n 0000021284 00000 n 0000021490 00000 n 0000021554 00000 n 0000021740 00000 n 0000021926 00000 n 0000022107 00000 n 0000022284 00000 n 0000022348 00000 n 0000022503 00000 n 0000022708 00000 n 0000022772 00000 n 0000022983 00000 n 0000023193 00000 n 0000023257 00000 n 0000023442 00000 n 0000023650 00000 n 0000023853 00000 n 0000024021 00000 n 0000024189 00000 n 0000024395 00000 n 0000024591 00000 n 0000024655 00000 n 0000024719 00000 n 0000024932 00000 n 0000025150 00000 n 0000025340 00000 n 0000025557 00000 n 0000025768 00000 n 0000025968 00000 n 0000026149 00000 n 0000026331 00000 n 0000026520 00000 n 0000026706 00000 n 0000026771 00000 n 0000026971 00000 n 0000027127 00000 n 0000027331 00000 n 0000027533 00000 n 0000027733 00000 n 0000027913 00000 n 0000027978 00000 n 0000028043 00000 n 0000028108 00000 n 0000028300 00000 n 0000028493 00000 n 0000028558 00000 n 0000028757 00000 n 0000028973 00000 n 0000029038 00000 n 0000029234 00000 n 0000029468 00000 n 0000029533 00000 n 0000029751 00000 n 0000029816 00000 n 0000029881 00000 n 0000030064 00000 n 0000030129 00000 n 0000030322 00000 n 0000030498 00000 n 0000030785 00000 n 0000030850 00000 n 0000031038 00000 n 0000031103 00000 n 0000031307 00000 n 0000031468 00000 n 0000031651 00000 n 0000031865 00000 n 0000031930 00000 n 0000032167 00000 n 0000032416 00000 n 0000032481 00000 n 0000032679 00000 n 0000032880 00000 n 0000032945 00000 n 0000033182 00000 n 0000033421 00000 n 0000033672 00000 n 0000033737 00000 n 0000033802 00000 n 0000034051 00000 n 0000034326 00000 n 0000034391 00000 n 0000034638 00000 n 0000034703 00000 n 0000034941 00000 n 0000035006 00000 n 0000035204 00000 n 0000035269 00000 n 0000035506 00000 n 0000035571 00000 n 0000035838 00000 n 0000035903 00000 n 0000036166 00000 n 0000036362 00000 n 0000036427 00000 n 0000036679 00000 n 0000036918 00000 n 0000036983 00000 n 0000037226 00000 n 0000037411 00000 n 0000037595 00000 n 0000037786 00000 n 0000037991 00000 n 0000038199 00000 n 0000038356 00000 n 0000038568 00000 n 0000038789 00000 n 0000039000 00000 n 0000039207 00000 n 0000039272 00000 n 0000039457 00000 n 0000039669 00000 n 0000039842 00000 n 0000040029 00000 n 0000040222 00000 n 0000040378 00000 n 0000040545 00000 n 0000009221 00000 n trailer << /Size 194 /Root 1 0 R /Info 193 0 R >> startxref 40756 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlineproblems3.pdf0000664000175000017500000060045611742726711024274 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ3Ð3T0A(œËU„æ†`QsS©k g††f úAf .ù\@ˆâ jendstream endobj 5 0 obj 52 endobj 3 0 obj << /Type /Page /MediaBox [0 0 871 75] /Parent 2 0 R /Resources << /ProcSet [/PDF /ImageC] /XObject<> >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 8 0 obj << /CreationDate (D:20010110083137) /Producer (GNU Ghostscript 5.10) >> endobj 6 0 obj << /Type /XObject /Name /R6 /Subtype /Image /Length 7 0 R /ColorSpace /DeviceRGB/Width 871/Height 75/BitsPerComponent 8 >> stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ endstream endobj 7 0 obj 195976 endobj xref 0 9 0000000000 65535 f 0000000363 00000 n 0000000304 00000 n 0000000155 00000 n 0000000015 00000 n 0000000137 00000 n 0000000499 00000 n 0000196630 00000 n 0000000412 00000 n trailer << /Size 9 /Root 1 0 R /Info 8 0 R >> startxref 196652 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/concatglyphs.eps0000664000175000017500000044215711742726711023504 0ustar uwabamiuwabami%!PS-Adobe-3.0 EPSF-3.0 %%Creator: tiff2ps %%Title: concatglyphs.tif %%CreationDate: Wed May 5 18:26:15 1999 %%DocumentData: Clean7Bit %%Origin: 0 0 %%BoundingBox: 0 0 177 137 %%LanguageLevel: 1 %%Pages: (atend) %%EndComments %%BeginSetup %%EndSetup %%Page: 1 1 gsave 100 dict begin 177.000000 137.000000 scale /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def /colorimage where {pop} { /colorimage {pop pop /rgbproc exch def {bwproc} image} bind def } ifelse %ImageData: 177 137 8 3 0 1 2 "false 3 colorimage" /line 531 string def 177 137 8 [177 0 0 -137 0 137] {currentfile line readhexstring pop} bind false 3 colorimage ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffff000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000ffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff end grestore showpage %%Trailer %%Pages: 1 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/0000775000175000017500000000000011742726711021472 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/t1dump_t_1.pdf0000664000175000017500000000337511742726711024152 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœÝX9®1Íû>å}91"¢AHHt@Äõ©òZ®Þ†ô×F~ó^¹¼ÔâQR …ÿÛçkßþlZüÚ´MÒ‡(Lò2j'öXe¤IFh㥶^X]ZµïÛøµe-sNv  ÄB÷9^Û@B–ÚÑ-¿ÎÑǯ­{1Ýïf¯ãµýüÐkû&ŒÂ¿ïp˜?6'þnÃîXmN€X v£–Ö‰ßÛW8óO Õ ÿªV–3©Ö$éRѪ¢3rìoR^·¨ÎgäLÔ:0·JWˆp悸SŒ25>\¼ui!%¡µ‹G "+&¤£K+‡ì.5}2'Ú¹ Ž_Ê?/¬ƒ_Œ3U6æ,S¸Û,Æ$Úä \ÀªeØôž²®îÕT%˜VÓ§nb¤&eá¸EË1d™ „uRJÚóëÎ9ûs¬éþÉ`E0±žsÐRCvQA&ûk˽nvseî[À VI¾A‡*¶O$€'ê< 8‡¨ógRí SŽí-…ÛìÁ9û泓&¼‘<‘(炯¥S÷Ƀs¦*£9_#‚cÔ¶—YAÆÖX.¼€È—JaFÇ8ˆc\nÃ`×btÒU†Û \+- âm\çÕ Ãöh«áó6†“jÜõh ܇7),¬cÎ[9¸:.êÕö¹_Œ‰Z {µÎÈ1Êš+?øÅ8D¥TI2‹í†M–ÇrŽëò.Èà…k·XÛXN³ë ¯XÉ‘we¨Z~L!€Õ8Æ9aªÉÕ ÃHnŒ_Î<ï °!ÔâËUq¿—~b­È‰®ädÅ ]OeÅŽ1‰ö&h9gªú–•É0ÂRuÑŠ YU)#¬†ŸGÚÇôH+æñ0‚N2»h, p”>Z“ã~•ІíyZƤE´ #,¡h]ÄÆB驿ªuZˆDI}JÏÓÑóc"9¬¤!=åUÛ+6YÁz™`Ò}J€H(ÅÊŒÜÇ4#w Œ@u—> $XXžÆã‡xCš9¶är˘DKb‡c½ü™…u(mŒ³ÏÃc\r&ÑÒ51 XX¹ïׇ¨HSsácÒ5-ÃðX¡ƒã„c…M¹hÚº=•¥sxà‰Q› “D¸‘ÖB’qŒ™ÏÔ–Zõëv3gƒKúnŽ?oçé÷¤Ñîôû÷ÅA5áØÌœ”u••ªç—gR-fL³dôŽÑ§Ñd]>Z‡j>ϦêáÑz¢%kbæÞ€Wåþ1Æ8Dõ\æ“>ĉ–a„u“78‡ìòs=gÌó^à¼ý¸nÎ.íÇQל ÍÀGþeèC¯í½ß¸ÌiÿúŸ1qÑïýó^6½Êý‘þº’ð°Ø`"B+=®Hð÷:/{K¶'EÛŽfB/,ŽMÖò.f±•±P'x\˜0¥Yγ k㥠k&B[Ç¡jd€ºë}ã>ï‹4›Ó—7[Òÿk¦—7ãŠM–Ç̇¥}é„-Ýä|_Ôáò¼¨¹AèÔpŠ$ÖÜV‰\þŽŸÇÉçítw¯ôendstream endobj 5 0 obj 1153 endobj 3 0 obj << /Type /Page /MediaBox [0 0 280 400] /Parent 2 0 R /Resources << /ProcSet [/PDF] >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 6 0 obj << /CreationDate (D:20030302172820) /Producer (GNU Ghostscript 5.50) >> endobj xref 0 7 0000000000 65535 f 0000001437 00000 n 0000001378 00000 n 0000001258 00000 n 0000000015 00000 n 0000001238 00000 n 0000001486 00000 n trailer << /Size 7 /Root 1 0 R /Info 6 0 R >> startxref 1573 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/t1dump_t_1.eps0000664000175000017500000005265311742726711024173 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-1.2 %%Creator: t1lib (edited manually by RMz, 2003-01-15) %%Title: Type1Char Character Dump %%Pages: 1 %%PageOrder: Ascend %%BoundingBox: 0 0 280 400 %%DocumentPaperSizes: a4 %%EndComments %! /T1LibDict 100 dict def T1LibDict begin % Setup the size from the type1 module /t1SetupSize { /size exch def } def % Prepare the page. Compute scales and fill the charspace unit square % background /t1PreparePage { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Start of Customizable Section % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Setup a standard linewidth /t1dumpstdlinewidth 1.0 def % Setup a scale for drawing direction arrows /arrowscale 3.0 def % Should we draw the device pixel grid? (1=yes, otherwise no) /t1drawgrid 0 def % Should we draw stems? (1=yes, otherwise no) /t1drawstems 0 def % Should we draw alignment zones? (1=yes, otherwise no) /t1drawzones 0 def % Should we fill the charspace unit square? (1=yes, otherwise no) /t1fillunitsquare 0 def % Should we fill the device page? (1=yes, otherwise no) /t1fillpage 0 def % Should we show path segment On-Curve points? (1=yes, otherwise no) /t1showoncurvepoints 0 def % Should we show path segment Off Curve points? (1=yes, otherwise no) /t1showoffcurvepoints 0 def % Should we show Bezier tangets and their defining points? (1=yes, otherwise no) /t1showbeziertangents 0 def % Define a few colors /t1linecolor { 0.0 0.0 0.0 } def /t1hlinecolor { 1.0 0.0 0.0 } def /t1slinecolor { 0.0 0.0 0.0 } def /t1movecolor { 0.0 0.0 0.0 } def /t1hmovecolor { 0.0 0.0 0.0 } def /t1smovecolor { 0.0 0.0 0.0 } def /t1curvecolor { 0.0 0.0 0.0 } def /t1hcurvecolor { 1.0 0.0 0.0 } def /t1scurvecolor { 0.0 0.0 0.0 } def /t1sprolongatecolor { 1.0 1.0 1.0 } def /t1stemcolor { 0.0 0.0 1.0 } def /t1alignedstemcolor { 1.0 0.0 1.0 } def /t1bottomzonecolor { 1.0 1.0 0.0 } def /t1topzonecolor { 1.0 1.0 0.0 } def /t1arrowcolor { 0.0 0.0 0.0 } def /t1harrowcolor { 1.0 0.0 0.0 } def /t1sarrowcolor { 0.0 0.0 1.0 } def /t1sbwcolor { 0.0 0.0 0.0 } def /t1closepathcolor { 0.0 0.0 0.0 } def /t1hclosepathcolor { 1.0 0.0 0.0 } def /t1sclosepathcolor { 0.0 0.0 1.0 } def /t1pagecolor { 0.7 0.7 0.7 } def /t1unitsquarecolor { 0.4 0.4 0.4 } def /t1gridcolor { 0.0 0.0 0.0 } def % Line scale relative to the standard linewidth /t1linescale 1.2 def /t1hlinescale 0.4 def /t1slinescale 0.4 def /t1movescale 0.4 def /t1hmovescale 0.4 def /t1smovescale 0.4 def /t1curvescale 1.2 def /t1hcurvescale 0.4 def /t1scurvescale 0.4 def /t1curvetangentscale 0.5 def /t1sprolongatescale 0.0 def /t1stemscale 0.5 def /t1alignedstemscale 0.5 def /t1bottomzonescale 0.5 def /t1topzonescale 0.5 def /t1closepathscale 0.8 def /t1hclosepathscale 0.4 def /t1sclosepathscale 0.4 def /t1gridscale 0.5 def % Line dash specifications (stems and zones are not configurable!) /t1linedash { [2 2] 0 } def /t1hlinedash { [] 0 } def /t1slinedash { [] 0 } def /t1movedash { [2 2] 0 } def /t1hmovedash { [2 2] 0 } def /t1smovedash { [2 2] 0 } def /t1curvedash { [2 2] 0 } def /t1hcurvedash { [] 0 } def /t1scurvedash { [] 0 } def /t1sprolongatedash { [1 1] 0 }def /t1closepathdash { [2 2] 0 } def /t1hclosepathdash { [] 0 } def /t1sclosepathdash { [] 0 } def /t1griddash { [3 3] 0 } def % Define a clipping rectangle ROI (in charspace coordinates) /t1ROIxmin 0 def /t1ROIxmax 300 def /t1ROIymin -50 def /t1ROIymax 650 def % Device values (in bp). These must match the Bounding Box Statement! /xmindev 0 neg def /xmaxdev 280 def /ymindev 0 neg def /ymaxdev 400 def /dxdev 1 def /dydev 1 def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % End of Customizable Section % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % logical pixel values /xminpixel t1ROIxmin 1000.0 div size mul def /xmaxpixel t1ROIxmax 1000.0 div size mul def /yminpixel t1ROIymin 1000.0 div size mul def /ymaxpixel t1ROIymax 1000.0 div size mul def /dxpixel 1 def /dypixel 1 def % compute scales and set minimum scale /scalex xmaxdev xmindev sub xmaxpixel xminpixel sub div def /scaley ymaxdev ymindev sub ymaxpixel yminpixel sub div def scalex scaley gt { /scale scaley def } { /scale scalex def } ifelse % Fill device page xmindev ymindev moveto xmaxdev 0 rlineto 0 ymaxdev rlineto xmaxdev neg 0 rlineto 0 ymaxdev neg rlineto closepath clip t1fillpage 1 eq { t1pagecolor setrgbcolor fill } if % reassign device values /xmindev xminpixel scale mul def /xmaxdev xmaxpixel scale mul def /ymindev yminpixel scale mul def /ymaxdev ymaxpixel scale mul def /dxdev dxpixel scale mul def /dydev dypixel scale mul def % translate coordinate system xminpixel scale mul neg yminpixel scale mul neg translate % Fill unit square of charspace coordinate system t1fillunitsquare 1 eq { t1unitsquarecolor setrgbcolor 0 0 moveto size scale mul 0 rlineto 0 size scale mul rlineto size scale mul neg 0 rlineto 0 size scale mul neg rlineto closepath fill } if } def /t1FinishPage { t1drawgrid 1 eq { t1gridcolor setrgbcolor t1gridscale setlinewidth t1griddash setdash % draw grid and align to the point (0,0) 0 dxdev xmaxdev { /xval exch def xval ymindev moveto xval ymaxdev lineto stroke } for 0 dxdev neg xmindev { /xval exch def xval ymindev moveto xval ymaxdev lineto stroke } for 0 dydev ymaxdev { /yval exch def xmindev yval moveto xmaxdev yval lineto stroke } for 0 dydev neg ymindev { /yval exch def xmindev yval moveto xmaxdev yval lineto stroke } for } if } def % Define three arrow routines available for later providing the output with directions /t1arrowhead { /tmpy exch def /tmpx exch def gsave t1arrowcolor setrgbcolor currx curry translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1harrowhead { /tmpy exch def /tmpx exch def gsave t1harrowcolor setrgbcolor currhx currhy translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1sarrowhead { /tmpy exch def /tmpx exch def gsave t1sarrowcolor setrgbcolor currsx currsy translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1rlineto { /y2 exch scale mul def /x2 exch scale mul def t1linecolor setrgbcolor t1linedash setdash t1linescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currx curry moveto x2 y2 rlineto stroke /currx currx x2 add def /curry curry y2 add def } def /t1srlineto { /y2 exch scale mul def /x2 exch scale mul def t1slinecolor setrgbcolor t1slinedash setdash t1slinescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def } def /t1sprolongate { /y2 exch scale mul def /x2 exch scale mul def t1sprolongatecolor setrgbcolor t1sprolongatedash setdash t1sprolongatescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def } def /t1hintedrlineto { /y2 exch scale mul def /x2 exch scale mul def t1hlinecolor setrgbcolor t1hlinedash setdash t1hlinescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currhx currhy moveto x2 y2 rlineto stroke /currhx currhx x2 add def /currhy currhy y2 add def } def /t1rmoveto { /y2 exch scale mul def /x2 exch scale mul def t1movecolor setrgbcolor t1movedash setdash t1movescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currx curry moveto x2 y2 rlineto stroke /currx currx x2 add def /curry curry y2 add def /startx currx def /starty curry def } def /t1srmoveto { /y2 exch scale mul def /x2 exch scale mul def t1smovecolor setrgbcolor t1smovedash setdash t1smovescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def /startsx currsx def /startsy currsy def } def /t1hintedrmoveto { /y2 exch scale mul def /x2 exch scale mul def t1hmovecolor setrgbcolor t1hmovedash setdash t1hmovescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currhx currhy moveto x2 y2 rlineto stroke /currhx currhx x2 add def /currhy currhy y2 add def /starthx currhx def /starthy currhy def } def /t1rrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1curvecolor setrgbcolor t1curvedash setdash t1curvescale t1dumpstdlinewidth mul setlinewidth t1showoffcurvepoints 1 eq { newpath currx x2 add curry y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currx x2 x3 add add curry y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currx x2 x3 x4 add add add curry y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currx curry moveto currx x2 add curry y2 add lineto stroke currx x2 x3 add add curry y2 y3 add add moveto currx x2 x3 x4 add add add curry y2 y3 y4 add add add lineto stroke } if t1curvedash setdash t1curvescale t1dumpstdlinewidth mul setlinewidth currx curry moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currx currx x2 x3 x4 add add add def /curry curry y2 y3 y4 add add add def } def /t1srrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1scurvecolor setrgbcolor t1scurvedash setdash t1scurvescale t1dumpstdlinewidth mul setlinewidth t1showoffcurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currsx x2 x3 add add currsy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currsx currsy moveto currsx x2 add currsy y2 add lineto stroke currsx x2 x3 add add currsy y2 y3 add add moveto currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add lineto stroke } if t1scurvedash setdash t1scurvescale t1dumpstdlinewidth mul setlinewidth currsx currsy moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currsx currsx x2 x3 x4 add add add def /currsy currsy y2 y3 y4 add add add def } def /t1hintedrrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1hcurvecolor setrgbcolor t1hcurvedash setdash t1hcurvescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currhx x2 x3 add add currhy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currhx currhy moveto currhx x2 add currhy y2 add lineto stroke currhx x2 x3 add add currhy y2 y3 add add moveto currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add lineto stroke } if t1hcurvedash setdash t1hcurvescale t1dumpstdlinewidth mul setlinewidth currhx currhy moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currhx currhx x2 x3 x4 add add add def /currhy currhy y2 y3 y4 add add add def } def /t1sbw { /wy exch scale mul def /wx exch scale mul def /sby exch scale mul def /sbx exch scale mul def t1sbwcolor setrgbcolor newpath sbx sby 3 0 360 arc closepath fill newpath wx wy 3 0 360 arc closepath fill /currx sbx def /curry sby def /currhx sbx def /currhy sby def /currsx sbx def /currsy sby def } def /t1closepath { t1closepathdash setdash t1closepathscale t1dumpstdlinewidth mul setlinewidth t1closepathcolor setrgbcolor currx curry moveto startx starty lineto stroke } def /t1sclosepath { t1sclosepathdash setdash t1sclosepathscale t1dumpstdlinewidth mul setlinewidth t1sclosepathcolor setrgbcolor currsx currsy moveto startsx startsy lineto stroke } def /t1hintedclosepath { t1hclosepathdash setdash t1hclosepathscale t1dumpstdlinewidth mul setlinewidth t1hclosepathcolor setrgbcolor currhx currhy moveto starthx starthy lineto stroke } def /t1vstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1stemscale t1dumpstdlinewidth mul setlinewidth t1stemcolor setrgbcolor [] 0 setdash stemstart ymindev moveto stemstart ymaxdev lineto stroke [2 2] 0 setdash stemwidth stemstart add ymindev moveto stemwidth stemstart add ymaxdev lineto stroke } if } def /t1alignedvstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1alignedstemscale t1dumpstdlinewidth mul setlinewidth t1alignedstemcolor setrgbcolor [] 0 setdash stemstart ymindev moveto stemstart ymaxdev lineto stroke [2 2] 0 setdash stemwidth stemstart add ymindev moveto stemwidth stemstart add ymaxdev lineto stroke } if } def /t1hstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1stemscale t1dumpstdlinewidth mul setlinewidth t1stemcolor setrgbcolor [] 0 setdash xmindev stemstart moveto xmaxdev stemstart lineto stroke [2 2] 0 setdash xmindev stemwidth stemstart add moveto xmaxdev stemwidth stemstart add lineto stroke } if } def /t1alignedhstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1alignedstemscale t1dumpstdlinewidth mul setlinewidth t1alignedstemcolor setrgbcolor [] 0 setdash xmindev stemstart moveto xmaxdev stemstart lineto stroke [2 2] 0 setdash xmindev stemwidth stemstart add moveto xmaxdev stemwidth stemstart add lineto stroke } if } def /t1bottomzone { t1drawzones 1 eq { /bottom exch scale mul def /top exch scale mul def t1bottomzonescale t1dumpstdlinewidth mul setlinewidth t1bottomzonecolor setrgbcolor [] 0 setdash xmindev bottom moveto xmaxdev bottom lineto stroke [2 2] 0 setdash xmindev top moveto xmaxdev top lineto stroke } if } def /t1topzone { t1drawzones 1 eq { /bottom exch scale mul def /top exch scale mul def t1topzonescale t1dumpstdlinewidth mul setlinewidth t1topzonecolor setrgbcolor [2 2] 0 setdash xmindev bottom moveto xmaxdev bottom lineto stroke [] 0 setdash xmindev top moveto xmaxdev top lineto stroke } if } def end % Next follows drawing code from charstring commands: T1LibDict begin gsave 15.000001 t1SetupSize t1PreparePage -0.329987 0.000000 t1bottomzone 10.244583 10.574570 t1topzone 6.464737 6.719727 t1topzone 9.989594 10.154587 t1topzone -3.089874 -2.909882 t1bottomzone -0.164993 0.374985 t1hstem 0.000000 1.000000 t1alignedhstem 2.414902 0.299988 t1hstem 2.000000 1.000000 t1alignedhstem 5.999756 0.464981 t1hstem 5.000000 1.000000 t1alignedhstem 8.924637 0.299988 t1hstem 9.000000 1.000000 t1alignedhstem 1.559937 1.034958 t1vstem 2.000000 1.000000 t1alignedvstem 4.604813 0.374985 t1vstem 4.000000 1.000000 t1alignedvstem 0.284988 0.000000 0.284988 0.000000 t1sbw 2.309906 5.999756 t1srmoveto 0.000000 -0.112495 t1sprolongate 2.144913 0.000000 t1srlineto 0.112495 0.000000 t1sprolongate 0.000000 0.112495 t1sprolongate 0.000000 0.464981 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate -2.144913 0.000000 t1srlineto -0.000000 -0.112495 t1sprolongate 0.112495 -0.000000 t1sprolongate 0.000000 2.759888 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate -0.374985 0.000000 t1srlineto -0.111132 0.000000 t1sprolongate -0.001355 -0.111124 t1sprolongate -0.014942 -1.225209 -0.444926 -1.502841 -1.367155 -0.055802 t1srrcurveto -0.107908 -0.004404 t1sprolongate 0.000000 -0.107997 t1sprolongate 0.000000 -0.329987 t1srlineto 0.000000 -0.112495 t1sprolongate 0.112495 0.000000 t1sprolongate 1.274948 0.000000 t1srlineto -0.000000 0.112495 t1sprolongate -0.112495 -0.000000 t1sprolongate 0.000000 -4.139832 t1srlineto 0.000000 -1.938169 1.481412 -0.199244 0.566005 0.000000 t1srrcurveto 1.163073 0.000000 0.434362 1.158258 0.000000 0.979156 t1srrcurveto 0.000000 0.854965 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate -0.374985 0.000000 t1srlineto -0.112495 0.000000 t1sprolongate 0.000000 -0.112495 t1sprolongate 0.000000 -0.824966 t1srlineto 0.000000 -1.086171 -0.432363 -0.481265 -0.460100 0.000000 t1srrcurveto -0.872319 0.000000 -0.020145 1.203144 0.000000 0.304295 t1srrcurveto 0.000000 4.169830 t1srlineto -0.112495 0.000000 t1sprolongate t1sclosepath -0.112495 0.112495 t1srmoveto -0.000000 -0.112495 t1sprolongate 0.000000 -4.169830 t1srlineto 0.000000 -0.205685 -0.020145 -1.526745 1.137599 0.000000 t1srrcurveto 0.649854 0.000000 0.467600 0.658688 0.000000 1.133739 t1srrcurveto 0.000000 0.824966 t1srlineto -0.112495 -0.000000 t1sprolongate -0.000000 -0.112495 t1sprolongate 0.374985 0.000000 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate 0.000000 -0.854965 t1srlineto 0.000000 -0.940766 -0.405604 -0.971656 -0.966840 0.000000 t1srrcurveto -0.513951 0.000000 -1.308475 0.160742 0.000000 1.751680 t1srrcurveto 0.000000 4.139832 t1srlineto -0.000000 0.112495 t1sprolongate -0.112495 -0.000000 t1sprolongate -1.274948 0.000000 t1srlineto 0.000000 -0.112495 t1sprolongate 0.112495 0.000000 t1sprolongate 0.000000 0.329987 t1srlineto -0.112495 -0.000000 t1sprolongate 0.004588 -0.112402 t1sprolongate 1.572725 0.064193 0.455038 1.707028 0.015057 1.234691 t1srrcurveto -0.112487 0.001372 t1sprolongate -0.000000 -0.112495 t1sprolongate 0.374985 0.000000 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate 0.000000 -2.759888 t1srlineto -0.000000 -0.112495 t1sprolongate 0.112495 -0.000000 t1sprolongate 2.144913 0.000000 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate 0.000000 -0.464981 t1srlineto 0.112495 -0.000000 t1sprolongate -0.000000 0.112495 t1sprolongate -2.144913 0.000000 t1srlineto -0.112495 -0.000000 t1sprolongate t1sclosepath 0.112495 -4.282326 t1srmoveto t1FinishPage 0.284988 0.000000 0.284988 0.000000 t1sbw 2.309906 5.999756 t1rmoveto 2.144913 0.000000 t1rlineto 0.000000 0.464981 t1rlineto -2.144913 0.000000 t1rlineto 0.000000 2.759888 t1rlineto -0.374985 0.000000 t1rlineto -0.014999 -1.229950 -0.449982 -1.604935 -1.469940 -0.059998 t1rrcurveto 0.000000 -0.329987 t1rlineto 1.274948 0.000000 t1rlineto 0.000000 -4.139832 t1rlineto 0.000000 -1.844925 1.394943 -0.179993 0.539978 0.000000 t1rrcurveto 1.064957 0.000000 0.419983 1.064957 0.000000 0.959961 t1rrcurveto 0.000000 0.854965 t1rlineto -0.374985 0.000000 t1rlineto 0.000000 -0.824966 t1rlineto 0.000000 -1.109955 -0.449982 -0.569977 -0.554977 0.000000 t1rrcurveto -1.004959 0.000000 0.000000 1.364944 0.000000 0.254990 t1rrcurveto t1closepath t1FinishPage grestore end xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/t1dump_t_2.pdf0000664000175000017500000000336211742726711024147 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœÝXÉn1 ½ÏWä ¢ìËô §AHHÌ¿=ÙlOZµ×R¤*Ïo'^S£­2øÓŸ×ñ÷°ê÷a}Ñ1eåJÔÙuMħ]qʺ¨­ÊÛÆ°¦Ëûú<ªÕµ?‘Œ¢a¬Çç1‘Tµ I .ò=Æú<†“1ìîä9Îã×ç>›z9¾+gðÿpèÏcê§­oAo¶Úõçøv˜û»öEPÿú•+:”û+ÜÍ0v“Áu Œ{ n)Cv\5‡g=¶¢ÅÍð+d±9.8Ä{¶w‡Èi(inÎeä¦{l/e”½Œ•X`<ð+cM „l±}®U—Ä/@È»!Òt lÙÉXÂÿ‹]\JaäaÀ-ÊTu1ü[bÈrº8H±bŒö<¥ì:rÍ-…áŸN^%—›—’Õ2Ü$],Þ™¿oád7Äeב0uÌ ܺayb×BìmxˆJa‹, ”=#z!+E$võ\OÛ•²ëˆ5h—¶)*D„»Œp¢ÕÁìSTÊ»¢šØbTbTgÔÕ@ͳXp£‚¬ÓÆ`MÄ8Ís~”ÜKÎAòUÏVAaµC¼¯Û¾¹iØ5ë-üY%d” 6{¾ + ÆCâ¬YY¸ ÏÁËØÓ!C¶…{ºFYëTÓ!#lcîg:;¶X›ž †¤ST¡Ç õùöÐX7¯qì®KÏ?¿ê5©¤Zó\ׂÉ_›‘ʹÉ3){­7eÕ×—7›"yނ;¡Þu(Ù0ŠÊ£ ùj“dR¶Øã:îæ"0Â2%Ù« ͧ¼F\îkꮆE¼èd‹®a"K0¸)f¯s s=ÂäÖ"°k!»$2š$xFX.CSÎD#!3å®Ñ‰—î^6–3Ŷvd”¦“c‹•|Ô6KÐËÄñÝ⬊cM«âÀ@ ôGËD’‡cYt)ä×ZÒ¢(±k"Û6&d„Mb^b£Ù8ÆšDÈ®5àŠ< ³é囿À€…mǹý´)d„Mÿ´@Ȩ½dL:p 8,FN!ƒiÇTºžGr;Cۣܿù·xþíæ±Fÿ›Yú¾GýûªÞkÕ8Ó7|Á‡E‚]^¥ZZ„s…’íåÜ·Öý¦5úÙœ-cIl±ØëN`DWÅ&Yàuçð`ÊÝ#d]sL_³9¦cXäü=rͯú– ÷Řçzì{’1mÙòÎaîc'{%ql±"V p–w×VþžÇÖÔÝ–lèn‰ Œe)¸EQ¼Æµ‘»àø>O¾ÿ"èJSendstream endobj 5 0 obj 1142 endobj 3 0 obj << /Type /Page /MediaBox [0 0 280 400] /Parent 2 0 R /Resources << /ProcSet [/PDF] >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 6 0 obj << /CreationDate (D:20030302172824) /Producer (GNU Ghostscript 5.50) >> endobj xref 0 7 0000000000 65535 f 0000001426 00000 n 0000001367 00000 n 0000001247 00000 n 0000000015 00000 n 0000001227 00000 n 0000001475 00000 n trailer << /Size 7 /Root 1 0 R /Info 6 0 R >> startxref 1562 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/t1dump_eight.eps0000664000175000017500000004606311742726711024606 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-1.2 %%Creator: t1lib (edited manually by RMz, 2003-01-15) %%Title: Type1Char Character Dump %%Pages: 1 %%PageOrder: Ascend %%BoundingBox: 0 0 280 400 %%EndComments %! /T1LibDict 100 dict def T1LibDict begin % Setup the size from the type1 module /t1SetupSize { /size exch def } def % Prepare the page. Compute scales and fill the charspace unit square % background /t1PreparePage { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Start of Customizable Section % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Setup a standard linewidth /t1dumpstdlinewidth 1.0 def % Setup a scale for drawing direction arrows /arrowscale 1.5 def % Should we draw the device pixel grid? (1=yes, otherwise no) /t1drawgrid 0 def % Should we draw stems? (1=yes, otherwise no) /t1drawstems 0 def % Should we draw alignment zones? (1=yes, otherwise no) /t1drawzones 0 def % Should we fill the charspace unit square? (1=yes, otherwise no) /t1fillunitsquare 0 def % Should we fill the device page? (1=yes, otherwise no) /t1fillpage 0 def % Should we show path segment On-Curve points? (1=yes, otherwise no) /t1showoncurvepoints 0 def % Should we show path segment Off Curve points? (1=yes, otherwise no) /t1showoffcurvepoints 0 def % Should we show Bezier tangets and their defining points? (1=yes, otherwise no) /t1showbeziertangents 0 def % Define a few colors /t1linecolor { 0.0 0.0 0.0 } def /t1hlinecolor { 1.0 0.0 0.0 } def /t1slinecolor { 1.0 1.0 1.0 } def /t1movecolor { 0.0 0.0 0.0 } def /t1hmovecolor { 1.0 0.0 0.0 } def /t1smovecolor { 1.0 1.0 1.0 } def /t1curvecolor { 0.0 0.0 0.0 } def /t1hcurvecolor { 1.0 0.0 0.0 } def /t1scurvecolor { 0.0 0.0 1.0 } def /t1sprolongatecolor { 1.0 0.0 1.0 } def /t1stemcolor { 0.0 0.0 1.0 } def /t1alignedstemcolor { 1.0 0.0 1.0 } def /t1bottomzonecolor { 1.0 1.0 0.0 } def /t1topzonecolor { 1.0 1.0 0.0 } def /t1arrowcolor { 0.0 0.0 0.0 } def /t1harrowcolor { 1.0 0.0 0.0 } def /t1sarrowcolor { 0.0 0.0 1.0 } def /t1sbwcolor { 0.0 0.0 0.0 } def /t1closepathcolor { 0.0 0.0 0.0 } def /t1hclosepathcolor { 1.0 0.0 0.0 } def /t1sclosepathcolor { 0.0 0.0 1.0 } def /t1pagecolor { 0.7 0.7 0.7 } def /t1unitsquarecolor { 0.4 0.4 0.4 } def /t1gridcolor { 0.0 0.0 0.0 } def % Line scale relative to the standard linewidth /t1linescale 0.8 def /t1hlinescale 0.4 def /t1slinescale 0.4 def /t1movescale 0.4 def /t1hmovescale 0.4 def /t1smovescale 0.4 def /t1curvescale 0.8 def /t1hcurvescale 0.4 def /t1scurvescale 0.4 def /t1curvetangentscale 0.5 def /t1sprolongatescale 0.4 def /t1stemscale 0.5 def /t1alignedstemscale 0.5 def /t1bottomzonescale 0.5 def /t1topzonescale 0.5 def /t1closepathscale 0.8 def /t1hclosepathscale 0.4 def /t1sclosepathscale 0.4 def /t1gridscale 0.5 def % Line dash specifications (stems and zones are not configurable!) /t1linedash { [] 0 } def /t1hlinedash { [] 0 } def /t1slinedash { [] 0 } def /t1movedash { [2 2] 0 } def /t1hmovedash { [2 2] 0 } def /t1smovedash { [2 2] 0 } def /t1curvedash { [] 0 } def /t1hcurvedash { [] 0 } def /t1scurvedash { [] 0 } def /t1sprolongatedash { [1 1] 0 }def /t1closepathdash { [] 0 } def /t1hclosepathdash { [] 0 } def /t1sclosepathdash { [] 0 } def /t1griddash { [3 3] 0 } def % Define a clipping rectangle ROI (in charspace coordinates) /t1ROIxmin 0 def /t1ROIxmax 500 def /t1ROIymin -50 def /t1ROIymax 700 def % Device values (in bp). These must match the Bounding Box Statement! /xmindev 0 neg def /xmaxdev 280 def /ymindev 0 neg def /ymaxdev 400 def /dxdev 1 def /dydev 1 def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % End of Customizable Section % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % logical pixel values /xminpixel t1ROIxmin 1000.0 div size mul def /xmaxpixel t1ROIxmax 1000.0 div size mul def /yminpixel t1ROIymin 1000.0 div size mul def /ymaxpixel t1ROIymax 1000.0 div size mul def /dxpixel 1 def /dypixel 1 def % compute scales and set minimum scale /scalex xmaxdev xmindev sub xmaxpixel xminpixel sub div def /scaley ymaxdev ymindev sub ymaxpixel yminpixel sub div def scalex scaley gt { /scale scaley def } { /scale scalex def } ifelse % Fill device page xmindev ymindev moveto xmaxdev 0 rlineto 0 ymaxdev rlineto xmaxdev neg 0 rlineto 0 ymaxdev neg rlineto closepath clip t1fillpage 1 eq { t1pagecolor setrgbcolor fill } if % reassign device values /xmindev xminpixel scale mul def /xmaxdev xmaxpixel scale mul def /ymindev yminpixel scale mul def /ymaxdev ymaxpixel scale mul def /dxdev dxpixel scale mul def /dydev dypixel scale mul def % translate coordinate system xminpixel scale mul neg yminpixel scale mul neg translate % Fill unit square of charspace coordinate system t1fillunitsquare 1 eq { t1unitsquarecolor setrgbcolor 0 0 moveto size scale mul 0 rlineto 0 size scale mul rlineto size scale mul neg 0 rlineto 0 size scale mul neg rlineto closepath fill } if } def /t1FinishPage { t1drawgrid 1 eq { t1gridcolor setrgbcolor t1gridscale setlinewidth t1griddash setdash % draw grid and align to the point (0,0) 0 dxdev xmaxdev { /xval exch def xval ymindev moveto xval ymaxdev lineto stroke } for 0 dxdev neg xmindev { /xval exch def xval ymindev moveto xval ymaxdev lineto stroke } for 0 dydev ymaxdev { /yval exch def xmindev yval moveto xmaxdev yval lineto stroke } for 0 dydev neg ymindev { /yval exch def xmindev yval moveto xmaxdev yval lineto stroke } for } if } def % Define three arrow routines available for later providing the output with directions /t1arrowhead { /tmpy exch def /tmpx exch def gsave t1arrowcolor setrgbcolor currx curry translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1harrowhead { /tmpy exch def /tmpx exch def gsave t1harrowcolor setrgbcolor currhx currhy translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1sarrowhead { /tmpy exch def /tmpx exch def gsave t1sarrowcolor setrgbcolor currsx currsy translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1rlineto { /y2 exch scale mul def /x2 exch scale mul def t1linecolor setrgbcolor t1linedash setdash t1linescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currx curry moveto x2 y2 rlineto stroke /currx currx x2 add def /curry curry y2 add def } def /t1srlineto { /y2 exch scale mul def /x2 exch scale mul def t1slinecolor setrgbcolor t1slinedash setdash t1slinescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def } def /t1sprolongate { /y2 exch scale mul def /x2 exch scale mul def t1sprolongatecolor setrgbcolor t1sprolongatedash setdash t1sprolongatescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def } def /t1hintedrlineto { /y2 exch scale mul def /x2 exch scale mul def t1hlinecolor setrgbcolor t1hlinedash setdash t1hlinescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currhx currhy moveto x2 y2 rlineto stroke /currhx currhx x2 add def /currhy currhy y2 add def } def /t1rmoveto { /y2 exch scale mul def /x2 exch scale mul def t1movecolor setrgbcolor t1movedash setdash t1movescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currx curry moveto x2 y2 rlineto stroke /currx currx x2 add def /curry curry y2 add def /startx currx def /starty curry def } def /t1srmoveto { /y2 exch scale mul def /x2 exch scale mul def t1smovecolor setrgbcolor t1smovedash setdash t1smovescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def /startsx currsx def /startsy currsy def } def /t1hintedrmoveto { /y2 exch scale mul def /x2 exch scale mul def t1hmovecolor setrgbcolor t1hmovedash setdash t1hmovescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currhx currhy moveto x2 y2 rlineto stroke /currhx currhx x2 add def /currhy currhy y2 add def /starthx currhx def /starthy currhy def } def /t1rrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1curvecolor setrgbcolor t1curvedash setdash t1curvescale t1dumpstdlinewidth mul setlinewidth t1showoffcurvepoints 1 eq { newpath currx x2 add curry y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currx x2 x3 add add curry y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currx x2 x3 x4 add add add curry y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currx curry moveto currx x2 add curry y2 add lineto stroke currx x2 x3 add add curry y2 y3 add add moveto currx x2 x3 x4 add add add curry y2 y3 y4 add add add lineto stroke } if t1curvedash setdash t1curvescale t1dumpstdlinewidth mul setlinewidth currx curry moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currx currx x2 x3 x4 add add add def /curry curry y2 y3 y4 add add add def } def /t1srrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1scurvecolor setrgbcolor t1scurvedash setdash t1scurvescale t1dumpstdlinewidth mul setlinewidth t1showoffcurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currsx x2 x3 add add currsy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currsx currsy moveto currsx x2 add currsy y2 add lineto stroke currsx x2 x3 add add currsy y2 y3 add add moveto currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add lineto stroke } if t1scurvedash setdash t1scurvescale t1dumpstdlinewidth mul setlinewidth currsx currsy moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currsx currsx x2 x3 x4 add add add def /currsy currsy y2 y3 y4 add add add def } def /t1hintedrrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1hcurvecolor setrgbcolor t1hcurvedash setdash t1hcurvescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currhx x2 x3 add add currhy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currhx currhy moveto currhx x2 add currhy y2 add lineto stroke currhx x2 x3 add add currhy y2 y3 add add moveto currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add lineto stroke } if t1hcurvedash setdash t1hcurvescale t1dumpstdlinewidth mul setlinewidth currhx currhy moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currhx currhx x2 x3 x4 add add add def /currhy currhy y2 y3 y4 add add add def } def /t1sbw { /wy exch scale mul def /wx exch scale mul def /sby exch scale mul def /sbx exch scale mul def t1sbwcolor setrgbcolor newpath sbx sby 3 0 360 arc closepath fill newpath wx wy 3 0 360 arc closepath fill /currx sbx def /curry sby def /currhx sbx def /currhy sby def /currsx sbx def /currsy sby def } def /t1closepath { t1closepathdash setdash t1closepathscale t1dumpstdlinewidth mul setlinewidth t1closepathcolor setrgbcolor currx curry moveto startx starty lineto stroke } def /t1sclosepath { t1sclosepathdash setdash t1sclosepathscale t1dumpstdlinewidth mul setlinewidth t1sclosepathcolor setrgbcolor currsx currsy moveto startsx startsy lineto stroke } def /t1hintedclosepath { t1hclosepathdash setdash t1hclosepathscale t1dumpstdlinewidth mul setlinewidth t1hclosepathcolor setrgbcolor currhx currhy moveto starthx starthy lineto stroke } def /t1vstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1stemscale t1dumpstdlinewidth mul setlinewidth t1stemcolor setrgbcolor [] 0 setdash stemstart ymindev moveto stemstart ymaxdev lineto stroke [2 2] 0 setdash stemwidth stemstart add ymindev moveto stemwidth stemstart add ymaxdev lineto stroke } if } def /t1alignedvstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1alignedstemscale t1dumpstdlinewidth mul setlinewidth t1alignedstemcolor setrgbcolor [] 0 setdash stemstart ymindev moveto stemstart ymaxdev lineto stroke [2 2] 0 setdash stemwidth stemstart add ymindev moveto stemwidth stemstart add ymaxdev lineto stroke } if } def /t1hstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1stemscale t1dumpstdlinewidth mul setlinewidth t1stemcolor setrgbcolor [] 0 setdash xmindev stemstart moveto xmaxdev stemstart lineto stroke [2 2] 0 setdash xmindev stemwidth stemstart add moveto xmaxdev stemwidth stemstart add lineto stroke } if } def /t1alignedhstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1alignedstemscale t1dumpstdlinewidth mul setlinewidth t1alignedstemcolor setrgbcolor [] 0 setdash xmindev stemstart moveto xmaxdev stemstart lineto stroke [2 2] 0 setdash xmindev stemwidth stemstart add moveto xmaxdev stemwidth stemstart add lineto stroke } if } def /t1bottomzone { t1drawzones 1 eq { /bottom exch scale mul def /top exch scale mul def t1bottomzonescale t1dumpstdlinewidth mul setlinewidth t1bottomzonecolor setrgbcolor [] 0 setdash xmindev bottom moveto xmaxdev bottom lineto stroke [2 2] 0 setdash xmindev top moveto xmaxdev top lineto stroke } if } def /t1topzone { t1drawzones 1 eq { /bottom exch scale mul def /top exch scale mul def t1topzonescale t1dumpstdlinewidth mul setlinewidth t1topzonecolor setrgbcolor [2 2] 0 setdash xmindev bottom moveto xmaxdev bottom lineto stroke [] 0 setdash xmindev top moveto xmaxdev top lineto stroke } if } def end % Next follows drawing code from charstring commands: T1LibDict begin gsave 20.000001 t1SetupSize t1PreparePage -0.439758 0.000000 t1bottomzone 13.652496 14.092255 t1topzone 8.615265 8.955078 t1topzone 13.312683 13.532562 t1topzone -4.117737 -3.877869 t1bottomzone 0.839539 0.000000 0.839539 0.000000 t1sbw 2.418671 9.134979 t1arrowhead t1rmoveto -0.919495 0.599670 t1arrowhead -0.079956 0.679626 0.000000 0.339813 t1rrcurveto 0.000000 1.219330 t1arrowhead 1.299286 0.839539 1.419220 0.000000 t1rrcurveto 1.459198 0.000000 t1arrowhead 1.279297 -1.039429 0.000000 -1.439209 t1rrcurveto 0.000000 -1.139374 t1arrowhead -0.779572 -0.959473 -1.199341 -0.699615 t1rrcurveto t1closepath 0.439758 -0.299835 t1arrowhead t1rmoveto 1.439209 0.739594 t1arrowhead 0.979462 1.039429 0.000000 1.319275 t1rrcurveto 0.000000 1.838989 t1arrowhead -1.779022 1.139374 -1.819000 0.000000 t1rrcurveto -1.998901 0.000000 t1arrowhead -1.619110 -1.479187 0.000000 -1.858978 t1rrcurveto 0.000000 -0.359802 t1arrowhead 0.039978 -0.899506 0.839539 -0.939484 t1rrcurveto 0.219879 -0.239868 t1arrowhead 0.739594 -0.499725 0.499725 -0.339813 t1rrcurveto -1.159363 -0.579681 t1arrowhead -1.719055 -1.119385 0.000000 -1.978912 t1rrcurveto 0.000000 -2.118835 t1arrowhead 2.038879 -1.339264 2.098846 0.000000 t1rrcurveto 2.258759 0.000000 t1arrowhead 1.898956 1.659088 0.000000 2.138824 t1rrcurveto 0.000000 0.719604 t1arrowhead -0.219879 0.899506 -0.759583 0.839539 t1rrcurveto -0.379791 0.419769 t1arrowhead -0.319824 0.199890 -1.279297 0.799561 t1rrcurveto t1closepath -1.998901 -0.839539 t1arrowhead t1rmoveto 0.559692 -0.339813 t1arrowhead 0.939484 -0.599670 0.959473 -0.619659 t1rrcurveto 0.559692 -0.379791 t1arrowhead 0.939484 -0.599670 0.000000 -1.219330 t1rrcurveto 0.000000 -1.479187 t1arrowhead -1.499176 -1.039429 -1.639099 0.000000 t1rrcurveto -1.719055 0.000000 t1arrowhead -1.439209 1.239319 0.000000 1.659088 t1rrcurveto 0.000000 1.159363 t1arrowhead 0.639648 1.279297 1.699066 0.939484 t1rrcurveto t1closepath t1FinishPage grestore end xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/t1dump_t_2.eps0000664000175000017500000005265011742726711024171 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-1.2 %%Creator: t1lib (edited manually by RMz, 2003-02-08) %%Title: Type1Char Character Dump %%Pages: 1 %%PageOrder: Ascend %%BoundingBox: 0 0 280 400 %%DocumentPaperSizes: a4 %%EndComments %! /T1LibDict 100 dict def T1LibDict begin % Setup the size from the type1 module /t1SetupSize { /size exch def } def % Prepare the page. Compute scales and fill the charspace unit square % background /t1PreparePage { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Start of Customizable Section % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Setup a standard linewidth /t1dumpstdlinewidth 1.0 def % Setup a scale for drawing direction arrows /arrowscale 3.0 def % Should we draw the device pixel grid? (1=yes, otherwise no) /t1drawgrid 0 def % Should we draw stems? (1=yes, otherwise no) /t1drawstems 0 def % Should we draw alignment zones? (1=yes, otherwise no) /t1drawzones 0 def % Should we fill the charspace unit square? (1=yes, otherwise no) /t1fillunitsquare 0 def % Should we fill the device page? (1=yes, otherwise no) /t1fillpage 0 def % Should we show path segment On-Curve points? (1=yes, otherwise no) /t1showoncurvepoints 0 def % Should we show path segment Off Curve points? (1=yes, otherwise no) /t1showoffcurvepoints 0 def % Should we show Bezier tangets and their defining points? (1=yes, otherwise no) /t1showbeziertangents 0 def % Define a few colors /t1linecolor { 0.0 0.0 0.0 } def /t1hlinecolor { 1.0 0.0 0.0 } def /t1slinecolor { 1.0 1.0 1.0 } def /t1movecolor { 0.0 0.0 0.0 } def /t1hmovecolor { 0.0 0.0 0.0 } def /t1smovecolor { 1.0 1.0 1.0 } def /t1curvecolor { 0.0 0.0 0.0 } def /t1hcurvecolor { 1.0 0.0 0.0 } def /t1scurvecolor { 1.0 1.0 1.0 } def /t1sprolongatecolor { 0.0 0.0 0.0 } def /t1stemcolor { 0.0 0.0 1.0 } def /t1alignedstemcolor { 1.0 0.0 1.0 } def /t1bottomzonecolor { 1.0 1.0 0.0 } def /t1topzonecolor { 1.0 1.0 0.0 } def /t1arrowcolor { 0.0 0.0 0.0 } def /t1harrowcolor { 1.0 0.0 0.0 } def /t1sarrowcolor { 0.0 0.0 1.0 } def /t1sbwcolor { 0.0 0.0 0.0 } def /t1closepathcolor { 0.0 0.0 0.0 } def /t1hclosepathcolor { 1.0 0.0 0.0 } def /t1sclosepathcolor { 0.0 0.0 1.0 } def /t1pagecolor { 0.7 0.7 0.7 } def /t1unitsquarecolor { 0.4 0.4 0.4 } def /t1gridcolor { 0.0 0.0 0.0 } def % Line scale relative to the standard linewidth /t1linescale 1.2 def /t1hlinescale 0.4 def /t1slinescale 0.0 def /t1movescale 0.4 def /t1hmovescale 0.4 def /t1smovescale 0.0 def /t1curvescale 1.2 def /t1hcurvescale 0.4 def /t1scurvescale 0.0 def /t1curvetangentscale 0.5 def /t1sprolongatescale 0.4 def /t1stemscale 0.5 def /t1alignedstemscale 0.5 def /t1bottomzonescale 0.5 def /t1topzonescale 0.5 def /t1closepathscale 0.8 def /t1hclosepathscale 0.4 def /t1sclosepathscale 0.4 def /t1gridscale 0.5 def % Line dash specifications (stems and zones are not configurable!) /t1linedash { [2 2] 0 } def /t1hlinedash { [] 0 } def /t1slinedash { [] 0 } def /t1movedash { [2 2] 0 } def /t1hmovedash { [2 2] 0 } def /t1smovedash { [2 2] 0 } def /t1curvedash { [2 2] 0 } def /t1hcurvedash { [] 0 } def /t1scurvedash { [] 0 } def /t1sprolongatedash { [] 0 }def /t1closepathdash { [2 2] 0 } def /t1hclosepathdash { [] 0 } def /t1sclosepathdash { [] 0 } def /t1griddash { [3 3] 0 } def % Define a clipping rectangle ROI (in charspace coordinates) /t1ROIxmin 0 def /t1ROIxmax 300 def /t1ROIymin -50 def /t1ROIymax 650 def % Device values (in bp). These must match the Bounding Box Statement! /xmindev 0 neg def /xmaxdev 280 def /ymindev 0 neg def /ymaxdev 400 def /dxdev 1 def /dydev 1 def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % End of Customizable Section % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % logical pixel values /xminpixel t1ROIxmin 1000.0 div size mul def /xmaxpixel t1ROIxmax 1000.0 div size mul def /yminpixel t1ROIymin 1000.0 div size mul def /ymaxpixel t1ROIymax 1000.0 div size mul def /dxpixel 1 def /dypixel 1 def % compute scales and set minimum scale /scalex xmaxdev xmindev sub xmaxpixel xminpixel sub div def /scaley ymaxdev ymindev sub ymaxpixel yminpixel sub div def scalex scaley gt { /scale scaley def } { /scale scalex def } ifelse % Fill device page xmindev ymindev moveto xmaxdev 0 rlineto 0 ymaxdev rlineto xmaxdev neg 0 rlineto 0 ymaxdev neg rlineto closepath clip t1fillpage 1 eq { t1pagecolor setrgbcolor fill } if % reassign device values /xmindev xminpixel scale mul def /xmaxdev xmaxpixel scale mul def /ymindev yminpixel scale mul def /ymaxdev ymaxpixel scale mul def /dxdev dxpixel scale mul def /dydev dypixel scale mul def % translate coordinate system xminpixel scale mul neg yminpixel scale mul neg translate % Fill unit square of charspace coordinate system t1fillunitsquare 1 eq { t1unitsquarecolor setrgbcolor 0 0 moveto size scale mul 0 rlineto 0 size scale mul rlineto size scale mul neg 0 rlineto 0 size scale mul neg rlineto closepath fill } if } def /t1FinishPage { t1drawgrid 1 eq { t1gridcolor setrgbcolor t1gridscale setlinewidth t1griddash setdash % draw grid and align to the point (0,0) 0 dxdev xmaxdev { /xval exch def xval ymindev moveto xval ymaxdev lineto stroke } for 0 dxdev neg xmindev { /xval exch def xval ymindev moveto xval ymaxdev lineto stroke } for 0 dydev ymaxdev { /yval exch def xmindev yval moveto xmaxdev yval lineto stroke } for 0 dydev neg ymindev { /yval exch def xmindev yval moveto xmaxdev yval lineto stroke } for } if } def % Define three arrow routines available for later providing the output with directions /t1arrowhead { /tmpy exch def /tmpx exch def gsave t1arrowcolor setrgbcolor currx curry translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1harrowhead { /tmpy exch def /tmpx exch def gsave t1harrowcolor setrgbcolor currhx currhy translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1sarrowhead { /tmpy exch def /tmpx exch def gsave t1sarrowcolor setrgbcolor currsx currsy translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1rlineto { /y2 exch scale mul def /x2 exch scale mul def t1linecolor setrgbcolor t1linedash setdash t1linescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currx curry moveto x2 y2 rlineto stroke /currx currx x2 add def /curry curry y2 add def } def /t1srlineto { /y2 exch scale mul def /x2 exch scale mul def t1slinecolor setrgbcolor t1slinedash setdash t1slinescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def } def /t1sprolongate { /y2 exch scale mul def /x2 exch scale mul def t1sprolongatecolor setrgbcolor t1sprolongatedash setdash t1sprolongatescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def } def /t1hintedrlineto { /y2 exch scale mul def /x2 exch scale mul def t1hlinecolor setrgbcolor t1hlinedash setdash t1hlinescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currhx currhy moveto x2 y2 rlineto stroke /currhx currhx x2 add def /currhy currhy y2 add def } def /t1rmoveto { /y2 exch scale mul def /x2 exch scale mul def t1movecolor setrgbcolor t1movedash setdash t1movescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currx curry moveto x2 y2 rlineto stroke /currx currx x2 add def /curry curry y2 add def /startx currx def /starty curry def } def /t1srmoveto { /y2 exch scale mul def /x2 exch scale mul def t1smovecolor setrgbcolor t1smovedash setdash t1smovescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def /startsx currsx def /startsy currsy def } def /t1hintedrmoveto { /y2 exch scale mul def /x2 exch scale mul def t1hmovecolor setrgbcolor t1hmovedash setdash t1hmovescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currhx currhy moveto x2 y2 rlineto stroke /currhx currhx x2 add def /currhy currhy y2 add def /starthx currhx def /starthy currhy def } def /t1rrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1curvecolor setrgbcolor t1curvedash setdash t1curvescale t1dumpstdlinewidth mul setlinewidth t1showoffcurvepoints 1 eq { newpath currx x2 add curry y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currx x2 x3 add add curry y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currx x2 x3 x4 add add add curry y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currx curry moveto currx x2 add curry y2 add lineto stroke currx x2 x3 add add curry y2 y3 add add moveto currx x2 x3 x4 add add add curry y2 y3 y4 add add add lineto stroke } if t1curvedash setdash t1curvescale t1dumpstdlinewidth mul setlinewidth currx curry moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currx currx x2 x3 x4 add add add def /curry curry y2 y3 y4 add add add def } def /t1srrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1scurvecolor setrgbcolor t1scurvedash setdash t1scurvescale t1dumpstdlinewidth mul setlinewidth t1showoffcurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currsx x2 x3 add add currsy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currsx currsy moveto currsx x2 add currsy y2 add lineto stroke currsx x2 x3 add add currsy y2 y3 add add moveto currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add lineto stroke } if t1scurvedash setdash t1scurvescale t1dumpstdlinewidth mul setlinewidth currsx currsy moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currsx currsx x2 x3 x4 add add add def /currsy currsy y2 y3 y4 add add add def } def /t1hintedrrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1hcurvecolor setrgbcolor t1hcurvedash setdash t1hcurvescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currhx x2 x3 add add currhy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currhx currhy moveto currhx x2 add currhy y2 add lineto stroke currhx x2 x3 add add currhy y2 y3 add add moveto currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add lineto stroke } if t1hcurvedash setdash t1hcurvescale t1dumpstdlinewidth mul setlinewidth currhx currhy moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currhx currhx x2 x3 x4 add add add def /currhy currhy y2 y3 y4 add add add def } def /t1sbw { /wy exch scale mul def /wx exch scale mul def /sby exch scale mul def /sbx exch scale mul def t1sbwcolor setrgbcolor newpath sbx sby 3 0 360 arc closepath fill newpath wx wy 3 0 360 arc closepath fill /currx sbx def /curry sby def /currhx sbx def /currhy sby def /currsx sbx def /currsy sby def } def /t1closepath { t1closepathdash setdash t1closepathscale t1dumpstdlinewidth mul setlinewidth t1closepathcolor setrgbcolor currx curry moveto startx starty lineto stroke } def /t1sclosepath { t1sclosepathdash setdash t1sclosepathscale t1dumpstdlinewidth mul setlinewidth t1sclosepathcolor setrgbcolor currsx currsy moveto startsx startsy lineto stroke } def /t1hintedclosepath { t1hclosepathdash setdash t1hclosepathscale t1dumpstdlinewidth mul setlinewidth t1hclosepathcolor setrgbcolor currhx currhy moveto starthx starthy lineto stroke } def /t1vstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1stemscale t1dumpstdlinewidth mul setlinewidth t1stemcolor setrgbcolor [] 0 setdash stemstart ymindev moveto stemstart ymaxdev lineto stroke [2 2] 0 setdash stemwidth stemstart add ymindev moveto stemwidth stemstart add ymaxdev lineto stroke } if } def /t1alignedvstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1alignedstemscale t1dumpstdlinewidth mul setlinewidth t1alignedstemcolor setrgbcolor [] 0 setdash stemstart ymindev moveto stemstart ymaxdev lineto stroke [2 2] 0 setdash stemwidth stemstart add ymindev moveto stemwidth stemstart add ymaxdev lineto stroke } if } def /t1hstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1stemscale t1dumpstdlinewidth mul setlinewidth t1stemcolor setrgbcolor [] 0 setdash xmindev stemstart moveto xmaxdev stemstart lineto stroke [2 2] 0 setdash xmindev stemwidth stemstart add moveto xmaxdev stemwidth stemstart add lineto stroke } if } def /t1alignedhstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1alignedstemscale t1dumpstdlinewidth mul setlinewidth t1alignedstemcolor setrgbcolor [] 0 setdash xmindev stemstart moveto xmaxdev stemstart lineto stroke [2 2] 0 setdash xmindev stemwidth stemstart add moveto xmaxdev stemwidth stemstart add lineto stroke } if } def /t1bottomzone { t1drawzones 1 eq { /bottom exch scale mul def /top exch scale mul def t1bottomzonescale t1dumpstdlinewidth mul setlinewidth t1bottomzonecolor setrgbcolor [] 0 setdash xmindev bottom moveto xmaxdev bottom lineto stroke [2 2] 0 setdash xmindev top moveto xmaxdev top lineto stroke } if } def /t1topzone { t1drawzones 1 eq { /bottom exch scale mul def /top exch scale mul def t1topzonescale t1dumpstdlinewidth mul setlinewidth t1topzonecolor setrgbcolor [2 2] 0 setdash xmindev bottom moveto xmaxdev bottom lineto stroke [] 0 setdash xmindev top moveto xmaxdev top lineto stroke } if } def end % Next follows drawing code from charstring commands: T1LibDict begin gsave 15.000001 t1SetupSize t1PreparePage -0.329987 0.000000 t1bottomzone 10.244583 10.574570 t1topzone 6.464737 6.719727 t1topzone 9.989594 10.154587 t1topzone -3.089874 -2.909882 t1bottomzone -0.164993 0.374985 t1hstem 0.000000 1.000000 t1alignedhstem 2.414902 0.299988 t1hstem 2.000000 1.000000 t1alignedhstem 5.999756 0.464981 t1hstem 5.000000 1.000000 t1alignedhstem 8.924637 0.299988 t1hstem 9.000000 1.000000 t1alignedhstem 1.559937 1.034958 t1vstem 2.000000 1.000000 t1alignedvstem 4.604813 0.374985 t1vstem 4.000000 1.000000 t1alignedvstem 0.284988 0.000000 0.284988 0.000000 t1sbw 2.309906 5.999756 t1srmoveto 0.000000 -0.112495 t1sprolongate 2.144913 0.000000 t1srlineto 0.112495 0.000000 t1sprolongate 0.000000 0.112495 t1sprolongate 0.000000 0.464981 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate -2.144913 0.000000 t1srlineto -0.000000 -0.112495 t1sprolongate 0.112495 -0.000000 t1sprolongate 0.000000 2.759888 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate -0.374985 0.000000 t1srlineto -0.111132 0.000000 t1sprolongate -0.001355 -0.111124 t1sprolongate -0.014942 -1.225209 -0.444926 -1.502841 -1.367155 -0.055802 t1srrcurveto -0.107908 -0.004404 t1sprolongate 0.000000 -0.107997 t1sprolongate 0.000000 -0.329987 t1srlineto 0.000000 -0.112495 t1sprolongate 0.112495 0.000000 t1sprolongate 1.274948 0.000000 t1srlineto -0.000000 0.112495 t1sprolongate -0.112495 -0.000000 t1sprolongate 0.000000 -4.139832 t1srlineto 0.000000 -1.938169 1.481412 -0.199244 0.566005 0.000000 t1srrcurveto 1.163073 0.000000 0.434362 1.158258 0.000000 0.979156 t1srrcurveto 0.000000 0.854965 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate -0.374985 0.000000 t1srlineto -0.112495 0.000000 t1sprolongate 0.000000 -0.112495 t1sprolongate 0.000000 -0.824966 t1srlineto 0.000000 -1.086171 -0.432363 -0.481265 -0.460100 0.000000 t1srrcurveto -0.872319 0.000000 -0.020145 1.203144 0.000000 0.304295 t1srrcurveto 0.000000 4.169830 t1srlineto -0.112495 0.000000 t1sprolongate t1sclosepath -0.112495 0.112495 t1srmoveto -0.000000 -0.112495 t1sprolongate 0.000000 -4.169830 t1srlineto 0.000000 -0.205685 -0.020145 -1.526745 1.137599 0.000000 t1srrcurveto 0.649854 0.000000 0.467600 0.658688 0.000000 1.133739 t1srrcurveto 0.000000 0.824966 t1srlineto -0.112495 -0.000000 t1sprolongate -0.000000 -0.112495 t1sprolongate 0.374985 0.000000 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate 0.000000 -0.854965 t1srlineto 0.000000 -0.940766 -0.405604 -0.971656 -0.966840 0.000000 t1srrcurveto -0.513951 0.000000 -1.308475 0.160742 0.000000 1.751680 t1srrcurveto 0.000000 4.139832 t1srlineto -0.000000 0.112495 t1sprolongate -0.112495 -0.000000 t1sprolongate -1.274948 0.000000 t1srlineto 0.000000 -0.112495 t1sprolongate 0.112495 0.000000 t1sprolongate 0.000000 0.329987 t1srlineto -0.112495 -0.000000 t1sprolongate 0.004588 -0.112402 t1sprolongate 1.572725 0.064193 0.455038 1.707028 0.015057 1.234691 t1srrcurveto -0.112487 0.001372 t1sprolongate -0.000000 -0.112495 t1sprolongate 0.374985 0.000000 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate 0.000000 -2.759888 t1srlineto -0.000000 -0.112495 t1sprolongate 0.112495 -0.000000 t1sprolongate 2.144913 0.000000 t1srlineto 0.000000 0.112495 t1sprolongate -0.112495 0.000000 t1sprolongate 0.000000 -0.464981 t1srlineto 0.112495 -0.000000 t1sprolongate -0.000000 0.112495 t1sprolongate -2.144913 0.000000 t1srlineto -0.112495 -0.000000 t1sprolongate t1sclosepath 0.112495 -4.282326 t1srmoveto t1FinishPage 0.284988 0.000000 0.284988 0.000000 t1sbw 2.309906 5.999756 t1rmoveto 2.144913 0.000000 t1rlineto 0.000000 0.464981 t1rlineto -2.144913 0.000000 t1rlineto 0.000000 2.759888 t1rlineto -0.374985 0.000000 t1rlineto -0.014999 -1.229950 -0.449982 -1.604935 -1.469940 -0.059998 t1rrcurveto 0.000000 -0.329987 t1rlineto 1.274948 0.000000 t1rlineto 0.000000 -4.139832 t1rlineto 0.000000 -1.844925 1.394943 -0.179993 0.539978 0.000000 t1rrcurveto 1.064957 0.000000 0.419983 1.064957 0.000000 0.959961 t1rrcurveto 0.000000 0.854965 t1rlineto -0.374985 0.000000 t1rlineto 0.000000 -0.824966 t1rlineto 0.000000 -1.109955 -0.449982 -0.569977 -0.554977 0.000000 t1rrcurveto -1.004959 0.000000 0.000000 1.364944 0.000000 0.254990 t1rrcurveto t1closepath t1FinishPage grestore end xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/parallelpath.eps0000664000175000017500000001642011742726711024657 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-1.2 %%Creator: (Created manually by RMz, 2003-01-15. Illustration of t1lib parallel path construction) %%Title: Parallel Path Construction %%Pages: 1 %%PageOrder: Ascend %%BoundingBox: 0 0 600 500 %%EndComments % % 3. gsave /xa 100 def /ya 100 def /xb 100 def /yb 400 def /xc 500 def /yc 750 def /xd 500 def /yd 100 def % 4. /xa 100 def /ya 300 def /xb 100 def /y5 400 def /xc 500 def /yc 300 def /xd 300 def /yd 300 def % 2. /xa 100 def /ya 100 def /xb 100 def /yb 400 def /xc 300 def /yc 550 def /xd 500 def /yd 600 def % 1. /xa 55 def /ya 40 def /xb 120 def /yb 200 def /xc 300 def /yc 400 def /xd 550 def /yd 445 def /TimesRoman findfont 25 scalefont setfont /line1 20 string def /linewidth 100 def % compute distance from Bezier_A to Bezier_B /dista xb xa sub dup mul yb ya sub dup mul add sqrt def % compute distance from Bezier_C to Bezier_D /distd xd xc sub dup mul yd yc sub dup mul add sqrt def /diameter linewidth 2 div def % compute resulting limit values of thick curve at end points /dxa yb ya sub diameter mul dista div def /dya xb xa sub diameter mul dista div neg def /dxd yd yc sub diameter mul distd div def /dyd xd xc sub diameter mul distd div neg def % draw curve as rendered by ghostscript 0.9 0.9 0.9 setrgbcolor xa ya moveto xb yb xc yc xd yd curveto %linewidth 40 div setlinewidth linewidth setlinewidth 0 setlinecap stroke 0.0 0.0 0.0 setrgbcolor xa ya moveto xb yb xc yc xd yd curveto 1 setlinewidth 0 setlinecap [4 4] 0 setdash stroke % reset dash [] 0 setdash % correct right path end points /xar xa dxa add def /yar ya dya add def /xdr xd dxd add def /ydr yd dyd add def % correct left path end points /xal xa dxa sub def /yal ya dya sub def /xdl xd dxd sub def /ydl yd dyd sub def /x1 xa xb add 0.5 mul def /y1 ya yb add 0.5 mul def /x2 xb xc add 0.5 mul def /y2 yb yc add 0.5 mul def /x3 xc xd add 0.5 mul def /y3 yc yd add 0.5 mul def /x4 xa xb 2 mul add xc add 4 div def /y4 ya yb 2 mul add yc add 4 div def /x5 xd xc 2 mul add xb add 4 div def /y5 yd yc 2 mul add yb add 4 div def /x6 xa xb 3 mul add xc 3 mul add xd add 8 div def /y6 ya yb 3 mul add yc 3 mul add yd add 8 div def 0 0 0 setrgbcolor newpath xa ya 4.0 0 360 arc closepath fill newpath xb yb 4.0 0 360 arc closepath fill newpath xc yc 4.0 0 360 arc closepath fill newpath xd yd 4.0 0 360 arc closepath fill 0 0 0 setrgbcolor newpath x1 y1 3.0 0 360 arc closepath fill newpath x2 y2 3.0 0 360 arc closepath fill newpath x3 y3 3.0 0 360 arc closepath fill 0 0 0 setrgbcolor newpath x4 y4 2.0 0 360 arc closepath fill newpath x5 y5 2.0 0 360 arc closepath fill 0 0 0 setrgbcolor newpath x6 y6 4.0 0 360 arc closepath stroke % compute right-side normal vector /nabs diameter x5 x4 sub dup mul y5 y4 sub dup mul add sqrt div def /nxr y5 y4 sub nabs mul def /nyr x4 x5 sub nabs mul def 0 0 0 setrgbcolor newpath x6 nxr add y6 nyr add 4.0 0 360 arc closepath stroke newpath x6 nxr sub y6 nyr sub 4.0 0 360 arc closepath stroke % calculate location and direction vectors of lines to intersect /bloc1x 4 nxr x6 add mul xar 2 mul sub xdr add 3 div def /bloc1y 4 nyr y6 add mul yar 2 mul sub ydr add 3 div def /bdir1x xc xd add xa sub xb sub def /bdir1y yc yd add ya sub yb sub def /bloc2x xar def /bloc2y yar def /bdir2x xb xa sub def /bdir2y yb ya sub def % calculate determinant and inverse /bdet bdir2x bdir1y mul bdir2y bdir1x mul sub def %bdet 0.0 eq bdet abs 0.001 le { /xbr xb nxr add def /ybr yb nyr add def /bnu 0.0 def /bmu 0.0 def } { /binvdet 1 bdet div def % calculate inverse of dir matrix /binvdir2x bdir1y binvdet mul def /binvdir2y bdir2y binvdet mul neg def /binvdir1x bdir1x binvdet mul neg def /binvdir1y bdir2x binvdet mul def % calculate mu and nu value (nu actually is not required) /bmu binvdir2x bloc1x bloc2x sub mul binvdir1x bloc1y bloc2y sub mul add def /bnu binvdir2y bloc1x bloc2x sub mul binvdir1y bloc1y bloc2y sub mul add def /xbr bloc2x bmu bdir2x mul add def /ybr bloc2y bmu bdir2y mul add def } ifelse % calculate location and direction vectors of lines to intersect /cloc1x 4 nxr x6 add mul xar add xdr 2 mul sub 3 div def /cloc1y 4 nyr y6 add mul yar add ydr 2 mul sub 3 div def /cdir1x xc xd add xa sub xb sub def /cdir1y yc yd add ya sub yb sub def /cloc2x xdr def /cloc2y ydr def /cdir2x xc xd sub def /cdir2y yc yd sub def % calculate determinant and inverse /cdet cdir2x cdir1y mul cdir2y cdir1x mul sub def %cdet 0.0 eq cdet abs 0.001 le { % curve is just a straight line /xcr xc nxr add def /ycr yc nyr add def /cmu 0.0 def } { /cinvdet 1 cdet div def % calculate inverse of dir matrix /cinvdir2x cdir1y cinvdet mul def /cinvdir2y cdir2y cinvdet mul neg def /cinvdir1x cdir1x cinvdet mul neg def /cinvdir1y cdir2x cinvdet mul def % calculate mu and nu value (mu actually is not required) /cmu cinvdir2x cloc1x cloc2x sub mul cinvdir1x cloc1y cloc2y sub mul add def /cnu cinvdir2y cloc1x cloc2x sub mul cinvdir1y cloc1y cloc2y sub mul add def /xcr cloc2x cmu cdir2x mul add def /ycr cloc2y cmu cdir2y mul add def } ifelse % Analyse coefficients and decide how to compute displacements bmu 0.1 le { /xbr 8 nxr x6 add mul xar sub xdr sub 3 div xcr sub def /ybr 8 nyr y6 add mul yar sub ydr sub 3 div ycr sub def } if cmu 0.1 le { /xcr 8 nxr x6 add mul xar sub xdr sub 3 div xbr sub def /ycr 8 nyr y6 add mul yar sub ydr sub 3 div ybr sub def } if % define delta values /dxb xbr xb sub def /dyb ybr yb sub def /dxc xcr xc sub def /dyc ycr yc sub def 0.5 setlinewidth % show tangent at t=0.5 and their shifted counterparts [32 32] 0 setdash x4 y4 moveto x5 y5 lineto stroke x4 nxr add y4 nyr add moveto x5 nxr add y5 nyr add lineto x4 nxr sub y4 nyr sub moveto x5 nxr sub y5 nyr sub lineto stroke [] 0 setdash 0 0 0 setrgbcolor 1 setlinewidth % stroke right curve xar yar moveto xb dxb add yb dyb add xc dxc add yc dyc add xdr ydr curveto stroke % stroke left curve xal yal moveto xb dxb sub yb dyb sub xc dxc sub yc dyc sub xdl ydl curveto stroke %0.2 0.5 0.8 setrgbcolor %newpath bloc2x bloc2y 5.0 0 360 arc closepath fill %bloc2x 10 bdir2x mul sub bloc2y 10 bdir2y mul sub moveto %bloc2x 10 bdir2x mul add bloc2y 10 bdir2y mul add lineto stroke %0.5 0.5 0.5 setrgbcolor %newpath bloc1x bloc1y 5.0 0 360 arc closepath fill %bloc1x 10 bdir1x mul sub bloc1y 10 bdir1y mul sub moveto %bloc1x 10 bdir1x mul add bloc1y 10 bdir1y mul add lineto stroke % draw tangents 0 0 0 setrgbcolor %1 setlinewidth %[5 5] 0 setdash 0.5 setlinewidth [4 4] 0 setdash xa ya moveto xb yb lineto stroke xd yd moveto xc yc lineto stroke [] 0 setdash xar yar moveto xb dxb add yb dyb add lineto stroke xdr ydr moveto xc dxc add yc dyc add lineto stroke xal yal moveto xb dxb sub yb dyb sub lineto stroke xdl ydl moveto xc dxc sub yc dyc sub lineto stroke % draw auxiliary lines [8 8] 0 setdash xb yb moveto xc yc lineto stroke [16 16] 0 setdash x1 y1 moveto x2 y2 lineto stroke x2 y2 moveto x3 y3 lineto stroke % draw resulting points 0 0 0 setrgbcolor newpath xar yar 4.0 0 360 arc closepath fill newpath xb dxb add yb dyb add 4.0 0 360 arc closepath fill newpath xc dxc add yc dyc add 4.0 0 360 arc closepath fill newpath xdr ydr 4.0 0 360 arc closepath fill newpath xal yal 4.0 0 360 arc closepath fill newpath xb dxb sub yb dyb sub 4.0 0 360 arc closepath fill newpath xc dxc sub yc dyc sub 4.0 0 360 arc closepath fill newpath xdl ydl 4.0 0 360 arc closepath fill grestore xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/t1dump_o.pdf0000664000175000017500000000445011742726711023720 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœÝXK®Ü6ÜÏ)t‚M6'ð:ÎÒÈê0Zd•ë§Š”(’šyöÚö,5[ì«»el–ÿßýñïC¶’ŠqA6£‰1mû…doœ›Ä`²”Í•&!zïZ¢:#š¯7[˜–àB[¼‰¾¯Ï£×£,ØÞ‘Xˆn1‹É1”IèëfÐŒí¢ZZPÊ(ó¼dŠ;ÏWš ¬ñ×ûw'›ºm OÛ*Û÷ooC5†Önß^dÅ}§Òñú>+–ç׎œÑ"°*%mNa‡t7ËÑ‹t9Ñ%G€i q¹Ð9mÀç]KržÒþâŒ0ø-1Yr>—SNÌÐ~Îo’CfX£®¢&É•ám9exƒ® Ø›êÉÕê 1d¸Ï ø|¡¥à9täô±³±4›ç(ÌÙð6D¿÷½×=ºiïŠu³=î»'ÍüÒ"Ñ U œË›æŠ ȤbT:²D Íѧu?p½ù×´Ï¢±fšâ#‚—ºRϲb{ÝK¨û$å&µ`ÊÖØ™<ÏóâR8kã“”¨=!Œ<|²Ñxçj<›o¯ÎZ#œ‘A[EÁŸ§òb" Ç!è  ¾V¼«æ¯Ø~!1Šî‚‹¡_ŠOFᑀ̤>ׯ8‹Âp©h‘;ÝážÛë>ËÒ% q«‡g R Ú3rX4™ê1\€(8üãëèCo<Ó]@R^øpUš ÏÀ*IN…Õ2˜ `sÕuÚz¦†!©"_»RDx±ö’‘œŒòX–˃3Fˆœû2ËbH&Wº/ ­udžH`dá:׫ڪÈY‡KáÈŸÎ$Þu—  å?Në!-Vl¿2(YØÂhT•’à|…I< ð„\‹î«¬X$÷ØRhb´蔑 øAäD*ÇB÷!‚á´bF³ä 0Ü%±y0š*wãþÜòá®+²xª%@!ÂzÐËÌ>UÞˆéFc¯iòݾÚé[þ«ë#}{!’á '›¢ÕC+‰( ‘L•4òOÂ4ŠúV<,³-ù€¼‘# 3¶·}¡¤m> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 6 0 obj << /CreationDate (D:20030302172814) /Producer (GNU Ghostscript 5.50) >> endobj xref 0 7 0000000000 65535 f 0000001992 00000 n 0000001933 00000 n 0000001813 00000 n 0000000015 00000 n 0000001793 00000 n 0000002041 00000 n trailer << /Size 7 /Root 1 0 R /Info 6 0 R >> startxref 2128 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/t1dump_eight.pdf0000664000175000017500000000337311742726711024565 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœÝVMnõ6 Ü¿Sø‚Hê‡í°áX:’«^lÖ'OIÙBÖÅ"ö,P9%á¸ÎµÇsÅÞ'^Z%HÌÎ6ÛaSA¡½Zž*áj6޹†œîË¹Ž¨AÒÏ{¢ÈÙ¦ h¸#JŸ6룧}_%EáÒdþÁ [(³ôAE|ÒósÁžw·¢ìw›8£†ž²¬ÖÉÔu4ñV÷ŽåÊ?¸.©o[²–ÆÀs+tHÀ¤8Ï+Õ‚÷{HC9ÓÙyfùÆø»SÔ"t0 ¤¤EÎ!z;ÖÐÆcýQÐ '‚ÔœídØdùÃf}ò4Œ+!,Rªž[Qœ€6'”h.;ß? ÷@êš2—x²Ø¦Eµ];Ö»—ŠÉHå@¤T0JAuÄÚš¢¯pq z(WìýâŒl‡æ´#F›õÉÓ܇‚e´ ª 6\“§41z1¤éÀÞ¯¬)”„†(y :Î%œYk &VŒQÀN ':¤éì© §V'‰“€À8¦ÄŽ.•rSö–ðp®Øûeê±³Ï-è«nœè 5eŠ8Gv¦Z çî©(ªb ÂòtL>Ê]éæ:VèJÙ‰ü‰:0>#Û´1§C®mÒÕ‹Íúài ˜aEù ù A ‰Ú:Ög娡ÜĹ!‡r›C¹ )ìÈúäÉ : ó@8A´Ì–ŒL*Ó\A9©öü\0ÜÊçÐ Ù0c DŸ6룧´ ŽT<]Š× ÄA φ½ÿµ7ú‚ò¹ãÄœ<ÐAdªÐ×xF~÷âÜ˲´ Ue©Nþñ«f~ÿ ÎÿO§º`ë!M£˜ ŽbMÁs›°-LúéÕôà™yôè+7×_WÈm0ÛÕoêUhçSJÁ³­K#¡ïÐü¸=û$½M›S.âSÛ žIšËÊ`–Ó²€x>Šq±ÒŸLWÌø B@ïÒÚ†›r'º]/&UÔƒ€âìäÁ‘!µÐ!‚<´QL°HÞA†£ÌµÕvÍΫÈy•ò ئ…š,=[¬O^:ñRmùè¡2|”dc’åi’ è˜d˜8ÌI6,æ$ó7vÖ»u&iHÂÀp (H0^šs}–ÆŽ-£îgd;lC®#¥\lÖOí“«O’I˜O†}?3ùÆö?^ÿâ1Òendstream endobj 5 0 obj 1151 endobj 3 0 obj << /Type /Page /MediaBox [0 0 280 400] /Parent 2 0 R /Resources << /ProcSet [/PDF] >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 6 0 obj << /CreationDate (D:20030302172809) /Producer (GNU Ghostscript 5.50) >> endobj xref 0 7 0000000000 65535 f 0000001435 00000 n 0000001376 00000 n 0000001256 00000 n 0000000015 00000 n 0000001236 00000 n 0000001484 00000 n trailer << /Size 7 /Root 1 0 R /Info 6 0 R >> startxref 1571 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/t1dump_B.pdf0000664000175000017500000000461511742726711023646 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœåYË®$' Ý÷WÔ4óþ‚¬£,GYu4R¤[‹¬òû9† Tßy,3š‘Z>eó²9ؾZ™Có¿ë÷u>þy˜ãïÇÓ¸h}JZç„Äd•;qVù‚D]äÐ4 ¿ŠM *H¼‘Å<Õ¦#¦Q’ça¹Ú´•4 »a§y¾þ{4Ço/iþÿ'ü×c¹î:ZÒʆÃ$›•3ÇÇã‡.†˜Ç6Ãpü»«²µf(MÖ_ÚdëG©oBÌE{¤¶æU:dR §·Ø‚s—øâ1fc8­UpáÊ<3t>,y«²¹dçcVÆ9â#59FßP¦Y±³#Þ:£R8(Z£(d°c‹µ½„.—Å.˜ðAƒê)ÊóßT6ÏMGO7‡½óö&úq`ÄÆ;TU9µ¿ •åãÙIª¯œhtdW4Ävˆ=¼ö¸±ËÒ+vv$ç˜T4‡Ú)‡€³ÜXc'và5j€§ˆÃ ú˜‚sèE›’ÒaLÐÏËšD|?;PnE™o†¤?dÌQ3kl>¤Û¨YTÞxþ]ØìÖÍkc™ t>Ș¬V.öe­ki£|bÄ« E¸½*X ª.H(×Úá SòõMÞ«­I^é¶Šc­„ÆâŽYÌIXE}Ù lÀý™4ˆ+—5ôCÞÆ Æ’é09eéÈÚ'Þ ˆB“»,cxÅÎŽã¼Á*¼É®î.™b†Oè{÷_ß&í’®|â|‘Æuƒ^WR°i§]ks|×ÎLÙKå …¡,î¼§€©lñ}vÖ+à\GÕïx,ã˜kCÈxâ8·wq¡ÉðýFtÅù‰{’š1&)‹åi )9_²¨HÈ{rAB.‰XDEwÑ”<Þ»qyãn"êùýX5îÉýþõØm ¥91°ÙòÓü>çX51¯NÌÒÉ(+—K |"·œµ•3ÒLØÆàD,AÞpÌí™u'*Ÿ‡ dŠƒ¤…do‹é“ÀìÊ @†ÀžÊÚ9顸˜ رWÄ×Žš¼ Ÿ^ä›Ô¯ÎV1çöKÙÇtoµÅ…_ÖáÖk?(¦Ù¬Ø¬•6*™¿Ý¥>æŒ2 Ö”²­ íE®HÕœ+Scï=VýCª ’¿«#Õ‡¢NßóÂþ¶ÈÄsåC&Ïwö‰çl…çGxqßþôÈß:]>õ=«ðf_ÍݤËÇSæ8$Æ]@Ôr9¸.&ÇÙ&.¯›\ó­Jº+vvÄeä^ VŸ|Ió éPó׈·"ÕàY1¦%Xq>³á*„IH§Jæ *W2L@]XoDƒô†º·q A:3QéLÝUC0èûÞ3÷fú}ý“k£àçÄ¡ò»¨&«ÒœHÔªj±ÜÑÒO¨íƒ‘µ jÎÉ™U®iCEw"{îÐ]l¯*½ø“Õ ½ÀwEòøÿàQ²8P©^± ´l¦R$7Äsi†Ý<)áyÇéwÀ;ð‘­Uò‚I¸%¸<‡õ!pj3¶:ÊΙæUVnßÎÇ~RX¾··’Ôß$o3vš¸¡¢!&‡K‡,ÎbÅÎÒ3>[gqY¹A|È(H/Ï4ùÕ=30áï½íüÄÉªÕØÂj…Þ«Ko@FßõxŸžnAÃPnròtô–F{9ÅMdùµÜÎë½-ÎqY:P†‹K«îììÏBe·­ˆÌ(þïà_eßÙÓÆCù¦Ý Ñ–ž ©C9ó‹A®^Ë+ím>©Ú ÊÖ´LºV,Åo$uÀ%nQº#ó/ˆ§É2!Y±³#ž©‡âA¥N ¾õ¹Wézé.?ÖCތﲂî™==ð8jx–¨6½Säü ›¼ÔeÙ[±³#x70†×µ×ÛÊš r~£/&ÀŸIO¿•T÷,žnzIBµ‘ÀEÂÕMJVв›ÖB#ÌʇT›Ë–Ð >ƒÒMªó_Ô)‹&߈}Á~¢„û¤à䘵zRª ÀRš^È©UÐ|K˵¹+½WðRnͯhð¾ÔýˆrÑÐct¿1«Æ÷?– ;+rPÙòQüBžû‚ñ.äºOÛ•æÜ*Õ¹!sB¼¢‚jágö¬`OU¹»}!=UËTêjˆgæàL•cÂu±äa—WììH*{I‡-Tûnë©yÁ é-÷nøýñ°mendstream endobj 5 0 obj 1809 endobj 3 0 obj << /Type /Page /MediaBox [0 0 400 280] /Parent 2 0 R /Resources << /ProcSet [/PDF] >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 6 0 obj << /CreationDate (D:20030302172803) /Producer (GNU Ghostscript 5.50) >> endobj xref 0 7 0000000000 65535 f 0000002093 00000 n 0000002034 00000 n 0000001914 00000 n 0000000015 00000 n 0000001894 00000 n 0000002142 00000 n trailer << /Size 7 /Root 1 0 R /Info 6 0 R >> startxref 2229 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/t1dump_B.eps0000664000175000017500000005503611742726711023667 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-1.2 %%Creator: t1lib (edited manually by RMz, 2003-03-01) %%Title: Type1Char Character Dump %%Pages: 1 %%PageOrder: Ascend %%BoundingBox: 0 0 400 280 %%DocumentPaperSizes: a4 %%EndComments %! /T1LibDict 100 dict def T1LibDict begin % Setup the size from the type1 module /t1SetupSize { /size exch def } def % Prepare the page. Compute scales and fill the charspace unit square % background /t1PreparePage { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Start of Customizable Section % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Setup a standard linewidth /t1dumpstdlinewidth 0.6 def % Setup a scale for drawing direction arrows /arrowscale 1.5 def % Should we draw the device pixel grid? (1=yes, otherwise no) /t1drawgrid 0 def % Should we draw stems? (1=yes, otherwise no) /t1drawstems 0 def % Should we draw alignment zones? (1=yes, otherwise no) /t1drawzones 0 def % Should we fill the charspace unit square? (1=yes, otherwise no) /t1fillunitsquare 0 def % Should we fill the device page? (1=yes, otherwise no) /t1fillpage 0 def % Should we show path segment On-Curve points? (1=yes, otherwise no) /t1showoncurvepoints 0 def % Should we show path segment Off Curve points? (1=yes, otherwise no) /t1showoffcurvepoints 0 def % Should we show Bezier tangets and their defining points? (1=yes, otherwise no) /t1showbeziertangents 0 def % Define a few colors /t1linecolor { 0.0 0.0 0.0 } def /t1hlinecolor { 1.0 0.0 0.0 } def /t1slinecolor { 0.0 0.0 0.0 } def /t1movecolor { 1.0 1.0 1.0 } def /t1hmovecolor { 1.0 0.0 0.0 } def /t1smovecolor { 1.0 1.0 1.0 } def /t1curvecolor { 0.0 0.0 0.0 } def /t1hcurvecolor { 1.0 0.0 0.0 } def /t1scurvecolor { 0.0 0.0 0.0 } def /t1sprolongatecolor { 0.0 0.0 0.0 } def /t1stemcolor { 0.0 0.0 1.0 } def /t1alignedstemcolor { 1.0 0.0 1.0 } def /t1bottomzonecolor { 1.0 1.0 0.0 } def /t1topzonecolor { 1.0 1.0 0.0 } def /t1arrowcolor { 0.0 0.0 0.0 } def /t1harrowcolor { 1.0 0.0 0.0 } def /t1sarrowcolor { 0.0 0.0 0.0 } def /t1sbwcolor { 0.0 0.0 0.0 } def /t1closepathcolor { 0.0 0.0 0.0 } def /t1hclosepathcolor { 1.0 0.0 0.0 } def /t1sclosepathcolor { 0.0 0.0 0.0 } def /t1pagecolor { 0.7 0.7 0.7 } def /t1unitsquarecolor { 0.4 0.4 0.4 } def /t1gridcolor { 0.0 0.0 0.0 } def % Line scale relative to the standard linewidth /t1linescale 2.5 def /t1hlinescale 0.4 def /t1slinescale 1.0 def /t1movescale 0.0 def /t1hmovescale 0.0 def /t1smovescale 0.0 def /t1curvescale 2.5 def /t1hcurvescale 0.4 def /t1scurvescale 1.0 def /t1curvetangentscale 0.5 def /t1sprolongatescale 1.0 def /t1stemscale 0.5 def /t1alignedstemscale 0.5 def /t1bottomzonescale 0.5 def /t1topzonescale 0.5 def /t1closepathscale 0.4 def /t1hclosepathscale 0.4 def /t1sclosepathscale 0.4 def /t1gridscale 0.5 def % Line dash specifications (stems and zones are not configurable!) /t1linedash { [2 2] 0 } def /t1hlinedash { [] 0 } def /t1slinedash { [] 0 } def /t1movedash { [2 2] 0 } def /t1hmovedash { [2 2] 0 } def /t1smovedash { [2 2] 0 } def /t1curvedash { [2 2] 0 } def /t1hcurvedash { [] 0 } def /t1scurvedash { [] 0 } def /t1sprolongatedash { [3 3] 0 }def /t1closepathdash { [] 0 } def /t1hclosepathdash { [] 0 } def /t1sclosepathdash { [] 0 } def /t1griddash { [3 3] 0 } def % Define a clipping rectangle ROI (in charspace coordinates) /t1ROIxmin 405 def /t1ROIxmax 505 def /t1ROIymin 320 def /t1ROIymax 340 def % /t1ROIxmin 0 def % /t1ROIxmax 600 def % /t1ROIymin -100 def % /t1ROIymax 800 def % Device values (in bp). These must match the Bounding Box Statement! /xmindev 0 neg def /xmaxdev 400 def /ymindev 0 neg def /ymaxdev 280 def /dxdev 1 def /dydev 1 def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % End of Customizable Section % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % logical pixel values /xminpixel t1ROIxmin 1000.0 div size mul def /xmaxpixel t1ROIxmax 1000.0 div size mul def /yminpixel t1ROIymin 1000.0 div size mul def /ymaxpixel t1ROIymax 1000.0 div size mul def /dxpixel 1 def /dypixel 1 def % compute scales and set minimum scale /scalex xmaxdev xmindev sub xmaxpixel xminpixel sub div def /scaley ymaxdev ymindev sub ymaxpixel yminpixel sub div def scalex scaley gt { /scale scaley def } { /scale scalex def } ifelse % Fill device page xmindev ymindev moveto xmaxdev 0 rlineto 0 ymaxdev rlineto xmaxdev neg 0 rlineto 0 ymaxdev neg rlineto closepath clip t1fillpage 1 eq { t1pagecolor setrgbcolor fill } if % reassign device values /xmindev xminpixel scale mul def /xmaxdev xmaxpixel scale mul def /ymindev yminpixel scale mul def /ymaxdev ymaxpixel scale mul def /dxdev dxpixel scale mul def /dydev dypixel scale mul def % translate coordinate system xminpixel scale mul neg yminpixel scale mul neg translate % Fill unit square of charspace coordinate system t1fillunitsquare 1 eq { t1unitsquarecolor setrgbcolor 0 0 moveto size scale mul 0 rlineto 0 size scale mul rlineto size scale mul neg 0 rlineto 0 size scale mul neg rlineto closepath fill } if } def /t1FinishPage { t1drawgrid 1 eq { t1gridcolor setrgbcolor t1gridscale setlinewidth t1griddash setdash % draw grid and align to the point (0,0) 0 dxdev xmaxdev { /xval exch def xval ymindev moveto xval ymaxdev lineto stroke } for 0 dxdev neg xmindev { /xval exch def xval ymindev moveto xval ymaxdev lineto stroke } for 0 dydev ymaxdev { /yval exch def xmindev yval moveto xmaxdev yval lineto stroke } for 0 dydev neg ymindev { /yval exch def xmindev yval moveto xmaxdev yval lineto stroke } for } if } def % Define three arrow routines available for later providing the output with directions /t1arrowhead { /tmpy exch def /tmpx exch def gsave t1arrowcolor setrgbcolor currx curry translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1harrowhead { /tmpy exch def /tmpx exch def gsave t1harrowcolor setrgbcolor currhx currhy translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1sarrowhead { /tmpy exch def /tmpx exch def gsave t1sarrowcolor setrgbcolor currsx currsy translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale t1dumpstdlinewidth neg mul mul rlineto 6 arrowscale t1dumpstdlinewidth mul mul 2 arrowscale t1dumpstdlinewidth mul mul rlineto 6 arrowscale t1dumpstdlinewidth mul mul neg 2 arrowscale t1dumpstdlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1rlineto { /y2 exch scale mul def /x2 exch scale mul def t1linecolor setrgbcolor t1linedash setdash t1linescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currx curry moveto x2 y2 rlineto stroke /currx currx x2 add def /curry curry y2 add def } def /t1srlineto { /y2 exch scale mul def /x2 exch scale mul def t1slinecolor setrgbcolor t1slinedash setdash t1slinescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def } def /t1sprolongate { /y2 exch scale mul def /x2 exch scale mul def t1sprolongatecolor setrgbcolor t1sprolongatedash setdash t1sprolongatescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def } def /t1hintedrlineto { /y2 exch scale mul def /x2 exch scale mul def t1hlinecolor setrgbcolor t1hlinedash setdash t1hlinescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currhx currhy moveto x2 y2 rlineto stroke /currhx currhx x2 add def /currhy currhy y2 add def } def /t1rmoveto { /y2 exch scale mul def /x2 exch scale mul def t1movecolor setrgbcolor t1movedash setdash t1movescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currx curry moveto x2 y2 rlineto stroke /currx currx x2 add def /curry curry y2 add def /startx currx def /starty curry def } def /t1srmoveto { /y2 exch scale mul def /x2 exch scale mul def t1smovecolor setrgbcolor t1smovedash setdash t1smovescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def /startsx currsx def /startsy currsy def } def /t1hintedrmoveto { /y2 exch scale mul def /x2 exch scale mul def t1hmovecolor setrgbcolor t1hmovedash setdash t1hmovescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currhx currhy moveto x2 y2 rlineto stroke /currhx currhx x2 add def /currhy currhy y2 add def /starthx currhx def /starthy currhy def } def /t1rrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1curvecolor setrgbcolor t1curvedash setdash t1curvescale t1dumpstdlinewidth mul setlinewidth t1showoffcurvepoints 1 eq { newpath currx x2 add curry y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currx x2 x3 add add curry y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currx x2 x3 x4 add add add curry y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currx curry moveto currx x2 add curry y2 add lineto stroke currx x2 x3 add add curry y2 y3 add add moveto currx x2 x3 x4 add add add curry y2 y3 y4 add add add lineto stroke } if t1curvedash setdash t1curvescale t1dumpstdlinewidth mul setlinewidth currx curry moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currx currx x2 x3 x4 add add add def /curry curry y2 y3 y4 add add add def } def /t1srrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1scurvecolor setrgbcolor t1scurvedash setdash t1scurvescale t1dumpstdlinewidth mul setlinewidth t1showoffcurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currsx x2 x3 add add currsy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currsx currsy moveto currsx x2 add currsy y2 add lineto stroke currsx x2 x3 add add currsy y2 y3 add add moveto currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add lineto stroke } if t1scurvedash setdash t1scurvescale t1dumpstdlinewidth mul setlinewidth currsx currsy moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currsx currsx x2 x3 x4 add add add def /currsy currsy y2 y3 y4 add add add def } def /t1hintedrrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1hcurvecolor setrgbcolor t1hcurvedash setdash t1hcurvescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currhx x2 x3 add add currhy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currhx currhy moveto currhx x2 add currhy y2 add lineto stroke currhx x2 x3 add add currhy y2 y3 add add moveto currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add lineto stroke } if t1hcurvedash setdash t1hcurvescale t1dumpstdlinewidth mul setlinewidth currhx currhy moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currhx currhx x2 x3 x4 add add add def /currhy currhy y2 y3 y4 add add add def } def /t1sbw { /wy exch scale mul def /wx exch scale mul def /sby exch scale mul def /sbx exch scale mul def t1sbwcolor setrgbcolor newpath sbx sby 3 0 360 arc closepath fill newpath wx wy 3 0 360 arc closepath fill /currx sbx def /curry sby def /currhx sbx def /currhy sby def /currsx sbx def /currsy sby def } def /t1closepath { t1closepathdash setdash t1closepathscale t1dumpstdlinewidth mul setlinewidth t1closepathcolor setrgbcolor currx curry moveto startx starty lineto stroke } def /t1sclosepath { t1sclosepathdash setdash t1sclosepathscale t1dumpstdlinewidth mul setlinewidth t1sclosepathcolor setrgbcolor currsx currsy moveto startsx startsy lineto stroke } def /t1hintedclosepath { t1hclosepathdash setdash t1hclosepathscale t1dumpstdlinewidth mul setlinewidth t1hclosepathcolor setrgbcolor currhx currhy moveto starthx starthy lineto stroke } def /t1vstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1stemscale t1dumpstdlinewidth mul setlinewidth t1stemcolor setrgbcolor [] 0 setdash stemstart ymindev moveto stemstart ymaxdev lineto stroke [2 2] 0 setdash stemwidth stemstart add ymindev moveto stemwidth stemstart add ymaxdev lineto stroke } if } def /t1alignedvstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1alignedstemscale t1dumpstdlinewidth mul setlinewidth t1alignedstemcolor setrgbcolor [] 0 setdash stemstart ymindev moveto stemstart ymaxdev lineto stroke [2 2] 0 setdash stemwidth stemstart add ymindev moveto stemwidth stemstart add ymaxdev lineto stroke } if } def /t1hstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1stemscale t1dumpstdlinewidth mul setlinewidth t1stemcolor setrgbcolor [] 0 setdash xmindev stemstart moveto xmaxdev stemstart lineto stroke [2 2] 0 setdash xmindev stemwidth stemstart add moveto xmaxdev stemwidth stemstart add lineto stroke } if } def /t1alignedhstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1alignedstemscale t1dumpstdlinewidth mul setlinewidth t1alignedstemcolor setrgbcolor [] 0 setdash xmindev stemstart moveto xmaxdev stemstart lineto stroke [2 2] 0 setdash xmindev stemwidth stemstart add moveto xmaxdev stemwidth stemstart add lineto stroke } if } def /t1bottomzone { t1drawzones 1 eq { /bottom exch scale mul def /top exch scale mul def t1bottomzonescale t1dumpstdlinewidth mul setlinewidth t1bottomzonecolor setrgbcolor [] 0 setdash xmindev bottom moveto xmaxdev bottom lineto stroke [2 2] 0 setdash xmindev top moveto xmaxdev top lineto stroke } if } def /t1topzone { t1drawzones 1 eq { /bottom exch scale mul def /top exch scale mul def t1topzonescale t1dumpstdlinewidth mul setlinewidth t1topzonecolor setrgbcolor [2 2] 0 setdash xmindev bottom moveto xmaxdev bottom lineto stroke [] 0 setdash xmindev top moveto xmaxdev top lineto stroke } if } def end % Next follows drawing code from charstring commands: T1LibDict begin gsave 15.000001 t1SetupSize t1PreparePage -0.329987 0.000000 t1bottomzone 10.244583 10.574570 t1topzone 6.464737 6.719727 t1topzone 9.989594 10.154587 t1topzone -3.089874 -2.909882 t1bottomzone 0.539978 0.000000 0.539978 0.000000 t1sbw 2.789886 5.489777 t1srmoveto 0.112495 -0.000000 t1sprolongate 0.000000 3.689850 t1srlineto 0.000000 0.426294 -0.027113 0.061186 0.649588 0.000000 t1srrcurveto 1.859924 0.000000 t1srlineto 1.370460 0.000000 0.496964 -1.199817 0.000000 -0.757604 t1srrcurveto 0.000000 -0.906489 -0.692951 -1.200926 -1.594456 0.000000 t1srrcurveto -2.174911 0.000000 t1srlineto -0.000000 -0.112495 t1sprolongate t1sclosepath -0.112495 -0.112495 t1srmoveto 0.112495 -0.000000 t1sprolongate 2.174911 0.000000 t1srlineto 1.735409 0.000000 0.776989 1.318972 0.000000 1.013433 t1srrcurveto 0.000000 0.832331 -0.552993 1.350080 -1.539422 0.000000 t1srrcurveto -1.859924 0.000000 t1srlineto -0.760355 0.000000 -0.087111 -0.148805 0.000000 -0.563666 t1srrcurveto 0.000000 -3.689850 t1srlineto -0.000000 -0.112495 t1sprolongate t1sclosepath 2.287407 0.112495 t1srmoveto 1.364944 -0.134995 t1srmoveto 0.021624 -0.110398 t1sarrowhead t1sprolongate 1.486204 0.291112 t1sarrowhead 1.094566 0.991078 0.000000 1.183112 t1srrcurveto 0.000000 1.384597 -1.449269 1.262795 -1.993091 0.000000 t1srrcurveto -5.489777 0.000000 t1srlineto -0.112495 0.000000 t1sprolongate 0.000000 -0.112495 t1sprolongate 0.000000 -0.464981 t1srlineto 0.000000 -0.112495 t1sprolongate 0.112495 0.000000 t1sprolongate 0.359985 0.000000 t1srlineto 1.121659 0.000000 -0.049202 -0.140224 0.000000 -0.452251 t1srrcurveto 0.000000 -7.904678 t1srlineto 0.000000 -0.452251 0.049202 -0.140224 -1.121659 0.000000 t1srrcurveto -0.359985 0.000000 t1srlineto -0.112495 0.000000 t1sprolongate 0.000000 -0.112495 t1sprolongate 0.000000 -0.464981 t1srlineto 0.000000 -0.112495 t1sprolongate 0.112495 0.000000 t1sprolongate 5.879761 0.000000 t1srlineto 2.045333 0.000000 1.412026 1.374159 0.000000 1.483225 t1srrcurveto 0.000000 1.378456 -1.290667 1.158998 -1.704620 0.184283 t1srrcurveto -0.012091 -0.111844 t1sarrowhead t1sprolongate t1sclosepath -0.749328 -0.032142 t1srmoveto 0.737237 -0.079701 t1sprolongate 1.625245 -0.175702 t1sarrowhead 1.169233 -1.090910 0.000000 -1.231438 t1srrcurveto 0.000000 -1.336660 -1.287864 -1.295733 -1.944504 0.000000 t1srrcurveto -5.879761 0.000000 t1srlineto 0.000000 -0.112495 t1sprolongate 0.112495 0.000000 t1sprolongate 0.000000 0.464981 t1srlineto -0.112495 -0.000000 t1sprolongate -0.000000 -0.112495 t1sprolongate 0.359985 0.000000 t1srlineto 1.188247 0.000000 0.109200 0.189762 0.000000 0.627705 t1srrcurveto 0.000000 7.904678 t1srlineto 0.000000 0.627705 -0.109200 0.189762 -1.188247 0.000000 t1srrcurveto -0.359985 0.000000 t1srlineto 0.000000 -0.112495 t1sprolongate 0.112495 0.000000 t1sprolongate 0.000000 0.464981 t1srlineto -0.112495 -0.000000 t1sprolongate -0.000000 -0.112495 t1sprolongate 5.489777 0.000000 t1srlineto 1.906750 0.000000 1.310619 -1.197105 0.000000 -1.225297 t1srrcurveto 0.000000 -1.036798 -0.975350 -0.928844 -1.423677 -0.278865 t1srrcurveto -0.727704 -0.142540 t1sarrowhead t1sprolongate t1sclosepath 0.749328 0.032142 t1srmoveto -0.929962 -4.777306 t1srmoveto -1.874924 0.000000 t1srlineto -0.649588 0.000000 0.027113 0.061186 0.000000 0.426294 t1srrcurveto 0.000000 4.094833 t1srlineto -0.112495 0.000000 t1sprolongate 0.000000 -0.112495 t1sprolongate 2.819885 0.000000 t1srlineto 1.397939 0.000000 0.604479 -1.316665 0.000000 -0.970742 t1srrcurveto 0.000000 -1.013388 -0.739705 -1.169023 -1.472705 0.000000 t1srrcurveto t1sclosepath -0.000000 -0.224991 t1srmoveto 1.617169 0.000000 0.820232 1.290877 0.000000 1.116525 t1srrcurveto 0.000000 1.039176 -0.655469 1.473221 -1.571940 0.000000 t1srrcurveto -2.819885 0.000000 t1srlineto -0.112495 -0.000000 t1sprolongate -0.000000 -0.112495 t1sprolongate 0.000000 -4.094833 t1srlineto 0.000000 -0.563666 0.087111 -0.148805 0.760355 0.000000 t1srrcurveto 1.874924 0.000000 t1srlineto t1sclosepath 0.000000 0.112495 t1srmoveto t1FinishPage 0.539978 0.000000 0.539978 0.000000 t1sbw 2.789886 5.489777 t1rmoveto 0.000000 3.689850 t1rlineto 0.000000 0.494980 0.029999 0.104996 0.704971 0.000000 t1rrcurveto 1.859924 0.000000 t1rlineto 1.454941 0.000000 0.524979 -1.274948 0.000000 -0.794968 t1rrcurveto 0.000000 -0.959961 -0.734970 -1.259949 -1.664932 0.000000 t1rrcurveto t1closepath 1.364944 -0.134995 t1rmoveto 1.454941 0.284988 1.034958 0.959961 0.000000 1.109955 t1rrcurveto 0.000000 1.304947 -1.379944 1.229950 -1.949921 0.000000 t1rrcurveto -5.489777 0.000000 t1rlineto 0.000000 -0.464981 t1rlineto 0.359985 0.000000 t1rlineto 1.154953 0.000000 0.029999 -0.164993 0.000000 -0.539978 t1rrcurveto 0.000000 -7.904678 t1rlineto 0.000000 -0.539978 -0.029999 -0.164993 -1.154953 0.000000 t1rrcurveto -0.359985 0.000000 t1rlineto 0.000000 -0.464981 t1rlineto 5.879761 0.000000 t1rlineto 1.994919 0.000000 1.349945 1.334946 0.000000 1.409943 t1rrcurveto 0.000000 1.304947 -1.229950 1.124954 -1.664932 0.179993 t1rrcurveto t1closepath -0.929962 -4.889801 t1rmoveto -1.874924 0.000000 t1rlineto -0.704971 0.000000 -0.029999 0.104996 0.000000 0.494980 t1rrcurveto 0.000000 4.094833 t1rlineto 2.819885 0.000000 t1rlineto 1.484940 0.000000 0.629974 -1.394943 0.000000 -1.004959 t1rrcurveto 0.000000 -1.064957 -0.779968 -1.229950 -1.544937 0.000000 t1rrcurveto t1closepath t1FinishPage grestore end xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/parallelpath_sk.sk0000664000175000017500000000336411742726711025205 0ustar uwabamiuwabami##Sketch 1 2 document() layout('A4',0) layer('Ebene 1',1,1,0,0,(0,0,0)) eps((11.0594,95.5815),'parallelpath.eps') fp((0,0,0)) le() lw(1) Fn('Helvetica') txt('A',(48.6889,127.34)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt("A'",(108.399,98.9939)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt('B',(117.18,293.277)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt('C',(306.795,501.208)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt('D',(572.904,541.071)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt("D'",(582.6,485.048)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt("C'",(348.812,434.412)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt("B'",(177.512,248.028)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt('P1',(82.704,211.398)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt('P2',(204.094,394.016)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt('P3',(432.847,524.91)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt('P4',(146.899,308.758)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt('P5',(321.878,461.346)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt('P6',(256.159,376.234)) lw(1) ld((4, 4)) b() bs(130.394,294.803,0) bs(130.394,136.063,0) bs(65.1969,136.063,0) lw(1) ld((4, 4)) b() bs(68.0315,136.063,0) bs(113.386,116.22,0) bs(113.386,136.063,0) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt('w/2',(74.8713,115.976)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt("P6'",(283.465,331.654)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt("A''",(14.1732,138.898)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt("B''",(79.3701,334.488)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt("C''",(274.961,549.921)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt("D''",(561.26,581.102)) fp((0,0,0)) le() lw(1) Fn('Helvetica') txt("P6''",(198.425,428.031)) guidelayer('Hilfslinien',1,0,0,1,(0,0,1)) grid((0,0,2.83465,2.83465),1,(0,0,1),'Gitter') xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/parallelpath_sk.pdf0000664000175000017500000000502011742726711025330 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ­X=¯eµí÷¯H÷ ¸!‰óY2€¨f˜+½bDuР9HTü}–'Ù‰„ÞOÌÕÁ޽l'Žílg½qüŸþ>ž×_×üý÷"g(™'ÿ&GÙ|¾²#¿ý?Ö?_¿]^Î6ç[öæÇË›ß/ïœ3_©:›Z4‘’­ž±| f™à„eÈu:*’Ò± ý¸>^ Ÿ Áÿ~‹¿þÿžÃ‰29© ¨l² 6×dbéÓ®Ò+¥j±+K"©18žl Ñ j»A?®áÅàL/áŒãq½a?ʶχ]óƇX¦Åu³v°èùààÚðm˜4 …ÉÏŒøÖ6 ƒf ݇%Q€r˜xCJ–ídŸ7NwŒ\GêøÊ…9ql0BkÀ¢‡ÙÅéŽ)©ßÃÍȆK¢å0ñ†\*[Ž>'9q,%,…=«•æ|ì‘ Øv€AÏk°8Y1÷&N êÔ(@9L¼] Ar†"4²ÅUÓB°>ó‰g‘hn¬gE©µYòäÔ²#,zìèâøfC2 Á6œj,/T‚v„3Ž-øÜÏ~æãâtÏ‚° »çÁk¶¸[ð>Z®SÂn³ÁƒÓ=[î°á¦ÆðbHä!6Þ®H¾ŸeÀšÄ¶8¥°g14AůHÄPu½Ó ºâÙ’HBÚl°ÆàÄÈž-:lÐÔ^¨ÄôRŽ8¤B&ªÖ5Þ©Q!''f[‘')4ë#èÔ«SòºžFýâkåÒ’ˆmG˜ô,‘“¢-Å,ØðÓÆðbHÐ@‡ ÔÈ’œeŽÕ’ÔÈÉIÍ¢‰ŽÛft™œE‚‚ÓõN£‚ùmJKÂ×aÒqj ŠYá°†ÆôbH„ሃcû¤ƒ@@)µûR[°è´ÏÅi¸ Ȇ@•lcšD"PÖõNãN5[ÒM"a³Áƒ“›mÅL„švJ³†z1$¦ßŠpÄñÀPõñ …K ¤ng!Žnr"äƒ Å›™N"rÓõNÃr.dc¹I¤aÒ~j('â>á\&B,» ¥¡1¼ÃËpÄ¡Ñ9ä”Gä›9¸É¨ÙF™1œ  É±@p¡/wfËRî:÷º©/:wùňiꇰáw’ñÕþXχzÞñ9¨Oœàò×4aP]×y+óô”þ MÜ/W» …ÆÊR i%=¬UHy_£%>LôgVC-Ð*!0ÿå$HŸîS²w‘l%>›ßŸá?NÅd1ß;xÃîQÂéÕfRÆ)ùÂS‹ôrž’=I)EØq&VÄ”"v…"2ÁäŠnlÞ ´F\0È™9â×}†O_4Âs<çØÎÃÞ>ØïQÿ¯€ó˜Ç6|þ¢°눕¯é¶Ý½êøŸ:y„ùo!¡Ë_×Z³Êš2hë׬uòЯg¯ìOBsõܦÁAI*¾ÏsHC…¨]bn¬Ò¸P.H|KÂn³ÁÊá’ŽÇãDp‡ ·4Ô‹)Q„zØ@WÏu;ðç|T Ÿqgù·d‘X)ÒiØ•UºI¸Ám6XC9¹5䈙¹î6”f õbJÔ¡6ÐÕ)oiú\œŒ‚2A;Ø}â‡ÄLl¥¹ã¶Û2'Ç]}Ðj€Å/#`)®Mwp¥!=ÌO‰¼iþË›‡§‰í2Úb_d\(œ.nG_èõ4¿HÐk\]ŒGPzUµÅA Íd^Ø›ACC½XiG8âèæYB&ã¡kÈìžj†“%fÑQ/’«&‡gæÌ_&aÒahLŸ)zÔ@Hu·1hä¢z1%†—ŠpÆÁ±Õ´ÃçSŸrèJ$S˜H¬òÙixÚЬMN);¢ãИœ€rk€;L8UXN¨DÚÎ(ä=Wê½€?'#ù^m¸I{~RS¯_Zð•”‘ïLp»¾»ã³¼2P:ÑÆ§:îøJ²¼:0ê®_w|\²X.58‰?Ö¥ˆäòüuÏëG‚¨‹^8FìÝ$Ü]Ýý~qøY1U6ƒfîÂ’¨B=l¼É—Ê¿ÐäÛ¥þ<žæÝëõÍÏüÈ7¯¸‚}‘G4Œ×çWß~ýúÇ…®úšyýõ«oÿÃ4Œ‰ÉwLùÊ͹2ýÓ!sñaò{Y†2Z&EùÉŽùÎñÅ›_Eè]gÿÓï½ `¸ôÈf±Ð4I̼§Ž €<„E  <÷„‘DçýRÅõ÷™?¼šçSù&+ã Dæ'¶Ý_$<õöº¤œ(×CBBUkò‘G±ii,P +úÁžP•¾é|éñð‚øxþþ¦o†ŒÌ=ò¬» o^|£~jÂËüiQ7Y|ŠxŠ÷“Æ4­~XOKàè&æÎ”]ûpýù/{öendstream endobj 5 0 obj 1821 endobj 3 0 obj << /Type /Page /MediaBox [0 0 606 506] /Parent 2 0 R /Resources << /ProcSet [/PDF /Text] /Font << /R6 6 0 R >> >> /Contents 4 0 R >> endobj 6 0 obj <> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 7 0 obj << /CreationDate (D:20030302172755) /Producer (GNU Ghostscript 5.50) >> endobj xref 0 8 0000000000 65535 f 0000002204 00000 n 0000002145 00000 n 0000001926 00000 n 0000000015 00000 n 0000001906 00000 n 0000002074 00000 n 0000002253 00000 n trailer << /Size 8 /Root 1 0 R /Info 7 0 R >> startxref 2340 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/parallelpath_sk.eps0000664000175000017500000004072511742726711025361 0ustar uwabamiuwabami%!PS-Adobe-3.0 EPSF-3.0 %%For: Rainer Menzner %%CreationDate: Sun Feb 9 17:57:06 2003 %%Title: parallelpath_sk.eps %%Creator: Sketch 0.6.8 %%Pages: 1 %%BoundingBox: 8 92 614 598 %%Extensions: CMYK %%DocumentSuppliedResources: (atend) %%DocumentNeededResources: font Helvetica %%EndComments %%BeginProlog %%BeginResource: procset Linux-Sketch-Procset 1.0 2 /SketchDict 100 dict def SketchDict begin /bd { bind def } bind def /x { exch } bd /xd { exch def } bd /PI 3.14159265358979323846264338327 def /radgrad { 180 mul PI div } bd /skstartmatrix matrix currentmatrix def /tmpmat matrix def /ISOLatin1Encoding dup where { pop pop } { [/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def } ifelse /arct dup where {pop pop} { /arct {arcto pop pop pop pop} bd } ifelse /size 0 def /fontname 0 def /newfont 0 def /sf { /size xd /fontname xd fontname findfont dup /Encoding get StandardEncoding eq { dup length dict /newfont xd { 1 index /FID ne { newfont 3 1 roll put } { pop pop } ifelse } forall newfont /Encoding ISOLatin1Encoding put fontname newfont definefont } if size scalefont setfont } bd /pusht {matrix currentmatrix} bd /popt {setmatrix} bd /pushc {gsave} bd /popc {grestore} bd /rgb {setrgbcolor} bd /w { setlinewidth } bd /j { setlinejoin } bd /J { setlinecap } bd /d { setdash } bd /F { eofill } bd /f { closepath F } bd /S { pusht skstartmatrix setmatrix stroke popt } bd /s { closepath S } bd /m { moveto } bd /l { lineto } bd /c { curveto } bd /txt { /tmpmat tmpmat currentmatrix def dup type /arraytype eq {concat} {translate} ifelse 0 0 m tmpmat } bd /T {txt x show popt} bd /P {txt x true charpath popt} bd /TP {txt x dup show 0 0 m true charpath popt} bd /C {newpath 0 360 arc} bd /R { 2 copy m x 2 index l x 2 index x l l closepath } bd /ellipse { dup type /arraytype eq { pusht x concat 0 0 1.0 C popt } { pusht 5 1 roll 4 -1 roll concat newpath dup 2 eq { 0 0 m } if 3 1 roll radgrad x radgrad x 0 0 1 5 -2 roll arc 0 ne { closepath } if popt } ifelse } bd /radius1 0 def /radius2 0 def /factor 0 def /rect { dup type /arraytype eq { pusht x concat 0 0 m 1 0 l 1 1 l 0 1 l closepath popt } { /radius2 xd /radius1 xd pusht x concat radius1 radius2 div 1 scale 0 radius2 m 0 1 radius2 1 radius2 arct radius2 radius1 div dup 1 1 index 0 radius2 arct 0 0 0 radius2 arct 0 0 0 1 radius2 arct closepath popt } ifelse } bd /buf 0 def /width 0 def /height 0 def /skcimg { /tmpmat tmpmat currentmatrix def { concat } if /height xd /width xd /buf width 3 mul string def width height scale width height 8 [width 0 0 height neg 0 height] { currentfile buf readhexstring pop } bind false 3 colorimage tmpmat setmatrix } bd /skgimg { /tmpmat tmpmat currentmatrix def { concat } if /height xd /width xd /buf width string def width height scale width height 8 [width 0 0 height neg 0 height] { currentfile buf readhexstring pop } bind image tmpmat setmatrix } bd /rclip { 4 2 roll m dup 0 x rlineto x 0 rlineto neg 0 x rlineto closepath clip } bd /skeps { 10 dict begin /sk_state save def concat 3 index neg 3 index neg translate rclip 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [ ] 0 setdash newpath /sk_dict_count countdictstack def /sk_count count 1 sub def userdict begin /showpage { } def /languagelevel where { pop languagelevel 1 ne { false setstrokeadjust false setoverprint } if } if } bd /skepsend { count sk_count sub { pop } repeat countdictstack sk_dict_count sub { end } repeat sk_state restore end } bd /gradidx 0 def /gradient { 3 mul array /gradidx 0 def } bd /$ { 3 index gradidx 5 -1 roll put 2 index gradidx 1 add 4 -1 roll put 1 index gradidx 2 add 3 -1 roll put /gradidx gradidx 3 add def } bd /! { 3 { dup dup gradidx dup 3 1 roll 3 sub get put /gradidx gradidx 1 add def } repeat } bd /gradcolor { 3 mul dup 2 add 1 exch % idx 1 idx+2 { 1 index exch % array array i get % array component exch % component array } for 4 1 roll } bd /x0 0 def /y0 0 def /x1 0 def /y1 0 def /left 0 def /right 0 def /top 0 def /bottom 0 def /numcolors 0 def /axial { /y1 xd /x1 xd /y0 xd /x0 xd dup length 3 idiv /numcolors xd pusht exch % ctm array x0 x1 ne y0 y1 ne or { x0 y0 translate [x1 x0 sub y1 y0 sub dup neg 2 index 0 0] concat clippath flattenpath pathbbox /top xd /right xd /bottom xd /left xd newpath 0 gradcolor rgb clippath f 0 1 numcolors 1 sub { dup numcolors div 3 1 roll gradcolor rgb exch bottom right top R f } for } if pop popt } bd /r0 0 def /r1 0 def /dr 0 def /radial { /r1 xd /r0 xd /y0 xd /x0 xd /dr r1 r0 sub def dup length 3 idiv /numcolors xd pusht exch % ctm array r0 r1 ne { x0 y0 translate clippath flattenpath pathbbox /top xd /right xd /bottom xd /left xd newpath dr 0 gt {numcolors 1 sub}{0} ifelse gradcolor rgb clippath f dr 0 gt {numcolors 1 sub -1 0} { 0 1 numcolors 1 sub} ifelse { dup numcolors div dr mul r0 add 3 1 roll gradcolor rgb exch 0 0 3 -1 roll C f } for } if pop popt } bd /max { 2 copy lt {exch} if pop } bd /conical { pusht 5 1 roll 3 1 roll /y0 xd /x0 xd x0 y0 translate radgrad rotate dup length 3 idiv /numcolors xd clippath flattenpath pathbbox newpath 4 { abs 4 1 roll} repeat 3 { max } repeat 2 mul dup scale 0 gradcolor rgb 0 0 1 0 360 arc f 1 1 numcolors 1 sub { dup numcolors div 180 mul 3 1 roll gradcolor rgb exch 0 0 moveto 0 0 1 4 -1 roll dup neg arc closepath f } for pop popt } bd /XStep 0 def /YStep 0 def /imagedata 0 def /components 0 def /tileimage2 { exch 4 2 roll /height xd /width xd mark /components 2 index /PatternType 1 /PaintType 1 /TilingType 1 /BBox [0 0 width height] /XStep width /YStep height /PaintProc { begin XStep YStep 8 matrix imagedata false components colorimage end } counttomark 2 div cvi dup dict begin { def } repeat pop currentdict end dup /imagedata 4 -1 roll width height mul mul string currentfile exch readhexstring pop put exch makepattern setpattern clippath eofill } bd /tileimage1 { concat /components xd /height xd /width xd /imagedata currentfile width height mul components mul string readhexstring pop def clippath flattenpath pathbbox /top xd /right xd /bottom xd /left xd left width div floor width mul bottom height div floor height mul translate top bottom sub height div ceiling cvi { gsave right left sub width div ceiling cvi { width height 8 matrix components 1 eq { { imagedata } image } { imagedata false components colorimage } ifelse width 0 translate } repeat grestore 0 height translate } repeat } bd /makepattern where { pop /tileimage /tileimage2 load def } { /tileimage /tileimage1 load def } ifelse end %%EndResource %%EndProlog %%BeginSetup %%IncludeResource: font Helvetica 10.433 setmiterlimit %%EndSetup %%Page: 1 1 SketchDict begin 0 0 600 500 [1 0 0 1 11.0594 95.5815] skeps %%BeginDocument: /home/rmz/src/t1lib-5.0.0/doc/t1dump/parallelpath.eps %!PS-Adobe-2.0 EPSF-1.2 %%Creator: (Created manually by RMz, 2003-01-15. Illustration of t1lib parallel path construction) %%Title: Parallel Path Construction %%Pages: 1 %%PageOrder: Ascend %%BoundingBox: 0 0 600 500 %%EndComments % % 3. gsave /xa 100 def /ya 100 def /xb 100 def /yb 400 def /xc 500 def /yc 750 def /xd 500 def /yd 100 def % 4. /xa 100 def /ya 300 def /xb 100 def /y5 400 def /xc 500 def /yc 300 def /xd 300 def /yd 300 def % 2. /xa 100 def /ya 100 def /xb 100 def /yb 400 def /xc 300 def /yc 550 def /xd 500 def /yd 600 def % 1. /xa 55 def /ya 40 def /xb 120 def /yb 200 def /xc 300 def /yc 400 def /xd 550 def /yd 445 def /TimesRoman findfont 25 scalefont setfont /line1 20 string def /linewidth 100 def % compute distance from Bezier_A to Bezier_B /dista xb xa sub dup mul yb ya sub dup mul add sqrt def % compute distance from Bezier_C to Bezier_D /distd xd xc sub dup mul yd yc sub dup mul add sqrt def /diameter linewidth 2 div def % compute resulting limit values of thick curve at end points /dxa yb ya sub diameter mul dista div def /dya xb xa sub diameter mul dista div neg def /dxd yd yc sub diameter mul distd div def /dyd xd xc sub diameter mul distd div neg def % draw curve as rendered by ghostscript 0.9 0.9 0.9 setrgbcolor xa ya moveto xb yb xc yc xd yd curveto %linewidth 40 div setlinewidth linewidth setlinewidth 0 setlinecap stroke 0.0 0.0 0.0 setrgbcolor xa ya moveto xb yb xc yc xd yd curveto 1 setlinewidth 0 setlinecap [4 4] 0 setdash stroke % reset dash [] 0 setdash % correct right path end points /xar xa dxa add def /yar ya dya add def /xdr xd dxd add def /ydr yd dyd add def % correct left path end points /xal xa dxa sub def /yal ya dya sub def /xdl xd dxd sub def /ydl yd dyd sub def /x1 xa xb add 0.5 mul def /y1 ya yb add 0.5 mul def /x2 xb xc add 0.5 mul def /y2 yb yc add 0.5 mul def /x3 xc xd add 0.5 mul def /y3 yc yd add 0.5 mul def /x4 xa xb 2 mul add xc add 4 div def /y4 ya yb 2 mul add yc add 4 div def /x5 xd xc 2 mul add xb add 4 div def /y5 yd yc 2 mul add yb add 4 div def /x6 xa xb 3 mul add xc 3 mul add xd add 8 div def /y6 ya yb 3 mul add yc 3 mul add yd add 8 div def 0 0 0 setrgbcolor newpath xa ya 4.0 0 360 arc closepath fill newpath xb yb 4.0 0 360 arc closepath fill newpath xc yc 4.0 0 360 arc closepath fill newpath xd yd 4.0 0 360 arc closepath fill 0 0 0 setrgbcolor newpath x1 y1 3.0 0 360 arc closepath fill newpath x2 y2 3.0 0 360 arc closepath fill newpath x3 y3 3.0 0 360 arc closepath fill 0 0 0 setrgbcolor newpath x4 y4 2.0 0 360 arc closepath fill newpath x5 y5 2.0 0 360 arc closepath fill 0 0 0 setrgbcolor newpath x6 y6 4.0 0 360 arc closepath stroke % compute right-side normal vector /nabs diameter x5 x4 sub dup mul y5 y4 sub dup mul add sqrt div def /nxr y5 y4 sub nabs mul def /nyr x4 x5 sub nabs mul def 0 0 0 setrgbcolor newpath x6 nxr add y6 nyr add 4.0 0 360 arc closepath stroke newpath x6 nxr sub y6 nyr sub 4.0 0 360 arc closepath stroke % calculate location and direction vectors of lines to intersect /bloc1x 4 nxr x6 add mul xar 2 mul sub xdr add 3 div def /bloc1y 4 nyr y6 add mul yar 2 mul sub ydr add 3 div def /bdir1x xc xd add xa sub xb sub def /bdir1y yc yd add ya sub yb sub def /bloc2x xar def /bloc2y yar def /bdir2x xb xa sub def /bdir2y yb ya sub def % calculate determinant and inverse /bdet bdir2x bdir1y mul bdir2y bdir1x mul sub def %bdet 0.0 eq bdet abs 0.001 le { /xbr xb nxr add def /ybr yb nyr add def /bnu 0.0 def /bmu 0.0 def } { /binvdet 1 bdet div def % calculate inverse of dir matrix /binvdir2x bdir1y binvdet mul def /binvdir2y bdir2y binvdet mul neg def /binvdir1x bdir1x binvdet mul neg def /binvdir1y bdir2x binvdet mul def % calculate mu and nu value (nu actually is not required) /bmu binvdir2x bloc1x bloc2x sub mul binvdir1x bloc1y bloc2y sub mul add def /bnu binvdir2y bloc1x bloc2x sub mul binvdir1y bloc1y bloc2y sub mul add def /xbr bloc2x bmu bdir2x mul add def /ybr bloc2y bmu bdir2y mul add def } ifelse % calculate location and direction vectors of lines to intersect /cloc1x 4 nxr x6 add mul xar add xdr 2 mul sub 3 div def /cloc1y 4 nyr y6 add mul yar add ydr 2 mul sub 3 div def /cdir1x xc xd add xa sub xb sub def /cdir1y yc yd add ya sub yb sub def /cloc2x xdr def /cloc2y ydr def /cdir2x xc xd sub def /cdir2y yc yd sub def % calculate determinant and inverse /cdet cdir2x cdir1y mul cdir2y cdir1x mul sub def %cdet 0.0 eq cdet abs 0.001 le { % curve is just a straight line /xcr xc nxr add def /ycr yc nyr add def /cmu 0.0 def } { /cinvdet 1 cdet div def % calculate inverse of dir matrix /cinvdir2x cdir1y cinvdet mul def /cinvdir2y cdir2y cinvdet mul neg def /cinvdir1x cdir1x cinvdet mul neg def /cinvdir1y cdir2x cinvdet mul def % calculate mu and nu value (mu actually is not required) /cmu cinvdir2x cloc1x cloc2x sub mul cinvdir1x cloc1y cloc2y sub mul add def /cnu cinvdir2y cloc1x cloc2x sub mul cinvdir1y cloc1y cloc2y sub mul add def /xcr cloc2x cmu cdir2x mul add def /ycr cloc2y cmu cdir2y mul add def } ifelse % Analyse coefficients and decide how to compute displacements bmu 0.1 le { /xbr 8 nxr x6 add mul xar sub xdr sub 3 div xcr sub def /ybr 8 nyr y6 add mul yar sub ydr sub 3 div ycr sub def } if cmu 0.1 le { /xcr 8 nxr x6 add mul xar sub xdr sub 3 div xbr sub def /ycr 8 nyr y6 add mul yar sub ydr sub 3 div ybr sub def } if % define delta values /dxb xbr xb sub def /dyb ybr yb sub def /dxc xcr xc sub def /dyc ycr yc sub def 0.5 setlinewidth % show tangent at t=0.5 and their shifted counterparts [32 32] 0 setdash x4 y4 moveto x5 y5 lineto stroke x4 nxr add y4 nyr add moveto x5 nxr add y5 nyr add lineto x4 nxr sub y4 nyr sub moveto x5 nxr sub y5 nyr sub lineto stroke [] 0 setdash 0 0 0 setrgbcolor 1 setlinewidth % stroke right curve xar yar moveto xb dxb add yb dyb add xc dxc add yc dyc add xdr ydr curveto stroke % stroke left curve xal yal moveto xb dxb sub yb dyb sub xc dxc sub yc dyc sub xdl ydl curveto stroke %0.2 0.5 0.8 setrgbcolor %newpath bloc2x bloc2y 5.0 0 360 arc closepath fill %bloc2x 10 bdir2x mul sub bloc2y 10 bdir2y mul sub moveto %bloc2x 10 bdir2x mul add bloc2y 10 bdir2y mul add lineto stroke %0.5 0.5 0.5 setrgbcolor %newpath bloc1x bloc1y 5.0 0 360 arc closepath fill %bloc1x 10 bdir1x mul sub bloc1y 10 bdir1y mul sub moveto %bloc1x 10 bdir1x mul add bloc1y 10 bdir1y mul add lineto stroke % draw tangents 0 0 0 setrgbcolor %1 setlinewidth %[5 5] 0 setdash 0.5 setlinewidth [4 4] 0 setdash xa ya moveto xb yb lineto stroke xd yd moveto xc yc lineto stroke [] 0 setdash xar yar moveto xb dxb add yb dyb add lineto stroke xdr ydr moveto xc dxc add yc dyc add lineto stroke xal yal moveto xb dxb sub yb dyb sub lineto stroke xdl ydl moveto xc dxc sub yc dyc sub lineto stroke % draw auxiliary lines [8 8] 0 setdash xb yb moveto xc yc lineto stroke [16 16] 0 setdash x1 y1 moveto x2 y2 lineto stroke x2 y2 moveto x3 y3 lineto stroke % draw resulting points 0 0 0 setrgbcolor newpath xar yar 4.0 0 360 arc closepath fill newpath xb dxb add yb dyb add 4.0 0 360 arc closepath fill newpath xc dxc add yc dyc add 4.0 0 360 arc closepath fill newpath xdr ydr 4.0 0 360 arc closepath fill newpath xal yal 4.0 0 360 arc closepath fill newpath xb dxb sub yb dyb sub 4.0 0 360 arc closepath fill newpath xc dxc sub yc dyc sub 4.0 0 360 arc closepath fill newpath xdl ydl 4.0 0 360 arc closepath fill grestore %%EndDocument skepsend /Helvetica 12 sf (A) 48 127 0 0 0 rgb T (A') 108 98 T (B) 117 293 T (C) 306 501 T (D) 572 541 T (D') 582 485 T (C') 348 434 T (B') 177 248 T (P1) 82 211 T (P2) 204 394 T (P3) 432 524 T (P4) 146 308 T (P5) 321 461 T (P6) 256 376 T newpath 130.394 294.803 m 130.394 136.063 l 65.1969 136.063 l 1 w 0 j 0 J [4 4 ] 0 d S newpath 68.0315 136.063 m 113.386 116.22 l 113.386 136.063 l S (w/2) 74 115 T (P6') 283 331 T (A'') 14 138 T (B'') 79 334 T (C'') 274 549 T (D'') 561 581 T (P6'') 198 428 T %%PageTrailer showpage %%Trailer end %%DocumentSuppliedResources: procset Linux-Sketch-Procset 1.0 2 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1dump/t1dump_o.eps0000664000175000017500000005153511742726711023744 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-1.2 %%Creator: t1lib (edited manually by RMz, 2003-03-01) %%Title: Type1Char Character Dump %%Pages: 1 %%PageOrder: Ascend %%BoundingBox: 0 0 280 400 %%EndComments %! /T1LibDict 100 dict def T1LibDict begin % Setup the size from the type1 module /t1SetupSize { /size exch def } def % Prepare the page. Compute scales and fill the charspace unit square % background /t1PreparePage { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Start of Customizable Section % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Setup a standard linewidth /t1dumpstdlinewidth 1.0 def % Setup a scale for drawing direction arrows /arrowscale 1.2 def % Should we draw the device pixel grid? (1=yes, otherwise no) /t1drawgrid 0 def % Should we draw stems? (1=yes, otherwise no) /t1drawstems 0 def % Should we draw alignment zones? (1=yes, otherwise no) /t1drawzones 0 def % Should we fill the charspace unit square? (1=yes, otherwise no) /t1fillunitsquare 0 def % Should we fill the device page? (1=yes, otherwise no) /t1fillpage 0 def % Should we show path segment On-Curve points? (1=yes, otherwise no) /t1showoncurvepoints 0 def % Should we show path segment Off Curve points? (1=yes, otherwise no) /t1showoffcurvepoints 0 def % Should we show Bezier tangets and their defining points? (1=yes, otherwise no) /t1showbeziertangents 0 def % Define a few colors /t1linecolor { 0.0 0.0 0.0 } def /t1hlinecolor { 1.0 0.0 0.0 } def /t1slinecolor { 1.0 1.0 1.0 } def /t1movecolor { 0.0 0.0 0.0 } def /t1hmovecolor { 1.0 0.0 0.0 } def /t1smovecolor { 0.0 0.0 0.0 } def /t1curvecolor { 0.0 0.0 0.0 } def /t1hcurvecolor { 1.0 0.0 0.0 } def /t1scurvecolor { 0.0 0.0 0.0 } def /t1sprolongatecolor { 1.0 0.0 1.0 } def /t1stemcolor { 0.0 0.0 1.0 } def /t1alignedstemcolor { 1.0 0.0 1.0 } def /t1bottomzonecolor { 1.0 1.0 0.0 } def /t1topzonecolor { 1.0 1.0 0.0 } def /t1arrowcolor { 0.0 0.0 0.0 } def /t1harrowcolor { 1.0 0.0 0.0 } def /t1sarrowcolor { 0.0 0.0 0.0 } def /t1sbwcolor { 0.0 0.0 0.0 } def /t1closepathcolor { 0.0 0.0 0.0 } def /t1hclosepathcolor { 1.0 0.0 0.0 } def /t1sclosepathcolor { 0.0 0.0 1.0 } def /t1pagecolor { 0.7 0.7 0.7 } def /t1unitsquarecolor { 0.4 0.4 0.4 } def /t1gridcolor { 0.0 0.0 0.0 } def % Line scale relative to the standard linewidth /t1linescale 0.4 def /t1hlinescale 0.4 def /t1slinescale 0.4 def /t1movescale 0.1 def /t1hmovescale 0.4 def /t1smovescale 0.1 def /t1curvescale 0.4 def /t1hcurvescale 0.4 def /t1scurvescale 0.4 def /t1curvetangentscale 0.5 def /t1sprolongatescale 0.4 def /t1stemscale 0.5 def /t1alignedstemscale 0.5 def /t1bottomzonescale 0.5 def /t1topzonescale 0.5 def /t1closepathscale 0.4 def /t1hclosepathscale 0.4 def /t1sclosepathscale 0.4 def /t1gridscale 0.5 def % Line dash specifications (stems and zones are not configurable!) /t1linedash { [4 4] 0 } def /t1hlinedash { [] 0 } def /t1slinedash { [] 0 } def /t1movedash { [2 2] 0 } def /t1hmovedash { [2 2] 0 } def /t1smovedash { [2 2] 0 } def /t1curvedash { [4 4] 0 } def /t1hcurvedash { [] 0 } def /t1scurvedash { [] 0 } def /t1sprolongatedash { [1 1] 0 }def /t1closepathdash { [] 0 } def /t1hclosepathdash { [] 0 } def /t1sclosepathdash { [] 0 } def /t1griddash { [3 3] 0 } def % Define a clipping rectangle ROI (in charspace coordinates) /t1ROIxmin 0 def /t1ROIxmax 400 def /t1ROIymin -50 def /t1ROIymax 700 def % Device values (in bp). These must match the Bounding Box Statement! /xmindev 0 neg def /xmaxdev 280 def /ymindev 0 neg def /ymaxdev 400 def /dxdev 1 def /dydev 1 def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % End of Customizable Section % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % logical pixel values /xminpixel t1ROIxmin 1000.0 div size mul def /xmaxpixel t1ROIxmax 1000.0 div size mul def /yminpixel t1ROIymin 1000.0 div size mul def /ymaxpixel t1ROIymax 1000.0 div size mul def /dxpixel 1 def /dypixel 1 def % compute scales and set minimum scale /scalex xmaxdev xmindev sub xmaxpixel xminpixel sub div def /scaley ymaxdev ymindev sub ymaxpixel yminpixel sub div def scalex scaley gt { /scale scaley def } { /scale scalex def } ifelse % Fill device page xmindev ymindev moveto xmaxdev 0 rlineto 0 ymaxdev rlineto xmaxdev neg 0 rlineto 0 ymaxdev neg rlineto closepath clip t1fillpage 1 eq { t1pagecolor setrgbcolor fill } if % reassign device values /xmindev xminpixel scale mul def /xmaxdev xmaxpixel scale mul def /ymindev yminpixel scale mul def /ymaxdev ymaxpixel scale mul def /dxdev dxpixel scale mul def /dydev dypixel scale mul def % translate coordinate system xminpixel scale mul neg yminpixel scale mul neg translate % Fill unit square of charspace coordinate system t1fillunitsquare 1 eq { t1unitsquarecolor setrgbcolor 0 0 moveto size scale mul 0 rlineto 0 size scale mul rlineto size scale mul neg 0 rlineto 0 size scale mul neg rlineto closepath fill } if } def /t1FinishPage { t1drawgrid 1 eq { t1gridcolor setrgbcolor t1gridscale setlinewidth t1griddash setdash % draw grid and align to the point (0,0) 0 dxdev xmaxdev { /xval exch def xval ymindev moveto xval ymaxdev lineto stroke } for 0 dxdev neg xmindev { /xval exch def xval ymindev moveto xval ymaxdev lineto stroke } for 0 dydev ymaxdev { /yval exch def xmindev yval moveto xmaxdev yval lineto stroke } for 0 dydev neg ymindev { /yval exch def xmindev yval moveto xmaxdev yval lineto stroke } for } if } def % Define three arrow routines available for later providing the output with directions /t1arrowhead { /tmpy exch def /tmpx exch def gsave t1arrowcolor setrgbcolor currx curry translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale t1dumpstdlinewidth neg mul mul rlineto 6 arrowscale t1dumpstdlinewidth mul mul 2 arrowscale t1dumpstdlinewidth mul mul rlineto 6 arrowscale t1dumpstdlinewidth mul mul neg 2 arrowscale t1dumpstdlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1harrowhead { /tmpy exch def /tmpx exch def gsave t1harrowcolor setrgbcolor currhx currhy translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale currentlinewidth neg mul mul rlineto 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1sarrowhead { /tmpy exch def /tmpx exch def gsave t1sarrowcolor setrgbcolor currsx currsy translate tmpy tmpx atan rotate newpath 0 0 moveto 0 2 arrowscale t1dumpstdlinewidth neg mul mul rlineto 6 arrowscale t1dumpstdlinewidth mul mul 2 arrowscale t1dumpstdlinewidth mul mul rlineto 6 arrowscale t1dumpstdlinewidth mul mul neg 2 arrowscale t1dumpstdlinewidth mul mul rlineto closepath fill grestore tmpx tmpy } def /t1rlineto { /y2 exch scale mul def /x2 exch scale mul def t1linecolor setrgbcolor t1linedash setdash t1linescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currx curry moveto x2 y2 rlineto stroke /currx currx x2 add def /curry curry y2 add def } def /t1srlineto { /y2 exch scale mul def /x2 exch scale mul def t1slinecolor setrgbcolor t1slinedash setdash t1slinescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def } def /t1sprolongate { /y2 exch scale mul def /x2 exch scale mul def t1sprolongatecolor setrgbcolor t1sprolongatedash setdash t1sprolongatescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def } def /t1hintedrlineto { /y2 exch scale mul def /x2 exch scale mul def t1hlinecolor setrgbcolor t1hlinedash setdash t1hlinescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currhx currhy moveto x2 y2 rlineto stroke /currhx currhx x2 add def /currhy currhy y2 add def } def /t1rmoveto { /y2 exch scale mul def /x2 exch scale mul def t1movecolor setrgbcolor t1movedash setdash t1movescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currx curry moveto x2 y2 rlineto stroke /currx currx x2 add def /curry curry y2 add def /startx currx def /starty curry def } def /t1srmoveto { /y2 exch scale mul def /x2 exch scale mul def t1smovecolor setrgbcolor t1smovedash setdash t1smovescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currsx currsy moveto x2 y2 rlineto stroke /currsx currsx x2 add def /currsy currsy y2 add def /startsx currsx def /startsy currsy def } def /t1hintedrmoveto { /y2 exch scale mul def /x2 exch scale mul def t1hmovecolor setrgbcolor t1hmovedash setdash t1hmovescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill } if currhx currhy moveto x2 y2 rlineto stroke /currhx currhx x2 add def /currhy currhy y2 add def /starthx currhx def /starthy currhy def } def /t1rrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1curvecolor setrgbcolor t1curvedash setdash t1curvescale t1dumpstdlinewidth mul setlinewidth t1showoffcurvepoints 1 eq { newpath currx x2 add curry y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currx x2 x3 add add curry y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currx x2 x3 x4 add add add curry y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currx curry moveto currx x2 add curry y2 add lineto stroke currx x2 x3 add add curry y2 y3 add add moveto currx x2 x3 x4 add add add curry y2 y3 y4 add add add lineto stroke } if t1curvedash setdash t1curvescale t1dumpstdlinewidth mul setlinewidth currx curry moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currx currx x2 x3 x4 add add add def /curry curry y2 y3 y4 add add add def } def /t1srrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1scurvecolor setrgbcolor t1scurvedash setdash t1scurvescale t1dumpstdlinewidth mul setlinewidth t1showoffcurvepoints 1 eq { newpath currsx x2 add currsy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currsx x2 x3 add add currsy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currsx currsy moveto currsx x2 add currsy y2 add lineto stroke currsx x2 x3 add add currsy y2 y3 add add moveto currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add lineto stroke } if t1scurvedash setdash t1scurvescale t1dumpstdlinewidth mul setlinewidth currsx currsy moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currsx currsx x2 x3 x4 add add add def /currsy currsy y2 y3 y4 add add add def } def /t1hintedrrcurveto { /y4 exch scale mul def /x4 exch scale mul def /y3 exch scale mul def /x3 exch scale mul def /y2 exch scale mul def /x2 exch scale mul def t1hcurvecolor setrgbcolor t1hcurvedash setdash t1hcurvescale t1dumpstdlinewidth mul setlinewidth t1showoncurvepoints 1 eq { newpath currhx x2 add currhy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill newpath currhx x2 x3 add add currhy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill } if t1showoncurvepoints 1 eq { newpath currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill } if t1showbeziertangents 1 eq { [2 2] 0 setdash t1curvetangentscale currentlinewidth mul setlinewidth currhx currhy moveto currhx x2 add currhy y2 add lineto stroke currhx x2 x3 add add currhy y2 y3 add add moveto currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add lineto stroke } if t1hcurvedash setdash t1hcurvescale t1dumpstdlinewidth mul setlinewidth currhx currhy moveto x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto stroke /currhx currhx x2 x3 x4 add add add def /currhy currhy y2 y3 y4 add add add def } def /t1sbw { /wy exch scale mul def /wx exch scale mul def /sby exch scale mul def /sbx exch scale mul def t1sbwcolor setrgbcolor newpath sbx sby 3 0 360 arc closepath fill newpath wx wy 3 0 360 arc closepath fill /currx sbx def /curry sby def /currhx sbx def /currhy sby def /currsx sbx def /currsy sby def } def /t1closepath { t1closepathdash setdash t1closepathscale t1dumpstdlinewidth mul setlinewidth t1closepathcolor setrgbcolor currx curry moveto startx starty lineto stroke } def /t1sclosepath { t1sclosepathdash setdash t1sclosepathscale t1dumpstdlinewidth mul setlinewidth t1sclosepathcolor setrgbcolor currsx currsy moveto startsx startsy lineto stroke } def /t1hintedclosepath { t1hclosepathdash setdash t1hclosepathscale t1dumpstdlinewidth mul setlinewidth t1hclosepathcolor setrgbcolor currhx currhy moveto starthx starthy lineto stroke } def /t1vstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1stemscale t1dumpstdlinewidth mul setlinewidth t1stemcolor setrgbcolor [] 0 setdash stemstart ymindev moveto stemstart ymaxdev lineto stroke [2 2] 0 setdash stemwidth stemstart add ymindev moveto stemwidth stemstart add ymaxdev lineto stroke } if } def /t1alignedvstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1alignedstemscale t1dumpstdlinewidth mul setlinewidth t1alignedstemcolor setrgbcolor [] 0 setdash stemstart ymindev moveto stemstart ymaxdev lineto stroke [2 2] 0 setdash stemwidth stemstart add ymindev moveto stemwidth stemstart add ymaxdev lineto stroke } if } def /t1hstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1stemscale t1dumpstdlinewidth mul setlinewidth t1stemcolor setrgbcolor [] 0 setdash xmindev stemstart moveto xmaxdev stemstart lineto stroke [2 2] 0 setdash xmindev stemwidth stemstart add moveto xmaxdev stemwidth stemstart add lineto stroke } if } def /t1alignedhstem { t1drawstems 1 eq { /stemwidth exch scale mul def /stemstart exch scale mul def t1alignedstemscale t1dumpstdlinewidth mul setlinewidth t1alignedstemcolor setrgbcolor [] 0 setdash xmindev stemstart moveto xmaxdev stemstart lineto stroke [2 2] 0 setdash xmindev stemwidth stemstart add moveto xmaxdev stemwidth stemstart add lineto stroke } if } def /t1bottomzone { t1drawzones 1 eq { /bottom exch scale mul def /top exch scale mul def t1bottomzonescale t1dumpstdlinewidth mul setlinewidth t1bottomzonecolor setrgbcolor [] 0 setdash xmindev bottom moveto xmaxdev bottom lineto stroke [2 2] 0 setdash xmindev top moveto xmaxdev top lineto stroke } if } def /t1topzone { t1drawzones 1 eq { /bottom exch scale mul def /top exch scale mul def t1topzonescale t1dumpstdlinewidth mul setlinewidth t1topzonecolor setrgbcolor [2 2] 0 setdash xmindev bottom moveto xmaxdev bottom lineto stroke [] 0 setdash xmindev top moveto xmaxdev top lineto stroke } if } def end % Next follows drawing code from charstring commands: T1LibDict begin gsave 20.000001 t1SetupSize t1PreparePage -0.439758 0.000000 t1bottomzone 13.652496 14.092255 t1topzone 8.615265 8.955078 t1topzone 13.312683 13.532562 t1topzone -4.117737 -3.877869 t1bottomzone 0.559692 0.000000 0.559692 0.000000 t1sbw 9.005051 4.277649 t1srmoveto 0.000000 2.635088 -2.059844 2.192259 -2.507646 0.000000 t1srrcurveto -2.589196 0.000000 t1sarrowhead -1.998282 -2.253895 0.000000 -2.573452 t1srrcurveto 0.000000 -2.662721 2.147325 -1.984725 2.420165 0.000000 t1srrcurveto 2.501468 0.000000 t1sarrowhead 2.086011 2.026044 0.000000 2.621402 t1srrcurveto t1sclosepath -0.299835 0.000000 t1srmoveto 0.000000 -2.455808 -1.951770 -1.891803 -2.335873 0.000000 t1srrcurveto -2.257264 0.000000 t1sarrowhead -2.010390 1.853166 0.000000 2.494445 t1srrcurveto 0.000000 2.423801 1.879586 2.103710 2.408057 0.000000 t1srrcurveto 2.329696 0.000000 t1sarrowhead 1.937959 -2.045412 0.000000 -2.482100 t1srrcurveto t1sclosepath 0.149918 -0.000000 t1srmoveto -4.417572 -3.847885 t1srmoveto -0.808825 0.000000 -0.829075 0.393694 -0.511556 0.871540 t1srrcurveto -0.129291 -0.075888 t1sprolongate 0.130347 0.074061 t1sprolongate -0.475605 0.837065 t1sarrowhead -0.004550 1.172020 0.000000 0.735306 t1srrcurveto 0.000000 0.791693 0.003844 1.036104 0.457587 0.838909 t1srrcurveto -0.131612 0.071788 t1sprolongate 0.129291 -0.075888 t1sprolongate 0.510742 0.870153 t1sarrowhead 0.888167 0.395081 0.750547 0.000000 t1srrcurveto 0.828025 0.000000 0.810390 -0.413156 0.492055 -0.813783 t1srrcurveto 0.493212 -0.815696 t1sarrowhead 0.004874 -1.109989 0.000000 -0.775217 t1srrcurveto 0.000000 -0.730684 -0.003321 -1.039578 -0.420610 -0.841221 t1srrcurveto -0.000299 -0.000599 t1sprolongate -0.000294 -0.000601 t1sprolongate -0.415892 -0.850688 t1sarrowhead -0.828838 -0.544427 -0.939312 0.000000 t1srrcurveto t1sclosepath -0.000000 -0.299835 t1srmoveto 1.059589 0.000000 0.930195 0.614936 0.463625 0.948323 t1srrcurveto -0.134684 0.065845 t1sprolongate 0.134090 -0.067045 t1sprolongate 0.458906 0.917812 t1sarrowhead -0.003321 1.119235 0.000000 0.708525 t1srrcurveto 0.000000 0.743948 0.004874 1.208737 -0.546217 0.903359 t1srrcurveto -0.547374 0.905273 t1sarrowhead -0.908665 0.466361 -0.931008 0.000000 t1srrcurveto -0.848574 0.000000 -0.990800 -0.444457 -0.568665 -0.968836 t1srrcurveto -0.001193 -0.002032 t1sprolongate -0.001128 -0.002068 t1sprolongate -0.501886 -0.920124 t1sarrowhead 0.003844 -1.122710 0.000000 -0.767450 t1srrcurveto 0.000000 -0.703903 -0.004550 -1.266640 0.523846 -0.921968 t1srrcurveto 0.000521 -0.000918 t1sprolongate 0.000534 -0.000910 t1sprolongate 0.567850 -0.967449 t1sarrowhead 0.929958 -0.445844 0.910231 0.000000 t1srrcurveto t1sclosepath 0.000000 0.149918 t1srmoveto t1FinishPage 0.559692 0.000000 0.559692 0.000000 t1sbw 8.855133 4.277649 t1rmoveto 0.000000 2.558594 t1arrowhead -1.998901 2.118835 -2.418671 0.000000 t1rrcurveto -2.498627 0.000000 -1.938934 -2.178802 0.000000 -2.498627 t1rrcurveto 0.000000 -2.578583 t1arrowhead 2.078857 -1.918945 2.338715 0.000000 t1rrcurveto 2.418671 0.000000 2.018890 1.958923 0.000000 2.538605 t1rrcurveto t1closepath -4.417572 -3.997803 t1rmoveto -0.859528 0.000000 t1arrowhead -0.879517 0.419769 -0.539703 0.919495 t1rrcurveto -0.499725 0.879517 0.000000 1.219330 0.000000 0.719604 t1rrcurveto 0.000000 0.779572 t1arrowhead 0.000000 1.079407 0.479736 0.879517 t1rrcurveto 0.539703 0.919495 0.939484 0.419769 0.799561 0.000000 t1rrcurveto 0.879517 0.000000 t1arrowhead 0.859528 -0.439758 0.519714 -0.859528 t1rrcurveto 0.519714 -0.859528 0.000000 -1.159363 0.000000 -0.759583 t1rrcurveto 0.000000 -0.719604 t1arrowhead 0.000000 -1.079407 -0.439758 -0.879517 t1rrcurveto -0.439758 -0.899506 -0.879517 -0.579681 -0.999451 0.000000 t1rrcurveto t1closepath t1FinishPage grestore end xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/shearv.eps0000664000175000017500000000054611742726711022266 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-1.2 %%BoundingBox: 0 0 200 200 %%EndComments /TimesRoman findfont 150 scalefont setfont 100 100 translate gsave [ 1 0.5 0 1 0 0] concat 0 0 moveto 100 0 rlineto 0 0 moveto 0 100 rlineto stroke 0 0 moveto (g) show grestore [ 3 3 ] 2 setdash 0 0 moveto 100 0 rlineto 0 0 moveto 0 100 rlineto stroke 0 0 moveto (g) true charpath stroke xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/type1afm.tex0000664000175000017500000000517511742726711022540 0ustar uwabamiuwabami%---------------------------------------------------------------------------- % ----- File: type1afm.tex % ----- Author: Rainer Menzner (Rainer.Menzner@web.de) % ----- Date: 2001-04-01 % ----- Description: This file is part of the t1lib-documentation. % ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. % As of version 0.5, t1lib is distributed under the % GNU General Public Library Lincense. The % conditions can be found in the files LICENSE and % LGPL, which should reside in the toplevel % directory of the distribution. Please note that % there are parts of t1lib that are subject to % other licenses: % The parseAFM-package is copyrighted by Adobe Systems % Inc. % The type1 rasterizer is copyrighted by IBM and the % X11-consortium. % ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) % ----- Credits: I want to thank IBM and the X11-consortium for making % their rasterizer freely available. % Also thanks to Piet Tutelaers for his ps2pk, from % which I took the rasterizer sources in a format % independ from X11. % Thanks to all people who make free software living! %---------------------------------------------------------------------------- \newpage \section{The Program {\ttfamily type1afm}} \label{type1afm}% \verb+type1afm+ is a simple commandline tool (about 150 lines C source code) that allows to generate an AFM file from a Type 1 font program. It is intended for people who want to use Type 1 font files that come without AFM files with \tonelib\ (or other software that requires AFM files). The syntax is \\[0.5cm] \verb+type1afm [-l] [ ...] +\\[0.5cm] For each fontfile specified on the commandline, an AFM file with the corresponding name is generated in the current directory. Most of the work is done in \tonelib-internal functions. See section \ref{missingafmfiles} on how AFM information is generated and written to files. It is usually not desireable to leave a logfile wherever the utility has been executed. Thus by default no logfile is generated. This behaviour can be changed by specifying the optional parameter \verb+-l+. This causes a logfile with \verb+T1LOG_DEBUG+ as loglevel to be written to the disk. Its name will be \verb+t1lib.log+ (see \ref{logfile}). %%% Local Variables: %%% mode: latex %%% TeX-master: "t1lib_doc" %%% End: xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlineproblems2.pdf0000664000175000017500000060554211742726711024274 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ3Ð3T0A(œËU„æ†`Qs3©k g¦ff úAf .ù\@‰ lendstream endobj 5 0 obj 51 endobj 3 0 obj << /Type /Page /MediaBox [0 0 871 76] /Parent 2 0 R /Resources << /ProcSet [/PDF /ImageC] /XObject<> >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 8 0 obj << /CreationDate (D:20010110083133) /Producer (GNU Ghostscript 5.10) >> endobj 6 0 obj << /Type /XObject /Name /R6 /Subtype /Image /Length 7 0 R /ColorSpace /DeviceRGB/Width 871/Height 76/BitsPerComponent 8 >> stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ endstream endobj 7 0 obj 198589 endobj xref 0 9 0000000000 65535 f 0000000362 00000 n 0000000303 00000 n 0000000154 00000 n 0000000015 00000 n 0000000136 00000 n 0000000498 00000 n 0000199242 00000 n 0000000411 00000 n trailer << /Size 9 /Root 1 0 R /Info 8 0 R >> startxref 199264 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/concatglyphs.pdf0000664000175000017500000021772011742726711023462 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ3Ð3T0A(œËU„†ææ`QCcCÏ ,LA*ôƒÌ\ò¹ˆÆ iendstream endobj 5 0 obj 50 endobj 3 0 obj << /Type /Page /MediaBox [0 0 177 137] /Parent 2 0 R /Resources << /ProcSet [/PDF /ImageC] /XObject<> >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 8 0 obj << /CreationDate (D:20010110083040) /Producer (GNU Ghostscript 5.10) >> endobj 6 0 obj << /Type /XObject /Name /R6 /Subtype /Image /Length 7 0 R /ColorSpace /DeviceRGB/Width 177/Height 137/BitsPerComponent 8 >> stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ endstream endobj 7 0 obj 72748 endobj xref 0 9 0000000000 65535 f 0000000362 00000 n 0000000303 00000 n 0000000153 00000 n 0000000015 00000 n 0000000135 00000 n 0000000498 00000 n 0000073402 00000 n 0000000411 00000 n trailer << /Size 9 /Root 1 0 R /Info 8 0 R >> startxref 73423 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/extenth.eps0000664000175000017500000000054611742726711022455 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-1.2 %%BoundingBox: 0 0 200 200 %%EndComments /TimesRoman findfont 150 scalefont setfont 100 100 translate gsave [ 1.4 0 0 1 0 0] concat 0 0 moveto 100 0 rlineto 0 0 moveto 0 100 rlineto stroke 0 0 moveto (g) show grestore [ 3 3 ] 2 setdash 0 0 moveto 100 0 rlineto 0 0 moveto 0 100 rlineto stroke 0 0 moveto (g) true charpath stroke xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/extentv.pdf0000664000175000017500000000251011742726711022446 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ]T9’1 Ìù †v2ÆA‚dê*?`-e.GrùªU°‘¿o4ÀQÉÖJ3Ý$Ž&.\ û}»—·Âõ—ÿþ”·Ê±W¹›LTM¦Õ{‘'öúß]¾w©/Oáh‡«¯åÃg«Ü©^¿—”à.5œýw½¿ûñþú»|ººÿ—ª„ï×*T¿y—èFaI©fã×Öã%¹~)<¨{Â)Ø láÑç:žX0î:€ú¡ð$Þ}÷V¸ k6œ¹SS §)xéRÇËuho‰ÜC¸… Ö™ÂbNÜÚŽ¼¹vÀ-Êò0Ò–V"î*¦BŒ‡Ûð˜X๭ÜA‰âXþy`šœù’µé;â=!å ²PHÎH0^™ŽšÔ‰ã๠œ EºŽ¢ØpµÞ€¨Xä‰õ¹µ…ɰ3õ€(óòÈfY/ñÄ–I@˜8;$|(ãQ£Îèû0SWZ1¢=Ä­]†ð9™îð'ÏÌÒÜAœQÎ襟ˆ­ ë‚~™ECž‡–qlÆmZ6þÒÅûÃÂ_0*(‰Ž¹Q맜ڲ^îÞ0>tNÑ­üÄL€¯50á2`¸¦åDR]#¤4Cí“DìÇŽùe\{ú} `à0zÒ½Œ³Ž…†ùÄ$ªlâ“6ê$9”x›QW‡‹²ä%ŠrÊÝêg^²û‰WôMáú‚b¼€Ð„Ùóšúz“¼Y"y‘âôó„m@<6ÜËÖ³ Àº¢¾‰y_Ãu¸½˜Ÿ@s²€qÎ=Ø }Úgö6tKdósŒþøt)/å/¬œ!endstream endobj 5 0 obj 596 endobj 3 0 obj << /Type /Page /MediaBox [0 0 200 200] /Parent 2 0 R /Resources << /ProcSet [/PDF /Text] /Font << /R6 6 0 R >> >> /Contents 4 0 R >> endobj 6 0 obj <> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 7 0 obj << /CreationDate (D:20010110083058) /Producer (GNU Ghostscript 5.10) >> endobj xref 0 8 0000000000 65535 f 0000000980 00000 n 0000000921 00000 n 0000000700 00000 n 0000000015 00000 n 0000000681 00000 n 0000000848 00000 n 0000001029 00000 n trailer << /Size 8 /Root 1 0 R /Info 7 0 R >> startxref 1116 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlineproblems4.eps0000664000175000017500000156237011742726711024316 0ustar uwabamiuwabami%!PS-Adobe-3.0 EPSF-3.0 %%Creator: tiff2ps %%Title: outlineproblems4.tif %%CreationDate: Wed May 5 18:52:32 1999 %%DocumentData: Clean7Bit %%Origin: 0 0 %%BoundingBox: 0 0 871 85 %%LanguageLevel: 1 %%Pages: (atend) %%EndComments %%BeginSetup %%EndSetup %%Page: 1 1 gsave 100 dict begin 871.000000 85.000000 scale /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def /colorimage where {pop} { /colorimage {pop pop /rgbproc exch def {bwproc} image} bind def } ifelse %ImageData: 871 85 8 3 0 1 2 "false 3 colorimage" /line 2613 string def 871 85 8 [871 0 0 -85 0 85] {currentfile line readhexstring pop} bind false 3 colorimage ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffff000000ffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffff000000000000ffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000ffffff000000000000ffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffff000000000000ffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffff000000ffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffff000000ffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffff000000ffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffff000000ffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffff000000ffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffff000000ffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000 ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff 000000ffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffff000000ffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000ffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffff000000ffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffff000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000ffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffff000000ffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffff000000ffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffff000000ffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffff000000000000ffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffff000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffff000000ffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffff000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffff000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffff000000ffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffff000000000000ffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffff000000000000000000 ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffff000000ffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffff000000ffffff ffffffffffffffffff000000ffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffff000000000000 000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff 000000ffffffffffffffffffffffff000000ffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff 000000000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffff000000ffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000 ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffff000000ffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffff000000ffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffff000000 000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffff000000ffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffff000000000000 ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffff000000ffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffff000000ffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffff000000ffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff 000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffff000000000000ffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffff000000ffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffff000000ffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffff000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffff000000000000ffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffff000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffff000000000000ffffff000000000000000000000000ffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffff000000000000000000ffffff000000000000000000 000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffff000000000000000000ffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffff000000000000ffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffff000000000000000000ffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000ffffffffffff000000000000000000 ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffff000000000000000000 ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffff000000000000000000ffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000 000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffff000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff 000000000000000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffff000000000000000000000000 ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffff000000ffffffffffff 000000000000ffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffff000000000000000000ffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffff000000ffffff ffffff000000000000000000ffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000ffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffff000000 000000ffffffffffff000000000000ffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffff000000000000 ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffff000000000000ffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffff000000ffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffff000000000000000000ffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffff000000ffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffff000000000000ffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff 000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffff000000ffffff000000000000ffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff000000 000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffff000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffff000000000000000000000000ffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffff000000000000000000 000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffff000000000000ffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff end grestore showpage %%Trailer %%Pages: 1 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlineproblems1.pdf0000664000175000017500000064424111742726711024272 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ3Ð3T0A(œËU„æ†`Q #©k g†ÆÆ úAf .ù\@ˆ— gendstream endobj 5 0 obj 52 endobj 3 0 obj << /Type /Page /MediaBox [0 0 871 82] /Parent 2 0 R /Resources << /ProcSet [/PDF /ImageC] /XObject<> >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 8 0 obj << /CreationDate (D:20010110083125) /Producer (GNU Ghostscript 5.10) >> endobj 6 0 obj << /Type /XObject /Name /R6 /Subtype /Image /Length 7 0 R /ColorSpace /DeviceRGB/Width 871/Height 82/BitsPerComponent 8 >> stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ endstream endobj 7 0 obj 214267 endobj xref 0 9 0000000000 65535 f 0000000363 00000 n 0000000304 00000 n 0000000155 00000 n 0000000015 00000 n 0000000137 00000 n 0000000499 00000 n 0000214921 00000 n 0000000412 00000 n trailer << /Size 9 /Root 1 0 R /Info 8 0 R >> startxref 214943 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1lib_doc.pdf0000664000175000017500000300036611742726711022623 0ustar uwabamiuwabami%PDF-1.2 6 0 obj << /S /GoTo /D (section.1) >> endobj 8 0 obj (Introduction) endobj 10 0 obj << /S /GoTo /D (subsection.1.1) >> endobj 12 0 obj (What Does t1lib Do?) endobj 14 0 obj << /S /GoTo /D (subsection.1.2) >> endobj 16 0 obj (Copyrights and Credits) endobj 18 0 obj << /S /GoTo /D (subsection.1.3) >> endobj 20 0 obj (Motivation) endobj 22 0 obj << /S /GoTo /D (subsection.1.4) >> endobj 24 0 obj (How to Reach the Author/How to Get t1lib) endobj 26 0 obj << /S /GoTo /D (section.2) >> endobj 28 0 obj (Getting Started) endobj 30 0 obj << /S /GoTo /D (subsection.2.1) >> endobj 32 0 obj (Building, Installing and Removing the t1lib-Package) endobj 34 0 obj << /S /GoTo /D (subsection.2.2) >> endobj 36 0 obj (Notes on Using GNU libtool) endobj 38 0 obj << /S /GoTo /D (subsection.2.3) >> endobj 40 0 obj (Runtime-Setup) endobj 42 0 obj << /S /GoTo /D (subsubsection.2.3.1) >> endobj 44 0 obj (Searchpath and Environment Setup) endobj 46 0 obj << /S /GoTo /D (subsubsection.2.3.2) >> endobj 48 0 obj (The t1lib Configuration File) endobj 50 0 obj << /S /GoTo /D (subsubsection.2.3.3) >> endobj 52 0 obj (The Font Database File) endobj 54 0 obj << /S /GoTo /D (subsubsection.2.3.4) >> endobj 56 0 obj (Alternative Runtime Setups) endobj 58 0 obj << /S /GoTo /D (subsection.2.4) >> endobj 60 0 obj (A Very Simple Programming Example) endobj 62 0 obj << /S /GoTo /D (section.3) >> endobj 64 0 obj (The Program xglyph) endobj 66 0 obj << /S /GoTo /D (subsection.3.1) >> endobj 68 0 obj (Common Parameter Dialogs and Toggle Buttons) endobj 70 0 obj << /S /GoTo /D (subsection.3.2) >> endobj 72 0 obj (Buttons that Influence the X11 Rastering Functions) endobj 74 0 obj << /S /GoTo /D (subsection.3.3) >> endobj 76 0 obj (Buttons that Generate Actions) endobj 78 0 obj << /S /GoTo /D (subsection.3.4) >> endobj 80 0 obj (The Message Window) endobj 82 0 obj << /S /GoTo /D (subsection.3.5) >> endobj 84 0 obj (The Output Window) endobj 86 0 obj << /S /GoTo /D (subsection.3.6) >> endobj 88 0 obj (xglyph Commandline Parameters) endobj 90 0 obj << /S /GoTo /D (subsection.3.7) >> endobj 92 0 obj (Fonts Included in the t1lib-Package) endobj 94 0 obj << /S /GoTo /D (subsection.3.8) >> endobj 96 0 obj (Some General Remarks on xglyph) endobj 98 0 obj << /S /GoTo /D (section.4) >> endobj 100 0 obj (The Program type1afm) endobj 102 0 obj << /S /GoTo /D (section.5) >> endobj 104 0 obj (Using t1lib) endobj 106 0 obj << /S /GoTo /D (subsection.5.1) >> endobj 108 0 obj (Compiling and Linking t1lib-Programs) endobj 110 0 obj << /S /GoTo /D (subsection.5.2) >> endobj 112 0 obj (Querying and Setting Fundamental Configuration Parameters of t1lib) endobj 114 0 obj << /S /GoTo /D (subsection.5.3) >> endobj 116 0 obj (Initialization of t1lib and Related Things) endobj 118 0 obj << /S /GoTo /D (subsubsection.5.3.1) >> endobj 120 0 obj (Standard Initialization) endobj 122 0 obj << /S /GoTo /D (subsubsection.5.3.2) >> endobj 124 0 obj (Fine Control over Font Databases and File Search Paths) endobj 126 0 obj << /S /GoTo /D (subsubsection.5.3.3) >> endobj 128 0 obj (Adding Fonts to the Database) endobj 130 0 obj << /S /GoTo /D (subsubsection.5.3.4) >> endobj 132 0 obj (Summary of Search Path Handling) endobj 134 0 obj << /S /GoTo /D (subsubsection.5.3.5) >> endobj 136 0 obj (Bypassing the t1lib File Search Machinery) endobj 138 0 obj << /S /GoTo /D (subsection.5.4) >> endobj 140 0 obj (The t1lib-Logfile) endobj 142 0 obj << /S /GoTo /D (subsection.5.5) >> endobj 144 0 obj (Generating Bitmaps) endobj 146 0 obj << /S /GoTo /D (subsection.5.6) >> endobj 148 0 obj (Loading Fonts Explicitly) endobj 150 0 obj << /S /GoTo /D (subsection.5.7) >> endobj 152 0 obj (Functions for Encoding Handling) endobj 154 0 obj << /S /GoTo /D (subsection.5.8) >> endobj 156 0 obj (Deleting Data) endobj 158 0 obj << /S /GoTo /D (subsection.5.9) >> endobj 160 0 obj (Underlining, Overlining and Overstriking) endobj 162 0 obj << /S /GoTo /D (subsection.5.10) >> endobj 164 0 obj (Common Information on Fonts and Characters) endobj 166 0 obj << /S /GoTo /D (subsubsection.5.10.1) >> endobj 168 0 obj (Information from FontInfo-Dictionary) endobj 170 0 obj << /S /GoTo /D (subsubsection.5.10.2) >> endobj 172 0 obj (Metric Information on Glyphs) endobj 174 0 obj << /S /GoTo /D (subsubsection.5.10.3) >> endobj 176 0 obj (Character-Encoding Relation) endobj 178 0 obj << /S /GoTo /D (subsubsection.5.10.4) >> endobj 180 0 obj (Administrative Information) endobj 182 0 obj << /S /GoTo /D (subsection.5.11) >> endobj 184 0 obj (Transformation of Fonts) endobj 186 0 obj << /S /GoTo /D (subsubsection.5.11.1) >> endobj 188 0 obj (Fontlevel Transformations) endobj 190 0 obj << /S /GoTo /D (subsubsection.5.11.2) >> endobj 192 0 obj (Transformation at Rastering Time) endobj 194 0 obj << /S /GoTo /D (subsubsection.5.11.3) >> endobj 196 0 obj (t1lib and PostScript: Notes on Transformation Matrices) endobj 198 0 obj << /S /GoTo /D (subsection.5.12) >> endobj 200 0 obj (Stroking of Character Outlines) endobj 202 0 obj << /S /GoTo /D (subsection.5.13) >> endobj 204 0 obj (Antialiasing) endobj 206 0 obj << /S /GoTo /D (subsubsection.5.13.1) >> endobj 208 0 obj (General Description) endobj 210 0 obj << /S /GoTo /D (subsubsection.5.13.2) >> endobj 212 0 obj (Setting Operating Parameters) endobj 214 0 obj << /S /GoTo /D (subsubsection.5.13.3) >> endobj 216 0 obj (Smart Antialiasing) endobj 218 0 obj << /S /GoTo /D (subsubsection.5.13.4) >> endobj 220 0 obj (Caching of Antialiased Character Glyphs) endobj 222 0 obj << /S /GoTo /D (subsection.5.14) >> endobj 224 0 obj (Interface to Outlines) endobj 226 0 obj << /S /GoTo /D (subsubsection.5.14.1) >> endobj 228 0 obj (Outline Format) endobj 230 0 obj << /S /GoTo /D (subsubsection.5.14.2) >> endobj 232 0 obj (Using Outlines) endobj 234 0 obj << /S /GoTo /D (subsubsection.5.14.3) >> endobj 236 0 obj (Manipulation of Outlines) endobj 238 0 obj << /S /GoTo /D (subsection.5.15) >> endobj 240 0 obj (Logical Fonts) endobj 242 0 obj << /S /GoTo /D (subsection.5.16) >> endobj 244 0 obj (Missing or Invalid AFM Files) endobj 246 0 obj << /S /GoTo /D (subsubsection.5.16.1) >> endobj 248 0 obj (Remarks on AFM Files) endobj 250 0 obj << /S /GoTo /D (subsubsection.5.16.2) >> endobj 252 0 obj (Generation of AFM Information) endobj 254 0 obj << /S /GoTo /D (subsubsection.5.16.3) >> endobj 256 0 obj (Writing AFM Files) endobj 258 0 obj << /S /GoTo /D (subsection.5.17) >> endobj 260 0 obj (Font Subsetting) endobj 262 0 obj << /S /GoTo /D (subsubsection.5.17.1) >> endobj 264 0 obj (Font File Organization and Subsetting) endobj 266 0 obj << /S /GoTo /D (subsubsection.5.17.2) >> endobj 268 0 obj (Functions for Subsetting) endobj 270 0 obj << /S /GoTo /D (subsubsection.5.17.3) >> endobj 272 0 obj (Further Functions for Subsetting) endobj 274 0 obj << /S /GoTo /D (subsection.5.18) >> endobj 276 0 obj (Composite Characters) endobj 278 0 obj << /S /GoTo /D (subsubsection.5.18.1) >> endobj 280 0 obj (General remarks) endobj 282 0 obj << /S /GoTo /D (subsubsection.5.18.2) >> endobj 284 0 obj (Accessing Composite Character Data) endobj 286 0 obj << /S /GoTo /D (subsubsection.5.18.3) >> endobj 288 0 obj (Transparent Handling of Composite Characters and User Extensions) endobj 290 0 obj << /S /GoTo /D (subsubsection.5.18.4) >> endobj 292 0 obj (Caveats) endobj 294 0 obj << /S /GoTo /D (subsection.5.19) >> endobj 296 0 obj (Error Handling) endobj 298 0 obj << /S /GoTo /D (subsubsection.5.19.1) >> endobj 300 0 obj (Type 1 Font File Scan-Errors) endobj 302 0 obj << /S /GoTo /D (subsubsection.5.19.2) >> endobj 304 0 obj (Path Generation Errors) endobj 306 0 obj << /S /GoTo /D (subsubsection.5.19.3) >> endobj 308 0 obj (t1lib-Errors) endobj 310 0 obj << /S /GoTo /D (subsection.5.20) >> endobj 312 0 obj (Other Useful Functions) endobj 314 0 obj << /S /GoTo /D (section.6) >> endobj 316 0 obj (The X11-Interface) endobj 318 0 obj << /S /GoTo /D (subsection.6.1) >> endobj 320 0 obj (Why a Special X11-Interface?) endobj 322 0 obj << /S /GoTo /D (subsection.6.2) >> endobj 324 0 obj (Initialization of the X11-Interface) endobj 326 0 obj << /S /GoTo /D (subsection.6.3) >> endobj 328 0 obj (Rastering Functions) endobj 330 0 obj << /S /GoTo /D (subsection.6.4) >> endobj 332 0 obj (Creating XPM-Files from t1lib-Glyphs) endobj 334 0 obj << /S /GoTo /D (subsection.6.5) >> endobj 336 0 obj (Limits of the X11 Interface) endobj 338 0 obj << /S /GoTo /D (section.7) >> endobj 340 0 obj (Internals \(incomplete\)) endobj 342 0 obj << /S /GoTo /D (subsection.7.1) >> endobj 344 0 obj (Level 0: Global Data) endobj 346 0 obj << /S /GoTo /D (subsection.7.2) >> endobj 348 0 obj (Level 1: Size-Independent Font Data) endobj 350 0 obj << /S /GoTo /D (subsection.7.3) >> endobj 352 0 obj (Level 2: Size-Dependent Font Data) endobj 354 0 obj << /S /GoTo /D (section.8) >> endobj 356 0 obj (Stroked Characters) endobj 358 0 obj << /S /GoTo /D (subsection.8.1) >> endobj 360 0 obj (Approach) endobj 362 0 obj << /S /GoTo /D (subsection.8.2) >> endobj 364 0 obj (Computation of Parallel Paths) endobj 366 0 obj << /S /GoTo /D (subsection.8.3) >> endobj 368 0 obj (Connection of Path Segments and Prolongation) endobj 370 0 obj << /S /GoTo /D (equation.20) >> endobj 372 0 obj (Function Index) endobj 374 0 obj << /S /GoTo /D [373 0 R /Fit ] >> endobj 378 0 obj << /Length 379 0 R /Filter /FlateDecode >> stream xÚ¥R;OÃ0Þû+<:Rsõ_ÉØ"ŠtA bHÛ"”¤J³þ<ç8€y¸‡¿ï»‡BñAáIøÌùL욊x^ćwùˆ4Vƒ5!ú˜’& ²"Õ2gÆÿ¢¡Hå"õrEAbUÌkÌð™Åa„ûYàm½M‹ëÅšXÆ€6.ܧ–ÀêÐOzÄÞ'ɪ?Õ]›¤š¼´€ ‚kå[0NnÊz=Ìæñ†”²S-С `ƵH¤¼A§ÜX`É o%wÔ—ý9Zº>:WU[õåP·OAMhð–ÙZáwì‹ç²/wC5áWõДÇÓ¤ÒwÍHã0wßxË}·e”’UÀ:Y$åùÈÆ”•Í:Éäá5Éá4Íd¾,w¥4‹{d¢ø]Y·±£\nªö5Lœ]Ÿï…¹T^¤Ž‚Ô¿?Ó;˜@“‡endstream endobj 379 0 obj 339 endobj 373 0 obj << /Type /Page /Contents 378 0 R /Resources 377 0 R /MediaBox [0 0 595.273 841.887] /Parent 383 0 R >> endobj 1 0 obj << /Type /Encoding /Differences [ 24 /breve /caron /circumflex /dotaccent /hungarumlaut /ogonek /ring /tilde 39 /quotesingle 96 /grave 128 /bullet /dagger /daggerdbl /ellipsis /emdash /endash /florin /fraction /guilsinglleft /guilsinglright /minus /perthousand /quotedblbase /quotedblleft /quotedblright /quoteleft /quoteright /quotesinglbase /trademark /fi /fl /Lslash /OE /Scaron /Ydieresis /Zcaron /dotlessi /lslash /oe /scaron /zcaron 164 /currency 166 /brokenbar 168 /dieresis /copyright /ordfeminine 172 /logicalnot /.notdef /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu 183 /periodcentered /cedilla /onesuperior /ordmasculine 188 /onequarter /onehalf /threequarters 192 /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] >> endobj 2 0 obj << /Type /Font /Subtype /Type1 /Name /ZaDb /BaseFont /ZapfDingbats >> endobj 3 0 obj << /Type /Font /Subtype /Type1 /Name /Helv /BaseFont /Helvetica /Encoding 1 0 R >> endobj 4 0 obj << /Fields [] /DR << /Font << /ZaDb 2 0 R /Helv 3 0 R >> >> /DA (/Helv 10 Tf 0 g ) /NeedAppearances true >> endobj 376 0 obj << /D [373 0 R /XYZ 72 786.278 null] >> endobj 375 0 obj << /D [373 0 R /XYZ 72 761.372 null] >> endobj 377 0 obj << /Font << /F19 380 0 R /F21 381 0 R /F23 380 0 R /F24 382 0 R >> /ProcSet [ /PDF /Text ] >> endobj 388 0 obj << /Length 389 0 R /Filter /FlateDecode >> stream xÚí\]sÛ¸}ϯУ4Sa‰oà©c;qÖÝd7ngÚ>p%ZâX"=•ûë{I4MÀM»¦ek2ë¢܃{Ï=÷BxäÁ?<’d$•@DªÑlýÌ¿«QùèxÍŒdœ"βg;NË‘SÊ‘<|ñî§SÂG˜!ÊÄèâ2{1ÿ×ø$Ž&”ŒÓÀüÙLþsñ·w.ª«y£)aˆñüþÌ |mùè—âÒb„=¤=]¿4žL5áã3så$žLáï|;KCøÎÆ×(Ž8Ñ»'GF’™q÷3k^~Êh6HŒ¦Ö†·Îs×\Ì{„Œ_ú)Ì„Òñ{˜‘ã _3¸Yûœ"ˆKQ|8Å«ð3èÎÅ)ÓbÐûø¯Í»Æ”"©ÔîUáˆz¸¶(Î) É”{^íÓÚ~ñ‘ï zéÆòM üþå»­,qجËÞ£aØÌ9Θî4Rí$¾ž5¾IÂÅrBt¶7vlìGóì H‚yhïXLbŠï¾YŒ‘W¢ë`óòP×Ä‹bsÜ/|@¼Ð/Ÿã4ü>áb컬”ˆ`Òð â-ƒâÁ—n,4e™%Y‰QÄ ýgNçOãjÒØDº¯?›@¨[š§é20޶é2N~Ê>£›Ÿù¤Ž¸Hà¥ÍÀxg2‚˜èÀÒd_¢^ÓG?€Åz^”´°/Ÿ#†ÏaÓ0Z€•Ÿ§~’sk~E”wˆAÙnÑx'¡“í„®äIÅ获áj3ú‹ «gÑ&õW+3Ex^ÅÛ¯Á:ÎvÁ÷â-³\Ljc¾ƒüä¤dˆÓ/Ù®3›ì*÷á‹ÀO),w¯©FZ‹—àÁ-bw†{ÅW9˜g$û5Nƒ‚‚AxÍíÿmSAáã¯ßPÀ€R\Y€ÆñÊZé!B:– 7˜›Èç°W´ìõ$Àá}pSò²¯Û(§ïá:˜žéöºyKZ"OtHìÐu}ÈòJ¤áìyƒ ØI>ÆãÐ<4aá5ð“Y–×~º¼èøCŽ«ïaGëÀ`̸''ʈ3 ¬S@÷ fM‡ª=ˆ”zÿÌN ³_8y—ÀiM‰ÞŠ{ÿö0[l“:ðø4\vHrÙEiÂø¡æj,¹ê=(ph 8¹ 8¨œ¦€ë(ÕJ?õÿð7åû.0Õíž%ÒB¾†@ômˆ±ö Ò’[c;;ÊÇ<6X£U$‘Ÿ‰D* ÔÈI-vØš¢PÝ4E–'e¯£XnB"©ž OeJ‘çȸ„LÉyv®¯W…°ó%‰‰¿^WIð‡~þ®E*DZÕE«yèÚw\4ç½öù· ôGÂ%G?\É¡FÉ1ÑBUævpÍV¸øØÅêæziÝ6Qí‚gÅÆÁ›1Nvi=˜ÛbL4ÃOoèÓJì9‰×kÃ„ØØˆ.0ñzöÁ!Cú&U€ë<.%>C†WekÏÚO®nëÚXqŽXž³´hJ#å‘.ÔYHýêŠØN}P=7VÛßÃú©BéÍu€ý˵³ÝCwH§¨çÝli?¢¶.ļ¼×¥÷”¹™²éãpTÜ0RUƒ¶³YMyˆ{]æ(<ÄÔî9²§×¾x]ûº­Æ&:þFWîÀTÁ 臅[!Á®¥º”—<®ö9X”…Û‡»6\èà•‚ö÷mÜØýpçU# `¨Çæ~ÞŠ¦ 0ÎtƒÜšàsé Í›ÙYÛ¤Nº0a? ?iVz0ýAÍËûX·”Ì΢0 ýUøßÊ>Äm ]4*u>ÔRë\ù©¡±Y•`cû¢ Sï4¤¦b/9„Õ§ôŒõêS!b¸¢2¯7(¥`b?™›mÝ€’¥-Ãçî"’(Ìßh§#E„‘}DDÙ»tZ)'E*›ÄE(È|Ïþ+Ëm§yaÍÕ¦Ò,Áå +¦NmzâªÓ_2EÎO—–C¡G^—C…Àfñÿ_”kv}šÓ~––ÃZºl6:šÏ+Rà.ʃ U]­ê@²ê.º]¶èÀÚ>t=,Êæ¢óízí—$Àê;UÕvªW}¬?¹sáÒ›:ñÁ“¿u0°ýyaÿã›k³Ùq0g-ÈŠ?„@Zn¿ÓçâH„À£\I)é‚!öÏY-°%H¯Âõ†Ì ëÕWL>øœÔ§x‘e“ŽæUšWáÊUéÕVï둨—…î…7<`J[Vo‹vЇéÚwtµÀL§?¦ìP´}ò¢-%Cú&Q€åSìßá±ô¥ã?®Wá,LW7®f)%;%B³7ìr¬^9Õ^¼nŒ2w µU'`Ž’Ë8)OeÍÌïÂÜ‚ê>¦‹$S‚vëžf‡"þNpè!ÁQZß«àVÏ’^Wê/:y ÂÎÃkõ”hXº^]¬  !]@è[4ðåàño…lf^lbÊ77i^¹2jà9‚ŠNÜXªýt4O—R3:$°3jœS8‹ º¬ë器Vt»ËVª¢îÉÒOü™«wŒ°¬viÖ` ¿tÅqRê~?úņÔRà5<™ æ0÷e¯mƒgæïÜ„ø g¿ ש%Gk¹§?£#E;o16cóž¶&ÆÖŸðÙ³òDÊ=ÛücÖrå8® d ßøUœ½{òÆ<&ÞðÔ€ rÕÓ"yPµä!¯œ»ª©’uK2‘Ìï0¿Øü̘ÿh¾Vä­q6»î¬('ÚëÄ·ÆÇLú-ï·Ã òxvÐ0#{ùùÒÄ6Ípéây– å!.y§ßËÓê B= Åñ#»tÉhJÒkíúÉ/ÂÇv¦dÄÞ±¶æÛÿ`42Æendstream endobj 389 0 obj 2480 endobj 387 0 obj << /Type /Page /Contents 388 0 R /Resources 386 0 R /MediaBox [0 0 595.273 841.887] /Parent 383 0 R /Annots [ 390 0 R 392 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R ] >> endobj 390 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [72 725.955 157.529 733.53] /Subtype /Link /A << /S /GoTo /D (section.1) >> >> endobj 392 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 712.405 222.151 719.981] /Subtype /Link /A << /S /GoTo /D (subsection.1.1) >> >> endobj 395 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 696.735 224.848 706.432] /Subtype /Link /A << /S /GoTo /D (subsection.1.2) >> >> endobj 396 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 685.307 165.575 692.762] /Subtype /Link /A << /S /GoTo /D (subsection.1.3) >> >> endobj 397 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 669.031 330.832 679.94] /Subtype /Link /A << /S /GoTo /D (subsection.1.4) >> >> endobj 398 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [72 645.179 175.355 654.875] /Subtype /Link /A << /S /GoTo /D (section.2) >> >> endobj 399 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 631.629 370.18 641.326] /Subtype /Link /A << /S /GoTo /D (subsection.2.1) >> >> endobj 400 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 618.08 258.59 627.656] /Subtype /Link /A << /S /GoTo /D (subsection.2.2) >> >> endobj 401 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 604.531 185.424 614.107] /Subtype /Link /A << /S /GoTo /D (subsection.2.3) >> >> endobj 402 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 590.982 318.878 600.679] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.3.1) >> >> endobj 403 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 577.433 290.211 587.13] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.3.2) >> >> endobj 404 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 566.005 261.908 573.581] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.3.3) >> >> endobj 405 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 550.335 281.939 560.031] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.3.4) >> >> endobj 406 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 536.785 297.181 546.482] /Subtype /Link /A << /S /GoTo /D (subsection.2.4) >> >> endobj 407 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [72 512.024 200.544 522.024] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 408 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 498.778 346.211 508.475] /Subtype /Link /A << /S /GoTo /D (subsection.3.1) >> >> endobj 409 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 485.229 362.302 494.926] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 410 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 473.801 261.711 481.377] /Subtype /Link /A << /S /GoTo /D (subsection.3.3) >> >> endobj 411 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 458.131 218.121 467.827] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 412 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 444.581 214.06 454.278] /Subtype /Link /A << /S /GoTo /D (subsection.3.5) >> >> endobj 413 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 430.729 275.059 440.729] /Subtype /Link /A << /S /GoTo /D (subsection.3.6) >> >> endobj 414 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 417.483 289.423 427.18] /Subtype /Link /A << /S /GoTo /D (subsection.3.7) >> >> endobj 415 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 403.631 278.166 413.631] /Subtype /Link /A << /S /GoTo /D (subsection.3.8) >> >> endobj 416 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [72 379.173 211.998 389.173] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj 417 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [72 355.018 152.508 364.714] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 418 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 341.468 305.241 351.165] /Subtype /Link /A << /S /GoTo /D (subsection.5.1) >> >> endobj 419 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 327.919 453.483 337.616] /Subtype /Link /A << /S /GoTo /D (subsection.5.2) >> >> endobj 420 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 314.37 316.847 324.067] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 421 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 302.942 256.575 310.518] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 422 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 289.393 418.484 296.969] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.2) >> >> endobj 423 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 273.723 292.727 283.42] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.3) >> >> endobj 424 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 260.173 314.939 269.87] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.4) >> >> endobj 425 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 246.624 357.787 256.321] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.5) >> >> endobj 426 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 233.075 199.817 242.772] /Subtype /Link /A << /S /GoTo /D (subsection.5.4) >> >> endobj 427 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 219.526 209.833 229.102] /Subtype /Link /A << /S /GoTo /D (subsection.5.5) >> >> endobj 428 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 205.977 231.242 215.674] /Subtype /Link /A << /S /GoTo /D (subsection.5.6) >> >> endobj 429 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 192.428 271.727 202.125] /Subtype /Link /A << /S /GoTo /D (subsection.5.7) >> >> endobj 430 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 178.879 180.424 188.576] /Subtype /Link /A << /S /GoTo /D (subsection.5.8) >> >> endobj 431 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 165.329 309.999 175.026] /Subtype /Link /A << /S /GoTo /D (subsection.5.9) >> >> endobj 432 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 153.902 337.757 161.477] /Subtype /Link /A << /S /GoTo /D (subsection.5.10) >> >> endobj 433 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 138.231 328.757 147.928] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.10.1) >> >> endobj 434 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 124.682 292.196 134.379] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.10.2) >> >> endobj 435 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 111.133 287.817 120.83] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.10.3) >> >> endobj 436 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 99.705 279.696 107.281] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.10.4) >> >> endobj 437 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 86.156 228.939 93.732] /Subtype /Link /A << /S /GoTo /D (subsection.5.11) >> >> endobj 385 0 obj << /D [387 0 R /XYZ 72 786.278 null] >> endobj 384 0 obj << /D [387 0 R /XYZ 72 739.61 null] >> endobj 386 0 obj << /Font << /F25 380 0 R /F26 391 0 R /F15 393 0 R /F27 394 0 R >> /ProcSet [ /PDF /Text ] >> endobj 441 0 obj << /Length 442 0 R /Filter /FlateDecode >> stream xÚí\]sÛ6}ϯÐ#õ ”ÀÅg_:Ù4Îfo:µ2éL»ŒB[œP”‡¢;m~ýHÉ$%Á´Æ6Çú0mAÄÁ½çœ{< õž2’#"äd±z'öçˤzö‹~Ï^I FÍ«#Î(&(”b2†$gæzó¾ùí—Iõì—ÿš¿øá ³ ‘ Õd~Y¾?ÿüGÀÆOgœÒàl*i°Î¦DEÿeãt: Á|*!È£ls¹ÎWQ‘¬³Íôóÿ¼x=¯Ç‚™BX’ãƒfHj/Û?.4±0Üy Jµß¼çïàÏ7…€™ð7åÀÌàÖ¶×ÜØàHõD±¨hO½ ¢Â"@ˆŽîÜ+(ÏŠ0Ü…L(¦ï"ë…rš(ÑOÃÒŠ`:|ØqfŒ…ÒShM¡C¹²öc‘ârDK&R/uÙ %ÃZ\´¢œ6[¹/¢„z-÷±4€“#§Ã#ŽžGYr}“î’–pýa&^(Õú„“Ðé !\ ÊF˜e#ïÖWÉ¢ò,lJ±ü¤5ÿR"!¥—/-ž¥(¹¯Æ¢i,‰pP,q‹¥ód³Í°NÃk°œ ^ÈÎî®Ü™Í‘éâ>Ý‚IŽŸ±IÚ’(qŇ„ë‰G1^.qí~²Ã±Å5FEÔ¦“px™l¦©¸|~„R   ±yä:Êc-'T%'þ­5CÚî3?œiÊkj±ñacBƒ×q¶éÚ”\ã„a/Ù!ï “–îCúM—xºêæ*[ƒ0;¿¢veK¿K±Ý˜1Zn¨A9¢²ñužW ^Úa)qX íð#z¾ zä°% U‘ƹ‰9ÿØàÛøŽmpßoEAp±ˆ²Y ½Ž~pæç~sÄù2%N×>84c´}ÿÅÒµð6j_{fŸê¤¨¾`d܉æ <0$zïM%Òµñ™‹ö„ %ü4…f·0VDNß<,ñ€`Ih‰Ìû­Ï©ÆåMÚåy¶,/~8ÈÖ7 ÉFÏëtž—¼GݵLÙ:½7‘’Ðo?§ÒŸ7:L@ÁØ¡2¯ò8Úîÿý×ó™mp³¥æ|½êP˜…n×…¿ س b굉ðqwUwª{õÕK1uçˆ9ؼKVIQõI»M:.û”De·Ï~_ bÔ·qZâçÅä;Oœß,÷%íÂ’vÃÓ‰A¥Kßÿ Y˜d‹õê:‹X¿j«Qˆùlì½(‘Gù»:=5wû¿Ð¼õ&]²ätVV1Ñ<\xu ËÑyˆ<`=GÔŒ¾ìÐs‘|5‰ÿ;§^?»åÌ·¼úÎâ}èUUœ¶|û;+2$> d?—èP:\ÍŸz¢ÃH„—_@§wX(DÞMz(0\š•6Í–§ šL[žÇ"áPÛ !ˆù4ˆƒiW`G“«:bŽõ`š²Î­/¯¯óµ9ˆFËV“ö;Ws £|ßSn€j z‰5 ?"ëLkzžnŠã¬:ï,Mã´~G™JhG±ûy¬z ä©û&§+w*6$@ H–Å‹ ÐÀ‡­‹“à"¾Z™l+‚JoOàÍ×é:»êÜJ˜–*Œúd[J¾÷hÕª<蛨z‘p¥:wn󞾚ËfgSÅ+×ÔdRþwÇáÃûäP­dÕ­SX;?UïD–ç·Ï€  ôhÅSß…ÝbmÞ£UxÏÿ9Hçªendstream endobj 442 0 obj 2232 endobj 440 0 obj << /Type /Page /Contents 441 0 R /Resources 439 0 R /MediaBox [0 0 595.273 841.887] /Parent 383 0 R /Annots [ 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R ] >> endobj 443 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 750.413 272.636 757.989] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.11.1) >> >> endobj 444 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 734.742 312.969 744.439] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.11.2) >> >> endobj 445 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 721.193 423.271 730.89] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.11.3) >> >> endobj 446 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 707.644 260.878 717.341] /Subtype /Link /A << /S /GoTo /D (subsection.5.12) >> >> endobj 447 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 694.095 170.484 703.792] /Subtype /Link /A << /S /GoTo /D (subsection.5.13) >> >> endobj 448 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 680.546 243.56 690.243] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.13.1) >> >> endobj 449 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 666.997 291.696 676.572] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.13.2) >> >> endobj 450 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 653.448 238.151 663.144] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.13.3) >> >> endobj 451 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 639.898 344.681 649.595] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.13.4) >> >> endobj 452 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 628.47 212.03 636.046] /Subtype /Link /A << /S /GoTo /D (subsection.5.14) >> >> endobj 453 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 614.921 222.484 622.497] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.14.1) >> >> endobj 454 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 599.251 219.09 608.948] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.14.2) >> >> endobj 455 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 585.702 268.424 595.399] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.14.3) >> >> endobj 456 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 572.153 177.151 581.85] /Subtype /Link /A << /S /GoTo /D (subsection.5.15) >> >> endobj 457 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 558.604 253.969 568.3] /Subtype /Link /A << /S /GoTo /D (subsection.5.16) >> >> endobj 458 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 547.176 260.181 554.751] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.16.1) >> >> endobj 459 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 533.626 302.59 541.202] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.16.2) >> >> endobj 460 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 517.956 239.666 527.653] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.16.3) >> >> endobj 461 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 504.407 189.121 514.104] /Subtype /Link /A << /S /GoTo /D (subsection.5.17) >> >> endobj 462 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 490.858 332.393 500.555] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.17.1) >> >> endobj 463 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 477.309 265.333 487.006] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.17.2) >> >> endobj 464 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 463.76 304.939 473.456] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.17.3) >> >> endobj 465 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 450.21 219.393 459.907] /Subtype /Link /A << /S /GoTo /D (subsection.5.18) >> >> endobj 466 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 438.782 227.075 446.358] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.18.1) >> >> endobj 467 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 423.112 326.636 432.809] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.18.2) >> >> endobj 468 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 409.563 476.605 419.26] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.18.3) >> >> endobj 469 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 398.135 185.696 405.589] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.18.4) >> >> endobj 470 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 382.465 186.121 392.162] /Subtype /Link /A << /S /GoTo /D (subsection.5.19) >> >> endobj 471 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 368.915 288.666 378.612] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.19.1) >> >> endobj 472 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 357.488 261.348 365.063] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.19.2) >> >> endobj 473 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [113.454 343.938 210.635 351.393] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.19.3) >> >> endobj 474 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 330.389 224.666 337.965] /Subtype /Link /A << /S /GoTo /D (subsection.5.20) >> >> endobj 475 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [72 305.931 188.635 313.507] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 476 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 290.261 255.605 299.958] /Subtype /Link /A << /S /GoTo /D (subsection.6.1) >> >> endobj 477 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 278.833 273.484 286.408] /Subtype /Link /A << /S /GoTo /D (subsection.6.2) >> >> endobj 478 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 263.162 209.06 272.738] /Subtype /Link /A << /S /GoTo /D (subsection.6.3) >> >> endobj 479 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 249.613 305.378 259.31] /Subtype /Link /A << /S /GoTo /D (subsection.6.4) >> >> endobj 480 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 238.185 243.09 245.761] /Subtype /Link /A << /S /GoTo /D (subsection.6.5) >> >> endobj 481 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [72 211 210.568 221.909] /Subtype /Link /A << /S /GoTo /D (section.7) >> >> endobj 482 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 200.178 214.136 207.754] /Subtype /Link /A << /S /GoTo /D (subsection.7.1) >> >> endobj 483 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 184.508 289.363 194.204] /Subtype /Link /A << /S /GoTo /D (subsection.7.2) >> >> endobj 484 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 170.958 281.636 180.655] /Subtype /Link /A << /S /GoTo /D (subsection.7.3) >> >> endobj 485 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [72 148.621 194.538 156.197] /Subtype /Link /A << /S /GoTo /D (section.8) >> >> endobj 486 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 132.951 159.545 142.648] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 487 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 119.402 259.605 129.099] /Subtype /Link /A << /S /GoTo /D (subsection.8.2) >> >> endobj 488 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [88.363 105.853 340.817 115.55] /Subtype /Link /A << /S /GoTo /D (subsection.8.3) >> >> endobj 489 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [72 83.516 167.764 91.091] /Subtype /Link /A << /S /GoTo /D (equation.20) >> >> endobj 438 0 obj << /D [440 0 R /XYZ 72 786.278 null] >> endobj 439 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F26 391 0 R >> /ProcSet [ /PDF /Text ] >> endobj 493 0 obj << /Length 494 0 R /Filter /FlateDecode >> stream xÚÝZK“ã¶¾ûü…¹…S5¢ €Ïäà²co¼±7å²åØ©$ i˜¥H$w<þõé(R£õTnÞÔT A°4úù¡!u“ÀŸº)ôMQæ±.Ê›úø‘ºá¿·7¡õô1eš™8KñíÂM Ü˜,.ó é?Û~ôñ+ݨ46i~³Ýív÷ÏHÝn”Òiôº»5*}»çnªÇ¦ïnÿ½ýëǯLq£T\eÛè4.2Å£ã0þ‡;ÂÐ">ç)Ü £ËÅh•¨8+µ¬=ª¶¹¿²ð­S#DŸ÷Ÿ0‰’$®’ I6Êäq ;Úè$Ϊôr>•-ˆ’Jæk`/7‘ÅGÁoý¾¨èÑ7ãè:&hä9>8nü™'ß¼=›îÀ­í“=•ŽlÛö·ºŒçïv=Îy™·ççÁuÎÛÑ!ã 3æö£0€áûf<Úpê"Úûþˆ­<út×ßßn Ëñ—%Y²}ÿ¿o‘‰§Ó™¤ŒäË««h”)ššQæpvhÚ§ÛÒDñí¦ÐY´}pƒ ^°‘GÖK¯wãä;·Ã·ŒD†óX~ììhiW ï'­hCÃèÁ¼&œÂj|àÖ¸bù¹Ò«"ÎuÐã_¾þÇ7_^Q¶.ãÜäBóÄÛÒzQFÎ^F®nl{e…¼Œ3ó?­°93]FŽáÅ@ íÐsÏ4 ˆè['{}íÿ¨ƒÙõ¨˜GaõiÝÛÚ Y‡Ö&NÓ•4wn¨}sÖ×`‚õ-ðÁz[hlØ%Ú‹Q1IôzB´„2mÓ ÜCl`[±©e‰Ì‹¸ZÛ2mèú£ãÖѾ©¹ÝtûÞ-Æ\^•ÑgÓxEök#ù_Ö…^ú²IY¨FGÍ8¸vmƒÆÆ»öI¾v;'Æ-Þ9Óö2†• PÊf–¿É¢Þs¿¥QO2 È¥ûôÐÔ`S´¨ÛÏœ¡«9¿·µ‹Y‰*‹ ØÏr·iÞ‘DaÚ[Lµ3Á®%GÚT´u|BT¹·÷¸Emò@^DÇ~™`ïÝO“c6˜,˜#¶–F‡ïóiBR]ñðýß^ÿ¸‘=äqu±²‰Þ·»;ØzV¬Ðä³4ÚO%uìÉã3â0L>³L6‹„Ì4ö-å‰N§ÞЄ&õSÇŸ&P¥ç¦ì¥$ÞËpw%5(œ2Á‰Ù ¬¸‡¸ynœ…‰U•?Ï[kÛTq^©`›ÇSëŽbf4¹It”Wm ˜ ‰¸h½³;|)H¡8ä]³#AϽضY0f!!ìg‹Ã ¯Èw'ÚJÒ¸,‹eV‘¬¦†Þ™AâÞ>àÓÀŸg:0¢0½Yß nø#ŒH4ä~´ É¡]?rc$#r„ƒÆœ±yiÈ3¡·°º—t©ÖÑkøäŠö~¸-SŒ>hheðÚ½sàÀäùã° ›©åOðRéó@‰Á&z…3÷sh€ž£e~HÒÈx¡.Œ!¥r ž2¾`'z„œji(`-‰äC°ìúZ¢©â:Äž(qhð06xh†¬ª*’j%#‘¾!SG±Š¸!è;Ÿ{O“çÍô N1€7à¨lƒ³0s‰`nõÔÎ~ˆ¡Ÿœ'’Yü8ë’ëeF C½ØÇ½Åpô\Ídk\C*ÂȺkÀ¥Yâ+¯oÂlÃgó…ïÃ:€ò0<ùÞóç=Gu[×Ó9”½qœ¾â¾t¼J*™‡±A9\¤’½³q„ì\•D°bÙ[êýHÁ˜9™I2J£zò^8S@J¤æ$5í¯„+øƒÒ^ˆWP >úb;Ÿ#é›$Nê¿pâIñbá¤aÌ*¯ó¿¿\ ƒ¹³—Ï3H–.&_m!Lþ-Ç_Èòt•p~¬»ôãB)ð¼´Eì;¸‘É)YÂT;„*¡·o+ “οÃÁÎßa'ƒ9šRBF2úTIP&,“à}ÅÖëãÒÈX¥Ì"J‰‹,¿T„ðuh~qÜz|}Œ Ë„gÛÛnãyôÑÃE$w›!® 8M2r<|îÜýë¹á¨$§€#ñË¢P8X ÌÌØ/LÉžåˆSÆ©Z{Ö,š…w…=¬°Y •úàn²Ð9b§\°>rt>žÄåš®ž]‡{è¶]ûtm{z°ÑóÈa|¦! #‰`²äsUÚ™jŸ…A\&®Î¹ °¥—@t Ļɂ€—ýö}‘|&Mfלw³iÈ tÍ€Ù$§ˆ‰Ïo?ãwpœ9Lކ€3í§õƒ]ë nšCrš—d„ÓÉ*Ÿø…²!~á|þÃ5x0TÇ4åä>☬˜Õ «}bM*8žï†z<Á…,° ¹%Íò¨¶OvÆÐ;;@&!ž}‘s¶| ºn†‹S¾)ÃüÐ8Ï/Þù¢u CÏj”r¢XÊH2<ɹñg&¥¤W΂¨Â&Ëå&a\#Ï"es Ô8n˜j³~'±ïê~¹ý¿¸‡ÎËséIçh®oCÄÂod°Ø@Ñê¼X•{°ÿViæ ‰=oæ3w1ŸØ NQy8ÄåhøþÈ-žºŒ>}õ†y]Q‘ÀHÑ gW—ÁÁùðzÔK!Ý6ƒÝ½»ÿ°b"‡0=7QÌ®àÀù2 Yh(ƒáA 2™«å/TĆ€ï"1[YzFŸCs߆õÄUSÉÉ赈+{€³²¦Šp&Uå²DB¢X¤øi{QùQTaÃÇþ|„€·³ (© ©jŽö€2ªè37Àqo@Ƶ^©I¦¯#×ä°Iš[.q% €‹‡Ô&‰cIÓZÍ€³aâFÕ~< Ú‘öÍE¶ 8ôÐ p)z»Ô'?ÆJ0zÁõ࿯Q\°™Z x"jÐKMÃwNìÐ86`—Ýáî NWiAP(y±æ¥ÓeÍ §gý銞s!™W¥p00‡K»‡¯bÃÀq@$ÃÉÖÏTQÅyº¬àù0‹¨ûE lytKr–³;¿]”!Ét¶©$Id¶ÓûMÂäqÂ÷‚IÀÉÙJÒ_èä zá~PÕsù¨P¦½ã7DŽ›ŒˆƒK͵6;+BÉZjYb1¡²Âmȹ '™†—!|.n*€Þ®;P]^IyUñaD­#ð|›bY) úɤ6ÍŽ§ÉÎiçr?cI¯aVUº€%@Y÷·Á7;[œJžC'"½yÉæZè;¯g–¥0:¾áÃÙœo WJI+q8¨vä¿|X–"ßo¹)¸J?Ëýn¶ È"ÇÙ¢T­R룊ú#[Ö‚nLq²lB~â¼å¥D©s‡T¸Ï’´ÆS\$µøŠf¿ sê’Ïqk'ïÇù|`CÆ~©È01aVF9—ž‡ÙùL. ÝšõÓ¸ ÿœ«W¶U~ÝDWÆäFcä—p8â–T ð0tF6¹DÅpÙfŠY~’ ÁTzºßÕÍlBÇ2Äò…(ì/úžs~)A¼˜Y–®"ۅâ¦@9G}€OTYÐ)OßY Ebßû í§g`¢cˆyÐ~ÛñuHëvŒÂu ˆï‰SäqVqèØ¤%±û}ÀÜ«nν?ò(.³è€5U#í(\ÙYœgæ"׾ߜ¸þ–”t•™¹ú” ´k»Ð×.¥¬Ey&”Z:üîÞæ:Ð…F%º¦Ñ ~ò!%¿íÇÙ-̲8B~Õ@?ê°Ý°r¡æçÛL¢M3¬ŠÓy¨´¼O\ZÇ`Øß”¸.n–_Æ×Å|³¨/ Ë[ß±´`‡àz© >”a¸ À#Á6÷œšŸ]»«w'0d¹ ÑÞ†’┌<Ù%.éåny×Oè4ág#¸…+÷±»(.6ÁaƒOÙâ¶²¦ô"i,»Ýˆæ‘ò³ hí!”O@¦%ÊÈkÊÛR-màØŠÿ_:z½çYžˆÝéJø”«¬DŒ5«¨¿ºçänéض›j.ч+g¯ÂÄ&Ó/ÛF–…;¸¿Ç<_›üâb´¨£<‹_ tLQ÷mïÃòö¹è³2 ð5ŽuüÊ#É`ùâ=à­Ê6ru®›h½a}7µ¾I¾7W—0ÅÉ®/›VQÓüJÔ,T\–/ÞÁA6NRóRdK/—ѺŠÓª|$ø/áùùûendstream endobj 494 0 obj 3220 endobj 492 0 obj << /Type /Page /Contents 493 0 R /Resources 491 0 R /MediaBox [0 0 595.273 841.887] /Parent 383 0 R >> endobj 490 0 obj << /D [492 0 R /XYZ 72 786.278 null] >> endobj 5 0 obj << /D [492 0 R /XYZ 72 761.372 null] >> endobj 9 0 obj << /D [492 0 R /XYZ 72 739.61 null] >> endobj 491 0 obj << /Font << /F25 380 0 R /F37 380 0 R /F38 495 0 R /F27 394 0 R /F15 393 0 R /F39 496 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 501 0 obj << /Length 502 0 R /Filter /FlateDecode >> stream xÚÕZÝã¶Oö_Ø·È@¬I}ö©IÚC.¹‡d hŠ‚kÑkveÉ äÛÛKÿøÎ—dy­½m€´ÍÁ¢†CŠäÌüæƒVW üÔU¡¯Š2uQ^möŸ¨+þÝ]­o€Æœifâ,Å·g×#çÚdq™gÏñ«<6¹áy¿¸þäÅKc®TWIuu½%žëúoÑV¿þú“¿\Oò8ͲçWƒlélr•-Lþª]­µÖ‘­k?øŽÞ’hè˜:ÛöÛ.ìíØ§¢NF ;ÇŸ•=¬Ê4ú ÞÓ4VºŒîWºˆ>0 1=ै\ÿ/Ü"l¿š­Ðàé$FÖÙ7¶|{ËŒg[1Uœ%Zøl[/Ì¥ÇíºwƒkëåyÒ4®t!Œ´"¨NâÂ諵BÁVü‰O“4âÕw}ïo!áöðI‡“&&Úv:4î->]Ãý¾Ý4GZ¼êèÆ{{à»Á³ÛAg¼ZçY}Õÿ^æ± s¹w8TÏß3Q·=ÿ\/ŸéiÉÙú·Ç¦yX­ ˆª?dap5Óð¡‘E=,Òq“×ø{HHb³¾‘@,“lÓwKG¯ó8!=|FŒi—éȇûÁIi?íǤ9î‡È­³aÜÓۉY„:Ïã²*ù2šý%jk`1QpýüUg7ã ÕÁ’.ß HÊèNúiq07C§Mrijã'çÛ®NËX+P(Ønžô ;ï®ÆÖ70Ø,Vêñ¤ªŠM•>&ÎMþ"ˆañ{{±z\t"3üÂe_.šyž\ôÓsŧ¸MâDW l›¬øp÷ ê‰v=€¦)3 SdQão‚ ¨Ð(4è9£C•*rаÀ]Ó€ÚÿÎÇzǔֹš¬øœÓF8Ï1—û ̰³?°9o<‡[™2Ùý^Øoh®tÙ;ÛösPR‘eÛt-N}{ â°×G@—D×;÷À¼{ËóÓ˰×c/XÉë°ÄžmoqÁ8ß½vÝqà<ˆ cѧá3¸M·?øÆ-,žµª"{84~Cëĵ™1Ã0fTpJïìþÐ8]ª²Ó¨ÚÃä 5.)€âøQ©uÿÐnÿ)möŒâ…ÂLŠ#öñ”Ì;ÏlŒlÓᘢ\ika™à…XÊ]¨]ÞŽŸÇÞMì½Ì7cxÅ£æñ¢‹Å¤¼ ÐplèÉçÓtGM’EòŽ^Ø»… ¾ÀØ‘·]Ò…™49éyªF–D–Ü…Ž,?¶¶iÊ«èîEí¶öØ Ì8ž 0±‹Qã¶ l¸–/|` °ï4/A•}oÊÙˆwÿ9ºŠáx`÷r¿sÁ|®Ð8‚‘Ñ·=„8º3<Ôĵàdª$VBýöáð‰5JÅ6Ïó˜cŽ’…TꙢcx„pœÜ5ζ=¶“‹/>Cè>„Õá­gÀÆûgPáWv¾Gx-XñO_ÝwÁ]Z € `ô`)$4™!“÷ Ï.lí5$K2ÖàHy1ÀYea6b<`Ø ];;Lóžn B) Êà`°j~»÷mÍfµ¤™£¢Ãq.èÑ®açýîÕÜâ¸>45ê9XÂWÝíK„>ãIÈø€,"ÛÊi½x 1öyxXäcØ7(Ðô¥_Ç:É„ ¤ ‘Ùðà!ÀŽÛEïJ0Ûð©eõâ80Ìʸʫ³S=´l‰OSxÇGþŸ™^nâ$ù2À:òé&‰jðŒ h=‹°ñwhn!¬WIçzÌÎŽ-8Æ·Ë‘}VÄÅSö„“_ä@»}ö£ém7HŠÅL;­8*Ò££…½ êd= âË®Obðò#Ð|NÇÈ95lñfÚzj8ßħ³½G]Dž1=G¨Û¨™zì§A–;¶ ¤GÖ‚sè´Tf?€sìí¡¼zY~£'l£¢_b÷,Ze "8å~¿ñâ»È” AˆÌK™H×ý&øÃÀ¢–`óËÈ? .÷Ûû V›±m§ŠçªsŒ„çõ©<‹6¶eæÉÁàKpCðâ#Èj} Ž­;…±àþ¼\L?ëå`ÓdX4;XÊì*.rÓB5£M\ÅÕ¦ÚEp¶ñï)aÜ<:ò£c@å¨J¾õS1§Ðí¹óó—ßrc®gf¯4­áZ¢i;5°:D­žýM¦0ø‚(iß GíæÎÇà„Üv“èxz Ë0¬ª?ãÀçæ(¼£ãâ8(‘€*™E —s,Ø•‡o¸2 } n“©{;2ÊŽø…ãy3c+¡GýŸ4®BÅ&ýl‹ 5å,SEŒ¢&àŸëÛO¥Ç>É^Dã\¨· •“  È Oø3VR€ƒÜ6<î™TpÞšŒmRÌJðÂëJNÅœ…ïÁÉÝ»ßCÍ]?%YB¡2´!Öão»^’ú )Ï Ö2‰U©ÎÄŠ½•) Õ9‘òæaØQUÂÑÙ=wÝȘôó™rƒ.åïÈD{p¡ö`iÒ_²ÌVN$%¬ LD*“)ÜA,Uá—N@c1åôÙŸâÌ&W³?Á´9'}hò–Áú<ž.Åk—ãmi‰•×Y•Iêé˜VUq‘=Ôjˆú¬/Ë.þj©NZ•O{³n²Üendstream endobj 502 0 obj 3100 endobj 500 0 obj << /Type /Page /Contents 501 0 R /Resources 499 0 R /MediaBox [0 0 595.273 841.887] /Parent 383 0 R /Annots [ 503 0 R 504 0 R ] >> endobj 503 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [347.484 707.644 366.878 717.341] /Subtype /Link /A << /S /GoTo /D (subsection.5.11) >> >> endobj 504 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [411.12 707.644 422.029 717.341] /Subtype /Link /A << /S /GoTo /D (subsection.5.11) >> >> endobj 498 0 obj << /D [500 0 R /XYZ 72 786.278 null] >> endobj 13 0 obj << /D [500 0 R /XYZ 72 310.83 null] >> endobj 499 0 obj << /Font << /F33 497 0 R /F15 393 0 R /F39 496 0 R /F27 394 0 R /F37 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 508 0 obj << /Length 509 0 R /Filter /FlateDecode >> stream xÚÕYKsܸ¾où Ê)T•‰!@ u’×OÙëlÊÖn9µ»Ì3ƒˆCNø°$W~|ºÑàˆ#Q–+·-l ôëënˆŸ$ðÇO´8ѹbBç'«Ýü„þ®NÆÑ{ ÑJ™¥,“øõÄÂx\§ËU†ë¼üañšg'¯ì `ÖŒ#í>¦ÏÜËE{»>I„ÐÅù¶ýº–¬âÒ´»®7eÏʹ´ÀµhKªõçO q§WJ¥±P ŸB¼÷¼umÓwÃàB½7WÃÆ`J¿FÀ2HMO¤’ó%[vå7_›óU³ÛP2°¦ÝÌ:gZ¨É­ép(0]Á£nØnO“릥Á›ü2w^°,ïÙ7Í\â–b¢pɹ4ȸàO`í½|Aù8…+ˆãZå¥A5~qˆS"‰Þ›«»ø%VÑS.pÑùxe­9?_·ÖÖ¶g+ÓV¶oj|xÑARèÙþÅ+‡>ùû2tÊsL}M{KK*k®ºàK:eyq,¬©6O‹  ÁÊK»t¦Ž÷f…>vu ¹ŠÖC:QƒN¾#õ=4Ç4¾9˜4ÇBIƒ’o$¹oÇ~6‰}DÉR©¦±¹5õ•·ª¢ü ¿Æ÷HØÚŸ&϶;²¤LQø"WC<¥]Î3jˆ‘ÂÞ«¹uË¡oÚp4µ "ÓQÍ¿ Ü °#¦ fÎ ¬¡XÒhNQ0u^³ô4ÝÉèCÓ»/§ l…¼fô„HXVdA Ã"r¥Å"4Í©üƒßëÖ…ú.Õ¡nB2Xµ5èe2Uˆ<:2±(7Dè‰y}Z¹Kl%ìç>>®»pÙõÖQ3Îõhx®›¡öHƒ|Ñíñ—…b3=ƒÞ¯%”¹ÖﱡŸus&øj d–ÆTjá8‹®tIDm|å´ÐÂh=Ô+T«©\š&Q8­ßúfS§ÑgΉ„RšØjÔ ò/Ô@3ÐüÎPWôPŠi A`ìs|6Þ†,Qo:¢"y°ÅÅÌvè¦ð¡ÆþP!ïF&TgÓIê‰\šÞ,Mæð• ³T7«+±ê–h« ü›>p¢‚~¬œ‰â‚7è¾n‡.:ÙkO^¶ƒ!üJ¢¿štÙãÝD(C/S5ûI±ï'VŽÌûÃá; [x­ÛfGÓ/ˆ@«’è%vD ÑD¥›“"8ÓÞåhdèg¢\ø"‡s_©ÑÌýDAm±ö†^}اðÄÔ ú6Û +lÂ’Uèî3=éçᣠÞf¿¯ÜÊŒo ™¢ôŒÔ‘²1!S€cz¸8Ú/®ÂÒÐTw¨äPbÌçÁ6å“릜‡—* ÞY>Z4º-žŒØÃ]qÒç΃þ¹Á:׎Â5äX_¼œÚØn®ÔJaÕXòOðØÖÑoÕøû­|Ï_£Ç<‚’(¥kçQV*E²‚¹8ÒÊ]kœ©íø4 Úd3 0 ©/ ©O†Ô÷¶9õ®è¡Ú4íG õKʽ0z„>< ®Úî‘÷÷¼±}86Ÿ+”ÐBEž{ÃÝ„qoqÿ!ZýVúèzúts®Æ½­ÖR4•ƒ‡­–ÁÀ¶­ïŸ`8t¾Ã݇éþp ð€”¶›‰úãu³©n÷Û¹W(¨a‹Ió‘tÖ>hëñ Vgú$NK”D3Ñ;TÖGï¿Ñf§s=¼|¼‡œ#lîùœ/½×à|×Ë› oácÒ‡Ò’Ó² ñ¸_®}£t~»k† ë~æºÙKF%¹Ñ‚° vœ-ÝPw®· ŠI|‚Yì‡åâ'W7 ¸r·›î»…!H”LAß¡¯â7g·seÆ’dlž›a’²d|Œ8û:à ‡}\ðÇŒ|¸lyYoZ¶™ã‚M“* j nå-Ô/ÏæäÊ¡·šŠUÊüåf59±¢Pc)5ÍÆDpeè¤&J¬ŒêË¡²»PøøÌGÿÞè_Ób2w_¸F–Î4¯D™æ S_ù ¢ÒžF$€Û}ªcT4’›=õšåXe Àt Ž/µ~êULÉ™>õ.¦îŸ# ÝÊ"> endobj 511 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [131.878 261.92 137.332 272.829] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 505 0 obj << /D [507 0 R /XYZ 72 786.278 null] >> endobj 17 0 obj << /D [507 0 R /XYZ 72 515.97 null] >> endobj 21 0 obj << /D [507 0 R /XYZ 72 357.77 null] >> endobj 506 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F20 510 0 R /F37 380 0 R /F38 495 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 520 0 obj << /Length 521 0 R /Filter /FlateDecode >> stream xÚÕZ[ë¶~Oú}‰ sÅ›Dõ­)rkÒ6H¶@Ц(´¶v-¬,’|výï;Ã!)ɦwOŠ4Ákš ‡œÛ7Có›þøM.nr“1‘››Íþ~CO7~ô Ì¥Ò’i…ßÞ \{ʵÔÌdé?»ûäö ¡o¸bRe7w–önû¯D¬Öœ •|YcÝ>®Ö2WÉcÙÕvõÜ~!óÎY¡5½¶ŠåšÓËŒ»×?;ÖÍÞ‡ Dòu;ŒeÓ8†")Û-tò}µïVR$ïÃZã®rë˜Ù:"KY.µräM}‘F‘.Ñú;d\nV’'O«L&å£ãÌaã)+ÒßY‹‚3U(¤LÃ'¾û§„QEÒ=à§IÞ¯„Iª~¨»–&R&Ö÷«µÈ“j,q“ZN’‹|ÆŸƒP*ÍœPåqì6]ûDvxî…?€àÀýi¥3+¸§hõãPmifìhxþ”rõxì-iîNžÜ£&h´spz}ÙŸVF',"²P†eF8Qê}ù=8š/R}³æ`_šhRkÛ‘2›®}¬zÇÃÁžX‡¶ÄVkåÉ+#“c’õû®¯ð$ ¢½‹x®Ç–j€‰”«ƒj ¥¿üÛ?"[’º`Zx-ÀþÇ®kbJPŒçžÌïÆ7¬÷Ðõøì=•,Oí]–|_¶å#I-¥?ãõ€›Î’jS£‚6ø7xü=ùž±Bf >_UV‰@f^»7þL“Vå0é+½;Á &?‹™¡V,+òKZl_€â¥ßþ‘à“ÏïB$gç©a:}38Án@DŠM6Ö,Vñ±†³ó SF¿Ò4SZ½ÅýÏ»²µŽggvy$Z°\G}Ç#Ç‘…².¹­ûj3vè7*¹,Â6X„LóìãœøEOèûcõ~–J,ì£UmãÊåùd‚…·èÑ\&w;kµ¶žk°D;²¡lWmЊŸhê„ãîØÓ·á4ŒÕþSû¢I†j<èY¶ÖÉcÕV}9¢>u~%ÔŠ œ©ð¢ÿÂÖCÝT×B­§œàŸÈµeQ0£åÂ%·ÕCylÆwäeîìmDË ®Ž7Öνgqj ›H¤t!8„‡ºœ{—G¯)4 »Ð…°"ü@ÁâÈà ƒLÄž9ÜGí5˜ëPÞ7ÕÚI{y (Úû:ŵó˜ù\óK†´Ó8Ã~KØ™p@ø! Aí!>nT4ÑFÆ…àq÷ÄÄ)3ï}¯™!ä ÎŒZFQg}™°‰§¯<éL9 À´³(Ê%¬Š`ÞÈÞ9PnÙŒ5©”Xøô _@v|prÊASåþý8lÀÀ›ÔòùŽAl¬â”ônµá¸ZùÔ±&[280»Þ™5mÊCy_75SÐCor~?˜t¬“Í“ˆ¢œåƒä®é´Cd0ßá³Í¯q©”{§Æ/iòÔ†¬‚ÏÀxnû@HG 2BDkµ3±îé•°•óà‹DJù!Ö‰ÑH JŒT§ÖwåHëY<3[Ê­¥%`œs‹Û”­ËÌd5Sš£ÛÛYîp€ØÔ÷¤Ù“§<ñúsaæëvÓõ˜Àà”RÉwMUzÝõÕñ ÂO©NÏ Øœ ë°lÆ1SPŽO!¡øÑ7¯æ&qΣÅõìtHHhŽ6Ïmع0°Éyuò#ç4ó\·Û­þ™ËÈ2‚O0çP‘5)tôöŒ ÍÇj¤I÷~Ä ŒaEnÞPR°,Ä`¿>‚þ=ÆLâD2x£ý uÇY첈 qˆ@uÙÐ íÜ,ñ4ÆBB™E40\ðýóŽÐ¤ÁýZà9}ª¤z94õ¦­TF€™D°­†šÜÕø(ƒlg1ü"T9Ž@ožbÊ"¸·î8®_bx"g2”@“#zæREæñ8Œ¬ú¬ü‰’žOq¬ :V&‚êe¬Ú­çC‡ ÓËCµúá)Ô—ˆæ úºõ!ÓCôó?=å±FòÃCß=öe̪¸âP²z«zylN‡]̬òЪ¦(›Áù7ém^@À…á$ªÝÓ¶ª¶N\Øð%‚U©bJòtÊ ýq ¬üÿ@Xž«`GÑò`:Ž&ìªS]³" ‡©~†bµôs.r¶Ž£œvsÜRõ—ùRH!8¡ånŽûªÅ6ZÄáÖ£°ffyÓ½I©0±+ñ± T}æ,5K„ú­;s¦’Û 2SpøŸB¹f{1 El%K º³ d aV:柇Ydèg\­9lB¸FLº¨6©âPNæ–øñò*U7MWf i`®ËµÚ;ó¶]‰"S=)s¤S®T^¹àÃS} ´ëÑ /߃_SàµòOâ1}$ßQ¿¨ïÜ\ç ëB1#ôÅÉ/z Æ9àÿ4ôèàÜäO_Ü©â¬mo™ÐÞ™"Oþ‰•uwüÔ“Cܼ‡’ã„ß„ _ô¶çà‘¢|H[é!?ô4ú5<•ìÌcêYOÒ!;W™L²ij½á$"AütTë½v[ö[z¹é¬(kXQª4O¾ê0ƒ=[Ç}¿²@€ PjZ ³–­å¾tØŸ„Œ‡_g„¥ÅÅHkóº«3çÉØmŽÌWØÞUO#+GI6<  E~bŸGÊÍè‰Á ©Âc”·µIDØ]ì‰Èâ䉨±¨÷•õ=‘üйM¹©Â îmÂ(—›˜Â"øá\üe "Éš}™óÐ5 !ÂàÌá”mźk3X¤héÁ¶so‚Úc~Á ñç8FfX.^k«}pÂM >skØú¥[ÿþœ?ƒÿ!f,öœNÓ[ìžrVÆñ[®|Þ÷¸¶ÌèT\0:׋† bS¦ÜûX׃¥¡•c áè=¤ŒIèôß>ÄRXÊd€ûÍ•tέäT‹(™-€åà»’Ç¡$v S`n,ÄèT®ù“4å8ÚH§s‹?ÁÇT‘:\ˆ#à¸*Q §=~£ØÒ5دÂi‚Oƒcî_¥EòIJ½¸7xS¬Œ‡ÖákZ…boò ÷ñsM9Ÿ,)²V0,+–5¸_ô­¦•É((ÈA¾½ˆ÷† ÛƒœóŒI-^‘¼¤~!ø‚6ˆU±4É3:÷K쫲%—Ê÷FÁµ¡â_ûimû>øØi0ØÙ@|aļp»¼ ZH+ÍìØQiyx^ŸgC9Údº£ŒÑ¸”Õ¸¼ðm¨Ï„o¥"™£MG½c4ÖcwHAô|jÎÛù©nÆØïw¸ùü²å¼±jÉ õs¯ïÞ[ðÐר0*žÝFôoU}Ï»:œ¤”¡¼Ÿuü\—:²^ØÀíqèo›nS6·ñ†I7|—(Ü-‡’Uò_W²Š\ëˆÕʽi op¦$èhšoíâü®k¶–DxìxQ°k¨-åyöz‰æÃP¾â¯¶Øñ^\r‹‡Í…r~•ɇØéžPÿε½À–€|fáBæØÓ¡z }]HÐp`»5HREÕ?XT‰SÇv08÷%=> ½ -7ٵ͉˜ÎŒýúp¶Ö¼9ÁªOSÒÆ»a¨ï›jqO4ëÕøk Ì917ƒóÉ[ü60¡í‡²]ûfZÏâZs㺅¶zi…yÆT&ι¿\c?%è&úý —)(}àz3íÒWú´&…ƒ)}8øå¢R—W17¹m¸Xvú·ÒˆÉX–å¿d¡TÏ%ŽÌÇÈ%è ¬È– ÑY^qbDã뫹ŽüÍä–´p]^]ïòš¬iÙä½½Úë]T<`ÑYVØF¡JÍÆS3¿Eïe‘fñ;šÃ ‚‹iNÈQ®]{$ƒ`|ösœ°õŸ{Óˆd5ûÅu÷Ýñ:0ŠœÉàÜxíƒ dár"Kª—jsKŠœÆÝâ€ÛS[îÊÑ&¢X$c¿EFÀ;ç+åþÜ(—g¯<gÊÈ9Ë—8O[æ¨ùï#@•#ýÈ¡v?v˜[°õõæÀž»Ô‚a¨pa©;ú aÈqˆµÆ…k!~H2‡ð&œÉe:¿¯Û+°ÖLÚOçózÌÑÙôS…Y¨%Þ‚°ábñ"Ôhdâ·j0&;Dä Á±Š!¸<µ]z׃=*^>ìßJ3¡CîošË½•‡CS‡Î™¿xŠ€g|~1k=)ïú  L^Í øÛì®gØoQo«Àß0©7Ûëùù2BLÙ]Yà¿×hÈ> endobj 522 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [462.484 526.401 476.423 537.31] /Subtype /Link /A << /S /GoTo /D (subsection.2.2) >> >> endobj 517 0 obj << /D [519 0 R /XYZ 72 786.278 null] >> endobj 25 0 obj << /D [519 0 R /XYZ 72 761.372 null] >> endobj 29 0 obj << /D [519 0 R /XYZ 72 736.82 null] >> endobj 513 0 obj << /D [519 0 R /XYZ 72 659.937 null] >> endobj 514 0 obj << /D [519 0 R /XYZ 72 635.3 null] >> endobj 515 0 obj << /D [519 0 R /XYZ 72 463.541 null] >> endobj 516 0 obj << /D [519 0 R /XYZ 72 427.552 null] >> endobj 518 0 obj << /Font << /F25 380 0 R /F37 380 0 R /F38 495 0 R /F15 393 0 R /F27 394 0 R /F28 523 0 R /F30 512 0 R /F33 497 0 R /F39 496 0 R >> /ProcSet [ /PDF /Text ] >> endobj 528 0 obj << /Length 529 0 R /Filter /FlateDecode >> stream xÚÕZKä¶¾;‡ü…I.ÑnŽøÒ#·í5œ¬m ; Ä¡‘ØÓʪ¥¶¤öîüûT±Šzô¨=ëKÅ#Š,‘EÖë«bË›þäMªnÒ,*ÍnÊãgò†þÞÝ„Ö? (ÕÂ|{pgL˜ä7;mE–Ø—è¥qÎóþíþ³»×ZßÈXäq~s¿÷4÷Õ¿¢?ÞþûþïŸ}u?}f…±öenÌ,&—vcòW·;¥T4œ ‘FUÝ»rìú'ên‹£«pù»×*]|-ãD˜Ìð£lꇑé|A¦Ð‰fª_7æ±"–‹ ¬HžÆ{_í"± \Ôñ\ö®kxÑQÝRçxpÔXmPF'xdQd*ø+ îèùp ƒOó Ï7 b%²4gŠóØ•]»ßàÔ€BȰV -q*´T7;‰ú•ó)Ù$*úºxh¶Ö31œHØqUŒìgk5˜PJ&û)¶qåöŹ·gLò £»óÐß5]Y4wáèÝÆÔ¹‰¶óÔòv§¥‰Š¶Â†Š z ú¾Ç¦{(lëÎç§XšÇs_Œu×b§Œ°gs¿;%aA‡–gäõMàA×[JV%õB+tŽŠ0ŒEÓ „uî¥Ù;q»K”‰¾ëFGDã¡Ãxøð9¿¹œfm;¦ïöÔQ´¬2ørh }3’Ä™5¿ëù;0•AåëèIv GƒϧÐOxxmÆÎ¢:Öm=ŒÀ[×óÏ3j»²Þ?ñ á«S1†5õ46< £;þ‡µŒîý¢§%KÒï$^ dß‘ý੘œuÁdÑ«×ßRƒä†ùù'wM³ìͦÜp:I.lž-ΆôµF"×–?†ªnW¬€`L£ìëÒ1ÍÐ ëá“ÆAVa/E4úX'«#x®&ʵ†vJ*OR•¬4_÷ü‰®hÀUOÔé>€=ÏFG÷‡0Wx¢‘ìÔ»_ý¡ú3ä‰ö}w¤Våç™{.A¯¿Úë¯úçi´!U—¡hÎh—g"Sù§ìL‚]¶ˆÏ•-MEšZu冦)%”² ?ƒsOÑÇ$}°“¬+YE“Èè=z!"H‚¯ô“]*•Iâ…¯ Ʊˆãµ&ön¨+´5¥•÷ýƒÃ؇Â%ßÒÝÂ?ÒôߨU2­rôÉ> ¢kžzÓ™Y~Zg|1G¤ÈÉLtïyLDœ žÍü}5ußÌ?Þî¤#Å ^š½Œ†>âNê‰ÿ¼±º6ƒ÷‰fW‘á—ç#«qTÿ¹¤ãT.½ÊÏ oQýZoÅ–Îd ÷|ȳ#÷Ð[P‡ŒZç*BQ€ ã\äh3sxì‹Ó¡.2¼ÙS‹·o°½¥«Ðz ^Ævnˆ v&ÁÈP"ùoŠ-%±åb#©eR“7sïKbS$¶ä#ÄF4»¡;÷%íßFˆ@üæÈiêEÿÓ¦'2fÒŸ€'úýmb ΡAžé…woµ*õÑ0÷.z¼›‡gïŽ ÞŠ”Z‹\D¤LdÂD%ˆ%@ÄçžÞ`;  zK'€• ­àKQ"W‡š÷QØÁµX6‰7€žLèY³reÇâLm!’ž[–üÆ>²¼“œ²€1†c¤JeäC"°Ø¾#Ø%ŒÀÆN¾OCdʾæÍTL÷Ì[òÜßïéûipŸ£›1|6ø÷]ÿŽ_»¶y"úz¿µoæþ¾ÝzÂxŽ+Û`ö]KN"Í>Ès(@¤„ƒ€ºªÿ^dŽð`aéÞèzö:@ë¡‘6 ƒÐõÔGî ˆå"È¿`2&H@Ȥ½‡21|ۨѰ‚4ç‘d"·Š÷ø-È_7[iˆ…’!øîÏ=úDœ£û k2@‘›˜Ù÷,ý£ƒÞ-“ÉE*CfU6®h·$žC"„¹¡÷„TŠº6D^k쬶‰5óY5Å8Ò†| Ø‘ãÅâÂBU¯)Àk€Öž ”nKÕRHAcõÒAÇ’§¾‡¸„’:08$€ -ò@ÛÅp¡$`¶Œ.¦Xf¢ ®Þ­êç`¹ú¶éy¤e-Ù­¸”“sD„¨ühAùÔwÞ\ Ö®N0Ió¼ì»/ô^ç°¶8÷žÞË‚öº½¥ ¨S*xXÊWÏ›Iõ….P–‘Apµ•W›µ‘M:9{Ì«jGdQ31š! º2@¥{L%±×}(ާÆq7&(Ø;tG×µ~¸œföuÀY¼¯á젉Ы¤^/U߉兊fo×}íXϳT$ù:°+R&æJŽÎ£üµÑPSǤHF›ÐÙ¼PÌ ù¡Þýr®{G/Ó¼EUÕ¨'…‡oi( 5)ÒÖmå8)†Vð¡øqH7'üh ‰JÀŽY#¡7“þf*i¯4Á£ÜË;ðÓƒû¹Ø·ð)úÝeéÄŒœ¨ï¤ÓÌä«ÄÕL>ƒ#oÎLŸpÖ?Yl”jø6¡,ñû!;´ »µßcˆYh3òðV\óø¡˜½ ™ÚEp+»S=Áánå.Pe‹"$hÀݵðê0XÆîy’Q>Ô(apóà±D•‚Iy CLÒþsð¢¥Ò¾º„»J!d"ó©~à( Àãëï~à)³Å”2DœÚ™ç±ëšmÐD„; ›Ûçäk¨èx qÇúñÀŠk¤ ,RÝÔyð¬4sÕ ÚÄÝ£k;ô‡D{`É©´U¤T`VQùq³ždbEj³--»,&ÏyBÏŽÀ)±/{o¢‹Ò38]%§ûD/”8(½H€½‡síKÅJ2ä€pJm¹ÓYCåE[Î#ëœòd•ÃI÷]û(¨tù úêÜDÇniõΦ€®AÀ;Œ¿$ûwÔ;tÍ”Õà{Èj°ìT•Olà]…З3¬Á H#j`ÐÇIÌéžWá8”„Px!/m ~„ÚÃ_lH <åžHñùV(Éî¾xýæÕ×o· àòÖæ¥YÞ|¹Å‡…û%”¬¦ý›/¯±bây"±éýÕ\za'¿¡É±š(®’%\ýV "õ“ºð‰\LWI@syUV‡Y®]–)™ŠlºÆÀÞ°åa2_Yd±¡Ò‹sÌ >Õd¼÷©òRÐ(¨3âØý¹ U¦Dµ¾XB«¶¤©áŒ'îð줺­Ãƒ8ºrXäj¸ÊÆ7n>ܺçËüµèa0 _;ÈgÐì‹“2z[kp÷`ï™ð¬"<ªHR«5À“T?Â~v0ØÇ8Ñ­+Ïã•{6p9ÖÝ´_Éè¦á —Îë–nuÃE¾YpJªJ"¥ ¥;|#<ÐÈâš¾ ½T!è[ó²~,Ƴ¯ü"zl#‹]€EžïU±l*zPb¢é ĉùF]žÁoPÊ¿çÝl\b¥A®"þˆ_müˆõ´/^ë݆5å\ùæI~ndrÒ «/tòcÅá·¢/J§°«;x|©*þ6¿¼g†8Iz,4ÎÊEñ†Ž.ôDšaÍ3Íå*P©ÂýwÓ'ßÑû(°*œÕí”KÖýÒ`pŸ®\ê‹û™©zu(|­UfüÎýxÿvt§ÏWJ:W^PFó)(£kËß¡G‰Î‚!N÷z”²á/.îìýÏúÞžú B -øWSå/N¡çá<òÏ8èoÿýD˜j_g}"J°á ל̲^Qs”˜ê`xSå\1À8¢sE³¨V~iÍ®×Úr~¦ Õôuïæóp+<,ãÓrg×îåu–.m=Kü¯› ’;#ýÁâB.=fÎ-†8Ÿqu žÜ$QeÉ®¯B#y¹O¬yý·ÎmdoœÒ6þÆ+ÄI0whôXø>êð˜#™j_‰^žBb–ü%z> zðý‰Ê”*Ö¥øúùkš‰úˆù†Í”á— Sìu~u&®º®{i.düâoB”2"6ú%ýÈ.—Q[G¸Wø/+}Ôendstream endobj 529 0 obj 3398 endobj 527 0 obj << /Type /Page /Contents 528 0 R /Resources 526 0 R /MediaBox [0 0 595.273 841.887] /Parent 524 0 R >> endobj 525 0 obj << /D [527 0 R /XYZ 72 786.278 null] >> endobj 33 0 obj << /D [527 0 R /XYZ 72 458.656 null] >> endobj 37 0 obj << /D [527 0 R /XYZ 72 313.702 null] >> endobj 41 0 obj << /D [527 0 R /XYZ 72 292.809 null] >> endobj 526 0 obj << /Font << /F33 497 0 R /F15 393 0 R /F27 394 0 R /F39 496 0 R /F28 523 0 R /F30 512 0 R /F37 380 0 R /F38 495 0 R /F26 391 0 R >> /ProcSet [ /PDF /Text ] >> endobj 540 0 obj << /Length 541 0 R /Filter /FlateDecode >> stream xÚíZ[ܶ~ÏKÿ¼Eveñ&Qúà$Þ`Ç)РТ-íŒvGˆæRIcgûë{nÔe¤õبS´@°ÀŠ"ÈCžÃï|<µJàO­2½Ê|ëֻ̯/ÔŠÿ~^…ÒwPÇ’Ö™ØY|» x$¯‹}êPþ«»/^Þ(·RIœ'ùêîdï6‹n÷/®¶Ñ¡Ù” MÔ¸ª+ëúÅ?îþøòFg£/3ûÜÉ窫{štot¬2%Bï·eSJŸÛ²¥¢‹þž([—-×A †ÁµÖEWn¸¦Ú÷ŸrA>|j»rw…UiTpËú°ÇÆÇSStÕ¾Ó"ΧöTÔõ*¼ºVI'i \¯œTݨPšñ"¤itêdQÉ•mÙaÁG§#>´‚®O,ÉúÔ©-›øÅµ³6z…í´W;8Ú—å»TITív如ê'–94ü<’Ú¶ºM5ˆ¡Y“Fw[æáPÃÐ0òûjÿÈÝkt +~ÆV‘>ÖÅZŠ´}h@Øà¿?_ÏaŽ7ƒ»ä °&ØòùµVñù8>¶Þ]v5[g/õNk¢³t°ŸÎl°ŸÎxïb{S,969V½{á-šª¸¯ËlS™‹µNÃ@êÍíW?}ýÃÛ›Ûo0.Sqf‚ìCsØñ2–‹ŽÍá±)v_¶\_îÑ@ïªæ°ßa9:42 !NˆNÛ4ÎS=q8Ö¸>¡9aì€g·­Z.€ë§5:â•¿°w•kS¨"Xƒçk& +tu,ºí¾Ø Uðc®F à àÓó%5™üøP¼Ð>Nûµœyè !R^'Õ¿ª“ÞÂâYؤ´¶X¸àyUÿ‘~g ¶f"[þRµ]{…Ž” ƒ³`Y¦"÷#G ½ü¼GG| º¢çÌ”…š `qŽ¿×±€*¸ë6,PSk—MœxøÆ‚_‰WîË l€,SDB¬Õ€ª-ÉØhêYE›&›n=Ój†•ÈY ¨í1ÂÚ$Lª‹ÈÃQú¢µ€')æqL–¡ù$“‰ ë@Ûº†ÉÏmé’8±½3“Ë7ëC‚œ6Vä§mbƒ ш/[.o;©ÝT lçÌÈ[Ø(שËÅ×\o?;Q³>ÞãJ–lEm8Ž•Ô˜Âzw\O«HîdHaJ ©Ÿ,Äc}¸/°/ãæÈ`M¯ÂƪÖê£Ä¤L4p¹…C[“7nù­ç-JA™Ú«ßt€Õ°ã ~Ì1=ÍLM…69Ö´§õx o¯„ý`uY€Ã[ "-ĬZëòA>/ä¹)ŠS݉ ²ÞÅØX›ùqX8ßBq¦³)ÃÃAö¢uïÁ k¬7Y’‡Cƒ èÛ=ám ,S8 `ÿÄûq§¸)øÝ‚—;§*¨¿¼9ì»o`ˆ¯pˆù<|«aždf´»!@`¦J­‹=›D´êçÆèz%ÔpÛÃ\Õ‰§œ©|­ 0š|ŠÜwê§[8¦¼©îÑF´Ä ÛTƒÏ‡mÚÀ25{9Füxûã›7×¼-)ÁªÓi3Å ƒ¯§–ߪý¦nÍXy±çʦ!Æ EðÙM…ÞJg,'„o±ÁE%šŠ#½ÚíáT£_XÚB{.Þá*Ú4¬âº8µ‹Õ ˆrvùÜkUîň; Êö²ã3¥…bÚfÅ© y#Ï‚"öØŸV¢âûªƒIt,NKƒbm+g’Š71C¶³±ÎÏ0à!µÞñáíö›vÊ §ÍrÚžs2còXà çRõy8™ùU9Ù«¶=íd1=¹&<ækÚï4à”€í‰{އe:Ì  Ca´ùdNžû)°rþ·Â ©•»¦óÝ»pŒ³`‚mSŠ;Áù‹ëVBçÀ«óƒÁ˜›‡#Á±hZ> ÑÎ PÓ”uÉÄjøí˜ý®'ýš”†ÂÎÖxæÜüwؼýU=çÇ–Ý&7b´\G!ÎA±Ʊ®p!h}sÃË­òÅÒ *'¨+áÐAt´ám›r9ÞåfÌs¸‚ }.¹Éºl[æÜJ`Ója|å~-¯èœHþJvD¢ÎðzGþ{ ‘«?z®IŒK»êqè:¼RNƒ‹÷ã>0EBdN³ãBûöÔˆž¦?O§2R36œQ 'Ù)iÓ”bŒOLôêæ{–ì=6•Ÿ€† ™ú`M¨Ûœš¾—iâ†ÀÇI4AÏsݧû 𠀑á# F ¼Ãä” ÁºQ×HºQæý6Ñ#x@bæ؈M±æX‹Vu»â8Û)0¥ØWù$Rì?DŠõ)ÖLŠýåi¬¹ŒåÕFP’R/Ìò(7­ÇQmpµεMb.Gs¡u!°'ë}ž8VÅIÔA”¼ÔÉI§Žùš‡ÙZñÚƒù¬$5L¬_\+ ŸaçœMl§j>ñI×0qßóѯg°åMtSÕK<ö:Oã,ËA§$v9ëtÛq’žÜ\‡ü+ާw(l_¾È¨Ý ²Ñí]ÊeÅ@Ρj8ŠÈ0ÔÚ BBð•#œ¸óÉŸ)%ôÀöYØÃó4ÜR´‡è$'×V»c-VíoÛ5á$hC_,šÍÅÀC§£{? cË;I÷†t¢ÕãtâÒÉÜûå1±<¯ð×4rÅ"窱ŠOÁPè_ät%AVJUd>âÏ}ôãÛÛ¿pGüû]„KŸºÁ4\ÙtE%`$©ÿAV*$»±îÏÜ ¾äƒR¤ÇsÛh¤®ØÔ$‘øõĕŤm¹«hN“nz7Ór€¿ÆB`¹Hî´¶qr9žÏ~Ý¢óØæþy~÷o’ƒ/endstream endobj 541 0 obj 3459 endobj 539 0 obj << /Type /Page /Contents 540 0 R /Resources 538 0 R /MediaBox [0 0 595.273 841.887] /Parent 524 0 R /Annots [ 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R ] >> endobj 542 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [357.704 734.136 371.643 745.045] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 543 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [416.972 734.136 427.881 745.045] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 544 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [398.297 621.663 403.03 633.182] /Subtype /Link /A << /S /GoTo /D (Hfootnote.1) >> >> endobj 545 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [463.089 454.992 467.821 466.209] /Subtype /Link /A << /S /GoTo /D (Hfootnote.2) >> >> endobj 546 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [239.339 314.716 244.071 326.539] /Subtype /Link /A << /S /GoTo /D (Hfootnote.3) >> >> endobj 537 0 obj << /D [539 0 R /XYZ 72 786.278 null] >> endobj 530 0 obj << /D [539 0 R /XYZ 72 716.71 null] >> endobj 531 0 obj << /D [539 0 R /XYZ 72 680.645 null] >> endobj 533 0 obj << /D [539 0 R /XYZ 72 551.858 null] >> endobj 534 0 obj << /D [539 0 R /XYZ 72 513.672 null] >> endobj 45 0 obj << /D [539 0 R /XYZ 72 426.178 null] >> endobj 532 0 obj << /D [539 0 R /XYZ 88.587 132.837 null] >> endobj 535 0 obj << /D [539 0 R /XYZ 88.587 110.919 null] >> endobj 536 0 obj << /D [539 0 R /XYZ 88.587 99.96 null] >> endobj 538 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F28 523 0 R /F26 391 0 R /F33 497 0 R /F29 547 0 R /F40 548 0 R /F43 549 0 R >> /ProcSet [ /PDF /Text ] >> endobj 553 0 obj << /Length 554 0 R /Filter /FlateDecode >> stream xÚÕY_o9ïË}… ÷âµ<ÒüЇ´M¶½kÓÖÀîáöpm9t<ã‘›8Üg_R¤Æ3ö$é=‹‘F¢$’â¤hyÀŸ¼HÕEš%B¥ÙÅrûB^Ðß— ßû;Œe‡"Žðë©§œ†±È’ø9z™ˆ0 iß7ó³Û0¼Èƒüb¾v4óÕ?'¹ü×üo/næÝ²XDqü<7Hõ6—ñÈæ7zy©²ÉærÊlR•Á^:i­nlQÝÓ—ù¦—¶<ÑCa7ÈÒìV¥½eˆ P¼ïíç»ù»ëùõ›ëŸn^õàü4¹§Ý^ªt²o-Ÿ¼»œGfY¬ù@MͲ.ëjÚšn´5+ϱ_W¯id]W—*ŸX<ôbª¤.¦o&wç­´Õ Ý:I£É¯ŒJSé­iiÖCNìÆP§1[]T+ÓÐ'ÔÍGNkâr…é䮦¡‡Mayu»ÓK&,ø]–5jýÿ‘$Ñdbƒ¦-*ƒ&L5¢æ0ÏA„U7¦Ú\È(ãy]­HQ‰$z Âp²ÓvC=§ü•jYj[ÔÕ+šZì-ul£‹’L#T¤áQÒ% ½¤9 »®Ä©)Ãa€@¸ž(i¨þd€Q`Ô0ªõ(`¢\¤A<˜_>Þ¾»Y"Mòب3Ø(‚ƒMØÁF¡5P¾Q:4J`>y6`LCØà´ÝhKSzµ1 “ÙÚÏòÊæwˆƒ_¤¤ùõ}±Ô%ÍÜ^f!Âäá-ß<¯*Ða[”:¤ºC`s" îcÇ|µ*jUž#ØéP+jqˆm»lË*O-ãÐjqpAZ·<‘>‚Z•J‘…ê Ôf"“jÓ³„P:Þó¡!”î2;ɲ!ØÿgÔv’ŠN¹©ˆsé¶›o8¿8¢ƒ¾nV8˜LüdU[êèŠ'àFØÇ@¯»âã>ôáwÉ¢(Ÿ€å‚IáGL K[u\º³ØÔÔiq‡÷&œss†4ºœö Ç«Ê4èõ+Ú>j&EúÀëqˆã ´Gà—É4}Ÿ-Ì(ašx÷ Ä>Ì7ÀdK$º¥Õ€Y&õ§™¯NMÍ>~°ÓZk¶bDšŸ,˜“vdZQ :*€‘¦(WŒr‡ðp²Õx+šaç¡QšÑSD«Ñr‘¨¨¨­+CóKIJŒî÷³bbNçxžoŒsl1n„üš|,Ž$nkXéÓÙ­všGOòŠÖ;n°¦VWÔ’.°×»Løê' sÆ;´Ôž îŽBoç œ…ò=4º–6;qY>31k½/-a´í.¿Ž·„ íq†6v¿ã(Mü¬ë†çº ¦mÜ•)Ž~"8Ë0Aú'Î×eIòÔè/¨‹~ž¥Ôwt÷(ˆ5» Cj«,”eñ„lq §…aJV’¼“M‚;޳ÎZ¢8ï>–x‘à´ÃÎâùpëÅÎÓ“·ÇÞÊ,KMÛ¶4‚Ž%Åh«¸7{h™Š&xk²CÇ# úÏ´Àò$"GyzæÇYA»I<'Ø3¥Ù¢¿Óm‰¦àv±/œÉQAèAÿI~Æ\KªúrìItðî–`Á9 ‰t|¤Þ±¼š—÷9‡ÕˆéËÎÑ@€‰8ã`‹äm wñj`âÑ’Rz] °*‘BÈŸ&)´òqk~ÚÂãž…oáóüx#_Ïöm3ß?¯`ÛÙü°3òj¶©·fLÓI5‚û o~ÛCÈ‹!Z–æèj"VÐ8æ:<3PL{¦’ œ»H”ú3bLü½ óPqZSnDX˜ C×)*N3qAµLDvž£É.ë†Ì¸ÆÌœÎ ó~Ö¤àsXÀ}åÒ…ö"Ìö˜j‰—°ÑMÃg–åVø%»ÔÏqJ©_.Éö¡¥[fž9›LbDCOÁωs2Ë0'SÅlY®¶-èÔpÕƒíoûÚ%Ù†No¡×ÚÆ%©Ø÷.áæ–îÛnnUïyç€v䃅X5öjNrÏVÒË%ƾޘÖÒŸ±Ûãš—ÏynŠwïM3xî†ô 8Æ}štö ƒ~ %Í!W>©Þ—+NÉOãdC×8ö ¦éWluIËc.– úvu&ffÄݧHYƒW\ÝsCý{~ ^Ãò¹šø¡„‡³š–SÒ,šð–rVce*Ð]žû¢“•²©uq?æBc!3ïc]Ñk¨FCÎhàG‰g|!_Èë=ëúýçO7ÓUh¨›Ã£F›†‚èÿËdÿJfGåìùVSCÊéMZhS®‡Q;VÂûÂ]û’Ar²1-/°5uøãjLwT[@öïGÌ´‹n~ ~Ær¸òÁ›.ȳó}oàÕíl{Ø5õý ñõ›oð±yîToîÞ~~÷áîqY/u9ÑÊa9Çx5òž¿¾ýôÔ*½Þ^‰ÇS·ÇÖ{ë´E«ŸL}¯)\“‘-a«»t Ó_o½d¢_‹¦®¶¦ÿ‡¤9[)ôÂÃuXú À g>µ˜ËÞüûíç»Û?Œý,¢ø ´œDýÃŽÙ¸÷^XˆW#LÀF‰ñI(Ø}e{î³åFþ;{ êÁI¸s‰Hr/·]¶›‘}”‚žÏ]Y†ÑÍ 'I0À|ÛÕ˜Nœ ðú»xŸf=îØZèÇY÷nÑ’³É Õ{–+ªÿ‹Nüs‘¯åžWŽ/\™rE«·êü ÛývETÜp”.c@mªà¸/QõŠRØ\D2V j®Šg“Ÿ7¦âŸäŒu?mœ+*OEÆßmÛ2ó +xk]uòRåRl¬¼RµÏÞWÔ‘\…v‰^Spn¹â}¸Øˆ+)…ÊŸ7J]¨F’Ö/‰äð 8ù‘¬(WÞ|Ûip¹uåŠá䮶ŲsÚŽR‘9LºàÉnÿD3¡ru6"ª|‰÷˜Vx^ñœQvNB!z9©ÀëäÏUÕdx`ÏÕÕdpz„BžÕu»ßIÿ endstream endobj 554 0 obj 2590 endobj 552 0 obj << /Type /Page /Contents 553 0 R /Resources 551 0 R /MediaBox [0 0 595.273 841.887] /Parent 524 0 R >> endobj 550 0 obj << /D [552 0 R /XYZ 72 786.278 null] >> endobj 551 0 obj << /Font << /F33 497 0 R /F15 393 0 R /F27 394 0 R /F39 496 0 R /F26 391 0 R >> /ProcSet [ /PDF /Text ] >> endobj 558 0 obj << /Length 559 0 R /Filter /FlateDecode >> stream xÚÕYIsܸ¾;‡ü•sa»L97§<ªÑÌ$‡XI¹*Îj¢ÕŒ¹t¸HV~}Þpi±eÏR5Õ%ëððÞ÷ˆ«~âJË+&ÔéÕ¾~%®ø÷ùÊ•~†6«(P1Ö¾2Ðw#ýHi¢püŸo_}w-“+Y˜]ÝhìmñOOQí|!”ðnfçGiä]ï²Äk›]$½[ÞçC~—÷Ô{×eevÿºýé»k¡V4}*SDùöXö0\¥3 h¸P·-} E\;¬>í|©½¶òf'SZÚsû퇼ÆW†²6ÁÎW2ôn¸eŸW-í„O"Šp ™1©Ì+æc`?-þš+w°vê™}>RwNdêü3îÆôxd<¤@þftHGNG‘W˜}•w¦ÀšôʿˆØâŽ‹åÏM‹d®­ýmUÞuy÷´K•Õ±ðþl£9´Ÿî- TÉ<#ï{ ÛÙ—ùPÂÎ芢lqEQ¢¥{ù…ÙÁµã–wJzTÁ­Çžk°Ó£ÅôDHÏþªp'±±r„qÁ°ë†n†›÷é Ž%4(ïе5gnã æv€ÌQV¸¡Ÿ'òˆþdo½Ä±û‰lñÀ_G-E—·m©`Ί€©žH>|{ˆ•”t†¶ÇÞ†D?нÜèþ"ó%ßÜÖ•é¿G‚¯~¸Td/­¾ " ¢$b¬ Ý_Ý¢Óý?žÓWA¬ÔׇŠâg ÀÄ)ñÚd&=ŸÈÛ·¬ÔyÙôÜ‘ó‡ï íKâ$Ü/Y³Ì½é¸a¾¬Ã N&æaˆ5þ¿#qÓð&qÀBU±yVUìDUer(XZOÈXö\ûI ð*{¾@¤‚_ÜI·Ô Î(€cYö ‚õAQvjE*&-Ã}Ø…H*H`ÃG!üþ©Lœ_&ðìŠL‚0‰"óŽ\JP«¤„•]"6Ä(.„ˆøIqíâ~ 6dä-L4›|¿“‰w$} -,ÐpP`*ÊóÊ€ÜúK‰AÆôã;ŽB‘ãÍd´i,Yó-öÒ +ï.õCÇkE)Áiaª².”Jì¾Ã5ž¸ûñívÖ)ß]?‚#°ÔÁ:ž ×¥î»0ÖDF£aÚ¤$ܘ»- ¬5ymV.ÎÇf­M9}Žû(çalïô X\"ú\'bu’:l 4Làþ¾­ÉF™/ƒiúÉÀ­d ì›NõDÐO”›>ËØÁÎ;ô<Ðl‚Û0)éj½, ²4½¸ùÕZ«Íû'ðN˜3díÃxæ;VȾC§õ3¬­­K"¹’0æV†ZÆb ­9V&«$´‡ƒ­X¿; ˆ8rÕyúBð`Ú‘àKL.I;Tá@½)ÞZMØäV¤dÆ0 ^º—Xi,–¦VØó!à ÑŠí,⠢©Á·ü$ç Z‡±k˜³åpÜ1'K;òíVFnw¸às2R™Ö3•»-*JéZøn¾  e^•ÿµ^© :IWš~-,-{Ħ±¬`nI‘à˜n:¢l&©ˆ,[¨ÄˆEÖŒD³çÑ™~¬ Er}0!@„ ©¸Ö‡²Ù£ÕMSï~µ,àÛã”ï 6‚ÿ"’µ¾¯mßBß_3%Oü>£X¶n,¸QÃýV±[¨s‹ÄX™“zÊž½R¬ìÛúT™]Aˆ™PáJž{íϹâK0Ò14­€@@°å%KÀWç%W-{OŸQ¥RôrPíSæv°É§Ó„ò°!ÁCÛ)ÂJåÂÇ€Êã±íí‹>P*Z¦Ú´vÊ1ŸÄ-³=qef0÷ÙY¢aЖ….:L - ùX SSŒV<ÙfM.䃵Ép2g÷BMwLZð÷¿Þ|´ÞQÙ=&G™üøGì«(½òbèä.ÄúˆÛ 8¶ lÑz/Ðo%ø¾lf"Ä㙈æp›Ûž-°rhl7âh_£2øî‘Sv˜ï›¶coG2Ðcë¤mx‰k†¹ûUgA Ú,ü( hë¹xêÚû.¯ØÖÙû%L}xEÒZÆX+é kf,æ maú}WZËYpÎÔÛ•†Ärq.ÔSs3qZœg@•±)LGOâÂS¶Å1l~´‹—öË|&Aª{TTçfáû¯t鞀¯whCd’Y‚¥íÐFë “’>ìËkŒn¶=¦T8é³17ßâ–|Jç­H’,áwì)PƒR1²¤ÉÄA?;3­ØIaŸÝ0 ‚mÝâ›7<î(ÙTð… ‘u¼vA@vè&÷¦ïÛΚ«³4š/² 2ÿáKŽ€“db˺ÕŽOßsFà a ‡¨óŠeü0Ã3f•æ¬Ô–¶}øØÕyÞóÔ«&ª@fê2 ½ RjRÀ­4È’d‰Qñ$JphåÂä‡*Èõ…®òr_ñB×4íŒÇÔY”€æª@A2§"¥ž#,—ýV¼!`– ÒÝlØà ¼!;ŠDwU›@”Z‘zâBg™hù÷ØS_äÄ3^ƒ@×SÊËT16âx0ÀžÚŠ-ÐX+È¡Ÿ|€²ä†s !ŒrŽï%‡C¦¤œ9m+-E RµNôMº ³Ì“[º ai½Ð…0E]Àr~Kµî¨¢ßFDß2—`¡2t.8£Úóà¼aùéT•.·'1wÜÚeòÒŽãÏa¬Ð˜¦ÌÉQSÕÿ¥¼?Õ‡žïû¶Û/‡½ß»1Žñ;¿A-«|ÿO~H¿ü•}›¦*óá*ÅK€õßTx¶öÍ,ÝÓlØÁ›—vP~óÊoÝÂ{S—pz-•÷æÂé ò ‡W:y v7WžÎŽ«¾yóÂúå7¯¿Àöss rŸŠxz»ŠíÛÕ»j0]CÉxp­ þÛÈoXem>˜a<õßðtE!yæu#«ˆE^½@aß¹ç‡m9WWžNãŒPæ’gø†€(– “X>o³/¹jß pð½86Ç ¹å¦Àì‰ñÅÌ2¾R¨ÉZ³D,*˼Æç’Ò÷ÐÊCÉx[>åü™„ƒ*MV—±´@záêj&°'» ;ËÚ«ZZJ³{”6åÌmÇö/ÂÐ9ï9\Ô“V õ©0ã>êq#ežrJ¨X2lÛí¢æ7);öÈIñ3 ìíXÙ@w¿(õ–;[Ìñ9¦ìpc¤5”?,­“Ïxrñ®œÞŸ s0£g¿ã’PÆq CN€„YúëeRÑ3šøÜÙoËgJ¤!R±€`)ÊÄ×2'RŠ ¢”⋹!Î’à¿HùBnæ ­qœendstream endobj 559 0 obj 2887 endobj 557 0 obj << /Type /Page /Contents 558 0 R /Resources 556 0 R /MediaBox [0 0 595.273 841.887] /Parent 524 0 R /Annots [ 560 0 R 561 0 R ] >> endobj 560 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [246.132 134.539 251.586 144.236] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj 561 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [395.787 107.44 409.726 117.137] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 555 0 obj << /D [557 0 R /XYZ 72 786.278 null] >> endobj 49 0 obj << /D [557 0 R /XYZ 72 761.372 null] >> endobj 53 0 obj << /D [557 0 R /XYZ 72 195.909 null] >> endobj 556 0 obj << /Font << /F26 391 0 R /F15 393 0 R /F39 496 0 R /F33 497 0 R /F27 394 0 R /F43 549 0 R >> /ProcSet [ /PDF /Text ] >> endobj 565 0 obj << /Length 566 0 R /Filter /FlateDecode >> stream xÚXmoÛ6þÞý #û¢´#R¢%!Í€¶K2¯^R,î€aÙ¦m®’hè%i6ô¿ïŽ/¶”*iQør:Þ=÷Ü#&tÀÅl'cÂâd´(žÑ‘ùù8r£·°f,#áì+†¾³ôCN’1Gû׳gÇça<¢”¤œf+m;[þå1ú”²È{uè‡qäýq˜Fž¨îqƽkYlsavÞUj]eE!Ë5.„ÞÙ§Lïþ=ûõøœò H¤Æ»ÏÂS®Ï˜mÀgÌ[© ˜öŽR¿bæá­\Š¥Ý±>šÍPb,JIG6f S=[t¡±µóëvn*#+±hÖ@ǽڟ¥KY7•œ·T6q–’)í%žÕ‘Á~ÂÒâ64JÁ³ð|¯d¢eƒ™Xó¶n k1 (Š™,T±•9ↆH|*°áÜûò4f+U™cœõ*«—rY~ÔÄ´;w²Ù˜[‘Ÿ0¡Ѻ¡ª ` '’ œYCI6TŸ põQÕ0 á8ì9ªÕc•N¬Ý„†^%ê­.8  ‘óûÃ$B°£(ò®JcW(lyõ}݈+rÃ܈ À 0ÒP<;›í•‰“AI þ„à=®m _4aFµ¦õÒwš¶X`?rÏWæ¹§–]Ÿ˜'!ÇØålˆ{{ÚÝ÷óƽBnXŸ1]K £Þ¨6GŠÐÔ["Õ@{dƒp†©w~˜„XDX ³ùdÔ®”¢\ ˜ (•Èj…’jM¨xtúâ·ì£X¿‰,‡ZhL¢ÔñGZ§²\ä­V •2ÕÜ«ª5îhZak˜Žç1a,ìÑ}Gˆºi0„ÑgÂʼ•¹ætWÛ(h5¹ÈrÇ6ôHÇ$™íú{…à4ØÌÊ(J`# q„œåø½À;`ž›ÙR|hTbr Ú´M»5Ãù­%g;‰`º÷Ûr©½BÀDîÈî}®Û*Ó‚‹ÌÕ\£8ÚfndãøFmë&hØbt!1`­”ÉÑ@¶ÌšlžÕÂì™mcÂ×Õ­gy­ì¨²èçæûºÈ]cX‘¶‘ùZŒ¡ÅØ7|,Rèe÷Q1ߊ¸ÃWÉ^ûÛîõøˆŽãïé# _iÿ-§M»¾¬›¥Tdó“>èqêKKè÷o2Õ÷´„¼ãçfýR¥º©p¼‹<3|©ÍÊócw‹I&¦#ËÆì™’ñÀÌn•\ÂŒvc2ŒùÏ´ Õ…èzº˜þùî{Ò:¿ßnNÚ'O‚q ] k¥ÚÊ Dy++U½ßX•Å›Œ6ø7‚Ý.4ÌJ®Í¥ÉB²’>·-x¹Ýq0£ÓÉë›7W—ç“‹SrlJ`ü Bý<Ò^ï2[Œ¹lŠl[÷C§ãÝf}d·6.T±ÊÚÜf3ö¾É½dÿÊIÌè @øZ 1쳡ã/CîC?AÁÈrù¯p_¨ÝÇHk*´Êâ.WÿªR¶Vj±h«š˜É¥M6Wë}!î¤cìÜÜ\hlz´“ÃZ”¢2úÑÉÓïZBº0Kü…ä1‰©œãìòêfzuq>™žaæ§§—ï§SáoŸÊ³WÛ ˆºÂ÷¡;!5[žƒ:V‡uº«/ZexÝû@èìs¤{)× â>ÝÛøÑ|~¢\çtq+¯AÃ]“•ieÝæã0¶õµ‹Ø»ÎSõÀÞº‹Ôì`&êæÀz³10n+½µŒx_[_oEU‚3»<Ó]d[lûͦL÷¶pg„FÏvWÿž<íªá"î¤ãjªÚæq^9¨jß9ò48±£—À° Ñܔꡮ-ñ¨ÛñâIré€NM‹^k8;§8¢i í$xð„Wßžý~9¹¼8r·çè}2¬ ?´xþþȵ~'ßäÊÕÓý©Ñ‹U%¿\Ó# ‡Ô‹»0µSÛÀ Ö¾,:9tÌ??¼€7ÎÆúoϯükƒ1JB:î\ü×Á\({x \Pùãÿ<ù{³w‘endstream endobj 566 0 obj 1670 endobj 564 0 obj << /Type /Page /Contents 565 0 R /Resources 563 0 R /MediaBox [0 0 595.273 841.887] /Parent 524 0 R >> endobj 562 0 obj << /D [564 0 R /XYZ 72 786.278 null] >> endobj 57 0 obj << /D [564 0 R /XYZ 72 761.372 null] >> endobj 563 0 obj << /Font << /F37 380 0 R /F15 393 0 R /F27 394 0 R >> /ProcSet [ /PDF /Text ] >> endobj 570 0 obj << /Length 571 0 R /Filter /FlateDecode >> stream xÚ…TKÜ ¾Ï¯È‘H  !Io]µ#õuêH=´=Ð<&h3aD`Gý÷µvšÕ*ŒýÙþü ,+ácY󦕔7mÖŸv,‹ß]öOú ºˆ¬jAë o¯‹JH*Ë:+DM[Y#þö°»Ù³:c%íÊ.;L{~ïy[‘1/*ΈÚ6J²›•‰uD¯ñts0•¤÷ÖŽkÎ[’ƒ¶cïŒýóhToñTñøY²jó_‡O7{Þ> endobj 567 0 obj << /D [569 0 R /XYZ 72 786.278 null] >> endobj 568 0 obj << /Font << /F15 393 0 R /F27 394 0 R >> /ProcSet [ /PDF /Text ] >> endobj 576 0 obj << /Length 577 0 R /Filter /FlateDecode >> stream xÚÍW[KÃ0~߯ȣw\²¤k…¾ˆÔׂDdÚ ‡Î‰Æüõv½ž¦ ½lS[h›Óäû’“/ç$œ £›³±`c×1vÙó¢ÇYr¿²ìë6²%5¥’ÛRMÅT.xžÃ#®£ìõí ¤R ÕYÐ;¹cƇà =Ìâ*Axt>YMfËÏÅduÚ(¡Žþø4_ùÃ㢸YM}^”×ËÏðkþÙœÂø1 £rÿ!¸‰€|;L/&¸zÛ|¼\¿Ï–)þ‹ÏÝ´ÙÚ—2ýŒš‡ÓðΗ®°tAÒ´Ëb%p*FÛ"DWöÄ®hiç0ùƒÙ» Úá  ¿‡ÿ1·e[2´‚‹Ë©‘¨‡šM:1£8É£èr§±ZáZº.sP8Ü æ}¤3Ñ ®˜½òÄbG8³ìR¥tô]UÅV¸:I7B«Ñ æ+ꤙëˆß‰“ÌKŒü2ÀýmºP\KެOuÓÛ-ì–De@‚a[]Ó@€’ÀaH $¬~ÁK¢ÃÑà–g<µUÖ…„ìô Šû"!X42‰í{&KlÔ9©°KІ£â $ù«L½+IeSRÍs»˜Ò&‚žqwAe$ædJ¹7,mÅöARU—æÓ2i¢`4Š‹z¦²¿iÈQ  áÊû%BBÖ•Ý[½‹ ? F|Žç¢îä)‡wȹ‘+ù‘KBŒ¡ìgÛ4V¾endstream endobj 577 0 obj 552 endobj 575 0 obj << /Type /Page /Contents 576 0 R /Resources 574 0 R /MediaBox [0 0 595.273 841.887] /Parent 572 0 R >> endobj 573 0 obj << /D [575 0 R /XYZ 72 786.278 null] >> endobj 574 0 obj << /Font << /F27 394 0 R /F15 393 0 R >> /ProcSet [ /PDF /Text ] >> endobj 581 0 obj << /Length 582 0 R /Filter /FlateDecode >> stream xÚÍZéë¶ïçhÿԢό(’:ZäC®×lÓ#À[ Ú¢ÐÚ´Wˆ,¹’¼G?¾sQ’×Ú}¯ ‚ ¬xŒÈápŽßŒ¬W1üéU–¬²O£[¸Ù,ò»¶óêjÆ)( Ý~ž®¿/{~q\¡)žIªf[mÊÁ÷ß#ÛB÷­i­,ºx$¬8Ü]%Ü÷Ú¦\œªzËÍêŒu¹ XfSY(Å}áÜuM’‚á¶á'sˆ²ÛûÛýS?x”}Zˆìq!”mš†•ó¨?$‹¶“÷îèÜÐhZñǺÚT± }žox‰mÕ— [8¼³.ú´®ŽÒøïûQþïÛS·!ãÉ]Tvž=qªÁË|VË­ß•§zàÁû+—Fe} KõB4Ü•DaÃýÙ™:BgC „rît§†—e͟딜†—4†^ÎYéydÒn“ UÀÌÏÈå•è -ªSU€±ÏW¾†ýmŒìõ[)ï…ClË6T[l¾"œ+ëΗÛ'yÚƒgÒ’›S?´i·Í¿bm÷§ŽXÁÁ$‘Z6"má†<{”*¨ð¦‚…er×ò±#Y8ʶÊ[:†qZ6xƒ9ŽNWââ¨Á‘=ÀÄt+.‰@ní‹3»®=pk\¥?ñ=l«Îo†”ìÒ±‚€h”,Dsך+]ßJžh¾¨úÐU·§é ÁŒŠ]~vò¿ß‘m$Ž9öf£Ì)Sïe(S…Î… ⨧0ô-žî¡ã†¸RÁæ@v_umsÀv LáùÆå£ÓXÅ6DÂýçëÏþóùßþúöú Le‰Jr-´âˆ;|ÊvÛ–/‘ þù{1Šô¬S©us‡Moƒ‹*·äXSÜ[z®‡¨º ÇÐÀš¶ ÇøD}LñTþïªý©´ËUš·IÓiw–Þ™XÉå2Zd´Úމ¶íø)ŠÎ›d±ÊÍ´Ü+i/¨.RKøÃk®ÑØÑ™\Ø-»eÃcâÀœºnR ˜ <Û‹>°X'+°c†7{J廲~n ¡FžC#ƒÐiŸ&É–ŒÿØ·]õY3 TÌ^Ë=ǯ ä5¢=НÊÀ5kU –ì&“p݆¡¤Ò&?oP–Dß\¡ãº€˜_TeÝî‘õ,À’ÌE7Wxûýž¤™Ùè³Ó0´M¿ ' ’X¹Âi‘Óà´ä„UKHU·Õçr-:>‹m<nbIò9ð©' ÛO`ˆ•ƒ#غoÂľnoi] a ê*ŒÏ ǵ5©ð{Ó8 -Š ‹Ê_ƒ¶`30Ÿ!ð›“èt‰Ý #pÍ] °£c¾`<`ßž»¤¢ðܴ䣤æR,›6š„ ³[ßoÀñ²l™ j^ŒÌ€Jÿ€Ðé¶÷aÀÐ\Y D\3¢g² ­Í|³ñ‹h+Ÿ@ÔüÌÐÏLî! á^eÿ]6{¤½€ªmãQejRHÜÁ][×-Êm‚CÇ Ó=÷Á»ÞÉ$è“÷·œÄÀü]I@Ü <Â'z€Ó¤1¡7Ú» ×F´0Ð˃OÙ ²vH'ž]EuðÁ=Œ¤ ø ÷‚.š]]ÛÔÉŠ/¡¥µ6újôKÕ¹§¬«^<é£1BÛŽÆn‚±ã4zÿ{dû£/oÆäM»( â&ïKsÁAèçt˜Ò[cÎ\‘ß>ßÀ) ·ýbÓ×±™”[e„2€ ùªó«L¯Uä…ŒƒÀ-Àš›äc’kIºÀÚÛ«"EÆ€qýEàÓ‚‹Íó—·Xepž—ŽU¡}œ<ó£¥)õ²ãea[£Gád’æX‘-0Û‡hIŽÕ†x‡¯$¥`‡=8”L—·*Ôn;JØ`½å+êÙšìGp(è,MÉÿ…ërãIas©j7æ*80¼þ¢çFA[Ð-´b~À±9üÅs¤Rh•Ž(GpЙæp2ý«%¨ÏP¥~ÃlE‚̹.ƒé$uïF®žEÙ4ƒ#†rÐRÚ™«$Qx̰q‡Ìàú &i¡=0-ª =CL9ßÈMÈ7òoÀ!—’ÓOèÒ²ŸÑF3ƒ-ÂA§”-‹xÒW èàóc¼ù‹xü—//ݶjÀNÖDzB{Š1>ºxAxE®l„󸇫µNÓèi ª¤*Op‚Å4oH– OHH›~×vòqÂiiœL¬û&“è?'{v‚ž§_à>„¦Ø_*¸©¢µËß-ÂXÁ"Ay(Ÿ^‘B¢•µÉL Š1ö[¬ ±v®Ð+“œ]•°!!&À˜ŸAqÆS±J~ÌÔI_T{¥3÷ºÞë`Ÿ°i^”ñ<î<* ³˜5gˆ‘e6ÕR m°fQÔ1–ªÍÒ•Q…ãÓÿf9«2”ÑD„’tYô®âº¬}O˜¿ë¥`‰ßEÁÏÆç’W³[Jžg ã?l4¾ì¨hùT‡æü[ŽÄb3^)¯ ´ê7§¾—âÿE´/¢Îʪá+….„·Û+ —áª÷þy8ЙJM¶Z;K¥tð‘œYÇBëëWü¦SZ_¬Y€+¶ïÿø ™ }=}Õ1‡ÂÃó³l¬ÒXVø?Ù¾dši^dúåµ.¹ p L”ÓéÏÉGr·Â2‰¹¨N8ްù å_>¾A ]h> åEª´Í_Þˆbt¶’Ç%Ÿg±<û°ÅWX´‚ÕU8iäØMÉŠðYòcVŒ€Þ°±3UÀSt %ÕÃqJSK9•E`Ë"`йà^L$ž!m|£Z²U8:Ô?3¬b÷àK,óÙDjÎ8&uÊÄNFcï“`AÚ÷~æ™`ˆ ,šjlBÔ;ÑÇ«ÑQo‡;à?ƒþNêú P6á$¼BÄ– »—Ù,½y~uF‰ÉY<°¯¤¤Rj`=•.(æ6‚¹í/ÀRµ1ÊjýS™ê hÀMtë¿”CW=Ž<' ‰Ä}¨Á.°ûC,–«Š‰scU1q6ÚW÷h•ž¦ð;ÄáX{Ôì}.ÞáO~ºe£øÍk1D†©áìÄ2œ•å«!ÿ úø3šB!•¹–Ÿ³/s)c¹ì,6ø{ üÎ0„î™Ûá¤Ý!³ýTÈŸgÑ—§éÚaöù2ÔñûAL×`6]W^ ¼ÜñW;²Àðq€Åü²áe9xü÷V“ÁF¿,h÷|ŸÄ$*I^1¾ÿ”Ò×>endstream endobj 582 0 obj 3283 endobj 580 0 obj << /Type /Page /Contents 581 0 R /Resources 579 0 R /MediaBox [0 0 595.273 841.887] /Parent 572 0 R /Annots [ 584 0 R 585 0 R ] >> endobj 584 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [116.909 227.21 136.303 236.361] /Subtype /Link /A << /S /GoTo /D (subsection.5.11) >> >> endobj 585 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [180.545 227.21 191.454 236.361] /Subtype /Link /A << /S /GoTo /D (subsection.5.11) >> >> endobj 578 0 obj << /D [580 0 R /XYZ 72 786.278 null] >> endobj 61 0 obj << /D [580 0 R /XYZ 72 761.372 null] >> endobj 65 0 obj << /D [580 0 R /XYZ 72 559.634 null] >> endobj 579 0 obj << /Font << /F25 380 0 R /F44 495 0 R /F27 394 0 R /F15 393 0 R /F37 380 0 R /F33 497 0 R /F26 391 0 R /F30 512 0 R /F34 583 0 R >> /ProcSet [ /PDF /Text ] >> endobj 589 0 obj << /Length 590 0 R /Filter /FlateDecode >> stream xÚÍZÝܶO€ö_XøIܪ¢(êEÜ&.IQ#¾¢’<è$Þ®j­´‘´>Ûõßù¢¤ÝÕÆ‡K ¼äpH©™ß|ðÔ*€j•„«$ý0IWÅî+µâ¯W®õ=И32Ú7ö>¸vœkûQb>Ưb_Çš×ýëíWz¡õJ~d«Û{â¹-òþxõËíw_}{;N3~dÌeip8Z)å«dÃjiº |¥«Î®îetmüDÅB1Ò4áa·Gê§Q8“,Œ$ûÑöWkjï§o^ÞüâÄ4‰áå-ÖÚ× Ó:ö•2 Ž·)|Êøa¦GI`ι$·[{µŽ”ò:Û·õa¨Úû×ÞóïÀ @8 ûÃí óJû¦*dâÏ ú¢³¶–BZèíò«0õÞ1ÃÝÕ:L<áî÷ÐK=[T?*²%S«†×¶UÏ”²Êëvã_­ãÄxÿì«f3‰×Ò¯ªLF§(í}~¨A8­CïÍ•‰½¼>XìFt$'!÷Ë}ń͛^xbÖÞÝžQ üí«÷²LÑvpE,}Û”=-ÿÚ·y1ÔïNVsׄÄ}õÖÖþ©FÂÍ€!…¤÷Aüyõ>ð H†¨²%Ågê†WoôÿÕú_U9l€Q惺\^Ûi2þ$ ¢i<«ÄG4¾¢—ŠŽa;ñHë’;y]·¨ÀÂÈ_9õz;öÌBf´=kwCüt6?ô¶d†û¶cR?tíkRdì8a›w 7¶ëAÑ#“z7÷nu'ã‘\@<×ý÷¶k¯q<ð¶/ Ý0óh0YÃÌ™ r×H†9É$ ÓòNQ€º¶¥L:4µí{Ùo\áP7âÞ¡)mÇìEÛôôr$-"sÃ+ÂðåEãÂ×bnÛ|í…T a›Óº wÉ죫(ðS•ʧ™WÍpûnR›ÐxáÅóŽ”%‰HéyÚe«ýUôXmú”‹îJ)gXx¢'í·M€ ÜlÖ/ªÚ:Q˜Ÿfwqfi|¤ 2>Í|-Z\è5ùNZˆða¢¼¼á¾%yÔäERÀZ,ìèœtN8gtNa¢Ù9%“sB« #ï¦)êC‰*‰3ª†'HYÚVwâ;Ø kjÙ†\6XëU=6ˆ›¾ýŒ¦Q>œæã ºŽ¢Ð»!û3htx´½gŠj –7eÞ¡uÁÁþ­“On §„ßœÅvd{À…Ýù]-‹Þ±³??’_ÁXÊAÕÕÝÂQÂÔu<·50¬Pû¡ÎޝDÀ±iå—@p‘ÀrS½!ðh˜¼µ½æ‡ÁÛɨØ~¨jÃÓÚ kò’EÞ4-OìI#™Ô‰\CÞ‰—ÒËo³€~§×ßÒé tÜç‹Â%F:{º §` §-aä.§þkî‘‹ô´A+x™_1ÐÚ®Ék¦m†*êû|JEREÎIáÜ%H/Ç0Èa¶Ü.4ªÝQp6jì[áou{“Âäð À^ú‰Ž?ö>o6ÜêÈÏÌ#Ñö\ª'£m Þ¢ÐŒés"im ™hð'ÄÖQ`Á¤¶ãəӆTi]ÞåA2ROA™©h‡˜ÄÊØ9)»¥ì€ÃPŠ»’Z¡âš‘²gc2‚é8@ÇEÏ2ïÇvpá °T25ßïëŠLÍ^~OÄqˆY/œÖ:È5Cq¥sa «Þ²æSFeÅBò;N9ð¦‰0ͺl&ð£>»YD+“AF~"³xµÏ »þÇ×cê ©n?Ê4²ÉžlÚè£|>õy†‹Lâ7 ÕÙ=(¢ÀhyÃsÛ¯A}° ß½,y®bè6zÒ¦Oï’ xØZY€MèHÿì16Õb… ç&3Þ‹+ £L5;â|s„jÖü4"O‘¢§€s $c* 3ü¾Ä±¶^]µ—‰Hl^ãÐTƒ”@ q[¢:È.ýßï?¶˜×0;‹¡£ôE^Ó ¾ÔÝ8/+ß@@sb†sßì÷æÕQvª%%°ÒÅÕ%¥–ŸsáŽ,"yœE<Çï”y¤‡þ/áêT¸Þ€êð@PFj #ÏUȼÐnTz÷‚1©ß¶‡Zø¦p Y0<`qŽBiŽSÉ‹ÓÌåè0•¢³Ì%´´oiß.˜Žè>dì ’ùC׉EóˆÄN™ Ô@‘ù Å@¹¾3ÚØí{aM(æ6'%4Re\õf¹À´çåFYàT,qz¿š‘ü`Qy]sc&?±€4E|“ÑIÅ‚À!4Û@:5f¢€•oÒŒKsu uIŒp¢ÿŽ¿aËI ŒïÀ³:PŠ1è?3zÊó2#‰›˜qeñ’y´Øzw óUÄ>BÅÆj=Ë=y °á©„}@Ì»» ~Ä n§¶Í†"5ÂО]_]#b(pz5õ°IÆue\~M³\XÏk{?,ÕvvÑMCHu}b³òž>3Ò[œÊöŒ-“/ž^E¦ªF4V¶µ«lëé/›ë‡AZ¢ü0TŸÈ\¿—dÒ=o$~¤Í#Íô\°§˜©Ä‰Å&àgh7”Áë$EG›`TDŒ)*Ç`™¹îvUce 0/СŽ;û¼êª^XÙ‹»:A¯<å¹D¸ïÚݹíIIÒxÏ_ücIÚ¢{a4³0 ‹îaE³åÚ#ù¨b8*soÛB8%õ­\Âìc¬n–Q}¦ö€1¿«Ç$îø†a GÀ¨¬ãµÍ{Iɽ=>›ÈÖL@Þ´RK ¸fá@¿ pê»»YÉ-„’YP‚cvíj@ÁQû̽Ÿn‚uDÌ1¼Ä8¡n9NÅuÛ ©×eôˆµ¯bý(ôˆž„ÑcÑò©èS¡ÇÕ&½Ž*óhø8“ìwÀ‡ŠÅÍ0|¨|¨|D:øPÉ*9õèÄÎ@D¹ÔIÅ“õÍöä ÔJùÚ=Â{t~rU£—®ÚncZžväçq篕{ÆPgÕJ:ˆýõª;?Š*Ìzö8©äý`:Ur:'tr/¡É‹+ÌŸ0iˆÅSQ0·Xˆ™&è‚W€Ÿ§¬…‡\nB1=ðŠxÈãêþÜ»ù†G#î’5cC0mŒ¸ð¥¡‘!а"W-½ûDÚŒ{u]¯Ëêþ¾* Y¯× @iàO´Gï?éùûäæî±—’«*ÄÙ¤)«ŽŸCRü ×X$§$ŸÎÈh,µ>4Ä’=Ï™j éq­¡àKdtìWlZWÈà9¶Y—y¿]øØ’ÿ}†ñYââ³¶£ºolNd±Q–8šÉÇ‹²Äâ!á—dA§²cYhnÿá™c(Ýî"Æ©%€ueû YP3{ž„¿ðÕU_=ç.ÜOƒÎ™ÁÁ{°›E¶3¥_„Býnçæ;ä¤òæø/w޶)«ö!ÿ7ÿ+„¼Ÿ<æÙeG¥Äìz*ô|ãõÛh¬âÓBB”_öVÿ¢³áendstream endobj 590 0 obj 3020 endobj 588 0 obj << /Type /Page /Contents 589 0 R /Resources 587 0 R /MediaBox [0 0 595.273 841.887] /Parent 572 0 R >> endobj 586 0 obj << /D [588 0 R /XYZ 72 786.278 null] >> endobj 587 0 obj << /Font << /F33 497 0 R /F26 391 0 R /F15 393 0 R /F27 394 0 R >> /ProcSet [ /PDF /Text ] >> endobj 594 0 obj << /Length 595 0 R /Filter /FlateDecode >> stream xÚÍZÝÛ¸¿çô¡ÿ‚Û'ˆuâ—H=&‡K{í¡ÜmM´¶lëV–\IÎ&ÿ}g8CY¶åõfÑ DRäpf8ü͇,f üÄÌÊ™ui,­›-w¯ÄŒ~³Ðú;ŒÑLmTl4önL\„™ •ÆÚš[óE«TÝ·w¯¾§ÔL$q–d³»µŸs·úwôÇùîþöêÇ»a™‰µ1×¹Á×z&D,ìL%±°.V™›µÅlÍo&¶"åq`Ã9K¯Ã.vZÞâì÷ùÔ}7©þØ”iœJs}‹…Š•s³E a&8 ,À›Ô޵³/yø>l›Å"1WŦ·7Å2ÖÙM¹ß':ñ2G øý³D·Ï]ßýn[vó…R&º?ô}Sc[EyU5s™Eþ]õ >u´œKmózSP¿ß´ø±-û²ÞÐêUÙ˾$b8)ïQ¸ïßI;â@¦.N3½¨Ê{šu§’±t)Oz,«Šh:Þ¸¬q\kã4µ§ œÞî»â¿‡¢žKõ4 ¢e‚iÔõ-Ë £6ïú"tM´>Ô^¢îõÉ­Šu~¨zZtG¸ÊK¢²Itœâü<7"*Ö¸0M¢»¹µ²c²è×¹±6Û~B©M´‘³ ‹+!±q!$ó³J<›F»¦ë©õã¡möÄiÎ/+8ÒC¾)ºx¾0V«€7e_ì°e£0Ò•»}õ‰‰" Ä”½Fá¹*v ª¾Íû‚_xu‘e¾ÏïË Œ¥è<ÏÉ ³ÍzÂPà>eÚݰéâT͠θ«“Ñ>_¢ <ÌMå\5¤Ë©¨nP—DËfWÐÐcÙo±%¢5Ø2\‡¾£¥Þ¢ýä¼ej%M(ê†_ã•O4 Ôñg嬛vÊHLk­XŽSψ8‘öDcGËqG›š¸F.†A‡¨ŒOl]ÑãÍÏÄB$p,›-üÍ’_Õ%`öz–9;åˆÀ@\ tcÔÓŽH¦¬ýŽ®­Êº, ød®S>ˆ—Ì šäy~íóÐXõl6£ì™Áj €¥pÙÑ»Çm—«¥E`LL‡ ØŠH4<,þòÔ¥…hFÂSzƒùÚ‡nf %Ö~©CÿåÃ4rzî:‹e&žwîv‚¿©s‡ÛúäÁÿ–ïø°s>ØœœIƒwõÜÆ×t|ßX~ƒìOÞáoì4á +d²/}šxæ`âÙÂí‰zî™^rùÎÔ ñퟪ†ðÚ@ÄkÒÛ§ªSù‚S}ófñs3W"zn(8{{ú)0_27ädYœ¤îÙÉi„ Ù`rvá‹|Ø>„ãÂøüEÿÜþ°±„ö:é˜Ø™KÆ»IÛç8"iÎGÚ8ŸHk|ˆƒsº¢‚€ÛêùAˆ¾s} «×ù²GCÇ—ëÐÈ)n*óªÌ;žª}ЊKÎ#xÜô™OÄÔ@ä‰Áz<a-32­¹I¢æq"fÒ¨WžˆnG!܉\Þ£Ÿ8Pdq\Òãq[úèsKÝMI÷›©zlÚÜe4çƒT«C˜TÖËê° "Cd†I‘9‘ü¾ 1®.óš£Pؽ/0iÉÆ m‘wJÒ@ô’^šß¹JK”>׉:׉éDFš'zѧ²¨VO KϱjÁ°Hl xwžÜÅ|Š% ÜÖñx%ÄDežBJOåM_.‹c²úšV=®@·ÍŽã²-GUUÞƒ¾>½ Û:FöÚçLHöþ®Œ²H5Ê<Õiæ)™g0f‹õ‰ .°¿® ™ÅB‘6T &'„ÔÑÛak«B¶­Ÿê÷ÂuZžæe&ú—ØÐѯ£Ý¡ûnžA²ÍL2€˜iF ¾ûž6FÂxHùnI÷º¥LluXbˆ:¾ÿÁ–„@:X[p–Ýç4´oÉŸúÃò(EãKØÆÚü5/¶`ÔEKíª ÚM¦Äó Mò{Ìa¹’!7Ž¡…›}v=XYÞ"ßæäìðåèìZ¤¬Á]ixá– ”z½‚¬CË¥³dXA&'½A?nªOû©‹ª48ýpQ_£Œ‰× 2UðžùjU"wyJ(àg’4ø*cæ„‚5žy¯®G'ܕ꫇'zf\u=YÀ;Tã^â«ïæY ç^w{ÐOAg? ¥»ºMSÐo» &@ÆúÒÆg†)(:FJ‰½¦¼Lô_ö9øæ!(Ó±@}RZ¤½äk°è–¦Ï ±9_Öê˜#kqZ½ÔŠ*1ðìËž*˜Ø—¡\×ãУGƒ¢æÇÅè„Éý†äö4v/ïxG¡UÛ´d`…«VO†-'8!§‘3qÉú3د5âIMø& ¡¯÷ì7ms¨Wtñ÷åÇ¢êhŽ¿Äp?£úZÐQMÝœ&{åQ£é,E 02pêK™Ð:¯Íœ="Ä"…”I3”sÇÊË‚;„9Ë–û°M¦äýÙäû²ßå{ä1Œ¶6뽑Àkð~òª AðMUQ…d(ü©pŽèÌÏôŠáƲ©B-…C  Ôg1ÁÀ Ð+9ÜC¤vk†å±t“_VÈN“Ä| É|k z W_–½C\mÚ‚ Èiût*äB*tÉß‹KrÒQ\:çý(t+Îæ}ÃhBÒb'e Âi]ù‘l-Øä©L×gQ@€bh1øæ ]ºšÐhêâ©1%{¤„×ÒcŠ‹~¨J}W2'0B †é÷ð5>ÙŒq€7Åæ‘ìU¾-ó-šˆÐsX;’»Xc‹.¬+üK)ÌÃéC_Ž@Aײ´E·§¢; êšfÈ«Þ'& ù‘É1}À~’Ó§#žÒ«á%y ëA‘(Má/|~ÈÍòÇå¡!‘¡ìˆ¢¬¡ ¼­¼Ÿ"¶JB Ù|’ƒ]íÈ>¸ ;xœoe†J D¥2M¿P¥å-œ8˜ÖÃʸX»gÖ[.Ù;ûYŒBÿÛ5ÔFÈuŒñ‡¦¤’Ác ›ï$F÷{ôÝ3 –"øvò'R|YBX0MŠ)0§¥€7ïü4åf½õ6íƒÌ,GKˆpyÕl0?ÖüQÛBÙ骩v!K::Öã'¡`àÂkCb!»Î`  4|ˆt{M iäXJŽvùè†{t÷9áìµH0 Ö½>[¸"¸y*ãð»HöÐñmfc÷™¿@Ó‰¨è½Pš"­?OÕ è–+®8®¨§«)ê"|ҵћ›5j!o¾H‰„e8¦—*Úù¡ð‘‡J.ýPvå}5YÎ"¬CW´W d̈­¿:’LÊ's±ÿË·¶y˜SI,¾ñµÃ€º`ëÀL ×áY&Óc&–Ägêë˜`­ˆdÒbhc˜O:KXÎ1Áº‹ÿ¬ ïo^zôYÑD;yå ·‹­‘C|*b£N>ã„ 7U®„ôeµg(=~3¶æ™šw fåbaä­œ±*8Y«^I%?Æ¡¢“ЧÌ#h½ñé]9p¾ÃÉ…frô× &³$*ò¶*}˜ b ÿFÈLQj®ÂN¥4Æ·Ê]ð H•A˜±Ù¡¢KŽ›SÀéÃ2L¡.}Gˆs|Ðľ# %LÌýþЇ<°^Q €&Oÿ¯Äà?­Òg•ÒÔñŸ%)ÀÑoôÏ„©»œÿí[oE¬ üÙá.¬hœ%?-˜émwÌe`)7PKJ+q³8$ìùFÿX%Ÿ@®ÿFûÎ}endstream endobj 595 0 obj 2922 endobj 593 0 obj << /Type /Page /Contents 594 0 R /Resources 592 0 R /MediaBox [0 0 595.273 841.887] /Parent 572 0 R >> endobj 591 0 obj << /D [593 0 R /XYZ 72 786.278 null] >> endobj 69 0 obj << /D [593 0 R /XYZ 72 470.758 null] >> endobj 73 0 obj << /D [593 0 R /XYZ 72 178.047 null] >> endobj 592 0 obj << /Font << /F33 497 0 R /F15 393 0 R /F27 394 0 R /F39 496 0 R /F26 391 0 R /F37 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 599 0 obj << /Length 600 0 R /Filter /FlateDecode >> stream xÚÍ]oãÈ èãö¡ÁèË)ÀzNó!ô˜ÝîÛî \è­bOlamɧMÒ__rÈ‘-ËN²éˆ83‡Crø%ËY rfÕÌf©P6›-¶oäŒþ¾Îô̦I´H ŽAœÓ|6׉ÈÒñß]½ùñ£Lf2yœÏ®n<îÕòŸQQ-/æ*É"·)v­ãAWnBy亅 ¨lé¹*¿](À¯µäg·vl]Û+¤2º-«e}¡ò訙GŸnˆJÁ¯¹¦©mTÃ#‹‹¾iÜò- ¬Tó¨Þ, kQWÊFìØ]{ñ¯«¿ÃYæÅ“û3Õ°‡Öü2ußíúauÀŽMT4ŒôÕŸj×ñ4Êñ ZN¥uêE“¢ðûÕôî°oߺF ƒo>\íõ£,è[zR“zR§L…N5©Ý«QëjüËñ.‰0IrÞXpÙ 80ðv g³ÆÍnxyž)yZ&"µ†VÙȌ:àL¥'8ûµkÊj؃3[-ÏRžk¡³ —“8;Á× CÆ“V˜4{ØÂ¯Ö¨.›èºï:°€U´r•kŠÎù¥µì1Ên[ì­ç¼6M¬£–Nâ'ÛÚgäå—X¼68[VûWÂc)L¦ƒ¨S+òdt¤€ð˜°ulDf“öÕEžF®íæc±§FH4¹‡ÄnƒØ§<€LrÈÂIyÏ—e±©W$³k§k¼%wþ& Ùç˜хý„¼E±\–]‰*Òpåýu‚Ù¦h;G¢Çá¯ÿºhŠ̶oq2ãËÛTŒóý`S®Š®÷—^n]×NK£m´îiPy.oiÐDG ô ZNzW-Ü)wƒZ—q0”…gQ OdaÏN’?D~²”øÁBô@Ø{À¬êŽéÐ<{Ò)מ±ÔF7 ?ôS€ „)úåœëB¸,:znÄV3zå– Îp•wnÃ/Shµ•mˆhõd*SaÎÍvzt¬Õæ~·Æó@@ùœ¶`-Ž©WK?£"òí’‰ Úž¶‰GkŸ¥œ+Ûž"„„<S•ž}ëˆäíÚ1Ѷó¡ÈÝy:•M*Pïjà©÷¶ qä·¾ìÍôé!ÐuÁ—ݶnî ½¼ ¸°!Üx{pá”w‚sÁ¦wïëMÝæèj&`ƈcDK*‘%Œð·²q‹î­4RiF E}ň¬.:Žjç‹! …T¯¡ÂxbÎÄ´üÿiÍ>µA.,(á,åq8›2özÃY,âX¾hA9ѤB9>1žM›È0Fÿ¹U2TŠ J¶IJüNv¸Ï­A&|Äm0Æ)w¯Í÷‚„¤ÑÊ‚ü=s«AŠ)PÍ’§VÚÖFé•}ZzuÅÉ”†°ßW LBÐñê$º.ÚrQl|"5†Ï®`š*˜à„ ^ô •¶û¥ã¬‰Þܾúþê£àˆÔ©Íç¿ì[‚‡‹ìãû*z…ÛÉ´…öªˆ[8{(À2ŒÓ6`xpXħä&Ë#<±O±Ç÷`ª0Ÿ*,ûSÈÕd2²!Mñ‰Ù”ÑKŸhd>³¾ÙºßzNm  €ïbR:J¨P}ºUREÎ, ¢é[báÅšE_÷ë ­ófáeSøR•“H |¾ Yí"˜òz>1AÖ5ŠÅ iÌe !ûxu.mmèœöñÂõlmw×ñhY¶‹¾m¹¦6œc…(¤;uÃCÝYh~Èe2‰Õ.øc¿¿÷‘~§Ó˜öÏŸrùjîýî°’?>p§´ã÷ñž™IÛ†pžÑ¶™æ\6c¢R"‘é“\´y–‹6OuÑàSõR±î#öDAOZù»Öí»¤ÅõfÐX*…µé“ƒß„Ýç¸íKlµ3iªó¬yÐ_¨<ŽÚò¿~FG2¥|¤‰}ue™òŸN$éR rt á‰û: ëêƒXΰïZóiÜfç)JÉó84ÈæÒd"Nì¸Ov\›TCý´ƒŠ?ô„viÊù”¿ï p$Cœ6ÝRÑ5R¸?zÉ7î7¼•ߣßâÿk®Xá|™6T—›tï²NÔJc{%ÿ ië|v…­]lœžPIÎ*Ö‰ï‡& ÖK‚n|Gïõsöú8ÁÝ“¤É>4ÑeGïc“bI4\gNšaŽF•7¿¦RK! 3ÐJ@4Äm`¡6.éõâ-Baß åÕð*õ ª±—J d-àix£ÅjxOFA“SzÀH‡0¡2ü ô€¡Ç°‰~©(ãȃÁ£¥®6 ‡óz¡Å+%›u¹ª@¼ËpO)€ ð‰iµTêû‹½ö-|©ÁÏ4rSÑŒ•¿e‚iÜô„)|ãÜÚ'ßø[Î`Ç Ÿõ~¡ùVºÛaÖ†YƧÇM= Nv1¾9~ूÛssÌ_L~¿©·Å W ÅÅÏuW¢,è@qê|$ð$†æ¦à¦W|]¢üwÓýñx^\ð„tîœä=½ÐQn‡M"!GmVLÖ'9ðÜbd£0K»Ê½_3Ùø; ¡¶;é{T¼ç¶]4ŽôGú74à(5†;xf”„BÁÆh{ôJ¥oLZ29H¶¶Ù’&X0y߀ï¡fɲ‘hX$UþÀ[¯‡ÇôŸa˜½é)Øv(³[Ï5}á6‘Š)Ûá¯ã:ÒÏE®¨Çz"t‚ˆ,ÎÃOXNP( ­ÐNnÊëSt”ˆMH‹Ê*ðÎL†ºÆ7í)Ý>hÌßñS—µåL ™¿P/äÃ]Éùõ?šzQ<0 õ†‰ŸÚ™pø¼–Høž~ó\—'œ_J¢ÛupP%?[MïÛ£Ÿ¹»2¸´á§=;:ây•gø³ù˜Ê•‚¼\¦ý¦BfÇû(0]¥Òójÿñ¢ aendstream endobj 600 0 obj 2792 endobj 598 0 obj << /Type /Page /Contents 599 0 R /Resources 597 0 R /MediaBox [0 0 595.273 841.887] /Parent 572 0 R /Annots [ 601 0 R 602 0 R 603 0 R ] >> endobj 601 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [271.365 667.055 285.304 677.964] /Subtype /Link /A << /S /GoTo /D (subsection.3.7) >> >> endobj 602 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [520.087 374.217 525.541 383.914] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 603 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [139.878 360.667 150.787 369.819] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 596 0 obj << /D [598 0 R /XYZ 72 786.278 null] >> endobj 597 0 obj << /Font << /F15 393 0 R /F33 497 0 R /F26 391 0 R /F27 394 0 R >> /ProcSet [ /PDF /Text ] >> endobj 608 0 obj << /Length 609 0 R /Filter /FlateDecode >> stream xÚÕZYãÆòè<ä/(O¦€U›ÝÍÓ@|-°6œÁ1`/‚ª%K‘Iyf ÿøÔÕ)iw ä)Ðû¨¾ª«¾:ZzÃO¯r³Ê‹L™¼XUÇÏôŠV¡ô´1e’Z•&X{…p(76UE–"ýן}ñÖæ+­U™¦«‡Ñ>lެJÖ­M=üzcó4úуÛKåßu»íÖÖDOë÷ßñV§+«2.y’‰UZ¦4ÕáÖ›$Ñ‘ë½Ã’‰¸ÅDM·Þ˜<ªÜè·ÜòH :àóÄm#n'ØÖ®éö\fB +¢gnÙu=„úaäÒ0öu»WëMžÑ»Hn¬»{ãèÄs¾ÅéFX¥yá©Îƒß<#žJ#K:Õ;OÒBÖ‚Pö\¢Ã¥e´¯Åé|ËÍß{Ø@¡Käi/ÆCwnðìiNGzîh»ñ[æžÖû-qW”•…S¼Öàjév˜óxµÁNý{=ò„°ÇÛ3 ¾Ùmüó©quËÜJ}3Yk£Oó´&®snpàr8‡µæ²3k<‡ß~‰«}öÝÃ$°p+òòŠØêLÙ̲x³¸Ú…¤±¸þåzþT% Я*’%³É¯Ä8Fµùƺ¨ŒõQšÇƒC®j¹yhÙÖ0qmÊè…$@†„nÿ쪑$L‡ûYL8œXXeêöм÷¬EРÃÄQï†Ñ£´ß¹áݹ­PìñjáÒDmœDÇzå°zpX Ób‹\*J³SP–Ê»mähÊÉê–¿ a•Œ|:ÔNt`ò«•ŽîôJÊÇÃfV§ÙÂMí]“XÝQFbJ®s[O³È5gé˜ë"TÝÀT27ë´×mÕõ=pT] ”.sÈß’`™å8Á ¥fòmRËI°L±ÊU™ÏÅ*¹^"Q¹…¦ŸÜ´â5¹ý±ë}w¹ÆþÍz“ÆÙŒY½k‡¡V3¬äúÒýÓ®€YÞsËÑaí….`cÀhh,îAØYuGà¡Þ·õ/±N*×¢:ŒŒ·õ富¬áïc=s$¦±V?û†I&@0¶p’$ 'ÁùŽd˜¨(5®M®Eý³Å…þÔwûÞy»PØŸÛ–¤ÂZ¡™@Œsüéý0Ñíè*ä ¡¿™±…²E¦·T°êÿꬆ«cOÆÝä3Ò̪"/…~ÔMýø%È•I£oдŸ\ÛûÖ÷Ù„µ¯ëñèNo¸ò ÿãû¾íþ¦”úë÷Ád™*’T–êã ±w5ú¦¤vJ@Aim¬r“\!as’‚âï#m…Ë•Ø^lžlo’M›ß¢ÃPèÉ^CWÐÛAƒàSïîog\¤9LôÚ+”ÛÜÒÞok‹>9õÛ®ß}{‡96!Aª <1Fe ,óƒÏðÏêtŽXc°ÎíË ÚCËí¡JÞìvüèØ{ÅjõUŒN‚+5 õcÝÔä2¼ðzà¹øJ–Œcwæî+‹„ƒ€AE‚F[Ýmet=X"Þx˜íÖ?³„°ýÉÉþ@ÏÁ \@‰À¯Ї•Àló&bsµ˜Ï Uµ]ôÅ,Ùm‘Mw.` É -¸sÇ@g&I¸\ yY¨¬\ ù~²ÿI‚RI‚¸X£{ƒï3ßZQ (>6þ(ýÈ(7(Áø$mžQ©Îh­wÝ1­’€½¾â|BýÄ}Åð½ñ†P Lpë € TÀç§ÈˆŸ–³À!ÙLÇ ë29sG]‘“ëGîÛõÝ‘K¢n×®PøcÊ8jš,,‘µ0…X lAékQ©±.:•‹6Eyÿ¢5DZ±Ñࢠð ÂEãéÑpa¸^ö°Ôl™i(Vý³¯ÎEaí|âí¡QǯI3îX:‡¦AäÞÌœ1]°ÁÂW²|­¸öõ8““xüØ„‹4Ž3°³çOÒÚ;ÒµK)…øK¢ Øi#rºÜ‹èMô ‡TF[‰aÓëöçñDP–',„Mff±°ˆƒ<¾ˆƒ bHuƒÕ]ŠDô Ú/c4°Ö &¼Ü÷‹K?q“‚¼¦f8=M̆&BUXe[ÿ„%D ØCápXìN°7Â¥ºÍª<ùH&øT0ËOZsa¶E¤ !Ù5¨¿]Ãa)ò6Åeô|öl9Eq™ I¨pjRuèw ÃváqFÁm݉Dݦ–+ ü†ÂPÿF¥Œ¹=ïÚ7/§›%ÐCl„ïÈ͂ŸšóÀãÓÁ½¤PÊa™”?ä´Êtx7Y Úámg_¸w/¦á=ñ#Þð™ï¶,.©µÐ#°¶ÜãÙÈ?…Žáä( KERR4{#&Àm¹d3 n:vٵ䜅éHþos> |´WƇnäsÉ!ýØ×Õ (rM:Y kÓÙ~ÄVó\BH4_”µV%Q&Ï}¦mà×OrÈÕ‹ËÊǃ'.Ø+•Ǿ+˜ct“òY„æù%† +Ž­æ½Í-ØùDàÿOwPH¥';’À$47 Ì«Åý‹2…^œý©¢Lø)£¦Û×y¦ˆÌ}MÒKJ×r‡`èà Šäàk÷¤áeHà-ºdŒ´ƒ6|˜Pd¢²cÒªs°9¸ºçfdµwM'M©œÃäDÌ~¸ [“ ç"Ð%('È8)B!çÆÒ4‘ω…nNjgN6Ç õžCjMH>™™Î½ðGqpÕÉvkÂËZ7{ÐÙ=¥/µJ’òSJ«)H€)øÈø²¶ëRÅÀÏ…¶ºAü¬<`Ê|H#n_»[H7œ¯©wÆ©C ž&÷ö»ŒÔsp­ÃEW‹ý2¯ÓEÖ(p¨V蜪ðü£ O¤´Ò…™eyûŽ—[¦dÌÏ݉Là{©Â¥»ºñúªn¤®”zÿþý=þ¦¼{ŠÓ‹Þ–%Úð•¥°Rˆï2ë‰ÔTO±_ÌÉ?l ý’Ày[þ²äBaÎí;q8@L2™Õß_¡rî|0Ò¢° î*lX6I'Çèiªtr›¡&Ÿc¦T:ÚºÑ=:ÖÝXÎLÏ.!fAXC%Ì”šX§ã…? ƒ¥p¶ýyŠâLà)Ó×CØÏ™¦BK½œSC9íìó{®]ÀCAq À¤<  ¥ßà ~+½ÅYpË[Ï… /"ìËäXØìÎ}c/EûVðÉf÷M©á8t¥¼FÖüþ}–ø¿±Rþ¹FñtÐ3ICt…ªò!ªEç‰]L.Ž¿³3{ß·]ï·W#%2JgWŽ‘Qôx®Z _>$Pše QÃ*ç6„âÞLüPwðÅ–F$û¢ð·*fÊ&!Ù2ënÀ¬>¿×Æ—œúì2¡öî[N®ÇoîåGð'Õº Ìÿ¶°¤^dý3:ÑJ«¬Ì¯’@ýxwη5áÍÒÖU®åx Ê‹$GÈFÐ>°Ãmtýéõ-*nNô“oÓ®¼ÀkFÝúBŸ27I@Í5”­,pU·oÁ)°ŽéSjÞù'.&+öÆÿÞu幇™`8•A))>A8¶Ó™”X„-uÀJ¥b ±…ˆ[¦%²zÉ_§‰JâåÅp §ùP’­ÿr˜C_M縧É8÷äžý A578þ½#[£%B‡/ÆbŽ'ÊÒtÁT}×Hð¬ ìãy¿Ÿª“+ô¬vX’ׇ$D”¿á¾®í¹Dmr>ÜÇÌy¼ƒYB¹Ç¬F ºY¬z¿Ú]¬ºQ ŠUEf.¦½\¥ªÌ‹›7Å/Þ&ñªPe–‘Û¤tªil̬}»Æ{ìùÑÂ?;GBÍ|J8âã§EŸ¯³óáí£äü#½~63ëty¼†NÄ<5v‹ÑÒí/ ˆ ­ ¹ @#§‹s=mÙµLxIÛ3^&“ !¡ÝI dLï©S*¬^'(üÕ«´„¿Y`™¢;ùCJÉÞ¸‰@@Àeô”]¸} 7¨ ðݳמêÐg.”~Ìðˆõ«ÏÀº¼ÞŽOÓ˜O¼þÛÕ^endstream endobj 609 0 obj 3309 endobj 607 0 obj << /Type /Page /Contents 608 0 R /Resources 606 0 R /MediaBox [0 0 595.273 841.887] /Parent 611 0 R /Annots [ 610 0 R ] >> endobj 610 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [296.294 650.985 301.026 662.201] /Subtype /Link /A << /S /GoTo /D (Hfootnote.4) >> >> endobj 605 0 obj << /D [607 0 R /XYZ 72 786.278 null] >> endobj 77 0 obj << /D [607 0 R /XYZ 72 761.372 null] >> endobj 81 0 obj << /D [607 0 R /XYZ 72 482.296 null] >> endobj 85 0 obj << /D [607 0 R /XYZ 72 283.448 null] >> endobj 604 0 obj << /D [607 0 R /XYZ 88.587 93.518 null] >> endobj 606 0 obj << /Font << /F37 380 0 R /F15 393 0 R /F33 497 0 R /F28 523 0 R /F27 394 0 R /F38 495 0 R /F29 547 0 R /F40 548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 615 0 obj << /Length 616 0 R /Filter /FlateDecode >> stream xÚåZKܸ¾;‡ü…/Ñn­øÒÃ7»În6E2‰Ä9hÔœnÆêV¯Ïþú­bÕR·æ —™`€%–Èb±ê«¥ ü‰‹L^dyË,¿¨v¯Äý}¾­áIj£b£ñîÁU\)ç©Aù÷W¯¾ù Ì…Hâ").®n¼ìÕú_ѧÄ$×ðO\®´ÔQÕì/eõmS×n¿Á‡*ÚØ½mËÞAŸ¿/÷kj|AYÛ^_®àÚt®Çû;©¹¡k¿µ—ÿ¾úÃ7d6™^*KmX‰^ÔfJÊ2:ŠéÉà³íJFÙÚú𘃿E@3Ñ·®;Ô%c({ ·™{cOwG®]~}0Ö’8y‚Ïä Ü·ìh‚[Ä3‹á…wá)»Ä¸êÌ&J—8y‡«š-‡±0β™;Nœà¤iƒ÷Œå!×”¶`SËJ‘“ÉÈ~u}|º›e^¥Ï†Åóp™ïŸè2yvâ2&Xߘ—1'.cô}.#bSOpÈàS—'.côø´¤Kp3B©@2ãK´Óç.£cQ˜%—y û½o~ߺõ‚™58‘w<Õ9!·V@<Ú¦ëVÛÒµ=Ø•-ÈØ!ÅA“˜ Š¥†‰#a#N§˜®)¿]8m¼ïq,ч‰›¡? ~l5R)Öt’š‚*ɸ .ÈèŸBPƒ)å9¥:J HH„>”*óˆßî†Ã˜\g×1¢¦ƒ„„µs›-¦²ž$g¯\Ü 5ã t;rlîã.Ý¡¬ü:Ò<úsÓ»Ê/º9pÆáœä“-˜Î´ ^¹/`+Çð‚›Öþ¨š?è”°®ÄñXpM’''N)R`Ø9E@Røƒ0Ѽœ3´~|à kby6¦Š UÜïé÷†¨’'La ó úeÕ€wt.ÆËò>†ò£áÍM3xr¢Õ¸I(Œ A°‡#²§rfðñÀË4èÈsÊÛ|½°¼ém;#Ü %@êÚ$*VEH“âYà Øã»¶…8Càç>l•H=ŸÍb?–­ßåó妀8ðÞËZîßú²j誅ÃI!âe-ø[{=lwæ•NâQÇt<,i!@´]O€$]»¾ª~)š$V2}B:…ÄJT WÕÚÒW´&¼:øy^n=|%)€ü—XüÁß ß¹@€< k4}ËîzRh™BeVL¿êâ­ÿª+ó„Ÿ·Ÿc* ýÀwþ» ¸¢F|•…ˆ¶“J—)¹g¤o2c‰'™×=e.gËökÁ¹p“QÜ ¬Ë¾\ZQéj4EÆß2üBNEèýô±¦Ú,t×¶ì¸IúèËwÙ–•92fµøš^h¬-îÙÞïõé+<3•j Ó[G Ýà þvt™, i$¬ŠqÖWÆî }m§}-Š)ÚEàÊÐjÁ¼ËxTkÝ”èB©ÑßÙqŠ<8ô“ãøü3:ûóÀ™¾[Œ““à_ªÄù> endobj 617 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [261.453 523.532 275.392 533.229] /Subtype /Link /A << /S /GoTo /D (subsection.5.2) >> >> endobj 618 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [306.816 406.342 320.755 417.251] /Subtype /Link /A << /S /GoTo /D (subsection.5.4) >> >> endobj 612 0 obj << /D [614 0 R /XYZ 72 786.278 null] >> endobj 613 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 622 0 obj << /Length 623 0 R /Filter /FlateDecode >> stream xÚÝZKä¶rtù ƒ\¬¶eñ!QÊmýØxã à bµÄ™V-u$µg׿>õ¢ZšÖÌxç°ÁbÑY"‹dÕW_•F]%ðO]9}åò,Ö.¿ªŸ©+þ÷î*´¾ƒ>–´©‰S‹O/î‚äΤqž¥/É«,6™áy¿¼ùì‹7Æ\©$.’âêæ–dnêF¿»þ×ÍŸ>ûæf~-m𾬠ŠÙÅäÚmL¾ÛÕ~ºû¶é&\æ‹7*]He:.ŠBDÿp½K‹,zݶ×;›ÑtïGM•DM7Néšp ÇîÊqòCó³äž†f‘c9LMujKqiÃR?ŽåQPG·C@ ¯v¢ÔNáY¤ZÓ]kX×_7%ÎmŒŠ`ñãˆMõ·ø{Ö¨œš¾ã.T ¥IkjÀ4MW¶1,lMôVäú¡Æ}DÏ]§ºÆ©ìjxÖEÄ “œõ9´Aµ“•°ØáÈ:•ð“á¡õCº»Ç§l1sÓÝqm!“ÓÅÆ ®ñáx½Ó.¢®"R²fPœPýšX7| >SÝûêÝßü@GÛU~ÃuTbâdá:Yb¢:Z«LÔù€Ð²Ëßúj¢~\ÇDÿPŠàXd()GoO]…ÓŒ`©Y®¢×¿RÖu³c_-V¦oÀ}D§éxBÓHuôÐtufó€Ï–ï ~«ÁƒGÕüÀVo²BÏr 2QܳMÂéøY„£U½¼;ëÍa¡ºà Úî‚€1y4¨<%çb,Á'1Wh7€ç‘$Ñ_zB"XˆÛ žÓ~qZ™¦ëEnà§æ‡RF ¸(Z8?îgï˳ȿg¬à¼âK¹¹Î MK¿€Cë`ËÔª‡’ôéø‘T†_&ýԌ;õÜ‹À)3ì@ãvboäað6žZxqwÕ£—NžûMtßÀ€Ìyš»Îøò† içD+—GƒŸqbj~º–〠gœ›Ühûq‚ÛI]!΀_ák÷e׌îïûS‹ê¸,Y>pÿ®Ï+tüÛÔ¾äY hw/7{¹‰[ð!Þ»œ«e_Þ…ác°S>žÔ±Þ½’Cªh“u8É2 \ñŒü —èM%×Ý1H¬Åh%€Cž©Úf¿%:3“‰ÐÓøY$±ÎÔ§ƒŸ_õÇoúMÞ‘§ÐÊÏàiò`/Zë<µVQè;è©Zì©ÐîÙ´ÞqÝ86ŽC/®:pG¸jº{­2¤ðÊå½iåRQðFý;ìå‡$Mà¿ÚØ`\Ûܬ­QÖEŸH²è-i nzlüÈí²m)ªò\!"‰‹ër*÷å襻çÞÎ?pGÛ߉i†Ù ™- Àn£±-ˤåaó¬À´í‰‹€İ$6HL½AE‚Q©“_ˆNs ‚ç 7%±G¥(K¬øZ±‹7«Î› k]¦ÌÁ˜/Qø yࣗùLTz¦J—Hñöë%P[0‰<¤’•Î@bfæ(ˆÐÕÆ›®AP~„Ú¸ñù%ZátÀãÜ3ª<À Ö¬î ”bd Ú!•ÐóA±¾ê;à¨l?ïÇMŽ•Ç¹r‹üÄf!® 5N»daœæûýiš†ÈF´Sqá2\ Íì•…œ<6E~5ø«ÛY`—ÆJÉ€JãÌY[Ô.}t‚:ÛØä÷Lídu“ÅΨ'çÞ™Øä‡S˜åR·9YU1D•ÅÒ« K£ñ…]«Øe.lš0*[mšÇ_Ü3Œ¯ïuk˯_¯7¦±K~é¦/u›m*–[¼´iÙÂpF¶3…‹ ãÖÇÿçäGvñ$Ù·ö~‡fˆMÁ'ø½óÊYz"ÒÑT9‚RäÙÑ šƒçÖIXT"|_­NÃàç¬ F~º&ì?É;äþ‰]¦vðATbÃu®1yôU£!yäÅu–†Å±É\[°XF‹Éó±=IK!¼Bœý²Ÿî¹øÞ©æIîØ9¡-`„ù­ïøhP’5‘ŸçÙÀÝ€·£¸n&Pk43£WÜÿ1øY0MIЧ‰~=MmÓùMüÓ@ùœ:㟛žÖÃø÷ ‰—9ÀÒ£šñP§Båñ*8”ÞTzλ]a+‘QŸÄ;? ““hZŽ!¼JþÄçÃÁµÎõœóúœ´Ð‡`øí×1wÏ ?o™ Žomè8öÐL÷ìœ%ÿÜ÷Có³¬HQú=ÒNeB‚Ì#ìçàwI’2pn4ŒÇ²°8àÖÃ}çì ²š¶• —¨Ÿ&lÖ+ÂäQ|NL±k.?˜·°»äŸÀù шkÆ“®ÂCÁžåjˆ(.Mø¸­ÉÂqÓ n¥Òê€/o¤ÎÛV²}=ßs«¶å» .4*Ö›/`»ÓLèà·Ü üª0±ÍÒIÕv„ÄOÍ‚ŸÂµŸÊ¦m‰¢€RgC†H†ë–ý­(f|Ç”$VÉÚѸ¸9­ëÁ—g»Gê(\rôþ1|)€½¶²Ë\ìl†ø„Ý8øî*´¾{&¸B·“ªíÓ ø\¨f\1)ìT'FÓÐßñr7Ri÷´ø8ú‡è »¦D3= c>—!âØ¿rˆâ§E·À ‰u-–\À˜ª‚0Zõ©áéÂÆ‚ÆòÎlþÕ¹Dt©{V+Ry$TØo°#)ñ,+[««0²æHã,¬è>ûeYÐúmp¶í«\}ÉU.!6Å2¤©*°¨@ (*£%ÿ R"|Ã.ÿ¾„L‘ü_%¸£~ Ë©¦jª×ô⃬µoý¡¤þb_Öœãp$(‡niz%ç?öiAîŒ-&×Û…)muœ¤…vø6f‚ûH‚A½g}9“±b žNÅP}™ºI±47ÁäÑ@0$8HÔFZc€ ÆfϤ.˜däàgy¬Mök§l9g/ùs)[‘ż”½p²*Ñ„¹ ÐÀèÎ% éyè\›N¶À{‰S'é9 j¶=1½ÙÖKªSŒsMW’ñZçé:^šº¦BuLwlHÉm€!¶XÜo>'õÐ T,_ä5‡å¿A&蹇õâv9ì›i(4›^l $ªžŽ§æ‰sÞ‡èuÉ:æÌ_u¨ÿnqÛ¹¤æ’ñ²rš«TË2?a€|SÛôMü¸lÔ¹øø½ŸØ.Ÿ©>æ !ôì`ÖÚ%ÁU‘Ž-T¿D\-™-dÛJ¯NäiÇv±Uj `”EH=¡5sXçû O)ñ££ë<‘Ì«üùºFª–Éï»…Kj›ÁáÐ2‰“\oq‚„M!¬ºgKÕÀ>aŽÌºÿQ-ç`Pν œ8áY†Œ™‡Ó:ìžuƒP[¬®p‰Ê*o»vàe¯¯um•æ5ðÃÙÈMŠà‡E~ÎÉ‹lýA±˜ë™Uy¢‚rQ„×Ü…GB×ãçüÚ=%|ò>hFÔ—Z0øó÷A’“ZôÅÄL§xË-g©Øy~åbà/TZâ ΑJ6éAœAt;K¡ þøúsôÂW+¿¶.·%%:Ô+8a×*^r+“©8E#,âLÙO‡Z}Í»ý¦«úúR« 0I>‘›sõÖÍÔªÛ–qþ¦kCEó ã;¾#P/¢Z²VHü}9&î‡wãÓ,«êü$M%0½½åÒÉè',¢ 3aÇK–ŸfHB¾^âÐ…µ›uÂ@S³hÓ±ØÛ±ÿ3°¹Nq÷Ys@XÖpøk/-ˆp}:n„ªù+bošæÚ‰øb};G+e—íä󴈧ãÓ_>5óüþzÝá瘦Ÿ0P ^s2„å5g£o–ücÄY°YÈ‘.æcæ!|ˆE54‚€õÌ1íÓ@ÀqNvúÑé·ù5Óo`]…°LP•) Í¥¬¸¨‹YÜ=ºäFjžÅY¦^È%¥¯šÕø×`üI͇ù=÷_6ö¶^˜KïÑ?p»™FßÞbåIgÈ{ ñ|il~&DYqÕ–Šsü¢NXl|…yyY‰£f•½¸8×Aýßl}üµ ÃŽ}ä›»Èó°ûbøÀ¸±E.’àðtMôgu0%ü¼—~½¡ª£p‰{FUP0×Ù\ÙR‘î[t‚3-”Yœ),ŒgŠœïb©†[:J†ëN¹„*kuÔ–ÃýÉ ¥?«ÀŸ”±×'Èz¿ç^ÒÃ.þD %Q’éxÒÛ’þ<zª¾›‘þâʦ’Q¢é ãGгçÏÈïî†þÄʩǟZÂwü~ðA )×±yïÛ1fÛ¡Š•P2¢½¹’è&Dq°± 8RóÇI†“ˆ»;© Î4/Ww…Ã䎜",u©~×/R R⟵*]Àµ½ø³Z«²„—ˆ«VWÒFã~êÿ ‘ëñ€endstream endobj 623 0 obj 3447 endobj 621 0 obj << /Type /Page /Contents 622 0 R /Resources 620 0 R /MediaBox [0 0 595.273 841.887] /Parent 611 0 R /Annots [ 624 0 R 625 0 R ] >> endobj 624 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [215.787 402.917 235.181 410.493] /Subtype /Link /A << /S /GoTo /D (subsection.5.14) >> >> endobj 625 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [450.047 178.285 469.441 188.285] /Subtype /Link /A << /S /GoTo /D (subsection.5.13) >> >> endobj 619 0 obj << /D [621 0 R /XYZ 72 786.278 null] >> endobj 620 0 obj << /Font << /F33 497 0 R /F27 394 0 R /F15 393 0 R /F26 391 0 R /F39 496 0 R /F28 523 0 R >> /ProcSet [ /PDF /Text ] >> endobj 631 0 obj << /Length 632 0 R /Filter /FlateDecode >> stream xÚÕYmܶþží_¸Þ'`É¢HI”¿9‰8/m` M?ðvy·êi¥¤ÍùêþøÎµÚ]Ù‡Aà€[Š‘ÃáÙgFê"…?uQf¥-’¬´«íê‚ÿî/Bë;ècI“ë$7øô„`$c'¶ÈŸ’WE¢ Íó~yýÅó×Z_¨4©Òêâú–d®×ÿˆþtõÏëo¿xu=½–'&ÏŸÖÅÌlò¬\˜<ŽW¿ºùò+·ÚÔí®õüµÊg¢•J ‹ü‹«¸È²èzSW±ÉtÔíÆºk±­"ߺ›ÆËÀÊ­®²2¢Ii´»Åß,ríUf£±vMí¿æN–u½[¾ç®»æq·’«¸T*z}eMÔɈC-/bQ,VhôŠÔ[×Ãj? ¤˜–ÖÄß‘ôÕEÕð÷Ø4Ñàý©i•N“,;Ì ¶Ãn¼¿­ïØžGF öÌxÓœN›•‰œ}òÈ>=l?×ìt{2(n¥wkz¼Ý·+< Ù¨ë=ï½íFn¸?x°îš'ºÁCxdQ²™Tå6Q©>²)Ÿprº§XÙ<Ñ%ØJIú{û;?¾K,@ݦ‰²êõ\u]VÔui#×4ZðÇlˬ°A8ßs×Hguí]#ëÞÑ |€Ð1?@X°KmE+“ÀGÕÔ7 ûÈ,ÜŒb‚-ÜÉ$ÓÕÑѾÁëaªhØ]Å Š_Õ?¥Êøõ3èÎhž§²«évbi_íaŽ›ý8²î»›†[»,ÆXïW2™kyÄoñYEû¶F€ ?ïµ Õ‰jö}ï[\“N67ßÉm'C±Ö&ª[¸‘®Åh-3AÃØ‘Já6À Gîçêp3ˆ±©’B™ßÒÁŸûwcßÝûõ7äIp¢M¹1À[U(reÅgæê|ì }ç9«2ERØ:>C_ФIš)F®ˆ—q/ˆC<3츛v.(UIf™Câaã{ï>`T²i|€Dën1Þ@€½¤>Ä-¿–‹?Ë’ôÆ©ÑÈ¢ºÁc³„%;nд8ø€wíZü´±EänÈrÝ~dÙ! ""¿ô^)n°á~¯©yû<ô“ÒfÑ?¨¤,ˈ‡»Æ=.в"w¹|z ³§OÕÓ¬ùª°™”](eª’O‡-8ìw¼í®G»+ B~ðîŒ.%Ü) hXßùq` >+è½Ù× ½•"*\}·!F!R¾ù@\»žææFã8ìû£¹w˜!òANýÔªœ½yÒeRN¶¨Eé­G¾Sí N°IÒ4Ñ©=ì [þWpúÁ¸‚Ê6øhÁÍõÜý0¢Ph趸¿”½& odšS€l5LV•Ë‘%ƒ0n&ž÷©È¢Ub«` ²/.'½mÊhÛõ|Ž:ú«¨³êöýà1ª¤EØCö£Ü³Â&:;P0/rß`ÈsµqWE% 5ÝÊ5pÇàR´/m’Ù­ÃcyäÉ'Ó£+8umADF¢°¿Ô}×n¹-Îã—«6Ø×ȃ—l n ÄDƒ¯ß¼ûñû—ÿ„G¬æábÌ£’ ¯Ï-ø»X¦E§T%™Ò$¨“ò*V*3àž*pO핼™0Ñ›vÕì×´—2‡øÈ¿žÝÎfW…JÒ î3$éL¹Ìƒ’ñ¸xN­€ö ×¼ó ûŠpv úÆYšä€#"!Õ`RM¢õ¹K¤š¿†üÄ;'\ æNNX¼¾Ž,ÿ{°l¬9c ~†¯w"ç¶uS{‰)›š‰ÑQ(©ÞûFBþP‘G®nŸ& ØEªŸæÑZ ÀbÞ ÎÖ±˜ÿ^,ÎNþÙ”*ú 80¦/¯ã™ M™Ò1âïÛnëZ¸øyšGoFðB+yø²kÖ,B^ØÅ2ü<]&¦v˜ Úœ‚à Ës˜…ƸI¦š ü˜%x@ö6”Â8Hþ)껺•„58Üöí”ÁÖ-øß­ãt(.Á—ý¥éªÓð‰|í\Ý<ÆšBãöõåGüñvcc õ½¼ü¸ 6ŽüíR ÔŠ'qžé ²ª8eÿ8ARúU·ÝíO?ÈA‚1ãùAÍòVNækŒkkn¿Jø÷;:Çý¸ÁGv'øÚÈKè#PÙiÖSS˜âb2ž Ó—WFß®¹xQ ‚5#8 ñ4ˆî—Üz]‡z‰¥à޽ÇÀÑéh¨GN †¤”@jË{x\ÀMSß¹qßÄ´p,lšþQCÀà5yDèh·#\k-”[÷-'½üä8j2‘ 6v°ð±ãDÛ¾Ûrk?HÍéDÿkêCg€N 9d³O݇Î÷È+ªßÙŒÝö£lcð#%!/ÜbM¥JwW[9¡Ûî¨v…r`âKáò™¼0SŽ%QqžÝ©.]>^J¹ò$-C‰¯ðÇEò Éza§ ¶¸T\Âè_³Ô–—ªe‚Ømý›l ‰Óe`ºUr\PÂë² †JŠ*$.·‹zàŽÓ§v¬gjüñϺ´!fP•åàO°Ê²‘Í™öH½Æ"Cukðe(Y2 ‡„¯,ùJ±¦_×­ë1ê—0H·Ñ“Â&¾Šm¹MNJmµP¡gÌ…º–iV<‰qüR5Cî-‚^Ïär_Tž%nݘê䯍‹Cï{ž¡ßÜòÔ³Üí(n} À¢¨W¯ÜzÃV‹(X$,¨¤ÆÙsA«ÃÅÃ7Œv4™°¬þ^ÊI œºpš9|§÷?ïky ™ÑÇR×ã̜؃óíŠy³Mãåƒï€¦þÝP‡B¯ñÈbèzÏד,דpX §04àIBî^ß2á–Ì“€&²B yN×z# Æ ýZW‚³T°¨ûB×ÃÆSöºPY)²D©'Sm¼¯Ac®#±ñàvPZS•€v ,¼^í×s÷çL|FòëÊ&"ç‘áUôÐ×#l‹Nj*úÌþ¦ë×ÜÁ\´°ì6,»  ìò­ÜgCеE“ì§D ^îd‰Ð=q–¼ÈajPC^ èÕ¼N~Ñêè»ØZ´¬—ÐLe%—ðB19†%¸n·kС+î±à¿!ŸYþí©»OsÓ£§·9~1YÎèCÑ›zÜºÝ öÒ{Gw€<&¾ÏU¾¶íÔâ1àR@€ÏùæCÝ‚¥±Þ.@hºµÛ‰+¶¥Ð ¥/·×pOXÓç»úüàX9W“$¦zÇìµù''}¨.Ò*9?‚[õ"Ç>˜„¯"TìĞ̻ªwŸ>P7Æñã ð’\ÄŽEÜñü‡ÌîRF PôýeŠåT4î×@/ÅCx]vE.ù|O¼È!‡H)>š4£2âHVÄ'9P¬÷…C Á^E®8+H3 ƒ&UÐfª“a¦Èt:Íî Í|^–®§GßññðYé|µø ÷X•ïTD;ЫA>ñœ)‡IOï-\ás´Á¶F8vÐ=L6é—p.&Ü`dØtûf)›w ÛŸ *Œå¨„ÇÕN8L¨)má>“/cq®(žÊh3d¡Ä†?Ÿ1ggÁ¡gÙgræÿåœ9ìendstream endobj 632 0 obj 2900 endobj 630 0 obj << /Type /Page /Contents 631 0 R /Resources 629 0 R /MediaBox [0 0 595.273 841.887] /Parent 611 0 R /Annots [ 633 0 R ] >> endobj 633 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [229.497 734.742 257.375 744.439] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.13.4) >> >> endobj 628 0 obj << /D [630 0 R /XYZ 72 786.278 null] >> endobj 89 0 obj << /D [630 0 R /XYZ 72 557.087 null] >> endobj 626 0 obj << /D [630 0 R /XYZ 72 518.062 null] >> endobj 627 0 obj << /D [630 0 R /XYZ 72 470.569 null] >> endobj 93 0 obj << /D [630 0 R /XYZ 72 317.791 null] >> endobj 629 0 obj << /Font << /F33 497 0 R /F27 394 0 R /F15 393 0 R /F37 380 0 R /F38 495 0 R >> /ProcSet [ /PDF /Text ] >> endobj 637 0 obj << /Length 638 0 R /Filter /FlateDecode >> stream xÚVÛŽã6 }Ÿ¯È£ÔZëæ P,ÐmwívÑMŸ¶ƒBI”ØÇJ}™Ùüý’¢œq2(ü ‰¢(’:<4_$ðñE&Yž2‘å‹ÍáŽ/è{\Œ³Ï #M¥%Ó Wo(Æ£f,5ËSúVwïî…^pŤJ«×]m¿Fjs.T´*í2–YýÙº}kˇÕoï5ÆÓ,ìOGËÍ.(ŠlÁV$*Æ£f £ÔbFŸë‰¾*˜Ðy°[uàO#ƒƒŽºêp¬-‰6îp0Ͷ®K›½[Æ"‹\Mûÿ$:1k =©pÐOu4ý™Ô;7´›³i8–G[ 6x0^š`ÃÔµ[Âîsp ¯EùÞ6¶5½Å íEÌ1û…Å4 ˜$ÑO÷_pÂÁC®|4 ܵî@RCà ï8½ÿ–Dœ†kp¯§ƒGz!¶Œ•”ѯ=éø¼áHª¶ÙÚm¸Èµá ™v”PÐ}.]˜àór §a:{í]>ç]1 %@ûø)\t  ù”ß-H=W}IObÊL.Ž¡Ê Æx^°TŒXäuµž–L¤iPBtøLÀ ®/mKö;·ëýãú´öÚÙÖþ7Tíè͵|Eä gyž^ ¡;QrÍ7²¯õ:&ÈÈX&® &ÖBG_ãúf?B¾û]U[þ>l%âý•Š ÆØÃL~./¼_æ* )Á#k6KK‰«äüÄ#~Q£ XØT(E°¡&(úݾ´$˜í˜(á«w|.Q÷ÅjBÏígÁ -äŸnsͶjö çEÔ˜CРlŽØ )«« —X0ÇP°Àl@®lá™7½kO˜xT]ˆè‹ëü.@fGãù¼ŒkIìË8ON(ifžXrβ3×Ý­ÈY*GÜÆcE·©Éônh6}åšÎ{™DÙ=©& 5­ÁÎzUÜ¿û¸:w ™2%PQe1‰MŸù¸gŸ©q\a†ÜÒÀð×Fyáo³EÉÞØ™f/@$a©”Ľõ‡Ï ´v0>4_U¨Ðé³Ã x¤­z`ÅPÞŽÆPÅ,0¸`š_2¸g×\‡çÕ@‡tƒ.TÔ¸ž&[ÛvÌÚójN} åµ5XDOËÀ™°eh¨ÝþÜ @ñèÈ>¡®§%4Q†­¡¯êªG˜žh§4ÁêtÖÇKûÍnˆÛc¢:Â[ªŒ˜§¬—”´ö„Ž¥„ìÌP÷´hq‰)P“®‡¥9^4î‡Jƒ–Ÿ*h¯trã+þEÄ/¦Ù{êµu7_Èew ¯#ÀÄñÝ¡^WýÑ@k´P,3ŧ¡豪ꙺƒâTZ ¤õT†ð ° h†anh˜>£,nö*ìCþ× í®øï|ú÷—þþ4ãBš²,]0ÝùšÚŠj’€ ŸQÂ'/Î$ØÝVÝ£Iª,D*X ™›fh•ºs]SŒ÷:¶TÁA=å3ÞΦ0r>éő֔?rÁ¸†W ¿Eú8I½¢$ À/nSÒmcÔÚ¯ÌÅâÐð[ ¿{@œ‰|‹êðgþß";!¯o×7|0;Cendstream endobj 638 0 obj 1209 endobj 636 0 obj << /Type /Page /Contents 637 0 R /Resources 635 0 R /MediaBox [0 0 595.273 841.887] /Parent 611 0 R /Annots [ 639 0 R 640 0 R ] >> endobj 639 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [108.424 600.749 127.818 610.446] /Subtype /Link /A << /S /GoTo /D (subsection.5.16) >> >> endobj 640 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [213.605 545.946 227.544 556.856] /Subtype /Link /A << /S /GoTo /D (subsection.5.4) >> >> endobj 634 0 obj << /D [636 0 R /XYZ 72 786.278 null] >> endobj 97 0 obj << /D [636 0 R /XYZ 72 761.372 null] >> endobj 635 0 obj << /Font << /F25 380 0 R /F44 495 0 R /F27 394 0 R /F15 393 0 R >> /ProcSet [ /PDF /Text ] >> endobj 644 0 obj << /Length 645 0 R /Filter /FlateDecode >> stream xÚÕZ[oܺ~Oú ô¡2¥Å‹nç-)N€´I›Ö>E€ž"W\¯­´•´±ýï;Ãj©µìMúÔY’"‡3ä\>ÎD^Äð'/2u‘å©PY~±Þ½’ô÷õ·þc4Ó$Z${g&®üÌ•NDž&8ÿíÍ««w*¹Fh“^ÜlÜÜ›ê_Qr¹’R™è—¡nï.ÿ}óç«wÆóÒBäYÆ“GÙÔ·4I±Xq“V "éŠ}ÖS¦µwM¹wM04¬qùÖîìOÏ*—1¢ÈÕo@¹^0x#¤Éyšóâ,«CJˤ–{í ш  ÁšTôÉ™4ü²ICËUp>IGï.sˆ]=\T¿ëzûz‰=§ZùòÇL pˆ†ÂP Švõù¹CL©Å”7¤@5+ž÷TS¨*›P×#åÃømy°Åˆä½IÕÇ-nš ™wyAºZ âÙ>ãï’XäIö²r¦“3RË%ÎýKÏð”Š$j%& ¬„ñèh±>ËýúS¶vů½ÂˆØè™¾®cy‹q•eºš#p߃¿§¿±Y/Ý•4 T“Ыd«T‰k.™8ŠÉïH|ô»æÍ澇ȵ›8 ᧉ“ ”'Áã6ó„Cq›rÓ0€*ß4C÷ú94x|3iy"ö{ ue?ASô 7õ´p›/ – ´&ŸàÙ\“Q§9ýt7o<KÒ Â>7‹È Oá ëoðá®yÜ/ù/}6(©¼ƒ}Ü[YnvçàE9[<ãÇ}½Æ7ž¦}(wûßnÁŒÎ=  |wF•K•,Àì”>I (N üý`ûGÎ ˜c^àÚŽ#j0‹¶*wðŒÅ«v\f˜U˜íO³?áÀ¹;;â«Ù‘ë6 #0gY<‹Ò†ÀªTQD»únëÐu' †¾Ö®í08=toÀŽæ|méuE£ðDè¹dÖà.òBŸ{Ç*À6SLh ðõøM-w‡EîFºÃH29ø:{‚»×/¼*H82hu9ਙÿšÒ÷(íð î|Új]zLI Íý|õØ®ŸYñË ñùâØ ïØ‘H³È G“<íÓ/<_¨É9Ôö‡zSÙ ¹ÜùáýÛ/Àù—ë_>}úÛ?n®,ž¹ rJ+S.lþ0„F~z  :ZDï7Kê• 0 ¾ƒmÇ"«¸{‚Kñôì´ºôØç{bŸyˆ“'×Hñ,¤b&wâC¦Î„Vs•;ôþQ3%7½¾“WŒU€£×¼ñ6Šy†ñÊú𓤳$Æ«j¶Î¨jé‰7Í”c=U[Ò¹\8Hÿ¿(-¸7™«sZ[·£WÙ/΃ ׇý¾ëÇ_ã$¦oߺº‚žôLsΤ !Õ`'~䢷›W o€å.r!!*jüÑ ŸW5S‡ÛÊóŒ>«±0“W“y+¿[PÕ\Ê8Æ‹pB*™@e(¦6BÃÙ£´r‰OàKC{• 럊éå:j"@)ó3‰"¯žv<ôíÎ3EÀî°+øm>oN½©>Í´:;x °ÄWÐôñha ®#MÀ¼'ˆŸáÄ_@‡ñí¾,c&%áÅdæ¸ð¯ÝX¯§Â‰Ïiÿç 8oL•@PUNQ´40íYú;LãÓ÷ѶÕ0/åÌŠ8p ãˆ$§Z ¢“&Oý „¢ž@‹Q’¯QÊåÅñ×çÅ3Ì‹ÃX&eô¦eK*»®‡cpºsBœ\£U×rëvZIp­n§½ Ì»qÀ¿–@>P䆗sçÆÅÌ#æXÂÁp}ä^X¦£0 ›Eœ„ÁƒOžZ?³m–À ~_jÀ¤Þ¨&B ìÓ‹ÀHæø<ÊU°¶še¦ŽitÎW‡…ÈŠ¨”Œxñ¬§r Ž÷Ü€K 9x­P <{毼®¥”ÂãèÔS®tÖ¨¢dn릞TK}µ‡Ú Œ+P ê'ýÀ¤[Šò òjžPþΧÊÀ‹Êymòº£\°/µ+û¯uœºf^ç qg[Û»ZJGU‰% Qw”cŽIá÷¶wåž qž:ކ-$M¤£Ì)PÞs…bIãLiqØ+sTÛÓBT Aï ÅTÝ ;MXÆÑrw’;îAšz-K]5ÃåÒÄ;¹Ô„¯Y^í> endobj 641 0 obj << /D [643 0 R /XYZ 72 786.278 null] >> endobj 101 0 obj << /D [643 0 R /XYZ 72 761.372 null] >> endobj 105 0 obj << /D [643 0 R /XYZ 72 697.251 null] >> endobj 109 0 obj << /D [643 0 R /XYZ 72 401.657 null] >> endobj 642 0 obj << /Font << /F25 380 0 R /F44 495 0 R /F15 393 0 R /F27 394 0 R /F37 380 0 R /F38 495 0 R /F33 497 0 R /F39 496 0 R >> /ProcSet [ /PDF /Text ] >> endobj 649 0 obj << /Length 650 0 R /Filter /FlateDecode >> stream xÚíZ[ܶ~÷¯Ø7k"Þty´“¸uÖA½@ 4EªÕpvXk¤‰¤ñzóë{.¤.³šµ AŠVI‘<÷ïޏJàO\eò*ËÓXfùUux&®øïÃUh½…>ž©ŠÆ·ÏLÜ„™eâ<58ÿÕͳo^ s%’¸HŠ«›ͽÙþ#jÊáÔ•õõF‹,úàš-¶ò¨Ýñs[%·:{ìlo›k™GC9¸¶ñ3ýó•»ÃF}ßl]Ùð‚‡²º–Y´wíãëM–$ÑKžuW?÷Ï{žÖWeSã+;ëõ=~^âžýõ?oþ§Þ$¯ Ó—µ»k,œY)¹Ÿ*úáý«×®ë‡Í@߯7°†}ƒ:jZžt(‡ÁvÜný‡÷ûr£ã¹q×o^ËlÆ;™ŠXäÂspµ»åY + b•~’ëyûîÔ4®¹‹‰8W‘-HúBç2Ú—È\E·LE¦æ:êK·å%Ž€Îø©42‰ú¡sÕP?ð÷Û–èùû¶áøþx Í¡ågCòÄ1–´—½ÝòJ$µ7鏨Æ~¿Î‚ I" •2E†ºuá<¢ø pö%,[Ì—UiXÛHõD {ë:?±+ñó~ûxmRP“¥OuTµÄŽ-/ë‚àÆšãÄŸø¥‚YT’ßÁÑü€È‘÷°óh\"ñÝí­ÿliW"ºwu°îÄÄ…\:¬ |:Àé¤ÑÑ¡í¨.ÔBû{Éf¤‘l38::™æÑíiàá‚l“'õG&ÉÅ÷Ó‘§ÁŽU9X°Q"‡0^áw6ÜYúçÖöUç<·+6 ÊϾ¿ƒ( &B#Áy¬Àz †b7~¸ ­·OÄU›•5 U\à—#á)ÐzçÕ·#ñÂslyÚ½ö<öƒRt3heæQ=›<"ô—½W)vwðÕÌÕ¤iô†}¨­Ÿ÷¬×*™['E¬uÐþO+šGi?ž§¬\ZK09½í!Լóe•¨GR2yN2 ’ ÀÞÉ22?£"ÚaŠ«üΣ"³‚މkÇí|£ìîìà¿%=Ãv® ÆÛƯÕöˆg®½kVÔíìÔz´ØßAc”’*VâŠA /˜=“Ž–ÑŸÛ¡íÚºä¯Ó¼ý‘À Á>Ë  {ÁqæÔû`(9ÉÉgáZ£Sbr`dGï#ªÆ¥|˜˜.x¬~ ž‰aØ-À9&@Œa û4èì,䉄™ôÂ¥AVC´BOâ_wüœ ‡ËfËÁ«YœÔ˜I©'ÕSŠ81!‰¤8Sú#0 ñçs~?PÀ•l@A’}Þïì`_n™ü²îl¹}àŧ’£€LÄR, Ý¨vûT4£|PùÄ\±æÀcwêŽý «\ïðñVP‚`;Ÿ<+"³˜… 5Ks(PéÜïàü$KŽœƒÍ‘Öœ£˜ÇEbøÃQ̲ÄD{––Š›«èå_Þ¿á¾e;Žw–¡t, \ü6x¦šŸˆ{Qi“1}€NàÏÖ°ïiÂÏdœI–ÇFùáúRþ4Y‘†äÿL¯L΂πíwîîÔÙÝ2&NFàiÛq`ø·êŠ cÐ&ûZWnòÍŽO ÖHRà·PÒX2k=gŒÆ9=?=šM£Y"Åì¸P“yáBƒô §œ:-“º<{7Âqš©e±³çÜÌÆ\?|ÌâB†Z·¨Èˆ¨µÊg­Ó„¬»ùb¬ÝUÕZ@ÌfuPŠÙtÀÁ›-Ä;òý‚µ1³ xÅèsÍ&¨ xÏ!7L¹+]C®7cÉ.IÁÈ D4ùÒ¡ lF_ðè Çò¬ý·­@/Vø‘+@X@k¶ëšv…)r_£Ïê¾=%ŽÐ€Ü kQƒåi‡CÐÒbqÈ—Í¥|"¤¿œlçÁí˜}„$¬ˆü–3§'Î ŸÃãKX4…â¡Ö±)Äï…ÿ° …?¶î¿Ó/EÀúë/EÀÙÓ÷BŒESãÉtqpÕ[¦©¯ë¥fÒ59¯Ï£Ó• œ*³¼(©3vOÈÖDuämÇ_aÐ3|Zî(Y§³<†´Ép\²z”Í.mkà²>3×6`9£ßNýÉÇT%g®_é‘J4ÀÆ–¾pF #’þ’e‚ÇÉtö»å¨ßÙ®²µ}[Ÿ¨¼Ž:½«ÛÒÏúôsG5"lϺ°û’õÿ·Þ¯²ÞüsÖK§HçzX F¯¹¾æGûòÞˆ±Ñ¢ÅwØžT»:uü¶%5ÀvF|°x)sOU(üÀz‹ûxŸRg|›*>ðrç¸è׬W鉈íÑá0Íï`fÕ®BÍŽÿóê$Êäø!ö$%Bý>ö·Èî8ºO¶æžqÏ‘X`Ú±¬ü¾ö°k¿ŒàÇíq<œ[»²ž¢e1ÝóèyíKSŒgÇÆô;Ðýið Þýa×Òeàe»2Ì ú€ï|Ï“%Í~…˜ ؃wäØÓCrƇÙÚÍ )«5[Ÿ‹Ã\´ÿÉ$“œ±¢µáz¬ººäòo‰õ·ùß‘F⤑Ú,5î÷tŽ«† ìæ²ù\{+Ÿi­¦.\%€ª39âRl£ì5]à—뇉Ìñ`ƒ<ÂÝ3Ë¥ù®ÁŸ æÝÙÆvìù³y$Ó™âü¿ ²Ì|’ˆ .QW»½–¤<á'ŸµÄïàAŘ– íkº(æš &îyÈ™`Ï3@ ñt‘?ŠYøÿ„¡(f)ÆjT(„SÌbõ¶m4ä‚ñ¾¦Ôîòˆx‚]\MJ£woñi|ašÿ̃º~µ›­EM-šŠƒ¬©¸‚¿G1³\^ví|6ƒn˜l?.Äüƒ>y°µ&â×råñÇ2ωR¬ ‚_Á’v-rîžûø5Ÿ.EB@úø6Êg²õʼˆ˜þ¥¥â ¦ŸVE’ú˜ÍiÂÕ({ÞóŒ‘18–ÎýÒè°×Äl»"ü–[LMÁ©ýœƒ{yöZò% ©æÙ×Wkzëñ6ËWU‹<ÔïohDªPYج/ }\pØ·t‹MJ?U qÊý$£dèi콯‹ŒÌ’eš?ù:”ijw(ˆ{Gwž& $;’-S_± Þºð´bk ´0RX…뺘ÖA*ÐØ‘W°r²Vm¤—Ï*0QÙrŠ*Bí5‹“TŸñƒ¡³D'À¿Ð\GÁ'3W£‚zôóæLÀwçŸ,˜}p[úávR•^SEWì{ƘUp%f‘'é½#a–W82ê5ÎÙs$‘ä%0i_³ G?ÌR™™ß@ã™-GE.³Q§¯kÃÜð{ ìü VF¦òz–†+ît¹A(8úú¹ß¯UWÊIîgc= ,î;[ÛÁ¾¬ë÷òž°µMøtN4!DkÏS)â<Ã{¶TÆ&/~Ëï,òµßYèßò3 Æ®®a ÀۤПûõ¥Šâü§º|ôëI·©æò¹ÿw¥¼‡endstream endobj 650 0 obj 3523 endobj 648 0 obj << /Type /Page /Contents 649 0 R /Resources 647 0 R /MediaBox [0 0 595.273 841.887] /Parent 653 0 R /Annots [ 651 0 R 652 0 R ] >> endobj 651 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [85.014 639.898 98.953 649.595] /Subtype /Link /A << /S /GoTo /D (subsection.5.5) >> >> endobj 652 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [93.878 84.937 107.818 95.846] /Subtype /Link /A << /S /GoTo /D (subsection.5.8) >> >> endobj 646 0 obj << /D [648 0 R /XYZ 72 786.278 null] >> endobj 647 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F30 512 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 661 0 obj << /Length 662 0 R /Filter /FlateDecode >> stream xÚ½ZÝsã¶¿þšô!tÇb€ Ⱦ9i|q“ÚÄ3}hÚX¢,ÎI¤Âó9Ó?¾»Ø?$ʾܤ=°ØßîJ,"ø‰…‘ “&¡4ébµ#ô{¿ð­ï¡FÆZ…:Æ·W.c•„I¤K¥Ã4Ñ8þëû7_] ½Q˜EÙâ~ãÆÞ¯ÿÜVm±Ê/–J™ ÝÚ[ ´rj¬óýç:oª]×UIßÊ<_s«âyKißä-5¬îv4¬ØàSûe ,³±Ý®¥Þé::¨64ËH|(èCQ^üëþ¯‹¥HÂL%ðDeîXÛª.~2 Z‹«&q`KÜn"ƒ2 òî?­‹:_ñЉ Іºï¾©ã~K]*Øte?Pöu±·u±{æîWhórí8ÓÚŠ r³òƒ­ýMU»ãD“ƒØÃaûÄ%q-%ƒ§¢ÝbK–ÃÁ›¬§[µÔQãTWü!¯sÚõlêjO-âÚ_]+³"Ì´&YÊ,”B¹èP],…qpSmawů–9a"¼$"Ž “"â֊]ñ0³ ˆ©Œ¢K2:ø1ßÙ6çàùØÐ܉ÃÝG!YJxdÚ‘¸Á-eH—»h5ýåf"xr·Oíf[u;\#Í‚UuWòá)ð¸brâË‹eÉqNBÄÓ¶X!‘-uo-¯owun×Ï4è.(çí¬ófU,k¿õÍ·÷ƒR{Ï¢0ÖN§±?¾_øÖ÷/蹄Û;¢ R–©ìuƒ¢àzxØyú°ePújŸc+ öUíZ)±µÅT)ñ%UÂîÇ‚˜ÝÐxÇl$Ñ5ÈÁ]i@\µåЇ :aÿÏ‘ˆË|Ùv¥ÿàgG2*³ÄimÒ+IVlEL(Òô¬ò9Y̘š¿×…£›d´-P¾bz±;nùÏk~Z§‹Ï- 7€£oº}uzî$^šÃe¤BaÔ©NM®E¦aû¤A—¸żÊ0¥¶õ3.™’J#&›7´ù‘àçk¼?)ƒ·y™×`ÉŸ‰k2NCë G<{í{8Ø%Š4_¥J“àÐÕø9 ª†{H{’aÈñÝ©”M2ªø™ƒ3™áކ¦N_᎒aÇ<ˆ”6uJ›¢× 7”]ÎkÛš7h›¦rG\l£ Óß×™¦‘œðd´ øgZÅÙa|»ùË— _K£ÑÒåØð±hÀƒ¬Ük ˆáP»ZåMS<»¢E¥x¦ÑÈÃØ;nìŽoý1ð¥à§Ýá)\«i:ç‡Ü <‡Ì'öÐuVQ Ç^Š,îw¸O¼há—¶ J»w- ØÖpþÄqY íl· 5V*!‚{wžCï!€ðCz¯o|^ïêúo“nz!7 Ø]ÕÚ)ÙÉÀ­EʼO€5‰-Ør²c¼:Ÿzç÷e…3ŸJvÈìWÙó`«Øçg-ݵNÀõ”¸©Ç®f‰°×3¸ãÄ:æûÕc1Å·µmíƒmÜ7=š©ƒÃÎð™Þ,¯‡(n¸Füƒýõ¿/t$‚ʯ·îjÇ.\rªáYÈõmáîݰV&==˜2É !0rÅ7k o` J}kXØJ÷1J0ÁûHiámà¾{ïÁUJFéôRbÒd#bøæ÷Ží)açÆÒÈ[Ù `ìÎûØËPëę.‡¦€¹3ÊÉᆠf5Î"#¢Tï-Cƒ0¬[±iš¶Ú0nt^¼ðÐ$%h}§ÐDD1@¯ )ë0ÎÄï†MâO&äå^„&$,=8LQp5ÞCµþ\[€Æ^¶¥ ¯cw…ˆÜÕÀ3´ÄQzäÈbA0¿’ÂøcG†Q+àÓEI8{‰-Jê…ûÐöÑuq¶ bø€²Ð£xì¬üž²à—Î’¬ÀºysVU ÷ÇCÀFÊï{¬ÀX:‘vA³GHœõ€âòš}„3oà¸Tp}^Ú{©ü£Ývèb‡Ø)#±ë5/¥Áæ¢aÛuümJÑ5íd_´JW¿Ð0Mlýû?’èÇÝóa{ìÀÆ49 ž¹ z‹–Œ|ÁÃI8œýßUÈCÒÒõ©+`ïäÐmù˜óJvã8ãÈcpp5¦âBxea¬Qg½ä.œ~ÓV‚u6š¢/ÔlúGÁ⊃p>’Š}> mOb8SÐØ$€›ôy¥<¯¨í‰TŽ4u‚Ú¼¦~¨ ع–:øÓ½x‡aæÅÃÏ‘Ž¨³([jìªGè~£KÔ×,@%°V¸sQç‹Í˜0Õ‹42Y(|¨™ÏK@² ÷ûÓÔÐç!±±W¢KF€ýI”š9Éõ êLÃLzЉ‡òG8"¬Ò0¯×SÅ¡‚ÀO+æö ûRÐ^&¡€ù§Çìf-ˆ„H_¶$sU·—ƒâ} º†ó¸š¹pD„2õáÈÊ2” <¹Ï™Ô`ãú¸ß)Œwól0ž<h g² ÆhJ;¨ õôv–Õr?e0@Š€¥29v”¸Rr‚…ÀÿÆ.߀7vÕò0~úô‚„£ *÷Á°w†5]ÜŠ5u¸ y&¬I2¸g/\盢Ìgø e‚‡5DÚûS’Å=E(…Ûsy”;¯gˆØ‘÷ ÙãÅuûË™EeIð¡bÂÍ3"m‘~ë>/£â!˜Æ`^8gwºRŠºé%쇻·×7?|;wíTͨE>€¼½{wž–6¡4rà ¦$o6s$M˜ôšÿ‰{#{žƒÌõ%u[ZYéÞ{LiQžúTm›sõÉ¡s O;O%<ŽÌ8åt%†Z(èèQgN'M(Tü)KDhzijº¨zÓ¸°t@M&xt¿ƒ„aÁøìŒ?žXž$ñxD¨ ‚ÙÁÓäJvæY(3ù[ò*Ë~+N`š1?Çpd ¾EǡȒߎRÿFl|ž0L¯\~BcÞd¦Læb×9U‘F2¥›··w?~ûî›»Ûë›s—G×Ñ8¯;c×€;ÂL‰^ßÝÞÿåêþê뫟æÈ. ÇÒž;‚×?ÀF”ÌŽ+î¸ûñKi£Äùß®!, Bþ3ðÜ™c¦½ŠÿgÎÀV¼±øÂ9kGžÀ}rFÒª’/:L—ŒôC–•µƒÊNä%'¢ãdž‘”Eûì ª?£9ìóPÞi[".Ž­ƒ#"•Ϥ#æÚ…ERÂ")9r¡6.0d_V(¼=(ŒÃJà†ž– ~ý¼ÞîC{Å`šGéÄDMÊ=®Ê×ù2$ÛWÜzR]íJt”ËïÆ‰Sª)ÁŸ8…ù³õBcÑH€ÔpÍËv¨l5œŽ/\f63œ~ÍÀT–s¤á‹lœEÆ7Ѝ32)ØQçp{_æÄªË†§—Ÿi…;nëbÅÙö(¨Ø‰ù •ƒøg®È‚OŠëÑݹÌ9Îö×ÈÙ=çÙ¨"é>_@!C*¸Bõ7梊DÔ<·F=·÷IeÑÇæX({â‚{ÌÅ2lQ±ì|ºm @º)# óYJ 5«äéç)9év2)ËfX8.ÈLÁ›p9XBÖ"ø©a²õšŠ;GåSq7‚R‰‰¥¼ÞS xÓÓ”Itª}: ö¹uhVÿoZR†*…qY"8àƒe£qÐޖšÔ.ë|‚Cy§ô ãSA8¢¡€†^©äI)ûØCc“*uJŽÓGRQúÈŒÒG.›xµk*<¨–¨Ë8kÄ%N룰™üãj×­9o8)ðïMR,Pb#›÷º ’q_šü4Œ(0¿ˆe˜ôPèÓ0¢ˆPêÌ(l…­ßlèÉYo<h:A`t‰¡ŽÙç-0Ðk_"ANÃ8>*øT!™L#ƒÅ£ë(›qMh>i‡VøÏ§é6¯;B@ðlÄkIpŒX•z- Nÿð/”ràòèø5êd<µR¼ ÔÐÃê>z‡¶˜džñ½õ†ÿéhŒõpPÅ“-=z\L¯Ç±²_ˆ“ Ã"‚ÿc€Ëñ>@yòË•õyU `í±äììäº$¥À%‡Q¢ŸË’ÿÓ˺Í?¢x«phîÅ•oM§äZu晕NٜΫ¾Ð°Ã(þô †7`i­q$­©Hâ¶PtŸêlü*@~÷Îîi)0ô·&y/ -èkØÔ‡u@þë‡u:Íùpt¹*}}—Sæ°í]N޳ê\l‹0ÒØÌþ©IýJ¸¹$|4d·^~PHëa_¯ÊjüûȪú?8Þƒ- Á§lÞ[‚É}bô(’Ã̼þ·!¡ç¿îÊ’@°Èþ#-™»BÐ{'/1]€p½ú?O a©¯5er‚àpûò¾ÿ¦£‚endstream endobj 662 0 obj 3588 endobj 660 0 obj << /Type /Page /Contents 661 0 R /Resources 659 0 R /MediaBox [0 0 595.273 841.887] /Parent 653 0 R /Annots [ 663 0 R 664 0 R 665 0 R 666 0 R 667 0 R ] >> endobj 663 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [72 657.837 85.939 667.534] /Subtype /Link /A << /S /GoTo /D (subsection.2.3) >> >> endobj 664 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [193.787 522.345 207.727 532.042] /Subtype /Link /A << /S /GoTo /D (subsection.2.3) >> >> endobj 665 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [173.725 360.142 187.665 369.839] /Subtype /Link /A << /S /GoTo /D (subsection.5.4) >> >> endobj 666 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [256.922 319.495 284.801 329.192] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.13.4) >> >> endobj 667 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [243.333 267.419 271.211 274.995] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.16.2) >> >> endobj 658 0 obj << /D [660 0 R /XYZ 72 786.278 null] >> endobj 113 0 obj << /D [660 0 R /XYZ 72 705.928 null] >> endobj 117 0 obj << /D [660 0 R /XYZ 72 252.154 null] >> endobj 654 0 obj << /D [660 0 R /XYZ 72 170.759 null] >> endobj 655 0 obj << /D [660 0 R /XYZ 72 134.694 null] >> endobj 656 0 obj << /D [660 0 R /XYZ 72 98.327 null] >> endobj 659 0 obj << /Font << /F15 393 0 R /F37 380 0 R /F38 495 0 R /F27 394 0 R /F33 497 0 R /F26 391 0 R >> /ProcSet [ /PDF /Text ] >> endobj 674 0 obj << /Length 675 0 R /Filter /FlateDecode >> stream xÚÕZÝã¶ÏKÿ…E_¢ΊHQ¢Ô·»\6ØærW$›¾´EÀµe[8YrEùö6}狲lëv›ôR X`Å!E œùÍÐê*?ueõ•-òXÛâj¹ûB]ñßû«PúÚXÒdiœ¬=#¸’‹4‹‹<{N^¥qš¦<ï«»/¾ºQÙ•Jâ2)¯îÖ$s·úGdâëÝýõ‹oîÆqElŠìùåd±ÉÌs³¿¼^À¢e×þ3QfsèÝPw-6ê[šŠjÏO_¹~y­óh[­¤G¤‡­ˆ®»¦é®u=Ô톛º~Uõ9ÿŽäj¡uœ©ü¿PTRªÉ§€Ö.?åOçó£>—žîðëŒÎ¢}ß]/´–•÷_b“ª¿öCÝwíŽËË¢Òð ³ 0z¼Ç~Ôv¬» †•‡-2¾ÄùêFÛÉZ´)c­ó°"õæöÕÏ_¿{{sû- Ÿ,ܸòTd]»â÷ÔëðâC»ze“Gõàq< w£(¯ a\ÒÈ×Y¹æpƒ›®Ëh¨ú}_  N:G$0€Z·«¸£[sû(0;5r–øª:ßÙ4±±6z\)l*¥ïžØN§çsÂTeZ~.Ÿž ©.é"5Y¬ ((g©ù`ü·G™¨íø9n”–´ÁꈞTå²— qðUÿ¥çò¶£-ÑUÝWË¡Ï#¿í ®=7´å•IhËQõn¥Š ¨ÊÞKëÎ £*¡ ,ËóäÛªå¶#Kc –MÔåyÈÓѦ,€¾FïÚæqF‘'nWƒÔ®WM‘=x` ÕG·«gÏ8L |au¬tùyˆrö»e"€´sÄÖŽxÒ&5iARÀ"pì‹BÅŽûF `ebEdd+â}å@‰ îñŽ&6N™(¶°?¤äø\Uƒ«›Pö˾–µšÙ^tΈ4€»øŸHÖ%Í‚CDô·Ð¬à·VeHýŠ8Iõh´ŒN"·FŠj*#¿tmKàÇ¡× €·o€±bMEMínGfŠÃhs…¿'ãæzbÊš<Ô(UŽRn{[ãiò,°u\³õB!Q<P¬î¹Ú/.} ¡ÓKÃdT¬òl¤ÿ?ßÂ;ßÔ÷7BÛl©°Ÿ3ip}Ëå‡zØri޳”`ÂŒŒûÓ›7sŒÅÆydÁ]ÍZ¤ÍHK€Öª^‚µ¡íH­l¼²F­¹¦þELvn„#ì}©ô©1<ÏÙ“œQµÈa1&ÿ<ö$ÿ?Ø“2‹HU‡þkÐcGN˜Ô¥Ñæ¹yU-0)+^Š«ÀÂÄ a· ò@Á+2!`žßvCF¡«á‹šóõ²žl\ϸ€OûZ±ÿ;tS‡à)Žþº6`Ò:!Þ¿T}7à,{‹4ý™Ò*öwO«úƒÌm˜‘S„6_ \ –SátTs!¹L›gb†TS¶‰…ÂkÆ£E´¢È…3rúPäò°R·,KİaÏ…]G[Y”èÒ·QH/ÒÌ~Àµ§gI„‘Ž+¶©\òCX‚!"> uŽ •X'Ž ÙSÒ“ãLpŠû}CÖ¤k Ï™¸Db³ÚÙ &Þ\喇§WãôGª Èl/7ãꟲ†zBÅcAÜG‰Iv­¼.L„o†1EËÄ“oCŸ“eòÝYbÏ8<·ŸYÜOâêÉœ|ð\ïy~s–ÇQwü²9bAï}#¯Gø\øîèçú÷à_`G,„W·;XN€)ŽØ*r?Pó‡zà X2`I&e#nyª…à¿8Ûƒ'!5Ý “wë0Õh|P@r^ Òâ^f®e–@Ã'žyæãä|xÏZ09G&øt+ Ĺ­¸eúvbå¼c`¡ê¶ŒVõú‘}`.éRÄ|òµ,]¾jÖ É<äõ; ®p~ 2;øÂèõÌÊO5˜–)P÷¸¼9#S¨¸,ƼÄã¾Rn½›6ÂX™cÎk.1§ÀTC8sµ(“Xçê×sF3Üšßš•CÞGàa[/£[ÖGœäÉ|½aK52ðD²-‚ܰÆ=N'ž˜kc|[r†Ê‹PßídÂÑ&æ öéÉM6gè°ÍÓCµåÅäìéñ9¿MRõˆ’óà/ÛŒ»Y ¿rì' ‰¡%ùþQW¹™˜¬Ñ!g÷=Ћé²_p.'hNÜûê߇Á¿ æ{ð›Þí)q¡3N‰âX0c\¯‘J‘I*Ç,Þ³Øv\4ô°Qäò’F+ÿ¡F.@­%²¬P8·ø©6'Ÿçx&Ôslù;Æ‹]ÈOý.⎎¸ž€¸Õ¡—+dufø>‰¼×Œ#Œ ™›Ls66™øcåÛmøö‘‹A[à“‰.!=Ž!Hƒ c³\WÆ+_›‘åzX†pñ%5¹Á² àM9~ºxç p^> J‘‡AÀxóîíÝë—w/_½üqŽ*AÏpL|Ã:-ã1-Ñÿz‚#–%'‡ý¾ ƒ\¾@ï1=ŸLî«Ý~`…qJâa iª§°•1ßpK~ÔJ6žr…]#¤fQÆšÿs|7p¶ZÓ‡¼´ûº]’Q?MÅ@uçÂñ°“ô͵"S†E6Ôáø@Ã$Cƒ’?ûO]ïfÌ*›ðŸ<Ÿ0œ#ž‰PE+I9xî=šqËfc÷ 3N,9e˜­ó¸6–§|ÅaÏ=Ë rŒ–Q~Óv}g^Œ³Mŧ Žz´t(€ÊžåN¡e’´eþË?‘èîžòNn©9 KO®°ƒìEV ÑJaa.ö; êp'”½:¦äèUk~®í2„§XåMqm&<ôha€y¡q¬&ü½‡ïr4§Ø˜BVArò*äz.ü¶Fè%1_q4ßëG™ù£[üŽ$-§ç½Ô±-CZ¸kç.¶€Ré‘HÔ¯¯šŠXRN\Þâ“›š7¢•ÕhÆp NòSÇ'€6‰ž¬©;¶°^ÀÍ/Á€xn£(–q5ë†* wËŠaL{‘hY´IÀ¼WȆ.Ì‚Û8 †¯³ä&PRF)=Öèâ“&hçîQ¼?ÌÜÎ1`š¤`µŸÍQk°Ü)YØ'Ú^\°ÃÐú‰DæâC²‡endstream endobj 675 0 obj 3181 endobj 673 0 obj << /Type /Page /Contents 674 0 R /Resources 672 0 R /MediaBox [0 0 595.273 841.887] /Parent 653 0 R /Annots [ 676 0 R 677 0 R 678 0 R ] >> endobj 676 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [430.514 711.621 444.453 722.53] /Subtype /Link /A << /S /GoTo /D (subsection.2.3) >> >> endobj 677 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [112 548.969 134.424 556.255] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.3.3) >> >> endobj 678 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [226.639 352.27 232.093 363.179] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj 671 0 obj << /D [673 0 R /XYZ 72 786.278 null] >> endobj 657 0 obj << /D [673 0 R /XYZ 72 761.372 null] >> endobj 668 0 obj << /D [673 0 R /XYZ 72 580.55 null] >> endobj 669 0 obj << /D [673 0 R /XYZ 72 499.355 null] >> endobj 670 0 obj << /D [673 0 R /XYZ 72 461.169 null] >> endobj 121 0 obj << /D [673 0 R /XYZ 72 285.535 null] >> endobj 672 0 obj << /Font << /F15 393 0 R /F33 497 0 R /F27 394 0 R /F26 391 0 R /F39 496 0 R >> /ProcSet [ /PDF /Text ] >> endobj 682 0 obj << /Length 683 0 R /Filter /FlateDecode >> stream xÚíZY“ÛÆγò'˜'cS"Œ¹p<®¢Ýò:>¶¤}HUœRA$VDL,´¤üúô5ÀW²+±“JŠœ£§gz¦oz  üÔ"Ó‹,Ocå‹Õî™ZðïÇ…/ýÚ˜Ò:;‹µO.­Iã4q‹¥qqž:¤ñðìË[å*‰‹¤X<<íÃú¯ÑæºZc£Ç¶¹ÒE4`ÍDër(ß–}ŵ]y¥³è#Wªûm½ª‡-Õuôöj©óH¸ô{¨eQµªH”­ÖÜúö (dø°¦åù”C £C_7ï®þöðõ³›‡I­cSðj‹ËÂ_Þ¥b•kÞ8ÚÍlDÝ€èN»èA½y] ·m3¼„Mx›ðCâî[mÊŽK|¬·USî°SùE/]œóeZN &òEW-ŸÁÙĹ[±SvaòXi3Ó ãMæ;TçyÆýÓ'±MÍb©âÔe£\ÆÌÈu‹‹;9ü<.´•~ÎËpÂ6ÎÁ¸‘n”ÓØØÄUéÌ:—&6P^¦±‚ñçrz9€OfR8[ PùÓçã÷{F[Äù¸ÎºmJ3ѳ4ö¤ŸmÍê]uÒÝroÉýСòQy…–eÝH››¸ÑˆCûÈ-cYPNµÀ‚€­a[ù¥ÐðZSYLF¦ƃ"³TK…ZTlÕ‡rW7Õ:¾ZZ›€íUD‡f%†µ®ÚoËU…}:‰ÊÆ[tõN­¯GN‹†š_´ êÞ‹û®ú©nýV•Íš µÐÜ߃Ôý¡Ü-J’É€²Z0/+UV@ŒÎ"èxl;9ë#u(@§òÂ;/õ殩‡oê·ÇZ|¤iÖ˜Êع̚è§Ò4-OêW5Жbß´¥X+Is°Z1Ôå¶þGé»Uô¾fFö~8t25ƒŽR¥6.Nβ«úÖô ˆ– þ³„6õ\äÔf"W]×´ÌÀfBÇ+BæãFã |þPÚ¹™ÀñvœéæÕ«7ßß¿ùîû‡7÷7¯¾½{x¸y93¯Ò..À´ÇÆYo¯rµWÄD 9†‡rËëX±‰dj4‹|Ú7“ÀÙ9{´oSœÒ6 ¬ kxvøß$=«ýŽŒYl›ä,µMÏÎR['*€„“ `û‰Ç¶o¹4n¯¶ù¨ÇONÏXÅ‹ ’òIR~ä nÒs(æ¹levä_²,Ú¡|‡^˜L!*Õn?ÐÊÿ‘+ÓÁÉdéÄn[ìeº^æóÛÝó<ÓŽñ=XôÈ­©Þ‡B:’1X±Ò“GT**;i 7Õ»]µ®Ë¡b‡ƒf×WÝ@3b7{­vÆÍ~ t&‹î„™(™2âötÔVà IH•Oã‰ë6Sö°ãw~h%Òýtåà´êmùv+À&Ü2?µü³g@çœ \úvź*cDͰe„M£Rž%[‡.FctÿupÒõz=“F¢]»FÍýØ)ŸFN ìÚSÈ)wês“Ž•qÿÙÈÉþ|ä4 ñï(äg`h:tÔÊ. ;J¡œ 4õ®òÍsáI9PåBL3¹ ašö0M Êd¥a'új n)zòþ_³Ñ§hj„“LtÇÆ»ÔIJÀ:4ºÑcëñ&CȃŽýöstæâl°w_v0zÍ™M)Às¯)h3q,Zhèt‚Up¥ªaº¹ RP`§&Pp}óÝË7÷×_Í©-\ž¿švvÁÈOOüî_Ý<ŃØëqhfLh97Ø+AËVð¦U¾KÉ‘Mp¤V…Aúúz·§=¤1ð/[Be¸CrømÖ¤Ã8‘t`=ë£x.¢úPVà[ç‰sßֽ܅ié_g‡÷|«}a}v6”ÈI$Çÿ#<ã\´mK–Í1ç5ÈÍæIs˜)N JÆPgjÖ”V!gò¤;Gœ4Tv]ä#¶q¶ÁæÛ袠ø~S¯xÃMìÇCä¢<T(dÆ|Aºk¸]j‘{ –¨i .=m÷|Fm8N³<ð„ç äÂÍP)€ ‰wÀ~“Ï£ùÒª¼¹::ïßÍ¢P|a§ØÀ¡É©Ï‡y%7ì˺ Ïtí½‹¡X7Ó•8$v3÷9÷`ùæöeàËòùlGÑþùE„imì~›L ðoÉÆ™Odãìçfãòÿ^L©‹X£’'…ûMn¿ø|ÍÿÏ÷_zg'…îƒ`ày¬7/‘=:TÀaX³F\9¶öý¨ô‘}MùI!LFîJNµÖ«^úzÃlLq<{ýr¸ŽuÕ¯ºZBËzîvÎA®Å x¹u²¨îy˜uwxØ%gK¡2ÍjÜÑ ðÅðdé¦YœäÅÆ_†hÎ~ðj*4LšJ2¬.îÓ0çj[•; Á|c_›Å:=¾{Òq6‚=ñŠÛä°ŠðakÁa pØiZ.æ´4?„„ü%c‹`/7í1\>kR„Îl:3Ƈ4)ÂHú{•}[®å¤µœë†>¹äŸqÃAò+Ò4-÷lÛæeW¡ü®f­i˜¤~äæ’ÿd#Ó<”) 5©6~Á²AžÙùÆžÞÚ6_ãuÝà}ÐrÇwwpnõþ°õ©e¸lÐ$@Æ^ K“Ë"NCàÞ ƒÉ5a-X°@å¦kaÌ·¦¶ïkFìÚNÜÆ¼E »œF›}9lúØ¿QœÝDÑ|^UKTù—N(ïaÆxœ*¬2ÿŒ[)yh»&6ô®3=ãåuî±×#L•É=ˆ èâ5в¹fÒ˜ÃÇýL¥½JŠXÁ”—A Féì P’ÇYú9˜Äĉµÿ˜$|\j“†Ztþd¦²_þJˆV7_²˜§«F70ˆ¯Ál<ÝqÞÐHê ÍyXÎéa¹ç–1™oî”QR:ºF¯a< ½á°™KvgOªÚ)~ÜÃÏŸå^o«döؘp€:¬ȳ@k#sŒŽúÆ—¥UÕÔ‚TÊß—àÀ‚\+sy¦‚Xpì0ö̤VˆÐ3+o%¿×j¸ýè®ëêuÅt²ÿzFfäB òYXÝ”k.È1Ò†ÀX~ØÙÖÒ>€c}}à|µ6É4Ÿ¬„‚…ÿ´‰)›¼''ÏúùªfE©œoëɲI|n›ttåõâä†ûD8,ö›ö°Eô‘8z’ÏùIzh±0=C¥«vÁ2ppòU¬å©„¡É\¬µOŸxg8ŸøW©˜–%h¶—o4ø“âü;ħAQ2y °$*vÛÔÑ€qE'Cüayú &’fº†àœGú›“¦š7‡'¸¼9'=@ü˜pYøáЦ{†÷ PùþÕüžlARNÝÕÍøX­å]ò4—7x“Ú ™{ýâR&ÿÄñssqZdAzíöÛ‹¬€4õâÌ?é$Ö6xf¸ùîO¹™é‹Í v~ç‡#®øyߟ äðub²ð£#oÅV¾€Pþ±šZ<⺷&%à ^ö£å()þ ¬T¹–á»2ìŸ.ƒÊ_$¡L¾%Ÿ³f\5ÊøÓÀ“qà±ÑÜ'wÇVœÈscÚ¯”Ê¡Î}S£âÄkÀr6QŠ¡£—»à=[ÒZÌ–“£ž{drÓLÉÌD žü±Ÿ CWã-*ýÔ'€µcƒ¸äi@¡óÓ)ÀGƒKs—?²ü'À¼x^endstream endobj 683 0 obj 3112 endobj 681 0 obj << /Type /Page /Contents 682 0 R /Resources 680 0 R /MediaBox [0 0 595.273 841.887] /Parent 653 0 R >> endobj 679 0 obj << /D [681 0 R /XYZ 72 786.278 null] >> endobj 680 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 688 0 obj << /Length 689 0 R /Filter /FlateDecode >> stream xÚÝZÝÛ¸Oú/ø­róÄ/‰º·¤Ùí¥Eï—úÐ+Ŧ×ÂÉÒV’ãìýõáú°eïM‹^ ¦ÈáÎÇo†Ë1üã‹T,R“0‘šÅzÿŠ/èßÏ‹Ðú3ô¥Ò’i…_Ï®”LXëÅJjfôoï_}sËõ‚Ç,‹³ÅýÖÑÞoþÝ|élµ)ª‡åJJu;‹ ýsUº¶ŒZ›7ë¥H£ÝcÞíZìѧåJ˜ÈnëÆ.ÿ~ÿ§one6bÏ 4¡‡É« ÑL¶  %x Ùv¶¡åŠªèŠ¼,~É»¢®h_EKÛz„UÓ¨nÛâSéwzhq÷ÀþÕÍý !˜Ìè7QÙe™]–#çŒAòvòéŒüŠª[®´ÐÑ=ÿøf³¹¯o‹Ò~@íî@X?Å:¦ñžeØ==Ú×'ýûzúÖ»¼¡ÖÊ÷ñpÈ•f)lf•1¯°Q8°Y4v±}*ÀŒ^ÆLâœ^–êÌð„“Òø I1S‰Eb±’½¤œ‘Ãí̸_åÇQá ',@Ðæõtý9¥bRÂ9á¸<™Ù'ìKB{•0óÏÏÎ|R™€.7×íá~‡ª¦ã$Ú»%¨xGŸŸœæYüHAçìöPb[G]Meí,bw–:¶ ¼Ã|2(Ï»ÛåÍ>¢]ÙÆO©·ô[yžpÈ"° Ûv´rÞ~JWìO&ö³BIÂÁVU$sD›bt …–1I¸­ u3—ªc–h´Σ”¢Ý(%ƒ}tr´hìE¹ß@Övs9Ô‰gRJDí®>”êíÅìóÍÆnˆæœ9§Ä;'¶\¥©Œ~¨Ê§·´B·ÄÓ‰@êjƒÎˆ^MW¬%Z¥Ò©¶Àÿ•vo+¼C<ƒÎ¢}ŽO4ê}$´ôµ.PÜy $åHq®c—%Âý•$£g;óÆOÉc×c˜Äx%xé+wRíN±±p!û¢r”\Áî@·ž¨Mâ„îoî\E¸‚ÀÒ;õàÇf„§ ð€¡&1Iôæ!/*ðo J±/H˜¸tM¿Û®›Â‹Ìo1'5¨Q›>ãÖqÐQF›ÿáÇß… ëzOJ¿â™`pW“«þTT>¦€[C{9?£6às‚zƒO¿»}óöãÝ›ûïfŽ™燉öõ 3ð7q2ðzsû—+¬âTž†Ë 3ŒdZ Ün¾ÿÃUnjl£‰ùi[YlP»džÎ¹•$^“€¦C;—TSÇ;H¥=¸.Ò¯L² ÐÅX¾Ö  sÌQÊhÂ_ж#c‡Þ©"SßqW¬qÿI›’ƒÞ^kÑævvNPn^`auξS¦GîÎ+=z¡¢÷ñßãNmG¬UÀâsF²’ÐŽã©`ðòïîn¾wéÆŒb"Üm=k{’¥‰éå7Wùih™^5W2ÇrÆÏuQ aU*<ìƒÎʱÁ½‹“IÖ»¸]Ò Áâo>$×÷7…ãtƒ¸‘%<6vB¯xêA|‘!Õ±!ˆâWhAD êÑäÀãéÜM–DŠjíÙ8MäÉÀ.=g7Õµuð0âÌ~«ÚOª‘­ØÌØcSt¸ÌJƵÕDOs~¬9MG¾a;ir½\¦àÜÄè~c‘ƒ.¸êöP­=v†/ I¸ ø£K‹¥‹5î¶€ C äÕˆšÀÅhžƒû®£n<ýÖ t¹1@°l")˜wÀ1\&“qhBƒ“BŒ1—„˜—mM½íáîQ†CG8ÒyòlóDD¤ÚÐXš¦W&$êSü…D7 Ïeaö&ïòO9XИRq Î1DÊŽ—×Îo‰‚¶>±ŒWù\@<<Ëj4Ü:’§œ%æ?˜ÕŒÐÍ?ÚîÙ¬‘À¥%û÷r”ä¥)ŠúßNQÔWJQ¶dz†´œRwÈ &* £+9€/Ƀ¯³«POHâïxæ ,\©ôè²%îÇy3BèÃÆhË…§mlwh—2-4hT³¸ù’¯;ððÐ{°,ÀJf!\³Uö/@¸ä „Ó ´ûeN°,Ëža¥^†ßÀÎ3q È…Ûwo_Ä,¤X(Å> $OÁ–¿ ‰§J§(úý'B‚ìbH1ò`Œ]ð7“†ÐŠdxÉØsºÂkü4¤ŽH‡½ :r$Þç]À*øy,*ÏÅycZÉiL¼²æ XèkòR¿Ã¹O´sA¼(!½z0…†€éì˺­ý¼ô‰ `'´68­n6ó9æÙqö• p;F|-íL|©vöVQ9¥0/ÓÎñ¾Éî;ˆès[„;LŸhã3ìÁ§Y_«ÛXžA¯£)C‘ZŸY$ä÷…!W ¤eACš°‡NÆ`¾F``¥9'EÀ#0õj|_kÑóº„?ûú%D Úí¤\³óEØ)|ïF¥ ë&@‘d50¨N@K3HËç «9)x±1CCZß®¥.‡¥Œ¯´`Ç;È1ã"1Ó™:­)Oðü 3ų^f4F0;‹ÈIô^ìrEÂñ„Lñƒ©¦Ê±cr6!0ÑûÊO‡ã°ž’lþ:Íß6›ÛºêPoa××À9‡ nF ¢µîõL9Y¼¦:váï•JÝ2Ú8¿†­ÏEN ÿƒ°æP2> qeÚü× ß(›Žð#\z·ôx©ˆÂ¸3@^ò @L™LåK"@fþß±gïf,ó™#¥‚A\•‡œ*Gs^ÂÅ^ç ¤<} r+Ð#‘+é2*ØÞfÛº,]>sôOL Ä.5 «æFýëN™¯í·§*»W”î3/_ V™È‘âÎ^òoOù“Å<û®†djÄüÂó?Ê(>À™Ç¯iAà^w‘FÈÅ<¸}ÏJMaþ4 ÌÔ0(;¾Œ¥€Ú…—iò+)âM•y¤¨²¬—&vîò–:=Nà~Ž^cij;‹S ?cÌáÀqg]qoºê(ze“èDëšÊJ¹Ã©Øc«úð°›A–{ ¸ù‰êà.Áï®vŒÐ8pûp—!Xå%~µ,P*A"A£«_Ó‹íÒ\¿Ë^ïÈH•×=7À‚;-.UùÆÀ#”ÎwO€º{?JY’¬ZÙãÇ÷ïf\zÃDŽêV°Ü¸.9²nð!cý¶ÞBro\„Õ±5·€0o[¯…[Ðy,º]˜íÔTö[àöG¶—íHe,áêWbG’»ÅAQhºR?ZðÑ;·õÃAWq”ªœlæñDEñ;ˆÑ•v†‰c&NäÀ£±y9¶P¿±š¨rú|ªP[œja[üb]¤Ñþ½Öá'·¼ƒUuIèÊø2"´âÛ®;õ²Ê—½Ñþ`MÃn 8æ˜2ØR~^bæPæ°ò?¼{]¶t”ò„ÝŸ”@dš°Ød}äëónƒÏ1ð“ÿ‡<”¾±'í͸$Ø ÕüòÇÈf(c÷6¼°a³¥ ”éþk5‹x`}že ù½£ü >Ûk_“0¾ÊŽ!í6Þ™§¤*s[Ĭ‘ñ˜O”d%ævªYŸ|_zg‘ý»ÐJ^bÑÿÙJã½Ä dçD¶¤69]no¨a#Å÷Þ"ôÄJD~";—Ð!ðÕJŸ¥uʧuû}îV3’ÒUÈÝ\ív ÌwÔ‡mB0úÄ€²Ïƒ®dvþUEh**²X™£æ.ð¡È–j#ãú~û2 ŽÌ!b•w'Ë´ö3ý©D^úŽ.pJ¹uÿÄᦆ§(ÌAe½·®yîI po{Ø%ü_cx@»ËC\iHÁéPׇtg¿‡ÒúxR¹üîøíňÁÅD,ŸsêBp&1g¸îÖEvºo…¸6þ A‚ˆÔendstream endobj 689 0 obj 2977 endobj 687 0 obj << /Type /Page /Contents 688 0 R /Resources 686 0 R /MediaBox [0 0 595.273 841.887] /Parent 653 0 R >> endobj 685 0 obj << /D [687 0 R /XYZ 72 786.278 null] >> endobj 125 0 obj << /D [687 0 R /XYZ 72 408.62 null] >> endobj 129 0 obj << /D [687 0 R /XYZ 72 148.374 null] >> endobj 686 0 obj << /Font << /F15 393 0 R /F39 496 0 R /F27 394 0 R /F33 497 0 R /F26 391 0 R >> /ProcSet [ /PDF /Text ] >> endobj 697 0 obj << /Length 698 0 R /Filter /FlateDecode >> stream xÚÕZKoÜȾû’¿ ä4xh6›d7kxÝIVNÙ h [ÆRKr,k}êÕ|h8’µØ] lö»««ëñUõ¨«þÔ•I®ŒÍ£ÄØ«ýñºâ¿ÏW¡ôWhã‘i¦£,ÅÚ waäNg‘ͳ—Æ+i­yÝ÷×oÞ}TÙ•Š£".®®oiÌuù¯Š¶ÿ¾þË›ï¯Çy6Jmö29Y”félõ$_Yý½¿m;¿Ýi›n~lª¡ruõ‹ª¶Á]ÏHÚ)Ùä|ï+68ÔÂÆП`aÔ—m–N H§›ëCÕó°ðýIét͘*Ù°u´B[™Ñ„ü™—âk„]Ed`ñX¥µã Ö6Ž—Æ³÷®Û£ŽÎ¤¤—‹mʲlÅ… d½ûØ6Ã7¸÷®÷+4ZYˆ!  …[bð*"I%¬së\Öo°*׿~ëßU¿?œ:ÑcýëÕ6É‚êaÉ×þŠw5`C¶A½ã®Û®=r‰X‹û¶Á»¿;u¼+4&Ah@‹›°øv]EæÛ]#Û¡±¥3ð^K£N^;‚°_´ð±ÙÜœð†c‹&¾÷ݤ3qAÛa×´ÖV·Ãá ‹ ÅÈâÓ~dà¸ÕÝ‹¡kJYø×rË!¬Z»að]4?„Xb§Íлá–X”-¹HÚ“ÓeÙñ² •¿§Í–pSüÖôè0ÐÒ¹\ŠŒû[Ë–ýÞ‰3 é’Ig°t†k¼Ú³ Ú£Héïë(oáffîo®IdáX¸,ùÄGÏü懑IØÌv7¥ñjãGwKÌ«}ù¢‚~‡â5 ÄkÁåà@›wpRjÑÞ×k¦ÓFÆä¯AÇ&*²àÖÍq’D™Î^çѦ5g b&8B…xÏõ€gl»Ï|6×sëÉ-Brj;5;v/IŠî·X°ªÄ»cÉÌbÅ2¹KaößÛ¡Ú‹ 7°þ07qüýaêS~>òîÏ~`ƒÛï}ßW7¬5ÁÏ;W¸¤¦t])‹†yw®ú"aà—zv`})\Ê6?ŠÃj›z‰{ ´à`#[Ð…õ€rª jÜ3:¸ÉsË(åÊÒ ô*ƒoAð¼ð-ŒÂg”»¿µw½(9ÇWÐöq[`´µÈ(ÖkÐï‚„Ža&]2i¹&6AO6á%mÿGƒrª•¹dZT,±5è-_#T)–‚/o…`Ÿ1€RÙÔpƒ ƒbøµðmÈI?påˆRx"F@íf„ï@Ùܯ–ÜD”°%gxîŸ÷µ(þÿÁÃ!ßrˆ¿ŽÅ­ŠR•½2²¶îètT•$Ùˆ|v‚„#i":ÉT©Ûæ]3Й;^Aõ¹tú8£m24N‹ Û&‘5Ù‚mg¯¬ªëÁ²ÊEƒŸ?uQ®"Ăɥ(³X'ÑÀë\^hëÀ^žjG‘8LftÔ’…yä13¥ì,™¶`”¯*IB…ˆžÙ½Ììq³”¤¹‘" >fM8þ+ÎpäÀËή*|\ÿ±w'rɼŒ;Vwq¯¸8šÅbf‹0™7)_…#îÿ\Ø1»Bhuûø$!î9Öu-±74wþç“$CtÀÏ}$Ol+ú`• 4êbÉ a ö=ØÌì(),°ó8êÉUÊDYd÷ÜubŠàcqIØÄÀ7Gà+¤°ƒ#ˆx_áy¼t±”wô#ýËɳ°6©¡ÂÌP9Y,U…˜˜«Ñ’<åV [˰äê¾åÁÕñèËÊI~€YçIHT©……ê2ŒçÂV²ÚœãR¢x?М»ÐX–šWŸ£€y„ ôC/‘ø×ûB ›Š{„ÙÛR™Ú¼¼ÇB$¸n[•*Ä…ÄÅ j@Xç›èdJ¤(Ú'RmÌÌðs\«ß=®%U–€µ•Ob%&ùŸ±`½·kòšDJ«sú–æ/‰Œ ’9¸Ïcg e³aB¢ t«h÷Åd™t „°ø©íʱô×ÿmÆ””ÑO®}ïBŠÆ¤ì§YzŠŠ³š4²©Ymˆ—AC…"ÌܰóÁS¤qϱ¬üˆ“xg’1,òáÒ‚ VŽj ôÛ…ÄLü9ÌÁ_nE ÖÓp _=þËßoÆwà_­ý(0nzòaƒÍµž]bÂâů5•¼©Œ'#lÅ­EX(<Œp#.»f vr’…w}Æ&,•6–/ B—YlmÆ· #™cŸøSž‹ÖX ½¶@[sç‡`_ÌÈГ ®Ùµ·áÊ+™V¢ÓÌÏî.%EÏx ëXdÎ+‰ôà~NǰDd€+3fpàx)¨K2Å/uy¤óyPÞyØõ§§»`°ö+bºÕˆ±çÂêˆé©y ΤJîºK@Zû¡íe´kàò0Œí´ì~›<æpü¥Dº ïÆHÊ»—2éxŸyÎÈ›ˆ£‹KcŠ—x×pœJŽâš•àAÅEÛ°¬»éÛú4øÕ§= ñK–]x[sooYPŽÞ5³77<Á´ÄnÉës¼PÍóí£D.祛Ž}sxá Xx\WŒí#ÄÙÇ·,¥üܲ*¥:â<ýÒ[ôÆ–®¿AZ±ÌÒŠ¥ RfÓ¨ÐãsÍ»Uì.Dȃ .†²ýÌ¢ Ã4DÝÑúªÜQ²\ÝÐC@+ÅxžJÎ2Z ”2Žº/¾C©4…ð&ýVõ™oUÌcçªM¬U›#©"¢\-ÓdƒEÝ%s˜Ùló'a yÏÙV= ¡Å­é$þ $¦ ÛB÷5hÔ—5½Ô6ÊL¸Ñà’ŠU}dz*ùÎ1—½h–”Fû ^óÀC8z뻞È)­k¨SR =³Ã‚ÀBÙ%X ‰]á´™ßLxx€Ð—BaºÏŒRù ¢žÐ¯+˜t,ST©å&¡_XŒ”¯…(‘SPÃü¨Löåcb•€]>©šCÜOUÃiètJC0Í/f–m_è\·ñ†¬I,µÍˆ¸)í¢7 ¬A$o8‚ [á[#X#É„d+ÝQRH®fr(ŒÂB7$=~/¦sÏœŸ’ë׋¶Ió'?¢Ùó èÊ3þaGvfí18㞎•'(´„_•¤—Ô—•P?ßœšêç“ÄùàŽJ9$‡ï=á„/-=Fçé¼ ·Ö<ã®.§nU[>qxt•ámH"î‡CËOIÙ©ÙñðÄêr|““øøüpž¡€ÑûöTK‘³jv‰–S3.²¹OcC“ÌÌÉ%@žØ(×ó(¤0Ó3礉?”B4¿ü¹½1/{öƬµš]E²…zªùjzR¢!ò0?p# ©úãå‡ 4£ø›Ž@’¨HSzâùÄO7BeI’g ÆÿC$Nendstream endobj 698 0 obj 3164 endobj 696 0 obj << /Type /Page /Contents 697 0 R /Resources 695 0 R /MediaBox [0 0 595.273 841.887] /Parent 653 0 R >> endobj 694 0 obj << /D [696 0 R /XYZ 72 786.278 null] >> endobj 684 0 obj << /D [696 0 R /XYZ 72 761.372 null] >> endobj 690 0 obj << /D [696 0 R /XYZ 72 689.612 null] >> endobj 691 0 obj << /D [696 0 R /XYZ 72 626.449 null] >> endobj 692 0 obj << /D [696 0 R /XYZ 72 562.68 null] >> endobj 693 0 obj << /D [696 0 R /XYZ 72 500.123 null] >> endobj 133 0 obj << /D [696 0 R /XYZ 72 351.587 null] >> endobj 695 0 obj << /Font << /F15 393 0 R /F26 391 0 R /F27 394 0 R /F39 496 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 702 0 obj << /Length 703 0 R /Filter /FlateDecode >> stream xÚÝZÝoä¶ïó½ô_XôI.nñKúàô>àĽwòÐZ«õ²·+m$í9î_ßÎP¶l_ ´E I†äpf~3ëþÄ*“«,Oc™å«òðB¬èïÓ*´¾ƒ1¢ÔFÅFcïµViœ&fµV&ÎSƒôß\½øê0+‘ÄER¬®¶žöjó×è§íÏÖJ'Qiklˆèúl-³¨¢Î¦©+z¿mZjô;~wu&óèî8%ôØ6õ™,¢žz?'B龜:ŽŸvß5ÄäQÓuîz_…ïy®ó7¡óx‰=Ýî\y³îè¥myuUmªÍÙß®¾]­E*…'Ê­ð›mp‡JE–4qÕ®'ËU:º¶ëâ³µÖ:ºò{…Áí©.{tÀûÅë«QÚRƪ€']Oœâã&D,rIëJf åjXž‘&º?TýùöðÆí«wöPýœ˜„^ 4ošº¿xõ’:åζÔú£Ý>Öô‰;Y›8ƒ×9¬¿`5ƒÕÀ®òU[­¶/@¡âܬŠ8q* “jáõ:Ãÿ4¢ÏóŒ^j™Ä:U °X(=ìU©…½¾ÁµÝSØ<.¤æ÷¸ã°…{,@˜¾è†m*+Û„ÝŠtak+h¯ááû‡Û û>ª• ‘?m\v¿oÐFn;Ô&°œ†ž]ÕcC)áHÙŽûª¯høh{Ðl­À*¶üe ô¡UÁAƒl±û¦¾qõ ½s _ŽJŽ=·©j\ZïØŒÿèÚ[4‰u¦…D%tÎÇ«×Â!¡áŒ‰ê%Ù¡6 ‰˜"ÎóùÌ[_ë6~Ñ* ®%/Ak­ÚÚîi¤«l;Ø<ôõlíºX«1X«÷.ðv0WÏ6Œ¢LðyM†ON ÷m»…)à \ïìÞýÃ2ŸÄsêýž’ÙfXúà³cjxÐDþP ™Ž‹âyyæ±Bc$Ð×}cÁÉá–AA.zl«þÔÖžBG =Ü–ÞÁiড3£ÖÝì¼Ð[[o J&E,U°¨ß-Z¦ÎÃ{AœA{ëºÊ¯²ˆ.jšbÌÞö(i¯ J‰8aGm<—ÒvÕ‚ÌÀÕê´à™À ‚îÔÍ‚tç*HíÖáîe–2âÈ,;Þ±aǶ9¶ÎöÕþî,O#ÄðšïšÞ•LÜ#\>\xNÀpóìqf±Ê2¦: úžº~¾¸tTNœïó™Áwnƒ]›AÇ€TmÕ1|•=‹1É⨙jz…¤s}G0v:âWiäµú{wp=‚ª’@ÄÄLk-AÌŽ¡Y6õƱ=(A Ãt¬Ðð O ½íí5¥ïílG €qßBC±õ‚4U ˜šÈ/fQu`oÖº  ›ä‘ƒG‡ðg*€ó–Ýñj8Qz²‹Ç°ÞÄ4tçpØêßõÀ-ûe`¿é<ä“n„zÒU¦¿ÓEœšì¿‹éÙÓ)ôÌ= ÉdñJ2ÄÀø/§ª½£&é• Á¬Ø}„(ï™Ñ#ÀFLPí]< .~$åØy€Kž±áÅ„™ç&d¸ødÖ;»Y¶ê×ãÞ•®ßãF„n³Bë&ÐBàhÓ.ùG ª–§,Âw?^^.hƒLìBð0A‡ìŒŒ3#~7Ü›;,t D€Oڃ΅=@3•Ùx¥¬T·¨ÞcðèÆ{t<]•!4îJël ƒý.8©’½¨¡õ?\\ 9ä(<¸0=— ðS>ðƒˆìB‹<ÎæÔ·X…¦M’” G:ûéŒaz¨Ó²PCd[{¯/ ƒB¨º]sÚoˆò"R„ð`ë[·ÜÒ„"8ÄÇWÕarÇl,½iN}èwÍþÔWf…÷xl+K…¥$ ÄñÝ\ÙËΈ½«øÈô" 4¼. $CiU—qô sŒy20CØUÕ} RyN6`4äkÞçâ0¾ü´ ­ïžð_à+ïóYªx¼²ð83tÆl à‡ÁO¨º[ÐæBÇ)‚/~’JžYŸ­…”UÓGùä#“ÇIˆˆ{±w× ŒU‚I4ëËæ†³ ‡ŠŽ k˜’B{ú®öaDvœzt¤j0ÄrÍÕÛ%ãOC¤y¸º¹í ðK!"é(ÖÊÀ#bô…³Xz´'r×îà—“ADÏñ'õHèÐt¼Y@äxðŠ!FAËr Šè¶pˆ¼ ßÑ@ß°ÒƒSÊQ­ÿäEPyµ†µ´Ö£Ú'ìRÚ‰Ã>ôâ‹,2fßÖ ¯4”F]†ÐAxì2!SB›êútC›ÕïìMå)„`É4qšIˆY·ü¦ë7@ô<`ñšÈ3ž{—ªÀUit®÷£5ÈœÀÅü+¦¢~«© fk1óù<Ã6NGn!'Iß×ÖJ·½£‘Û]…ÀH†?ª›žÞç?jXz úEdÀ¤¦˜û¢Ðbp!c3¤ò€(_ºëy˜6ÛVš{ÏD_Ä'ÿ&»Zžð=-§Ëïß¾¹¸|½fÈ<š”óæPGrÈ5즣¦:r¸&óâ‘©xp4äÁ÷R<ð_2äÝ÷_WŠQþÄ @®ÖU¼D:s¿ŒŠÖÕl9€0]B>3ƒ&ΘFÿ€¤ FuÊ$8ƃ–*¢ˆÄÌö a˜‹>~lSmíi¿˜âfYœ ÷€10\Ø>@‚ŽÆG9&Tff óo*\_‰aK~@SU ³\WÆ»åG˜²ÏÒr”…u,™æKõ‚ÝPTº©8(èÇ”1$°}( ³Ýâ 9ò§Ý£'ôíšÛbu-²ô9pÑ@hƒ^·¾9¹n‡še´ˆ4>`½Ó¢|Gc¨ øœß §$’LF¯mÈmc?¯ïãŽ9ÚΗ+Ѝt„?~Ñ&IâDf³Ýÿ,”mÙWäí÷øú»N‹XB¶ Ÿ«8—ñŒ‡S©ñɬó÷÷§¡þYÿm8LÌõ’ÿ~èDøÕ%î-…½‰¯NO€02¬Ì N'’®.°Q6uçî|)6‘üêD`@mÛÛ¡„;£ / ‘Bb Ê?k"±5[¹Ÿ‹ëk l^Öô¬\½Åmm8ý|ý«Å0äkª¿:µä>åB‰TÊrb4h(Ö”$£ q³ ‘04è† <ð&¦$XKZHQ»¾=•º…ðºYÊÜR5©)nñ¶CúT4Ûù*dG#>SQ2¤ÂJÐ…­œfïøž.l=%‹UðøÍx „ã|D’HðÑÍh6^ÉJÎg‘ô2ùÖr:}ï"Äõ{ì7›TBN¦þÌæÔ롽¨E{IÌ4Pöö¢48¬†žœk*»ñÉ [zÛ$Œ÷W:K£÷£ džkö!ÊÐ\³ÖyŽ57Í%Ì—<iM3OÙ èkÔ[b2©A|€„i"§U°ÞÆK"쎖; OGZ_¡ÖÂV2P—‰‚ÉŸÓ½Òyžöɪ¯ °×ï–” ÝÎépë.-@!?»¶?ù[B%GÔ*üc¥ãÞ¢Úßy[ýðë¯0¿žk¨ ÕË¡G«ÿ@C}摳Qy2‰€a”m8Sÿ› ÈÜ}Ò«ÃXú΃²oU}‰W}6ãÁ•E?´nøiÊkšùv¯ð…š®Àµñ Í:© y€>òé]‚‡b¢ Xl+K­[çGJý€lš®ÿP¶îÈSlÈùÚ– z0BñJ!#æ4½Ü½§«§ Þgn„¾PØVaБ¯ÜpžÒüy˜ÒùQé¨R…=òÿØâãÇo'ÿ6 7è<Üf³\—c†Ÿù˜dÌa´‚³t5§ËÉÈ„o%OÜõ–hº04bp7|Ã;}Ü:K¿ö)l©¡‚E6ræš9©¨¯lRCUÄFŽ• ÈË?¾~ÿþû÷K™yk]Lnœþ$°˜ñré²9‹IE¹þtþþÝÅ»· |!7.5å+ßWçW®.þ¼tEVÄÊäSÎ*”_ð—^"bvg°|ý¢â៦|õú›ß. (•³hªñB* ¢óýàfCMï$Âùù»]NðøJ¹›Ý/ðUûï–.‘«_ïM5s9\|È™¦)LH²š+9UsJÖI2YÙgEÖñ§]Cõ â`ƒò+E¿  [ê°i66~0)¦-‚‹x–Ϲ .@á/”ž®*q‰Œ|`þ E endstream endobj 703 0 obj 3411 endobj 701 0 obj << /Type /Page /Contents 702 0 R /Resources 700 0 R /MediaBox [0 0 595.273 841.887] /Parent 707 0 R /Annots [ 704 0 R 705 0 R ] >> endobj 704 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [452.726 508.991 466.665 519.9] /Subtype /Link /A << /S /GoTo /D (subsection.5.7) >> >> endobj 705 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [123.871 432.842 137.81 442.539] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 699 0 obj << /D [701 0 R /XYZ 72 786.278 null] >> endobj 137 0 obj << /D [701 0 R /XYZ 72 493.877 null] >> endobj 700 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F37 380 0 R /F38 495 0 R /F45 706 0 R >> /ProcSet [ /PDF /Text ] >> endobj 711 0 obj << /Length 712 0 R /Filter /FlateDecode >> stream xÚíisÛÆõ»ÿA¿±éêˆìË™~𥊓©Ôº¦ãˆ%‰X´¬ôÏ÷» HBVš8m>Äš1öxû®}ûŽ]ÊYr–¨Y’ÆB%él±y$gü÷næ[„1†4‘‘ÁÞ€s¥"Ëbhatr?üý8¤2ULëéõ£Ï^ªd&C‘…ÙìzI0×Å߃÷MYœÍ#×òí•í/›Õ¥}o«oÃ(äñ²î¹Q¹qyöë/½¸~4DH癀”…‚Bg鬵³å£¹Ñ"f©¦ñ£'¦ç©Hb7.c‘¦ Oï• ëÙ\‹Ð˜A­'Äy‰¼}öRF£9Ф2nÅò"¡}E°n€ÄÔFhØ”VNñ |ihÏc!aý©˜^À“hØR2ä8àÕËq½¶gsDAa—ù®ê±£ƒ÷gQäÕŽæLPv,ÆÁÆÊ0¡V¼üúÕÛ7Oþôúâõ« Ý$©ˆ@6¾]—‹3•kF¿±yÝ1ý:ïyжmÓr3¯ fëöL%AÞÖe½âíº|ei1Î8~»¾im\Ìæ)Ç4Ðj2¢_Ö§5P³Ü¨šÕ·¡4•´”ž¡GK.–gs•„¼;$ŒM4n.çG×yÇø¤µ5ƒu[üvQ"´-Χtœ¥xg­õ²*o&T«ÁžÒص¥í˜¢m»ÞñÝð·qT¥›.ë#ñ»¶ `ØAek ×»³Ô¬¦¹2‰PR**ËSÙqk™—•oâ–b£k6¨úP­Í»¦ž’]‡"•ÉÃÂg¡9^‡N^ ´ü½#E K,Znì:ÛþÎ-\;ÎN$'¢?.ÑLƒæÜY^¬ÀmÉíäÎò¼uëÁ†±áIƒ¯ ¶-0©A [ðâFè®/`-·ù\hÔÍ‘s×#ñŠSÃŽ†íÒqäŽ4òí¶*y_6ÈjŒ¬4«6ßllË <„ë¦#øh÷Cãæ½Æa2çÏÀ×9žOE tž›]U0¥6M^³ÎÛ¢ºs,ÐDÓuåMå¦Ñ’œ–OÎjÎÎw•ék0Ò·9ùw<\4ع­yò˜µ ´7²ªÀŠ˜A+v €aÐ6´;›·€8÷Dp2¸FÓqĉØ{ü϶ 62pUlHÄMÙå;^>w`lIát¼SYâåËÒ`“£"ïx¸³=’­Á—ñû²mê ¶³À0±¶ÌQàÓ¨ÂâÑÞ¿_<} >þ«¯Ÿ¿˜öï‰wTä“vÇÔÊ øÕy¬Sˆ6$í1m‚æØ˜Š0øÌ“I#qäcr>™“Ñî&˜‡P'ú!ç¡D&Õ”ì”Rt QR—‹ºì/Ë›Ãø~¨ HBOš¥RÁ"¯*<…óX…|è2<nvoqÜ 7µhÜ·÷ ÌG{‚CW±š Ð â–zñà >·7»ÕÃ&9Ú©0Yb9Ë¡+„W=ø‰®‡`>×&Ä‘7.:Ÿ‘Z #©‹)Ž¥Pi²gøyÉâ^5ÀEk)²‚Ý/ú’ÏNP\†Ì’*%=à hÜ ½N™“„49þæ¤M2’¼oFÞˆ•à ç3ȶu±û05騥³-ι‡lsÐÆ^‰Ö ¥O_Ô¡‹†‰±‹¦ðл  ÷»Ú‰‚/Ø’n˜T{þ=i­ó‚yÕ[ŸuMx,$C: Æ~°›/{D‡M<'ƒnJ` ²ÿæ$Æà”T¼·ƒ1€\“ªI3ÆŒB11Lô¬Aô2éÌ‚Ú`+=åŸØ$;ö±˜6qxÊÀ‰ÆÑ8äŽ]Ÿ`òO†øÍ©(î,‚;9yÖ»µÛ7ëŸÕ’ÆÁ}+ȱz:M<}Ü–UÅãû0 ðÀÒj*{p[ËåçíºÜt¶Z:CdBv*fú®gkry 6GÜ”¬Ãæþ<ôæâ jÇgVÜç¼%š[xåí:gaXt Å_$L„û)w’þ¯ áoÀyc)¼¯‚øpë÷Ë]½x[¶îÏOæ6ÝêmÿÁO–ÎnPñKýÑ"Ú|¢"R‡v*ƒ‚â$QžÉýnNy*)Â!ò‘MGTOâÇ%¦îHÐ1‹¸ÀÑ&ó@œð!ØryçSw†ùpÙ= ““€U+[Û< ÷ÆÝÁSyA¦ æfÎ0§¢¶Iäµq(”;õ|ÞcÞ¡a?ôÜäÓÑæ¼H%D¸vþ(ÁlÜ´T¾G‡ÀŽÃiBl#½ø^‡T·LÈ¥-³¹“å¨ê0¡Ù—s&ôüã0ø655&ÔXÁlr<«FAiZTtQ` ]6ƒðìW±Õ­¹RÂéñ3¶aÁ^ Æ“÷ °ßÞûJŠ}Hø¸»WJûí85‰ Yùœó#¶ D4Dæ!H æE㪪ҕb=õn’ÜyeâÄþkgë…í¦ïO°ãó¶ß 1•˜f"'“ ¬è• ÞAe ã¶fZ˶Ùp 5vJ.Ã7õŽ®}9•&‚‡rIWä“Áô¡AùÔ÷èVD$¡×oQo9ˆÆRz ¬Šé©" òèÔ;Ûgˆ²1oXÖ¶p^.Üý€«`cŒÁWøz`!ÛväTâÈ›¹õ+É÷Äšï ¢ã¢@ª’hQ £}·€Üÿ¡i–³«¼]í| Öñ%! ˜SUñ¦’ËHȦ§ô Ugæ³M «÷düÒ›ñPvË®P´ó7MûŽøIɺÈGÙnÑ–îZ°pΈ»£Ë‚ÇȦÞ{¶ý}‘¯``ÜŠ»I(2Ž-iH·šËËåQf5D—:¯ö¨\ÒÆÓœ¸ÜåŠ>—\QrÚº»ªu>YIÇPn‡é*UXhy•ú{ÆÄˆVŽeúC.x¶È¹Öˆ0DºØ‚Uìí‡|³­0š:`®H á3nšsåÈ ð¿m¿ÏFŽD“"NüIú°ªî¶ëO>œŠÎ9jJx‰àèjœ„ñný`7¸v” ÎD(… ÌKfTÕNä$Éèb„oí¯®Ÿ\_\]_Ly€4í™@ÄiðdÓP(†fçËE2‰w«ì¯¡òÖ!¥á2çöНËq­Û¨!_À«sžr•‚â{B8ÁÅV¯@ éáÅ1~ˆ%oxÕ:ß/žpÙ¥ÐõÁ² :#ÄÃwÇ3]o7Üâ`€èúÖ¥YÊ¥e0ÖBÅEçAù« %Ã}+µùÕo¸=~Á.½vtŒ+ÕÓÀ}òá¯íùŽë½zÁ·ÒÝJÞWôÄZdqöCŠư¯yL CY’Žóc<>Wtt r(ê~…†/w7¤Á¯ dúX%5õt>8ñ+õDÕÿ'L€£e^•ß9¯‹cøÚ~!Óiù?²³[@–²ÜU˜âÀ²¬Ën}È ù¡ šû¼lòâeS÷Gþå+ÆB/2Ø@n…1TZ1ž›»QâøðùŒÂÇk{‹\\•ßÙn£fÎ9´øüHÿX ázäDª‹çL$d>u^Óöä݆úòGK韗dòç'™úÉ÷ìͧŒ ð õÑ¡yÝðâ›*_¼cØmùÁâûK°« vÂHº²qî1@íà`)zðªáàóšÖö;÷ÈMTÿ|y9íÄ>¡´WTÐýõHàSMð8sh°Èà| µ<ˆùëOcqÑ=œ>·•í퉵™ÁÈô‘‘iȲqÉᾌL±‘©ŸÎ1üaä/œ#GW‚ ^fXúa¶1WÝ> l‘N¥„"þ'sîG#&xZö›|ÛM$»ˆ!QÆÚyâ~ý ÍPästqEO1Ô–X³í‚†‚ .c{½‡¯Ï+±ñË nˆÌ4“8xâÈt9Þk÷4y*èÇ:j9/ç\ѹ—9S=†Ëé8ÏõTâH5B¬Ü YÍ]âSú_@Ã]ëËÈU1¿*K |EQðO»èy‚ÓzÐ ÛvOÝÉH¡Œ/)^]þí›/.‰…7øšn™š¿ CŠ7m F'£;îÚÛ o¦R‡‘†¢>*$¼Ù¥ß~¤®Ú‡…c©Ñá3™(7S[÷[ý‹õt"ž€9ÇŸ"Ÿ||èï¶¶°K~ #Ù-¦ÊŠóýŸŒæ`bô¦Õ}>±öiôqœÃÛEÞ-lÝ~¬À’áËŸyè·ŒJIwóÑËzÈi((Øq¥¢û-ù7õlaendstream endobj 712 0 obj 3189 endobj 710 0 obj << /Type /Page /Contents 711 0 R /Resources 709 0 R /MediaBox [0 0 595.273 841.887] /Parent 707 0 R >> endobj 708 0 obj << /D [710 0 R /XYZ 72 786.278 null] >> endobj 141 0 obj << /D [710 0 R /XYZ 72 231.36 null] >> endobj 709 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F46 713 0 R /F37 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 717 0 obj << /Length 718 0 R /Filter /FlateDecode >> stream xÚÕZKÜÆÎY>ä/,r 7Ø¡É~‘tCXŽbÁ àb!Ê¡—ì!4CHޤÿžª®j>f¸»¶o¦Ù]¬®®Ç×UÅM¯øK¯2q•å&Y~U^¤Wô÷þ*Œ~€9¢TZÆZáÓ3„%“ØHyµ‘:ÎFúoo_|ýRdWiIqu{ïio«ÿDu3\o´ÐQåúÒ5߯ÿ{ûXÛ¤¸]±¤Ù»û᧺rß:ÛÕÍöIÚ®Þî%ÖKZ[}°Mé~~’!½%¢MšÆJ«éÿˆðà†®.û5fÚº"¢?_¶Íð7[îÜ«æ¾]#>5}½m¿°o›-îŽÇgeøþõÛý}d*D¬Sã×ïê¡Çé¯_¦zf‘Ç©,‚MúëÊ“ÈÂOVDÇëÈ¢¶n®E ®£Ù¡%¢açh8ì‘Æ•l|½ÉsÝ®­‡Únk›ú3žÑO7ø›Gûºqý œ$5Q?Øn¨ñìHñ±v¼?ðõJ`Ñš;¢Ì&rÝ¡íÁ|2‘ž'ˆ¤¤Œ¾³%e‡ é(—L’èXr{šFñ÷ÔŸì~ÿ@;v®w¬‰Šà´¹òn¯îiÆ+ ëjà½Ûó5fÅ ½8*jZ>mè7˜e‹†AŠÃ5Xë´êãÞ3¼‹ŒrP©L“°é„ùÚÎÑàh«ŠN&XÛHùÙumï_O£¾%ÊagY‡ Í¢ÝÄ•(¼íÂAnz$¥ nå¨wäo§¦²ÝÃu®#P¤†W~lä«Çµà£h9YÆ;ÛÓ ié÷`»mÝðä`ßãÞ®¡GÔy3r¶e {ò®·—;€FAÄ<*ËÓ±ö ô2­åP7õÙ@ÞzF HÅ¢ÃéÎv¶ôÁ…SsUOC/™T¬GGËb»*ö»¦&.¤™ƒÅ]žOq—Ê9…rÁ¡ ËŒvßûÈÎüŽyÄ\øxg(žæy¬¥`ÜøñÍë×kØ"üˆh6ç"€š‹$‹^5´é°#lÈ¢Òö1@äŒ10·Ý?wt”²%3YoX¬M€ˆ ³la‡û¶sÛ} ­UP ÷1±'›|Ô˜›0Q¶?ËßT“ %Mõ»ö´¯è½É`ðî‡km@µu…1dð˜íi»óûgÑ-:Àñ.=ЀÃ߬x)FæidºÙÎÏ<BdM´¥£Eºɽsúˆ»ý~9‹(ŒÌúz8Ù¡n›@½s³·Lútï’Tù[J*·¼Ã©qMÙz š\gÅéw™H4ç#œ½?ÝõÈB€ „wè:S­ù¥†İÏÅš•»_qM•Ä“g®ˆ„èÕ!ůí€Ì÷§¦ôZŠÙý’<Ζ÷#W.råâÁ³$–9 >ÊwÁ™ÔRÅÒÈ 6ÞFàPÝC°R=Þn° aa¾T*<†{ Þ¤ ²z žŠAßõp"Z‰6üò`Ñ} ý(×ÎZäIL*ÎRD›3ðÍê[îI¬¦ýðU:úɹ3Ьê¾<õÓ[á— TôsšnF¹§h€i˜¡^|w;æ«0 .&0œ1±ÂlgqíýUý@ì !ƒ5ç 5$eúù¶D.±óß\°i1(.w7:ÖùS›P­N[c=•P}A…œ ŠÆm:G¿о}´ü©ê¯ 9kʵœBÀ‘@_¼é<8&óX¤Ø·–T‰XÊÀæq ¢PrÖJðEWth»çk*ƒ+P/U½sõvç¯FâûÕX¿9KÉ.±D>¢ìò}ïtG¨‡XùEèY'lÍÉegÂÌÀV¤! È"{e.=£žðëŸÙ (±X•_Èó„¯Ò˜O¸)‘<ð°ôsVwø•ñªfáæWµ·ešDŸ6%•×m5–õ™sRp£ˆj@‡*àöѬ"&:_áùŒ‰þÙ0ï’Ë3X§:'{àåz ßw©TÈž(©{ðZ b¬—û‹\âwû’nôóf꪿ìj9ó7š' oô®þÜ’…,Ö›jŽYž$äü„¬èx¾ªPá¾V³¼LqÞ«¨Ÿ¤Ô™·±“‘DsÙÐ`@*‚»swÓ9±×ÁÝ ´ï<0Á‹ìs0E>:zò9-0û#ì+".‘9Eæýrðª?üúTë8ëÙkß“ºô°¾õÎ*AB8‚G9uTuÃX²KÃðgP>ë¿ò Yо·î -†zVk¦÷G‚gÛ÷§•ãõ d6m²¸Œ–-÷GŒ HH÷Þ%:ñ¯ÂáËH«)­Qûè†" €sí¡Î¯ô‹4zåÃ(!ŸUøì 0g÷Þù¨ïÉë{€ù dX mµŽóAhÙ»¨Ð:xwiO=ÞÚ°Oâhqôžègå3MXžwÝln~Uó¿fa_njãiÓœ[L¸Ù>OdSœ}„¢^ä)ÄvOxB_`¢?Õƒ½Ûó2w Ìø¡¡k<€ÃRÙާ¼É.kêlés¼e_úðÏyG!ÀÊŽ\Ü'p$ÈH-õÈ‘©µ ¾ïK­¸Ó ô¾ùÀpÛÕè=ò‰7=÷wuè¼Â;sÍÁˆTýil¹¡¥çj¹TÿÞÙŠ,ôlYžø³¸±(–g]׵ݩl‘Ĥ_¸½ýà&2Ã)l6¦°þqÁÇEf.ÚG™ž[¨k^âöã€Íwâ;ƒ6$`hÃwÈpü{ó(Òž¯fí 1!X}D¸±¬a„“¡m;}ö ·ä„pó¼9r?ª =ÑQrߨš”RÍý‰NÖË6JÿW_‹¨‡o¨@æ²{ü|©ß'*Ö¦:ž> âï–wkèÑ2ëñYˆó«EÇe1*eá¥%ßøùiaÀ)C LuÈK(t\œõMŸ/´rD©çyiª&Ìè×Úý"V¹þµ]xïf…±‰É~]W'{‚ÝFæ"_~ÛüÅ‚¡IŸT¿Hãdìœ<ßJ”±Éç÷úýúš…B!.Z¾"ØD¤ìcx+P¦EøèŒ,>‘¿ËD:ûG¥ãL.ÿÝÂ'«ƒqšäqò< 8»LŸý åÅ· )b!ž@äÿ*-%endstream endobj 718 0 obj 2831 endobj 716 0 obj << /Type /Page /Contents 717 0 R /Resources 715 0 R /MediaBox [0 0 595.273 841.887] /Parent 707 0 R /Annots [ 719 0 R ] >> endobj 719 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [383.211 481.891 388.666 491.588] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 714 0 obj << /D [716 0 R /XYZ 72 786.278 null] >> endobj 715 0 obj << /Font << /F27 394 0 R /F15 393 0 R /F33 497 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 723 0 obj << /Length 724 0 R /Filter /FlateDecode >> stream xÚÕZ_sä¶ ïó½ô+ìÛɯ"Š”(åí’æ7I›iÜ™všN‡–¸^Õú³'iÏç~ú¨•veû’·Œg¼‚$?€›þÄFÇ¥a¬³MѼú{ØøÖwÐG”*‘a¢ðé­’i˜FÉf+“0K¤ÿêöÍïE²Q˜GùævçhoË·{{µ•* l{gÁØ?]ýûöÏ_¼õŒ8¡È48¼ïÚñkSìíM»ëˆzÁ:“a®˜¸ˆ{ÛØPAqì{žª~¢®ã`Kjݙ걪kjúîÎÜ© j3ÚžIöÀÆñÞuÀ/Fz*Lqë`_µ÷¸¶ÍV$q¥(Àü´¬4 zkjÇ;Ƀª9Ô¶áµÙ2¼Ú&± ~èzÛa×Gügûk¨ƒqo{ûv ‘†˜¶MÕò’ïM[Xz÷f$ê¡k\Ÿ:äB'é»GÞ?´î®¶8/11e ¢Â]EËíà¤R»ãxì‘VưµÚšÁ¡£i˜Ë”%3ÅK4¶AáD6¸¢þTJÖèÝá°¢ó8 3‘Í•.'ÅÂÂÆŽ~‡±ëyÚ‘æ—AiãžÖÜí˜Ü¯í®sU(Pþû«L]Ï$ý‘ÇÍpMOÕÈ¿¼S?¢d þ{â>²eD`°Ó¹(²_¾ùæv:Pq¨’l³MT(r§ ;ñÕÃÆ·¾{á„%¡ç,EÊ\¾~–e˜JMdÏO°ó21-‰Ñ~:Ô¦5cÕµ¼Ó8 U–-6z‹ :ÏE`¨FÚ[î»3CUPïîØÈk ÇÇ}EÆMp@å”Ç‚¹œÉvJ´pdˆ&€oïë§Íò ›K’à¿¶Ô±ÁMKT]_ÒÀè4涇óϺ›4ïh²(žEq’  ¸…šÉÈO˜ÞäT ë 7ÖéáßwǺ$V`Íg–ës®Ý­Òa¦søÍC­Òç•ü¼âzÜx¦ùÅôšÿÓ÷ÿüñ[ôSIð‡[ñŸŸìø5ìçç(‰¨³jGj Ë¾ùã5=@sj]i¯ÉGDâ…“ØÕaCõ?Ë `ªÛÞÝþíæ<÷Ø›vQ70µðÒØ&¡ÆÃ BÎñ ¶–Ÿmz»Ù½‡Ä)&BmdŠX®½ŠûAíD"÷ú$î(TÎÁ'aš©IdR®ˆìýZÀ óØ,žßÅ ÐIã&ºi§R…Ž)nÄw¹Ð­ %´·i(`üå>§Ó®B6…È^>ôïЗŹ~‘M7 ç‹OQ:§“{½âÕ…”¡’Þg“…¬G‚-'bîÙaVC?¯’˹4¡£î´[o7àxò%0D“%)F5}]â“‘—¥¨VtN%%BL÷®±¼Ä¶ê"EŠ  Šàð…{ÆpŽãÁ`êbËŒn÷Äç3|¦=$w]íÖ”¡$ò2~ûîíza¾@oJ&Á}õõ‹(ëf­`#\¯|çƒB¥‘§¡O œ;z{èíÀ¨—öwk;‘ #¡ùHøÈ×pqóà )í'2™ÀyOÔ9 Æ…ÁvTÄÂÆ,y¡¶…œmAE‚ó„€.¨-MbiT„&ë–u•M£âÙ(]Íæœ[Âð–:[ÓXâJƒ·žç…ÁÜ#e†¤V\` YßÔР—Z1R-C¡|’„`iÍH!!rf¤qšz[³=œˆ…Êð›?:@:ŒCÑW‡ñí@븫îNƒdo-&>8å}w %‰à«'TÚ9Öã5ÌAóÜh”ýp4õÀ~pT–/EеS¶ö±*ØÕ'[‡k.gœ{ˆ¸"ȬTâ#à@éƒ-ˆ°nÇ.xâÃNOÁßR0pó6‹[7‡xò’©;êœXž…—ÙèËV‘˜ÃI{ïã¤ø¶Øà f·R*.d+yLsTû¥À²‡ùû÷߯O>Õ>#ûÅI¼XMâÕç$ñ*É?/‰xò;Nÿ»we¨G|Фø…ýW®€(zËéñùq̲0мyͲ·KÍlež†qº4m'óÂRŽžß²qPôˆR²´Wê–­ƒ|ÜŠ‹Hµ£_Š‘¾To”L¬ ‘¨œ}7ÎÈL»`šÌ˜îy€q‰þJ­l „E Èö]Ós1âYDoœjàM¬¹£´÷½%y(µ8U@5+GÂOm)¶ÖôH ‡Ž3ô´BºgÇAb†sËxf_à”«û¼VyYöcº¯¨\†nöî|¡W9Éì uP•‰ÐëðB{b2˜S}´¤. _z*ÆZênlÓõOÄpÁÝ7ôc†áØp—wéÎó?=[òqK’Î?÷Ö´[kKryJsú½ó"îÞšrîÚ4˜xkîí™3u–{ ö®ìeg;ıT@ªyä¬zëV ý 0P]àw²ŽlÉ&Ó «û–sêYé3­/6‡šÑìôÏÀíD)Wʉ_^D 8ÊÀ±ºb3nâÕû mðÅrÖïÏçI Ø$¯Ç¤„׋1éfœïŒr܇a*wpi^¯Ÿù¾YâÃÑ컧ʼ¦[²¨ëÎЙÅD÷†km7>SÕ÷äBÖa¬¹VJDú[ñîܶ0sà’GѶ´çÕ›Ò ¼ñ|•§_”ÔŒ[ÅwK]”Ý$iuP çB'\1ÐùÖÍÊÁ'Ï ª2?_•rċ駕ÕUûàÊ |zêj—.¿öäIây›ˆLÕoäØÅ¹¾8v؇x)y™ˆNÉKNÀ§†N±(=0{£ó”"ÀKëà]ìLßÝ5c2éé±§[ ô´R¶\E–åƒâtÑJWئcéîÙœGVRsèéË!p¶o©2hÓ5%3ŽÒ oãKª¯Üî™ÑœÒW~ôTžÀ6.z%gIýeËéN嵜e28N^¢4Ôç5$W™9"p-°Mi½r˜Þ¦S‰Ãt*x3Ñl3 þñꩨ“Ð)WHcƒn@é­Ÿ²ùŽÞšškC˜Ý/”í–²]9Û\KÑ# ¶ÞÁR3©¹ Y•/Gn•7Lì¤ ¶¦XܾŲ¤àˆÐè+±ÁïÎ]/Í b¬k[^SÎå|¤@dÈëÁTƒö}õ‘ðƒð¾O¨Nƒ6Ujs(O”µq^ñí'“ú+N`ëDGE Zî P:†pZÁ1zÌ2Vœe<Ñ«ÁŽœbähu˜éÑ ¾Ü9:ÏŸsÊ ýšªÄsç.uœâa%¿¦P’'¬Rém‚–Äí!?íhWJ%¸4—"\$}r©á8 S¥Oiîg(˜ÆþJŠGXW`kTÑÉ•àœß;Ç·X~qTTb‹›žöµ% ;}Ë2sQ*â-óª…BŸÕàN€ òbW¸ ºÁ¹m•LHbq…=}ßâ",\ÍùYKókmÞs&`"SðçùU¢ vkÞUúo^ªm¥°K¯³ŽôÕD!R宆qQr›¾{àzÝÏJ(޾ í®‹f™€:³¹ÕÒ$sWØÑ¯LK¦€9û°]1÷é#µ,¢û²´a´¬Ê¸Ïa04Ì>§Š3×ðÊÁ€ ŽpI'™&ƒøÙù«„ÂÊs¨mèf®,“¹"A–\Ö|¤_ Ú®Þœq\À{ÃT×¢ÙÇãZ^ø˜Ã_ðMFÖ¾è3¨WS ]ëdvU¡Õ,áÖÓ÷Gx_I—Þ³BÏJ9@{<¿{ä‹ Í¥)¼@¬Úª1µ»VLg%áé‘dÄ×–øùÕõZ@}õ’)q˜§¯æŠq,B‰Ÿ¼ ,¥º¸…‘qÇ/×ÿç‹Tùendstream endobj 724 0 obj 3488 endobj 722 0 obj << /Type /Page /Contents 723 0 R /Resources 721 0 R /MediaBox [0 0 595.273 841.887] /Parent 707 0 R /Annots [ 725 0 R 726 0 R 727 0 R ] >> endobj 725 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [91.394 694.095 110.787 703.792] /Subtype /Link /A << /S /GoTo /D (subsection.5.13) >> >> endobj 726 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [316.938 518.646 330.878 529.555] /Subtype /Link /A << /S /GoTo /D (subsection.5.7) >> >> endobj 727 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [257.414 451.506 276.808 461.203] /Subtype /Link /A << /S /GoTo /D (subsection.5.11) >> >> endobj 720 0 obj << /D [722 0 R /XYZ 72 786.278 null] >> endobj 721 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 732 0 obj << /Length 733 0 R /Filter /FlateDecode >> stream xÚÝZK“ÛÆÎY9ä/lùlJcx¹*YÖJËrj½yUœRÍ’à Шµ]þñé×€‰]å§xà\„Ö×0Æ”.±*qØûáÂ%¹*ŠN9›=NÿøZ+~Ö—·Ï>¿2Ù…ŽU·k¢¹]ý3zýö~s¹HLýáV¿ÿ®ì¿ëÛª¾ÿ>Nb®êžWMÝ_õœ;ËoeYG žŸPoËúùå¿nÿt¡M ²3i<|AOÝ6õ=“u{¿,›õútù®Y­·þž·ˆ'‹×ÛÆ UWý\ÊJ`þö›·7×¶úÖ×ݺiwpÛ<{uûl‘¨ ä°°‰2E. !) ½¶¼X?[8«ò˜«8µ6WÚØ9ëTñŒNUžgLpTb¬l±0…2Öz€æ¹®Ãϯt2š0NæQá '[€¢X7Ð ‡-ØžY§3Œ.¬²Ð^¤JÃú󓆃À>™[4@¡óá^Ã9ªîèÒhß6—¦ˆ>V«r¥.ÎdÑuÏSK_c#‰îà/‹JmêˆÛrÅ“¨ü±/ëUýxiò¨l»ª©yY³f‰LŒÛ¤páö0KlÖ/Á`§BœðŸæ`a1œG·á­ó;iù.ŒTO‚ü<ÜN¶nF҉ؘ‚ WåzN±ŠCPý µ€ŠÏÁÕõü„g÷‚–”Ypü5)š¤ èª~‰‚Û`_‡Ñ㛘/îÁ`}K¼£`ûƒG3éx35ê¦^ ¤¤äÂ(kòiØV_l(´]š~*Ñ€pÈ`áIpú»Ó$Ê%ɧÓ$s£Ígãõ‚ÃV>º$è83£m]Œ~ÿ‚«²¶@Œðd胾6LõrÑ•è¶)D/»9¸¤ :`ù˜ )Nlˆà-î=8Fë ¡/ÄQ2øÑæ£uýœiØÀœÜZÁ9™Š“b·ñ"#ÆazkGgµ,üùw ºÖšà7VêTŸÀ(äh†ò¢ìë×j5ZÅ.ù/¬FÛ ÏQl&ûŒ¢&-$p`×´%·qÛle»Xø%ZÖ?l*–Õ> ìaZ„VÀ¯c•A¤XÄ9ŒÝî€ AÚqNAÌ8.\ŽÅÈÛ¢uì§:qì ‚ÃÎ8D~kÇxÚ&‚ÔeYõ`J¹‹”Øf™'x%£!a`ÛœŸÆ*çB )ÿ\¶sèFÐÓGŠ &H pNÛû]D˜²ËmÐÉbïLâ˜Ùí-nÊîʳð™6A ì#—ȃ2ÜødšÝaÊKr bøÏü•-$=J½L¢›p9œã·ä\.ø?Q3ÏXT<÷P­(Ã( Ž·V¾øRÒÖwð$èEÌéöSÌœGWŒî6#Že¾•§c0<ÔUß¡aº¯T©¨i£PŽˆ'i*4‡ôñsZ?€ó:Žc~ÄÝÑêÕGd´lâñ¾Ú†<; l™éý“°Ýñ[þp(A"+aµß„¿k|¹Ï%„I•³Ó”rÓ´ÕÏ‚æ '[ÈÁº¥G›nÄ Ã8 ¥Üš’mH"` öý¡åb>‰(©Ð±Óª@ò¿œ¡9³È ¨:Gïš¾ ðýÉb–ÓHÍ|Cƒv™9€:]¹Å ’'"?ðK€9ò€v¡ÁVF5’ÏÛ­Œ³¸i1ç8Ê v›y¨á<gšPÕXt97ÒÇÀžÁÁÌEé\¥ƒãÿ )Mõj@úz¿ ’NB2?W>qÊêMz½­îæbŒLnG%ÚSâ‡Àkòøh2’„SWøë0M®Îì/™µ?Åõ’QK°÷! A!*;IJs—ôضR­ |)X(¥Cq Lƒ?B"ÞÄçhÕâTç‰&Àk^·Íî„Wßð¦+ß{šÏõve{‚”˜Ôzo%Ÿû\Q¼fðŽ‘‘‹ÜñÛ®aª#˜ƒN]Þƒ\YgXʤŽlüI¡ò”ê¥ Êc€;¡õõ¬[U$űLŸ_dà@Ç`'9}d­……O¾K0Y¡’Q%òI\õHü6 –Òü\* žqñŽ3emF¢MìH  dŽh8Ì)îXokYÐ5;±fÏ›˜^ Çà wC&N™½¡ ˆ¬:¾¹ˆù¾/ë² ˜Ùb^JÓŠEÔüÿíÍïƒ1ÁEÃsÝUµ¾Ä•ÛàøÑfÖÍvK%ñ‡ª£‡;OÞ¡DId÷¿…Ågß!Ýê÷_¿ºywýîõ\°çÌ‚)¿¥‚V_` 4R Åš ì0„¾¯*jÂÀS±8±&C%Ð3ätå°™—™½¯Ú‡ª“½ÙÓ´5® !Lý‚-@ø›TOX‹: ŽIg¢G‹cÒX‘Ón[r›üšÔô±Ô88rvHˇJ¿\!ÒY},·áøÞ9›cèçíÇ7eHxNô4 ÿO*+!B„°µ+=ÖàiEÝfG%£Ç"ýL1ÁµL‘$à|‹L anÉN^äX#÷è¸z6Ý“—LÕ$œ«É+TXz‹ÁRõ.¼ƒ åž—:1:‘%…TØÀ‡:,D+؊Τ%±œJb—Ä À*P”À­¶£Ò™ÔÉìÒ‚§K½;7anÕH}¶Ìµñ£·I ÜS#ÎÓ qm˜§ü­â’ÁiNœX•»OÕ, Œ¿bMp8äb 1äÞÓÁÓ'ùŽWƒa—œÏb¿ˆÈG$3f<’'*‹é»]²òó•X±æDü啃µ WëFå;ß Á^v x$xm)$v¼eëÁ4Úà´Ã“ƒ;?C¦Ýã5”¾K~~ûæúõ›Û÷·ß¾ûêêvÆ0 99zoÈ¢ïÊž¢³á¾á0øÃÄËèC…y“2T1 ^ãômuÜiU“{ΜÁWœ\“W“àÒ\Þ\â'÷›~q{™A&½x{‰øxÝÏœЫQ.žº]0y%»‘F€Øù8Åà *€ƒ7>rŽ.;pÎ],Io ~[ã$<ðêN`?ö&Vû­_›¼LsܳtŽ1/º`^ábÁðÜæ¨8™>Áå8´õûŽ©Fï±i޳“Éz<·ð…=j‹Ê˜tHÜCZV”Áà²0Ìžc/+±Xsî÷> endobj 734 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [363.726 359.886 368.458 371.102] /Subtype /Link /A << /S /GoTo /D (Hfootnote.5) >> >> endobj 735 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [133.06 77.771 144.836 87.784] /Subtype /Link /A << /S /GoTo /D (subsection.3.7) >> >> endobj 729 0 obj << /D [731 0 R /XYZ 72 786.278 null] >> endobj 728 0 obj << /D [731 0 R /XYZ 88.587 102.977 null] >> endobj 730 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F30 512 0 R /F28 523 0 R /F39 496 0 R /F29 547 0 R /F40 548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 740 0 obj << /Length 741 0 R /Filter /FlateDecode >> stream xÚÕYsÛÆù=™iÿ§/…2"‚]\‹¾¥IܨqŽ­¶Î4Κ\’ˆ@€@Ëʯïw-’òÚñÈ\ìñữ…ZEðO­r½ÊMêܬ6ÇÏÔŠÿÝ­üè{˜ãI‡i‚O/l\ûë8 M–¾´_eaœÅ ÷Ï·Ÿ}ù*ŽW* ‹¨XÝîhÏíößÁï¯þsû×Ͼ½Ž¥a’¦/cƒÛ’ p/¿UÿýáŸß¾}}óæ[|Í—¯T:Ù•é°( Ùú§«uÇÁíÁá º¾-ë=ŽuÐ7<÷áj­ó@6´¶ë]ë¶|®ìx–·Æó­Í•6ÁGüϵfÁ=êQ k­ëÏmMÎ7OÁÙ¶‡Ât^„äëF’Þ‘_†(…ʨÑÐÒ< ~h¯YÀ H=Ió™€mdÔ ¼H’«®LˆË³Ù ÒA^˜9/@¢[×M¿FìàP‘zçz^-åˆ@oþñú5ìN`Çs<Êþ"©,sð ë4w—?åæüöh>"-ÆaVàò©«Ê¿l+†7|6åˆ I6ðÛ¿hÑ+Þrëo*Ç[f4DPòÛ…˜¼/™ì8x(]µèáU‘KG¥[Nve½q³—OM ÜðÞ¿—ͳ+É}.гٜÙà®tÁâÐ…b˜8q*?¹ªãIÆG¨liÀ3m…á<Ž„8Ü4xz|p"žeS‚¨x’&´MâÜòkj7À“×l[¢ïþƒ%¹[ ¥Ä¸“Ä…d‰î}DÃpèŽñ‘3$Ñ.œ2Á¡Y©ÍÔŠIvŒK>&<ð#íxTÊY6#ºƒ¶S˜Ñž'ë ÿzÃE·Ï edâºnJ Ç3‘t|(û£=±ZlmoyĶ”R‚MhÅ•’b4/Ë®IOCÁ›;w‚ýl—lF  Ñ¢x Œ ¾bsHGÜ6–_,9Ï#!މ‰fî¨ã)™AÝ#FÁ|ѾµÇ#¡”äEP‰8+^ß6b!õåìqôAŒ¹öÌÅ7:p€µ1Eð®á¹é«À ÊZ+¾Èû²n„®Ü×%zBt óHZÕÔ{ä´ÎIkþŠÈÀ)_ÇÌXQ™|TvÑ¢SœÒs®i¿­VTš=_³Óª€¤ ¿çŽÂ&ëÿÂüÛÉéVªž5§>T²è‹¬¿úö¼éeú ëÓŒ$ŸDŽYÅñ8'Øþ ‘ÝZQ.hû öþ©„€ákaœ½ú¦˜*jÛÊNœPˆ‡GT-²Gþ™e€<58z|LFçs‰ï/—2fIšöš.²^˜'1À/eלàãÏ”àh€0Ü ¥·ÉÃAÇS šë0Ójª¼M{G!VeÒÍ#¼«Í¹ Å ò i6¡lò׬¤:‹Â(›÷4¼è4}$ž+kþå4͹?‘¹i2;Lá0x3÷eà‘—#?Q:¾>µh°ur†õÎÁK*Hw0’åT7Ó Gû”‚ŽnðÙ–ŸÃH‡;~fäc|qÒ?Ô<ÇFa¤ à!äº[JD“‹l×dOî ¦Ú…øvóTvè#x U^Kþ2¬”©¦Õ*4ýÊq=c„£TÅh4Û¦u}¹¡Ú"Ì5GÈ©kAÓã µÔ^Ä[4Éiƒ7 š‹‡¦-m˜J ±Î:”»~†#÷q0fRíÓ2œÐìÙ2_c÷Ä{­,b¯•éqq†N öÃ7 ~¤‹‡3¯R^¨‡Œ#±ÝÍ`Bÿ9镦2˜nÏ5÷T‘)ß"äœèOÜ”º ‹q"wC¾‹éàðdSîÄÒ¦&‚c%R‚º9ïÅ2*Wuˆ©±‰“ú4@SÊ›öÞü.+H8Â4~¡ ™u '4ܲ—ÅKš¡úzDÍØk mGìqw^+ÈÒG=)Æ4VÃ¥A8Ó„¨0ee׾Ϣó^5ÐM³˜8 óLññ„Qì“–(R—U_í!ùæ·ðˆ7 J," cÑx% &›åö¶¬y(~0VãÎÚÝËpþlñI£êǤú¸t,÷®A8­O‹Ð3c1z$ÆHûÀËG–­Sºäƒ\"4Ú¨dÿ̪u«Ýgë$ t¦ð›Péxi€HrTÀ˜œ7Œ7Da.%ÌÓìù+õWK×F L_¸ÌË•^ûbÑaÇ@,Ð Œ¾DÌ<†ñ: •J(õ„Äè2¢C)óü…É×à¹A¨|Ç$QéDùqžÚë²bù-ºª¸¹‹ÍõMOn”Ú¶QpÓó<ƒË½Å©½€ºjÞ¿Á…{ßñÍü«nI{ÐÜ$@U'ìëèkƒUõÙjœ|¿†z³€j©Ó‚eShðvkêTœ|lÏþÀÜKç“D8ZWó›9ìK@޾A|pÓ^ϾlànߤUUŠ›;Z¼„±”@‰¢#±zp½\* 7žáÿªl;ŒN‰¯º`ö¬9´ô@f±×V6ÿ%ò‹0J|+·›¼ˆ>^AÍi+¼‰N`ÏNR6Pˆxñ•t™TJ%ƒã—Ó›RÚ/FÊ]ÃY<üP3F\! *ó_’¼eÇ[ääNa5«d ‡d“n@|º‘„ìÚ4 Ò}^0†¯WŠbªEÔ©ßa1!,œæ~ìÀ¢ˆ%Íd=VÛv”u\ ÚˆøØÎy9ÍÀ­»QHxªë™ìKòЙˆÓ/¦ÛÉGPÛö ’g{?Ñ&È®0ãÆá!¯zMœ¶ìè® ,êaHO/˜±¢Æž½§öÕ‚jÑ&`P¿ø­¶ŠÍ‹NaZXü!DYƒ…ËݘÑ>‹–Ë(t‚EÜð(éùxñi°°P¡Nó§R¡<•ù3{ùb ¦ðm"x¥ïNÙø= LïFÍÃäÅ/H4„̪ç3¡øâ3ëPëg¾“üX'rendstream endobj 741 0 obj 3970 endobj 739 0 obj << /Type /Page /Contents 740 0 R /Resources 738 0 R /MediaBox [0 0 595.273 841.887] /Parent 707 0 R /Annots [ 742 0 R 743 0 R ] >> endobj 742 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [294.467 702.958 308.406 712.958] /Subtype /Link /A << /S /GoTo /D (subsection.5.9) >> >> endobj 743 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [476.15 649.064 480.882 660.28] /Subtype /Link /A << /S /GoTo /D (Hfootnote.6) >> >> endobj 737 0 obj << /D [739 0 R /XYZ 72 786.278 null] >> endobj 736 0 obj << /D [739 0 R /XYZ 88.587 106.908 null] >> endobj 738 0 obj << /Font << /F33 497 0 R /F27 394 0 R /F15 393 0 R /F28 523 0 R /F34 583 0 R /F30 512 0 R /F39 496 0 R /F29 547 0 R /F40 548 0 R /F43 549 0 R >> /ProcSet [ /PDF /Text ] >> endobj 750 0 obj << /Length 751 0 R /Filter /FlateDecode >> stream xÚµZmã¶úñò úmÑOÞb­ˆ¤^¨ýKrÉ¥‡$h¶(Ц8hm­­œ,9’|»Û_ßgfHY²åÝM°ÀJ$ÇCr8/Ï ¥®Bü©«T_¥6 tj¯V»WêJþ>\ù·¿¢O(£ØqD­—žriâÀ&1Ñ¿¾}õé_©0ÈÂìêöžio×ÿZôÛ¼¿^ê,]ùêZ§‹­´òý¾*Wy_65u$#ÂCWt×ÿ¾ýöÓ7:qTQ«=_U•wB5™×¨ÀDë"¯:bjeïgvÓTEÞõÂÁd#6 ¢$sšº˜™DeA–GrèlÑË<]#Ïãvúm1³›4 «‹7MÝ¿ýrn7i„~-û¼ÍwE_´Dˆc£ Ë’«¥¢ãȘ$_õ‡¼ªž®—ƘŚÖÁwÔŒuÓKÿöZÛÅ¡íf¤’ 3S6·XòÒdfÑ•ÿqoÍ==5ï†_ÚbÕçõ¦rãeçÆißÉÔŽÍ-»(VåO¡ŠŠµ–µÝó…k7ëh‚k(Z¶xý$S® :AœìöFô6he& $‹‰°D>=9þfÓæû-Œ¾¢±dq¨×X©XtÂ:Û"YÑ s<¼™‘$“xñ¡n¨ùP;ÁvòŒmbÒpÕ~ÛÅnÙýrÈÛëX/æö¥UjtpI$çþ?ºÞ-ËõlK>êáÃÅÆüT¬p2Ò0wOm•U óg!Û®ÜÔÒ)†Go,md,´Ýɼ­¥ûÄŠ¨‹­ˆ5f•³cÃ%þÅ#œFõ$c»|ïWÕHO.M†¡¬ëxfƒ4ñîö3´A¢½,™ sÝ´å:ðn,…[ŸªÏ÷d­ Æ5‚ÄG:ë‚W‰nçNšl35í0NØUcø\øI‚Þœá&ª»½tþÆáër##?צmÈ"A+½xsmávÜÊ µÝ¾*ÜÔäɨ·i×…#`ùá¹nsâ÷À› § @þ/±ƒ>’#KCœoKýØf³º|ˆ1IÆŒ~§Œ´÷ìjyÅP :p“¦Î1‚lÕ´-ûâ4ò’˜ÄÑ ‚aGìÿ#m“¹S•ˆêójq<mM”ˆjÌ >Í9·/Rö A©³MD›¾)ZŸ‚®º?ICP,¿û5èù€5È+^‚8CëõÅÃû¼ë;ðÎK0Dgt/ —ù‹ïš¾ð#Þº¾¬ÈwfêˆÛ×ÅÇr冊¦™šxº¶`'Ìyb¤Â‘ŸŒ”:¦Ô€·’XX´äU‰º+úÃ^FKÇÀ¹9z¥ ÐÐ.(!-^½Œý;‘#göy+ùjuhq2›Zø5:zïe§çIW|̹¢Ø>‹ßSøššö-²! …Ýœ–#:3:<âœÓ#=Á ,‹X =ó™imØØ¼”yC§Œ=¬Íeøâ ÞÛòêaUÌ1–¦#\ÆÏÙ”Û0‘·œïþþîÝ¥t%ຆ8„}ªóœ$2ágÖPQÇÙbµd‘GçDtÄ`ÔbeBó—CÑùe"hŒ"ðÞ.S„³/ —ûÖkýDæÉÞJJÆÓJ"?£DÓµRWë©h’”CÈ;ÊM襙WT ºr—o˜F’”GÝÔŽ à¡ ßn›»MšD¾åd‚È·b öÇÀSA÷2ǼxáË¢  ¶5®Œ@ˆ Êz®oTSŸà›ñnñ›q.f숕ضàŠõÅšÇ×ÕÓ~K³[;=äëlvXÖ½Lj !%´+Qb"ˆTu1$÷Dµru°#gö)«Z3øFÿ[ñ»!ŽEÚC$tÁkZÚðž¦qº– ‰ EÄÿàuÁ£úzL/ZǶOÕˆb×´OÒ·Ëkè§ç)gÝQì]#Õ!ò]!t\È£`DÝy'”Ã̤‰F&àƒó­zÿcÑÐEé%Z3Æ€+ûl5¡œT°˜ùp8õæö6 Ô¨Òa“xñcYSÒ‘~Ñ®RXŽ”]=Æøt©“l]ºXŠé)h&ššìµrTÅc/o@·1×~n(ïðþ#ÑE>^Yâ(Pœ*ç%ôb#å4ŠKƒD4Ô½úR,ϱ+´¶ ýöºpÑ„8o¢%HÆKAF:6Þ¶`›RˆåT¢½+áÎÚ'hÚÒׂü:)K*»þfÀ¢¾­¿$!Ìt¦Ñåšõå:6!{Nr=Lh•‡©_¿ûçßàxt¼ø3”ꋦ^å½ø Ò+ñ^ÕÍ…-J!b=‘^Y÷Bùø¾¹¿w †Î§¹Î]³¾¯òWnÑY"*&±uU}=Fë°Dsd•A¤Í•±Âcf ÅUÁi[€Á Ü_Fa%†=Pœ™AŽ4íåøf¶6” €aj¤—ÓŸñ^©ÂjRÚIJIÞÙB—ä<0ž ¿?ߩ߸¤¤ÊÊ>Ÿ¶¬¨j£“äct’:'@Ý\÷AÏŠ¥  .°Ë…O­oÊ–«ˆ‰« Ћ+ø%®î9‚¿>T½T}Ñd=’"(³x²ÝþÐû%H/œÐ àd[®f¢ñÇk಼:H2¹˜•Iæ]UŒbêœÖˆBëû©•g#+Ï̑ѾÊW>_4€]TÙº®=ö¶Ì}²àÀiÇf·*¹(0Ç©ëâ~x\´…/‰D 8—]¾çú‡á*é…Çñ¦‚|ß]UŒ‡#Ú!Τýpsâ^’´”tȇ6y~Ýðh;Ž”tNçÁ‰|vêÕ°—Èal^ºÃŽ ƒûg5U§X¤´ñË|> –ûW%¡Ù§Óȶ¼.?)N _ÛìæP:ÒÿêÎDÊõDŠÀ"¡üMªW¾n$.&£h«‚ÙæÇ«"é)×N¢\•œË Ò ±ÇªÎ~®–‘º@H$K¸„X\™N¬]T,è˼*óNŒÌùEÞ°Ì%|)âÉn\µ6‹#¶'mlnfìF%ˆÎ„0Ô$+ÁEÍ×Û_Ô Æ(úm”Âü®Jqë2ò#Mˆ¦–UÔr Èè _ðœç‘É/(òB¾‡–.Žå¾CŠ1Þ„°*¬tt/Li¯?뾜½¬'î}ÐÌý3ûÂU«Fð$O¿†Ïˆµ-G%©lt)8®Ê!‰†Éã Û$ÐÆÃŽ¥pÊg«Ñ: ²!xš­9¦Þ—«åúª>:Ã,sÚ™Ü eÞS$á«j}Ò”6„¡«ºeÓ+DyÖ§) ìŠ–Ãad•7«cÔ.(ŸŽ¬»B'’ID§±]JŒ¬Oúé~1xõ]C1ißÔ¹t%>~ß—Eud9wûaH6ÀÆ«šzÂɵP»9쎂UrãGOÁh\.i¤çøYÂý“ô¸BJ‚`E铤!J.ø¨Üñ°-ýG,Ôtäé 9»p¬¯G–Ö1õó•SM€âz(¯ˆïòè&vU<Ašº:Íõ€uæŒÐÉPñGòòî«7·ïo¿ÿ··_s;wYÃâ½Ü?a˜a¦Žü˜1$Æ/ñó•W} ŠGïcÄùç´ä¢šáËX½?¢b`eœ€"Üvî6,_ªÍÎ]GZ`¬Ì¼€.âãý§ÙPìC[Ë!iµxÛK·ÞuÑÊ·7ÔäÄZÐ;,¹xn]†œ” è7”×½Ž+ʄņÇwY4ךEÁ'å§0óJæózå?•¡¿2–¿8à:l¡sZ¯œÖ‡Œáäú"z.ùŠkÈD(Û-G–¥–;þVÁ¤Ã-ä9rݧ[þ°¥ A¤°™rGɉNqÍÁQ5Õ]X‹–Ès-É Woè—¾(BïHú„JÜtRõ^ðj%×)<_#O%¦w?g&2Z´mÓ3ÛùœnÛ)©Û•REÅï‹OÜ-|ºè¶R÷é¤I[1ØÒƒ”8i‚޶é]fÃ[v/GÑVe-£ ,×ÁËØÁ3§—ÑÏ$ÿí$jendstream endobj 751 0 obj 3809 endobj 749 0 obj << /Type /Page /Contents 750 0 R /Resources 748 0 R /MediaBox [0 0 595.273 841.887] /Parent 752 0 R >> endobj 747 0 obj << /D [749 0 R /XYZ 72 786.278 null] >> endobj 744 0 obj << /D [749 0 R /XYZ 72 323.984 null] >> endobj 745 0 obj << /D [749 0 R /XYZ 72 302.093 null] >> endobj 746 0 obj << /D [749 0 R /XYZ 72 266.653 null] >> endobj 748 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F39 496 0 R /F33 497 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 756 0 obj << /Length 757 0 R /Filter /FlateDecode >> stream xÚåZ[oãÆ~ß—þ½….VçFömÓ®ÓMœ4H•E45²ˆ¥H…—8î¯ï9sfHJ¢íî Ô) ,‡sãœÛw¾9Z¾Šá¯L²2©f‰IWÅá_ÑßûUh} }4S*Á”Ä·g&®¥ÐLÇjµŠ¥Záü/6¯>¿æjÅc–ÅÙj³ss7ÛD›½míÕZ•>EÔÔ¾ãÐЈvC]ôeSã[õû¼§þ;[Û6ïmG ŽWëÄDMY_%iÔÛÖw÷Ÿ]=÷Ý®~Ú|õêíf:p’0‘ÑSËìqù—™sÆÓ„tãdMÌ‚¬_Þüý»?_­U¢¢ßoø?ÿؾÄ#ý«x>vç;y8éZ1;®3ÆãÔ[¾§NW­]í^ÎYªV)ã0MàC, ¯SfTæ¸fijh|2]̤`9K1 #Ä‚0×x¸3£¦,K¤G¡‚ g[€¶¬çr É„9A\®Î çÐ^kÆaý¥œAØÇ …<}Ú߀“H®£ƒ%¯/³[ìR‘ÍÛª´íkx ¼ÎÒÌ¡³-MØ‚cÁÛÕŸõÔ³Ïq“_ð?Û/SÁ9»®¼-«²Ç)4ÒìèùÞ-³Ç²¾£Žñ“乨–QÕÔwá 5*dYsôŠÌÉäÞøõÂ訶¿öÔUäUE}øÕ“I­íèŒb D0QÈ;&w*\‚‘»š8zç÷隃¥Ð5&ºGQrÒhG»„C)©7§ÇmÙòã´Ñ’Påµ!c¯×äY'‘¦K¤ Ðrb“7ž:­d™ k9ÊvYtKÚÀr´ú–ºQ~ tJnƒêCëë'ô ËÅŦ¤-ù¸!ß aìÒù8tÌÎûÔ ð>ÀæòiÆðò&ª·òyN8& è$_uAÚœ«Ïeéi.˜=Cøv¿… ®Ë¾Ì«ò_¶;ÑÁ%^ˆ tí\š¶rÇ@ÃÝB )R Íd>?Gœœ‡¾·`>È-‰F¤ Ä`ñ•>Ý ±A&r'ÌÜ iØ™(ž¦åsÐÞÒàp‡h¸)D¿w˜‚¯wS^õ÷-ˆ×ØÅ£o¸¹ñÂh–!iœAŠË˜*oB™ðÓBzü€Þ²Þ–x"ìÅOOÛ¶M‹ÇÉDô†º<#ÀæÌ&Nâ׸•<ûÀ­§ø‘œÖyÚîë•N7Ëç°¸Û7C5näÄ^ S»Öº¯¿Œ_Ãx£‡ÿ].½“2jbY×°Ù³, n ÜÌîK@«–e\C2¦¹ø M/ö`Õì¿ÂYˆjƒw– )Øœ=– ÓA’ÁCøë«5牌nš|뙲€;R&á:{4‹X°ŒÞþz¬Ê¢ìr]*)ÆÍ™Ê(’~è°ZFº´è@QRbFëÖ ½×dJhiFNº©¸å ­©àxØ"â-1G“+ú­§)ÍćЭʺ°ÞÿÉóf'ÙïÇ}sl-ÜÉ/ý.Gš wfǧGÌ‹†6ehÌîø|{m2}1ôã‚ÖÒžyë׺»•»4ÔÑ•ý@€Oï÷a'.ÏCþÞe >`<ß–BàL;™Ñ¥"¯×)„vÍœYx³kB­Ã.ÈS`=]•|væDM·ÖßÈ€åÏ÷ÃÌ·PÇðŽ™e Àð%°ñ%]•gU›ñ†€4uAh¾ Vv[æÓ(ßõáNTáø8¿ƒ´Æt¬é° 8æΉQ'ä|9ŒäíڷyÝAp¬§{%ÒÅâã,Åù'ààt´tvÂ6{‹è!€z4>€Û€?xQkJš°ZŸ±NƒzÈu5á¶S,¸zjÔoøª“Ÿmš8HÅ¥MJ\þsYÐ0B Vr¼§ÜåŽ5C=kvD0Ú9†ò­OgÌbª%¶r‰^)À–\­UÊ Ÿ® [Ö=Zº È×MÝ£ÃQç8ŠÝïþ´T†5ðHž(Ãfàâ‰2¬a@þ“2,gØõÿEvò=̆¡3ù›ðÜÄ•V›êœÎÒ ¯Í«p³wÁ¶T©z1(z3–VÆü5Þ†«¹²ÆûÞÆ…Ûq¬| Š1ø«çêWê7©¢S‚;b[>1MÅ„]Û¨õæú›P™~E—Ãq˜ÓÎíLÀê\aoðÚÝབÜ~ÂB9!ƒf¸ä]ÿåÛÍwß¿ûÛ›ÍیҚiÀç¼êLb»¢-}*Üú ýo€]Ì"’+ Àüc‚YÒûG±ƒK?‘Ò+|IÕ¹¿Ú~ŠªÁÜÜ/3T3Ïo«PpKå;¸³¥UÛyt&—9‰6̲H÷rúéÒ‘ÎËæÙú‘:ƒ!C™ŠÊ*Ý iÅcÝ+^Ø'£ÜG„%Ðg'Ön¨ˆ"5K%5üŒõÒÁE¥g{SÄAc†ÕðVøb4=ÛScU^´'†ŽÀÅŽyCß./+ &-§_´æK‰¹ÂA´4'÷Ú-ÖêD— ?B0† íy±y)žH—aö;¡¨ ×b8'@Ç*æ–ÆOÁs~ 7óØ6àz‡ŽzïË~OýÑÔ;ý,á97ôÔAcš›åmGòT^+–Šu¸ß6A‰9=æ¡sA€ök¨íE=ÃI±ïnü¨S…N‹¹-‘Q燒ª€ð†KÚ®GÓ ÇÖ߯S=ž3ñ‹Ø<û£a’p&¸~¯ÄEå/GL’'ððß’ÁN¶endstream endobj 757 0 obj 2418 endobj 755 0 obj << /Type /Page /Contents 756 0 R /Resources 754 0 R /MediaBox [0 0 595.273 841.887] /Parent 752 0 R /Annots [ 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R ] >> endobj 758 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [204.393 594.648 223.787 605.557] /Subtype /Link /A << /S /GoTo /D (subsection.5.13) >> >> endobj 759 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [262.271 500.003 276.21 510.912] /Subtype /Link /A << /S /GoTo /D (subsection.5.8) >> >> endobj 760 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [371.878 400.582 385.817 411.491] /Subtype /Link /A << /S /GoTo /D (subsection.5.7) >> >> endobj 761 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [255.575 378.067 274.969 388.976] /Subtype /Link /A << /S /GoTo /D (subsection.5.11) >> >> endobj 762 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [514.483 222.638 519.937 232.335] /Subtype /Link /A << /S /GoTo /D (section.7) >> >> endobj 753 0 obj << /D [755 0 R /XYZ 72 786.278 null] >> endobj 145 0 obj << /D [755 0 R /XYZ 72 484.738 null] >> endobj 754 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F37 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 766 0 obj << /Length 767 0 R /Filter /FlateDecode >> stream xÚÝYKoãȾOù Þ‚¡‡ýâ#@ždŒM° b#9ìì–Z1"é%)?òëSÕUÝ$%YÆÈ!³Y]¬î®®ÇW%q‘ÀŸ¸ÈäE–§±Ìò‹UýN\Ðß× ?ú3ЈSoo0.=çR™8O ò¼}÷áZeBÄ…1·Ç{»þ)2q¶X !ut½(t´oVCÕ6ýb©2mÚ&úÔ¬Z‰h]5÷HÒÑ÷e³ÞáÛÏ·?|¸æB$q‘${)“ØÆ­p…¤ŠjÛ,d¡x»F’ŒlÙí*Û]⛎†­e²[ xy5)àãÕB¦Ñ¶lª¾&®}ïÅT =ƒ€¿-dµýp³êª‡a¹+›û}yÏ“ån×âü﫤Ǧm:°¨Ï…'¨ÌÂdÕÒ J\P Õmgq¤`éÒÑD$MJ¤uõÛñ™‰ŽÁºr5Ø®‡Sk…Û¶íþ~K_·Íîå@NIkçjeû¾ºÛ¹w•,¶¤Ç}õˆkÙ†wTÕ6>qˆ[T’Nî&wC´§mEdz¥¥“d¾t¢Æ‰é¢ðÁ¾¼ÐÔà²;ëî>‹^¦ÝÌX’hµï‚ªœ=©bbO*KãBi¶X°Ž…ø DË$z´ø¾Àb 2ƒãgOJ/b¦›ÏhH˜N·¶ ‡–žuù\ÕÕ¿x¿_aìsuWíªa¡8r®¢KZYf“•…Éc• ^z»êîÄþ”Œ‹B2Ùgîì×"',ro>Í=yPÈàaw^d¿@`*¼ 3]j(^,S-Áªžt! ƒ¿ÏtQ¡{ä¶Ó£ à|+Ø™s9 ~JÿÝ®’;cÄyïMßÂZâÊ‘ûDƒC‡/Çý‹ßÀÚ‚¶5Å \ YÓvêrm‰ãkCÝÐëÀûEíÛ?Ü@Wv`£*1h¯EäÆi´êl9Ðnà ÝŸ³#.q'èø-m»¶äSÀK…6®’, 6k¦V¤––„×"ØŽ£„``¢vãB ²®máë.H>8×Í$`C0i¬];E)¼ê¡Â`ƒÃ'§c먇°³[Óww]…Z6/ôÊK» bn25[cäÁ1ú1>²àyx« Š4F>'ÐÓÙm\á—âØ^E]ƒw;[€gÉìW7üìúLôÁ>4òë:‹èÇ–?ëû}ýàõ„<[µûäÑWMYóz Î6ý„¿ã 4: 'Nó½íX]ôR^o:êö;ÛÏnFFýªlV•UL»ù=.óîÓmHìxñFÄÒ¨· lM¥Š ¥~5KÏh~{¸€‰5˜Õ›ÙôDøAîOÆ4ƒa'\#F°cŸ*éÊM×;;XLø^Ý7à h¢EÈÄyNµãèÄÒ|ÅÒÐ’ö¼ ŒÒ™,°õCÙù…ŸªaKÔÓ¡¢ºpfQ]Á(W|RÄFhµ8ØáºŒ6!ñ,µÖváž…—ïL¡.9uâKëlÂ-¾Ã©'žh§®íº*YM@Ø´Ñ`‚ ÷S1r”Çë±F€ê“@.c#ó™œß @É™Ÿä:–‰[TkÎ?^8fO Æ!9Qçu‘š8ÉÄ«y]âëW[@'T›ƒj¥W-†VBíʉááî|éc]W k7ûöçvœQ$qú: ›N£mÛŒ•Fl0ò6ÚøÐ¹@ióåÅ2Uq’þ/¸ðC uÀÇ„Gs㎌Ð2íÖí#'œD#Áçh“ü¹- ¾Ð‡¤6dœf9œiýÄ ž¾ï‰ˆ®0‡+% ´ÑKÜ· P ¤këƒLƆ ßüõ/Xu O9±1á@KM}øŽÄ¿O’h“¢qô-Žpö»¿J’’D$þ#I2H’A’œI¹ÿL°æØh;Õ±ù5“Ë©pÒõ=Öµ>·š¥~«iتútæÐ¿ìmÀE `šˆÊ‚(D]Ÿ…pM¤2›ãu¦Ú Ñç®ó eäI2•.25Aƹ‹üxBF¸Â4 2þWhÞ¼Aþü¥\í]H­ÁG¼?¨ ýN¯ÿtæ´Ã¶íðút6=± – MÐüõ9KxYWà÷=b!Ó¹¬,È 7p=3…ƒ¨íëèIvº©š•ë´™è1=¡î=Õ_KÓXçò­ö¤|ãK‡w°}ãúZ[=ÜÖ¤¬¤¹£C£ƒ`LìYŠëssÆ |{9QŸ Îñþ嬵¹~¬úyœ‚ŠB™šbÒ½Ó ¹DÏ»wuùÕeÛžª(×ã†s•uÁ5Û¦\²“:r™œË.sÜ‚Ÿœç,|\]íH®…ßÒ4wâ ª su¯Œþ¹µ q=”]ÿJa±TÅꀴ:ÂùNI!èBr¦Þü)’:΃uœéÐÊÄ_SgÙW©";ÀF\µ¾ð/Ï|x.ú½¶%u•òP3Õ× @ é^ã 7V=lêø'¨a;KýIàÝé`SbŠi¬áºKä3(Ž”ÂÿÎPL®åCO_ä¾€(æ(æ~GŰrëyê²ûº<üÍãÄk‹Â_çO§"D˱=Þœ‚ˆ"‹Mæ=äçS‡Ähþ’ºƒáÀ C œ2ËÓƒVýèâU¿ªÊQ†–\­a®´kÆò¨hà.2>tvEíZ|k;b9îæÐ‡þŒ7$;³Á€4kpŬŠâKê'ó}!~õÃŽ[ŠPæÀaõ[%‹”"V"}«hQÅá]Gž)Šþ $‚9„endstream endobj 767 0 obj 2458 endobj 765 0 obj << /Type /Page /Contents 766 0 R /Resources 764 0 R /MediaBox [0 0 595.273 841.887] /Parent 752 0 R >> endobj 763 0 obj << /D [765 0 R /XYZ 72 786.278 null] >> endobj 149 0 obj << /D [765 0 R /XYZ 72 761.372 null] >> endobj 764 0 obj << /Font << /F37 380 0 R /F15 393 0 R /F39 496 0 R /F27 394 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 774 0 obj << /Length 775 0 R /Filter /FlateDecode >> stream xÚíZKä¶¾ï¯èK±­)R”äàØÞdbcmÄøGÍÞVÝêè±³ã_Ÿ*VQj©Õ3v'‡Œ(>Šd=¾z¨Å&?±1rcò,–&ß”‡WbC6¡õ5ôÑL¥ÓX+|{aâ6Ìܦ:Î3ó{÷êÍ[¡7"‰‹¤ØÜíýܻݟ#וöt³•Eän¶©2Qy#Mô`[[ö®½ùëÝÞ¼•æla.c©$¯~Cf”‹X Åã;WW‡ªïˆ´¥Ç©u¥ÛUÇ÷ôÚ7nd¹#½>VýC3ôø’EÕ‡à ž&µÛáP=>T=¹;ÙÒÅ7[•gÑÐɶnry…m!b£³ÍV £ :éÇêÔ­Ü&•q¢t`Ö±lü9øôBFI„ª]÷ze“ÄR^Ú‹ºº‰~ßÔ®µ½C~‰4º¾¥¢þÁâ­„ˆ¤Îh°DÎŒròg9Úƒ£ÁÃs«¾jŽr&Í¢Û=Íš ˜w²­Ã³!GT Ì›±æPuÈÈ×psÀQÜ´@apÑV¦IÔ ÷]_õC²‘p¬{<ÛÓ K„±*ÂuãcÓïÜ~…+JƺJ6€Q_Õ´-€e3õ s´ÎWØÌÂË‹$ú¼«v¼lß6‡@àpm‘YÔw|»cÃ|(TœäÌíñ’nºþû²­N¨Ÿ@vÔÝŽxëY‚b²uÝàÈ£ÞqçžE%èظP©d&<èI 4"°ÂÒ4‘±Ê¯žSãôš'¬Å´IÕѸsª]†å9’ k37šÀVÙˆý}À,ÃáGëvíÁ›?è˽ßÕóå£ç 0=Õ2ªzZÛí‘¡‚ GÍç–¥ÇxTÂ8½>ØŽÝP–`;û¡®ŸhoÚÚ6À„Ò ’uéübž)V.Sà÷Ëì6Yq…ß&\¯_$ž¥éi à\YíŸÂüããÎ@«ªÝšU™,Γìe¤1æú‘‚r¶0ì»Py“‡¥-õ ”8©çx:Wâ,!½Êä¨Wø–'t‚Â1pg;tÜ fèçN·†WqyÙˆyH×C$4ºÞ¶=5IAa鯨ÙÔrOy=ƒ‘ÚÙ®÷Kæ:ÃuutÔ- Êo¶[‘Lfb`(3ý+à2í7+Â\Ô*xMÔ 8Ü#u3Ôxb©áÞ“áЖ}CÏ}ãѦ€~!ɾÃÎsùAßLôÀ}©’è÷0àëG[ó›´۳ň<.d:g‡¾TD<öЖŒ#‹Oe=tÕxô4È ÚÛ~ʨOÒÿ<Î}Íý5á ð¾£ ¯ñ²…W>šoi4nŽL`?KÔCSÝ©ÛÒ/Ùv¼üd»59Î5᪅ ˆ·F‡ßVÞ $'Y¾€,4û°bâ0¶mGÓÖ@GúZ¼;x€|ÝÆqÛ v’”D€ûVûp(d"öìmUw<­êÃéºá@7ÊùF™×ÉbÔÉk‡—*¥|ž¶J*hgç.w Siˆ·È'­÷·¤ÄyBÖi¼u"Šéy|ŤäÐnö< pÃ# ê}0s"¼ .r4Ð`ñn^K0A×Ù­1¦i6½ÔÝùÀÀ!ÌmèíàMût“Ë(¾ê îÈ`R6íXÝÓzÐ"C†F°¤÷ê«»)WбÒÜyƒŠ]O-®§Bć!ÍXI½Ô¾Ùj€±Ï>»û.à= MÚWµChG€ ‡†Ã ¾-bÄ)Ëã´È7­Ûì_A˜çz“Ǧ¥øHW†·9øfîÎæåùá)Jb•¸¥™«ñZiºr­·+ŠŒÐï®° |ÓBOóÆkbžkç„s¥™f 1µrÍp cPk$ÌùóYà)Šž…5©®I»ÈK¦:¨”Š:gÛÑÂàýd{nÍ’" [qô­>ìY6G\ð~€Ô‡·–“U"Á¡eûuGº¶Þ®8èêǰÞdžósK…×y¬!0 Ë€)Ø‹c6¡õõ3Œ’qº$ ¤ u=-¿Nk5g„”1„ ï¾øöËÛw¿{1\`'®MJ9žÑ?\Û6>ǃ6á^Y-â¤Ê–YeÛÖRÂFó˜{⊲/Ja”‚è§G¡0튟 €4 '•"W2ɱúÑíàìL÷:¨Ä¿)Lxv»Ö'ÁØS>wª:j(7Õ”úEÓ}ç3ølæx8?‰‰ZzÝ5ƒ70W\^œ&â½ýBz„,:^QDgaVˆ½a4tÉŽè`„Óz¨æ!Ì8ܺÉñ$ fD¡š:?V«îÓ…"Ä)€Æôävîmsìçˆ5/ì@0›7î‹ BÈ(²µô 5 ´º˜§¶·dРGC ’aOUrÀ @IôM~À`ô±ëy!Hz÷§o¾Y¹…ÌàÁÆ‚óœt7¦€±fW•¶w gê*¸æSŸ…ô}Ba‚‡vNõ¼EÉö‘™gª$Rm­'-Ýå‰ì,›Ý ¶iÚ÷öˆv†¯Õ »Ë u” ©#iåÐ -¸'Gÿ€Õ$àZ\1’ 8 gaÛ|æøŠN£ƒÿÐzÍ4 —l·ðX¯‹`uçÇVIm.8ð…Ù–QÙ5PÓ“ ¶.¦x%Ôs8Cæ‹-Еúˆ€>AaΡUè§ôG«‰ œÐ·Æ>/š­¼K=_9/Øú1NŠa0 4++„à«ÎµõT£œ¥Î9'ÑùEâ ±^â7q?¥8+S Ÿ.½ßÅ ¸ ÎlKJŽ3ïYšØþüû/nýÍn·?º¶ñ…I).q›`18ÙGÍD­_FC½DÝ`µ£vO]ïcŒiáO ŠE^Ä9Pݪ"(Ô/WÇžâ]°ñ/Ež Š?;ý§¢âì#*Ö??*^Ï3y¾Ëm;2VŸç)9-™‡Z• FŒ]ެ_,>f.ì½DEìåIƒc:HÓW €V,| ¥ óû†fŒñƒ?‰mÝ~¨éÅgZd÷8¯i[Wö¡Üëï8ƒŠÅÙüž`Õh§yNn›>°ñ]©akÊ+$DžÝyyœkëCÓyžA–^{‡Dѯ<»J*]guušBѶ-=:÷Þ—ö2þ9ÄCMm©t¥~ð9AÃÑ=úâ4Ç<=ÿ²Òï4²§S]-Ëy”ûTÑq{¦8 Â’>¾PC§µLý? I˸ÆØ}ûåëÿÃÔ¦Hk8ÉnÊT–õuN0ú³R”ò¹A‘Åö\Šæ/¨vŽÃÃÉãÓ§y˶AËÒ÷Ú§¾".ÆO}þ$éZléðÆ…„\†EÓGLM'ržv qqЬ}Ké¤éÏŽ»‰—ÈÓØ,’È ZÎblÈwBn¢&”Jþ>T­;0»9A©¸,Ò´;Ϻ/˜r.&jÏ@hüz &‰Ç‘L¨—bYòl4+âåy¬rýòOÓÔKÔïBÅé3Ós}Æ×XbbÈžW¥ `§:-¼žc:§ù „Úk]Ü (ÄÒ@š!¥7þ ëä/ʺw|+LŸ¶;ÇAû1˜21`JŽ›ê¸Ø´ìËB’øï?£(JýQ5½ž÷Ï5U6|Ú}8ûÌB÷ ~Ì—jAÕ~• ½3^}V¿»Œ“–¨B“¼‹ÑÖ@xÀCu±3yè^è#6ö“>\3(Æ’Ö a>áLìdÅ;Þ¼£§WŠ"Ô«isßa‡¾9€×*ýgÉKm:‡„9Ðð§JüQ ¶Fü&?BEI#©ù‚¾¾rAìgƒ“Á˜U ,?yUýÕp•x‘`~ëÝBfQžèÅÖ]C­Å ’P@˜ Ùš¨­ø_˜ç jD¶£yHb¥¾˜‹XÉô'¸~ç"Ô!·¶}?¯ç«‹:RaG²L(;Q*fVtZjäô…a)Ѐõ,²tú•ÙѲTW¤@Uö¡ô·"Ûc@¤ðµ$hÇ&¯gßPÒÙ×–ßtô’0ŠúºÐcÕñŠ­à³/ —×½•DLzÍŸ$ü©ÕF Ìðg{—¡¨±Â‹Bü¥S$Z€ *L~Q6{óV%Fg™q,´ðk“Ym\AŽ…"øÿž~€ØÒ@뺡¦ß ŽatÓ/ß”ÿ[1¼¸ÔÝkß+`¸°EHyf1+ðc¯W êCêR  «£½í™rT\pTìÚK1î™8)²—œ:Æe ÂañÒD)Eœb‚ñ¼ÿWÉò<2•±”ÏÄÿÖF–Šendstream endobj 775 0 obj 3349 endobj 773 0 obj << /Type /Page /Contents 774 0 R /Resources 772 0 R /MediaBox [0 0 595.273 841.887] /Parent 752 0 R /Annots [ 776 0 R 777 0 R ] >> endobj 776 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [130.569 519.858 144.509 530.767] /Subtype /Link /A << /S /GoTo /D (subsection.2.3) >> >> endobj 777 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [247.791 452.718 252.524 463.934] /Subtype /Link /A << /S /GoTo /D (Hfootnote.7) >> >> endobj 771 0 obj << /D [773 0 R /XYZ 72 786.278 null] >> endobj 769 0 obj << /D [773 0 R /XYZ 72 259.32 null] >> endobj 770 0 obj << /D [773 0 R /XYZ 72 236.805 null] >> endobj 768 0 obj << /D [773 0 R /XYZ 88.587 99.449 null] >> endobj 772 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F28 523 0 R /F29 547 0 R /F40 548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 783 0 obj << /Length 784 0 R /Filter /FlateDecode >> stream xÚíZK㸾Ï%@~ê`¬_•Û³“L2ØCº÷’ÝE ¶å±0²ä•äôÌþú|Å"eÉ–»'È&@A-Š,‘¬b=¾*Z¬ü‰U&W™Mc™ÙÕæðJ¬øïã*´þ‚>¦ÔFÅFÓÛ „k­Ò8MÌj­LlSCôxxõÕ[aV"‰ó$_=ìíÃöûè¯eÙlÚ»µÌ£mÕ|¸[+i¢‚Y´k›;ôü6ï¤Êž_=ͦmúj[vÅc]RO‡öÔ¥ÿ®ÝqÿPJîé«fã›ÃÞ7Åñ8®?Ðl~}AsýÃ-í¿iùùˆ]gèüñáÏ«µHã\¥x’”rÇZW¶Ý‡¢©~.·ñÝÚ$Yô®Á—Æ`é*lÞuô´/»’‡ª»ªžß{g’Ä1‹ÎcWµ]Emáte_–žoþöÅÀCÌ>žoOU]óŸ#MT6=Í©r,žEßW¦ö\¡u,º¡Úœê¢û‚5ÃD~â}9eÆ8^¶å®8Õ4¹Í¯&C׌š¥+©÷3S´w2¬Ù=uÕ0~ʃg–Ù5EÍ=Ï.D$‚–öTlî ·{~sgÉJi ÿ¬Ûb»pN^×ÕxÔ¤-ÜÁ{Sj¢ñJž5E íËát„êj­£ûrÎÔ{Oq–!z¯DF›¢™mƒ_ˆ/í«’9ßrï¨s¯¾y8;)cÈdµÎÒØjsÛ÷ÜöGBÄÂJö[ÎÉlÁU ¸0°ýñwðú†û,7?$&ááÍžôZ¿ûÝdT„¯Mœau ,ÀN‹ƒ »êÊÕîÜclÍÊÆdŠjaxmã,õýp-Öf<|v²I¬S'Z¬)µÀÚ[ÚÛ…ûµq.µ'æ S@vßt#›JÇ0¸q+–ö‰})´×i,„^`3ðy2r›Â>*þDNÒíqv‚ÒÄi.=M8’–u+“{ºK]•ÞãRðéûÓÁ)%E‚–q9 Ov ïYÔÕvaS"U±6Aƒ¨«Ç…-)‹,»½¥¹…/(ã±onº²Â6G¯tÞݦ€·w¡IfIœÂf¢]Ú´Œ ’„¼‡syF Ö e=y¼0_`ÏÓ-›ÕYóf“ h†1½'O. ‡zŽþD¦‰c•$AÅÞ–š& —ŒóùÙ…ZòcÂFï¦ëàÛ:Äßë]¯%lËØ|&¯da‹0ñ4èSE>[PŒpj„€É¶¢…éÕk—H£Ý©þ!š7L£KGm•i8‹õ¢„tló <-§§ª/‰MD<‡4Ü~JnÔÅàC{Øý’! •ÅÓã/»®i— I¦oÏB7Tº8ºY¾³†ƒ°`[hÃT¨ß¶èØŸv˜…Bš6>¸PWÅÏOº0ê¢`9ûêŒyÜ=?ûÁ¢,6›Ãá&mœíäd;D6b¡é7¦ãÕUD™ñøÝû÷ 2„Óʳ D§ÜöŠ=iŽŽìx6iͦ`…’V8¯ üÇ_ìŸÚ3T%³"]€•@ÌžlwêHOÈvr/qšÊ1H1œÓÒW»3¤Bï•ßxÛà¬Ù×0_S @#êÊ™g–²ýf„»[B}È;&Rå·fÀ{ÉBȽ(/Â{GŸqW¹ŽÓ™Ä3{ÏhÕ×N€€Ψi4<™ `ÒŽ0 ÁGͦ õ^$ZÂ^ÔzÖÕGŸOÈÜD+Ž»7Xí±zrî?ˆÀŸjÍtNêxÞ·M1—HId¥^ËŠTJ©›?®B댊’•Šs„ÃY¸k¸“I¼µ—KP¬–9ü‡Ï¡.W2]‹}×µæÉûsÖ´ü:)¡¾â4´X¹ûÏÔ¥ –yÊ0Øõ0ò¥>²7Å©9š•„jÙaö>‘ÄÛS½å×bíO¹37P5G]‚r1Æ»ýiC9Áž)GE`¸"¾óg{€Þußrëè–oƒ£riúéTv´—àš¨ï<`¬ç­”‡ðùe~(§99ƾg‰o*,@ûT ûëSr{‚ûÛ¶Þ½Y86–"„œƒ—BHò¹,Æ“à'ç ™Ïò1Op;š§!»S³qžñ2{¸R!ê¤H2ýŸK&i"çËâÜoèÎùØg°ÌþŸ:<›:˜_(ux`M‘öQ;!ü¼RŸükpø¯ÞGƒ\¢L$+:ŸëŠèi_q^˯۲ßt•wBýLaRåÄ™kÌ•¶Óð<°ö>àW­'×ù¾OÙU¤Ø .½‡Òôõ¿¿´L£Ò8IõKþ'¤R51ƒE}ùÍåüYy¹fh|²ôò!J-¦ˆoäV¨%£¯·í9/ÀÈêwÒ~ÍÉÁä´$§zþdŠ9]ÁØG `,÷Ô0IÀ‹Ô–º¢ÇGÕÏeçò wNÍëÛèÐ|1j1±Ìämã,Y‹©¬xU.É9ªù_9Teì¬V »( ï6Îp p×Ðs¿C¸O ¿\½,Î\,RYÈ'·§£wYÉ”'±!£j$A,>í}E^ÁÀaÔ߇%ˆšÊXçrOÃR âÄÛˆ»Â’™ kC kÜy ‚–Kß(¡Š8=[:&›gøór©ŒšâP^„׫x¯Ô]Õ¹Pxå¬Ô[¨[I¬Ìá¶GˆNïþˆLfË»–D&¡‹¿vE§JêÅ}9u—¥ÒЧ³ç¡w‚µt0DãK«°”@Jé¬""eÀëR†(#ƒ Ó “§”ç¡ËlŸM”¾qr‘!É ¦¥)É#,1Ÿ 9º‚b}/Múã’É%M¾×ZšP¿\²T¸³‹ÂÝÓPS£¬ÙùõQºÞð.ìä˜ßèbF®—²ã[ªJa'Áá_´25/’ýçHaàœˆG™»\‰è[Ý­…À‰¼)ëÒß»d*zãóþ+³Fè29ƒ 0lŠäºvä êrWëªs [-W{wÅ%øŽ}‡b¼æJ'µo›ETcä–ƒÂ!µ5á~ÐÚèPZ—¥Ò7dŒ\¢í®æ0V~:ÖÕ¦ò;tEŽx;Ïü©B‚–«Á`û»5"3•¨F]=v…ÛI’D|õôÑÓ´<×HÛŠ;\x ¤Ȭ„Laªù/P[ÉÿÚ Ñ¾oÞÞYíJF, g6àõxêBr˜æ3ƒüBíI‹nêß³yÝÄç(ƒªjº<ô÷„wÞ‰ éÔlËÎ]³î½yûXfËÛ–^)A>Ö#@±%m÷…”n’vé)Vœà™ñ¶ýµ/Æ”~—}_È;‡žÓ½-Ýl *èÛPáöL\¨åyªã\ˆ‹ªˆ»pÏÏe’ùO4]fütª:gÚž7Ñh¸×,é|.i zIã[Ä•%GÕ¼€0ÜÁ- Ùù|ˆ|äÚž+L׳j躕_PA™šÂB쮃/"„ÈãÄÙæYfSoO.c„­c̸Y0‚Kd…bè<Îtöß¹ovN¾¼‡\oÖ‰^óˈÐ÷÷L~U=‚¼òçªG$®ô™êQ†ÿâKÊG2ÊüJnž³/JRG—D-wf¾HZ5›ú´-ûYyUÁd‡‘Ï“À‰üý ×^;nH1 õ¢+6@1î&9®÷ÎF_áœ@q™Æ]‡ÏÇj8GvŠg§JÂw×–„‰ê®,¶Ÿ}qêS…0ȘšA¶#ñ^ÖEï’±’ö½jRйf0ÜUŸfN|,D“‡†Ç %)‰½ Ý0¾dÀœ»ŒYÂÒÙ $Þt¶ÐèTží0_Ñ픽ºãøê­NH/ÓÔù¥Xá¾MX|_“Ó‘Ñø:õB¸ùE8ÏP”ÂÁ„‹ðÉbk?e†Ç9ú¿°ª/‡ûìÖ+)Q å1Qª;•¯y<ü¬M+þ©÷†YŽôs1Þ"K ðІPQíÙOb ¨?´]5ìü-Æo¹Ão ¿Dc p¿ÍËýoº¨ÖVw¿erªúë$>œ°ubÒ—`OB÷ê%B$?±"çð¼Ukqô”ôîÆ ÿ9N2¯endstream endobj 784 0 obj 3243 endobj 782 0 obj << /Type /Page /Contents 783 0 R /Resources 781 0 R /MediaBox [0 0 595.273 841.887] /Parent 752 0 R /Annots [ 785 0 R 786 0 R 787 0 R ] >> endobj 785 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [246.729 558.99 251.461 570.206] /Subtype /Link /A << /S /GoTo /D (Hfootnote.8) >> >> endobj 786 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [347.007 231.941 351.739 243.157] /Subtype /Link /A << /S /GoTo /D (Hfootnote.9) >> >> endobj 787 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [448.393 217.786 453.847 228.695] /Subtype /Link /A << /S /GoTo /D (section.7) >> >> endobj 780 0 obj << /D [782 0 R /XYZ 72 786.278 null] >> endobj 153 0 obj << /D [782 0 R /XYZ 72 279.729 null] >> endobj 778 0 obj << /D [782 0 R /XYZ 88.587 109.331 null] >> endobj 779 0 obj << /D [782 0 R /XYZ 88.587 98.372 null] >> endobj 781 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F28 523 0 R /F30 512 0 R /F39 496 0 R /F37 380 0 R /F29 547 0 R /F40 548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 792 0 obj << /Length 793 0 R /Filter /FlateDecode >> stream xÚÝZ[ã¶~ß—þ?jб"Þ$*6M&ݦm‚fТhŠBcÑcudÉ•äÝL}Ï…’)[žÙ-Š )»¢HŠ—sùÎÇC‹Ub•ÉUfÓXfvµÙ¿+þ{Z¥o Ž{j£b£ñ핎k­Ò8MÌj­LlSƒý¿¸óÙ0+‘Äy’¯î·Ô÷¾ükô¶¿Yk™G¥ë7]õp³–6r%×U ?{·ª¶¹ùÛýoß|u?M$DgÒ¯+°úi5–¾yaÖì|,kc®ïíúH·°D£¢açü>Š¡À’ú¡;n†cçü7°¨Šª©šGß§ú—[—îÛÎ#ה޻ŒÛ߶ݾ ­CEµ[þªÀÕ¯ÖB'± ¨™œ–s(º¡Ú뢃®™Œ¶í4b¦¢¢ÃUf:j»Ç¢¹K~-zÿäG]5O7¸ r|ï‡çüìNf ¤’0±ö’¸ÿÒÕnpßÃÀ?$&‚¿šI.q’eþ£¡xÂõ‘Œ2m¦»b\4WºÅ”E®«ŸYJª8®])EkÇ’ŽªÞ׸íÀ¥b;¸Ž‹%®œÔ‚o¤MªmÒÎW"s•òT†fzÚP©ðS ÞßÀúªÆëL¥ êìRp"{³ÆË`AN2­ûM¹¤©|—»¶Þ}¹0²±¾SÙ² Q©ŠšvàM¸AN·XΣµàýÀàÙ9°âÆ•ñÍÚ€d/ö=éeÚ¶Œ> VÁ¬HO2Éck õÔ7×÷Ûc}Ëê™dÎÓqùýI£¢>ú¦Q…É¥Nü°w7­¤ ‰…ñÃ5¦QÛSMJ®„-Û·¨´÷¤{©Áêš›–|3GOÂFvs,my6rš+ð@¬&„ïnqdZ_îf¶Ìí±Y:ðt›4[­ó$V¹¾ŽÀ×QYˆXXÉGh63¤ͪf@%›“3¿­kôçš›¦>lp£—ã‚×–‰¸,}Ä€9aÍvÕ¹Õö Ä0êU¡Ð.ZïE3|¯2í@ÉÖfÜ~ 1I¬S‚‰Sc§-)µ°¥»°q.GØš#Õl™æÔoÚ§Ò±R°OØ®HÖ¹V±‚ò:|Ö û÷ãdhÀzˆìå@ùŽ<-vsìúê=Á& ¡¯D3¶ÑûLUš²%ck`Éve°‘-Y¥š- Þ³Íd»KÐc%Tú*ö€¤Ò¡bõ~ÇÈb¢} ñ{x`á—â€xßUÅ੪­Ç|3:{ĸüÜDÇžÀJOM‹Ëþ€³äiÔ·{Ç¥i?ÔÁ C‹Oyöá[+)ˆ@¹hÆuB¯ºm]{Ia(¿—PÂ83ur‚:íŠÞÏPw®(Ÿ¹Öo¾¡¶G×`$ p¡…ŽÞ5Ü­(Ë ås»°»@/FFCW4ýD}P&Áx8½Ã7á# ¸kº«ÊÁÇ Z ôK›ðÈ…:¬³¡ °j(q÷#ÊýÊX6ÎÒ1¸vîŸÇ Ñ–È“ðmGÏÁwÕ´\OÚûP³©~H„Þ`KÀ@Îüo- ” Or\Dí+4 ˜cœŠÓÒÏQE[`cuÝ/Ì~ÚO¥}6³DŽ´¯åJzfQ5ô\ñöíÆfŒwPÃt ç~ŒLPKB=îñoçVÄ2ÏfbÁ`´¥L â0K¦ ¸úªÙÔÇÒ3A%žxøH_ó‘ˆéPLÇ!ˆG¡ûÀZIÔ½õ,“˜RQN"®P½ëº± »ò´Ñ¡ ]¡9KÌ9 ”˜‹µ}_=ÔŽMhðF6qrèk;_ð1Á›ïèõìk86`KnþP »ÀÎåŒö eÏí~Û7¦~{XDçùûÂÆŽ½÷³ÿáÓÙ|:W?%ýÁÀö“Sõ±Ô'ûߦ>æc©}Y-Ú¸1°93¢ö#{º©´ …U*€{¸äã}¢…0o¹'ãP(˜ (Á_qÇÍ,Åê?÷.šUøÃD8¬¦0÷+;ú¹„ßBèÞÕÂcé ¼,MãäÓYŒé™ ‚A ë??÷ÄR:)Øõ+) 0ÿEóüÅ'&aÂn:|9¯Dä×C5£î"ù3Ì‘Y,3 O+þœvì¡í„a74{b²‡‰„‚\|P HôúýØû[T;W—£qðÓã¸UÑ+¢Ë~N¢{{÷ûsr~ê0„۟˜•¼ýÙžQ[œLÆÎTîS&Ö5Ä̵°”è’I |£(4î*`Õgî¨Âuí<[ãŽûåÄð•7X1foxäX;ŒkëŸ÷XFÚl|u5LÃ]Òõ¾Úˆ#Z˸ª,ÐÖÚí=ñá •9T]WàΞù•X™çIÃúaf© 'ÐTÄ™²_ßþáþ»?¾ûÓÛû¯/í¨,{½s祤†N!ÄýrÊú?É)cxÃó%œ ¿8, >Ì[ywËË¢œùdl€N™9&PŸ¤ìSŸÝ”mëÝÀLvhG‡ƒZQ³¡O¸þ*ýóÎaV ú#EÂÁdÊÌTÒ w{¬¹­õ}À6W`w  Þ8õ‹éÀ‰UÁ?»dï4ÓtD›Ù‰J !ø'r‰œh„yŠŒìVú#=I\KÊ´™ ã!DÖº-Ê1]<UãáÔýx¨«M5çô+_oMtUà÷œCNåó ,ÈK çjÃçlXŸ ûØ% ŸüÀ]¡ þ>”3¼Ž ùòs ¾™ˆÞrS˜JÉåÈ¥j_ röŒ •ÜcLë\¦×š ¬>Œ~}µA Åš/á UÊ 'Nùl@™ƒETçêø„†¯ü‰ Å…Õ¯®ÛÇqÂÓ‘Þ/¬s[×q #¹¤ó­}yãh×!—14ÊCÄó­¹O'ª¦ˆHN¼Ú®²ŽÅʈä|àž)è`úò¥¸šÅ©L_«tHBŽc‹À‹°£ÏfùÀÇâs+ªéŠl XÿÀˆŠ1ÿƒµçV`gVp s¬KGŸ>;±Q6ç+ úŒ¢b8#«õü–‰Ô*Ƚ`àÆ'æc²>¶WÊpL^¸+Êà¤'äÇ…9¼2Ã@¼Ÿt\Èõ¸œÆ¯Ï'T¨$eŒWRÎJÂ/(,û˜ñ XÒùYeµ§Ø[ó“žÂ£ µ“æáYºM7ÑJf:‰¾Eµ(kézG7­™çóZ Ël~o Ýýl0ü…f°Y‚1×ú¤ÄÜ7Eï–²oK ü‘%‡ó{–Ni7ŸÜB£K<åZ4F;š6!8ö °šyÞùÉÕºÎm(ÎàëÈ4ϦÈgÞ“O—wô‚‚!:ÉÀ dˆÑß¼€T2ϱš|Ì4KéÇÈ[ÈÈ–‰¥Cð¯–Æ±ãy?ñé6냢 ©/ÕŽ¼’ùè,„Ù`Óø2Çâ_æ ¹˜f8Ù;6>ð=ÁåVdÎW )LØ“þ{Ï ßzTÊlœè3÷¯NåùÕé”zlJypžŽH^ÿMU.âPŸ`èÅÌ‚ž2 l86ƒÚs ãO×î<1–RÒè[&~š¤ß]çÜ×õóawÊù}ý»¿|÷.þòÑ7]dýX¹×³~˜Ë^Èúá-ÂÇ$ýh\ÿŸÜwÚ—¹Ã)ï/ôt‚Vùwíóf>-ÌÌïæV‹@4…DÐð¯ÛÃó¤ákÜ_AÄåðP‰xâ‰(ð g+ãó3ÞY@Àò941» ÞïÚ#%Pà&ÞBO䘃)>E6ÿ-Oq€Ó!yÂë$õ Ÿè¯*…;[Á2X È$“À¨á©°=›£+`sÿZ)9mŠ€(•üÛ-èÖUÉ%Wt°änéŽíÏ|¾÷¹”¢)ÝÙ¯@&C%2™ž‹ãº}Nkß»úý ý åêiéûj_ÕEÇgªÛóLêøµð9}w’ŸÊÀǵÐKÖn)=±F“'ÊWˆ¸½dâŸÝéÄSp¼c‹-‚;|œøm\f,Ðfò©ÓK ‹päqV8O˜‹ŸÔ¥àÈêõ¬àPëÒøüs­øä5ý&J ¦’ÐpŠr: £ÜÅõŒ¨á>¥}õwŠ 9™Æ¯&l¥±¯ž`´¼º’±”/dÿ nd“endstream endobj 793 0 obj 3203 endobj 791 0 obj << /Type /Page /Contents 792 0 R /Resources 790 0 R /MediaBox [0 0 595.273 841.887] /Parent 752 0 R /Annots [ 794 0 R 795 0 R 796 0 R 797 0 R ] >> endobj 794 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [206.657 748.292 212.112 757.989] /Subtype /Link /A << /S /GoTo /D (section.7) >> >> endobj 795 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [423.502 364.272 428.956 375.181] /Subtype /Link /A << /S /GoTo /D (section.7) >> >> endobj 796 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [93.818 283.583 102.784 294.799] /Subtype /Link /A << /S /GoTo /D (Hfootnote.10) >> >> endobj 797 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [104.977 77.771 121.36 88.73] /Subtype /Link /A << /S /GoTo /D (subsection.5.15) >> >> endobj 789 0 obj << /D [791 0 R /XYZ 72 786.278 null] >> endobj 788 0 obj << /D [791 0 R /XYZ 88.587 81.059 null] >> endobj 790 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F39 496 0 R /F28 523 0 R /F30 512 0 R /F29 547 0 R /F40 548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 801 0 obj << /Length 802 0 R /Filter /FlateDecode >> stream xÚåZYã¸~ŸÉ_hä%êd¬•xèX`f'éd²Ç›ò l‰n+#K%wóëSÅ*ʲ-÷,ö!Á" Mñ(’u~Uœô&éM.nò"‹E^ÜTÛWé ýûpZ_AÍTZÆZá×'&®”.â²Ì ¡b%óëó¯ÓHÓ8-íõåý«ÏîD~“&q™”7÷k?ç¾þGÔtãíJ ݧ?Ü9kßöÛÝÛq¿7£ù>ÑÉ4øöý7ùáíŸÞ|÷ûoïÞS÷o«ªIéí?ïÿüê÷¯V:Îa—U§° ÝN˲¸qöfýj¥d\è›"NašÄ¹0¼*â<ãþ4‹‹"§á#w’Xeòf%ãD©é~R.ÜïÏöÙ]ªgcÀZ¡xï®pF¨aÝ4oº¦T±™àmÓ¥s¹$´WYœÂúËk†{\‚ŒÌH‹é'g ÷pvÜ»n¸]É$¶vÛ»µÍ0ô·+QFUcF[SçØã¯ˆÆ¥Ž Ä ³Š¨šÑÒ`eœ©Fëè«c+‰†Ñí+ØÍ¯±£€-hŠi[Ü*‡•¼ôu5­¢B70 μJQø¥?ûÃ-l| Ÿ(aªâ$—|Cб?Úñ\ÿ޲9aKšæ caiï–ˆ‹XÙUâ_ÞuµýøÒö(ÅLQ ¬2‹þj«±é» “@Ájµ.§ËƒD±?Ü„ÖW/HYƒÉžMKÐuÝg\§†÷ ­¼B©H!„ÔÑpF»½´V2ÏãRË¡½ë@®¥ÞÖ^E éµªÌ"ƒò|Â?}SÓФ‘0ÜZóUG¥"²¦º…ÙЬ 4ˆæôk&é­IapDÒÏž>u¬÷ç7êa©¢aÓï[ÞøÁ+¤åy=jhXìUzYýüt³ ž|*)邞KÍ@=agby‰{Î&˜Ø4Q‘QÕöƒ ¹Ñ6ÎxFÉ”mf’í`ÛuN,•j"Ét$‹ïõ¹®¬d!c•à{d, ~üWâÆ[¼è×ÍÃ1^2TÕÞ¡Õª4J¨¿áñàÚ=1Ýoxƒ§[ ΠÝógÊ«ººÁ1,mUï]Ó=.á°Ž€S‹`³LåÞ¾„2I¬ Z•Jذ«í¿ORÕZš;qÚþn<Ï~4Û†.’©"z³ö.§mȧñ œšyƒ § ‡a‚¼ëåukÜäùÀ^wfÜøp ífM–^7¿°Îv¸ñHf¾vý–Æ&‡QÛµÙ·#­ïยóØ;¥TôµÆ×'>B͹‚KÉ¥)rKuÌj£2—Z“FŽˆX Å¢òv•¦BEƒ@éÚ¦î่Þ?Ý‚ÿ ا؛åÚ‚çw€#š,í /²I¬!¬áNc nqÁ%Xqž5ßïv^»{7Ø(¢ýɹ ؃&ÙŽgyFgÃ%ýºf烑b‡£)"¡ãaÔmø,Ž ÙNpc˱”í•Aû“ÃAÐdV°ø²”ʇ(ƒç=ð`í¼>wôÙó/É L}`:‘á10üfÜšÝé.Eôh;ë«Á1µN(XAÿ³kF’[–ƒ:B3^¶ùq?:÷¥n;Ó="‹Šœ[Ä5h<¶‡Ýæ7ËÃ5MGmA®Î|nêqã¹YƒÁ,¨üI‹=À£fk» ÎðWÅÆ`Gš1‘g0PéE3΄ ÍfG–ó¼±å £‚þhµ2 X¡íMmëÏÏc2î a)É>™B¤™œEÞŸõ«ó t¬´þtN‰ÓÔ<¬g Äg¦¾`àÓ<ÄÇÏAXÀœ°Â'àîÉF!Ëh¼§IHP[› ùöôjà1¯ªÐÍ/l^Þ0 *]w·…Š˜ñM·îib îD˜ r–Þ ù¨33$Bº@×I¹ªýÓ-ÃG]’XaG´ˆU÷îwû–—zQëâD1ÛõUèÊA½Á§×´î¹ÑýëüdK4®„.ާÚB„°ð‡t—{¦^êícó4qêLk'xxÌõH 'ÖÚëø4Š<¹ðTÆYª~Z"ÌUE…ÌMG=Í É¨EËs Å.-à³ä½Om•^DØ@ÌdŽó4ÎuÈ1K9$´TH!¿X"!ãlÊRÍ…<ÿnŠæyÎþµ°Œbè~@ ¥Oןì™aVò88B·Ä)âB/\Zùtªw“=ô]=œru˜©ÔñiJêóÂËïÑ™úpBß°>Ÿ€)Yx‡³ÀiÄ6“÷Ú/â$ 5¯’Ã6öGG‡[ž«‘ ѧEà´dÄn…œÏœV¡#„Õ¤ßP¬õÁB`’0»¹!œÁDêIp¥ >ªdœ=> ú*†›ì£ Ç¸~ïýs)BÚ ­sÿQŠ#ØGð,Øž0'¯^N^ºÂ|Pösú¹##<ã'!ÞYp¸î£ ¯MÁûü||Ô) > §E¬T: §äˆ­êB¿¤ÒÈÖKµ†„_O9ëa9§-³—<x°Þ|±lB„c :yß4¦éèæIœJù¢gÓ²˜YÃõ—m¹p´uœç IJ݆ Ñå©ã뤜¨¯Ò'ð‡Úæ±ÛÚùlÜ@”[ÅdiØÂC㔺ï¸ç¨÷hk”6ÌŒM”âHïtðëÄòâ…ð¿™jJ§v'õ„DÉîfu£OÚÚÑÀ„ˆušù­Þàý㘠È2у9Ä(¨‘B:xs÷ 5(áÄlUdâðyZþþ0óL¿±kÂH ’© —üü2óÑH6Öíœ%¦ùsÑ/eÜÆ ;S-A§}׌ÃÕRÞ·=h‚¥2nÌxæÿlô¡ÀQD]Ïj8¨óuúJBû0õûu>CÊQeJ6ðkçpï­:z7r̸¼ÍÆ ”›úÀ*ô¬{ˆ?È^¨Ï'y,Ó`ú×ÒtQÄ™ °3nÄåú@[RBÑîTk!XâI—9 f† ߬n†jï¯ALÀPªÓÀÙøŒWEÛžrbÒ0 "ìÌ«ïyÈãðÚ*Md\¤?©€¡çœ*ØV‘—?¥„©Hýï”fÊ'™œºS: W î‹3Æaò'Š+N4c¿‘¡kö[ 2®ö‘Io<ÅàfS|^ n–ú™;ÍñÕÉ¿LõŽlF_VIȡ ×YÒ(v¬£o×Õ³ÉgÑwý–¤Ï¹Ò…½NÀ­:ê¥P\+f/Çve)—νeàŽÇá8 ÄÙr?•Ñ\c‚¨?@ÞÀ5yC}³Ç1_Í_Óú2Á®Ê“J+Œ ²™\þ°B…>¬-&dS‰ãâ?ZxÒY%V¸ñ¹¤ø³i÷ø †Tp¡ú©˜aBûcsôo¼‚kŠƒÇ)šk´.L 8D:ôÝÀ” ü}!?0¥ˆ³$Ñ0ž矚Ú2uC?¡žÏPßÂEœâ«ñI&è¨Üj?îÚ¦jÆP½…”‰®ËàLŠ‹ÐÂ3¦²m9{(ÐÅ©dÉq·à7 ô›Ÿ×낼a([·š»ÅÀ  õeiz~]x?þ‹ÄEådŠ©Y ù'ë»ëèÏfõE8 .¡ÈIˆê'ÿv!âøendstream endobj 802 0 obj 3305 endobj 800 0 obj << /Type /Page /Contents 801 0 R /Resources 799 0 R /MediaBox [0 0 595.273 841.887] /Parent 806 0 R /Annots [ 803 0 R 804 0 R 805 0 R ] >> endobj 803 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [430.559 694.403 449.953 705.312] /Subtype /Link /A << /S /GoTo /D (subsection.5.18) >> >> endobj 804 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [156.414 245.282 184.293 254.979] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.16.3) >> >> endobj 805 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [263.683 218.184 291.562 227.881] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.16.3) >> >> endobj 798 0 obj << /D [800 0 R /XYZ 72 786.278 null] >> endobj 157 0 obj << /D [800 0 R /XYZ 72 559.575 null] >> endobj 799 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F37 380 0 R /F26 391 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 814 0 obj << /Length 815 0 R /Filter /FlateDecode >> stream xÚíÛrÛÆõÝ_Á·€3&ì—¾¥ŽÕªNœŒ­¤M§‘KcPЊúõ=·’’Vv_<š1÷röì¹_ŽüÅ‹T-Ò, Uš-Ö‡ñ‚ÿ>,üè ¬1¤±:´gO®ŒÍÂé ¥ð÷]¹w<,;þ½q•kŠýþ^ęġ‰Ó‘875 tbbTu‡ŠbÁ¸Üºª•!* z[/·÷¼RnDÍåºØóÒ-!—4Ùò™?:¾Ãe¿±kœãá¦l»²Z Qhs""'®‰ÔºÛÍð¹=‚ÀXÞZÅA±^»[4uæ)®B¿äÒC2øÐI.¿D±YÓI Ï˜(¸¼Ûz¿¯QRw„UXtŒt ×€QiÐ.⃠PŽ#’Û97­g5 Ò¸š-N% ¸Î"q¼Z’v¥ã8¼ñ È!~wt5‚S ÇU¦ Gla8º-šâà:×´ø\+çêqA€„3H‘ÏPö'éï.ûûÖ ƒeKÔyå«ò nkBeÔéLß°-@˜I³ld iªÞ¡+èÛèô½ß£üp|Wr59m™Àcmžü¾–)ÕaO}Ñò•R´Ã —Ãͱž¨ÝÕÇ=’% w#°x=<åöغ0 ñ"·jÄ0±²2©ºI'•É„Å܆Ê4 Yà§ lr?)N‘qÄt ®­Múxw§ÂÔèù+FÙæ¡;À0¢Ô#Ô‡+–‚Ag Á}`g™Á&`ØéTû¢ëÐë”͇FÓ»Û{ê^ Ò[Ë%À¾<}àâ°Âù¶FƒF ¸.–4@Ò VÛš1lJº¹hîy^¨±o}ë(zÈôZ }ÓÔs(ˆÀøŽZ4£2%vÐñ<é£“ë§ æÇªn!轄ÛLùò:47YÌá $°©ý.=Td¾xÎ(.XÒÕK| ±ÜÅÃ:U«¼nÛòšÊvÀFr€-æ·¨nÜgI?µ&9‡ËlRñüC&5Ãå¡Ül|Ç@M# ‹Z°_y{1äõ±“»N{Ì5Lµ¹í5îPs¾â€ºü·Àlœ˜}å(Y/º"”•b¥’c¨Çra¥òPÅš¨·P‡-¡öôU}8±".+4ÿr”ŠbR¨ô–9&Â%ÝòÇp¼ÚøÖ$½sg¸lÍ%ÝìHÆíñºuk¹ÈX`§]7åuÿƒkm}@fM2J͆dX"E*ä,A‡äÍÞÊ&[î 0tý4жº?Âå3Žu5|Mh«‚´°nãà›‹ïyƒ¥¾²†TåŸ_4\ÜqÂÁcC.à X]WRîƒi4T(#'&¬·8ï~£ÇƒµLÉê`BÄ9#—â羸€!e2ÁšÍfWô}»˜+ã§ ÚaéÁÞÈxüË„„®<à›´úäÔ’®˜ø¯Z^¬ŠƒlËKÞ¾®n8äYÕ£?´Ú³‹››4s÷èUçÄ˽CïwE3¬ ¶>7õ6;ºP“ŠŠ6¤ÉÃ$6Ïcú“ä{NAø¥j¼ó”¾à2RX(èÕ¨GßpX y>ü4&•ø»ûæšÆ¥0àL@¾J]`qÄ0™7B^´u5£Yyü¥øœ*ΆÉWZÈ,‘Èzܰ2JÙ0—bwÜÜw;èÎa8è%€«ªžÿFÖí)no›ú¶)‹ÎQb.Ë-S‚å@·ó^Îèõø ÎM-ß>¤öjj˜DÿÞ¹3CÁ—Cfåô,ÇI&{ñ£7QùgœÎ'­OC7œÕîß]‘tMU!uª…Ð4 ó8Š}¥âPÇOÚ™1Ó{”V¡Rø?…‘Ìendstream endobj 815 0 obj 2620 endobj 813 0 obj << /Type /Page /Contents 814 0 R /Resources 812 0 R /MediaBox [0 0 595.273 841.887] /Parent 806 0 R /Annots [ 816 0 R ] >> endobj 816 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [179.666 149.485 199.06 159.182] /Subtype /Link /A << /S /GoTo /D (subsection.5.19) >> >> endobj 811 0 obj << /D [813 0 R /XYZ 72 786.278 null] >> endobj 161 0 obj << /D [813 0 R /XYZ 72 332.868 null] >> endobj 807 0 obj << /D [813 0 R /XYZ 72 266.745 null] >> endobj 808 0 obj << /D [813 0 R /XYZ 72 246.35 null] >> endobj 809 0 obj << /D [813 0 R /XYZ 72 194.615 null] >> endobj 810 0 obj << /D [813 0 R /XYZ 72 145.002 null] >> endobj 812 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F39 496 0 R /F37 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 820 0 obj << /Length 821 0 R /Filter /FlateDecode >> stream xÚíZ_s㸠ßOá·Ê5—â‘zÌÎ6ô®;}Hçz77ŠM¯Õ“¥œ$ß%÷é ¤$Ûr’vÛí\&¢HàNºàð—.ŒX›1aìb½“.èï§E}sD©´dZáÛ3„«H¹’šÙL#ýûÛ7ï®E¶H9Ëy¾¸ÝzÚÛÍ?Í`.]®ÒT§ÉM½mÚ}Ñ—M½\I«’mÛìit½Ì³¦¥Lz$[}(×HW´ËnÿòæO·£š)­«Ô0#óËâ^V!MYj©J¢›Ñ×»¢]®´ÐÉoÓÿìúë¦î?{÷=לʺ§.Ý|€…4J R`»!…§ [2™ÛEëÛ7+%™Õ‹œéT.¤e©3Ëð½4q!͘µ†ÖGsp¦2 ÇÁ2m¤œÑè…{wêÉše¹Pa‹:œ°€#ÓðÝ@7è)“Ò QLšÍȹ’LÂx•1p=£ÀÇÈl±@‘ÚA#Y£·»²·ÉE²=ÔëàN9OZ×ÚÚ/¥I¿s4èú¶¬?Ѹ¹{éäŸnÝ“’G–Oó”å™§Ì=shš3YðáqG yÒ—èțёÁÓó¤ÙÑ(ßý´Nܺüž§Êmp?8%×슞“ÓV/|'UÒ´ø”IAÿö[¿¦$bÈÊ-=i_xn–¸ÁrG\ëÆOˆ¤jŠÛ0/ 4GãLd¹õl OönßxÝ`¼õ2eyØÄD“€R~z0Œý†@Ñõk—uü<®N œÙ¤¨#£]s¨6‘õ<„H~˜¾£S lZvF—;<TAÇãÑ º–·ð,¹BÞà60ßùóÂuSwî烫×î-îÈÇO'Jk1* +^-x6uõ8²é‹Á¸qpžŠ^W9= íí…êpRDbUåwÍ uÁÄ}¹w욈?‚ÿ"šªêM?hÌýЦ¯húЦÿy4-öeõøÙxšCynŸÀSóžZf²—À©d\©¯NÕKáÔ¼N¹šº—8åÑŸ€fpg?§xó4Zƒ½gŽ-ãLŸ*Wãž—• Ô)µTs¨pŒ2ýúU¿âéW‡§A‘ÿ+@ýΕŸvýgƒiþ ¦Ÿ¦ÏÔ¦7pèÊÚ<ñÅû¾[Z• ‚âœÿ4I1¯¬ ð‡ SÔ£µ ôY@4ÁæaGü¬ G “¸…[„°G~­»o]V;bSÌÄÁ/HàÚ;@„fi’uUtÇ×uìŽÁ¬‡bx†X±G Û!Ü=Iá?ÊnMâ…8ì][BÔÑ×?Šp=>@i‰J+%7aÇuÑù­òaï"¬¸¶ô<ÏJ*ÍY–ÆdãAþÜóDÆ´4V 2ˆàÇ%y„¦‹0  Ë„þr0°…´âœ`à¦/ªr}UªÜ+üo±€rºÔÓiã—%8pQB>¡BA ¦ô¤qv¤urp5ÒMƒKS®î÷ ’sb+ð.è ˆW î‚1¤Lò±BÁÅÍ‹þ„ýÞ5"È9xI€&®F^›¾UÑ{ua²oÂs¨º*ägJã6¨fÕPAuXä6¹;ôD@UPx-˜¹Ú#€õèsîîê&wú>­Ê»ï’jÃ|â^s§­xƸ•ÃI€éqZÄÑ7O¸ƒ9e `$suù7ŒËÜйÁçÉUJèsd«Á™Àç&oûóÎ#½ÜQÉŒ/¡mOÐ^BýóHµÚ`4*òP;ú*.L¼ä«cÊði¨É²ÁšÚÎ[Sñ”ñ¼Ÿ°¦"E5é„dø%hrB»%¤ƒŽ*ö1åˆ*¢H~smsŽûJ‚RÀ gFe_ùL¸ß]—nó·²_ï>»C)ÿÍ¥zi‡Òþ^ŸPýè–.3^©a‰?u„ùC¸Av÷Åš r¸V´mèšÛ´¾$¬hŠJ¤!—l£+ßJ1Pž([„`™²_Îyß¿o¦Þ‹î‰s¯½õ¯£·žµ ¸6ƒb;h(m4‡zzB6ô „Ó¢öx™òñ«I€·rãB•Ú5³¯øg:¤a“¥“ŸÌå8;0Q1âywì¦ñØÛ8SÃD5|î <ì9ÍT6 ‹=ŠîPáJ`´¥IH„4±F>pa/Ö½kQ³¥gA´c÷ÈÙº@…Ù+Ü¿ª‚+ø²!º_Ë~G„ LÙFY¶®ÅF ­·¯hn ¢y]Ü©ÐÆ"UÈà䋳F3:3ËC ‚Az…šbÓf(nñŒ³”ÁêEq< ƒG¨–uÙwÕÌ™ïƒ-ÅP˜´ÝŒ+ˆL3Ž·/3790ZýÑq† Ä7äÐ>\â+ŠñÖl¼­ªltí }3–-:9Ä¡=¹Gn\·9úz#ÜŠaá-MÀÞñ£¾$ÞU¸?õ[âvð1Ì,jtòè÷PáŽ~o0|7ÔW€ ¹‡fÐsñÙG¾W×¥A9ýdW„~E†ß⬷±‰­Å6ò8á>ɇ—:Ž÷-œV®½o´ðóN‰…¢N X+tf `Þ0p@‘L#GƒceŒ¥ÖÌŒÿ䯀5Åv?çAˆfErÌ»£„l385»ßÏq{7Ã„ÒøÀãîx1Z!öVáð¨“D½ß“úa3¼1Ïýו€˜‘˜¶žÎ7JŸn! |B_¾ý R*Eendstream endobj 821 0 obj 2074 endobj 819 0 obj << /Type /Page /Contents 820 0 R /Resources 818 0 R /MediaBox [0 0 595.273 841.887] /Parent 806 0 R /Annots [ 822 0 R ] >> endobj 822 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [478.083 291.566 497.477 302.475] /Subtype /Link /A << /S /GoTo /D (subsection.5.11) >> >> endobj 817 0 obj << /D [819 0 R /XYZ 72 786.278 null] >> endobj 165 0 obj << /D [819 0 R /XYZ 72 761.372 null] >> endobj 818 0 obj << /Font << /F26 391 0 R /F27 394 0 R /F33 497 0 R /F15 393 0 R >> /ProcSet [ /PDF /Text ] >> endobj 826 0 obj << /Length 827 0 R /Filter /FlateDecode >> stream xÚíZ_“Û¶÷§Ð[x‹&€ Û'»íeÜL:y¸¶M§Ã£ Ç©’”OJ¿|v± þ‘xg×ÓÌ$sÅîØßîbubÁŸX™xeÒ$ŒMº*ö/ÄŠþÞ¯|ï#J¥e¨~}„pí)×R‡i¢‘þí݋׷B¯DfQ¶ºÛ:Ú»Í?‚¢©»²ëm}› ¿Y«8 ¶MK®Ù[ìÅ0YÐwáÍ?ïþüú66^BŠP)É{Q•÷D5“(eÇš‰ZÛÛº#1ýÎIAYƒè}Þ— m­Dt}ÓÚŸ¼ ö:­¿„ª<‹¾³Õö|¨8èʺàñw¨Ñj-&I <£Ìé’wÝ÷)¥†åØÊ ì¨Ýƒ|ì©«ƒÂÙ¾ávg©ãTJƒþ+^¾ÉûÜØ‹?ݤC¥5\ #“<}O_±¡Hc2wµ³ëðW»­šÕ±îÄ¿¾¶ý_ëm«²¶ß5]‰‡ü}¤#"(k¦¼mêþÝaBxµA]ü×Éf²C™¥«Ö®¶/ÖJ†©^e¡r%ÓPÙõ4¬—Fñ„HÂ454?ÚmªDÂÕ„‰N‡­I¹°µÛûJÃ,V<ó{¸`g§…é†}ÂuHiðvŒHô\ËPB„B¨…}ú}#“Õ: ‘>¾»šFc>ÖÙ½ÙüpÖ…4G4~¸Yƒ)òU"E4[¢ä%€`$J[”„’ž ‡¾rVá¡ü€£¶¦Ï’yâý*DéÚÁ)šáhSºäíù&ÕAx³62†:fÁ‡yuäOÜ·’‘ƒ~ß»ÍX,Imp„ÿŒñŸp—·Ý!/˜Ù±.Ñ3@ú–Æz/xÜìTnÝôÄ@²±tZÑ@t½=ºÔFÊÁµ gÈkûäzââz¯ÛˆšÂ¯¼§Kš8àD’Àí=§®¼¯˜È¹hrP].zÉá¨,4êÿâpÀ΋÷µíºÿÚãÄ¿yœ/àqdM<ŽL'?(žeèGÊÊÝ 9Î"O f_Ö¸: ÚcÅSd¥Žá u@£cÖÒhDM¹½?¥Ž((Ã(b÷Ÿä#¿òóa<'ˆtù–ñS‚Ò'Âé%BcضõCS”SÛ2æ-v.êÏÀýˆnª9Vì/œ¿ñX7ëÊÓN>p9ïÜòãÓi˜Cf¾Š ð­„Ì—„â¿Ù¶ûœdá…®üTèš_6tõO]‹qB@(Åhá. Ê÷­Cö·m³§^OôQp‡¦x>xÃC‚‰|á Ï£q‘ƒ­zˆ«8uØ[HÏÔÜÙÖÎdŠQ%“1/uq®È1¦_˜Àª‚}^ç>úÝ;L\¦Ù£ëhQÊÿ<^ÒŸ/iú²°¿Áå—¹T¯,¸ïÍRf#{½'½sÖ6 ‡5“,¾µ2øº:vÝSÔv‚u~1ø"øýðø÷rÓïžDà+ú‹=±„Ë4|•ãs¨LµøTÆ¡ú×’:\‰á—½Å#Þuó¢hÚ3d‡ †õ~õ›ÛoifV2á(&Ï5"£öòñ‰áñ˜¨„Îe, ÏÉtYåL&¼9=ÎrD/=tË*‡ÄîÕ,%ôd£§@!pâžÞD’ã‰d.ÝT"Â<g.OPÈÆ):$$Ý7Çš3Süö,vM[þÀþ,¯h‘튜kû±è¸å¼|à[Û͵à ÛÕvœbÀ¹Û•[~Î'üðOý;Ý­K£ù¡žÂÖÝÎqÂvì‘ ~ÄÓZ3®-Žmk‡­Âm…ßXp¹ )b.êŒ0å'¸*`¨’ºZ*æsm$_ìÓSøª£AÊóáØŠ‡Ô¿AÆ'ÔI™àMÕ5X{H¢‘¿t¬4-ï6So˜µÛ¾÷ùJꀷaáº8+ÁýjO’§¦óK>E…`Ø{VºSxQ+¿ÚüB%de¼øƒÂ‚ð ­!\ €BE+Î|M°ƒlK.ŒlhŒÔ™†a2[ \dPʹPÆÉ÷+ßûæw¤C}ÅS†™zºÌþ4/ô!‰Þ{R—ׇ”@tM½ß^ˆY£Ÿ‰É ÉK|‘Ok,£G æÁ$LæXõÓ3ÃßDAw¨Éæ¾PŠ„|!:-_v” />‚ÑœéË91h÷hrc¾#;0ú")4zšYv”Ž@—9&è"5×ñÓ½¤y~Á€• £4ý<«"Í]¥³0ÞÕÌžw9— šºâçÆ¡<Ùj=ì>UÁ“ã†LÜ™9™†‹кs€|¦­éɆ”×…Y$¢ZDâßÌê%†ÂNÿûh;ô^xU&©i— qV€Ý .ó:9·RøWؒ˾p ®4ËP³ý¡;C÷+]Šzú"¾ž^~Òp2]寢M¦ÇÚš§À»Üž¹B¢)£ÀNå’ÖGª;òÝ.Uáñê Æ^ ãY·ô=Éó1vA¤©m Ó&÷Q–Ê20•Ó‚CÛ<´ù~Oþ'ø±ÒgüHåÚ¥}|E?Dä,azª¬ÔÖ¤I.°æ¶0û’¦ ª°Â²PžÄ_âªŠŠø\‰qU™cÑÏìgŦ_—‚GÖbþòžØõˆæwO•`ÒbÃgÕ@‰ÁGBs>ØÝR”å­^›Æ({2ìgyè¶«êô{8º¯_òPóh9z;ƒs½Óú0ü¬* /_/•“G¶çOb{^f;=OþLËäcÿ„Ç"”mŸ“*¹”˘ÿMæ ?+éßïendstream endobj 827 0 obj 2516 endobj 825 0 obj << /Type /Page /Contents 826 0 R /Resources 824 0 R /MediaBox [0 0 595.273 841.887] /Parent 806 0 R /Annots [ 828 0 R ] >> endobj 828 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [251.484 314.898 265.424 324.898] /Subtype /Link /A << /S /GoTo /D (subsection.5.5) >> >> endobj 823 0 obj << /D [825 0 R /XYZ 72 786.278 null] >> endobj 169 0 obj << /D [825 0 R /XYZ 72 444.487 null] >> endobj 824 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F26 391 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 832 0 obj << /Length 833 0 R /Filter /FlateDecode >> stream xÚíZÝoä¶¿üû9¸Õ‰_¢Ô<å’¸pƒkž>4EAïr½Âi¥>bûÚþïጴҮì; @ ?,E‡3üÍC‹UbeåÊfi,m¶Ú^‰ý}X ¥Ÿ Ž$µQ±Ñøõ ÁµVi¬ÒÕZ™8K Š¿½}õæZÚ•Hâ<ÉW·» z»ý{TTÝÕÚHõÍã·Wk™BñÍ7\u<ú†ŠMq¿gÁÇõ±n‹®¨+úþæÍÕ?nÿêÖ'˜Ÿ«}ú<µOËj×ÂÆ"3åÿ!‰·ok˜2½¹f¶´µ±Î‚ì ¨SIm\ë±”GÝÞsÕ•´ÑÞ5nÓá|Tb£¢%™ªî¨ÂW›¦ŸE[¿¥^uC¿UMß]¿£Š­ëÜ\‹»‚Ž¿^™4rEéîJÿê…Œu¸ ŠkzäÁâá«sEUT÷¤¬®Ê'*}ôMÍša„Ë=o|×7•߯¡M¤qŽN0¸Å•Ë,Fî«mFf:TÙq2(„«™…I5‡-ÚrõŽ~]…¿&ò¯Ú`6¬†åšÈ•=´wíiHØN_‘Rw<–©ÔQW“L7ÌoÇûÀ#òH¿ô¾EÿˆÖþ¾¨6ØÙâ†CWßð”l%±ZóðÈ<‰ÚÒÑa †çhéÓ5žëû÷_Zµà¸èÊàÐ eytðŽl…ÂÝÞu4‰ºIèô‰híQMÝûü¥íØ fÄ`¬Ñ~:;·ŸI¢‡¢,©Ä‹§¾'/YkaÀ'‚AjøÝ%aÅ#‚‡~é‹•h˜uq`uþñHÚÁh穾eƒ@‘Ì ½f®ýzjFÃì`ÊJáÚº²¨ð ª4: Þ¾í¨i\RáÄ´ÅÖ7´p½÷Þ“s(l‹vÓ·äAuEZGËÐQƒG'ïàL_ýx;"¬|IÓ ¦–RR#Äb=¶~X ¥Ÿvϰ‰`×ÄBœky¬rý<¾?¯ æ(†¹7¼^%ØÖé®ßR&‹¥V3çªw(¬`ÏŠ6>ŸÖZ¥*NsX­ÒqbÓçÃÏó!IqIKûŒXt+þùGß½ï0Íߊm·FM£Ìu]u7?¼¦ x‡6ôzM¨Dl¥YŽL¥¯¸wY£`©=º¯w»×gƒ}ð žò°Ï¼=kª-„§&ãè Kf«Æ¯v¯ Ç nb-åJe±j©4¦s 8T–Y8ô$Ö© ¸`r5n¢R ›x½³8—úä+ɰŽ3`%ý&>ÅkÃsáJ¬H&ºV±‚ò:¯Ö +"óXb,b’ä¿¡#!3¸ô$¬ý½;’ý¿#}Ž#‹R‚„°ã:ÁXO˼¢ãÈfC¼J±ë« BcKD¤ñÇ„+”èH‚9 xF}8–þ0o¬gB€º“0l7A•EÛ…½°hÔ¢¡ÚË“V' šUl\Ird,9lú¬c¨}¢ÒÞaÇ“õTô°'Ú*áQ–ãXdjh\ 6ÀÏË…LŒ¯” ç¦õþ<̦Yp\<¢©Î¾„Q˜ B¡€Fæ_J(.‰@–¾zHK£;ø~÷ãí_o¾óçë¿LQü‡ ß´7Õ®þR·¬¢~|@ýÏÀ¸ù\Ï^†q¼ÈëDEßàý˜>Ú¢ëŸ-Èó‹­NÄébd °S€3”fˆÃ""nh£ŸûòéÈ-á&¨ pjüö4¨íöH©Qãô:Š6ØSa^à8ÝRŽ•ˆu ïÿ ’Å~؆ð…ÒAd«ÙÙ*ýŒµx`NVžm°À)IÁ=öÅGÝÓht[ä‰:úÕo ÚÓ'E­’iúbèÁ! ®:ÖIzvòà¶rpã•þlEp뀛Ç$\.!Mãü(·U)m=D<]…¼ ì_Q-!bi%wìDYÜÅûýp0ñl“˜kÿpŒp¤!¯u›—yÏ#)ø.vOG¿õ;†¦`…·úAú锩püoúqÙº»;ή-eö‚–ª? ζ/K}ƒ2Çš¥ÖÓy™i6obá’z–Ô#Z+8ÝÁáú@98/ˆÐpn±ÐÕô{Ê$Áø_G©=I|$I.ƒ‚UÔWE×Rí¿é‡¸–ÆA·fkJ®¨XEŸ»¦>&/73‰K'`2χAàu¹QpSÉÁ'g!’!IJÀöu¨5#ÅKÒ€‰  "llõ0"zÄ€260Ào½ Š‰¾Èw¦S°ÁOÚ é94ÃaþŽØçiÆÜt:æ4‰Žót~SkëCÈ™À–ïwÜŒÄ׳)__Ú÷…tÜàûK`‘Ç67S¤fÛ÷„Eðœ½vÌf5Ô1©ŽhW†Lµ[.vŒ²ÑÍŽÉÀÐ:cÍK.”Å6Ü(Ï’A¤™ülÛâ+ߌ G ^L)% øk³é¡N^/í£"0xÊË;ˆ1‡óɆLU¸æ@‰òëe¿h¹5„(ð,“Jx´4.P·t:®¤¤ þP–³.8™ÛPm¸Sp¶Mª`£Ð|?¸¦ ¯OÔ.v˜{,>ú¥ ²@¬„þŒ&ž; A6¤P–9$IÁÞ†0˜dü–dq&†K)øµ6 0ÄùãÌ=ÝŠT.#ÿè7==é¨\‡ô"•&Û‚ŸC5žä² 6ÎÜuþHõwÙSíCÐ+(öTØ×Mñ‘ì!• u¾Ý¸#ÝBO·÷0*OkvØà˜±_Õ±_§–#_^¡áý™‡Û%ÎIâ,œléº1_ÔÔÔÂêrX§k:ª#µ5Ç,j¦ágò´ïX9ÐW˜æ b/ÞxÒuµE#d4üM–T–Ãc`B/œ$º $œÕ?#D­ü>T 3Ý|K_¢´9œ]!£MFêXðÈHœÉµ†¤TVþ±ãeÏn­´€‘Þ·ú6€5 O»¯û’Ù%=B审5x;”(þuç|ÈÆõ-+<É P·‡h\¼Õõ]$§ÿt•éèåç=%R„§CKE äº«:Æ ‡Ây|çO€(ÂüαPíä ?‡€'$ vöIèÓ˜[8ŠMqd@ ý ˜=]š™ÿ{p·!‡ûŒåsçz$êÇcÉ ±÷˜å†hCžòûVYâõ ®.´wPÔ„ä ‡Ä× `LT:jKÏP#4..G¦6ÎÆ;ŸÒÚ–AXÃÞMˆ¨:Ê||FeøMd¬ó9ɯïÀ?©'‡Ê•KƒOí‹û=5ú¯ê&äÔ´ŽÞöìÃg#XvéÛ–¸?¨©ÓSäàÏS?RòÜ&Ž={¡ž^ Ýƒí¤‘Ÿúç ìD…8ôb¶@Ûó!¤’±”æùlØä§fgendstream endobj 833 0 obj 2678 endobj 831 0 obj << /Type /Page /Contents 832 0 R /Resources 830 0 R /MediaBox [0 0 595.273 841.887] /Parent 806 0 R /Annots [ 834 0 R 835 0 R ] >> endobj 834 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [410.849 631.362 430.243 642.271] /Subtype /Link /A << /S /GoTo /D (subsection.5.11) >> >> endobj 835 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [140.909 460.239 154.848 471.148] /Subtype /Link /A << /S /GoTo /D (subsection.5.5) >> >> endobj 829 0 obj << /D [831 0 R /XYZ 72 786.278 null] >> endobj 830 0 obj << /Font << /F27 394 0 R /F15 393 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 839 0 obj << /Length 840 0 R /Filter /FlateDecode >> stream xÚåÙŽÜÆñ]_1hfµ¤Ø+ à YC– ȾY†AÍôîâc^mòó®êªæ1ÃÙ•ó—`±êê®û‰Ub•ÈU’Æ¡LÒÕöðB¬èïóÊ>ÀAj£B£qö ` MfY j•\†¿ŒCˆP¤’îúËí‹772Y‰(Ì¢lu{ç`nw?®‹ªÛFšõ­øù;Û}°MUT÷#Ñò°SWÝû¿^Ód»Ï›q$W% ›Ÿn¿ñ·Û ¸?ÈB÷àm¡ÊÒUcWw/­ÂÔ¬ÒP˜ÂZØÒ0‰y]Äaš&´=ò- u¬V #­Ê•Z üßöæF˜É0]jÞGxNPk œà2•H ©Kï„w)q(àü9™žÀ“(¾‘tÌÞêé¸Ýí&P&]ßõÕ¶+ê gñº±]ßTn+Yw{K0ù¡î«L×Íë;øŒk$|Z¸«›“£íq жø mw´ºÝÈd âηåǼhˆk3•Sq2ôìuг %ÙD(¯v ˆ¤u:A#Ðçbà …€FÜ@Kª_æ¶Þý2Ëà&üu_:[µŽ‰¸¼Ï[|"Ú-¯ŸóWÏ‹ã­xfã UªµÖk‹—¶TYhâáY m\ŽÏ+?úð„P’Sœ"­Ò—=Íel¨Ï`Ð*ŠG2Xk2OHÍ\›i ^0»ò¾«yWló²|$îKti þ)÷·uÓXPàŸÖjÝ·‘Ö’®Æµ‰@pzzV7á&H ªÏ@¿n@áó²ç)©>a$C\îjú¢,“5Ã$ Ûᑸè¾^¹Ûc¾ubMßßWE×’v™g*>Ó-¥ÔºªéûíÍßq€èAS=ÎV•plSJ¯s| S”ù§ÒÒA²EÅ\¡•Áˆ•£ÁmÿÒÛ‘^Ór[ŽÀ}·ÑtÑÈ¡˜pëñ¶ùè ¦ô2Æã±,,#(˜¶ù‹²áELPUóBYç;¼î«H’“íÁuÌ!m¤Ó8ÜÕÑÛi#€ _ú¢±­‡Ê;‚ê<♪âz)FUT'ÀNR¸‚Ö]ZçÍkøýmÝ8åQ:%iÀ7/ûu-^[g ¸ ¶Óì,*°N³õ{†<Ðq Ú¾±4zØ[xUC"GÛºÚ¬?:!vkt7}å^¯ éS÷½%Þž«4áÝ~ÄZ +ž8&ýE*²˜ôÜ¡HÍ"Q´ÞÕdpmõª#È´«ºùLûyÙíëþ~O4 ÷„$À“w9èö’Ììåz"~(á¡€KF³üjê ÈÍÛº O*ˆR1p•€Z@v!þ79Ù?{Û<þPÜ·¿;%s–A"”fS+á®®Ú~»µ-èn{†äêª,îsp¶]Ê㤠c“>‘È †Üær&ý¹lšLý_%sjfBàVG· C°Æ Â2 aw¥ÜRWŸÀxi2ºYr ôàÉ aŽ£Ä^#Œ,w¨cAn&A7ã¬Ì2Ä }<àœl¯.[‚yØ[´Lôq4ÁÖ‚ˆÖõä\MFq Foæ¯qþ#_ ,j àWK .xÂ÷‚‚ý•œ ¹oêþØ^p‚:2ó§c°€¤ ùt4\pÑ€sš¶pyu,‹áΛMªÜÀ~ÉQŒðF-õú£Pú®xI[#oì±!îhõ¡èö4¢È£uD8Ð-¿t׉õûʃ3²ÈôÇû'‘›à;Ƹ­Ö˜·YνU6µ© 0ÍX]Ál ¦Ià‹#Y0C Ñ2M' ý4“™0ÀàŽs@‹9å$MZ€Ùs!\¨atfÛ)½Ôßl}#uÖM¤1õF‡îªòm"쳞v!Ïú«\ bÞ¶Û£gEÔ¿Šjkýk‡Æ’3-ÎÜZk±Ÿ§ á¤Ñ”Ó§/FõS uY±EÇ~M»{îäI9MM}ßäN4à,ußœõ«L¨ öY Ÿù¯ºU„á™fÕ¤e„¦Ì$ì½]Ð…¡wUý  \,Ažô³Þ½º{5€A¼Œ2{sE@ßYF<6Ô+›h7. îz¤ìhp Øýú‚2Âè&éÍÂ+ï&)ñئ‹®Ï!ý#°ÈK,æD¥3¢ŽÍÀ/gŽô@NH©áuçpU4sÆ´Oã":îNºï¢·<ú“£ÖÏ^¿~‹ïÿÙ´]™ÿ¶ã‡ˆ^ºÂb|)3ô;fÅëM l]Ù/KPô ‚?Ïè¶±P½¤~§ŽÂè¬Û)–šÂ¨«??-mÁ°3Èæ,°ë0ƺªBìâ‰Ô]±åžÿô õØF˜¦2ÔCpÖMЖ€‡0ˆÓIÚ‰{Nš3ŒœÅ$“DoÞO ø9–æì‡GÔ:(𕉟û ’…]Чۗ:=ÿmS†RšË?DþËTs2endstream endobj 840 0 obj 2736 endobj 838 0 obj << /Type /Page /Contents 839 0 R /Resources 837 0 R /MediaBox [0 0 595.273 841.887] /Parent 806 0 R /Annots [ 841 0 R ] >> endobj 841 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [311.56 694.403 330.954 705.312] /Subtype /Link /A << /S /GoTo /D (subsection.5.11) >> >> endobj 836 0 obj << /D [838 0 R /XYZ 72 786.278 null] >> endobj 837 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F39 496 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 845 0 obj << /Length 846 0 R /Filter /FlateDecode >> stream xÚíZmoÜÆîgÿŠë§R®á¾ï¢È·S7F€¶ê§$(hjå#|Gª$ϲÒþøÎììòåŽ'¹Ah!H\îûÎÎ<óÌPlSÀÛ¾1VçÜØMuxÆ6ôó~“Jß@õ”JäJâÛ·©çV¨Üj…ý{ýì‹WLmX‘»Âm®oCßë›ï²~h;sµBgeç±` ²êŠÊusõÃõ¿xÅÍl´¹–6NqÍþö§£ïÞÔïúï UÀ/£1‹m‘³4$¿Â]f×»+n³cÿ‚–vþvr(¯¸ÉâKÓTx{µ…Ú¸ÇÛÎûnbágiqÊøÇw§ÓÆê¬mö¸ÅÍ–‘[n¡€Bsaw®ôÝ×aV‘›+ÞÓ+LG…ÆbU}ð+Rb¼ÈEÁÿM1Á~˜‰cêYUî÷þ&kèY÷-/dΘƒ‚…* S9tW[ÆË~·+»²|·ýª©Z˜e7uó Vdö{¸ê6Üñ³¯®'%R¹Tj³Õpip‚‹*wY ƒë椮Aý¢IêWÁæ®¶Š«ì9Èçk?àn¿-%D u3PáUÛ ¯ÿ‚^¦XbI˜xػŶ6çÑj`¹pvÓùÍí³­ «Ë ¡7ÂæŒ‹•æ­¿,60[k¨}2³"—Z€Üs&&#b唯Öî9w\Æö¥:,¦1*7öO)dÊe˜^ÙçVäÊ[ Ú!WΙÎóªcöq°¸Þ¡B¢åÞ›*è ¼Yç‡cׄ&Nö}¸F*µ·‹&žUhÞI/©ªnnüG´h|y‹öû°bR¢(rÅÙL{ÖlHÀ¥;•UÕv¤ña-íiÚ˱ë|ƒ  `pyáä|0èM‡¹ˆ1à'¢™,²—h¬¼Èú2 ”JB¬$!Òñ„!Ðã೨|¿ó]¬Ûû¡¬Óü ²u±9 'Ķa—ZÇÛÂó‹ƒõx, ƒv倥¸6Ž=Þ –ú]{ÜßP9 1W.pGàÞ°Ã]X[|ú &ØÌëÛ“unÛ(ýð†{ÆIÇuömyão^ $eöí_ß¼¡vê7­™_‚0ér#õÂF|"CE%yúüé(öü"Œ9@`÷¡e?d67úSpLä…”Ÿ7Ž©ÿ,ŽÙbŽcÆf©–° U{¸ÛûƒA íI§s+_Î zoÁÕ¾Žã'°4.NbPËqä=®ãûГ$Rs@ÐØÿ܈Oà­æ¾vT";ƒBOé«úû‚IŸì9 4¶ƒ¡Î@SBF—ló¹²3¤.e4Ër6 Áò¼Ñ"ÎÕ‰°96£‰ 1æ'Yœ7€€[ZÐ ¶ A $ ·í1ÐEÎÂ`Ú.]A¨8…}èDÚ›`Mp9 ŠÔó_·ŒF¥S|>`÷ü íêÊ÷ÿÇ»ÏïPÑ&¼›ÔJ¢±†'4¾éc³  3ÓNIHg—H'à2gH'… H‡Ýiz$§œŒ z'Ó©ÊÞ‡.zâ> ´W»»£€¶”kø`‡+aèØÀ“Q;5j5l\'N¨å©ÝcÛÜî±Kˆ%±Ðù¿²Ñ(·V Ø h¬iôh×ø&Áã3q¤w~œ½+‰‡þ÷»¶ ' ÷sr:¹('£*Rª2@\"[âÂEÀý`»4’.â\¨tÔhû”Ty®t ^g÷'O»©›ªóeO;€wàç*¸õkÚ)ËÐIuè ±Gãßméü N@À@á.PßQ ¬Gg´ÚZÔèD‡¡f&\êç/[‰ ㈦¥L+`É.2Ða’ôº¯ƒâBé¶Ý£;'Œg‚~¯›4µO3†ƒÁŒ`r?¬:u°èã+ Ã9µ à8Í{,*²S§Õ¹Ïl%ã£M¹´0t!B3Äê¨ .)̵poÐ%ÈÌ!»A¥©ªã]b§Ašps-°èæ“¶_ÑÎòB¥máÏ,_¬h 7Ϲv !]ôB²+LhX7áw¼28K²U,—é9Sx%)›¬¯Œ÷•¡¦QÒv’ô¤¾0†+MµÉT5™*4½M6óQqƒóCœ5^GÁ zïqƒ…HüP,¦ÀŠD? 6‡ ëüœÂ†ýšÇr@½X¢^¿Xu}Ò&Èdëeàf¸ÆÄ_œTàÝ’6Xƒ“k­æy¯"±%˜~bK…M–Œ«Nî „˜õŠîp ´Bš…XC,¹¢™p%m庆9I¨ ï:ÀŠó©ªäx¦¨l ³YSe½¨pÙµw] H´¸²*°_iPÂk>NæRª§á˜ÛddEÊž‹9U9Òa!(Er÷âÌ bŸ ^Ä]GTÖ"wF<–F%sr”ÕcjsÊÁ³·Ç ã&&;‚AKM†Š$T1 õ\±9¸L.ùŠ-'žÀ­D/…üy’¡‘^¿ÜïSBô2·^#Ñg?f?…ŸÂ¢Y®•ùß`Ñ”ßgéûª«‰ ½…g}–A7:wšn_±òý&•¾yd8Òé\`T<ìÅO?—'{A[ŽQ§MäÚ.]nOuÄ÷¡ š°ÕQ~j&ƒÊ‰J",%Ï^R·ëð)çnÞ™QËat¯P·¤¬Üީޭ+rë–n¿=ûºAæÅûæJÇžÝÛzèJ$€\±,œâxÀmÄ-wÔ/«páQ˜iÔŽ(̎ߊB)xñ0 ­•€^&¸ô7ÿ ™‡œ7}ãŠ[«€Ÿôо–Š­Ãû¡l|{ìG/ ŒÌþœÙ/X¤>OƒŒüÖ'fÛ×7>Ñß‘WÝÃÝà#‡¥‹i»èFM$:Ó}vƒ0 KL7ªÈùi·÷!ßMßÌ:¿Äý@®ÒËþjÈA%•ÀQíäšè ÚcBþ]M÷F¯Ë;¤q%5Íô*o|˜Î÷ùš[£E8˜“/¶[_õ­Ö$šž—øÒ^£ªfÎVý_e67£ §ÈÙZP•á¾Ûõôž¨uáÐð€½ëÊÃÁÇh¾=5±BÕû&æɃ3ž ææqÕ=EBÀ¬Î¤‹”3¬…$ÑÀ@ ¢E 9¡}&ÿ‚E½ 2ˆ+~[MIxñã× ‚vû$“ß Å”BÄ•®Ófæ ¶‘2†\¨‹_Sðhô8ý€³ŒE‘z‡œ0t ñ<>gá;wëi ƒßÐÝÜõ¯pQö]Rœh©5ád¸)й!àZuÜBÌ=@Ãr\lmi0e<øJJìck„ˆéŒù™~ÕSBR°O€D ÆRœàÐòìÅÜ$f”¬Y990g‘nú׈È*£lašfYŠÅ¬ ‚õØ´P²#Õ£ØvŒÙL$„žÂÎ<öH±ß\Õ1$ŒnD¥…ŽJÝ/œ#,¡Ø§v+§‘œÓç–«×0Ç‚­Œ'½ê˜p]ŨÃ!âé˜n‚+uBœÆ£Ø•+ ‚(¢|ØÔ2‘}+Ð53Ùˆ:C ³ÇÈáœb žx¼{?ÎME¾îø\üòéBú«ºcµæ—JLŽˆÙLjP~ ßÙyÞñåg^ ùjqŽÅc1‹ïþc‰Ùz _l๋ ^‚ÙÁóدåØþ¿ç?ÍOH8¡œ@îó°t‡€ˆV/Ýš¤D}ŒÎÈ;îëj…+ņ`Íu_\¸!c9K„ÁÅyTå4&:”Í‹Âü> endobj 847 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [148.96 335.304 162.899 345.001] /Subtype /Link /A << /S /GoTo /D (subsection.5.7) >> >> endobj 842 0 obj << /D [844 0 R /XYZ 72 786.278 null] >> endobj 173 0 obj << /D [844 0 R /XYZ 72 719.174 null] >> endobj 843 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F26 391 0 R /F33 497 0 R /F39 496 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 852 0 obj << /Length 853 0 R /Filter /FlateDecode >> stream xÚíZÝܶï³ÿŠE€º$ˈ_ú@Ñ×íµ§F6OqPÈ×+X+]%­¯W ÿ{g8¤–ÚÕÞÙFr΃qÀ‰£ÑÌpæÇrù*†?¾JÅ*Í&ÒlUîŸñý½[ùÖK#J¥%Ó {®•L˜LVk©Y–h$ÿËæÙw×"]ñ˜åq¾Úl-é¦ú9ºíëvܾŽuüÕ‹]Ñ#ôß^­µÐÑ+zþÙu‡×\ªö«o©[»çíØÿ\ÿ øŸ®~Ù|l×Í-ûú›ohxÍ9SZÍ&ÿ‡3ß]sÈdZk!˜æ‰%ÛìÌÕZJí;ëï±-£m×Sc;;#‘Êèöj-Ò¨«Û+‘E£éâP´6Ä‘°¼:P¼(ª-öÆsE¦î­zðƒÅX—n¬%ágF]ó„åhù@É ÿ×ßÍø¼iм¯àíµ¨½‚•[†NATâ€B$"ªG|ÆQoöEݺÁ÷W:‰Š¦®hî@j× uIÙ„GÛC[Žu×Ò°U FË¢iLE퉴5ÿÝP½7V’Ì®„[L’3Tô0\’8‰†]wha¬£¶©±í¡éqg¿ cӂưV=Õ[¢²‚@¿ê`)³È ào’ 7~DEƒ‰ÉègOןxÝ¢I1žçÎæ¯~úᇅ…¢J;`c?R·U]£tôÆ‘™bêÄ8G×UàmÎŸŠ¦7Eåú•ؘ–ˆÐ\C†Ïþ¶9†6„EbŒ –óËHp Àx&E.À…7¹ï«î%DÇEÝ[ïuài®»v¼ù«wi”w­Y |×)<„C.ø&“y¶êÍjû 0Šez•CË•„raÞ—©Ÿ€ØÊ²”æP3•H°Kt:©$å‚J× Ëš±\øh›‡åŒØLs}¤›ô”ŠI z‚ºVçr®%“Ð^'ŒÃûçzz=€OŠË*€‚g“3Y½>JæA8+™ Œ‡¾µS6löøßyXO/w["x‡S°¸CqàW™š•ysÕ"8`×bnÀ$€‹<i¸®Œ|Í¿õ‡îO¥¸ÊüòX'ZX#´1,±‡DbJǰ"|´]qdEB•Ó@e©óhÍCà‹Å,ô錀¨Š–ž¦ï;÷bgÙ”å¡7aq#9×H¨"ßC „ðh»Tëí5¿«›†¾ãÄ¥O¨YØ•Ñs?k¡°ê±~o—†OÖ—s ;‰LŒnÉmÙ*·eò(&¼™à6Ç£0Qví KšNÁV£ýV´dCj»]è`挓ÌüÝ;ãÊJ¡̨+2Í£çÕ¾nkØs T „Âog*ºiÁåö…õñS$ÔN B@hÊ'ÄAtÓßwuõøžø~©Ü_c|‹Ð"]&¡¸ ¡ó ¹Ë ±± …\BjaÑ à˽X™²)¬ßc¯nOØ؇ÄÅX¼)Cÿc¥„Œ6 l–’d—¥¼µ@êýûPoHö,xÚÑmßí©EiNFßœ:MݺaThFç5£ÞQVÏ£±^žFÿèî±ÓÄô˜wÁLíxÍ‘3HíÌ5¼%êî |ÑÔ¹¶³D'ŽJÈFH\Ä¥s`͸?âê‹îö#ñT:ÍX¬×cNA„_Þ—²8·Þ‡£8÷nå[/ðH1}μ\]®Ò.s³Š¬%XÒî;ð´6‡§³9(45tg¦¶#'Ö-ªÊÚ¿#fäИ܀¶ ŽPâ²Vm*¶6sV9øp { þ e9¿dÔuf‘žÏ'Ø ã”'¤½J|²Q±R¥šÏÆgu`o˜‚µÆ‚2¡–º.&;R¿(Ë‹*¨0 Pr!(Û@Â…Í—&ŽÙëbv0†4è¼h v› NžåA¹¸'™®ºàóâuÜ…“Sý ÷ÖXÚ°Œ”!Âa’3ʨ¶2¥ÍòJëç… WPÅà¶€<}šúÅΔ﮻þ¼õËýyöhô+>ù°‡nÅÑ®¯ìnM Lð¤£cïhèngÀSû¥T;ÎÁ;| =ò¦~³T;'žˆÒG,ÃÛ–N7#}nʰ;ê-uO•ÁJžÀSq&ôüàgVÝïŠ[ ›ðÅ'ÒS 1_MÔKø­î‹n¡2ïœXuh¤»z0ìRšl£0{Ú(œŽ¾œ|þó{¦ä"Ñío]i»¸<ÇbË–sôœö H0»¢r{ÀXŒÇÕ&›RÉÂm¶ÚwXè—µÏóÔ…ƒ¸$a O?ò<Àò»qóL‡1¼3ßW1¦µp¥¾?Õâ(ò¹T ‡Üðq¡2_DE|À–?¡À½·†v—&Ø ˆÐª¦Â, k>ÐöBßqä¨8Fé)#„´<®ë–Š%YÖ°¯ÓK®`·Ês&r=³ÐTÃ;dÙ.¸7Q'@”žC”?+¼³#y™©/ ¼EÂ)éÀò!¼Û3~bLÙÐIJ³”¼87^”p3›\ò]F¤òD Z{)æÛÍxÆó õ&Iå®è {¿¦ÔÍy]7/$~u„V_úZäa®$¦ b NAç8:vf9@£âžîµpüüˆy_,Nd Yüd§†düÒMK϶£o”Pi"ÅþØfQº@³¦é¹÷¦…|<<'1Ý”Ps¨ÛÒº*7>Þ¼wð‹tþ" ;ÿå‡ÇcuFç×ÏÉß" Õ!Ï®mœt!ä@÷p‹Ï,øÐÒ©ˆ»oÃÉÂ÷øº ØqGÑ.IÊ¡?üXŒ»'OõÔ‡Iöûõ¡@’~PªyDPté°®NAî.¡&œ +MNªŸ!£Æúµ–x*ÙL°œnaÍ©e=Uëàµc=B!jŸ#2øÍ/‰èDëcA)?Bì@Ø™Èb-6ARå¡XN„ƒþ€æØ}º ꀰmhá(Ù'å„FRœ&@ð0¬;Iî-zêLæùõ?ÿøó™™ô‰KMâ îcpªXþ…Nè–Áïs<þ—9þÀ€Ãh‘£¯WÐÈ=XÐΩDx-‚‰ú)2-Ý]\€)®YJÙ{ÈëÐ,ЇÁª•?€…‰€ØÊ)F`ð"S.逅=éà[šL_w3tÙ½T„)(lõ#?ŽI™ˆEXÿäj:þ¶"HªÐC•Óé;çc4` ÄŒµP \?ö 8!8“¸ë>쮀§÷ XÊ }ù¢áÿc4…õendstream endobj 853 0 obj 2504 endobj 851 0 obj << /Type /Page /Contents 852 0 R /Resources 850 0 R /MediaBox [0 0 595.273 841.887] /Parent 848 0 R /Annots [ 854 0 R 855 0 R ] >> endobj 854 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [264.26 476.597 283.654 487.506] /Subtype /Link /A << /S /GoTo /D (subsection.5.15) >> >> endobj 855 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [188.524 463.048 210.948 473.957] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.3) >> >> endobj 849 0 obj << /D [851 0 R /XYZ 72 786.278 null] >> endobj 177 0 obj << /D [851 0 R /XYZ 72 563.243 null] >> endobj 850 0 obj << /Font << /F27 394 0 R /F15 393 0 R /F33 497 0 R /F26 391 0 R >> /ProcSet [ /PDF /Text ] >> endobj 859 0 obj << /Length 860 0 R /Filter /FlateDecode >> stream xÚåZKo䯾oþÄ —P†f¿Øäq“xƒm°u‹ƒ€"{$ÂrLrV«ÅþøTuUó1âhm :L³_¬ª®þê«¢Ä.?±³rg³4–6Û•Ç7bG?ïBë裙ڨØh|úÂÄ}˜¹W&ÎRƒóÿt÷æ«wÂìDçI¾»;ø¹wÕߣñÑõîf¯”ŽÜÇzl›¨íðWEoß}Gƒ?%B7<ñÐõ4 ‹CO{#óhäjÜ•Ú÷7{i#WçÁÏMÖ*ª[ØèXŒ5,†=ÝÀÔb …®u}1ºŠiŽž_ ™ç›Üý Ù Ô8÷ („Ly¢4ÑX}ËÎ]^ÜÌ‹ OókaYÓ•«ni×f\(KI :õ,Ý0Ôí­{,ªÕB×ÒæU=÷ãÁ iÝÖc]4õ'2ÅK•Pƒøf¯µ‰ÞÝd:šÍß l²Ü€K¿z'íâ˜E¢ã41|Øw⟮ïálýÄ•?è<ÖFó¼šÏ íF:™Á± IJ±Šä3~ö{Ô.—ä3¹ð²€u’±Åa¬wã¹o½æ0ãäÍÒÕä4ÞU`αÀƒx¦¶>¨èл°Œ\rï´ùÑ»ž×yÑáwÁš%Oì¨o|¤QÎm‰ÆJ¥q®Ò•Í cOç f(š¡£^²·lž©õáÆ¤0¡®hêùÄgÔ­®ŠŠZ÷q¤VY4 ;÷!L û®|óõÝ|» œ“ÙímgÚ\Ç‚ëø D,2I8âqaå0ÊÇŽÅ€›þ¼æ¯nü¶¾_¹vü)1 |èê žDD³°×ÞÂd¼‚÷Ä*Ïv½ÛÞ쵊3³Ëc#ÔNeÞ^Ãze5ÀÉd™¥ñà’X§è‚qj²I ¥6Ôx·áêYœËàé¨MÐáb °“fž7é©t¬”Å“°"Ýs¯bí} ¡7ô zÀ>½N a_‡é;ò p±àø¤ù^ù!Ã>sj8(p5¶¿_0f·´èŒ9ÂíûWg/óXÂ=B¥ 8ÐÍ^€ŸEw7x}ÑËØj%AŒÅ’û`ŠRÆ‚È#“Øäíw7ÙËÝRK»¥Œ£ä§I¯4ýF0ÐcͿ՚°¾(Ë¡½-`Â=®z¦öÑ-¯ /,»¶RЂ,þÔ kèöˆ¤°ÁFä¼]ƒq Ý×®Árx×ä—:× ¿4@‚únœÖäû9¿œk{h„ÎGz_ˆ–¢ôøë炇µû y«¢÷q.y!¹Êr’ü#E°'àXÔ*80žè”@%¨g5©DA׸# népp‡ž‡`þC×vG‡"9‚·Ò:0ИæÌ4-UÄiÒ+©^ØŸŠö¡A*c”%ÚFk×zÓkØ£dœXó[°ç–œß3<~ p0ô3øvÈ4#%Mt-ß»|$ă4À¸÷ظMÙìo bÁ@‡ }Òsú¥µ¦ÃܺvbA®xsÄ”—Àû¥ËðŒ¯,>AŒõ‚Èhé:[oiÕ$’­Ó%ÆJaÚæ>:eÆÌÄhàÍ$iÉ1(]£Æ5]#͵ãT*–&gI‡ó‰©c¾«%zà(7/^ Å蒱㠂I-xhº{Â"œé/+ôôìü¢ª ð\+Lôöà9+nZœNÍ3B; »<õá\¢O=â» î?——[‚Ñ>$¸O™S¿™"6h³¢÷ç>Pß"S }wä×<º–Zÿ>Õa£^ý’Þµ¤¿ @¹¯‚R€Š gÓ`Vl­t eVEßu½ëP~f·Ä@ ¼áÚÚy¾÷¹Ô 'y`ÂÁÁ§´YEc˜ýº‚VòLOl|£Æ g L™>µÈ)*3,€Ù0‚²>5<‹r†dÔ3ŠMC鑸4Vzáòp¼îé±½ÐÜ‘7¬KŽÐ $`Öè®ø\5M"J…Ï|ðêSba±‘<ûϽ ñF‹Å$ÊáéRÌaÿý}SÿrvÔ5±hMÁ„òbZ÷C‡Â{™<‚—-(Œ[E •&ÞÃ!˜2³«‰h…Ô¶FzÚ ¡“4Ôý"ŠJAç cLh/¡4˜Lû=ö©)Ó„f=ÒR?eŠœ°® ñEù:»¾þÄ=x”Ÿ¯&™Çâg/-]ê‘ãå]À¾' õ=³×·ÌDç#œØ«&!«·Ì·,B­ i6“S=sÛ+Y'•/üÇÒκ)¹„¤ók¯È»n™sNãØýþ/·ôPuç{¼®Ø&õ·òÒ,~=+M”y5+ÍŒø5Y©Œ…2ÿÛY©ùµYiözVêýЮüÐrhÀJydÆnf—ùO¶rS»¨ýÀ'L)\9†Ðª¡þÄ­Êq :ükptÞ!¦ ¥Ïñ¢ ˆßE Šš¯y9®¸äåJ¬’{Ç…Ôû)„]Ö‚lþ…:’±L´6*:ÐJCÍ3œ‘sÞËlœØl]?~?®ÍVu­[‰Lß‹¸,`ÓXâÙÅÑ^’p=æU0™&x‰ˆ3)ÿ;,üG4Ìo%áÞšÛ\äùXxúÂÂÿ}߆øËú”¥‡`D‚'Ký°K(b›°6܉Ñ5Í@[³sš¨¤qá“ ¦ ÛìÃM/*Š”Aóú—ÒHlN7ùã†8pqT8}ÙyGeÑ-¿JnMôPâêß»øÒÌdß,@®f’Ο³CI‚ ÒÙôm¿:—#õ„ºôJ «€½ÈWlšƒÍy˜ãmš]±ˆÿÉÃù> endobj 861 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [128.757 245.064 148.151 255.973] /Subtype /Link /A << /S /GoTo /D (subsection.5.10) >> >> endobj 856 0 obj << /D [858 0 R /XYZ 72 786.278 null] >> endobj 181 0 obj << /D [858 0 R /XYZ 72 612.857 null] >> endobj 185 0 obj << /D [858 0 R /XYZ 72 508.853 null] >> endobj 857 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F37 380 0 R /F39 496 0 R /F26 391 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 865 0 obj << /Length 866 0 R /Filter /FlateDecode >> stream xÚåZ[ä8~Ÿ‘à/”æeÓh’‰í\‘x˜…˜`[€Ä¢UºâêŠ&•Ij»gµ?žss®ÕÝ µ4åØÇöññ¹|çxÔ.„?µKõ.Í’@§Ùnz¥vü÷içZ¿‡>¦ŒbÄ~½@è;JßÄA–ÄHÿåí«wT¼Sa‡ùîö@´·åß½÷M;mwã›4÷ªæFgÞ`»sg‡b¨Úû3¯êá7 ½áX Üz@B‹måõ@jyóÛ¯ß}0ál•§A&²SÏ .² ÏeøW°X{CÑ|Æá•ÕŒLb„úõ•ÅÒ Tn5XC½…så=Àñì•õ"Rž=³žR7œD`ç¨kÿSÓbó¡áþj(êjïÍ}-”í‡ëà 6ùÎWx?9-ËËãZ–}@´* r“,(¿¾ô({zE/¿w7>L¡Ý¿'nðÄ*ö€!Ø,÷úêë—ö d¹g›Òò<»,†‚ÉNÅN½ÏÜk¦t³Jyö±ê‡Å¬¢)y3=ÄxîÆO¸ÔÈéb±º-J[7~dbïcäQ$ù‘c:ñ¾èI8±²ŒèLär^ºÆ–x\££P9³°m²Õ?0_§B¶åÌ?û¡í˜“¾]X(ô+r§ƒqäÑB*ÓýƒŒ§+#AwÜ”ÓÍÉ\è6uõ"}uøÌ"3šXš+à 73|ò¶nÉpý(HÐøÛ6Ò1i—(5rdlŠOt™D{GPÖZÈí‡3Gnðž°Ã)°lqjݦeõ³ý¥Æ]nÍ—Õ£q_áß>ht%šŸ™¶! ÐÞ_ /0¢ájP´g¼S^‡Ú=/ànÛû¶ÙƒÓm G ÃÕp*Î=*rˆ– ¢æª9´ÝI´÷ã_X<O'¼Ãl ÈÄÉ{b"¦‹ÀÎÆîmßÝç›L{t"å}ùY¸^ØîTðÀõ 6œ-Nj-ÌLc_È.U9ånãVŽU¼¶@ZŠ4¿¼ Ó‚Ûã°V·—¦dåŒXÑÅá)ÕÎ3ïuÝ¢m< FLÈ4,­Í/OYCá÷ŸÛK²˜Ëž0¡Ð5àDIµÓgwŒV) ¡ê‘}'´\õ†÷b½’‰uì徟Äí2eqæÃÔ¸ÞRm7œG[F 3š9Ï„Óÿôf^‚K‡t¦#ë1”V{[Ü :ÞmKId­:Îå*Û¾Buáü4tWßC0Ž'þ$Õq&ù7·%¿æc! ‰\”ÊÇœ«{Š™”"ÜWGžƒu¯d:б-J¥ ãÊ¥ƒª«»kU!%‰þð.KïJÞ, Uê¥;Ã*Q¤"W2QÆ“Ú%wÛGŠˆÌ);G›Vf*à@Auh\z2nh=HÅF‰uÑü¥öDJ/kîÈjÀ‘µ\&L²„îí 7àÊp¹”’òhö-J;øYœÅ’ ŠyL7g€_mÃþÔìÀ¿O„vܲçºÚWœäçX!#'ï6àŸM©7ñ=™¾æ¡÷ÓB=U³Ì ý߆*ÚWLi­\Á$†ç*mè¬(êpRìB 4N-•saløD2³eÑŠ»èD0ÁmW[ΆkY»+š~VŠÂjAa°gš¢uë°¬DØÅPÊã¦ûOFêqa*â@br{tåbç3Jª²ûšŠ™â£öœÑ9å9:\”›¼Åh‚í¾6êéÔâ™dF*Ó³|cá\¾Q5p±Ž½[õÝ­ㇶè©„FFìþø›·ýßßþùãßøû £®zÄ×wŸs? TžË+0ìØuvwx™@Å»<AäÈ´¹2ì§ø/÷ÃõdYÊÃÓ«TD¶ù:wþ|îöáúK‘ަÇÐaµÈ3VñìÈÓD1pL8­J®ðéÈ`< ÌßÓÖIQõ4P¨ìù4‘Í ±ÎZõ÷vrå<ÅÊ9Ú1?„‹Çƒ…J(È%³ÄåŠ|×¢D¬ë™¼ Ù®´ý¾«$l•ÌžD1E”b'€@bC0m´‚Íà—úŸ´Ìì%äBê¿ðØõ…XæF>àéäh<¾6Éù „ôjîó¦)O Rç ·iö¢ £Ù«£d•/&Œ7OKQH! ‹wIp? Õì1NtD"‚à0ðÀq84 (ph(ðsº.HKQÆè±£"b-µ,ê­Ü~T²>šõLÙ^\Ÿ¼¿­„så5îšë™Œpùp wŸ…Î g¯l]W•ð Ÿ}äXßžªè“6fåiükp²ÐÉA.>Ó~Ü#Ò#‘bâknˆ¨Ç¢3½ *XE‹ÓÔû5«¬Ëke†j5Y†páJ±2Â8W ¾ûŽ7¼ ¹ ´Í‰­»fý ³Q:­ùUF^X4ºI„³è}ð H†Ý¼¸GÃtþ¦‹æ)—A¡G‚%tÀÄ+Ú£3às1þõ1A˜åS9Œßßð6£ñù#—Ûi`¡ð͈]äÛTÉŸ”±´Í[®’ÊëNäºRu)ì¦$:åímTfv~Ö¦à”ŸjCõ¦HK5RKÀê2bèb+?‹ÉÊ MZ9Æb8¹ª=˜c+áõ«Ž›—¾¸Çí(%3eZ9¾üÔ}{­F;÷6ì?.A˜C£éùѺüÑÁÑ ¿!µ]e{Î"]}iÄt`™Ëãõ/½k,‡ <µ\l”,Ë${Ër,¿tüÝòÒzûK×ÿ§é抣¥ò¦]½Ž’—ÈÑÚ1K3”ï1ȶünåŒÁ2JúŠdØ“ËÙ¾Štῆ<Ëör‡O &kv9OÏkÐ2…ý,´ŒUô,´4©ù)ØRIœþ`K´ûíK Îa×ÿ+™Ær8rúü±^ï !ãÑú™W”AøQendstream endobj 866 0 obj 3259 endobj 864 0 obj << /Type /Page /Contents 865 0 R /Resources 863 0 R /MediaBox [0 0 595.273 841.887] /Parent 848 0 R >> endobj 862 0 obj << /D [864 0 R /XYZ 72 786.278 null] >> endobj 863 0 obj << /Font << /F15 393 0 R /F30 512 0 R /F39 496 0 R /F33 497 0 R /F27 394 0 R >> /ProcSet [ /PDF /Text ] >> endobj 879 0 obj << /Length 880 0 R /Filter /FlateDecode >> stream xÚÍYëãHÿ¾üOαéu¿ÜmN|Ø·0Ü– X„<Žgb6±ƒíÜL„øß¯ª«ÛÄ™™Ý;ÄiFJ?«««ëñ«2_ÄðÇF,ŒM˜0v‘ï_ñý}\„Ö70F+•–L+ì=³p¥´eiš@C1%Íõõ×ipθtÖWëWoÞ ³à1Kãt±¾skÖ›¿G›úx»+–+-t´æÿü}Ñýy—U݇XÇ4XV5ÞÕUwó;˜àˬÿøêëõ«•fˆ® ü98ÉÔ.šbq÷j¥$³z‘2ÍåBZÆ…œ™†ýÒ(?Áf­¡ùA1S‰\¬8K´íï#åÌ}Þ!soÞq=šQ åçñbág$@`öõëú{JÅ$¼^—'3|®$“Ð^%Œs5sÏp c$¼©€Üô÷˜ðîÑݱ©–+)EÔm lÈ(?6MQ-…:(»¢j˺¢nVm¨ÑÂŽ–}¿ÔI”íŽEË– QðÒâݱÊ;Üï¯Ú‹\3¥áiDÌ´°ÿ;õ•[÷výþæoc\7YÕÞÕÍþ'WCõŒÊ—ª¡ùy«¡~©Ú§Õð½Sõ†“bc¢‡n&£%º §ô0rñŒ±hux|X´¯ÛŽ†î‹ NÏi¸®ü¼sB®±ÛÕK‘FžBÖÜ–pBs"ÂÓÃÐ3%FEoÝcÄ“W8gKHî ÈO<º«1LÇÁxýµ0,5N-˜`,ÕDyŽ„`Dµ} ¯‘$Ñé‚ìÑÖ^’›Hÿ‚ÜÈìyOJ1¡äˆÒz†RÊ@GF„ðÕ„tF…?÷å÷¨ä…Œ@öhGy/3qMf)gR÷2›ÞvÂ:t)?í5PÁaÇÚó‹—9ãN÷°qW;²`èô8ÔmâØ•U‘5Ô.þ}$íúÍ̽W=)øs¡@iì*£¸B]}c Àd5¬úíÌyÇžyO`ûƒ€™Ä¸àΗp>C‚xÀaÑãl I@¶tίç¡Ö‹/aäD^Ô¤,V\@W´´ÃÌD¦p‚Lÿ?2?™Š—ÊôŒ‘•€Ô I'Zû‡¢)^c¸QCòá÷2Þ*cÜHŒ%|;ÿƒh½ì9Xo h<7øHïÔœ{:6‡„eùR~Ž* hžPò¬ò®$B9Œõœ¥\þ(íù,¦Ä¥<Á#*»š% -úåìë'Ò‰C h0xP™Æ3ÜÌ6ÔëjúÍÜ,pâ>{c`ÀúGîš%€Ž3Àã‰*MU$¬)CDÀÎutSÍ@7!]:ëÏá;ÀT—ä$hJ¨‘"ÿÞç§Þ绫¹Ø€¢»Ý¦øsU•$Y/Û ¸9)bO¡^{Ì~n=;G]9œò‚bÉl²ø”›ôs²%¢ðL²ÔŦ¸£<ˆ0ô ZúÅVZMÁì(ÕÏ] @½ùÂÕ ;í¡®6-  áo¶è_¼™9nBõô TÅ‹©>ž>Wñb^?ª˜R]¥K°ú¿}þê“’/¯ qòª¸åë,d%"õð%õ)6šÜc7dꈖR@6ÊJòÎ(Ç,.¼w€2ê“™Ô%åkEã©ý¢ŠèÕäè$úÐ;ãgbk3I™"ù”]ÍÉ4D ÊkJ3C’D„›þé/ß~;ç¸ðDÊÉû–.쫦ߋ|† ŸÏ¸ð÷6xìd‡Ã®,6èÉ Ÿºñ䨖ròûfhn]~ËeH(‹ŠÖ¶áJtNÅ.­B–ˆó mÇ]‡O|©«÷»ÓÖÄËI I%!ü†º]çÐQSP•XüäÇ Þû2.HáRsÊ-n;¶À‹Ž‰ ¶¡ot¶ÞãVƒá$kÝ L êÔÑ-ÛÖÇ݆ø i´[¹)Û Œl3s%w†„ÍU]­z9:ï T耬ÉrPRdO8¦Üv'Ú•áO:£Ï8ê¢,¢°Gˆ5NÔ Õ\“ëØì__Â…[¯åá¹Æ”Ó?ÃȆGF:)§¹€áv&óv^úç @­l¹ê (™HŠêsq‚Á /kÒ1êœDÛ–·å®ì¼ŽâZ´]ü-JXì÷»lß 3BÇ/º‚!4rxìaØ¡/Ã`¬ú0ˆ=Ò4òŠ—Ù–û¶Ø!;†Gîù— È.‡ ´PüvB‡©‘·CÙÃ…æÜ„qxùiP!¬C]=DÑÚ xtF YúÙ”¿(F5V9cå.ÜÂU?²Þz]ôOÎ@ÅTÉ!!*¹«Æªè]yµ°3TÁ5áÅO1ùPˆ pg?.Bë›'Šwüœ¤vQëÙ¯Î5#02K<”Z¯ãU¨Hg`±^Çb޶# ½õ uî±”hè—êþWÌ+š’̤|"ê¯ 3îç6”íˆ0OÆçCï5]™wX$Àþˆè=僓Ãqðkù±ÅÛòÔsÊM„JÛ`= ;YsܺÃMp/yFªîv‚7¿f-²‚jåõ~ïøé…£ý’iôžÌ\윂}uÊ®}ÁI ÌÂÖ1³èlmLUL˜Ê³`˜¥_(Tu7cˆJ§ùOl>C‚üšD t hˆ_Ê€OŽ3r¢€ßÁicp¦±QTH}TípÚ‰¿;ðsô’œÃ %8ïá¹DøNRnæ2˜ /+>21¡ÒvÀ Í]ZïÜ‘»éëQ2%%Ç!†ò¸q¨JÓT°c|¦ãb_E­«Æâ\(£áèÍ „TŸK_³½8Œ®š–bÁ­ÛÅ~CU<3´AÜeµ =— ÀÙWÝl0«Ô×öTŸ#ý„$öˆ(9ì²¼ØÐh¸¶{By]AŒ+ªÐ`ȸÇk\´|À³êÑY¹û@faôÆoÈæÔÝ#ÏÏÀ§-ÕÛ/Žf~öÌ2•ð1çœÌ±zÞË&”èqãn(ú¢·aÛS±ˆ;{ã*(Áƒ+TÛ©’¯X¸«­3z¢ß4¿xíŸ`¼fаÛ_Ö’²a«_ .½t¥ Gcb8ðd&MÆÀVٸ穌ïì¯yÉ<~“’#e–îšzïG{øŒdµ¯¯áÌ% ÅÑ€W‘ eÒ³"ãN†Î¨\ï×ÌäV±e²ÿœq×Åô»á´z¢˜Lä^!·.ÎB=‹<ÚR1…:ûÛóQ‚%®VwíãKKA{›á®1œõÞÉ9 ©FþIz/ìâ»óTCqÒµýNŒÞWñð_—Žù“ú  ”+ú@“uD¡& Î}Gh¨1qWê>≺Oï>=s«!8¤Ï+!8“øíöih¥åùIB &„¾Ý~E7Ÿkendstream endobj 880 0 obj 2721 endobj 878 0 obj << /Type /Page /Contents 879 0 R /Resources 877 0 R /MediaBox [0 0 595.273 841.887] /Parent 848 0 R /Annots [ 883 0 R ] >> endobj 883 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [223.636 234.809 229.09 244.506] /Subtype /Link /A << /S /GoTo /D (figure.1) >> >> endobj 876 0 obj << /D [878 0 R /XYZ 72 786.278 null] >> endobj 189 0 obj << /D [878 0 R /XYZ 72 632.949 null] >> endobj 877 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F26 391 0 R /F30 512 0 R /F34 583 0 R /F31 881 0 R /F28 523 0 R /F1 882 0 R /F39 496 0 R >> /ProcSet [ /PDF /Text ] >> endobj 887 0 obj << /Length 888 0 R /Filter /FlateDecode >> stream xÚåXÛŽÛ6}ßý¡Or°b5äð¢}hÑi‹}H",t‹Bµi[¨-9’ìæë3%_ey·M/@a,$q†s93lòi¶ò{Ÿ­7+[Ó—ˆC Ò/7Ën㦲3{væWæï‹i“—…ÛÂÍn˶ʚ¼Xt&ú¬3§í•×€)y£Ô)Ê^m^¸Å#ˆSAu—O«üw¯t/5ªSºv‰ˆ0ÛlVy±àaSúEŸ”Àp:¡X–Y•MÙ\|ÅŽÔÅH<¬/’»¤ÒQ]謢¡öóî›r´×Ò›ïÒ×?¾D’ËðÙ5zщêºWØužlá4=û.BÁŒ &AÂ0àb@Lû…ÆNŠ£Úc†J8Šu#­ÏPˆ¡®¨°a ÇN¾zŽL„äNo›§@&„vEÒ âŒô)€ynG22MQÇèñÓ—³“ Ó5 §CÌÍ¿Ñ$·s“à…&mýßnùØ&1ãMRçD¾Ä@)i"¥baý·g+z©óEáßÊù‘ÈW«ÛO,çýËin g«©»ôã}²rR³ŽsM Y¢œ¤Jµ5 œ ÀÖÄËÎV§ëõcWÀÞÆ<é}Oœ_öTÙzCišÐÒ úàhÜ~4fÍ·$ Óe^{8–Y}ËMÓÎ=7{)d\%#È~AVÉŽòH£LÂu{lÚ™†Òx[n½+V?AÜRÖø§×Qq¸¤iò¹YèÆ­®òÂA¥9“ªïÞ‡!€Åt8¼Â·d̘0ö6ËýÈï6HOå³nEg܃P{Öï‡ÝKbîC÷×JÀ8š(Gë„Hu²u;ŒåÁ}‚†ueéÊQ»&¸ý¸ÎüˆÞZ̳UþÑwt÷µ—SÍÎ.&tïý‡§òÉõx”p¯ý×|Uº*ºWëö7CDlØ8 ÇBŽÒ°‘ðæ ÈÐÿ‚†fuìïØ.Ýü8Ñœµ×"ƒ.${à‚3Îåù|©wÃüendstream endobj 888 0 obj 1072 endobj 886 0 obj << /Type /Page /Contents 887 0 R /Resources 885 0 R /MediaBox [0 0 595.273 841.887] /Parent 848 0 R >> endobj 868 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 200.999 200.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 889 0 R /Length 890 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™k¨à’ÏÈJG†endstream endobj 890 0 obj 29 endobj 891 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 200 200] /Resources << /ProcSet [ /PDF /Text ] /Font << /R6 892 0 R >> >> /Length 893 0 R /Filter /FlateDecode >> stream xÚ}T9’T1 Í} ‡ðÑbyI©âÃtF5ÅVü`"®žäßÅ$ôtÛO²öeèàJøÛ÷ý,/…ëÏÂTÿøATã8Ë¿_1ã’ä?—g‡•}ÝÏúáVÞê•êí[y—Nêñ»o¾¿½ý*oõ©|®Jø~q‹õë+?òÀÿóσÌ]MÁKàÞ6×ñeŠM Maæ¯÷Âm4§úpÊ•šj(MÁ¥K/C­%r á2à3…<‚¹pkÛò¦Õ<naP–›‘¦8ZJ‰¸ªHˆ 1—á1Á๥\F`‰"-ÿ<0MNIµé/âÝ å4²PHNK^鎚ԉôðÜN …;CQúðh5´Q±ð| Cƒ\º‡Èè "½«D™—[î=ë%Lœ>Ã’E7Fß瀘r¨Òêhލ%…àÖ.Cè\”n󞥹‚0ŽœQN륟°­ |A¿z†8–IË86Åmöl ô ¡‹÷ÿŽ„¾`TPs£f=²œ±e½\½a|蚢{ù™½ÖÀ„Ë€àš='’êJë¨}aûñÒ} מ~@(8Œž˜—qÖaˆ°c¾1‰*›ðIu’J¼‰>£®eÉ{Ä(Q”+ÜýÌ%;/¼¢o2Kè Åx¡ ÓrMß$7K$)vÀ® Û@ðpذ—Ͳ Àº¢¾‰y¯á:\^ºg 9YÀÈs^">µ™½¸%¼yÃÿ€žËSù 7·ÿxendstream endobj 893 0 obj 573 endobj 892 0 obj << /Type /Font /Name /R6 /Subtype /Type1 /BaseFont /Times-Roman >> endobj 889 0 obj << /XObject << /Im1 891 0 R >> /ProcSet [ /PDF ] >> endobj 869 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 200.999 200.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 894 0 R /Length 895 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™k¤à’ÏÈJN‡endstream endobj 895 0 obj 29 endobj 896 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 200 200] /Resources << /ProcSet [ /PDF /Text ] /Font << /R6 897 0 R >> >> /Length 898 0 R /Filter /FlateDecode >> stream xÚT¹’“1 îý.¡àG‡å£Ý`I:†* Ç)¶âõWŸä?ÙÄþ$ë>–®„¿}ßîåµpýU˜ê?ˆj÷"üû~\`^Ê«óÂʾn÷út-?÷ÊFõú½¤ Ýø]ïï~¼¿¾”O×ú\¾T%|¿V¡úíÿKò/…™»š‚—À½14l®ã/Ê› ;šÂÌ_o…ÛhNõá”+5ÕPš‚K—:^‡ZKäÂ-dÀg ysâÖ¶åM«yÜ ,7#Mq´”qU‘b.Ãc‚ÁsK¹&ŒÀEZþy`šœþ’jÓ_Ä»AÊid¡œ– ¼Ò5©é๜ w†¢ôáÑjh¢bá'ø†¹t‘ÑDzW7ˆ2/·Ü{ÖKÜqO' ˜8;$|(†%‹nŒ¾Ï1åP¥ÕÑQK Á­]†Ð9)ÝæO:=Ksa9!¢œÖ'J?a[ø‚~õ q4,’–qlŠÛìÙ@èBïÿ }Á¨ $:æFÍzd8cËz¹zÃøÐ9E·ò3z­ —Á5{N$Õ5"”ÖQû$Âöã¥û®=ý€>Pp=1/ã¬ÃaÇ|bU6á“6ê$9”x}F].Ê’÷ˆQ¢(g¸;ú™Kv?ñŠ¾É ,¡3ã„&LË5u~“Ü,‘\¤Ø;3lÁÃaÃ^6Ë2ëŠú&潆ëpyéžæd#Ï=x‰øÔfö6â–ðæy {üº”çò8+ÿxendstream endobj 898 0 obj 573 endobj 897 0 obj << /Type /Font /Name /R6 /Subtype /Type1 /BaseFont /Times-Roman >> endobj 894 0 obj << /XObject << /Im2 896 0 R >> /ProcSet [ /PDF ] >> endobj 870 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 200.999 200.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 899 0 R /Length 900 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™k¬à’ÏÈJUˆendstream endobj 900 0 obj 29 endobj 901 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 200 200] /Resources << /ProcSet [ /PDF /Text ] /Font << /R6 902 0 R >> >> /Length 903 0 R /Filter /FlateDecode >> stream xÚUT¹r1 íù,“fƒƒàÑz&àH]&•2¹Æ*\ù÷ƒpåD–v@<Äa:¸þöûv/¯…ëoÿ½•×ÊÐY¾âÐȪ÷½¼«Hh.õùäÒ;·>]˧/½‚yýQ"ÞᾃßõþáçÇëŸòùêü¯U ßoî³~/îåÍi‰`òÀ/ÿéã%©¿äl N÷Æ`Ø\Ç?’=$6@v(˜ÁÌOo…Ûh.õá’“šj¦à¥K/ÏC­%r†p è™ÂÉœ¸µíyËjž·p(ËÝHS“E7Fß瀙rPiu4GÔRBrk—!8§¤Ûý)gdiNÆ#'D”ÓûDé'|kƒ^Яޣ!ކ%Â¥e[â6{6|Cêâý¿aÁŒ J¢cnԬǭgnY/§7ŒSt+¿0טp0\³çDR]#RiµO!|?Nº/ãÚÓè‡Ñó2Î: vÌ &Qe >i£N’C‰·ÐgÔÕá¢,y%Šr¦»³Ÿ¹d÷¯è› ºB1^@h´\S×7ÉÍÉEаó†m ylØËfY`]Qßļ×pn/Ýo 9YÀ¸çœD~j3{yKDó{ {üº”çòørDendstream endobj 903 0 obj 587 endobj 902 0 obj << /Type /Font /Name /R6 /Subtype /Type1 /BaseFont /Times-Roman >> endobj 899 0 obj << /XObject << /Im3 901 0 R >> /ProcSet [ /PDF ] >> endobj 871 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 200.999 200.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 904 0 R /Length 905 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™k¢à’ÏÈJ\‰endstream endobj 905 0 obj 29 endobj 906 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 200 200] /Resources << /ProcSet [ /PDF /Text ] /Font << /R6 907 0 R >> >> /Length 908 0 R /Filter /FlateDecode >> stream xÚUT¹r1 íù,“fƒƒàÑz&àH]&•2¹Æ*\ù÷ƒpG–v@<Äa:¸þöûv/¯…ëoÿ½•×ÊT͵Lç!“k¨Þ‹$xù§àP]êsré=·>]˧/=l®?<á»Ñ×û‡Ÿ¯Êç«ó¿V%|¿U¡úÝ{>n–;þÆ/ÿéã%©¿dp N÷Æ`Ø\Ç;É› ;L‚`æ§·Âm4—úpÉIM5HSðÒ¥Ž—ç¡Ö9C¸… ôLadNÜÚö¼e5O€[8”ån¤)-­Dœ*¦BŒ‡Ûð˜PðÜV΄x¢¸–˜&g¼”Úôñžr:Y($§'¯ GMêÄõðÜ. E8CQúðl5Ø€¨XÄ ½…£AnÝÃdô“ÞÕ¢ÌË=÷žõÜ3&Î Љɢ£ïsÀL9¨´:š#j)!¹µËœSÒíþ”3²4'ã‘"Êé}¢ô¾µA/èWïÑGÃáÒ2Ž-q›=¾!uñþß0€à F%Ñ17jÖãÖ3·¬—ÓƇÎ)º•_˜ Èk L¸ ®Ùs"©®©´ŽÚ§¾'Ý—qíéô‚Ãè‰yg† ;æ “¨²Ÿ´Q'É¡Ä[è3êêpQ–¼GŽE9ÓÝÙÏ\²û‰WôMa ]¡/ 4aZ®©ë›äf‰ä"ÅØyÃ6<6ìe³,°®¨obÞk¸·—î7М,`ÜsN"?µ™½¼%¢ù=†=þ]Êsù øˆDendstream endobj 908 0 obj 588 endobj 907 0 obj << /Type /Font /Name /R6 /Subtype /Type1 /BaseFont /Times-Roman >> endobj 904 0 obj << /XObject << /Im4 906 0 R >> /ProcSet [ /PDF ] >> endobj 872 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 200.999 200.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 909 0 R /Length 910 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kªà’ÏÈJcŠendstream endobj 910 0 obj 29 endobj 911 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 200 200] /Resources << /ProcSet [ /PDF /Text ] /Font << /R6 912 0 R >> >> /Length 913 0 R /Filter /FlateDecode >> stream xÚ]T¹r1 íù,“fC\_ÝÉ×* ßoî¸~/nøæÔDX~à—wòxqÊ/žx³J69ŠîJ°°¹Ž˜=™ ;– ÄÌOo…t¨³>œ¹‘Š„Ñd¼d‰ãåyˆi"·`ÒМZè#™«nÏ›‹yÞ`^î†UðÐÔbvSæPåFx¸ Í­E¡jQ–¸MÊxÉtú cBé$†Lé Ê+Ã5å:Q~š[ÁÉ„34¥ÏV‹8!·p4šk÷P}A¥wq‡hórϽg¿Ø÷ BrBL‡ʈaîs@M(LÛê‹%Crk·!lN&ÛýÉ32«0á‘ÂBé}¢õ¾E!gÌ«÷ˆ£a‰P4c3Rì7{Cêìó¿aaÏX´DÆÜH­GÕ3·ì—›+Ö§[t+¿°àk l8(®Ùs#[]#RÑŽÞ' ß“n÷öúBAÁaÌļ³C†ûˆMÞÄ7mÔÙøF›ô}u¸Z¶¼GŽM9ÓÝÙϼd÷¯˜†KèÁzaÓòšº\9os^¤¸vV¨É# â^ªe€eEÓ¾†ëp}î^äf£Î½8‰üÄfÎ6òæˆæu {üº”çò)%endstream endobj 913 0 obj 591 endobj 912 0 obj << /Type /Font /Name /R6 /Subtype /Type1 /BaseFont /Times-Roman >> endobj 909 0 obj << /XObject << /Im5 911 0 R >> /ProcSet [ /PDF ] >> endobj 873 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 200.999 200.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 914 0 R /Length 915 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™k¦à’ÏÈJj‹endstream endobj 915 0 obj 29 endobj 916 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 200 200] /Resources << /ProcSet [ /PDF /Text ] /Font << /R6 917 0 R >> >> /Length 918 0 R /Filter /FlateDecode >> stream xÚ]T9’1 Ìù †v2ÆA‚dê*?`-e.GrùªU°‘¿o4ÀQÉÖJ3Ý$Ž&.\ û}»—·Âõ—ÿþ”·Ê±W¹›LTM¦Õ{‘'öúß]¾w©/Oáh‡«¯åÃg«Ü©^¿—”à.5œýw½¿ûñþú»|ººÿ—ª„ï×*T¿y—èFaI©fã×Öã%¹~)<¨{Â)Ø láÑç:žX0î:€ú¡ð$Þ}÷V¸ k6œ¹SS §)xéRÇËuho‰ÜC¸… Ö™ÂbNÜÚŽ¼¹vÀ-Êò0Ò–V"î*¦BŒ‡Ûð˜X๭ÜA‰âXþy`šœù’µé;â=!å ²PHÎH0^™ŽšÔ‰ã๠œ EºŽ¢ØpµÞ€¨Xä‰õ¹µ…ɰ3õ€(óòÈfY/ñÄ–I@˜8;$|(ãQ£Îèû0SWZ1¢=Ä­]†ð9™îð'ÏÌÒÜAœQÎ襟ˆ­ ë‚~™ECž‡–qlÆmZ6þÒÅûÃÂ_0*(‰Ž¹Q맜ڲ^îÞ0>tNÑ­üÄL€¯50á2`¸¦åDR]#¤4Cí“DìÇŽùe\{ú} `à0zÒ½Œ³Ž…†ùÄ$ªlâ“6ê$9”x›QW‡‹²ä%ŠrÊÝêg^²û‰WôMáú‚b¼€Ð„Ùóšúz“¼Y"y‘âôó„m@<6ÜËÖ³ Àº¢¾‰y_Ãu¸½˜Ÿ@s²€qÎ=Ø }Úgö6tKdósŒþøt)/å/¬œ!endstream endobj 918 0 obj 596 endobj 917 0 obj << /Type /Font /Name /R6 /Subtype /Type1 /BaseFont /Times-Roman >> endobj 914 0 obj << /XObject << /Im6 916 0 R >> /ProcSet [ /PDF ] >> endobj 874 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 200.999 200.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 919 0 R /Length 920 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™k®à’ÏÈJqŒendstream endobj 920 0 obj 29 endobj 921 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 200 200] /Resources << /ProcSet [ /PDF /Text ] /Font << /R6 922 0 R >> >> /Length 923 0 R /Filter /FlateDecode >> stream xÚUT9’1 Ìù †và1‚Gê*?`-e.GrùªU°‘¿o4ÀQYZi¦›ÄE ¹tp%üí÷í^Þ ×ß…©þõQǽðìý ­lN_Ÿ¶°rn¿–Kyóˆ¶_·{ýt-¿ôʲŽE­^x:l µúጀñ»Þßý|ýS>_ëKùZ•ðýV…ê÷§ÌòÀÏÅKrýRx·)Ø ÜÃÃæ:þcö`l:€ì@YF f¾{+ÜFsÖ‡3wjªá4/]Þ ¾¼µ–È=„[Ø`)ìQ̉[Û‘7Wó¸E@YFšâÑÒJÄ]EÂTˆñp <·•{""QË?L“3_²6}G|:¤œAÉ Æ+ÓQ“:qü<·“¡HghJ^­†7 :ybÝ"Ð ·îa2ú‚IïêÑæå‘]J–pIÏ$ Lœ>bɦcîsÀL9\iu GÔ’¡¸µÛ>'Óþä™Yš;ã‘ åŒ>Ñú‰ØÚ°.˜Wï1GÃáÐ2ŽÍ¸Íž„¿¡tñùß @ø ¤‚–è˜5ëqêÀY[öËÝäC§Šnå4¾Ö€ÂeÀpÍžŠ¤ºF”Ò:zŸ$b?vº9ÜêtAÁÀaÌļ³C…ú„U6q¥:I%Þ¤Ïè«ÃEÙò5J4å,wW?ó’ÝO¼bn2—Ðò¦å5õõ&y³Dò"Űó„m x$l¸—Ͳ Àº¢¿‰y_Ãu¸½t?¦²€qÎ-ìD}j3guKdós {üº”—òtð}endstream endobj 923 0 obj 593 endobj 922 0 obj << /Type /Font /Name /R6 /Subtype /Type1 /BaseFont /Times-Roman >> endobj 919 0 obj << /XObject << /Im7 921 0 R >> /ProcSet [ /PDF ] >> endobj 875 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 200.999 200.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 924 0 R /Length 925 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™k¡à’ÏÈJxendstream endobj 925 0 obj 29 endobj 926 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 200 200] /Resources << /ProcSet [ /PDF /Text ] /Font << /R6 927 0 R >> >> /Length 928 0 R /Filter /FlateDecode >> stream xÚmT¹ŽÜ0 íý*“b¢Ž6@>`3Ó©&ȱØ)¶Úß) ã±ôHñÓÎ…ð¬ýþØ^7.ü}Û^ s‘rÑrÇi£}vkåÂ4w€ÇÆÁ{ÇzùŸÔÉ »Ðµ<ÁE¸?¶û£|¾mŸ¾¶ÂÍÊí§Çá¡ <åB»t<@ÔÕ(ÞÛãï·çíËÍ~+Jø/BåÇæ¦ß|IIòPäÄ/ÿðc“ä_7îd…mN·Š°5÷w”›v ÛšÂÌOï×^jÝ)Wªª¡4›N¿H›‡ZMäÂ5dÀg ysàZ—åE«y\àL7#U±Ô”qU‘b,.Ã}€ÁcI¹&ŒÀŵüwbœþ’ªÃOÄ EÊid"‘œ– <ÓU)×Àc 8Ñî Ii(¦†6 2~‚oa¨“K·émB¤5uƒHótË­e¾Ä·t‚‰³B»2®92FÝG‡˜r¨ÒDﲨ%…àæJCè”.󞥺‚0–ìQNë©°­|A½Z‹‚8ê–—–¾/ŠëhY@èB¯ÿ }A« %ÚÇBÕç ·œ±e¾\½¢}èè¢ûö=zÎŽ—Á9Zv$•Ù#”Úû$ÂöyÒÌáê~@o(8Œš˜§q”nˆ°¡¿Ñ‰*‹ðNëeìJ¼ˆ6"¯'eÊ[Ä(‘”#ÜýÈ!{xFݤ†ÐŠöB†å˜:¿JN–HRÌ€7¬ÁÃaÅ\VË4ëŒü&æ5†þ=s§þEs9}-Ê~4N">µ‘µ¸%¼ù=º ëö´ý¨Tˆendstream endobj 928 0 obj 618 endobj 927 0 obj << /Type /Font /Name /R6 /Subtype /Type1 /BaseFont /Times-Roman >> endobj 924 0 obj << /XObject << /Im8 926 0 R >> /ProcSet [ /PDF ] >> endobj 884 0 obj << /D [886 0 R /XYZ 72 786.278 null] >> endobj 867 0 obj << /D [886 0 R /XYZ 119.696 314.795 null] >> endobj 885 0 obj << /Font << /F27 394 0 R /F15 393 0 R /F33 497 0 R /F30 512 0 R /F28 523 0 R >> /XObject << /Fm1 868 0 R /Fm2 869 0 R /Fm3 870 0 R /Fm4 871 0 R /Fm5 872 0 R /Fm6 873 0 R /Fm7 874 0 R /Fm8 875 0 R >> /ProcSet [ /PDF /Text ] >> endobj 932 0 obj << /Length 933 0 R /Filter /FlateDecode >> stream xÚíZmã¶îç+Ðßà~“‹#¾‰T‹½9ä¤rFP - ­L¯…ÈÒž$ßÚýõ™áPZÙ–w÷Ò4M‹â€5_†CÎ gŽŽ/øÇF,ŒM™0vQì^ñýû~1´¾‚1¢TZ2­°÷ a¬´eY–BC1%Íuúë<8gÜ Úë³Õ«OÞ³à Ë’l±ÚxšÕú¯ÑŠÿcõõëÕ·oÿ²ŒµÐÑï`à‹Cïêõw_ç}[þ–脦.Hwžà†z›ªÉ{j:\ßÃB¾üûêO¯¾X½Š53°}l™J€ƒ1™ÙEë›W±’ÌêEÆ™.¤e\È™éØÀ_&xʬ54ÿ¨µ„©T.bÁ¸Ô£ÜRÎÈýöÉ®'s r¡Â<Š=HpÆ«aÝH7J)“`+–§3çŒ%“ÐŽSƹš‘søPD,€‚ÛQŽ“³ŽöÛºÎ-c)U´Ù×E_6u‡]åUÕ,E=ÐlÞÞ–}›·Gìò¨+òª¬ïh®¬ñWDý6°j]w¿Œ…‰pü°ÄM Û¨i×e÷Ž–­ËÖùÙüUEï†µåæˆ{xžy_ÌÑ 2/ù˧1Ÿ±‰ÖàÅ<ëyÑWG’ïXºjÝѱveÛ6m‡Gèˆ8ä‘pì6ˆg¯×PDù¡ìÁBé“s½YZí[àÒîšÖ£ËT"ÓÙj:õ õK`ü€š0Ðæu·iZ¸"Á":†•xˆÀâR¡0¸vAƒµFšš~˾sÕ&ì^¯ÇI/øZ†~34 EÔà±±ÉÏ·D£e©ìˆtø©ÜšÖt[—£~oH’®Êk”¶'MA˜çUׄo«òýÞ…ßÁDoûSþ$cÓuåmNé¸ÜÒ û­ìÔ[Fo ~¾ï‚9壽¯B¸šcˆÐLi %p-•þyÃê;Ôá—?:ªzÌUžeÿbX}iTU¿ì¨ª¢¨ŠWëŠçˆ„iaþžóÝ¿ÃsþŸŽZÇy L¤;1+ H͆F¶Ÿþ ‘2rŸW46‰ªÂ¤¾p|iêeÞäg"„õËg'9S€‰£-òtï÷ö}~óÚ{é4™p0 3©~=³…a Ï&:P†»ä§8Ktú¿ŒY3ðÛå8ŽtÆ[J„Ô))é¸ö¾u=¦&Ì»À58Bb.ÓŸÐò&À‚Úy}Wù¬Ç)'ùùŽ~w.ïö­g­QµÍŽÆGFCÒ*=.²þd@Ií¶/ ¯dÜå0ðĤ& ¹ÁõÜ:FEµ»Ë§|äJ]f¾Ï/P `!›F˜”ym|æÉÙa$Lßs.e93æ9,ƒ}¼'uÄøº iÖŒ.ÂÕ Û”•žz‘äúºÁ)xú4Khq™M|ߟÒãhxÓSóÑÒØó–&7>ãFˆ+Î/±ÇÙÞÐS=54¡U5ç78|fï÷mÓ{ I›a4Á-Àò÷Û€†íóoKG¬§ð胼@îG'3o¹d–1žØ'ÒÆwóD:³ò^’Í$K”úy\šç—Þ·ÀÛ@=ð­K –¨ö`Hï|I¸"x/Úò®©›ƒFqº¸£Õô:›,n)r ]ðñË0%w™1Ñ=žS(õˆá<¿¢© 8h}zØ3ËtvzÙOžnãg¤öCIÏØÒV.f3Љo.h\ã©d.@A\L-‚;ÁÃ)‹¦»D¹…ûi?"Ïyœ,<êWó!S&ƒÖ Z\;‹a©4y1Š)qú®~fôcö¾V?¡A|ÖÒ¿\ƒSÓJ ÙB(€Ãžê·3Û@pË[ë vÔtm;lI;ÍO:‹Ü’:¤¶ÓÄc4œ¢—°£N7•˜ýRz4ÛhíîZç:†qR†×vF{Õ$ßA// ÿþ¿£¥äñuÞ®©w T®Pj t~oNòsÊ6¡—üj&[QùCdáPIBeÀú µ#È,@’²u©¦Ãa½G²°¨s= Q7gCÁÃý¦(ñœ&êÃrÐ; ÂKJàD %)WÝ…D=lµÅ¬¿ï®–ZŠfw_9_Â1X(£ÚUhDÔ`7 3ªØ8‰8h?x7„Øk°¸u·õÚ%êã\í ×uTÕ3š¼9"ý1‘H98ë‡wøÍÃa˶¨ÜÍ ä$L Zq‡Å ¾ÕP(ìŽdøü0Å'([Ù–b¨2W^­Èp™2)ÒŸ‹¬Í¿Žxß¶’ 3½|Rf@Kq<Ìjwºì8·ì8‡t@S:סN y#3â °#5üd/‚;¨•üïÇ; éÅ£‹¤3rhàÅä ú€ žŽY¤çUyˆÒSða¹=AVFß,34]ÿ®hËûþ÷`X.¢?7„E`Þß ø]-³4:‡VEÞ3á’Ϩ86r«¤šT@X€PB`uã Lû €CùšrMC¥6ð@h¢œbK³ï©…”àXá<7 R,zû`„uÛf_ηm (ë#u×eWì».h¬ËM<à ØÌÊçþG€ì|ñøÉŠ—Öç[¬)ùT~e‡,Í×iendstream endobj 933 0 obj 2620 endobj 931 0 obj << /Type /Page /Contents 932 0 R /Resources 930 0 R /MediaBox [0 0 595.273 841.887] /Parent 934 0 R >> endobj 929 0 obj << /D [931 0 R /XYZ 72 786.278 null] >> endobj 193 0 obj << /D [931 0 R /XYZ 72 249.403 null] >> endobj 930 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F30 512 0 R /F1 882 0 R /F26 391 0 R /F31 881 0 R /F40 548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 938 0 obj << /Length 939 0 R /Filter /FlateDecode >> stream xÚÕZÝܶ÷Kÿ…ëStÀ-#~èƒ}°[uÓ$†³EšÂw¹·‚µÒFÒÚ¹ |g8C}ìêöì¢(RðŠÔ’3¿ùÍèäM ÿäM¦n²<*Ëo6‡gò†þ}¸ Oß@IšD‹Ä`ë ÁU\éDäi‚ò/ÖϾ~%“ Û›õÎË®·ÿŒvms¸]ie¢~ïð!‰ÞܪdmtpEM®EW°p`Ò\±d@Zyßa! q!¢ÁäÃ…’]eèt6I¼•K‹0™‚¹ƒ{çÆÏ‘©nWR*ýзÍR=ÓhÝð›DÞm±éý6 ùý©¯Ê:ÌÆV <ÓÒÄßÂ=À…Büâ@•$QQVÅûÊawrnQÊfhQ8À[”úŽzKj¹¶.*Œ~8¸;’±lÊÝ òF€â^útpp ÔÁÀzZÆêTH¼éMQÖýúáè–àB\»`ÕboU AÙ‘e½-7EOؚ™$³IèÖ¼+ª„íàÒöoqƒü{:fhmzP]â-wÔ…·3›‚ÝŸ®ªã>ŠÝØÃˆ#¬Å“Œš´ܬBÏlæ.̱ ® ‹Úò~ï/è·¦¥ž²®?²TŠrío¢À‡IÇ<'µ@–˳ùFx’Ö$Ý7Ô3@vzx©/ô©ì÷Ax= ÚëšzŽE g|ªŠönaGdæù‘ž$ïX°l½m™èǽ«ivÚ¨÷Pœ`~åË;òÚhsjI{Ü•w…¶ÕXŽÐ[%'F¨ã/^—5ïÄy* ¯ðXȇax »Ã'^£G=ˆÄ{z"“Ä JVУ_Œ}ßu½ð;”)DÇt¶ÍYŽDmÑõwÉ;¯w¦x 6lòY€Ä TÚæžâ|VWŒó Và:˜È·@ÒØ±&ƒJEÕ5¤Ã‡ºñT³ÒÈíT‘$r ]ßÞ¢pø³%Ü1€ÄY>ðï~ ·•µGf›$&zQtFpÃ0àYfþNK´æÔž™ÞWÔÙí >@¿ã8l/ŽîBAa<‹CŽäŸá²Æ<†'+ª&<’-es˜¬8…!åÏü¸&XN‡3a{êèZ§Ž_iô\ìápTS'a >a\ǧ$ Æ$¶ýÎ,3ÚgÃ$yDhêhu [ £Äñ§îDA e7õaŠ£MâÂþ5'ªžT8z˜°:|Ýw®ÚÑópؘ<0®Q7ŸáçSAnQö¦°ÀŽÇ4ÏÓ÷£ßߥQ¥JX;ݕղ¸é]ý£¸RA?xÒŸÈ%á´OÍ;*賤Ûóž»%M‡Lî*‘ BØ:ˆ<{¹J$1æE Øô©b ’N5]|êË"ÊÎH€&'O—jϦãëšò@u$ x+ÞÆ·sËàüÑ›ô¶AÒ¡SóyØ&sÉ‚òî|[à>þ`WJ‰ÒÊßÿá'F'8 >õ.Ø«f™Ë‚¹d*ûÒ#Œ¯¡þ?8Á­ ÞI€‰ODºÛ’ø¾wìáœ=&vÁ<Û€Sž†ñÇ‚C?ÔÇ$Fç.àI8'°]JÙ= QžG|ŠÈŽŽ*Š­ÔJÑT'æÔ8ŠÉ V=3‰uØ “yÃéÏñ½» DÈ sŸ*oA1gR0¬ó«µÌ ²ƒ °Àß %mýHÆkðZ!^WÕ–À=H¨1ç”w+n´Åq_n:NB:ïŠÛU9ú€Šœ¸4ªŒý8yóWœ¦Ø 3ÏÕÛŽ«cÏ‘Ô\njÏK<67AKŸÚq·e‡Æ³%!ºìߣ ƒ“9Þù×çùƒ <Öë’¯n±¯%qÎ;’qÀ4Ã\°d*3ëY<Ê8ñ-ì&V?ĸPÅc¸pW^Diá%)dï&C÷£ ƒ—†§o®¸dþú»æªäUÇâý#ÎÙÊŠÔW¸¿X]k.N€dUøªv2åÀ‚‰O­©Vd£cK°q]7q °É•)Ë—s.äŸA1”™êÐìÑz©žŒ¹<”Rø¦áßÇ4ä¬ÈO2-üð’5²ÊWá²Tdçì¿õßYÀúI¶]äÞDw3ö‚žMQOÁ™äÄ_½…è“ÓÊAŰ³QÅyØÎÃíPR/9ð_)hò’óo^ƒù2r*‘@f´2öŸ=níWâ©“Q˜]üÀ¸j8¢D%ÑZ¾#"ü ²+t êÞc÷ë¿Üõnm5lb•xú°Ê…âL_è@¡m~Óº›Ý3ÈDžørz£ALé…׫ þ—üÈAžgô~üø Œa¥ sJ®Ó†W‹ŸRì`ոᰇ³)¸Ø?údا6BkØ'lW¦ z®´Ðð¼J…”faŸT‘i*fJ™_G¬¿:4þ…BÃåN“…¯và52ñu¸‹s4±ƒ‰³Ñ ¤ +,¦Y=ßyŽŠ}#(PI ‹©<ÑpØê›…‚ 2€ŸÊ>^¼d&c¿qºeßÑ ç¾`¨ŠK:m0§꽎,à+4CZfÍK´¯{ú‹ ¢A Õe‘’p÷áÈ_úbÀOEÉ÷ýIÑ#ù¡<ðÓ'_O[L#’!#ÿÇà;£mè°ˆ=üw*uCÚuå¯nµu¨º…t06¥…ûضèñNM àÍ™,6!Ýú¥Äòö*KSô5…7M½åïF“G `p…Tï/å((>1<ÐÔ÷%?õüç5ÔòPŠhó ècµ˜‚Ïc^T;xA°ÒÙL°03§ãòåÛ·ï¾óî»ï×ïÞ¼|ûíëõúåªH•kóyAQÆ@†ÒyE‘B©”°<8|†dÛõ{Úô–?€4$4|2hªðe„‡søûÕÇœ‚ÇókŠ;ÓW€SÙ\d6û ž‘%³/ûRšž:^g\0\4‡pMÂ09‹cQ¶™2Á•4àöÄ]Ï®W÷’ä%2ŒLæFv˜]!Ãpîéçpa-b0Ìß5NþK\˜Ã×Y±r÷<ò/ –Úä“‚$½( ødøJâß`Õ?Iendstream endobj 939 0 obj 3397 endobj 937 0 obj << /Type /Page /Contents 938 0 R /Resources 936 0 R /MediaBox [0 0 595.273 841.887] /Parent 934 0 R /Annots [ 940 0 R 941 0 R ] >> endobj 940 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [289.423 334.083 294.878 344.992] /Subtype /Link /A << /S /GoTo /D (section.8) >> >> endobj 941 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [328.211 334.083 339.12 344.992] /Subtype /Link /A << /S /GoTo /D (section.8) >> >> endobj 935 0 obj << /D [937 0 R /XYZ 72 786.278 null] >> endobj 197 0 obj << /D [937 0 R /XYZ 72 618.481 null] >> endobj 936 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F30 512 0 R /F26 391 0 R /F43 549 0 R /F1 882 0 R /F37 380 0 R /F39 496 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 945 0 obj << /Length 946 0 R /Filter /FlateDecode >> stream xÚåÉrã¸5çÎ!¿ #]eq ‰¹u2vÊ™é¥ÜJrȤºh ’™¡I7—v<_Ÿ·)Q¶'L¥+åƒðñoß,ü‰E/Ò, ã4[¬ï^‰ÿý´ð«ïáŒ!•–¡V¸{p©t“ÀB…J¦§áOã"YÌßúýêÕ7—qºQh"³Xm fµù[PTÝÙRÇ:X‰(mÞ|èšú'{Yæ»#ñ³è²®º«ïà8ûûêO¯.V¯–:LñÒ„3ðÑPšlÑØÅöÕRÉ0Ó‹,&ñGÎ<^faš¸s‘„Y–òã=C¢P%r±”a¤Ô@’”3$]âݾ¹zô ¸+÷éò$ žixo€È”*” ¤VÌÝî%a½LBï“éé<©±Æ!²ŽÉ]=Ûº9[ªØ¶ÊoÊ¢Úñ.¯6¼Øíø¼EÁÁî¶ZmïÏ–qØuW|>ÃEùx–É <[¦R«[ÛZ•"èÎâ,x@¢`ÛWðR]µˆ9T]ßTü•ˆ!êŠÛ~½¶m»íKä\|)P °®ïîK‹ˆ8ñ7O²`)ø ¨x¿Îé*)àÝ:PþÙæEÙ7®œ)ƒW~äóuîPÖUùÈ8”WÅ–%;Ñw¥ ¨Â«éñŒžHª4õ¶ÑòGªºcÌŸÏ´ò²Øu$†û?Ükdß-1a)U ü„Hâñµb j»ï Ú¦©ê™{)fq2º—„϶¶ãEWÏ Vq¨T6 ¾¸¾þxõö/¯¸úîãå»·«Yò…Ppco(!bOƒ?·¤c¸ìXi$ŠÆëðB¦*hŠŽ™à „vuªÉì‰eÆSîE ›·¶Z[^²òÖm[Ü”î(ïÜoušøÈ›®¸CýÐ&Fýà³ÊvÀZÚß‚þãR én‘¡Àc8x(ÊWqpŸÏ‡-Ínô‹@:ÿ¹|Ýõy Šxl­-áûø&ZK“·mŠŸmÆuWÓW6–·ÞÚ–MÕ˜p—;Î2}uåÛƒ'D¼@Æ=ZømÞÀMmÓ¢ˆ ³ ŸÞógp8w9 `D‡&21¨º”ÒsV»kr¼:nÈWIé™'cZ%ø›­¸uB€7H,pBä⛊r G/K¢w¹ƒôó®pwýÔÛU4$‚À]t½#é\žX¥¬Ÿˆù…Ì=Ï/>#ï…‹#¡Ê’A“yÐÆò¢±Ÿú¢ñ Ä$<&Ááâ>oºbÝ—yã!Hµ;~ n¥ô€àÎmóy°¡bvÌ#Ç)æí¡dÏ™1½³hX–õ®Xçåˆðy'–ÌÀf…~†Œ²œŠYPk†¶µnóÁ®CE‡(ƒo‚¹4*Ì8œã1>üiáWß?u(ô!Ra ܪӹÕilŽ+÷ùÎß"¹KØ~ÙÓèè‚ óo\3‘ÐÅ–$ ɳßK¢`Ý7ebX”Ú oÂèÏ®,™º Ü- ÀÙŽaÁ2§§’sÁ+ ã$}6¦T&EnºXÙÖ|…NSx6Ûvƒ=@Ǻˆu^Û íp1;³© °bð}) dbQ I¤ S•ü:ÉômÇ©ô›zcQ*‰Š|"•6£Ê'Ré4„xü’\Z„‰Îþ·siõÊ¥¯ærB¸¡R/Q_-³qê…+H %L\JxÌ‚Xùüf–•*ó,ŒÙ“nŸs`ð9& U‘/J‰(àäÓ¡É£QæK“GàÏUµÏÙ²€S¤¥àÀáFcÓ­Áã4.ž@Ü?÷i‚ #Ûº,ktDCèr¬ï­ Ww9‚s‡!“{^~{è"t¨a”¨ç rÐO™È‘ýÏZËïñëPiý|¹`ê9çͰ=†WÍoÏ–‰ôYTu“drq² AXaÍX„±£ÁW_bE¥£ œùr,BÆe¤·ûÄw‡‰~”#\ìT*Gp4 $TðbU9ÎÇÜçw ”®ÔôA8ÌgôÙ„Iäïû>'¼z¼·s Õab< å7YTF¨/hŸBõY÷ k¨ñÉQvL/ž½¸˜Pä šù’ ΀N£$ÒÆ&géã¬ÕÞÙÜ-ÛÍQQ7ŒS‹‰øL@¼À¤œ¾ÜG“p/\Åbé®dæsk%²±ÚŠÃR‰_eµÙTm“ùP™‰t0¹ÜõW(Éq¡„Ç›ô v¨ƒJqïëTgÀ·êŽ £˜+„Ò±_¥.úà뢿"{OFç¼Ù–uîÎIÒöÁ½uT5A‘ùdÍSžª™2-^R3Aº!õÿGÍÆ?%‚þ~®£nB5Ð4Î õ °7òHîr³RE#óÁ³:\²%á - ÷ÖÎ8ŽrL€Ù6õ[=ѺHp`÷ü8@9Ÿé*ÄzÕñoáè(ª¥«j" sjyp«{(>È!˜ˆ“fŸ×µ÷ìਯ j»Á’},|7–›¢±knêàûõÝ=Íq#ØÑö.3‚ŠU˜d¾˜ß¼¤bíAñw–ý|¥Þº”PNÃÖ4c×£V"În"E­V<﨣CÞ+ÁNð Énpš%1™4Ã<ÌâŽIWãáXçØ›Æó»bwë¸e jïBqÓ;ɴ쇑ú HiÊc7åÉ(Ù3Éh¢35á‡?òåE?â":M:¦ÓH7ÐÀó¡Ôeðz¶›¡4¨ß fIZ„±ôpÜÙG¤;×'tWÉùô¶ðiÜ‘šÔ+ÚCp˜¦ÓJ¾±yËóA7™~2!³ÑD/Õ)k…t“,%Í|3BhðZB|I7âüðC£Š´GòK°á± , ôl¸>Õ™/«³‘(Ž/ºŒö£§ÝÙÉ}ß¿¾~ýæbuq=we©÷ýœ¢Úë¼£t€&o4/IH0øSÙ]N­]Œ§l$Bò¡îÅÛÜ-\G„Òضn6°.°þá\VA^T4Ê<Ÿ£ÐÝqTu2}ïÞ|ûnõñýÅõ›«ÕêbV"±áÎ$½†Ýš”º5$3÷.à hÆ™ƒôNDÇéðU6>À‘ïfGNî±—;îÈÃc?(:w)”»èÄ+?ã(&ÕÁÆ:ÎU;LkRlò.ç•ýgÑvèÉâ,qc£ÔeôøØ•„4Jõ¡ØxS¸·H é'Ê7'˜xŽ88RâQîÀœÎx¹‡[Ë\ó#;1jÊð9„ N©±•UJÄÞ›’Já¶/Ê£¤ÔÁkj×e¾]'\‚_°uÈ'èJq¶…n H’›ÇC¡û`z`w3C›4ÔYeÞQ¨ÂõºhÖý]ÛáÌ‹BH2 ÚýxŒ’ pËÿ‚¡§ù¤a¡Fe"ðtèÀmø Ãt ¢ZCe:c÷SÌèÈœÏùx…p˲ðņ+\ã,!É­×Åf¨¨×FY—$…C±)Úuß¶\Ä“¢›Ôup«ª®~·C“™%g?È­GU—Ó+Ø>]²¹ú®s•[Yž»2p;z{è··u_ºRp_Á‹4'š;c÷ÿMá2§IùÈL>9*^ù&̨أq8+èxž3àÎ9çÊ7°O&£BÃRšçG®Ó5ºªÝôÌÝÃópøw Éÿ.ÁÇó³2.÷—"Ó$dÿ½’pT؇eO…§¦eñNËäK§eé×ÿŸgÈ(ól›/Æþ>~ïéQ§‡ ™eÇO4Œþ·‰)ƒendstream endobj 946 0 obj 3071 endobj 944 0 obj << /Type /Page /Contents 945 0 R /Resources 943 0 R /MediaBox [0 0 595.273 841.887] /Parent 934 0 R /Annots [ 947 0 R 948 0 R ] >> endobj 947 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [394.423 613.108 413.817 624.017] /Subtype /Link /A << /S /GoTo /D (subsection.5.15) >> >> endobj 948 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [445.938 613.108 456.847 624.017] /Subtype /Link /A << /S /GoTo /D (subsection.5.15) >> >> endobj 942 0 obj << /D [944 0 R /XYZ 72 786.278 null] >> endobj 943 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F39 496 0 R >> /ProcSet [ /PDF /Text ] >> endobj 952 0 obj << /Length 953 0 R /Filter /FlateDecode >> stream xÚÝZéÛÆúÑù'„E¸ÁŠ!ç ‡ù¶‰ãÔMêö¢š"àJ#‰µD*$å ýãû®¡H-½ëmQ ˜£9Þ›÷æ]ó§‹þÒE®¹Ëb•»Åêð$]ðßëEhý}<ÓX[ƒ¿™¸ 3—ÚÆ.³8ÿ›Û'_=Kí"Mâ")·š{»þkô|sµÔiõ;Ï7W6‹ÊýI~&W»ýíWÏt2Z›©Øæ¹øš'Lˆë8Ñ2œ0™ªÃoµ¾?µµ__ãO \y ‰|;her½®Veï»°µ²¿ØäêJåÑ®lËUï[™V¶2øS’šýÞ¯ùWƒD“bŽÊ¦©¯”‹úÀ%Y,3gI¾X¦¨Å‚„øå仾‚ÙK­5Ëߺ鹱oʵ_ÇWKcLt»óõ5ëDå#¤ÆÄI&Z¹Möm[73º3El¬‘yÌÊÀyt óê|Ï]}3Ã$Ó±JÕÀä»—/~þâ7?>úó³ß¿¸}þt†aš4pŒå¼jÖ⌥ÎS0ÑÅR@^Ó<§új™¦JG7õ•VQ_•ûªìªz+ûÊ&Ö¶TIl ;¬S\mÓè{_û¶ÜƒPNGO}·j«#éúþNCTþŠ•§Ÿ#œp‡?s6l¬«î¸/qè=ž3Zv7² Xy&kzþîœù–tÕߥíØh¨sW¯–`~žØ¹¨Ù0¹®Ù$±Úôa“[/,Öå¡ÜÂ^ÐØ’‰™Ý1ÝUyêÐB K´u¡£¶9O€jáøJÛ6m÷’ÇŽÕ;¿ç檬¹±e¥îßË”Öw~°uèèYJàÖpG×£¿}}µ´™ŽeÅ %‚Qò¡-¾^Ò Np0ž‘ᛲÈSñ2hì×é@[Ëaóï‘­Œñ†¡¢»Ð»ièWÃ> •¬-ù'm¼D²ï/òm˜Q ÷ŸRm ¸Ô¯»Ïy ;Ý-ƒ¦`¼\­NpR²žÜ ¾Ûê Šlª©Ï¢Œ$e#fëA§WèôHB )ü®›ÚsëN6ª`«¦îªµoé(qðí®b»áqÚ¡P 3ÆÆ9žá”·(¹Òq£o1Tq÷[ØÐ©e%H'|“K‘äðŽ;r–¢/êÉØÁ¸ °ÑQá÷xl›c[Á`‡FX{žNö s¶­3ª(wѳ+'†ãþ]y8î=f“Ó±Ny½Ý55Èø[$Ùœökž#ÞÂc«m‚O¯u.›üšç˜ Ä­m¨%ØaÞ Ç]rñ!.÷ž3Q]ýB è…ì*ÜóF š£(¦\1º¬/ãæ$âY*‡fÆi§‰I‡‚^.iÐÀ¹wþ yW!ÁY¦Ž§ áàH…‡q"‘áÃæâ™l£`{Yâd{}º¯îæŠçP…HBs’]\²‚Þ¬ÜÛU½ÙC2ŸÈѶæPg\"‘¯g2ŽB†qà„UÀ¸]û²Ýb©ý9jî­½_S†pâ2ØÙsŽq?:´YRÅÒ¹ rÕ‘ƒ–DfœÕÔúÑÀšÄFÈ\ŸäãH “,: ÆcgS‡Š'„uæš++)¥`|³^U gfò¾òûuÇ“·û÷Ç]ÇýHpåA¦˜EiÎ_2yYHŽ }ƒSÜ—˜îO’¤4h|_’<¯ÙH¥Ø9{Ϧœfq¡³qP;&wäÖˆʰosªWXtìjÚ1ùðùЙÙÈ¢¼0fÙ©\}òÝí¹\¶Po7)£â¤H?^]¼â†J)uŠ+sª´'^*íïüË~ VÙèK¨ÿnn^ùþ[¨~JlÂÝUÝsãYS÷ÏŸ^óÌ9·VÍÚ_³ö ‚ø>9ƒ ”¢B‹¡ÜnwsûòùŸ…}ß–uÚ;ï4(‘S‘—Æ9ã[HëÂ-Z¿Ø!ˆ½­Öýîþú¯¶»þú~Qþ/š—‰J4¯<¶.{ؼL®>ɼ\œÛìÛ¼ìætrLÖ Gšº‡A¥ Ý ò"Ü]ÈfJH Ûv…,»¹™…'(?óŒÏ™ßÝ™ú¸0€Ÿuy Â60.«`î¹Tˆàª qT¥úÉñØ dpì 3ž–ãág#G™Õ‚!ùa±ôqê©`8Êò¥)ow¢ïSWnE'•h¾Õ¡Þ.§U±"sÓršI™3)ÃÕ|eLô=t…EqFºFuÎÙx'Beà*`csàY+5!xN!éL¬l1ܲÖs×—4ΤɆ8öÐ>óá:¶´Y½jX%÷—¥eªr8ÞsN…Ån|½­8dÛ{45ÔÌÅã(°‰“¼ẍÐÈ F)7 Ã¥ÀþÝq_ÖeÀ?["~»¡TßžFwºI¹“*©Ò+žáÛcë{¢wÿ ¼ÛSEF»3½_Òã •ôó힇儲„þ@ç€Ã@W%_pèj[.÷6ÊVÎq#ìb­UÕd«FB¢±¢Uh3:ŒÌ`Í]™L`á ៖‘½œÄ€.Fƒ3²8 7è‚fów×´Õy¾aÌ9Æ^(\ g]µž!ÇÅGp¶Á <<Å–`³4 ² ~ÝW‡Ð'—¥-´¼w–•n¶H-ˆà·@e÷¡ïîcÝ· ˜Ð±? .8¼ìü肞ñ–pÇÝœ3p| Šæ.é"ƒ*‡ló¼O¸•¬^•?æB—˜m">_Æ,]Ð-L63ÑÓÀ 4wú¡è Ez2¿ “‹—_LxÉNàe†XÌYØy~áÊ C¬0¼®:0™UÏSFj‡9ƒÛgv‚­fj‚­fæÌX°Õ¥Õ’ñpíª9O\o•²ÿYÓös®˜P£å½ ‚u̜졑Ç~uƒÑ9½¦6¢Ê=¤WwͶ.jðˆ]x£A; û8#ášr§xÁ€KÈ–{ ’gÐ[®¼ ¤f¦g*NmUHƒ¼Ò°…YJ‹n”¡gÝœîö~‰\Ö<{VqÉeåm¾PÿHð†øšRe@‹¤„.q«Bæ°cNë­âÄr¦|žþ÷ˆ/°¾Ë¢;ðP/ÖAŒñ–óÁ·  B±n>Ô…WY”è™Ä„W’š>|Á= …Ó!Á'×ô}sฬΠM߆¢ââ9òüaÐjëîÔòƒ|áÄúL&åªÉ°€é¨+Ãg&f×öåðª3ÞT݉žÃ`Ùö&. ɸ¼À)í©®å ”ìßõ?áô(ý³;oýèÉ Ù\8äŠÊÍ\³“uý1±ïPÖTß;pr~e¤…ô5ÑÙ*yðÂÁ©¨E UmøK1Ù*'yc;ïrKµY†ÿEß{!n‡*‡+³zìê©àb­ÓGáë.)­àžo?~¹ý'Èìtendstream endobj 953 0 obj 3250 endobj 951 0 obj << /Type /Page /Contents 952 0 R /Resources 950 0 R /MediaBox [0 0 595.273 841.887] /Parent 934 0 R /Annots [ 954 0 R ] >> endobj 954 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [494.463 320.367 508.402 330.367] /Subtype /Link /A << /S /GoTo /D (subsection.5.5) >> >> endobj 949 0 obj << /D [951 0 R /XYZ 72 786.278 null] >> endobj 201 0 obj << /D [951 0 R /XYZ 72 719.477 null] >> endobj 205 0 obj << /D [951 0 R /XYZ 72 698.281 null] >> endobj 950 0 obj << /Font << /F15 393 0 R /F30 512 0 R /F27 394 0 R /F37 380 0 R /F26 391 0 R /F39 496 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 958 0 obj << /Length 959 0 R /Filter /FlateDecode >> stream xÚíZKãÆrÜü 9ÀªÍ~‘샳÷ÞE<ˆv`PgÄ EÊ$µ³“_Ÿª®jŠ”¨™1,$ì²ÙÏê¾*J.bø“‹T-Ò,*ÍëÝ+¹ ¿ûE(}uÔÓX-¬Á·g:.CÏ¥¶"K,ösóê›·Ò.d,\ì7·¾ïÍæ—èf›×÷ÝÕR§6êzþ-ßo±d¢ŠÏeQ¿†— š·µçÕ]Ó–ývG6E·nËÕÕReQ±á.øšFÍÔ}ÆÿüÐ$*k“S7jjilÓq§]^7-õÛæ,O_ÔôÚû*_Ãjÿ¸ù+ìd)qËÎïh…s>B7­ý2ðØ],‡56l©æ6ïú¢¥rÕÐò÷‡ýr¼5-Q\Xà›·*̤HtÂØË öî{MX+¸UÅþ.h©X˜%ï¤ÏÏŒF-ìÄÅ2‘Á„8Ú ¨TWK)­Œ~*ú¾¬ïðJLôqO'˜‡:}º‚š¼Íwì°›‘ ŽKÅÂ:ã'¿Þï«r ã›Z›h×T8ø ÑIÄ—Ùo©^ѤZEà Ȍ÷û§™e¥‚m¤Ü!¯74—™™K%"Éô˧Â{í˼*óŽNæÍÛUÙ·yëAE»òK±K0ÆE?=”=éÂЛ6Xô¨'Wƒ¢é ôXÀê‡+¯Ô¨tK™aR;ѽ©XÍ[v¬‡k¸- Rø Õ¼¸0Ù«ïnŽæk…±0«sBÚä²±_)…Ì…7ü‰öÃ/ëþji•näo×× U`ëEõklcªÚ+®—AR0…)—)<ã,'´Ëm±¸}µ4Zdvá@!ÌBgB*=Ó ãud"²,¥ö#¹$X$6v3Q•°›·3Z’ § ·ã¾ÂN5W‚œöØoا6Bƒ–áve2#çR åe"À0gööó¤hÑRfÏÁ1ª›D¾;ì@ •Í;Ç 4i„ö74A±'Ðm›C…Š'㦴RpP8³†Iê‚`¨%¿ýðñç™u¬ΨÑI‹æ”FÊŸ¦_¤™[ÀHáÒl²ÀûïÞÏ¬Ä Êù@«Öit]Ü—¡Ê£;?_YôX‡¢#³Õ Uq’MÌ6oèÊ;ð<CbÔÌ©dBË£ÌEÛÖÍŒÄÆ8A0D Œ/äû}ÛìÛ2ï‹êñ*K"Ü€ûÍ–ºÚèöP¯“Ç8ÂzdzWÉ ½e·†\zPü—ÇvÁ ¥Àj³d²{¯sF¢#¿ÍUO/pn‰?7z剱8ë 8ã(.1/Ñ °AÔYÐ2,–Ö‡¶ –p.š%åe¬º†Jƒ‚ãË-ñ€¨Åk‰? eŒ° Àø0Ê®;°[è0ÝCß\‚ë<´ûjpýî ®?7åæÿ ýAÚÄÈBûC[{ÕŠõD-¡mŸSõ½Cõ, EOlvÊGL|‰àà>¬øWª8çA(”g$Ž ö nÛ‚•œsèße_™2•`ÒuÁиÏÛž˜ÕmÛìFÖb¢ªìûŠ:z&ýˆþqÏΧëðl/wÅd­©+æïM]„µwûЧsð\Qbx4ˆ¯„s NŸ¡œGy£©»1<»ÁC M£;Ä×~›ã6 Ȥê#üÂK·§c\—¿ÆÒx †ÚÛY§Àåe©|Æoƒã ¾ŒjàóÕãœÅÍÔcüøãws ›Ž"13U"ÒôE3-µƒ˜59ENЪô~ÃÚQE…U6}“¤×‡mb1|ÝyÍcé¼±²nèÙV]wO €–qÉXënà:Á¢2ào܉¬ mÑgãILtW=î·¯g›ûˆuÐÏ£*Â…KVt ^T´"^×6ª“Ѻ©šö„þqGåÜš‡Øë±/vùžGÕ›æ#4·¼f712n ¿h4±†Ñ^ì‘tàùÐmõÆ núBWö‡~ý7CF‚ç[SŸ ¬„üùÑW&c»€ ÖM aeQÿ ÕÎmyRz àï)¶ìºrEú}r#0ႈ¤r)èE½ÌY¿‘°E'Ìq•/zÀæOÍ¥2Bšä¨øñ’¿Ã »©OšXߘ¨i»ýPÓr¤È(ÁDDŽGÂlŠ}¿í¨ L¼T‹‹§¼”‚ÏØM‚O_áwÛQuÖ³,Àï{î5âùñÔ.½¸ÉŠØÌ³1]å+¯õqÇÝSõ§?¦P°¦ CÂ}¦@JÊïÀ¸Ž³s¤ pˆJž ]LöÍÌ4¨ø"3fŠñ þÅüÐM²u>uÙŽCf¶ˆiÚí#Õli(k5:"xä^¥ îí˜%¤ÑA±íeŶsŠE×Aèc.Љg7ãçÉ$®²Ð@éæ˜dLáÛ1Ë¡œŽ2ïâH&¾ #e°A±ÁÀ/:½Iú¨hypyK]i,<¾ŸÒa^¢¤c)Úšx¾rV¡¡%r9<œ0VØ·‘Ù‡*:Qv‰H”ÉèH‡ýk*å›M‹áƆ_=nÆQkZý³X÷¡á[â¢B°Ú\r«Â ¨ÎÝ€ò¥IpœªS*9òè°ò1ØÀ†vÐSx ‘=3ò~HBµ÷q»?_õX ¸Ä1)| ã0ò˜|>Ù¸IéžÕª°£oi2Ò—$aÐ6rHIf9'K9L¿¤/]Š¢6=´`Ò.â V ½õaõ]á?ù°÷ž5Y)§‹‹g.,﵂×8ŸNK0´0QÑgâº%8ìÃâ‚"P¿ì”Ï wEqêø@§…þx«ó9¬Å¶ûE(}ÿjZaO§Ä¯Næùo‹ñ>#ü$(ûœ ˜ü>¿;ݯsìqÿ˜ÐZɳi]úò\œ6NŒo(âŒ\ÎId”?§zr%XA‰ÆxœËÈ¢{jâœ3¶çTÇ!‰‰cN©óh û5÷täKu´)Û‚Ù,¼a—sCƒ‡Ì(Nž[ó `ÌQûèñü'8瀖1N¤æk&uç™åS¹]ýLnW?“Û5/ÍífÿÝŒÒüG?Àë×4…ެ:ò–uðAòj¢w¤—êD/³(üø`ÐKâ;Ó—˜XÐ QÓnüP˼ÓâÏ%îCìo9É€Î6”6Ó–å°v&]î:ªöf‹/.ÇútŠ;¯)4¬9b±$ ‹¸:’(ØÕùîŽ>]§cŸ®³pÄTGeÊ`AßMùç¢Qî èR>Øw6H™¼ Nr./åG×ó7K²'ðR|ÁŸI” IéÍõð˜Af".‹ÍŸIj…OáKãùOðTCž›cœ=Â0ü<5|²4òRÔŒ‚qÞúŒ¯W 8 ÚÝÓcÝ=ÁŸ¾({Ù1ÿãqƒendstream endobj 959 0 obj 2888 endobj 957 0 obj << /Type /Page /Contents 958 0 R /Resources 956 0 R /MediaBox [0 0 595.273 841.887] /Parent 934 0 R /Annots [ 960 0 R 961 0 R ] >> endobj 960 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [94.621 282.186 108.561 293.095] /Subtype /Link /A << /S /GoTo /D (subsection.5.5) >> >> endobj 961 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [155.032 282.186 165.941 293.095] /Subtype /Link /A << /S /GoTo /D (subsection.5.5) >> >> endobj 955 0 obj << /D [957 0 R /XYZ 72 786.278 null] >> endobj 209 0 obj << /D [957 0 R /XYZ 72 719.477 null] >> endobj 956 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F26 391 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 965 0 obj << /Length 966 0 R /Filter /FlateDecode >> stream xÚíZK“Û¸¾ûWè¶œÔKKáÏ21ËrÃD–Ï–»|F÷³Øú;ôÑL¥%Ó ¿>3q®tΊÂ@C1%³ëó¯ïÁ9ã¹ Z¹{ñýk‘ÍxÊŠ´˜Ý­ýœ»ÕOIY÷7s-trÇyùò׿iíã?mupÝÏ©NiìPwå¦v+úªšzC­‡mÙ»Û›ÝýmÆeÆ”³9Ç#~ïkË6@"Ó´.ýâ:=Y¡?»@|‰Ee—÷pdŽk^¼º{1×,ƒ+›Édªƒìà>™,òYëfës%Y®AF†¥ÙLæŒ 95n+tF¸ayžÑ„£¸S¦ŒœÍuÆèG”˜”{ ~ÿšëÑ(‹PaÅÏq¶¨„†uüá¬R1 Z†Gæf‚Ñ9ÜAŽwÁ8W'}2 Z+`φsœðzÞh“x-ÆýeÒÔÕ#¶xÒou $s$é¹X”}˜o[G]‡Î­ØÍ\ñ –ÃÛr³¥ +÷ÑïQ…•5~õ¥­JÛ•¨]Dµìhá}Y¯¨¯YSè*.y‚4à¿Í ‘w¼—–.UO{éf‘ó‘/F–¢3k Ë› KãYÁ PƉúËûï_M›ÁVfÚpq+×-Û2\ZpZ–>}ˆA,Ýž‰kp{W=a½¹æLòßæL $úBo"ßÞD#o²CCò°.…Ù®ïõúÝ>pƒ_²ÐǼ*À'JÖz˼F0TJMÂNà?–Õ¡ ¾%beà ?´â ÙzÚ´ßÚ0êhû-}Ùz>¢ãàÙè“Û‚ì§hz(’¯éãqá µ)˜ôôñskJ«ñ¢pdA~‹:˺ô<ý¯S•Ø@qñ»¦EÔ ×_úX×÷.úò¤þbo .|àÙSão–~ñt|Ã>X¾¬”H¼²1¢FÇž$zfßÑo["”Ë܄ܺ£àâü|X3€_6pæCB rpØ5\3~üzpu¬hνããg ÐmJî¶~ø”ŠK²"oíó‰à$d2ô5Á‡]`r÷ûå7Ó˜< Ü÷Dî¿9r9Gj–æÙr´o Üüá~•pŸ/šzË5ÿÂýVQÒ[×R¥ú¼æSÀÇìù©4[û;%aûä1‹É#„½m{jÚÕ ’ÌŽ>¼ƒÁÎ:üŽŠP4<‘˜œ¥<æWÊNBøÍ™éV ëƒ=ø;2¹ð  {9„0½=eàà gú¸°*%§B©¯¶eß»:ÿÈ;ã„Û5íchüÂô³é''<éû}UºP‡\ …»4újC"’nq’cÃʇ²ªŽìM屚Âo£ÂPLp>Î O,{ª U¼i=„w ²X^¹BIrf21¦ôöó¤r–óll`þ,>”GRâIŠ QçcŠïÿ[Š#… ª£ÀøQga}ˆ!Q”J“š*DªtŒÜ‡Â6ŒmpM5)ÿ¹¸V-ã ¬Æd_bÈ€J*¢*PÎ cR*¨· 6¥Fyv.mUy%…»¦š34‡tÁ„…è´(˜á§dï0òNµ/¢ô[ ªT%Ê*ÐÄT fÜ6qdΩˇ¾°°u˜mù9•^ðǵÀíÚ¶n¦+‰BF,$ËAšÇ9Åü9°ËeÓ®€ef®ð"Γ˜÷<”£I)ítH‡˜–'Oñ,0nN ‘=ÿî •Á*y3—À“vpeò²¾A,9¦Œ—ÃR¦ Úèåå„ìu·oGÕLäd™ç¦\”¤¶”Œé3gZÒí,ÞÎë 5 K˜óâ<ÿà¿þM”ãJJÙc†c€fëCE£@žT¶Ý8jzŒ¬íοCQÿÎÞû7³Ë—Q«rx°] hf{\Eo_Þ¶`gúh{˜•»Xµê»Þí°mÐØ›C»tñõ…rUàhßÇ÷&PÅ}x¥±­ /Oš*0¸Ã·3ª&ãæQÁ.ÁÙ®ÈÝÄìÆ5Þ[hEæ¨ý3Ѥ)mò¤¢÷öÝ›·S=ïâDñ¸k,ò?8d’æ´hø?NG`œç$vnUv#ØÔWL˜§`8yþ%ʹ,ð_N_Ø> endobj 962 0 obj << /D [964 0 R /XYZ 72 786.278 null] >> endobj 213 0 obj << /D [964 0 R /XYZ 72 199.968 null] >> endobj 963 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F26 391 0 R /F39 496 0 R >> /ProcSet [ /PDF /Text ] >> endobj 973 0 obj << /Length 974 0 R /Filter /FlateDecode >> stream xÚÝYKoÛʺtþ„D¼œ‡ìÎMóêM\ÄÀEÑ´4²ˆP¢LRvÝ_ßó˜¡H™–²ê¢ðBÙ33ç}¾3³þÄÌÊ™ÍÒXÚl¶Ü^‰ÿý˜…ѯ0ǔڨØhüº@¸” ©ãȨxó²n ¡ì)fêݪåk!hUpÒÄ)H§L€óèÄ™øòõ©m>ɃgIAÎ;L“ÏùRÖ_ÊfQIÃÀoŸ5aÜm(“#ÕÆO- ¥ÏœÒ'Lœ&_œM£Ê=`²t•'jù·u~×íK6W*ÕQx ÞÏîÁUc)#OâDe”þª]ÝUÀ‰°<ª¯äpôÎaÈ ŒÁJ›²EX•G×kÊò8»)ä¤Ãïö±ì¸ð`ÊWø+½—Òð¹b´JX‘¸ ÅtΟ"¬ÃŒtˆ@0”' íj¨»hL4îþj¦’Ÿmù¿@Á¿£Ø;ñg©ó0‚wÎNTåíT8KÈ´!æÙÀÂÑÏøÛ×aJ˜_dnð>Á7äÿ2ϸèžAL\ï{‡k¹’o ¼ãéˆlÀ>‹¸eù=šÁ€öèî…’/çZý¯kþg²ì±ê¯«ºðtdtñfz^N¨oÐ œ 8Ý9@¸ÿ @ ÁgÌÿ °çÁGp×7S…Fi¨lªéZL¬ö©_çÂçØ<‰æÆDEuðŸÙøË¬sIŒ;ÎE°Ð66=Äx1‚Á»³PƒõÁ³´nêíÄÙVÆIšËÝ?}ø8q~ ˆYÊÀD=Å'6F££>ý}²…˜“çö$!¬¦’S9´œò‹Uß`&H½ ”õ=•퓨õIÔžO¢®@„|1‰Z¡&M€¼`‚Q¼ý ½hè¤8kM¼õåë—wÓÝš´âØ­!XŸ<`±ÐùâeˆäØŸéôèÕT°lÄeXg‘ÄSëih g©¾Sµ&x7ƒpdzáðTlU}2LÕØ¦f/½$[WPó­¤iÑSpÎ$ˆiªŠðFDJÝ)ŒHìç -$°d³qá;cRÙ¸X96¿e-;˜fÅX;?žS€>€ŠjŒ¯Õ]ã 9 °w ˜Ói!¤…yeƧˆ{q™}H •Ë8ƒníD’¹‚ZJøÀD]•À.Ï6Œ½ˆ åße1ưžpÒ? L8 Å‚ ~&Ø DõI%æc»–®dÏ…ÚCIà’¿È4óü~_Úó;8C­ ã# ýœ§ÃUÙî«bð¶Qû—vÙ0æR2–Û¼­ÜCÿäм®x%£+Wu@R¼YêZ‡‡—îÙqý³Œ³á딕žv_Æ^åé¨ÌbΠ\£\pE¬ç !ŒˆÞË9òÅø/óGf:ºÞá¼G‡äÞ¾2}¨žö›vÂrxa›œ×€ä DíÓΨ¥Ó“n‡(Ýñy4&kj•RG3ËbØnáÛÍT¬@rârV}ö–X‡–n´ÔÿñÝ%5¹äÙuÅÞ2Më{Û¦¨˜›}SƒËm[ïO©u>î7‡/Rx%úD³ª°õ” ?Àb®Ã>4É£¯;O¼-€'"ñò1Œû6‹ž&Ð"@§÷â\® ¸C_\&±Mè2¼cÿè_´=Üäé‰ôõËOñ/Ÿ¥¼ñPÖ‡–u ÆO¯œÀ ¯·¹陟cÁC…ú¦°hZžá¾‰Td¤!%ÒÓ'a˜™xÆZ¥²P«„ïŸñ—Cü~ ¥Ä‡p€A lÜÚ5üF³T̯¶‡[ìËCËÿ¼7fiê¶ÄKü+7¤O(Eb|Ò€Ï'0굑¤Ã厃ÆÄ,zE5KW²k¯x½­·î‘߀€j[ÐH<ïÓwìÚð¨krËîù¶ ùPnªô&<<=6EXt¼6r |'z[“!|EjfÑ¿DØ ‚¹eMæ1-AIi†1 }Ý6Ø †=Ge˜^ÈN=†ÓžW ؼ¼Û„Ç2øDí”cƒyƒ³ƒÿJ³ÅŠ‹ûUqç§)G'!Q‘VëaWÞ¼}xÉ5ÂÌHU~•Ÿ÷;híá£Ý”k~ë€mÇgºQK =Hõy/ü›Cb®¡6íl+˜ŠÓ›$`z)ÍËIå¿ïù‰endstream endobj 974 0 obj 2399 endobj 972 0 obj << /Type /Page /Contents 973 0 R /Resources 971 0 R /MediaBox [0 0 595.273 841.887] /Parent 976 0 R /Annots [ 975 0 R ] >> endobj 968 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 30 20] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 977 0 R /Length 978 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™k©à’ÏÈJŽendstream endobj 978 0 obj 29 endobj 979 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 29 19] /Resources << /ProcSet [ /PDF /ImageC ] >> /Length 980 0 R /Filter /FlateDecode >> stream xÚí“Á ‚0†9÷Äo)r# QnU^M<›èÁ¡#8èOŸiNN$þMèkûú•¾÷G Å}ûõ·»x¢¥™¤Äö«8Š{%ë´w(*!Ë3ÉÓ¾J3y€Ÿ,TIQméó×Âõ°ÒZ_­Ø¨ëz&6Ïs6´Œ¶mÙ˜#cÌÛuÝÛêe…¡snš>8w<ßaù,Ü@x<é‚£”Öß¾±r|ü-&`ƒ О|Áw3ãs:Àú!åUÌ„ÜùX®4·Ä ÃÐ…á&.EDˆgÛqeWÏ Çó¨ÿ“_ºÄ®G´/{)Äendstream endobj 980 0 obj 255 endobj 977 0 obj << /XObject << /Im9 979 0 R >> /ProcSet [ /PDF ] >> endobj 975 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [393.34 169.824 398.794 179.521] /Subtype /Link /A << /S /GoTo /D (figure.2) >> >> endobj 970 0 obj << /D [972 0 R /XYZ 72 786.278 null] >> endobj 967 0 obj << /D [972 0 R /XYZ 120.726 535.822 null] >> endobj 217 0 obj << /D [972 0 R /XYZ 72 217.517 null] >> endobj 971 0 obj << /Font << /F15 393 0 R /F33 497 0 R /F39 496 0 R /F27 394 0 R /F26 391 0 R >> /XObject << /Fm9 968 0 R >> /ProcSet [ /PDF /Text ] >> endobj 990 0 obj << /Length 991 0 R /Filter /FlateDecode >> stream xÚ­ZYã¸ò¸òü²ˆk)’:˜<Ín2É$AÈ4°Ù`![´-´,yuÌLç×§.ÊòÑÓ¹Ð@›*–xëøª¨d¥à/Yåz•Y¬óbµ=~•¬øïiZsÚÔĩŧW×smÒ¸ÈRäÿöñ«oÞ%é*Q±Snõ¸#ÞÇêïÑÐýÃÚØ"Úõåv¬»¶lð9‹Êc7µºˆF|Σn't~<ÕŸ}ÃÍR8šÙ?ñÃPÿÓñÃ?ÿôÕïçÅi­c“8Þü´ ­ó.ÔÊÄ.uóâu±Êc—/—ž$×£±ËrØwxóKbJcí ^ÇËÒù¾å=/B€VÏÍCÙVW½§¾Û4þÈÔz`bÍB컇µÎ£jÚú ×½Zk“ÅiaWëÏËÑ„ã…imùrûü|Ê¢-Žq(ñˆp~"•-7%v~Äž)Ç®—Œ×òx]+¤ÞŸz?øGKÚåªE$ÞT”Ŧù­œ™|{<ñúHlôî&îzæòŸqO¦(¢zÇc?ã@ÝÄWj/•_œXΛŒ'ªëÛ¡EŒØª¯ïô*UŸ@ŽA0À«”l½GÇ‚­m×tÒ[ðV‚»HH2­4IXÈZôzÂÞǹHãÌß¼3fa­ZÛØ8-6û 渰çDÇ…-„¡ä]ÕeS—¨Í™.„ª›†'|jƒWãí¢=,qÞཕ%ÎÅàŽ¿´²–n…A³öX[ĪȯÔç4ÁÌÚêhSÇòÄí‘׺‚îÅ>ÅÛ‡²âƆ\¥‚G ~äÆ(/–û}î¾YèÔEžËœ…‚Ÿø¡©xYD,·ØžIøäLö÷éPow„ AJI8ž›-„Q pÁ¸#‘)\l®|ç¼K0˜Ô¤Ñ·¸ “ád·ÙµAgbÐôñDow`ýsÐËH2ØÐ ´ít»…wÉy@ûhlšz dÑTê^¨™¬tvÃoîØOSæà¼KÜû3?<ébŽ!ç„ËÌ"ƒÃ!oo1Ã>†btƒøú®›z¦Tõ°v;^Nî™ BwÉ“X©-лý‹ ð¨ Lh°»PiC#¹—G)Tóâ yT> x0Dê~ªéV‘%_ÎÇ®<¬ÒÞË:³ØØw¤ T£nÔd Í”é­‡Ž ¬å&ä’‡±]X‹¦¢ZN³±N.5Ž9àqáC§)jCkÂvȳˆ,g-]·( µ¢gÜÞ–-§ƒ© ®²hšÙ週A6ˆ£¢1<€P¶í4wAPßA;lQ £¡ˆÑ1¤œès n‰GGÃñ¶!dhDq̺ÕÆ´à9tÖí7Köñ'-o¼dA8¿½¥ÏL:$¨‚Üî#,šÒÒvKfž‡*P6ç’R°zB h‚¸1¥ÃGvÜØº,µ!åPïi}Øö¿„wÞgìôqØ0MÕM›‘Œ 4äÂ<• çIždE#w.†ó +Øœ¥Pм;lœ$¡ló¹úXß îàH”]ԨɲèÔ””_f9È©kÄUg7ÕR$eÅ6'ÿ\ɆŸáàýÈÃFÅu3¦Ïò¹zE;_¢Û~#F®’KÊ ¸á”º÷o.¢‡^ pJ:çHQ³8ÁÉäè: ” °v`ËZâb`bm A{@D šÃ2È%átþý46u€ÞUì_VMV3‚ìïá%ëb§³×Q  Š”ÐqnMµK~$«ÇÆÂGî˜Ãq‘°õHŽñ\ˆH™pOÇÛ Ã2‚§dTöÂRò»è¼4ØKŸHuNHy˜…Œ‘׌©ãv뇗\‹@_UŽ%X“SM#•Ü÷ΟªžEvvv4!Ï‘rÉ(ïê~Áð UÅMi;Ïwë6*ˆóÌ,§‰QÓ`•ˆ€ gä©À,÷ÔQ^¡nTöÀtô#˜½½…qƾ”’Ç #K„4pf[v>Èé?ƒQa Fÿàá½*ô †ß®´÷Á. ')¹ ¹<8ËÞ¬;r¼0Ÿ¸NYÖ”@&è\æÕ… —'Q(÷•Ö†Tµ¼c8Ô„EÊ“ #‰i®/úDŠf¾„è+f!}fÅæFnKàQktÆÅ낊×8WWu~¹Õ›‚&G'&©ÒË'Я©ƒ Áù–WÀXõ w‡›5ì_\êÀèFyàê]ÄQï8â-TÙ¨‹>ÖÃT†ÉØÊµä%K¶àBòv>Á)P}5‹>P®GÅTˆ&ÝÈ J*çb5`ßøÛ¬êDE7 NЀŸó8„“°Rîu‘ jdgƒÖ9,rf´Û‚õ«{5³8Ï36îBÊ 2-ÞÖó,tßȤÅýR†)”)ðÉÿl…ëÊx!¾·HbH–qyÛÉ·|%5Kók7ž³¦A®¹¡ºñ-nL‰•.¥ô0|Ìäáü^¾Óò°í‚ ýXRºQ˜Ñ©Ô¤é" I*ÞI1§©øÎñefÆ8™ ÷I¸<É8(cBO7  b‰ñÀUÔð\Ñ—84Ë)[ ê‹«K¹ó”«‡9’O4ˆƒî¸puSnIŠîÜhš„ f;seùDËá|­‡XŽ?@ÜLžÈàWáÚ/Y|õ€£I-O/öðÂdz óÌß„5‡›Lx mNÛ–[¸­Â8´Ë†¼?%@ •Õ¨t± ècßqV\ÉË\hârràWwªáNʼnJ^KË {ÌBáé(%JAùÉ´ò »èƒ„ÛϾ݃ÅɉÑnΈyßv©ì2!> ”?‘‘oRÎzƒš éÒxÌžy¤¾Z¨PbòÙ -™D2{ø2 ‚¬E"ÂÄ¥o|­¸Ø8¿F¿’ˆ`>BrÁà¶x!äJ!¿`ò[þ0çºÄFA«} 樕†,°r¨Ë®Tl\±êýj·KyaП™>Ã,XØåÅíWpß¼³ŠVÆÎ¸P–^VËrx¾î‘†“ÆÔ.êWi6_Ç"e?·øR©’‘aýïž™5¼K._­à”óP8äKÙP4\û«ÊM}N¨È¯ô³ÃBÏÛq˜}9È&æD$”šSúXF°\œ” >üˆlÄÏÙú­œÆCד[HYŽ!“tj_‘öïèC97(G~¶e§-Ž×"êš)|‰2Mb£Ÿ'J3åò,‘._—\m»Ó‚eþL‡âB?OQVü}“ÉŠó뾸y¬÷”¿<Îée˜¥ KèùÃãKBg`Ò¦zëÙ¸¯ $¨µ›×’0¿¿uH^cÔ A’½–0d7)‰6:†<õåÜò_* Zöendstream endobj 991 0 obj 4047 endobj 989 0 obj << /Type /Page /Contents 990 0 R /Resources 988 0 R /MediaBox [0 0 595.273 841.887] /Parent 976 0 R /Annots [ 992 0 R 993 0 R 994 0 R 995 0 R ] >> endobj 992 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [294.319 748.292 303.286 759.508] /Subtype /Link /A << /S /GoTo /D (Hfootnote.11) >> >> endobj 993 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [122.441 531.505 136.38 541.202] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 994 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [319.427 305.559 324.882 315.256] /Subtype /Link /A << /S /GoTo /D (figure.3) >> >> endobj 995 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [459.301 291.404 468.268 303.226] /Subtype /Link /A << /S /GoTo /D (Hfootnote.12) >> >> endobj 987 0 obj << /D [989 0 R /XYZ 72 786.278 null] >> endobj 221 0 obj << /D [989 0 R /XYZ 72 407.847 null] >> endobj 969 0 obj << /D [989 0 R /XYZ 88.587 141.006 null] >> endobj 984 0 obj << /D [989 0 R /XYZ 88.587 119.088 null] >> endobj 988 0 obj << /Font << /F15 393 0 R /F28 523 0 R /F33 497 0 R /F39 496 0 R /F27 394 0 R /F37 380 0 R /F30 512 0 R /F34 583 0 R /F29 547 0 R /F40 548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1000 0 obj << /Length 1001 0 R /Filter /FlateDecode >> stream xÚÕXKÛF ¾oý :Ê@<ѼôÐCƒfÑ´I“ F‹¢)‚±¬µ‘¥$w»íŸ/9ɲ-¯7z(A43É!?~¤Ìƒþxˆ Ic&’4È·W< ¿Aÿô#쑤Ғi…« ‚ó^r.Ë¢ø’¼à,Žã`Îe̲,Cñç‹«§×\<Y°¸q¢‹Õï¡yi>ûcñÃÕ‹Å K&¥$Ï‚Ogøÿa÷Ó ë7ž^oy|W_½» Þí]‰“‘ ‘óN,Ï8‘Éì³àƒs¡9 Â&˜Òœa2Kƒ¦nö!îEUÆøÃ¾^Ûõ®)fs©’P>›ÍU¢ÂÅÝL¤a›i˜×Unº¢‚+ÚYÚnknÛ'°ÒÜGüHÔÖm­êÊ+_š¶WÐzEþmÞûƒÒv­Ö¸ŠCS­0˜à0`®œ‚<‡ÄªáÑ©Æÿw]i«¢¥j€v›Â ¼¸*ËbÅŽó„VðÉ%\¢ g™Ö—³¤$HkÝø3 öè9ð‡•%à͹J™ÊÔ9 ˆ”BT(@Ŧ8ˆ­_ÜøïÚwöOL¦—Èg" 7¦1yW4'áQ®>†6¤„‹&@‚qÁ‘OS5À_ÄÕŒ+0â üf¸XªÂëY‡u³5º|§¹ˆ˜†Ð¢’çÅMí¢%âp]n… m…Qè°Ž„íö¶,¶íõû«¢3¶liѹÃú¨ŠÆ”´h»f—w”Xºƒ~C®pngs³w‚{Áá>èMKg«¢Í»$q‚_YÚÝæ×Ü^pÿ;[–ø¤±¶[»*Z9?ñ¡u×¢ç£Ü»·Æ¹§­»MÝzíƒ"#ÿœÆM î*ZÚj¯Üaò?2V,ÎÈ6äQ¹l÷ôq(¥‡ ®Ž5j(.uç51¨à˜qüLÛî¶þ¹Û”ÀÕ$b€·:ks±X#©ª,\7Öq%Ý{àBí™ 6ˆ®,ܳ䯴ž.˦0«{óyv¬$››¦±DÃ.üèrʱ´+o™¨FÉA5Ö“ô³›…½º%.îI¾-º –îéàYû’h©¤d4Š¢ÒŽ²(”o½ ’ Ç ‹"äPËØ‰Ø‰²!ž{™÷ÛbíJ/FÛ°£ÏU‘ûðƒÁ²÷5%_!-ÆB1êÑ4ųcÔì“ =7æò?A‘±M0 œBêë)pêËd9Âðy¼¾v…Få:?ŒH3@žŽºCni~CqÉH#°§Ké]ðo¿]|¿øí틯ßüòb"QæH{yläÏH9Ù‘˜77ìgìzã€ãw¼¯‰÷Øbc‰jp‰0ßõjÏ®èDƒÍtÌtù®iAxT”¸ÞcsÛ•÷¸ŽÉ<è#àLâÆa'(huÕ¿è¦9”3Íz·b‡GÖÛªŠbU¬žLT¸’©X_.ñ†/V5Õ|l‰Æ2ï圛º¿•kqXê±D¸ &:Äéð¦§4áË '`éU%rh;S÷áQÊ"¡ï#Òó”Å'.£X‚•?Èü3a¨¯æófÔØŒ˜*8–fGÄxjæÊDÊ/3„÷¸~¼>eÇ6ˆýèJOÙYZs9–>Çø-à oôC >ç¦-è+0pßS‡dü==€( Ž7M½¥'ŽŽ'Ÿ–ëÆ®qžÁsäÜ#¾€ï¹àù1¸÷oŽŒ =®Ù½‰ò;dˆ¢ZípqT¸çGzî‹Àm £¼áq|zÂ\°wç›%W{¹ªøËŸæhl?º0\õ®\‘‘ÙçЛóf—ÎZošHøôŠ®wõß+ˆûß5¹çFj؃!Ø ã0ËôœŠmèäó¢ß‚ð%Å)çÿƒ¶þ RuÔÎñ›z¢ã¼7ÝÎ\z¢›¿zùÓc»9šôÝÍú! oä4<:˜ÁŽŸ8ñ¨ÛÐQç{XŽ=í¿ØI¤4ý×$Õgé`•K#*SÖë{Z8½YäMÂÆ9®ÀŽ)jwN˨ÝMµ!c@Güß´¶HÒü Ž7ŧm\ À+øê¤‡ƒ”'Du1ÔÞKßÿ„Θã åñP‹Óð­­ÅgPõT‹KYÇ_Üä¥Î“Bå{œõ“¾ÿeâ8FçKù4R–œI—ò«1–'¿xH¨.ñ@µÿ ýâ%0endstream endobj 1001 0 obj 1729 endobj 999 0 obj << /Type /Page /Contents 1000 0 R /Resources 998 0 R /MediaBox [0 0 595.273 841.887] /Parent 976 0 R /Annots [ 1002 0 R ] >> endobj 982 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 177.999 137.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1003 0 R /Length 1004 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kh à’ÏÈOå¶endstream endobj 1004 0 obj 30 endobj 1005 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 177 137] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R6 1006 0 R >> >> /Length 1007 0 R /Filter /FlateDecode >> stream xÚ3Ð3T0A(œËU„†ææ`QCcCÏ ,LA*ôƒÌ\ò¹ˆÆ iendstream endobj 1007 0 obj 50 endobj 1006 0 obj << /Type /XObject /Name /R6 /Subtype /Image /ColorSpace /DeviceRGB /Width 177 /Height 137 /BitsPerComponent 8 /Length 1008 0 R /Filter /FlateDecode >> stream xÚíÝÁrÛ0 „aŸûþïëöÔñĉC‚I‰ßÓÔ¿—ÀŠ’žO""""":ZÇÃ"Ð+?!•“‘x¯þO?§3‘x¼È‹ÄÿêƒßÊÊ  „jÜ8¬  A_0uÒ+²j(芣‚ÚHH˜)dx°wàáýgE–ñ–™ƒÑƒFxhG0ç ÑB¹e FWŸ5r?A›q§ 4e€Åôòm÷-J‰5 ²°ì-S˜ŠØo*h¢·úù*²þ”µ×¿ÿf ¦Ž¥Ü`˜9´¯êçÛ²’ÁþSYsƒöozú>øë YA{ÿ_A0‡­²£q—È5.æ0³èJ'~—«‘ñ"†Di0‚‡:Ò‘`[> ÆÌÁ¹ f±kXx¨ëŠZ.ãaÚ˜™r‘«+uì -Á0gÌÌE"0Â`ÀCiìKE×~Q÷ù´x¸M5Ó%ÃÖ"Qj±ŒZolÊw£ø5bb› ‘Þ(~þvw²bû'YT8$y2ÏÐMx8– 0‹Dc3‰‡ ¥ üQz“³å›6cÆ–½´^`XˆÄÌËÌaç ¥¦éµÃò¶0±9¯ 6Ab‡:‚áÃc–QàáN»Æ`Mu’òP‡„«™WAbΤàЬ¦ÂÕ« U|x¸â×f:†«4é©öä¡+.È:"e̼Dç0Ç(˜Ãµ:É%wÇ0‡ý‡‹,*Ü~uÏžû²ñp¹®²‚ oß;‰gÃx¸\1NÎøcÏe7**Þa†Üð°ùL‘NEï¿¥Lk¿û*²¾ÚHØv/˜?¤p†Üú–l9`XÌ9Ÿ{ûæ$]d:`XÛ ìS&/°X»Yôe¯æ¯=Ì4/Ãø«¯RBéÏEw(n“NrÐ%²Ú·Wì3YŒì)1‚çAm;fv}NÝ&ñ0g²Hù´sè­5ªÇÌÄòÅ6‹XŸ‰‡ÜÍ¢‰ŠôI'Yj¹Ë[z‹ sX;¬¢"v¬BY«c‡UH¨73¶M–c“9lFUÅH¤€‡{SáyP{R1mäOäAùnCÅsøê& 1'wŠ Wi?æ¨Ã ¨À•…NÌÁöÁPÁlx@Ň“Ø`@Å—âžEO·ÛP¨ÖÌáX˜á¾-7èµèx ÞÄšà Ĉ9 „ÒIs j*,½RaˆˆˆˆˆèŸþüoMÇmendstream endobj 1008 0 obj 971 endobj 1003 0 obj << /XObject << /Im10 1005 0 R >> /ProcSet [ /PDF ] >> endobj 983 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 177.999 137.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1009 0 R /Length 1010 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kh¨à’ÏÈOì·endstream endobj 1010 0 obj 30 endobj 1011 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 177 137] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R6 1012 0 R >> >> /Length 1013 0 R /Filter /FlateDecode >> stream xÚ3Ð3T0A(œËU„†ææ`QCcCÏ ,LA*ôƒÌ\ò¹ˆÆ iendstream endobj 1013 0 obj 50 endobj 1012 0 obj << /Type /XObject /Name /R6 /Subtype /Image /ColorSpace /DeviceRGB /Width 177 /Height 137 /BitsPerComponent 8 /Length 1014 0 R /Filter /FlateDecode >> stream xÚíÝɲÛ0 DQ¯óÿÿ«déTžcH‰§—®òPÄuc %]­×ëeè‡OH@åd$þþ§×é@$^o²>À½~’eè ‡¨ ëï!$HEA]TX áf'÷TXºsx€º2*é1ß_„´T€ZŽEâ?gðPq_·n7bBñ¼´=¦o‡ÊB“oO÷-ê}»êb+‡oÓ«Gíß5Æ'w2#P‡â\?b²Ëƒp¤©%Ytí>Ä6ÃC†9ôÆ%‰1*ðPPI¶o[‡#ÑÕ,€!Õºšú– 0 ©$SÍ!vyS/±a Ç«¨;V!¬Ùc‡UHPoØf.4 0¬FeÅÌHϦÂMö¤¢¬åäAøCÅ5½{…‡$jæNcÃ]Êšá`xx T£PI¢‚9HÌÌAúÀ*Æp†£ÒGÈm‚è1Fáf’ärˆ5s8–æ@x à z:¨·±&x1b„áT’Ä(› KAïTX"""""ú£_¿>ÕÜXendstream endobj 1014 0 obj 965 endobj 1009 0 obj << /XObject << /Im11 1011 0 R >> /ProcSet [ /PDF ] >> endobj 986 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 252.999 156.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1015 0 R /Length 1016 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kh¤à’ÏÈOó¸endstream endobj 1016 0 obj 30 endobj 1017 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 252 156] /Resources << /ProcSet [ /PDF /ImageB /Text ] /Font << /A 1018 0 R >> >> /Length 1019 0 R /Filter /FlateDecode >> stream xÚÝZÍŽv7 îWJKná,K¥9ÄùÏ$. bvmWSU*âC*³àöyìÄvδˆÒ]_ÍbÞøMÿ>¶3.:ÿ¬ß/ïï:¿;]=„tRŽW‹å|ï”Ø®ÐÎ6. #ŸDùJmœ5]¹änë—#·u`QRY'&[®^£”.ŒA#>`7ÌåËa"L‚ ¸Ž¿Uáåøöó#ãcÆâß©áëQñ]£M+%L™j®Wˆ›NáJµl:U|âíº!DÙ¿N¯•ݧ„%VusUG/__/Áôì]pñÖã(óz¤V®XÊ™c½¨C#P¸ 6¥¯Ró™¢"á7.dKDO"9`¨Ëc ëy(!Ó<° Èæyƒ.q`‰`TDep×A|ôz¹»ÆHW›Z£µ+'WkT„I6µtéjÙ†%µ1Ðõ¼ÁÕ¢=®…H—ß KWË6,Á]‡›»J¯× êUòŽ5\}TÄܯèÉ<—ëkʼnuÖ`Cx;PÄy÷:›B–ÝÊ{­)tƒJ6Oß¿ÁÞ/_™×£G:×(¬Ê8ÌG=;ãà5â$¶% qÔm2Øó:1)­Åubrðõ¼'Œ‚PâÆ¡e¹Óî˜ë—Ã¥X;LÊÉá­â¨ÇUîõ ã•릛S¦dTøZ3É©Œ|mºQi}žÐµÌ‹ƒ­õ^§LɜÔÜïPÝ\ŠµÃ¤\Þè!Ž{\åฆ\,iƒ§L  †Æ²gEj@r ÔðAö¯ïÑ·Êv=®kMs§ Øùv¡ˆI`;TÂÅà®ÂôÙ#êõzÄ€j6†d#¬zæ‚8¬ÞÆ€±a+Ð/8Š:ö4ä„qXk­—JЂª ´àê^’Uß1…t7-Äaª™»ÌZ^#¬ŽUyjG«·zÏ«rùŽ)·sXkíH°ZVe -­^áM¯ á;–Æá¦ÅÍe¦ÙŠ6Jn¹Èœeîš-·m˜´ì·“ÁZÚÌg”5ƒ92Ú :QšúýÐŽßU¸ƒâ#é… Kep2ºZF™REšÏú‘‡Š°«9`;Ðèò e°–v«Q–\Æ`Šm7¨Z&‚~¿´ãwf~=¢^œ]ËåþP£ƒÃ¢üãøÛñ%·«|~}†ó›Ã^»þ¿C÷-lÀ%ÿí‹Ø 9cRüÚ>ý }/˜pñÓH߬ñ3xË>û¸ÿÉÂ{eáÍãÏfaõ÷'êñC·Vï¦üož«‘Ÿ7™’®ÑÙsÇJgJ»@ÎB£Ä­q¼€3LAÜWâÖ—ù±ž½VIÁJaDáA“Q,wÚJC¸ø‚ø+Šòð n~ §@äžéŒ¨3=7¦ uxŠ“ÅÉcÀõŒ°Y”Ë3.í¥Ÿ‰ råË3«éLзfœ‘B!Å3áÆœùîÌvC”'HÕY©Œ°¯TÎÔLÌwgÒð)r!…™‚Â9ZGi…âbŠLð\nÿð!’”Æ™M‚À=FO\ЊPàÅJCFF–&uxÖʽs›Êô_!Ÿ¦Ž½ CÜXb¸j6èÉ(ƒÉCŽBIpQ= ì'†H-À `‚M$ÒTÖ»e ;èrf$TŒ“'ŸÜI(0möCS&~³èg•Â#—#ƒ_\BJUè’[ß( œ« 87;Å|ZÜ­øÍªòäÜéµ ˜ BeùÑŠ:Äá,®é‰ß…¹SÄæ*§à#ù [(ëP…ÀóÙ&\ÇCKú¨™Ù~#0xûS(ÄX#… §dô‰ù Òóž!é{ŠÄÅ`¨‰òGž6fôzÅ"l «‰ÔÝÖ«RoBmgÑC¬B÷„<¢P¤N²“I/[8§:áXÒd¾2"J„-qqé“"‡¨0â3¡_’ß„úyÕ#Z”+$¨ˆÂy1ʾ'¢\‹É‚Œ«m»)BíwaÎm˜k_¹)•€°)ïZ3BÞ ÃÀÆ™èÆËŒD7³7äeS€\‰3&–Ÿˆñ'ÑæJ´…vwS–SßB‚ c9maDm‡ZT•¶ð£RçsƒE¨¼ñ¥=Š­Q³H—W>‰tͪ‘Ñ}Kà\+[RQ-•Óßj óäDÿ1e¶ü¥0Ì{Ž£mªb0ÃâzXò† áep ì³!µR7HBoˆ„¦ ¶@‰â*ƒ¶·(Câ4¶­–5!-(¥Ék¨Á-Šor8–SnRÄ&®ÕÔ©îS§5öjm@! ×­~ Ÿl‚~VcPiþ‰Yëõ&EÍJõÁ¸* ö°JGˆÊ‰jÅ|Ê^/i iౚJÎg­îÒàÇå²Õf¤7JYÛê7 Xñ µdµ74œ°¥7 è˜áÈ­—ˆŒið‡µ |ËÖ‘Ä€^¨á] (hu·Æ&òs¢À›ŸÈÈãzƒJeÆÞD‚\Þ-y-‚e½%²ù¼a%1€zSJæèôÆÏ(Ö*ÅHåãM¦Þå¨ÊãͪÊì ­êåM¯êî±ÚÇzçeAï®ÕÈÞ«#¼KW_Y#¿¼é­¾:ÜÇ VØØP¡ås‡ŸÏ& >¿hÛˆ£qîSæ‚OJš.>L­tòyKÎg2MJŸÛ4qm´ÓÜöéOóß'DÛ" FlÒ4¨±itB‘«†U6ÒžÙØûvŽfüi+ÿ’µ~½¼?ÿò|üéÏ'ÏßúÿZOüŠ¢ŸÏï?ûàÃw|þûQ;޵p>óÙýŠ)OlžüÀ´Í4J„>a°û|Š0~Ã$>ñ÷ÏcŸ2‰ßbâ$|øÕ?™ÂßëuÿV8ñsPœ”ßÍË Œ ëw¿ÿê_"3Ouñ~÷‡)zÌgÐ}"ú_ŸÏ/Ž/Žÿ9x}endstream endobj 1019 0 obj 2542 endobj 1018 0 obj << /Type /Font /Name /A /Subtype /Type3 /Encoding 1020 0 R /FirstChar 0 /LastChar 15 /CharProcs << /a13 1021 0 R /a12 1022 0 R /a11 1023 0 R /a10 1024 0 R /a9 1025 0 R /a8 1026 0 R /a7 1027 0 R /a5 1028 0 R /a3 1029 0 R /a1 1030 0 R /a0 1031 0 R /a14 1032 0 R /a15 1033 0 R /a4 1034 0 R /a2 1035 0 R /a6 1036 0 R >> /FontBBox [ 0 -3 46 68 ] /FontMatrix [ 1 0 0 1 0 0 ] /Widths [ 0 0 51 0 44 0 52 0 0 0 0 0 0 0 35 43 ] >> endobj 1020 0 obj << /Type /Encoding /Differences [ 0 /a0 /a1 /a2 /a3 /a4 /a5 /a6 /a7 /a8 /a9 /a10 /a11 /a12 /a13 /a14 /a15 /a16 /a17 /a18 /a19 /a20 /a21 /a22 /a23 /a24 /a25 /a26 /a27 /a28 /a29 /a30 /a31 /a32 /a33 /a34 /a35 /a36 /a37 /a38 /a39 /a40 /a41 /a42 /a43 /a44 /a45 /a46 /a47 /a48 /a49 /a50 /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58 /a59 /a60 /a61 /a62 /a63 /a64 /a65 /a66 /a67 /a68 /a69 /a70 /a71 /a72 /a73 /a74 /a75 /a76 /a77 /a78 /a79 /a80 /a81 /a82 /a83 /a84 /a85 /a86 /a87 /a88 /a89 /a90 /a91 /a92 /a93 /a94 /a95 /a96 /a97 /a98 /a99 /a100 /a101 /a102 /a103 /a104 /a105 /a106 /a107 /a108 /a109 /a110 /a111 /a112 /a113 /a114 /a115 /a116 /a117 /a118 /a119 /a120 /a121 /a122 /a123 /a124 /a125 /a126 /a127 /a128 /a129 /a130 /a131 /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139 /a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147 /a148 /a149 /a150 /a151 /a152 /a153 /a154 /a155 /a156 /a157 /a158 /a159 /a160 /a161 /a162 /a163 /a164 /a165 /a166 /a167 /a168 /a169 /a170 /a171 /a172 /a173 /a174 /a175 /a176 /a177 /a178 /a179 /a180 /a181 /a182 /a183 /a184 /a185 /a186 /a187 /a188 /a189 /a190 /a191 /a192 /a193 /a194 /a195 /a196 /a197 /a198 /a199 /a200 /a201 /a202 /a203 /a204 /a205 /a206 /a207 /a208 /a209 /a210 /a211 /a212 /a213 /a214 /a215 /a216 /a217 /a218 /a219 /a220 /a221 /a222 /a223 /a224 /a225 /a226 /a227 /a228 /a229 /a230 /a231 /a232 /a233 /a234 /a235 /a236 /a237 /a238 /a239 /a240 /a241 /a242 /a243 /a244 /a245 /a246 /a247 /a248 /a249 /a250 /a251 /a252 /a253 /a254 /a255 ] >> endobj 1021 0 obj << /Length 1037 0 R /Filter /FlateDecode >> stream xÚ3P0BC3s…C. $bf NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº((²³ð ”¼¼¼ÜEÏŠÃnö’_yûfÿUûÿÿRþÿÿÿ=÷ÿ‡‚o—€ÄmïÿÛ¿ìÏÕ¿»4WÇ`›ÖÕÕW[µ¸˜¸\=¹*_?Eendstream endobj 1037 0 obj 161 endobj 1022 0 obj << /Length 1038 0 R /Filter /FlateDecode >> stream xÚ3P0BCcss…C. $bf NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº((öqÈ(¼¼¼Ü¯#¦Âá®ú媪ûµµûÿéþû“'ŽCÞ¿E>|yæ'ñ],/¬ü£öVÿŠûÿÿÿõÿ¿{ÿþuoÛ¶K·n{³q'­Úʼ҅ÁËÕ“ Ú?ëendstream endobj 1038 0 obj 180 endobj 1023 0 obj << /Length 1039 0 R /Filter /FlateDecode >> stream xÚ3P0BCcss…C. $bf NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(Xõq4/(yÈî·“¿¯‘¹d¾ïËW÷ö_ýZÿÿÿÿoëãoÝö®Ý0M"Z4ëŠÁZ'¾¹s^(Ük¾”ÿ«êÞ| Šÿ·ã£ão{'æHx_¶°•Gà €‘A€ËÕ“ m,Bendstream endobj 1039 0 obj 183 endobj 1024 0 obj << /Length 1040 0 R /Filter /FlateDecode >> stream xÚ3P0Bcc 3 …C. $bf NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(Ëßÿ÷¿þþûûïþ×ý/ÿöïýÛÿù·¿ýÝ$Þþ®»»?ïά¶uÿÿ08°p¹zr¥å4ƒendstream endobj 1040 0 obj 139 endobj 1025 0 obj << /Length 1041 0 R /Filter /FlateDecode >> stream xÚ3P0BCcss…C. $bf NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(˜ŠLàw> stream xÚ3P0BcSs…C. $bfNÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº((×<,ÐÜòª䓼 ‡ôå’ù¾¯W¿úýÿÖŽÿÿ_Çe˜îÍ-ÛíÍ«c°cmÔɾm1oôxÄåÿ~ÿÿÿÝOžÿÿßcP`ârõäÓì:Jendstream endobj 1042 0 obj 166 endobj 1027 0 obj << /Length 1043 0 R /Filter /FlateDecode >> stream xÚ3P0B#33 …C. $bfNÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº((;ÿ??²ÿÿ™Tdy?ÿïþo¿¿ý¿ý‚yÈÜ÷Ïú÷ýû÷þýcP`ârõä+Ï=Þendstream endobj 1043 0 obj 138 endobj 1028 0 obj << /Length 1044 0 R /Filter /FlateDecode >> stream xÚ3P0BCc s…C. $bf NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(XõH´È(¼¼¼ÜÅÞF¡Šs¯ù½É¯~ÿ›\ÿÿŸýºékµj^0ÉæŽº÷DÂ#ïîû·'ÿÿÿÿÛÿ¯wcËßj'æHxË®[£‘è·¸ƒ¡ËÕ“ ðí>&endstream endobj 1044 0 obj 175 endobj 1029 0 obj << /Length 1045 0 R /Filter /FlateDecode >> stream xÚ3P0BCS3 …C. $bfNÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(ØIÝÿýÉÀþöï}oßÝmß]&»›OzÃÛÃ|wÌóîØî.ß^{ÿ¶±üûûÿÿg_ý»~uöÖmBuÊÖF\1XêèÀÂàÀåêÉä¨9¯endstream endobj 1045 0 obj 164 endobj 1030 0 obj << /Length 1046 0 R /Filter /FlateDecode >> stream xÚ3P0B##S3 …C. $bfNÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(˜vÿG€çÌîÿ'·1Þýþý&.WO.Óí)1endstream endobj 1046 0 obj 115 endobj 1031 0 obj << /Length 1047 0 R /Filter /FlateDecode >> stream xÚ3P0CS3 …C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEÁ@ÿ?<‘âh¾'÷ýûD7;þûÛïÿû¼¾þëËÒ‡…Q¿®‰m`dàrõä¾6ªendstream endobj 1047 0 obj 134 endobj 1032 0 obj << /Length 1048 0 R /Filter /FlateDecode >> stream xÚ36U0€ÃC.#¸endstream endobj 1048 0 obj 16 endobj 1033 0 obj << /Length 1049 0 R /Filter /FlateDecode >> stream xÚ31V0€ÃC.·endstream endobj 1049 0 obj 16 endobj 1034 0 obj << /Length 1050 0 R /Filter /FlateDecode >> stream xÚ31Q0€ÃC.$¸endstream endobj 1050 0 obj 16 endobj 1035 0 obj << /Length 1051 0 R /Filter /FlateDecode >> stream xÚ35T0€ÃC.¶endstream endobj 1051 0 obj 16 endobj 1036 0 obj << /Length 1052 0 R /Filter /FlateDecode >> stream xÚ35R0€ÃC.·endstream endobj 1052 0 obj 16 endobj 1015 0 obj << /XObject << /Im12 1017 0 R >> /ProcSet [ /PDF ] >> endobj 1002 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [436.697 273.278 442.151 282.975] /Subtype /Link /A << /S /GoTo /D (figure.4) >> >> endobj 997 0 obj << /D [999 0 R /XYZ 72 786.278 null] >> endobj 981 0 obj << /D [999 0 R /XYZ 120.235 575.273 null] >> endobj 985 0 obj << /D [999 0 R /XYZ 242.922 342.548 null] >> endobj 225 0 obj << /D [999 0 R /XYZ 72 320.502 null] >> endobj 998 0 obj << /Font << /F15 393 0 R /F26 391 0 R /F30 512 0 R /F31 881 0 R /F33 497 0 R /F27 394 0 R /F28 523 0 R >> /XObject << /Fm10 982 0 R /Fm11 983 0 R /Fm12 986 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1056 0 obj << /Length 1057 0 R /Filter /FlateDecode >> stream xÚÝZYã6~ÏÃî_0öI ´ž•`f‚ìì‘$~ÙÝ,M·…¨-¯¤žîN²ÿ}«X¤,ÙrÛ“c hS¼Š,ÖñU‘bÆáOÌ29ËlÊdfgËÛOÄŒþ¾›ÅÒß Žzj£˜Ñøu¦ã<öœ+ÃljÎõ)S©¢yŸ/>ùô¥R3ÁYÎóÙbíû,VÿNþxõŸÅ_?y±è‡¦9¿ì¦“ 31ùs÷}éšyënnÝöJš¤k¯æ*³É7ÜðîJÚäqw5—Yâ°:KþŒ‹ùô¥Ìs )×:̸ß¾y¶øËâŸo^|ûüÅ¿^½øŠ†ŒÈ ®·y´Äg4ÿbãZG+(šPXÞ5ï®dž„ϸÖÖÊ®æ&KqTÙÐí¦ˆ ²³¹”† àë\àÑäž^é÷(’•û† ½u+üäÉ[¿]*ԣ튦+·7T‰Û¤.·¸šŽz ŸŠê‡~|˜»Û8*Àê\®¥Ó³l\ã ×ðiú–ººíjD<£a8•ç©âž*+˜µYàé›Ðå¶gŒs |`ˆ±êÌkò¾Ïõ”ès1™/&Éð<ÔZôb+u²®ïšýÆ÷'Ö{Hª¡ Ô슦¸ukBzM¿÷›¢£RZ–EUyaÅyè§Û”M8!5ËDJ§cüêêfåp1JEDzNÚ]Un;´+¹dB¢ã,ÕÞ*b-¶}7‹¥½yá3År“÷æEÚž“ѸuH²<ÍÀ<Æ‘Oš]fµ=g¿ž‹°§ÆµwUPU%ƒÍ°IhÝ-±¸…u]U5Jä}ÑÔÁt€Î»ö³ÃÅÏ7,W)fÄyó.A&‡æ]¦;øáLºõ³Íû«Ž¶æíXK¼(º+t‚F°i;bÜu:V"Uåú5Na—¥×žÐ·²92gŠ{½ ƒŽ„s.qÒŒ¥?"¾ƒŸæºòv¢Ûì™þ¤mŠ_Æôs¶Ý€¥Í¶ý > òíÕ_ ‘ AÃ#«±tS{Yv-ué6M}w×<§cÀÚC#=Á{pOêŒ_Uï+ðJ1@ŸNö€6"«3ž‘H[{Ò3 8mC®Ñöð‡YVlozˆâ[êÈËÀ¥=#P•ÁìùT­›úö@Ä›Ø@ºrŽLÐg]dƒrÍ„¿‚ ÊÎÚ %¹ªÁ!ˆ4&‹ª¾y¼²:AxiL`»‰ZƒHk°4ÐìÒkÒù~ày­‘*c©ÉÚÂ’”¸uBKÓ\\b³3À×X¾Ù>N0b¿í¨($Ò†…Ø4CA`c²±fŒ°ˆ:VTnõiéƒK†„¢–úçódï0²ßƒR^äj„ù/Bë}YUÔð¶~9Á²ª[Á9F:·» €{õHß}üÈã©áÄe Mþ@ÔÔŽŒ¿Ã˜”‹8'Ê U½Ýºe׃×Þè† Ê®¬·S€ð}Ià±aSxCM*Ô³€m!ÖÎ|¬M¶_üKFòµ·¬Zx ë鹨aï8páͲó¡TÕw]˜†”ÛýЛ»Æ¼0–InA¼RÆ)2‘œ>mýS'àœ•8'JSh<ÄÆ…O¤S®OÀ¹Ý„OGÞKN(&ÄzJœÕdân/$£~52#x¤OQy¦™ v3$@`ö‹’ù˜–þD¦Íµä̰¡í¸`[Ù‡9;AÆBÜ#&xþÙ#tù‡a›à“|ËÓô—•:!NÐÃä¹ÉtòeÝ•Ë%n-K“2þ¶Ô⊶ôþÊæ·mù¶Škê^ë(]ïN ± ¶öjžÔÞAÅ0| ™°”é<ç)›bÛ§¨MP˜6°9»ÇóAŠ™š|@„¿> 2y²u¡é-ÂÁGª]âðMöå}ó`”M(¢ñDêŠh­häÀGû$©¯Ü¯±˜@Ó~;zi̇ʑ§~‰@Ò äï µøRļD¿¬õ>ªÃ®)ªëói´æ®raðšÈÉ$`×ì7HÒN5l‹ÎQeKbá–¥GY˜nSW«ã¬œ–¥ ùskXzþ6ç7péò̃KÌ8Ža™3”ßá®öuÀåÇ+k|*G€ae¯ ”Iî7M5O½Ÿ„ŸÃè ªöÑ7!âÌ(÷æV~˜ë€êxoI¹ž¸(ª£9RJVÀo?ºnÊï:€^‘ò© Ë è Û9Þ†m¬ã}¤fZ˱Ÿži´ýÓ^ñÙjåQñ5M®£_k¢§+ÛCÃ\AoŠæ.¿÷j%æb¼ì ÷5ù´§Ü%ÌpíûnW=~vRP!6ƒ{ó9)UHz4€ ‘cÒ_x|)Ñ(*RöÙ’9K5èØpääZÝv_/›r×ý8@R.H¯ÔÆ«ƒ/=áHæTÊ„‰†öqBæ Ë¢H΋<|$”CÁÊUí/¿·¿ßøz‹Ø]Z ;`µ}£‚Lnšr…¤ ì΃±ÀN½aÁއ°ÃÁÁ·aî&Œçú–,†ñÇHFiP‚4Ú„µÇ2 á^É"îÊWµS^X<C8ƒÑ±b -È3|ƒa“o„Òk´$W¢zoà×_Ó[›ŒÉL¼Ž©Ó,J\UƒÞO¸«Œ ׿9®l6æŠ'SðÐXG †¥m©IEvBçLä2\ÙûÐ.=BÎ÷½|ˆe1Z"&öN|z–ƒJ¹…ÀÅ!˜Û&ÌÒü%2,j.¾b1%.9M…™¤õ÷]ˆS0ì…žÐ;LÜ×ñ„£.·Å²©Û‰wŬJ÷Ï—¯ñӛׯ¾\ ëÚyÇ3·8³½)é±Öhîðdf|$¾|ñì«_/zë“D„õø³GV»Æ›žwåÊ­X z%Ë®Ûs~,Üða"¿³¿ËáÉúnÛŸ-Ô“çƒDj àa€:Þîoý"¦¯#Ú|;ŒaÇvÄ?ÎÑ^¡C°5zwu"Ø ¾ŸÈ4Œ»<~m0Uèø?êžzéîç 0»=Lz\ài]Å-'¦Ð‡š2²ªw„·âxÄÐg½7VCª õ|æ¥>Þmd ZÓ8óÖí}*VÆœ– ê#¿ó7ì¡KUú9:[íe«¥oR²Œ”lè,H`ä®èBãðg8«Ýß\NèàáûÏ#° ßÿõ÷\AñþܘV{K üÿÇ€£Ã<ÛaŠcŠPÁ6¼}/-D¹³-åÉGD|r ˆÃ‚tcP A®5n¶¼aˬB'iS¹×ÅÔ3ÇG5‡Ïß>}©yp¬>˜µÌÂ`ž_°hðO°%øG`]Ä›<ŸF*qÿ½  û«¥º‚~¼UËc¤¢-‹6Ásï»b¤ÙBS†Ii`]=n}æQ¨ e9J™ÿô]9÷°«ê¥:J±r¸ÇAÐ=ŒØ³¼šíÓáiâ¯Àbîs"åvèw ° yJŸˆÅ /ÑF$m]•+ò0·„‘V´ë…2³á؈ѕ/ wÈ5Ì',)ÆöÐßlx$˜{ð´Ø?ð>†”a9·Eß̽“Ê#%óÈ}?”pÞ‘{Úø·mCî¹?,˂ӂäÀr .nÉéþâV‹^áÃ…¯î f(ègíPJ2‡1AÔeÎøù ÷jªÏ†;ó1%Òs!Izt{+A"¤|"äù?ÍÕuBendstream endobj 1057 0 obj 3139 endobj 1055 0 obj << /Type /Page /Contents 1056 0 R /Resources 1054 0 R /MediaBox [0 0 595.273 841.887] /Parent 976 0 R /Annots [ 1058 0 R 1059 0 R ] >> endobj 1058 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [191.393 707.644 200.36 718.86] /Subtype /Link /A << /S /GoTo /D (Hfootnote.13) >> >> endobj 1059 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [281.48 551.829 286.935 561.526] /Subtype /Link /A << /S /GoTo /D (figure.4) >> >> endobj 1053 0 obj << /D [1055 0 R /XYZ 72 786.278 null] >> endobj 996 0 obj << /D [1055 0 R /XYZ 88.587 135.023 null] >> endobj 1054 0 obj << /Font << /F33 497 0 R /F15 393 0 R /F27 394 0 R /F30 512 0 R /F31 881 0 R /F28 523 0 R /F26 391 0 R /F39 496 0 R /F29 547 0 R /F40 548 0 R /F51 382 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1063 0 obj << /Length 1064 0 R /Filter /FlateDecode >> stream xÚíYKsã6®Úãü ©-‹!|eOãY;ëÍŒ=•pRûH*EKÄŠô‚ÔÌ8©ü÷t£>d(Næ°§”„€f£Ñýu÷š-"øc‹”/Ò, yš-Ö‡lAïnô5Ì‘¤ŒEKüõŒàJÆY˜çÉb%â0KâóòçuÄ¡ŒcÚê²xñÅ5O, ó(_[#Rlþôj£¶ËUÌã ëõqÝÓø¡ì÷ÚTc'~^þPüsÁh•‹ÃäFÅz_jAe3bÑLâØtÕ®Q’å·u¹›ÉÇF¼Û·ÚnªÕViÕ¬U÷GôvÕOÈŽuÛôêSï{å7]ò׺jÞÆ[eçÝ«`?¾}YüãíÝÍm±\qEÁF9Ñ•Çó¿BûÞ·W_½¹º-Íœ‡1K†(ãô×,ž€€h™BÕ-W"ªú½Ò$p’ˆç¯on½Y˜ˆØÊ‡…I(„°ëˆ-ß‘¹‘Ì…_GîÖGôy4Å)d<ÿš‘Ï l6%< 3¨+$bqêQ´’àL³DðøNƒv0ÌîÞžXÑài͈2h /õ¤RìHGd~€q&Ã8w&ܾ{ýúœ™Ò™ÙP²I)Áó2Wv¸—w¢ 2¢3IfÍ…&6¦Ö¡dCÏQ²êúp¹’I\W•,Á¢0RžÃ€IpRçsÜê ¼\VÖaúqnoI?1Å ·1Àô³CEÞCñ@Àò™“ð 2²oˈ6@?‚~ãÁŸž.Â$ŠŸ9ì—‹  PaÛ ¢qÏNõ8Oø>bRw½› W1ñÌŠS©Õ  ¼á‰ÏÂHäÏÀ e#¬æiu(«¦jväJ‘ ȧlÖg€rô~‡À‘2x‰ó"¸T?UJ¯œ|Lò‚¢ ïA YëêÞÛ¤<¬ )/„ 4 ¶m]·«h—™öüí|qUŒ…Ø4²ôÿOOîÍ©ÿ$)ÓÞi À3ÜÄ/ü9”äYÑKßÒŒ9¤Æº­ibÞè;š,íó´4áœ*u]a3â¶orã! Žºã}§Ö}Õ6X™ Šqëámh¬-ÛÊ¡XÇÀC§.éóí)ÀõYn£še60h=¤ù‘¢BˆÊ*Œð{{lŒÉVöYÒÃÓY³üL/Ir xéH‚ïÞgèï á4;M"3Ú‘ß@3K¬—fÆ@;·Ð¦¦-ŠÉ|šœ^a™$ê¤zxpÀÊØ@Ò×Ĉ2 à½Ä0Pî l2 Iƒx—€_ [/ë~ßw{zÇP/a© <ÿw¬zEZŽM]ÕÀ„ÆC Q6ôà j&oaòDÜ9MNnp¥¶ôcEY-Lx½×vä÷m©í–kèÆÊøl‹VµšU‰q‹5‘.Ðs@×»Þ5n“+ô)¼ãRÉI%ÌLÀ“Ää/¡ºÆ,x×Y‹àŽâ«4¨ æL zVCŽ>´à<>hC>Î,ïè÷Z9f1ÉÁ]ó¬‚#Gp ÇLþfyÍ9.’cõû.‡eü922ÉNêš0ñ•ê_A‹¶Îü>Š#Z«#¹†¶}ó÷‹'ÝFëv£.ˆ°À}*†r;Eà¶nË~¤ C',Þ¼,¾¹ù—µšPÓa3ƒ½™ó x$…#@{ S™ÙÏNp>¸‘f ­Û+) |$&" ¾uÐ íœ2e+妚ßÍøŽ¯GçažMz÷¶¹Ÿf&&ÞÝËW.ï Ÿâ8 n[¨þŠ,°|fj¯ùFa;j`j½²-4µlÏ “r]¢zx)·÷ _ݵ4Ò Ê³6ŒÖ÷À‘ÁÊÙPzÌB©Ü2š¢Ü\K*MzšÒÞ¤sºÛá³À²8iá Æ¬–j”¶:r¼ÿ ¥3Ã)(=Èhä—Ð\þâñ:–éÐi”¬ÜìwºÂMIWL‘Äxª†FôacS’›þÑ® ^ yÒµm©}gÕÕ'»ØÒ£ÇýÆYFŸ0Ó=”&Þ°…‰¼ó¾™ì•áih>7'œÏ¯Nèj€Ñ†¥ T8ʪUÙˆÔÕõtÄD[Üêl™CŒˆP§–ÜáÌC ;\XNÞt½*7$br ƒÓ¬Ât¤Íck‡mê—ÓÑ]x¢ì {ËÐl[Z©`í×XWM` z«7ƒ¨qþ,}\@±E6ï†zA´Ô)Ížìl21Nm> endobj 1060 0 obj << /D [1062 0 R /XYZ 72 786.278 null] >> endobj 229 0 obj << /D [1062 0 R /XYZ 72 286.104 null] >> endobj 1061 0 obj << /Font << /F27 394 0 R /F15 393 0 R /F26 391 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1068 0 obj << /Length 1069 0 R /Filter /FlateDecode >> stream xÚíZmÛ¸þ¾¿Âí'm±Ö‰"©—i{{ÝÞ[ÑlMQp%z­F–|¢´ÉÞ¯¿)K¶Öñµ—´@Š"’3’óòp†[EðÇVi¼J³$ŒÓlUì®ØŠþÞ®|ëk#N!y(ö>À¸2 ó<†O_æYc!ËbZë·÷W_ÜÆéŠEaå«ûå¹/ÿܳ~ÿ—ûoî¾ûòz-cü¾Òý뾫šÇ®ý&’Q«¦§ÆmÛôw¿¿¡N±U›mì¼›#îZ77×ÿ¸ÿãŠex¬tµf¨ˆÜî n›Gb3{Uèv³9ž¾kËM­ID4›¼©[å¸Lõ£v3á ÷ß¾ºÿóÝ_ݶúN5fÓv;8 C1W_Þ_­e˜‚NÖ\†qž9ã€ÂB½N¯6WkÁÃL‚Y%|ųÅ|‰‹0‡…%a–¥Äp0h ±Žó0æ|´ 4Omr‹;üâ–É ô GG{øƒ‰£K˜7ò‡…rð#<3K6ºæ!‡ö: Ì?=©?ÈI9øe ,Ï1Ûëè[[}½æ\;­š ­Ì9Ú ~ã ÷TÕ=;Ý\ÇyЪÜWù~Cg¹0ËÒPdâàȯ½ßÎ4×cQÁÜœÐzÔ:–xB>s¬ÛªQuý<Û*Þ0.Z Š_ œŠHŠ>eeö5¸±=Pô4:žç:΂§k™ªªÕCíÄ>àð3µÇµ6CSôUÛx Ž®$C!ÑçÀTù§G†oÛ'}!.Œ£¥®{õ~qôùl°³4‹p²ŒüÅ">fa v>ñÂHœ x . w&Ã\ô3 wtó8×…9?ŽVâº)uI#}Kßüÿ•Á`<ÙÆJ(Ú¦P0Qy¡Â¢’\4šðz-bÜõDn´. Ƀ0v«m55Ž™ÜÖ WL¡`G@ΣÀ´;ÛbÁƒ¢ùU_iCÔwÛªÀ@ÞB7Ëa7ë±zBVÝPמè´hlZEäZ?¡]S—¤W§ªÎª&Ëœj`TwîêF|Éuª  s~B Ï/¿}d^Õ” ’ ™:Šè—y¶GâÞ ØØ¶]õ£Ó‚ªi —ƒH]_ž´€±©½dÌ`ÄÉÙì—,¢:›[à8XSõÆAžÄ_n¯3tíxãÄnñôÐ"…l/qÇq€µpjh×ztº,èoP8¸›Ù£¥]Tî®ä"¥Ä¸ÍRw`@º8cìU§vº×!Ò#lRÓR#%‚`Á«ºß¶ÃãÖF45†LByk,Ù’YîQ…Bdæ@•3¿=b&ˆ|dŽB–”ͬƒÏò–ǰ£l¶£WÝCr:›…°Vi hÔ'({@Bs@fx±¢Ø±æpŠKÓJÍÿ´yÍïì1\ZcyÍ ï^õ[¶›8-.òÇ‹)˜@ž-:@ñ¹š$ð袚ˆ2ÿLjŽïZ¸(4&øfŠ‚áˆÁ­£TÙ<©l7ÑÆ»ÛV¶•û@ÇŒ“L{¼Æ;{OÑh¡›~¿§pA|1›ð?Uf€í4áP]¯7ªðµÁhvžÄÄ#Ü”Ç'Q 6îôŒÃH|»ò­¯ÏèžK¤~ñµãeIèE¾8YwíTA¯Gl´¤r’!–/¸È¦®Ær¸$.£8,‘ÌUYÙ§E#<ßiµˆ-®ü™E8y qòEçÃ/=ƒ7Ö   #ñ?^ñˆKÁ&ý ñ¦¶Z:UÛõ9`ÙòܦX"7Ž ‹¤0·ÑÐÊT=BD“ŒÄ29±mÀ5b-U¯¨õBæÂ™cŸ·à –röÐ 'ÿ˜ÍÈ0Oæñhú¶;½è)sáØ¸xë”7›Éƒ öÕ{]ÛÚM€nb*âžzõÖWPØuo.1 ³+Âüâè8FÛÙS¦ÒÒ› àVÀ3ržLóþWÍ Gh—ŸrØ×UáÓžøßJu ¥NEú©3ýóeÐò†äÿÇŸ…!½šˆ”þ«èSBµo³h»º±{¦l¢­ü‹GÄ–zÖû°Ñ)µ"%ÄW&Sû6‚„wèÓm÷Ö-ç/F»t]ž€g[iDÅ 6¼Ï%€TÊÚ.$1F?Njº(Á{ú‡¤£±E§[0*ä¹ùXF#T@h“ÒPìá© JÚI¼Fr¯QНJ›¡&Bµ¡/å ĦnŠÔèäÚü ¾eK¼Ÿe@Zg¡ » )_œ‰lWÂjÚ°y¥à6ç—®FØØwtOÚ"ù3·úú¨%ÈRµiÇÚÌ ;í1Ô&žöS ô¥à’ØÃôCKù*Ïg–%¤È¥_®·yªJ»÷ß@5 ´Ÿoz8¼5!Ž–ÿÁóxÂÃ8—\ŸÚªÑó¶Óúã¢jòy ê/UÞõ9@ \ÒÆ‡XgßĦž$  êÊô®öjÜ«Æ 섌 w<Ù¦1™Ç& ÙÚkð²\<ˆ©Ë˱@µ6=Å‘œÄùBu¸Näˆ&“ç3NÁe ròõJøÈ2ÜŒ íôQÍÚcèÒ…3[s +~cXãÒÈcý¼ßŸ8ÚY¬÷\çmÔN×Ïÿ­ ë«oþö§?’«Ûª®VÝvü«×GªÛd~)<|&¯D®œ™º DYB¿'àÿfÄ1 9îôüIrò¾‚U|æ=ä'±^Tßendstream endobj 1069 0 obj 2219 endobj 1067 0 obj << /Type /Page /Contents 1068 0 R /Resources 1066 0 R /MediaBox [0 0 595.273 841.887] /Parent 976 0 R /Annots [ 1070 0 R ] >> endobj 1070 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [332.241 439.56 337.696 450.47] /Subtype /Link /A << /S /GoTo /D (figure.3) >> >> endobj 1065 0 obj << /D [1067 0 R /XYZ 72 786.278 null] >> endobj 1066 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1077 0 obj << /Length 1078 0 R /Filter /FlateDecode >> stream xÚåY[oܺ~ϯXô¥ÚÖË#Š7±@\49I›6çœnQMÈZÙ«F+mt±ãóë;ÃÉÚµl§úT°(jH‡ßÌ|Õ«þäÊ%+—Z‘¸t•^Éý}^­?BIj£„Ñøö‚àf”Ü$ZøØ¾$/¥ðF¯6ÒAÃ{_}YIÓw~Bï—iw|÷æ Õê÷Í«_­~|µ'J¡M '«X(Ÿ®Úbu=O•ð)HêTh¯ŸRðw[XAš•Œa~µ½£·»DoÊ›¡-Ö¥Td~³Þh­£Kzíú¶¬o¨}Wö{jÕM]•u‘µÕ=vȨ˳ªØa[Gy³Þ$iÔ´»²Îú¢ënÿðêõvR7±RXk¿ÁôÊ8ac´‰|QÜ€¡ Œòð|朞=;™&¤X0WâÌõýû¿ÿðv½1‰‰~µ•Ÿ./ß”UõaèÑ$cÓ'øòá¯Û÷ïþüšEY¿¿ vY÷Ô84»ë*»Qr´ìÂÁ²/$,»pê­DjV)˜Ä®>ÔÂçM*œå~iEšºSÌlt,´U`-k=mX©%| ngØI…O4ÇM[8›,j`Ü$7mSi¡”Ã3srIOÐKA{c…„ñ·9îæqÊB@B¦Ó>q¾Ýe ðV&ºì¦À¦v„×¢£×ºéI¤.ÑØ•Õk¸§îâë±ÊØeS‹õÆ™§%¹Ûµáj(H²¹&ƒœ€(I½PqÂñù/ØWk‘jÅb%ëÖ_†²%µttÝ´lq?èàøãqàOkDÛ;ßl×ÎEÍàÙ;áu A Ñåƒèûµ‘QqÝ/è’HPÙó”}°ÅlæÀfEßC|Chx}w½iÔ£A°qUö &±VÙñPä§ŸÞ}ÿvûiûáÓû×o¶ ë{-¬“3[$ÎG°ôœ—óÑ®<uƒ¯í?WÇG7ÕýqOß²–Ul‹¼9‡ŒL“Àf- rnš,ÏC4ƒñëTGa·*º¬*œ"‰X ¥&l8¨'£ë¶9,íÝHá¼yùøÁ-MÊb¬l'Y7áøq…nÈ×`ô=½õû¬g¡zìáQC7dõåY:ÕÎìH°tšŒà1bÀd˜ôÝ(ÀµuæÄnKPatÔ•‡cÈFE1uåàe¡qEò,x$çÌ˱ÔÅlobým_VÅ’wIHÓZg¡ù!J 2‡GÛ&h°rŒ A¥²?dÇŽôEXásWC>„¦¼XÐe£ÀRê“,å‹'”’à¤OŸÐÊÇ!,úˬ*áX1û‚3\›÷ë bAß”ÝEò¡m‹Òzê¸i³ã¾Ì;’ û;[)£w,Ñ훡bõ Û2A¹éÈ9 çvÈU¯GpBë/‡¬åæå\ý€ ìEƒtEñˆ3ÄZ$°¬N‡Ü>§Ï…zŽâÚªG³:‘:ÿ4yz¾pfAáYúÀ݇ôýwh„¦ýÌo;‘-BƒÖõPçœF´â4‚ým‘uÃ() >ÆŸ`Ç+›’UãN_Çh-«òj\0­5c–ØgDQe)ŠÒj5¾ #ðzN‹ØûQ*Ý•?¿€WGwû¢¦eOÏ›¢«ø‡™òZ§çµG Ì;ôvˆAo‹:/.È 61PÁ¹=S˜c {!´ü’îÖš~¦7 •‚ ‰v¦uœ+tc„Œ ]½ÁInñhõÇZ”˜¶„Ó– Îa¾! uUż;™pÒÑk×Ï&§ÂÌ?ul†ÎÏb¤å=÷\·Sýp2ðDFSæe?f7‚”=A=ò«bû·5(°ó?euyªŒP¼ÑG¸n¢8_,Œ7/a4‘~ÿàhoË]ÐìšCØHUå¡ g¤À²×CKùXÁ Œ¦<ôk¼§¡ÁÉ)Öh*>?DžÖ TFmדlØ<³ªº Y2z ­–²ËO’õŸŸ,˜šóF åp|P&ÏÚ,ï•®‡:â§‡Ø /»±AqdBªG‚ʳà?U^Øi¢î¾ƒl€í”åÁ Ú# ÷Ìây õ>Ô­dö¯‹Ô?•c|¡äÞ””N:š~TòV` œo‚ºõnaaÌ+ÉÈŒî×U‰zb]¢µP¡«SƒÇ]Ô0©Šx|2˜^IäÔÇÈ M4ÂX:o©9Z ³Gì»c‡± Y 6è`ƒF>XÇd£Ø9¡ÏeMóeW]S =Ëžc·!(Œ!Ò6JÛeÒÐÔ!Ž‹–Êœf@m´ C?LNbŒ6#î7¨¦}°+/…Z6ÄGœb|òŠy6t¼ì¡ žßú6«;Xë¬Ù],èO·(ô9²~ÿÌ…H{¤ï‹Wé WîÿãêCëÕ‡{þêc×pFѰø ™¦º§[…»@$°ˆ 6®(Z!‡ W$E—·%wò¥È¿†Ž/J¸<>Ð!+ƒU2¢È( üçÁq[*бC,]k`(ºÅÀY~çwˆ$DZµY(³ªÔÂpìÅ´øªwEê4×®Ÿhs³óp1]¯<áåjÌž›]ÙÌñ©vò€P@ÉÌy?ÔÁå­ èØÒ#/7c´%JmÈžnÒ8„Iç Ýðl5õÎ,Óc|u’‰¹árRÔPöÙUUÐ0ÊÐà¼ÖuåU¨Ø¡kŠÔ¼)+¼:½19ÌXá£û_kElƒZ>UÊ=Ü+áˆ>éÊ ïæØ–ú|ðPëпyäsñÍCéofámÑ}B-àÂM <ñ0;ÑTø` Oö#h壻 ÞAAŒÀ2>Ëd(™‘LE~Ú|æ^žIC¸£?/`¬¹Çÿ¼">Ÿ oÏõS C†JÝx {àß ([…k¡SN¶+»c•¡+߯9 (—0Ú˜³àƒý7E]´¡<|å¢Ú@Û‘¸ÙPñUÜ™Õ=yñTlÂ4§¬dÁ³•‘BK{êÚJOp é› …ñ"“0É;”ùíOÀªàÛXÆ)¼evõë¥P&MÇ“3³™ùJ;S9Yºh„pu¢3ÆEŒ©¤K fÖ±Hýé1‚ÛæØ–Ù"í2P%è±JÈ—žì è7§-rt.Sá> endobj 1073 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 426.998 172.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1084 0 R /Length 1085 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kh¬à’ÏÈOú¹endstream endobj 1085 0 obj 30 endobj 1086 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 426 172] /Resources << /ProcSet [ /PDF /ImageB ] /XObject << /R6 1087 0 R >> >> /Length 1088 0 R /Filter /FlateDecode >> stream xÚ3Ð3T0A(œËU„&F¦†z–æ`!CsK=CKC=sc#C (mRªd¦à’Ï„CLendstream endobj 1088 0 obj 59 endobj 1087 0 obj << /Type /XObject /Name /R6 /Subtype /Image /ColorSpace /DeviceGray /Width 607 /Height 244 /BitsPerComponent 1 /Length 1089 0 R /Filter /FlateDecode >> stream xÚíÛOoãÆpÜ,w›í‚\¶ÈƒžzMÑC·€á)rɱ_a{/PÔÐPQ±BDïA|èè±§F‹0‡ ú&â¾õ°º£îx¦o†”4¤µ–D#– þ#þl9oÞ{#+åì!ÕÞú.¬3‡vh!w–¼–¸«Vøý·ø=°æ÷À*]ZcwÖÕ}°fß«pi]ÞKÝMëboí­Ö#Ý[{koí­½µ·¾cKÜYÌ¡5¹›V¹³¦î,黳ÄÞÚÅúÂõ%þ§Ž¬ X¸-c9‰9#ñŽ+Pž3Ë×VX¸±¤G®ÝXÒ¥å¥ÆwΕuqG­´·Uhkà+V¢ÿpÂDêoMÁ:|ìÄj‹¦N¬È™õFy` VÒך;´N´Å*kÖÏ’'ºµ¤±â~–8ÖVéÊzæÆ’¬n,ùñé!©­i/‹#°Nµ…X̲ò^ ÙËÓQyeífÛ_…U¨.Ö™}If=,|Ã:‘K ËÝn(+Ú’=,aYW¼ŸÅ-«`d:Ê~y¢X #Iò/°°+M„e•]-AFÆúhe±®C#³B|üÉÊ"­L[q!~5ïj­îÕIm¡ÒXÈ……++îcE¶uÑÇJk+D[éŽÖ¥mÚ’­™ùˆ–µA+¶,é)tÓâ[[¨aI`• ‹niIÛ‚\×í`™×€\­,rç,G‹¥uµ«uaYÕ]cmwS%bÛâ½,µ´&¤Ÿ5jZóÚúB[¢³CůÊÚR`Ñ»Z¡‚cKÎÕÂʼ®×ÓP=pfêiOk\Y…z(Üךk®¶.¬G:jõ³fµ…VÞ°¶\·++Cþ´²æ•5ínÁ¢˜ ÞúZ‘¶¨e ÁòÕbíØÞ‚g{(„š­,,ÚÁ«´- V¡:XX•ö´JõÊ×ËuÓ=,ȳŒÅÖZåÖÖï×X¼›5޲ÚR+‹5¬+´ÝÊ¡mÑÚúñ–ÖÌNL&áU·¬ì×¶U¼ÝŠíÄ$ G¶Ev´Bk©Õ·,\[ùΖxˆ":¶,^[ÓÖô'µ´xuvW‹ƒÇ.,oe%ÛZh1×XaeòÝ®£ôùõó–%jk V¾µ,Ÿ©Ã–®a.Æòö,õ\[Ð4,TV¼´ðf‹{D m­ôv‹yä:nYúúÖ2ùªn×n´J•yDÅŒ6,SwT®­b£õf¢òˆ‚5¸a w´Î‹ˆ& ¬ÿÿèo%M cѶ5ÝÍ’øÓämV¾“%Ÿ`ï.ºëš?žÐã¤Òm­Ùh­õ¦Ë—•õÏ£[gÅ#É=·¢ Êÿ½ÀEmý{wk^K¯!2¥üÝÒúæð6‹iËô ãDε­yν9Î$]XÉ7‡jëli1šO9§;Y—*7½ZË*M;Ä›N¡ˆF,¾yÃ!üebi-‹êö[o)A«¨ ƒ Æì‡:˜|%”± m=¿Ý:¯ûÑ•%úQ¨Ûœaàˆø«Ó•uv«Å[Äá‡~„*KGÉøëÊë™m‰¶EÁ2{xª-Îÿ‹õÐ(3B`k+M´õ£›VU+à\[g «t¦-Akë³c%¦5¼Ñb–UHаm¥Ÿ}b¬éx½5ç4Îm‹ZyE,+N?ÿ…±2òe‘×µ%žj +ÆWÖXf’ Ò²`v•äñ «¬,¤-b,8†G`¥’L¨5öqrTYŒhëoµ†•ÅO¯Ôõû‘¶&ÉTea3^ÉÑO¥'LI†MëB[r¹±ÄXÇ`‰°eTVqô3cÍ5²-‰+ 1x¬¬÷E½…WYÊ#•EÞ7Ö•Ž m+K ö¾÷›Ÿˆ'`y²aÑjnSc}K×ZùÂÊÅsľý¹÷áËPÀÒÞ²þnî x¶±²ÚÒßã´i¡±* á!öQÕ–°,˜)¬,]Ï%p/Ð`yÅŒ•]¾û—ó0Tl¤­‡Æ’- fðçxiiƒ†•j+ëõ˜ÿVe߈‡ dek‹B¾×°PY55J(î ƒOŒëúö`8Á*{l´rõ7È¥tIÁ©Âh¬\~À|m¥“ø +‚û<”>âO—–´,68¤!ƒR*}vÉŽ¡óÀ;_{ ‹‹€¥Œ5a/C½_»²²{ÇO=‚õ×0ÂÜWRŒu©7¯Xü‰±ž¥ûrHˆ„Ó…¬,é³£‘’4ˆ° `}«¬TùÂXϵÅO´Eu#rŒDm uι°¬W˜ÛÃÎñ9½‘kdfûê RýÃÃhU£È¦U4ó¹5Ö¢,‘tÙ—\Ö K5-,覧‘´ÙYîÌšÁõweuáÆ’0IIêÈÒû‹qËRÏQo>4ÓMÌ»[Êkžâj›–Ãz«hýòy«Ý -ÝY£Â…î¬ rgeØõö³»µq¯noí­½ÕÕBwÓâ.-oí­ÖcèÐR{«¿õƒÿU‰‹üendstream endobj 1089 0 obj 1881 endobj 1084 0 obj << /XObject << /Im13 1086 0 R >> /ProcSet [ /PDF ] >> endobj 1079 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [276.28 397.667 304.159 408.576] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.13.3) >> >> endobj 1080 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [138.06 148.135 147.027 159.351] /Subtype /Link /A << /S /GoTo /D (Hfootnote.14) >> >> endobj 1081 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [456.225 148.135 461.679 159.351] /Subtype /Link /A << /S /GoTo /D (figure.5) >> >> endobj 1082 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [82.751 91.278 99.134 100.565] /Subtype /Link /A << /S /GoTo /D (subsection.5.11) >> >> endobj 1074 0 obj << /D [1076 0 R /XYZ 72 786.278 null] >> endobj 1072 0 obj << /D [1076 0 R /XYZ 215.695 540.879 null] >> endobj 233 0 obj << /D [1076 0 R /XYZ 72 342.361 null] >> endobj 1071 0 obj << /D [1076 0 R /XYZ 88.587 105.524 null] >> endobj 1075 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F39 496 0 R /F26 391 0 R /F30 512 0 R /F28 523 0 R /F34 583 0 R /F29 547 0 R /F40 548 0 R >> /XObject << /Fm13 1073 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1099 0 obj << /Length 1100 0 R /Filter /FlateDecode >> stream xÚå]oÛÈñÝ¿BOmXî—¼ >Ô¾K/q‚œîm¯him¡I¤bûŠþ÷ÎììR¤DÛqQô¥0`îÇìì|ÏìˆÏbøã3#f&M˜0ély{Ägô÷eF?ÁA*-™V8{p®tʲ,bJšÇáÇÁ9ã© »¾_½ºfÆc–ÅÙlqí`«¿G_ëbu<×BG þù}^›m™wöcÞ­uÜo}øeñîíå9ÍO6°}züÅ_f\¦´˜Í9²–íáD'·=V˜r\*ëêÆcº?LNiPT º‡M8Äñº£óÅÑ\3¬Ì…`‰N½LO&³tÖØÙõÑ\I–ê*!g2e>û€A‚4h‡',M ìÔ3•H`.a:“½$¥œäøê‚ëÁ(Q(¿Œ>öP€ª4œëáz^¥b´,ód‚йdÆó„q8Èi`ð Ö$‚§=#Z?ÚÆž‘#‹Kz"Ñ&øÆÛ´ëz[‚!ÈŒGWÇsa"‹å•ÿ^µu¹í,8”n”·´¿²í²)ðhÙU8ã0ÕǰöÿYvÒVA ŽqÔ# ëmµìŠé )F†¤?€kl·m*Úëœ6Á¬pX9Ô¹D_WÃ`7iµÚ“of@‡½'ùÙe×zmÎ7#¹tëÆ¢ý¥|'–,êÚï ”ÉŒv惦”Æ‘×IA`¶ié,Ô&7c0ŸÑ‰k x‡Í)þxéq”^2²Ø^Êð=i@Huý¶¶èoFøø`ž&ÝHÇ/$²Jĸ …fWSIH¥”²øý” Å,5z …‰4  €äáY%¢öC™§ÕÅ2/ ÊìñÐR&Òä z¡n”᪹W•Ê`wœJzNFØg2y‚°Ú`ó%Ð ~_7«¢• ¹«An€ØVP>-Ñ¡”q™¿d´»s˜Œ£—‡¬é»Kö0Ù4µ›.mÛÚØ•J d–ÜŸqNîj*£)KÍY–¦/2+ˆÐ‹Ótœ]á¡%Ä—ŠpHÜi1àN‹=îPVóæªèš¼)@Bio®c’ä¾Áµ‰xAS)’vW¸°äøˆ–[Û=NÜ;pçÆa0Ã^’Ä%2)ž E®ÈF{QðŽS–ò¤O râè d'd|PÊášÍ›²° 2BÇÄ..äB8ëòw\ ŒÓ$®v«œR®Nq¸„ÅÉ.+}<[ü¸øëÇóÏï?üz>ÁOÆYÒ»æ”]Â#-†ºïK¬GìLˆyæ¹…iýþüooÏ?MJbo𠤝“èwP,ëmÓºŠ1õþŒ»OEr,ä{Ûü¶@Ÿeúïå1<ÄX¬åHT½î”TÑ]StK6RôyǾ0•}aªÀç0TÔ´|›9&ç@4EG§–%X2¬S 1~‰5ðŠ páêJ@1¨?añn]¸Š}MÓ¶ƒ²ÓWò-!É=dƒ™ê’uÝÔ< •a@•rW­À|¨#EE¶[r:OÁ©Š®›üfL—Ùe¨ùé ½°v'ÍïÂÓ±ÛGc2’Uëä?é$Àë1Îøs6ñVx| Ÿ¢‰Lé¬?“Ø=ˆQÏà`éÑÎÁ¡rþI} (àµ]¿ª·W¥¥ã«û×á$¸B Fqÿ "@Ä~²"º÷T½‘¿õ$FG¯Nh±…âÆ_âÁ–uHÊ4¿z /öx^M\rB´  ’@ð|‚±¹¡ÀõIc“¡7—¿¼{7%· G~°ÝÏ]Uñr ä㢮º·>Åár7rös}k ÜwœàEÇÍ8Oŧñ) þéüÓåÛËNDúS¤Ï¹Lƒ#gþ9=nxmhÆ_šÏm2ꊹំ̧„x>Ñ#ÿ[îö‡nʇáÔéÜÿ¾^]—ùÍÏ„ò^¤þýú ÌŒzpR>Ba¦×±ãèÒû}~»)ý$§Ô?hÛt^66_a¨Ï2ÊÝ®à]…Ü(j–Ð0ÂY`WŃ µ"T*¦ª;£[ áÛ¶óÖ°lO˺ÚQ×&¡¢«¼ïßå;Š:jצ¡+¾•#d(Ú jû-—›`ã÷˜«ŠÒN]-ãnÚ53tÿJo6`E=-!/ _õ9òÀŠ?(;r,®‹vBcþZ—ï0qP.Qþ*Ÿ‰¶mA †QñY`.SÉRj†þZÒÓ>rwòà5û]â ꘧šÄØ25OôˆSfô7µˆ¡¾Qÿ'â3W L5Ô*`WÎ\¡ ¿+ȲÑ3“ÎN·¹Ò Ô4¨Ñ÷£ó#µgfà,ž(Õ < Ís}_”¯LpJÄUƒÖÕ€_ßcgfœ/ÏðA¦£k{‡ƒ$º±•mò’V—õmx}¶´zõÛŽ ú(íb '–6)n°Ù4õ¦)rb,6ÑYÙ­©™'BàsèP% ðXíí~¸‚ا3&ðg~jØDqÏÖ'm>I÷oR€~õã?æýhÃfendstream endobj 1100 0 obj 2326 endobj 1098 0 obj << /Type /Page /Contents 1099 0 R /Resources 1097 0 R /MediaBox [0 0 595.273 841.887] /Parent 1083 0 R >> endobj 1096 0 obj << /D [1098 0 R /XYZ 72 786.278 null] >> endobj 1097 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1104 0 obj << /Length 1105 0 R /Filter /FlateDecode >> stream xÚµY[oì¶~÷¯XäIÎêH¼J)ú¢5ÚÀ@’ µÚ]ÂZi£Ë±_ß¹ÒÊ+Û p ?,I ‡Ã™3ét“À_º±bc3 ›mÊÓMºá¿ÇMh}c,©´ŒµÂÞ‚Û ¹*Îó‘|kiaVŠ‚»¿ù|—êMšÀÔ|s¿'¡ûÝÏQñK¢ÓÛ_ïÿ}óûin*c)%Û´ù Uч𠣿ÍëðÀç»Sª6oo~ºÙü4 šŒ4›­`»~ß”‡7LÉeþ§MÑ«¦à¦Ð”ä#SÊUSDl…ýÓ¦˜wL±`Šyß”ÝWôŠ]5%#SôǪ¾¢W²É4!1–LÉ•õ'B€™g›®ÚìÖ’¨õùŽ»s‡±«n·2‘ùöv :£û# Ȩ:×øã/©T÷·0X=L‡v‰îÐ*§Ý –Jr’*ýôDEéâÃ.|@½,pvÏUÝc[FE³ã([ÍJŠCás¸q9ïÉ GnÍ®êj×À–ãÛ­’©÷9(ñnÃeNçÚ ãÎwÙ‹=KÉdewÓZR’id ´û²«*j«¨«ú¶Ñïhwü§ Päq&ô‡‰svÄY¦Þ‡—ƒ=T'Xl+"°÷‚K¾ƒC1ϲy¬¤ŸyŸþ÷‡¢qç±.†êÇb8âŽBX_­–Âñ’"äêºnq'ô„4unèŠîºi‚Rp¢D ÈÈkÁ"†‘!TÔR`àó ¡<ö…`›æilõ"Œ\„mê1Ëc¯,ºj?ÖØI" þîZÂ>6û³ýÁ|GŒŽS•M«óCÊxœ’Ç÷ïļ֨c¥ÕÇ…SŠ`±wRßóѳû°•¹€Ï,Ž Gï“s×>.ú0\ Ü:Q–xáNѹ¾òÞøŽç ”|H9§&Ž€…úiÔ"Sr¢i-ÿüÃG 9ȇ£çï;ןë‚AбÛy#þÕxë‹Î[1%!€ˆÈEX0_ô>¤°Ü —œ!¼.w‘ÂüT3XÙž`AlÑO~AJ8ì)¸8øÚ﵇¤±Qq†”Q!ð‰ömÇ9#BWGOÇŠ2>ÈS@°±’ka" øõb&$'˜p¤L uÊ/ÐíªÝXV~þàÍ” a€3TŒeF‘;ƒy¥w¢´Á¾ëôÆèkcq”,ÂÆ…EšÙ"a#dR´¿²E¾ÌÄÂ0D¸Ú%A»uW»ÖAÁá¦ñLèPÑGt9ŽVϘ½+Òkgˇö¼²±‡¢ã8ó9áœ@8ã^ ìµ,zS\ˆ¿aAÞ36íàʪ€CžÜjÜ„+šÒp®AÝ®Dó›ªïÉôÌ[̵àœ¤àÞ$±æüÙAÎÏÈù×ûœ±Šå'n3¾¤Àê4ÖºžE·«1yË$Â(à&Ñn%£ï`Û`¢WèCæ{gohÑõ¬›«!9µ–ZEbc Þ rP4sOœ¶ÿýee#ŒmÈ$MÛlÁŽc…Æ”EýÉߎÂÐ>¸é½‚/‡–ã1qøTÁqšö2ä-Xã‰êcÄ®±)‘²{ýÚíè¢ì.ôfaû\rŽg] ¶ï ùù - KB!3X¨÷Cr*$ªaYÕïºæñ‰¡¼º¿Àm"¶¹ñ){Hk÷°r[‘"ε—"ŒøøâvÄÚ@·PÎé&M&^ç=×1Wêª3€· Þ†qÚ¤Éå@þ€,Rvî<8N\8hÃñ&e=£¶¢* ßèHX³rÞl¬¾´2RS¥&–g%^lWÙœ±ÐñïEÎ’x>ÄÃi1wíñ›& RuÛWt»ö:\vñ醷}u [©áÝÀ‚ \šEæ†îPÌȹ(ªËl…5ƒ¼Ô+âÐë3³²·LÇ™H—›“jÚ\ðÈæšÁ‘\m6®a«[[ù¦›óX)±µéÛnÆ·Võ5-Y „‚òÂL·:#УÇè•TáêA>>V/rçJ÷@ˆéV¤ùÙ<­$ˆIŸª–¿FÇá%LEÄQEÆœf;¾Éëp%×ÑØó|=ƒm…›( "4½‚Vï<«Ú4Îèÿ' ijÒ.=3o•l:þŽcÖîy!í»‚L§$Ôü0#Á?]áI|5KmÓ«ž°ÿÃÕØŽ;ðÅ÷òZà/fíß0J×8¼.¬½`¼õvE3áwY˜°™ùÿ?̾­É³öË>æÕð^M½ª¯ñÿ)ðŪõì¾,ÛqbÍrº òCÍ%U”ÊORWïC®t²ˆ|‹¯‰/³ôÿF¸ã|ôT"DËKL~õ¸Xâǘÿ®ž?endstream endobj 1105 0 obj 2634 endobj 1103 0 obj << /Type /Page /Contents 1104 0 R /Resources 1102 0 R /MediaBox [0 0 595.273 841.887] /Parent 1083 0 R /Annots [ 1106 0 R 1107 0 R 1108 0 R ] >> endobj 1091 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 871.997 83] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1109 0 R /Length 1110 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kh¢à’ÏÈPºendstream endobj 1110 0 obj 30 endobj 1111 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 871 82] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R6 1112 0 R >> >> /Length 1113 0 R /Filter /FlateDecode >> stream xÚ3Ð3T0A(œËU„æ†`Q #©k g†ÆÆ úAf .ù\@ˆ— gendstream endobj 1113 0 obj 52 endobj 1112 0 obj << /Type /XObject /Name /R6 /Subtype /Image /ColorSpace /DeviceRGB /Width 871 /Height 82 /BitsPerComponent 8 /Length 1114 0 R /Filter /FlateDecode >> stream xÚíÝKì&Ñ{ÿû•#ì‰#üZ ª@prÜ_—º.‚ùüƒrÀ.’FüÔEÒ€c$ðÒ$WH# %Æ€ÊØQðÒ¿2@¤i J£p¸4†ü6¹ `ïôVÀ–­›4¶„Þç;ÝÃpêȨdwj"Ø»_üy}ùðí]ŸFþ”4Ss£eœ.[€m:åðy¼ŸõÈ ;ÊðþÅÉö–Ìì€îid°ÿï?m(sà©í!7oiù¿ÁÒg¤ÖštÝ׬RÐ75†@ÇÅ @“ïç·?µXO°e«T–jŒõiÿtäþh¼Ù—0â¢`iŒµ²ð¯îPвb\—º¦ ¼«ægø~\ iA˾(pæpÇ˓ƋÒ1èÖ.tc»Wz‡|fÆTÃOi¤‘ I®8qò4Î’F) œ 9?·;ˆZ6Ï!A3\¥;OÂ×ÆÞ±Ý@3*ƒ¶—ÆŸîôöñ~‡årHÆÀÍÛnøÇ·‘ÆY•ÁM`¿>¢å²Žñ~`F­&FÐ ƒmŠ4¶»ÖK+Cû¨áþC´P¬’þµîq_RtG}u½4®“óÀRÒX¿…ù-Ò˜úw–ª þfK'¥bz©É3eš±>èFl-6x#Ö7ÆÆuDí•9¤Â/%+îMW6ÆŽI†í $o3oå4×\iœžÒ±®0ÜxËp&ð“IãMJ˜<Ï˨;Ë#“6'SM\CÛ1GW?Ìì0بž"Oo–]ç­æš{iVû³+o„é^‚²ÔÔD÷1P«5Ì)ÝÖ~Òø(v:‚.F5ç¨`Ü‹]¦ŽQ_Ñ7ó–:Ý7±Ÿz‘™<ímÏÌ7®ÉÌ>¬yäηel•á™7-ùhR(\°¯ û&*²Ÿ4v÷#ݺUÒx¿°6dÏ츉%õ‰±{Í’¦àfIcÒ&ÙYÓYƘ±}ý6ÿwÊyýl’7ö­‘¬H¯Rëï¿o/í5Q#íC_ Úѹä]ëʽƒSµ 6íâU…eµ}Ýý–Wä-§”ŒŒ¼j:šÀU4s‰É3žêŸÙ§1/[™c¯ ž¢X£F\6W&ÞoZù{I#úæßN¾ÙKyW–öG½öø&ëÀÜŽÝZ¼ é(iì˜ÔÅ:Ò8þKYWO‘ÆkøÄë°¥† ª£’¹ãyŽ4^O–²äv”4Îêmw•Æ+n¯Þ.ëœùF£¤±l²±ñè`5‡lŸByµ4~:èÒyÒØ˜Ÿ©òIÕQÈÌ•Æzo\A'º÷Òx â×7²¸?úF{ÇÊQ<Ø †ï‰+ É{mΪðu·]¦ì^_V8iŒý ÒX¹2j)i¼Ÿ®ÑÀ±G8Gí3"©š±Òà@i4sHÃÇ}¤ñÒø(²D ÐÒÖR7×TJc£€MYï7¾÷3À!Òhiâ£×²À©'ë¬Õ©¿M>×7ë`„§sò¸Ò»PæOåpüÇ'Ýý’ƹSC5Òh³ó 3q”Úw*ø¬Êu(eÁ8»0Ïì•@F.­ÓÖfIcˆ­5&Øâ3³¤Ñüá9“WùŸ.h™Õo joÇËÜë<‡.Ùy/IöÒ1w×Ý5üÜ¥þ裕ö{¥qð®½ÛÍçDM¬Wt$Û:‹-[*üR»˜›gå½ ,2cP9?Ð-#‘8bG? ä4il<ÙL¼££^µHc™ºdüͤ1°‘¦–<]VNòìúè(•î'…eÀxÝ1¯4Þ× ‘Ž‘´év­)~eŒëHcýV;‰l¬Ž5_+QwœÛ_¿™4^On É|ÄT[ÞXélImí4it£@¶4^_öHfdìÈúù©þÕâe•óiU¯íUz©NýàìT—$¢&V2ë¥1ï»æJãÜß ü¿¬ö˜ƒ÷JcÈyJ÷Ò¨8P¯/Ë2óÖÞæ­[B8$=ºÅ2o£ßÒøs÷·`Pûá’9KSÿH¬+Êvœà“Oo˜‡Ûë¤ñ¨Ö¨Œ÷·Kãà{ó¿`"xµFŽHf 4N"Ì}fØ8ùû^?‰ï ×E#ÀØþA¹MÜ}¨¬á'€=‚}<º»æ¤³B `®ˆÞMùóøÓÁW†Ä©ë à´èþù²šÑ7WŽÊŸö×ä *³- {¤ww¶Ge/,¢²©ž €£¤Ñ4#il‹Ò Œÿ—ÆöS•ÀÉÒØr>¤Bà÷Gý(.Þè¨X<µG€Wó×ß<>ã8endstream endobj 1114 0 obj 2664 endobj 1109 0 obj << /XObject << /Im14 1111 0 R >> /ProcSet [ /PDF ] >> endobj 1092 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 871.997 77] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1115 0 R /Length 1116 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™khªà’ÏÈP»endstream endobj 1116 0 obj 30 endobj 1117 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 871 76] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R6 1118 0 R >> >> /Length 1119 0 R /Filter /FlateDecode >> stream xÚ3Ð3T0A(œËU„æ†`Qs3©k g¦ff úAf .ù\@‰ lendstream endobj 1119 0 obj 51 endobj 1118 0 obj << /Type /XObject /Name /R6 /Subtype /Image /ColorSpace /DeviceRGB /Width 871 /Height 76 /BitsPerComponent 8 /Length 1120 0 R /Filter /FlateDecode >> stream xÚíË’$' Ekíÿÿ_¼p8bbº+¤«pîÒ®©Î‚‹8!„B!„B!„B!„B!„B!„B!„4úü/á'B!„Ðy¸8ƒ‚KF!„Bçá¢áF„B¡ ‰hD!„B@#B!„’¤öÃ!„BèNhD!„B@#­þ³€B! ½úv@!„Ј^Í@S „BhD8!„B¡¨TïÂþÅZ¡†‘¦@h ¹¡ñ*bLîßç?ë) *‰˜¡™I™á4z¾Êœ?ßE—!! à(\ñ§>¦ÃN„@U˜q‚yF^ª`Ï‹Ž#—/¹ƒÍ‡£ `ˆÐÐèÿ$£æ<'Ìü+É‘+&pã`åºq¿w0˜êe»«_‚Ð%Ðø0ĘîƒÆ¥Z¢Í3²EÛ™0´ßW GôKU¦àüBUACÇ–þVt¾¿‹+™ã.çG µ;4 iМÈÓk7£¼ß#–Wœ=m>3…LÌŸqBãaFeô5tqÐH>µ r,:iv‚FU IO{¯ÛÜ7V Àd\Üeà`†í Q^Í…F4 ¿Y“‘™NßÅuòiq µFòaz¼E Ï¿ôÖV£¡®…Fg戀F -ùت=Ku¤„ßkà"U(4NîØ'ÿ ŽbãqZl¯‚Æ!]lÂûúª94ÂÒ[<[¸HH—ÞxÎù¾ ËÉ ó$h$áˆDZl窱Aωµ„ÐhØA:y" ¨w–60¬ZS© p¤”ë $¹ží댵þÐ8ÖKÊžÉWhd (îåã«»PrúÂlkL†ÆÚ›‡û@ãO|"v-åž´Ï|®b ÐH Î‡Æ8ÓÖBãåk@Nb\ýÎò–^ ´Å4"‰ ;¼®¢4úÛ窙‹öo«å—{Ï|Þž¿j Kd>§6ØÆÝQÃzîòæÊÏøò LGuƒFÛm*Û«Í4EÑ3µ1¿4޹"¡9ÚZ¢péMÕ¿æŸP{O£­JFH™Çìü4$—eF *Û¿þßáx·` 4ªÌ`Æ]š(í =ç­j¡ñK$Oæ‚Fy÷È‚å•-öΟ’öRøÖhwN÷¯+G ñh¼ ·õù5¥èㆄÑsà”ŸNñ#æu0 “ñ¶$÷Ù ÿÚ¢  ¶óï¹p–5ÕÐ(éG hüD¾®´ák#úhëËyÒ Ño†ˆ¨üÂYÄÛ8bÁ»dK~ÚR}léÇ^åÃÕ¨47C£¥rŽgYùfhÌy<‰ü³‚Žn-á4ÐøÚ†£ÁŠž¼³œÐhs㦓ZP›å‰A“Е  ñZhŒÞ¾tOãódOz˜¶ÍãBh̼éÚFw«‡¸%r ÑÌ3ÓwPÇ0Ï7Â%Œå ‰±ý·¶…Æ“lv4Ê'¦ ×²üúœBhÌI¾v9“FŒ#òU>ÂÚæ«[„;c9Ájލ¡ÐXó=©ö©ž÷=žGŒ} qòJ·¸Ä6 €«?#hìÛ£'Pí÷GCcþ!÷„)&îcÏ‘_[^ž1•ļ/ Ã6°ªý~æjgæˆ>fra[£%kæ°R‰R%雺ë€0× foŒÇEçœ'4û33Í 5Þ1ÐXU¸³ý­W²^îÜeËDh,i=§ó;ÇÏfù [¸“cþÌ߃Ơ? 4úK"¡nôgµ´}Ãóœ+h—‚|ùÏS¾kH;É϶Q:q‹NÄ`lŽÙ9Ðx=æCcÐTL¨‚Æ“Jv[<öóÀQ}ä!ºœQ-,n¤90%³Ûî™f‡ßÕ'—ŸŸ¡Fé-%;²3ó5\YX+Û ÷jÕÑ<퉳í%Ùù–°öš¿ gÒ“3iyßÁŒjøî.’’æÇAê\l¯-k8'å3* ŽZZ7ôÐhvþ´Ë5­ Q¸À±t–*3ZN 6 i7»FŸÖ,ß e¾ëéyYg÷™½d S2J½Þ~4v†FùüâÜ~P¾9éóÑË|Ç@c…ÖîÂu¶˜aIÈ|Sr´üöx}HÐ!—8hÔf[’é@NŒ£ÍqÂòi½¶Òâƒ!d¥Aã1™S(ˬ¼eF-myá§ÇNÊJJ q¬¼aæ¤a«Ãþ!fËòJRìæåwá&^ÃêjÄðñ_A“‰+ÎÍg£¹LäyŒ´øàŒZ ÐxdÕ1zK^\GÌ[èÅqæ3wãô›ù g½UKKèÉmå_jÜ·N‘ÆÄÛsâî[@c‡“&’ˆqLÖ*o•a9çrhWªýD!ïDÉE ÇûJhg=ÇÉ$m¡QòÉÉ~挰×Ìnð†ÖlÚ;‚N¥}:½Fð¼ð«ìÛA£¹&áap±4öÉ(…Ðx›lkIµ7ùô¢ A¯a@»>Üh¸lPiƒ1'ÛR›0Gï’ïÑB#¸˜ æU¶ª„×ráæ¹µ-4VÛh4F Ñ<ÀÓºÛ“zµùr1Ž/ç&kPgÏÑ…„s4‚‹Â’ED_løê× …Æ¡>Ó× pT~(ørttÞ‰$„Æ×|¶'4^x&:§Žá|Ûu|†¿Õ™Ðå% 94šÃWŸŒ Sê3ÚžÚåS¼sªePÌ÷”¡‰<‰OÄèZ2ûð|þYBÕ€òT­‰rªFÖBcòÝ}@c·Ê ÐøüÉ×°,9æÏ h.– 8ªüº¯ºívn\ª.™!:ɽùÐh>ãOÕâP·¤[X~¦9ϟמ{Ífz_ÛÂ-4,T «1vyÂu 4{%y\¦%Z…¯Õݨ946ñªƒÁò+0 {rjï·#6Ìé'%\9e¥´!ƒ»<ó0htF~ö›~ êmƒ^Ÿbãó±GÏÜ„ióLjsììôu9o·Z(™ÿ[«Îþ\í߆T7äÆ- Ñ`°Ph4{ž|^Fß ÑÖ¦êôæ¦^jôìÜ(§ÛHß““ù¯áI”ÌÚ®è6Si7¸z Vìï(C‚ ™ q[×Hß““ö$K÷b¼{¦x¿ñp¦’‡‘%<À7X.:"á–³—zô 8ÐhhaìwvÎå/Ñà¢qÜkÍÞ¦§€ÆÕ=64ø%ÁJk¡V3àê“KÒv ‘„˼͕¿ÓWòøôÎYt†Í‚&}ícñf Ïÿeö'áZÕ_ˆ…pZ4¦p”Š6ñ:çóúy,dÔ Ôývá'^Â6~3¤½/íb*¿…–Ê)ˆØex iç’ãäœþúa† rNÜÌéèÙ?i¡¥†-QÝÎW¶=Џ©†yjޑբ („B!„B!„B!„B!„B!„B!„Бúç_ÒP‹7endstream endobj 1120 0 obj 2935 endobj 1115 0 obj << /XObject << /Im15 1117 0 R >> /ProcSet [ /PDF ] >> endobj 1093 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 871.997 76] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1121 0 R /Length 1122 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kh¦à’ÏÈP¼endstream endobj 1122 0 obj 30 endobj 1123 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 871 75] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R6 1124 0 R >> >> /Length 1125 0 R /Filter /FlateDecode >> stream xÚ3Ð3T0A(œËU„æ†`QsS©k g††f úAf .ù\@ˆâ jendstream endobj 1125 0 obj 52 endobj 1124 0 obj << /Type /XObject /Name /R6 /Subtype /Image /ColorSpace /DeviceRGB /Width 871 /Height 75 /BitsPerComponent 8 /Length 1126 0 R /Filter /FlateDecode >> stream xÚíɶä6síÿÿ_õ®N»SIbâ®Ë~)  =B!„B!„B!„B!„B!„B!„B!„>Ÿ‹€B!„^pñX „B!ôáF„B!tp#B!T'F³¨27² !„P‘èÌ: ÊÜÈj „BEâ2KÈhBýíYô_bÄ0BøCš"úïŽ`)ÐCÏB½B#ŽñÏʰ@#Âð!ô|9vÁ7²숩¯^ð\k7 5BBãr÷È"ìL fãÁí£-§¦?Ï 4¢š³$ˆ'æÑVû<boÛÌ~<Ý>Úßÿx!:þý˜@#ªÉæô ˆÌƒÈÈÕþ|ƶЇ|Ë’¦¾z1nUß ¶RL_»æ‚ µÙ2¿=8‹G&­öϲ;‘˜5ÛÕ\=ÔË?û|×ZW‰ô„]U6°Ì[OuœHlo3¬ñ¤²ô²g±“IÙ¨,`AŒ/ÿ+ ÙâßçUÛh¼ŠìWqœ-  ³¡Qv-sSX`A#¿}AÿzïÃò¦óÇdaƒwyhÞsį)ÝÔ‰ÃöIŒ­O7–Ô…¼¡qÞ…V[hVówíÞ0`Äv'^ÊÁÐXóM`oí…;Aßã†ÊÏ쇵í4µ^B~ÛvF”¿¢ —Ë­}£›Øœ¼[kÈÝ~®óÎõ/3þlRM©)•ìÊ`½ ^Y¯ {¸µCBÕí¶í»D'›ñ}"Êáâ´öW®¯þÿöÕL"§ØÚ¡ÉLèóK•ƒ»øÃyPÐgxLÏ¡¦s¯ÎÚÚOAa¡jÆŠý°üsIÏï/ÌË>l#õ·Î= QFYüWü ⟠Y„Åic;¢üÈ‹¸ t ­W5þ÷7ê• `\^=BØmµm4¼z}Y¦{µ*§4Ýnbh|Ê àýœi*4 øMú•C¨¡£w_¡K_X§v… 7­>Ç ^@†³ËŒ1ÐøÌÍèõ—K»¯>¶ =ŠŸ½ÀÆoHŽÉg’Þ¿ÔÙÈýæ&D•Ö©]áö’lÓSW=7nƒÆç`ø€àØzH»Ñ9~3· Jàú\ŸË–»¸ÍGÙ”!Ì0--¸È¥Ÿê» M»‚þñ»÷V}.e“®§r‹Øu 1?þçiÔÓóS ÁÐøÔ>(‘}—á½_º+Ê/ùú- --x?À*lOiÓ™Ön—^{Ý_K‡Æ'û²-n·§­Œ¿#4*ÝÅrbtÚŒM?mÏ÷CÉxKÍ Ø·KìŽLÈ¡Ô ~Mh|tíÇJ ¸½}°#+`¹§YÐhµ, q6š@ãÇôãŒí Ñé?±ò!¶f ˜lvP’èš7æ ‘ 4V¸ëaè””G¢z m7âÛ|§›Ø›í0ç,bô°‡…ШÉýrcbCSnÌ‚FWnÔŒc²ú…Víñ)[Fãm"GŠMú.C04*gkœì¯Dkί„7“¿>cæ3¤@£kýJl3#ÑÑäNŠëðaÐèÄxÓH²ˆñÑÝ>‹œ—b2ì4æîgî^«3ŠPú b>MÂ5‡ †RR÷ÕÿV<ê'ý ãü·ÙôÔFÛ´ÍMƒ÷.Œ˜;„â\µßí:8D˜4P9y† PtÒÕ)¾{è± Ó}šU5²Së}#èÿÏuòY}D†F“¬ªËXuýÍ €ßâÓ™s‡lbÒ“¸ñe@™G¥@c÷—%(¹Û°S 6ìyŸ{^S6ê5‚FaŸ¿tÃÇ1w æ3ŠÓ§mžž„FMç‰SAŠ»ûö\®Sά µxPV&ò^Š ØŒ“ZR7Âc1Ý%ëÉÐÄ<”WÈF+ósDVШYÆÃ ÕÈ*@cñg¯ùÊÖcÌÎî ÁXyæÝ]·gaÐXa­¼G9YAcÊõÏ«÷8ž³6ŽÇƒШVè°E«ž®tnŒÙ§Ý¡ñ±èé2ð$«Øh²[MþÐX“®ëCcÀZ‰ÏÛ«¬ÕÊAâÌBy··ÈP»û1¼1wÒÞÙ7`…AcÊåß >€‚õø8ÛéaÃ0[ÿ/Ç,]Ah,KN~[³Ç똇˜ü[Ÿnv Únœúƒ+eШé½l7‚Øð ÁjŒjüZ¥#ÊŒiÕ‡d"žÏ9¯Éüä ¡qç½Îh™¾ésíôñ•~}ÑÝ[bêUQúa14Ú¾Ž‘!Þ +8Xï××ÔZ”i¸¸ ú™«˜kzϸFý\hla™@£ß¬¿ÙVØpÎv£Îüú2€xqÄù5S0׿RÇÙ¦;ó=¬(îʲ Ðh3LËã h,µqZ7|z§E}‹$zhô0Ú"èèG¤Õ2toëü‘'OnÕt=rU³ÆM·ûä‡á}ÃÛ-œ²Vކɶûí«ÆÝ`sû&é 4n†Æo&g KHÛ5öõ éíF]¬Kv~gâ§lCü³²¼ož¶l€FÈYl0&Wzg_# û²Õ°¡ Sw*´ù}!‘lëð_.4B㪥vúfë n´]„ÁßbУs‰]Å@ãÇn¥üØË5Fä~Uªõè&Mí4Ö…ž•=! ïÃEÅ",_´Ÿq£"q3IáËßk.®pzõê—|ÑUÉk+b3XØ ÏévÍ—h´âÆâp%«wÞO\øÞÙ8/V½g ¼G´ö ! ±7VÑsê*)[³–¸)«Û¥Üñs¿ì9÷!²ËxŠYŒi=›¤ì ÙÀBìÄhܶÝô¶Ø³tújRåo)*gí«¿=j¿Púø¾~ÄqmùÁ(7/iˆyÜ™©)¡7uvÍæ/ ²-n‚> /ProcSet [ /PDF ] >> endobj 1094 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 871.997 86] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1127 0 R /Length 1128 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kh®à’ÏÈP½endstream endobj 1128 0 obj 30 endobj 1129 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 871 85] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R6 1130 0 R >> >> /Length 1131 0 R /Filter /FlateDecode >> stream xÚ3Ð3T0A(œËU„æ†`Q S©k g†ffF úAf .ù\@ˆó jendstream endobj 1131 0 obj 52 endobj 1130 0 obj << /Type /XObject /Name /R6 /Subtype /Image /ColorSpace /DeviceRGB /Width 871 /Height 85 /BitsPerComponent 8 /Length 1132 0 R /Filter /FlateDecode >> stream xÚíÍ’$­ Ekí÷_¼²Ãᯋú½dž»œ˜éÉ!„k!„B!„B!„B!„B!„B!„B!„PŽ>ÿCB!„öÄ4"„B¡ŸÄ4"„B¡ŸÄ4"„ð!„~#Á!Ü®5Ûã€ÐEKhDá Р½ar‰¯V"BhD"Ɔá!D¤@á²Ø¶‡Á!„@èO{ûç28,B×q„šƒFøßq`Ј‚ö4þìä{Å2—2H_nŒ@½ív|ØoÁZÖ)Â!#„‚+”¨`Å=爀Ј֎Дµ×…iT(ÚMnpðo™zÍ0Jß×Û׬r Å®®Ã }›çÃ}{Û—ÿÙ+R!פ¼ß’ûœè§ß›ú¥~.  ÑÖAGßzÁ™XÜFeôK ÔÏAÓß+]ÄýÐ(ëE‰8Y¬¸)£Y5ÿû…ʤ ­ ‘éÙ(i&:4K§4Óû‚Ÿz‹ýB©teB{>x”§ÒA°oãÛOLÆmrÿ¨ nan„ÆEškîF ^3Z ²òþQˆn9qõó:Ÿ´9HY›‚÷q¾½®(’˜ÎŸ$Ù=A!8é KX k/ŠS³6/›¤ÚÃÈüŠ£…Ôr°ç¦£æÌªU Mí75aÌ׌èÙÐøÉ–1D¦OïÍVuŽ¡à]xñ8uZÜû*0³ï%VnÆæûvb(ú P$ùÿ;‚NvÚ†E'âì㞉 x”fÅ¡ÑÙ×ï¥uJmÁ}p»‘òmƒv%˜ùÑÆ‹œêøæÈ>³jÐ8 ¥j>¶Ú•%¦«`jöE†!ÅoGÍôϯßf§\=’:»û‹UnIûkB£þp5Gç#hœ½•c™ô§–FÛGxäÿc ±È2â”4^TŸÿ*0s[ó@éXΑBã’¿ž,˜N¿WûɈýnrÛÖho‡ÆêîvŽ8ÕP m_×Щù…ÒÙ’Tû_ë( ÑMŒ@£q ^—˜mÞŒè@£ï¢¡÷¬=[»ë8æ´3Ÿð$h,]×G×PcOÙ‡>¸àéÒ©+V€FÙÃÖSõfhÔ|µöº4ãíæËö·¼ãà¯:¥súdsé7¤@£ZØr$™•¡±t;™»žêJ4jrãìO9:ê!SÝD—·¦±m¬DˆQ0¡§Ö")+S!ûú}ø©×…ÅÓ æmŸ‘•fLùQ@ãÑî¬yÁ6 ‡£5–e±Œ[Bs|W€Æ£ƒ§êd£ì;GŽüÆ4ŠŒÕOWпq»1Íx/46—Ó;l ":; 1qˆ±ú´N*¹–™u"V}%Ç·XÔ¸±´‚>4~;Útfƒù‡\ ’zâÖ Ew€F 17Ëç8ê­‹Î@ã¥Ð˜n™‰Ð˜¸£9r§_Õy¹ì4¸”¦×D Sb;¯ »ÒÉžE qÕÔ½+§¿mG¨#X¸%ÞZŠÐ”¡q¹::<çTtÞ<ªè{§û(“ >õ¥q!ƒ°‘X{_§·ÆF’KÆëKîUŸ•9é/ø´`¡ûy©Ç@c$zV0öÉtˆ1Çv‘äçxŸ–Ó¦{ÚÍ5xc7¡MEçSÆsÏ£ýÇVǬñX/J=°Û=-ÞȸUçLì^×¾êÝ÷°èG_JAjûÊ.0žÊöOA£¯V'qÆí]d}éS{{64þ¼_™ êvm ÑÙâ½s“Æ Ðx]åö“ ±bSöéãÐh ÁÇNù­!¥ªôw^îH§ë}Ç€êèÜîû÷§ÚþÄ»\VX¦¯y`ƒYfГ´Ac0ïm¦I&wB£ñöŸ4îÝrº:uÉ7žšÛß Ï%Øxzª?矞ÒÑÜØžv°éù6G’ðñÐèXDñ¿©ÐÒmœ¹–é>ÉŠ7íLÆ”ígEk>{…U34öï”}^±!·y”fl>.?…F£ ÷nuý<³6•îÈò§1|bT@ãjé‚Ušl| 4ÿ÷Ü|Že¢s34Q0~x°JäÔÆ|œÙË{7ª-Íà3¨ƒÆÜ_³›]Ù?cõ¢b“ ¯QGŒ+ã¶.9‹ŒUJÂǤ>-oWUl*}¥YÕÕYƲ_ùGbh¶ûÒèÜ Y?3hf‰1Y–™â*‹š+¸Švµ öPE— }8«¾ÛÏW‹|•*‘áöÕ va.Ñ aV«º Ì4„x7VôT1æI²²yYí¿Òm2…*{Zö¥ï)>ÙÀSv1S!X;‘b™G…OŽŒ}"4£•4þ¹·Í…ÆÜÔD]déõLGš±Wv—Ί•ht;¥ÄâØðúج¢R"å*÷·ÝMg}cgòÐþ×Ò7 è²rƒ 'Ô=÷(}# ‰µGðôa̪Bq”¤og,ç¹ pMtYI÷ÌEÅó§¥&­êÒ¼ Ä,íNo¶u˜X—þ98‰—}޶äqÍþ?½ò”ÚgV@©NgõSS]kµ‘dcÏýbßtËä÷Ë—Ll˜fl³–ôú5Ôš¯s;Q¬¼¾"éØ$ÆÕ~Å`oäéŒܾÅñ,1ßXáÌuYи†sŒ3^QqþéyM'16Ñ¢f“=—ÜÐx1Ž@£¯P$·À -Í(«ìxº¨ƒÐQö,×éݘf´#P–3Ͻ8°÷cYÙÒÿ½ií#öt‘Oÿ²oîDrŒh¬;-}64­£Ù’¤81S ÀN¡;71­ÎYÑ h,úÂh\yWt7?°SÒM=[¤æ®/G#Vw=JÕ¸ñ¨5½à!½TRãáÌá³Gfùm·•rê‘’‚BãO{N)h):!ºëº ÖÝŽœ…Æþ¼Y1®¤£ç5Ñ_Ú!E1E„-nð h´ï@‹V™»S|îŠ.¡Ç}`yëC㕱#å?¡±m;ãK3ê@cz?„gCcóNyÅZÝD°xÝñe¹Ñ!%ÙXT"+Ëö¾¶Z²Q„+ú4ÙŒãì;îB‹®§qnÿªeèG²ˆey,% š§Ò·~j¶]Yy¹:h4–D¦OM1q7åÎ{îbì¼v1 뼿îH²ñÓÞ‹þFh!Æ£ÿ:½S™݉CãšÖ·zÅý%‚”˜X¤”Øì4s(«à%Äfh\IïöФãÐXîmHÛê¨öÆáÚlö q5¾f%ëäY½ž][4ö4ç|4®ìFîE_¸ 7Oë`Õ¥ÍN#Wç—° mçBcƒ 7 H齞¶Í¦»È³ÔÚ×DÁCÊ 57|Ûìht¸q5¾Xñhln¡\Ñ© h¼WàE˜fhü–¬<©[,†ÆÎOФ×rôŸP8º¶æÎ ÐYƒGcF q–ƒþ¡®ud‰Ie5ÿ“ Ñ8Î?ãŽÔþkjj~V¶W½»+O4K[|_÷tŠ ±Óó4§-K¯#õó¹µþÚuÙêAc€¡qš–Œ§ßë°¿‡TœíÏÏoR‡Óܲi¢Ú¨D:W¨AãÊÈ4¦ÔfÄýôŽúnŸÐY.˜"V×7ÕúȾ³|»Úö h¬€Æ‹ˆ±n?˜r!}莚tµS‘æ½éÖ~4NayQ´JáF©i¼^Ñù‡EkÖ_Åýƒ¦oׄÆê±zRMcäîØx\¨H˜D|Kš1=F4Fö#§Ð8ÝÆñ[êc‚“Þ¶û~-4.ö ¹Ð¨éÛ§Š€Æ†ßËâëpö§ qýõN_5o½!ÕL:÷¦;–ñ\ÇìT#Æ}ü‡FAi~N õgJƒ¾]¾ª;ÛVI“E6¤ûÞ¥&hÙŒ{àÇ@£N˜ÆHÀggM¡#â“ ±ÓY) F|{õp=7D!X 45õ§ÿKó±¾ã…ÐNsHF[Çhf€ÆÈÔlÌ4~›Á«¡±Ÿ¯ªWqÿ›ä³HµÒì>ñÛ>U°ö^ä)®GB£8¼wI§‰‚)kW؉OV"^A£fJ§úU‹A©plü0Á$r{èçk¾ªÖ›€Æ¸]Ý› 釯‘Ô‡Æ%Ð+R¯N6*\­_‰ö«:SUvO ¯²×K—¡ç-Á½§BU9<‰GOA¦½%¨ Æ©)ŽOmFdkyo²Qç>¾ZJGí~\ÑÌϯehtw©ªK qŸ¬Æ‡×&7¤öþîOAhT³({?(Ù<Ì4ëEˆ1×ë¸Íõ²æ|shï]ƒw¥_Š ô!_‡ÓÆ»ºY¼·‚Emþ\á D$¡'ƒâOµ &t²yÆÌE€­v[çåÐøçX)^B‰v0“ê` 4žòƨÐSã…Â<7â¦]“Z‡^å0úsOªoj…—ä^.ò* Úi$U›Mn09¸ø¹1. i.ŒÎéÐ(»‘¹h±ð6.óæäÆ]þŠM¥¦§"‡Wç·{€oùùa¼q1Vït ;gÓ°v$NŒ!„BH–F„B!ä€Fˆ!„Bí¡‘â„B!´FÊòB!„Ð釀B!„ìÐȰ „B¡=72 !„B!„B!„B!„B!„B!„B!„Bè1ú׿%n6Sendstream endobj 1132 0 obj 4029 endobj 1127 0 obj << /XObject << /Im17 1129 0 R >> /ProcSet [ /PDF ] >> endobj 1095 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 873.997 83] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1133 0 R /Length 1134 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kh¡à’ÏÈP¾endstream endobj 1134 0 obj 30 endobj 1135 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 873 82] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R6 1136 0 R >> >> /Length 1137 0 R /Filter /FlateDecode >> stream xÚ3Ð3T0A(œËU„æÆ`Q #©k g†ÆÆ úAf .ù\@ˆå iendstream endobj 1137 0 obj 52 endobj 1136 0 obj << /Type /XObject /Name /R6 /Subtype /Image /ColorSpace /DeviceRGB /Width 873 /Height 82 /BitsPerComponent 8 /Length 1138 0 R /Filter /FlateDecode >> stream xÚíÝ˲ë¨EQ·ïÿÿ¯*âV§"αŒ 3yhÌîöö£Å$Aøº¨æó´~J#u@£4RG´{#u€M“\S Ž€ö× êÃGkÀ¦Óm€:¨#êTG €:F½7é àìôÖÀÁ×8ul‰¾Ïwº§ä’WÈÔD.ð†Ñyðíõ¥Ä·ÿú40ò¡dšÖ˜-³uÙ64‡×ô~>Õ#?ìhÃûäÛ.É)ÞÃÓÈ”ÿßü´¡Í>³:Coþ¥åóvÄKŸ—v¸kÒ÷¾f퀱©1:þQ¼Ô±ññÝåÇñ÷¨—±¶l7íÀRc}Ú?¿?šuŽ$ŒP‚@8CcÝ,ü¥;D´¬׿“Ý¥ ìuægøD>JMoAË^(°Š¸‚éå©cÈ—Ò1w]èžÌvïyÎŒ‚C£:’IPÇ$cœXH¤Ž³ÔQŠoPÇŽœŸ;„¨c»OêK ŽÆÒ*áûc×pPnjΠEãÕñ§;í>ëï6^& êø´y·$~ðcÔqVg° œ7F´œWÖ1ę̈5ÕÑlÔqðš¢ŽíÆµighŸ;Ü?‰+ë„ä ?Z÷ì/)º£^z–:®“öÀRêX›ó.ê˜úq–ê >fËPå:Åôx<¦+¶{àÈÅxXt'©ãåþDPGêQQ|‰:^~d{úÕÁÞøçÒê"» :^ wÿ%­ÚK¥Gø3«ãù³ÎÑÜy»nêÕQð"üÒ˜uaÖO ï? u,+¤¸ô°ïds/uÜ1&Þ<òif–:ö}A²á×H™`ÌõFêH–v…a÷ÍêX/?~˜¡Ž?å0I‰%FzïÓîºZrŽ\JÔ‘:B ®¶³.üÔ¯M÷ZÏZ˜®IÑqgëÛ>ê8 „ôÛõ+¿Õru¤ŽÛM¬4{w‡œøC„Ôq)o¼òÏuL öˆ“Ô1ö7JÆwPÇ2“A ]d7ÎéGX¿¿®»¦TÜ>©ù3¥äXt#Îìë{cã΢öÎÒá—RÇuާŽ+{cGÁáøɻᷲä5W§çOY§ž¢ÝE¿Œ>\Pu¼þ§i?òƒ\Ô‘:RÇW©ãÏ0ZÙZÞm’:ý*Õ1¯/Ø&NFÞƒº%uLº ó*Š•&Œ¨cìñ3ÔQæ¤6øÙGýÄEv¡iðu'Úòˆc :IÒ†ÃuRtb-q<[$ùËðnÿm…zJYoÙòàÜá`VÓÈ‚ñî€9ìxä- Æ~wá!ú„~¨«ý;*Љ·É Úã\u|4ÜãêØqxTe ý0u,hÃ)U”G_ëôß{ç°þÍ×/¤ÎUÇuL/$ÍÂÕ±{ݪXæË¶_† +áÐÓwÈ»^[¯˜¨ŽWΡ:•ê˜=dÄNù š®£òPãN»dÝê{„ÂtOtÆ #¬`Õxü,‹)õØp‘{ºå>ê <¿@Oá"ÐL¾=rngÞNGvEvOù—2™ñs “”˜:æ•M¥»q’î5ÎV£XƒZs—HøÊÅHýÖ,eêx…n½ˆíxÓ½úy ¢®Ð–£r/ÿ·©ãu»¥cÝ×d’¶¹6–^Ϙ#W¾ÕÔý«·Ë4Î.ê8X\íìÄâ7DT¢4&$ŽVPÇì/È~øe ý.úîg¡Ž¯½òÂd|×MÔ>«W©c_M{ü…ìÑj uì8µì€YAËŠ`Ô1#‘Ö¯±)«”æªc÷¢É;OÛ+87lðÕï¿£í¾Ž¼;¬?]ü÷;¾èÁÑ*uv¤Ž÷Ÿôi=lxŠu°ì·ýfu,»'}dx]aұˤ&ð™©ãŸÃbǘU<ÙŸ­ŽI…š§Y]ÙP#ÓñúUT½®~ÊÕ¥—RÇ›-C×ûvyÍýjVû°+ß&Ó½)e©E÷Q«]˜S†­óÔñQì$ÉØ^Ì­:FÅãàýÚeõ}U¸ÔÒßÄÑj#?y:æ^¯a÷½š“ˆ5çù¶½­2<óJ”Ýb¢ÙWÐÊjç¨<}ðÔq¬|{_í¸¥Ö´“&S‹þ•ê˜t#í¬Ò–Ýþ±#þ1Ÿ7¯„^¼×1i¸éÛ;=Ø‘™^¥:æ>¸ß‚‹M#“»¾`©ßѽüteºø²ÂÄÒÁ›[‹;ûéö-n“ ™wwÏp§Ãí•að®ËÍY“Ôq| ÿóÁ‹HÂĨ•_—:bdaBûdlñ¥îlO«²5s ™³:Ž¿“¹K“Ôq5u¼†L¼^¶qAÔ2£-ñ@àåS¹×±øiMT©ãÈ7N×WDzÂãý!—¼ >O6äwì¿ ŒÖÊQ~;uì®ç£²SÛã ê8ÑÀPÇkàп¾ùÅ_÷rQǧ2~ÇM¥¹%]qoSGKϲÕñúreFÆŽÜB’”çÕñrc Ê»èÓ9Þç3:vÁ±×{T <:BAžI˜XÕ¬WǼך«Žsß3Ð8—ù,ö ûªãxø§:êÆ^¨Ž×÷Ö’n0o-áUÒ­—y7ž¡Ž?P/jb?\5g©cê‰5FÙŽ÷XåÓ%ÔâˆÛNÿÚ€z€Êxß]ÿ70ÿ Ê)À29¢šêX³˜ÒŦœNþ¾ÇFbàÿ†K#€‘„‰UÇG'¥wÎÈZ³©(€³ƒ}<ºoŽ%َ̳œ—ÏÀ©:zó›V?M|dH¨ú~¼-º>¬fΦPûcò&˜ƒóeß,€—¤ww¶Ge/,%´©¶ €ª£’#u|ú/Z€:òFÜ«cû)‘Ú €:¶œ'©ÑØcË¡@š €=úIŒ8¤ÀÙüïøPÑendstream endobj 1138 0 obj 2582 endobj 1133 0 obj << /XObject << /Im18 1135 0 R >> /ProcSet [ /PDF ] >> endobj 1106 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [237.148 386.215 242.602 395.912] /Subtype /Link /A << /S /GoTo /D (figure.6) >> >> endobj 1107 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [453.41 317.864 458.865 328.773] /Subtype /Link /A << /S /GoTo /D (figure.6) >> >> endobj 1108 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [102.333 101.683 107.788 111.38] /Subtype /Link /A << /S /GoTo /D (figure.6) >> >> endobj 1101 0 obj << /D [1103 0 R /XYZ 72 786.278 null] >> endobj 1090 0 obj << /D [1103 0 R /XYZ 121.366 462.595 null] >> endobj 1102 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F30 512 0 R /F28 523 0 R /F34 583 0 R >> /XObject << /Fm14 1091 0 R /Fm15 1092 0 R /Fm16 1093 0 R /Fm17 1094 0 R /Fm18 1095 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1144 0 obj << /Length 1145 0 R /Filter /FlateDecode >> stream xÚµZëoä¶ïçË?áoÕ^E$õ ôC.©ÛK( ´@S´D{…ÓJ i×>÷Çw^”´k-ðò1’Ãyüftê*êªÐW…Íc]Ø«jÿN]ñ¿W¡õcÊ43q–bï Âm Üš,¶y†ôïoß}}cŠ+¥â2Ë®nï‰ö¶þW”Å*Ûl•Ò&úkÿÐT®ÝlMa¢›M™F}·1*:Ž›ßþðõÊ®T—IÉë·:‰³2#.Ž›­Î‹hì÷þØìýˆ]íÝFÑ3vòè~lä™°ó•G7<3á±gš,°Ñãf&tüsGÑe$Û¸®ÆF 🎾«}Í\úÇæÕ‘' `œå‘·d66{<å©=ºÎ÷§±}ÞØ,ŠñÎxK…Â,é–·k"8©±Iä;w×zl«h{x›ð0áŒÍÈŠ²rÖñéÐF)‚p¨öî4Êj¼÷;AG•œ¹¢ŸxdZ–!ôh^ôÆ0p`1£cAP5¢4…œ¸¶%Ìð$œV VR†Vßù¨³PcxHNó•üûȃØ1šhÆk qM:†\ýP“‘@“ažŽ>’åxÔ<@“ÇÁvü(D;:´¦(±¼¦GGnqšG\¦qfÒóPÕŸ‰ã”¸HøÝ»Î=½)ôŒ4k¢à^žÃø¤½¬žÇç¡›½Üdâ÷Úõ•Žs£~M˜?*0Qßt‚÷¨;縗»Ÿöw!2jSå¹@¹@ôNýÚ©ÌU_€Ñ´CG–°bnË„Påì?Ü_¸ÄWx¦¾½-˜3¡€]Þ²Ël{W³'5ˆA´àè‰óU¾¾Áà[rDtšŽectâ`}ûpyXB Ä2Ÿ•õ’ùý# I¦ânCõ üåle”ÍF¦çIèï·!ÀÑVPü¸µò˜‡™2z?!ø<—+äéÅrÁ™yÆÛÀï ‰f?öí )¯ù®ªN'#HÒºÏ4 ˜µ„5fã/½ì\IC¾Ÿ£ãà(“+ à rù.Œ°ŒuôO¥dÄ:òP=û'ѬÙÝ“P$Ä(¥\4àù‰YäÐܹ®¾ž*µƒ¼èúmöœ ?s1á>Ò¨Ò®ùq$™‹TGJ%‹çÌ z‡¡Ü~䞤ЪzÒµrYt.ÃCÆÓ.Ÿ}²íkž“3Øhì_Èyøz%ùܪÉB²P Wá_ä’Ú=ýðït¡Ô† ½Teð³Å”¡ TàdÉ–ïw ^A‹B@ø_&’eZRÆe"ôVöÀEa •$ÉÝÙK5PsÑâ,ÉÂ^Ø“Õ1‚tØ­ ô€ßågí ÷€^õ9‚s¼;Hr 2”‹)ÜC£%èùJõhiAFbŸ pÃè¥sXx’ºy”xÉk)÷jÚNÊC:Œß\~i Im*òæ÷hJ¯~½áÔ{¹CÈÞ`rúÆU®pÿSÛßI^NIÅͦ@7-‰ÇBŒß¬©#8A‡´FJ¢—~¿ÇðDˆ-º)¤#]¡†÷$õTä´è¤<¹¨Q2¿°ùÂo6àkOâ ü|{¾äŽ\í)ɧ°u:“(Lpåy‰–\Ó1R¤2 ¸ü´CŠ &½Py ÇÑ·÷ˆ“2Ë’[qX•_T×Óå‡#È‹AnB5ií^@#ÖÙ†µÔ¨„˜“fosnòeYììò.èËô6-ã\¥ÿ×ÿWÿT‰t^"dÉÿhêãî÷#w‰ÑûþÔÉÿ2€á÷ý'?®šA™Çzª í<åI"P¯Ç’º(I¡Õpª|.ìP4Õe!@ƒÆSÆI C¬õ¼×Y!ô"€ƒbr'íJÑ*ÐOs·Y$–q”³¢¾3OÀî}7Î`~šðŸ`ÎäÔ²gò2|å%:û*â:œëKj“ƒ æÅ[諸úüªÞÉå>šàì+šó¡|9Ýendstream endobj 1145 0 obj 3270 endobj 1143 0 obj << /Type /Page /Contents 1144 0 R /Resources 1142 0 R /MediaBox [0 0 595.273 841.887] /Parent 1083 0 R >> endobj 1141 0 obj << /D [1143 0 R /XYZ 72 786.278 null] >> endobj 237 0 obj << /D [1143 0 R /XYZ 72 761.372 null] >> endobj 241 0 obj << /D [1143 0 R /XYZ 72 389.76 null] >> endobj 245 0 obj << /D [1143 0 R /XYZ 72 270.086 null] >> endobj 1139 0 obj << /D [1143 0 R /XYZ 72 177.263 null] >> endobj 1140 0 obj << /D [1143 0 R /XYZ 72 127.649 null] >> endobj 1142 0 obj << /Font << /F37 380 0 R /F15 393 0 R /F27 394 0 R /F33 497 0 R /F39 496 0 R /F26 391 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1154 0 obj << /Length 1155 0 R /Filter /FlateDecode >> stream xÚÕZK¯ÛÆÞ»@»ïJèÆ`1œ_Ù9nœ¸i‚..àE]445÷Џ©”må×÷¼†"õ°ŒÂFk¶†óâÌy|ç;‡V‹þ¨Eªi–„:Íåö‰ZðŸÇ…oý}<ÓÆ&Œ->ݘ¸²6LòÅÊÄa–Ä8ÿ»»'ß¼TñBEaå‹»{š{·þgÐj\¿\Y•ÃÆm{W¿[ê4p}¸\%¹ ^ 8˜Õ8i©³`/O»å žÚ¾¯ÞÖŽ'-•ív·|'lÍÝ=/qͺj¤«ÝÊ4^S UÛõò_wƒs®^=§óº?´ÝâÀ“ïïŽwÖ)ÈPó•ãü–ˆ`?c ‹òºhÌÙk²Ðfñm Ä¡ídw“_ØýïÕC1ì»e¬¼:äUsßv[ºú·øæ“c)hfôz\þr™Ù íPhQðç¤;T%?u®èÛ¦†»æA麡¨*Qs›¢+ÊÁÉÚ‡®ÝïP—QãF{?¸Æï¶«‹Ò­I+ˆ©JÞ⦇åÊhÔ|+´'|,šµ4øç¾mpòÀOo"eÑf°½-Ðæd—µÃ¡F†zÇöØAÌ_jmDj´!ÅßM»„‹¿§Eïð}xWhZy3Èf ûj¨ÞaËÕžQÖ®è.˜ÝûMKãE˜NDˆ]^„Øî7í¾ÆKÇ1f…GÀ‡ô(Gš6Ê Úǽ';±<ƒÜ z”X`7>.|ëhÑ„9ûY Îi˜§SûSñ¹uçI.äW~ÜÄ“ÈÞr ±ÑaßJžÀ(M27¸7Ú™—‰Àw"5=+Í€nº}Y5©Êè qnMâ4ìªãÎßöE] ¨Ò/Ȭv¬‰Þ `Î9|ÀÒ0IÍçÅûEñãE…wV6øÉu !)>Ü£B“e²ÇÝ]Fg 8ĸ ;lÀ)´B×YT[Ázö^KÂÇÆ†ðI`ˆ·y»d“A€D2Õt%æà$ªŽÝ<©jÖNt-ÿrœ{ßµ[žï憄4~X»¾ìª^¬çÆ$h”p Yé>±½‰ûfì¾p¦¹¼¬¥×žÃDÁF79xb˜»³l6Ÿ~›‹¿¨ÍÝ-S2 YEù—³ÉÄøì'€ÙžQùÜöŒÊ‚‡ŠQ›à< 6‚ÖòØÞó2Dù Pžràà@¸ztwìUÁÚãy®Á8v%VH'šª°¬Ûž=§øjbxIµö] ÕYðnI¸uà»C¿³­ŽÆ™}õ»`9@p:•D8yQ ª®Þ^€Rl™´nåRˆ ‘·R4[Ç/CûÄÛ?rÿ#¾f<à\ÌxúF‚ºVYh$¦Çô²Wl¹BÔºÉX-ˆŠÁ_Áe ”­éE@ÅûžßÓÁÈüDF{oyhVèßõÛ£Û‡®Ømª’Â?,ëÓoºTöy\*ù¢.õø.:TÛΚ< ^»`c†]-†â²G%abçpn’,ð¿cŒ„6¹ü¢º¥ƒÌ iWàiiª>H©¬Ikø~(¶»š’k„}Z¼x‰9ž{懼äQÒ£(Ëoy” G‡*÷]'‘MÛZÅ>ÆÀƒ" §~çOü¾‚`ÁNiÞr†­‘¢M Ò§G_Y“?·ýÀÄfQ&Ñ+ÊÎ÷8¥í=/Uëy;..jˆºë?¸U?ˆ ¹§âë:ÑØÐgÎ*'i˜¥ùuO»¾^™‹ÉDd"¡rõšÚÄ_±«®0˜c ! …·RMôÀs·-±ƒ&…y'¶tœsÊA´§yȉª‘q£˜/^mBM•›O+^üïë{Î 6šüˆú´J‰]Åzݹ¾çô[OÊg“eÞb ’˧(€ý ]0U*„ÔÙ :ÞZI‚§)wãqE‘¼v‡á)σï܆÷!§Õ ãFøË˱õíx¥Giì$fMó# RIðt3mãQ ý®(}—$Myܸ?À ¶ØÆªbå…<ÙËž÷ücõDgê¤z¢3Æ>h[*HØÇQ.ñ鯤€ƒ'¬ Ç&Êùp²«+úŠ®ŸéyD6TAO•bÖê%FWHÙ¥Øíºv×UÁ©þÚ_Oæqò¸ÏÝÆ]ɨw\4$ÑℯN‹®FÒ-œà>ìꪬ_Xå² xJú»ëÚëIÁsj”¯Á)‹Ä‹\­±ž6@ ´Bú/ÝóŒK>°Ž£„òÁ¼‚×úJ_ Z•guRPrVø•bº²ìeRŒWæ„àÎBˆ à㾪žK¬å‚ƒCnu,^4,&Vc™ÛAÛ½ÔG&ZZõ®ô‰ÀÍðâ^ÊWe…[–DÕØlÑør“ÌÅÆ`#ðÕ²êyo+U2“Ó­ü¡3ØÜKZ̰#æ¼´á‘Áï LjÜ7¹X.<ñÀ“ö\5³Ñ1Ë,JÏèüÈ Æñ^¢ÞùeD{Õµó^ò®VÎÇ‚ÆÖAnTö+oê±g›†ä¼ÎdGâyòg– ÿW0£`Ñ튡NŸ$¹ÒÄ“[_Dø˜ O¬}”õ‰Ýžà™àÏ,¥»&o@£¾À}…ΔfÄÒtZ)®…B£ß—¥£„Ëv•ôzM¤R…ƒ_€aþþúÚOêݶõRцú Ö÷¬Š¨s Y¿'Ö}Ýîv‡Ëe/“û/Ç”îÉ×Vù"—å’òà{:L¶züN&ßä4òò99™Ã'©š¸iöµèš`¦’@y_Tu,Ò ëzvÁ+Îê<~½OÄ¥Ðs‚cö¯€T²ó.ù%뎜ֳŸëÒÎÃ4¾úE)ZèÒ•©Ð‚^!gʳEç÷“wšáÇÐ0Kôˆr`žfç‘¿yi#ùz c)}ÙÀÅ ¤¼qàêš¾ýÆÌÏð0p=i²û$j^àÿSŽCÁ&@,x_»õÍį—8…ŸÞ(c_Íçò€¨5QcÐ}*Ϙ>ð ž¡ƒ_ï«§rè¾å.ÙS>æËé¤âqÃZœ¥ðчtṟle¤le`sH-³ •ÖÿG hüZQ‹‚gVCø—3M‹ŠTF·9+ñ’ðæ4­àqrËCRu–ccÜÑñÀÿëC- endstream endobj 1155 0 obj 2974 endobj 1153 0 obj << /Type /Page /Contents 1154 0 R /Resources 1152 0 R /MediaBox [0 0 595.273 841.887] /Parent 1083 0 R /Annots [ 1156 0 R 1157 0 R ] >> endobj 1156 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [390.103 685.335 399.069 696.551] /Subtype /Link /A << /S /GoTo /D (Hfootnote.15) >> >> endobj 1157 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [267.387 348.35 295.266 359.259] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.10.3) >> >> endobj 1151 0 obj << /D [1153 0 R /XYZ 72 786.278 null] >> endobj 1146 0 obj << /D [1153 0 R /XYZ 72 732.484 null] >> endobj 1148 0 obj << /D [1153 0 R /XYZ 72 667.406 null] >> endobj 1149 0 obj << /D [1153 0 R /XYZ 72 620.119 null] >> endobj 1150 0 obj << /D [1153 0 R /XYZ 72 568.59 null] >> endobj 249 0 obj << /D [1153 0 R /XYZ 72 459.296 null] >> endobj 1147 0 obj << /D [1153 0 R /XYZ 88.587 92.018 null] >> endobj 1152 0 obj << /Font << /F15 393 0 R /F39 496 0 R /F28 523 0 R /F27 394 0 R /F26 391 0 R /F33 497 0 R /F29 547 0 R /F40 548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1166 0 obj << /Length 1167 0 R /Filter /FlateDecode >> stream xÚ½ZKÜÆÎY9ç¾7s Í~ña %öÂJûà  Œ^NÏ!9æC+å×§ª«š¹Zlc!±ŸÕÝÕõøªzÄMâ&“7YžÆ2ËoÊÓ+qCïnBéÐF#µQ±ÑX{aà.ŒÜ)ç©Áñ½õù07"‰‹¤¸¹?ø±÷ûÿDo‡ÛJdÔÛ±ÞSùáv'³ÈaEEM;8ß.¢áhyô£k\g‡ªy¤úÉ ]UÒ„ª9´Ý :Û˜æhÔÓ-µ·2>RÃÞõeWáryäxqKÕ‡½Çÿxƒ}çk=Uû걩~L„.ms+‹h¸ýïýßáL;‡/üÙ쩜„»V*jôªU¨4%-Ö}¤1%îõh;[®£¦£íy~KSf>A¥³=Œô§€!–—I’ðàsì·(Ò¸PébŸoþ€Q0äó;™]Ü”,â,IùºîÅOß~÷Ó›»ÒÀÅ•‹Üð@`±D·êi gÛ÷´AgX/•±)Ô¼ÔÛ¦¾©~LLÿÄÆšig@‚f¼Þ ™Æ)È8õ¢†Ë^Q œð©ªkÚvã*àH:¸Óy˜6ï¿í™n ¡*³å䧈““Mà‡®½ðh”i¤ª'9vÔŒó}ó…Ç·;%Ñý±â¹á;öî0Ö4Þï¾ý™DÙ3Çœ©ÝžÏuUzz~¶ˆžŽ .0ôH÷L” Hc-Ñ^•´LXáz¬ˆho ûÌ}íõæÉ‹ò{a×½†A•·êin_·Øóf·¨?O uÚ²t½ï!9ǶÒuƒ­xÀÁÙaì\ïÉ‚æ·ýP¤®ÎÕÖ ¬„É,ÔWéaûhÃ~÷1s$]¸6炌b«ÛFD?ÜiÔUì¸rÍ'ÌUtWá®9‡Ä°Šš,uƒ’*á´{4LX¼ð*þýˆ¾ËžØÙWÃÔëO`ÏxŒ_Ûˆ·XòÆÏo©a:.6[µ§jË[™ÖB‹Ïâ²–•ËXëô%1q*Bµ)|_í‰1,„Ž“­-ÞÑ¡­k2>“ÜIû§¿úê~†(&ÖÍ3°õY4ó<Â$$ä‘Íâ¨ÙT ‘Ùpç8~gëúÁ–ïð¶QqiÀ4ò®m†·_W‡;†¢Ûeð‘ŒÁ`eÛü¦s7‡W;­bpºà8….ÇBªn˜¯²Ðò˜çõÏ -‰uª€%q Sjã`w7—Ç…Ô“ë¿t× À9#fˆ0ŸSéX© /&éÆ>w*VPÞ¥1èÑÆ9Ã9€N†æ Pˆüeè©…‰žðrz*Û†¾^;@ÞØÖRãÝ66’•÷- þ| $•ªz[­Øôq X>–*€ºû-¥Ö¤ÅD“à€_“¿û¶q´9÷Á•#Yì¸Ø«W‚„pJŠ€Ë\yFwîWfH¥q’ê—Ð?Pm¼ÐMÖ“ó¹\ µÇŽ/GÅÕ/Q¿'“”gø{⎪§/¸^@cÉV-ÅËòÑNÄï¹èËd¸ñ™âk4’€Æa˜†·¤ÑÓ4÷apM_‘ÑL½—¹pðä)¥1œÜó ] h¢‚yŒíá´!-àÒŠ$Ÿ¤åÚðÉ  ®äË4¿ÎeÊßô2߀ôš$"Ö´A%t~Øj».ÄsXÅKëÜÞÿP茤I)ü3[£äÒipÓ28¥f+¼µÈ§è YÁ.tML‹8ÉŠOÐÛ—%AÛÿ‚ÄfãæÇþÏÁ\Ç‘Åa ó) ô˜7OHçñô¨Ð¹2ì5§"ÜÀJž€-4K%÷à8É£oÿõÍ7hR’‚” µ³{²IFüÃVGŒï*o)¡à+Ð8é:Âú{ê Ô—wFmÔ‡ôÊÖ£‹=ÍÊ—oÿ5rœoÀa¿a• ØÀ  3y}•;UÀd¿SX‘ê‚~ù Z|à”‘tå´SoÍç>1‡:HËß L›å°my`«1 >@DŽ&÷ÎmÆT¬£ê$ _KF¸ý@U`ç€_޵%¤B1kôõ¹¼pé…Öà²Ç„µí5¹¦T>´<¡VÆ xŽÐʆ~¥±-ѼWe¦sb”¹‘ãàp†. ó!ü}ÞŽe)ùëØ1õ›Ú±okõ3æcžOøk†/u ÇŽùŸ§¨å4ï:%Mèx.0þÑ WñÀ™›z`Œ¹w¶ Yb.²0Õ"‰3SÌ€$MRL!­)¡¢ÇÊÈ…¸W°0üÚŸ¶L§Œ³É'hEÎÀ&×|Ñ [ÈD®¬L°I2G³K—UÙ ‡[ŽDôÂбšùÅkP’77Ð0ŸÂ I¿™ ÷…ý=}Ñt{ d,ŵ!e³X0÷µYWy1KØl» òŽ$ È‚sx“"Ù¾IQþ„<¶¸ñI¡'ß¶ü%l6øÃf¡§Ü¡xÍǧcK/HMt„‚Cs8Ë•=ž5"ŸéÔÙ©þ‚BlÙ°ª\CŸÔl椩/ôÐ$O+f—¹O§sîP­œãœØhê‹û»À|×ôy#™ªX@ñ«Iý;Ii#gÃ9 h'DbØëñ;tN Xß §ºp4ÏÑàŒÏ•à´Ë§åFÐË€CC‹5ËÔ-UËöäõ8xo$le9 $¿ Ë¡²`BlçBrBïb©Ï™\‰)ÕyOÉ%|)Ø…¡›Æ<(Päl¡4 %M!hô¾¯‚îgµL¼:U]{ ”xþ¡D>t_l1!Ëb=éú›¾D¼ÕmðA›8ù'r÷˜†¹XðäK÷š?˳SoóAÝPiýX¿‚Ž#¾)¬Ï‹u$”-žö'W >eŒŽžæ?R„–ϰšY¾h[³¸½Ñ³<šïs·q8&d“PHZb¡(¢ïîžÞ¥r40>ÔSCáùA“„6hòvòPêÜ5|žsÛ˜uR(K=CTª§ Âg ×ɦ|у? ›É|¥ÑÇÊÕ{.7m³ëpŽ¶Û“áÜ{:o+¸ =VïÃmi‘ùdö3§;okýÕa •†X4aZÈþ]³‘Çèƒ1zª€Ëk¿­ ˆ³žÌãT¥—ÉXð‘üS¶‘ÉJçÔÕ¶4—O'/‹$Œ®ø©• ƒ­½º[ÙÜyõ ü3!œ4Å÷ƒ†ÞÕ”Rp^oy°âÅ›!Vgà ç7`¤ÍRðmÝvUïáy1ýÀeð?ðÝqϬõñ¿fË'”ö ,žëpôþ Ô鑞JŽ·2VõàMY¡–6d À¶r ˆßìÛ÷=Ëx¸ºÍ4Gþk<7a–L Ìx I)8ù$Êäõ2#?´þ©›šˆendstream endobj 1167 0 obj 3218 endobj 1165 0 obj << /Type /Page /Contents 1166 0 R /Resources 1164 0 R /MediaBox [0 0 595.273 841.887] /Parent 1083 0 R >> endobj 1163 0 obj << /D [1165 0 R /XYZ 72 786.278 null] >> endobj 253 0 obj << /D [1165 0 R /XYZ 72 626.755 null] >> endobj 1158 0 obj << /D [1165 0 R /XYZ 72 506.485 null] >> endobj 1159 0 obj << /D [1165 0 R /XYZ 72 470.42 null] >> endobj 1160 0 obj << /D [1165 0 R /XYZ 72 395.829 null] >> endobj 1161 0 obj << /D [1165 0 R /XYZ 72 330.545 null] >> endobj 1162 0 obj << /D [1165 0 R /XYZ 72 269.503 null] >> endobj 1164 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F26 391 0 R /F33 497 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1175 0 obj << /Length 1176 0 R /Filter /FlateDecode >> stream xÚÝZIÛȾåàò¹„ tsXU\}³“iŒdr˜F2@ÄÕT©Å˜"5$å¶ç×çmEQ"ÕmÏØ@èÀZ^moý^•ÔE?u‘é‹,OCååö™ºàßÛ _ú ´1eœ˜0‰±öáµ§¼6I˜§ Ò¿¼}öÍJ.TQqq»&ÚÛÕ?ƒ‡MU^ê<Ø\^›´ªž¿+Ûû¦úÙ­ÂËë$ÑÁ·ï.u¸î÷¯÷ݰqVòÀ5e{y “¬ªæþ Ú²,X¹×‘Š·b’;\CÆÂ@n\· 6²ôлzÍåVf¶»]]-Íaù³ï]G æ¸óÝþNu­ðøÎÖ8ÈÒH<š‰ƒ­íÞb¦5&°4ð›MØ“g¡ÒJxtÓ6Ã;WVkàѱ2ÍÃL§BÒ.`yX(u´™[ Üi;[r„Ç!rá… ÄzNïë¡ÀÈ ÕÀßµ&Ð-Q~jÔ¶»gîÙ‡kL ¹Û“Ëv»_>=÷н¯q¦¼ð¹zžóÑÒ@j§î HѬ¹„  ¿¼9(Ì@‰ÆÀÜkª”#p~zYÖmÏG-¼ÛXŒ< ˆí]Az¼œŠfŸˆÀ«±à®Vb ¶ï÷[?lL–!Ô®À1r•ƒ (ùà1ù) á‹èøioÙƒ(ÉP¤œÓð©Š?úë/ªþ< ÀoIÌèó¶ç¶‡“;MíY…Uõ[×9ÂÀFïÈ  k¸gqª Ð$ÚTÿÙ“*h9D \'‰éXT^«Ã4ë»^ÒÚh‘©C‘°:|kUI›å¦1C1d@mí:ËÇ*èþË¢VLØxŽÍCµ"ëâUÈG¥Ÿ&IÃ,òNú7 ^ÜKûMÄ‹øcö;[:¹ëK“PåÙÑy÷>!¬IA_aÜVÂñXÅ£ ÀF‚Ð6A¬ØˆzM왹ŠóðÆ÷‚Ír~5™Œ dË×”“õIÔ`}ägÐ7BÿÙ‘£½¨¡Ð ~Û :=ÆÒ*x%QÓ'c–‘3Ð*é©ú3™õ’uüÀyrF΂¤UPîÁ³NÌš%yþºR©‡†fn†±Ý•ð1ùoÐÁª4ÞÍM–¶•²ºôÖÂ\œÁ+ã”þü³»è£hô0¾ÿp:ÝÔK>X•dþ¯ u—5[&‘0öEPk%ºy̾8è¶05¦ø^~uöþ?`aú#,ìèÍqb<#¢œævi<ë™òRµÌ¯ÒóÔ‰´V¡QéS0/3§ëhÔýÏþ #Hr»endstream endobj 1176 0 obj 2796 endobj 1174 0 obj << /Type /Page /Contents 1175 0 R /Resources 1173 0 R /MediaBox [0 0 595.273 841.887] /Parent 1177 0 R >> endobj 1172 0 obj << /D [1174 0 R /XYZ 72 786.278 null] >> endobj 1168 0 obj << /D [1174 0 R /XYZ 72 441.543 null] >> endobj 1169 0 obj << /D [1174 0 R /XYZ 72 391.929 null] >> endobj 1170 0 obj << /D [1174 0 R /XYZ 72 315.217 null] >> endobj 1171 0 obj << /D [1174 0 R /XYZ 72 279.152 null] >> endobj 1173 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1181 0 obj << /Length 1182 0 R /Filter /FlateDecode >> stream xÚÕYKܸ¾;@òæ¶jÀ­•¨÷Þœ`g³I»ÀC6Äڔäñø×§^”(uíL“Å"YdU}UE…wü…w™ºËòÔWY~Wß„wü÷þζþ 4挓ÈObì}…qo9÷Qâçiò5þ0õ£4âuÿúðæûû(º ¿Š»‡ñ<Ôÿñþ²ûïÃ?Þüø0OKü8I¾. ²ÅÎâ*»±ø>ÂÕ¿¿g0 eäøa·cå=œôn©Ü;ôÝ~Fî5þfÞ‡IcÓwBð·ðÚ¾¬uÍ“Lywÿ Sêr,™t*nt½0=îöð_kYð¨;mÊQ×>J4̨õAwͨÛg<ÊÝ^¤ß‡¨‹‚Î@ÌI앸\yÚ˜Þp³ê»ºÉ¡‹ûfž®ÊiÀó&‰×Œ<Ò_"ÈR,)Ð˶••v0óTš²µ®þÀc#Ýèö º=èUýÔÖ«™nÊÖÐõ[:Q°:‹n`1^ùVÚ àphÙ{xG­Œàeào]žË#j;ýÍUQàŠFšO¨ø¹×tÃôçªÑÖpúð ‚ŸyÜ衟L¥ß=EB‡ø¯;ŠP!0ù™;UI§ˆ¹.¿\Z¼uÖO¤¼á$WmkØÝòŒ¶?ÚÃòÂ<²ÅÉ^–s5«éOå¹éÐÞ6Î<€ênŸ†¾Š_ƒ‡Çßâá‘õð0 Šå¦ mM5 Äô¶ÜPû »lÇN¥ÖIaÌN–9¹SòÏ…×1çfXÓH4ýc‹¶„³È[8ôg šìŽ/ººnM ‘È@™®ÆÙ À\Z²æ’ìOh½Òi1‰FÌt¶Çj2f6x$Ð"½y"¡nŒ®ÆÞ<ïòØ{Ùz¢ØcõÌ'ù¦ß¾mvt´©$SÛ>3›‹ðÀà˜¸#Å ò\‚œÃ*³”™ÌQ œ5óúòX°—u¢?)^…NÒoÐIšÞ;vij>£ARÂUO7mQ‰r…1@¯ ’¡£#g‰GFF‹—ÈI0€Ä 4Ì‚ed9Q­‘8Ê(ˆâÈD_òßYÛ€ÝVíhÒF¤­£ h!Ã(0¾•æ~¤´pâ‡ÙvT‘w¿+ÀÙ»]’g±÷ûô8èq`ÙÜl ¦Á¡ëß':f¸Ái`ʉàäãŽ.ŽC2Bü…Õ§ 7#ÈÆ¡2Íed›æÀé"Fl8ˆƒ\o”flÌ<&ðˆ3™9žÊ‘‡î27»öu*ÑFr¿,ðަG±ž¸×–æˆ(š$©÷cYáȉGœìzO§Æ$lÍB @xšùŸ:¦“Gf’¤`c{È$GÖFZpö(‡å}íc3+¼i˜JF’´ðtÉ©×:éVÈõÐRÿ²¤Ð¸”FZ”²e… P6BB”p!»( âU¶äÅŠX(>ܵçß%òA§æëîæ vä ¡•(vÇYÂ6'eøMAÜæ3µDÞ¤ ( ?¸lSM [ì¯ùĉõi0Û+BÙ4pb=t¦ŠÄN0¢K —«ô¶Ð·^…w’¦Û|d\ ü}'9ü*W”Än8s¦ ¾ÏëJÌ>lP^\,·lÚòÑF¢Uv.¡Z³Ý±ÿ.ɬQV,èuZ×’  §dÈ “Í㇈1Iˆ“Æ(¶>@†d´àWs,»æ³MkóXÒT`ú?€ÈqLòÏ÷|YrØÈ ù†l²ß9’«šR.úÊ? €çhʳ½B®¾æ˜{2Z_ÏÝîãqKÓèá‡Cp˜+?O²Wƒïûnü¹;ô·Õä8æOmÿˆ÷‡…£ŠXÁts¶a8̽¶yoC‡ 6Ìd!´&h™HìÊ³Þ ë®â^“R4°íkæ•hsHSщ±Q÷6¬4‚JR­Ïà |˜Z©šÃ^ÇcÃ\ V²]3s8Ÿ cLžy—àƒ |ÜQ- (ʘ¨¼§†œ?w…"d•µÛrœ§#*Ü(¡×wD¶ïÜZþ¹t Ó¹)ñ°Ø‡¨3ç˜ýp hÄÁ$ð€ƒÌ9MÓÍÙ-à(r™”.ãu½þâó7Ó|Ä ýkN"f–)oƉgIˆ.¥Xfï  Dó|a‹‚® šö\Îò Í@ 2~Yû(.Št-Q6úŒ« 4´Xˆ[$ðµe9NÒUíTkÉ>L¥drcci 1¸/Ió™Íh§%á÷é$9‹0ý,tá$3çæx²‘|ë „1롨¯¥^ÊÛ/IßVz6NÊqÈé`ÆÑvè¿lÄQñ ¬øop%ÃÉøqxÙ’9(ßcÙÏù»“˜B/ß^.’$|Çü˜Š¿’ä¯âELyŽ>6ìqœ ìǹë ÄCªe–Gþ’ÀJÂt „7Œb ‘¼±•@ck%@ËlÁ4¹C¶µŠ/Ø&÷¥Ex4u=OàJ­72•8ò3• [/­OÍ eß>Îý P«Íðù8ÁT™,8Nˆ{/$®C†0:(ŒÜOhâò`œbW¤‰¾ýˆ¨@kEk\ʼn„«ØºJ_`\ŽÁ‡Ä 6—²‡Ì±ˆÒÕ‰^®GâÀ‡†¼¯»a1Ñ‚waÁ»°à]ÈëÇûÆs´ Y„L;)Q‘´ >ó¿ð2^ŠmxÁÏ^Ðøö¢2’yeøzè‹nÇø?îíwcÜšc]&߯HEØ•H$3{ù`<¿È=Êbó `šNô^Æïxl£©‚ñv-˜«Ù+$.yæeÃ×EØ whl®Ÿ—o䈹k”Ø]?ÙÓë´¼R/¸².¥Ö„­ˆ#-–wì%cަ«õ§[ï)¿ëUvlJ»uVÈȉìüT ÓYÛ<´2åÊ“-8ˆ"Ÿ}˜¯‘Åùw^/œ³a–= 2ãéK•¢þp|áSZ–ï}õ[šà‚dÑ©¿6•ûco7R‘ò•úB}÷?{ Aeendstream endobj 1182 0 obj 2893 endobj 1180 0 obj << /Type /Page /Contents 1181 0 R /Resources 1179 0 R /MediaBox [0 0 595.273 841.887] /Parent 1177 0 R >> endobj 1178 0 obj << /D [1180 0 R /XYZ 72 786.278 null] >> endobj 257 0 obj << /D [1180 0 R /XYZ 72 604.41 null] >> endobj 261 0 obj << /D [1180 0 R /XYZ 72 501.313 null] >> endobj 1179 0 obj << /Font << /F33 497 0 R /F27 394 0 R /F15 393 0 R /F37 380 0 R /F26 391 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1186 0 obj << /Length 1187 0 R /Filter /FlateDecode >> stream xÚZ[oÛ8~ïþ ¿ÕÔ‘ÔõaÒ6²Óm‹Ô³À`vPÈ’œhkK]šfпçFݬ´ÝE€˜")òð\¾s¡ÔÊ…?µ õ*ŒG‡Ñ*=>S+þû´²­_ gz¾q|Ÿ¾3qcgnŒïDó_nŸý|­ƒ•rØWÛ=ÍÝf¿¯}G…޾Ø(å«õõE¬»2m‹ªl.6&2ë}UsãC·kò¶-Ê»‹?¶ÿøùZù“Õ6Úuüا5·÷yÃ[Z¯n¨u{¡£õÃ…×wP;ÁÞÇF¦TüNµk“¢Ä¶ h¨áÍóŒgì«òBǰ& îëêÈ­¤äßüKÑ¥ôôoWy‡Ü¹Øxž‹´ñ]“×<žòk&ú®‚Šû3¡´}š6?áÙñ´ YÓiwtXÝÈhéõÃ}‘âÀ=ÔùŸ]Qç}J2 ï<ùþ:ËÓúñÔu^ÕwIYüEGð °¡ÌøÍ¼´sy Ús‹ÇÂ}Ö`7– h‘sòñÐZ†Èn çÃ`}_ÜÝsëÆåß‹žà“ϲƒ^âL&žÁóCÑÞW]Ë“îIÜŸY00ɾô©¬æÙ¸$†¶÷2Ï_'»‹ tÉ:–vËAS ˆÖ=ÐÞÈ[ƒºžŸq¤/ƳÊDü&UÖáH•ÃÐ â@¬£U‡b· ïFƒÉ™tª‰üÏE†òŘ@c&ÁÏ®¶ƒúzµ‰ŒÅêi‹~ÚÊ•rT¤ غÃëNïPr_û럶ê#›ðuU¶(tî/Ê–Ø}óú?ŒÞ;&Í'âÓJ‰ëPM8Û•MqW¢]NÛ’»æÅ¬óP”ùC‘µ÷/D4]èP¡ì±uL¾ìUú©)þÊÿ—÷~Úu{|‡4[¸\M/vB?D:&ŽVu¾Ú?£q" È××+9J›¥qXÁsCQE!O@Øu¼À¬ð…€%LR2fAJ× 9±öd¥eÏ1[ÔÀ‡÷úyýY碢…*X tcíMà(å-œÔÖ Mð3TÔŸc†þ¼ÿ %âWÛÕä@´Çî¯OlÂ"C¯Àüʤc~¬êGlk:¼® E?ñxZ6 {t·¶ƒlÖÜÎ’6!ÀWð§‹ì{°»$â\`¬\P3ÞE©1ì¹1ã²Q.ã ÓÂJ óóåèe“ìŠL<ò ¢÷d¶8%%Î÷«óÜN²‹ËIÀ)ãM(g„‘SR'ÇÙ{lžŠÁ×GVçÈÜoc矰uM— þƒ£)ú.b€‘Œè— û+7vbÿ²j™4r¢¸{3nSX‚+*ÁOLÔ@ÊŽ„›Ï)ÝÛ·{ ®N<³NP¸Îù¥} ÍŸðÁqá:t\?´îV&Í:)¬ñF.G,ø[׉UŒˆÝ:þ¦$')È´á¾1Sàñ>‘~^RÎ `݉ÇmœBséÜÐ@…C÷ù DE3&¦Ÿ|Äv×´dhql&\H«ã©.0pÈƒà ¨=<òƒönÌOâZ¢š@³<°Áa L/Ê,ÿ‚M6Z7á5xfY•›¿rð¼<ÆÌ­gË0£’ºik™`°Î7 Þt‰ª8¢Ä¯„ÑÕuÞ‡VÈà2­È°³þ5äÀè󚣥Œ»0ž­Œ#Z·j ²Ô¶hÜϼ+x%ž˜”vÁ¦MÊ”c;ÀŸýS å™¨‡FjCã^ RÌJyNÔ+Öà2Ê/Œ×/yå5’¦}ÁÕ‘bÏdõô Á$>äƒ ,™„ }@S8Á‰ö¡S¢•E† ‡_p1‡¬¸h"05ìíæ}(V!ä›Ê 9M«zx‡ÉcˆÃI󶇛,ß'ñK\~Émù¦ª¿r S ³Å±HE?\ÎÍ!wî–¢j9‘eIö¹8-úå(Ïd“çGØIöØ–U_Ökݓ˃äAê"®’vncûÝíóÞHfVioä}ω Ċײ7 U|æ®ßݾºúx{uõöÕ»×W k+:ž¯{;e@õ]Hû§•˜IZ`Ö‡<É(œ÷$1ðD1X"‹7‘9S-èb†¥-=°ÈØÚ? KBʼnƒõ+6ás“(;ETAÈ`gˆ»sÑ5§h–æNKÁ9Ôœ¼AC^•Y8ÊþK‚}rFOKS…X”ùž0µöaËSÂôãô™0?üróþÛ²TN¨ƒ‘«joöËfá÷1ÁQJ† ÜÃç™h‰ˆ×S(~ú@®{´ÀIn{¿ýøòæíåíoOj§y/¢bü캿Q@ !¥³Ðu,¾¡Kâ8¿¼µ+Ê„Ê3^ e˜uõîšM~wÄÜ! L:ZÌ%kox ‹ž*Ð(çIŠZçRá =Y>Ô}5«Øâã`‚-@qä— ›¼ÓÓ í£Ø ™¤›\‡èìÏ~Ózž|¨ôëâ…šì‰ Þu~z"KÅ5¾ŠðDèXÊ*2)@:9ÛYO. àq(òƒvžDŠê‹‹à§¯wnïí¾çr±IÕ„ˆk‘°4Òœjf‰ïBMsó% ÁzÈ=ãA&:Î^ væ=Çhoì (Wv-ÍŠGá@ãM¢`TS2Óš‡˜¶®$5™øF¡åPÂj8•ÚøNš³TjcÜoWò ˆ"êõUõ…ÃC.i5FÊ{ˆ\W¢JøB±ý#ÏaßC¸º´òò6)p¾Áˆ%ÙpÕĦhnÃsq[9¶ò|'ð¦ùÀ‡¢Ló¯ãh%CKt\fÕÀ~°”S ™R–÷µŸŒ}uÓòCÄ/ô©÷²Ûh @`T")dÐÎBÁtWð‹¼¤˜e¾`§ÉžKÜž¥Ýsûú†[1èïKâö05 È£KÄ6çW0iJ=[µôF²-5ag”w2^-ù˜íö*ø)í¬Í7áX{`É„z­ÝЏ¿ÑµúÁ´ÀÀxcïì ŸS\s3·êÊ cvHº4•¼ÝoÝóµ»²0XXŸýQ 4X+W{ ôcšðå' FŠªø6]†wèzé\Úh$‚ÙPÈAxè¡d\œÝâeðôfëÑûYúTóEEÖ¥mlšúªÌÆsýoCIਠ쳪á®m9Â\JÕañâ(×u›ôÕ<ìÇÜÊõzÿã¹f 8f×`hØjÑ%fCZ‹cÄñ¾eÝ{àhëßüÏj‡d>b'VpûÈl81„`µyc@ðoX(®© [ÛþcqHäÄ×ð׸®üfE“vMoÇö{@²dÏ:OÍÎ8Õ¯#RÙ’©±ÿQÞ:ÿ“/d”–#©„g ðŽo“Œu¯Ðë9\mµßhHÕ'•ÿ’q3iíû97&¦¼‘…á‰T`©³¶DÅyw,…¥Ð†¹ö×ô¨…Ôâ\A\oo@L`e<^[{Hº¶‚ø¦H%- ‹+h1HùVdlY-òIö(01°y|~nnrß¼„£à…û+­A–(…¡ÔhbªH™ÈjB!eõéõ‘-ÄS íåu…y6i}ꂯåzWƒ‘ÛwùJ ] ØPö‹€¿?ÏæKöµBñ;&ÖÓo1ä• Þ·(eÅæ^ t´vÈÞÜâ`ö&ÃÿŽ¿´¿5ÜÔb·¿“Æ!YaÎZÕÃR_.@ìZ¬õº?ª®3.K‰ý±yX†ÑÃèv 2Ï)‡'#*¤UŠé^{j™Rñ¯õ)äÌØö#”•È2ó¤„Ì7¦2 5£þ-dƒÐZØ;@:ϬÎ6Èvô”kb´Æ’ª†4'¯ë éÑÀ³ßLÓ®ægT=œÃÇ–åÍÒG;Ê ßµ¾éí¯oÞ,¥n«q¾Œû°^ yhÉ œ¤çøq4dÇ@wY-‰9‚pÛŸm@O-_;áo"'KN ©S]$È]Ü|vÑ‚*à„³‹xdñm¥æ±à ¢çѶì>uS’ñãï}`"ȇ°6@È¡J2¼X8_>n˜áZì„FÍÖç{ .X.|Ê Õ—G¶êêööãÍÛ]¾¹yýñúÝÛíâ1°€ì÷ȶxÿTV›®þþòöòŸWÛ«Û'j!*ŽGñ]-Ù–/×Wø[€\RºO™úXìÇL‚{;$û®æÜÁwñrþ®;¥ZQ~)¥fœRùîôÏGµVŽ!3ùæ·>¡?ßB㧤þOìð_EÅ=endstream endobj 1187 0 obj 3843 endobj 1185 0 obj << /Type /Page /Contents 1186 0 R /Resources 1184 0 R /MediaBox [0 0 595.273 841.887] /Parent 1177 0 R >> endobj 1183 0 obj << /D [1185 0 R /XYZ 72 786.278 null] >> endobj 265 0 obj << /D [1185 0 R /XYZ 72 761.372 null] >> endobj 1184 0 obj << /Font << /F26 391 0 R /F15 393 0 R /F27 394 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1191 0 obj << /Length 1192 0 R /Filter /FlateDecode >> stream xÚÍZKsä¶ÎyÅT.¡\;0|•µä(Ù]»lÙ—8¥¢f0ÖÎ V”ò×Ó€hµNUªR: ‚F?¿nJ®bø“«L­²<*ËW›ã¹â¿O+?ú ¬ñÎÄhaœ½²qíw®µyjpÿoß|}-ÍJÆ¢ˆ‹ÕíŽöÞnÿµeý`ÅÅßnÿüõµÊft.r©Ü®[yõÃw—ïß÷îîÃÕÞ¾ WH!Mæ¶—õ6@Q)‘«lAñúæýÕÝwß_}¼ƒY€ª”‰ˆá üα¼PYô|±Nr•‡®áÑýÅZå‘åIg{¨¨ªy¡ßWvC½é«¦ë<Ï¢ëj'®Ö*MAN /‰r+診<ž/ò$zºH. ..òÓÇ¿¿zws}sõMèq,òøìZw -SºF†×À ]CË,ªv¼¯ß[lðå}Ùv}[Õ¸–D[ûK,“ºÂÛñÊ®iƒ€á¨%Q7ýÖîü& ­Ý¶M3¶|6¼ÀÏ+ÉO‰Pz)¿CCJÙ”½Ý‚¼“$‰nIZ눠\wÕÖ¶vËë}ÿ£BqSÉk»²/<´mÛ´d²+™’&èdC_¢à4ûòøx@‰‰š/î› üÄ‹t,íJˆaÅ Î4·Û´•ãiË;Jž¹_/³@“n¿¯:f*÷ëN0ªë`C^g NÒ ÷`bRQ!Læ÷ÍéŸÓ\'Ê€búqâé¾6FÈ\N,®·Uk7}Ó>³H¢¨2º ¶äýÀÆL¤s&UÄ•„hÃJ&ôÅZJ#£ë‹"†¶@˜X(Ö\“Uà ‰~$ÁôèçüÇpH,LÁq^L凉c]ùÉ«--ø6i‰Bémm»î-,eôFëÞ)Çÿì쿾ÙNÓÑx:&Iªßéä‰uzpdOÙÃk“äà(ìXñBc£Q£7W·S¸7"Û‡­™Hsõrvx9cHˆÝ¹âÌB™ba>>Sl èƒÊD_ÝÊ»omÿ~¤(ôKlb~TÕ=®›º¿ùæ-Of¯â°.öíÉþ¯¶2Ò_®•ëBÈ8wÉXºÈW­]íÞ¬!Håf• Û4þèÀãu.²Ô­C°€¸Ï§d‹$ÕÄDœ$£ ø à:`k T➣üNH€„4Ó¾ñš:Zg¨ÄL†ø¾4Œ×©€T¸¦¿ÐÉ0‚wI™½’òm?´lŸlËY=’“7`­`‹=ÛrÁ!÷ÎQÎ’P`çñ¾´6H6•›‘ÐSÕïy„ºŽ8Ebf¦6m<{ù¸žñ·ÿP0çä¾O…ñÖn]º2 «bž3îqÓs€+iD‘ûÃØ¢,¡SŸ-1ÙÉ8ºAôƒÀJÌ.‰”Ä+®”5ï ,B2†SÓÜÑûøÓû÷3Î)üwL’‹9Š ° ,6Ÿ°Ë°Q7¡$ •ç'0¸‚AßH£Çé$€ÃØ®ˆçWرr’$ƒ¤/"ŸÁ¢ŸÐþJJ²™C#°jëfxØsf=Ú#')ØÀé6t¸Ø^§4ŸžsèeF¤*ÿMHbi¢¦[}îHgY*@ó?¡AÒ5'Ð…˜n¨ ˆiÎ*RO¨p[Qr(áê¹ ‚V X™¥zn>þ|ùþæ›»ëï>ÞMb‰(2=¿Žô0†8ÝMš‘©¿¶›huzCSn­»G¥B$ÒB©¥H– ùÃ凫۫`ÍeÊÒ…aœPˆB&_kôèˆAVA5Ú0d°§Æ™õäH!‡‡x¯_ñwE£1ÆhH™·¤•N6ã@ ‡­OûŠM§¤ø†«ƒ”ð`ÚI_CÉR—X¤o*{ Gcª²à×UY0šUYi“ÈÈ€p*Ñ2ªzGcÏUŽÉ20DN…¹k­ýÃÖ? íN²<ÜÞU5~ÀìÈ1ìŽøLƒãžj•Œ}óÓ¼BñL¼=ÁºÃêߺþ¬†Ñ®šƒ³‚qSAàLÇêðË €FEÀ2Xbâ!€Þn=c\Va•¸iŸ¥+Á\®ö1Õ e„Ì2aFÀØo~ñ™‹t¬×¿^,q¬D»2I/Ë5÷rMfU2L>Õ\ÐÕTbšè¦w‚Qçr9Ïñ›²(¦¹ï˪öõçÐq’p"` xvK@ŽÿCØ="dÝ$÷ñvAgð£>ƒ Á†¤þ ‚F¤¡¿BK‘šìÿB›/…Ðùç!4…^Eê¹pæž:sWÔ‚‚´\ö¶ãéØ}À DTÔpv°å–lhrkŽ8ö‘Ï‘Ð\‚â~îL98Xº2¿nkryg¿'AÝMå®4°7yã¹óæ®~+F¢—› Ä"ÇQFÁ—Kw8@~‡£Cë|3xsÛŒÞŽó ²—E¾³BÀ¾©!f©".1éà܆TaDœúkü.hŒÉø%¬:Ç1uêfGT¾ @$ Tç²- ©%ÅÜpÚïËÞ0˜ø¼¦JøL|æ náiU"ÏËÃC_¡£?ÁGp¤ÌÆÉ?'CQ5BÃ×Ä¢˜¸g‘-‘nÔxyäà‘‹ ËK6Æ)é]#MÂy+NÀæð Mй_¯` 9JSÌ*g.ÇÙ  D²¤ø­9­{á½eÞoå„·`:7ºcÙûZ²‡V§åŽK= ¹ƒ$5g¦erô­T6X`tí:p!l¨n‹BIå{o9vÞ”ŽÞ5ÇGd,jºŠT”Áš¯ß»WlÜ×MbuÖµMq²­ºÍÐu–ž¹”ë: ›§|­9pƒ$ XC`;–ž^ì<MŸâ9f:­í¬.„]—×xÀ×. Ùcõ,L`›šÖs†4BY'úÖÎŽµ,–›íØ5t:#£ƒu“ªuBÀžRí­—‡êþ5˜ì·êk“³†+$7×pýÖÖ¶¥ž:$–ÖËöÓëÊ~w¢=,¹Ús pî•ÂÀ}šðsä©ï»á;xÓ/qx$Üþ|B ?ôí°qQÞk1MR?Þ½y´sMžµH]zîÍ×[»(žÑ¼­·£åh™GÝ3áyN@Í¡£0Up˜‚ÇxÛŠ"®œšÄ0„Š<”)žùNùèÎÀ.(íw¼eě̼SQS[ÎÁÔVŠp:¼qO ŽN|…ès[!ÃK¤ÄÙ#IÀãV<&Üc0’ƒ ó_¤NˆD¡!⯔ÈÑ!‘s¼’”ß×Óúåï)ÿ¤ÑOÝ0}2#Ú. Éî4DyÔš1ØRµnK*Æ`úXYð‚w0W\1`¢ã7Oƒ­´ñÄÖ}š*µCá•,Ð)„ÓAZP\hÉtÒŒº•ÍÐs?Sú² %;û…ɾi«:ÈD~”"ÅMÉš´Gwiÿæ–é‘;¨hêZ—™×pz®aüŠÐwöà>RT¡è¸•̽aºeX¬H râ5_ð*£Í¾H‚ÐÉö)OfKå‰ùÅÜ缪‚š{…‰:æ¤(¼Ó6ü‰¯È €yà/\ä>x`ˆ;NÅ ÏN¾›ŽÿÂAxi²]žŠ€±ïaà~Ì¿çZ!±£ÖâÄÐORãSŒÉ£ŽÈd¦p«p¹fܽ] ºì¹øŒLÐä#lpo‡ÛÀZI‘}à—²ŒV —N'3Jã9W* &çËŒmv­—Í tu/l,²gß{Çš~7(IŠY|ã590k×äÀ!ÒJÀÞÆ$ÁË¥_=2=þ#{"ÏSîç¦oß´ø8ôþüËq¶/ç_†§·Óå—óÀÕÆ–ÚŠaÆÁÑBy°áZgE€ÿ9™ÁÍa ª4 >ù)f´JUœ¸_ç÷û›©²›“1àÂEâ¶pܺ=ÔBÿOr¯^¶8•ç°ƒC`ˬ‰m5RôÐZ‡ÄJ·±¶½m˾œ½;ÆGß|ò ²ä=-î8ÐY×Sºõ½ª)E0î~¡!¤U"Š´øoBLá•~Pÿühñ¿6¨ëãLÉu{f2þ×)‹1~_©Ô¯ý ‘‚è ±™òù.H–žž PʼüOJÿ$TZbendstream endobj 1192 0 obj 3150 endobj 1190 0 obj << /Type /Page /Contents 1191 0 R /Resources 1189 0 R /MediaBox [0 0 595.273 841.887] /Parent 1177 0 R >> endobj 1188 0 obj << /D [1190 0 R /XYZ 72 786.278 null] >> endobj 269 0 obj << /D [1190 0 R /XYZ 72 678.527 null] >> endobj 273 0 obj << /D [1190 0 R /XYZ 72 349.17 null] >> endobj 277 0 obj << /D [1190 0 R /XYZ 72 285.814 null] >> endobj 1189 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F26 391 0 R /F33 497 0 R /F37 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1196 0 obj << /Length 1197 0 R /Filter /FlateDecode >> stream xÚíZKoÜȾûW r h¸ì›LNŠ×Êzƒ];ÝâÀ fz4ÌrH…ä¬,AþzêÑÍáK– 9: »»š]U]õÕƒ›þÄÆÊÍÒXÚl³;½þûyžþsL©ŠÆÑ „[­ÒX¥›­2q–$ÿýí«on¤Ýˆ$Γ|s{ ÒÛý_¢²î_o4Ñ®9=ìŽEû»×½ý·˧Dõùô¡t;×­QÝŠOoÞÿðáÓ‡woß¼eúß<Œ¨·BÄÚhÞchË?™,ì|óÝõOŸÞýxóž6|s#̈㭉-ˆ°•2Öš·çZwŤáTkP,K[y¥IbkmÐD÷z«‰ú£Ã RïÝçðÈ¿~ÍD®Þ5¯·2‹öe}S*úå5 Ý®oZ§Qs˜ìÑÄíiº²wL´ÃMÀ\±ë]¯‰"Gyý¯éG'"Îs;ÖoǺ]ù1¶m•PѱÁSq £SQãè‰G|_ø¬£¢u<Ùº¿ŸËÖíq$¢¾áÙ»sY…©£§œ‹ˆ§ÍDë´ÑíÑ/öDz¥—$‘«ÜÉ/6êy­ìø¥ÅŠ­á)6jJâÞ ”©fÖàDâß¶-‚p0Ä!2šãW¸ ¥âTæ^çS³^êÝj²j&¾âM‡¦&±ÏEÅÓ•«ïû#>{é`ý¾dÃñ,ß1¿+L¥"άù C0Ô –¤ÑÛ‚¯QK IÔT£ø:àAéècb´b¥TÔ=ðJîXß, ^hYv¼­©ßS5=O¡ßà \sÇO|%9ˆ˜©hÍà%(?ùjÝgÚÒ³±whë5™«’#…¾z{{ÁH@‘1RÈ4™}SŸÇY€3‘IÆãç¶zp{w` ëúö¼ëWìù47È9ôÒý|œ÷®ê‹Ï/“<­À±'œá1©ýE,Nië;8B§ @ûdQÖÏ0ÂÃ4ó ÆæŒ—9LŒL¥ ÖlFËXšølÉK¦Ñ«G-ê}xá¡iOE_6„ñ€‹G×à uHóP»0…–Lê“ÖÀ›Ó‰þfÞ‚˜F%ù<À^ë::;rŒ hAd 8‡ï úëŽw4í={WúŒNÀ7²4ˆË¶±¦ð eFJYy“ˆåØ‚Ö^¤!çPž*æˆw¤Bl»žÙ ð`£ JeelÄ8pᆪ"°¸ ®¸ž¢çÙw<Ѻá?<²6“¨èü˜ÏO¢»‚àX‰i4ºâ¹Ò¿°œoóˆ†3t(<íŠsÇ€' º;°dV«èº µ?”c/:çêUτ͉Å#‘C€s}Á“Œg°`TËt™AùÄ8xßî±bKÌ3Ö‘ÉØæáR{Q•wë“drœÁ¨Ë=Ôxî½cçÁ±´É}éÃܯ€L4›Þ 2ò+ѧPeZJ~¡ ¡`©.N¬mÀJ¾GA“èþ´E×ûeJdpíÌœKšál¿æÃFé–™©Ö——8ãÃ_"ÆŸ¯o~à2m×ÅŒøiœ«)†x§É¢¸xÐ,×"Ÿ5ožÀš Úïù°&ß30ó0êࡽ«*¦À4Â6à^1®æÎ½'KYKùšÄ<Ž~ ½©çÑ}•Vkþ-yÕµ5fMfq3F&¤ \á´Â, ›–—@ðP‘@ŠyƒIG˜wŸ‹ÓCõÃÖXïóö–N3+wJ0ÈŸÌŸ—žÉš¼T!K‘*ÊEÓ!K¡,Ðzȇ7 ÄŸû•¼ž¦2 õõ¾„HÕ•«9 A$…:<óè­)ÍBB^®Gmƒ£_Ê=s–]8«\¿ ‘/ƒÌAŽñšÝ’õBi¢’:Nm¾˜1‘üË[ …‰íeþúWè¦à)E×O ‚í~€§‡¶,ð Ø˜d´5¡‹vvR‚ ý\“@KîOì–è¨ÊE‹·§ ³Š•˜7È ^¼5i}ç+* íœÎSlÉ|5©¬ñî¶v©‡Y øbUqq8­Ül¦Á²<ñ©ÀÑ¢¬†hQ’¯ÂY£[ä‰hàÜ µ¬ž†e˜\r¼y'ÉпhX‘ŒJ$ieô·3æj`ŒÚÒ¬Á¼{œ»¯ÊçGRm^„MdÀøt_==ù°è;Þ(¿§ñŸF%fÑ>ñžPñJ“±§àd¨éê=÷“«§ØÒœÒӰ쩾͢÷5OøÂxa¢èŒÆ! á8¬ÙC6]ØÃÊ$`9ÂS‹=P{æ.P²B(×ë7+Œ…D:ÿ€™W¾¬4 ¤qbª)Ò@6˜`>˜`–.âV–ÎLázUG¹„ÂO~ZT4C·Œ- ¹›XšÊtHÚ3lõ4ç{ÿLÜDÐ6Îô´ˆGkø÷Î÷`vW9ž¾˜ÎZò%a'â­J§óXeîÐ6'ôÑ27xœ;ƒtk‡JëÀ_¯–Ç2O_ª„$_¸” Û>·³=ŽÁ=ÂeëtÖ­Ýdè"¤ÓP-¡þIQ(Ôc I€0"ºÞ¿wœÅ€}½!»„ð3Ø¥&ÏlRFßb2·”σÏOÛ(¢JLõwÁ ˆóÝ®-ï.Ùd{ÿÁ=2Íá\ÓŽŽç½Bà‰¤ÌŽÃDA¼ã.éí+Yb;ÎͰ¶úŒÔgOô2úXÙÓ‡cbZŠ9 ¹-rêžx®uP§Ô>%§ÒÉÈòµ`lÞ;n#*>hNày>£ô9®<4m UnáSPŸº²èd¨­óP[S vE. u¨í ŸÛÖqbÆ+“¼"æÊk:…ù¨®V32 uT0囦îß}ûL•„H-‚3WÃj\%ÜA$Þ;¾nÜúª‚kMºSŠoÎ󯢪)ö¬\2N/óÉA¤†›j™ò±‚(B=–T'ÛœÇé—²)d6-õmÎ5^ÑóÐrùlso n¹ Ùnàalæ6›zÆžç¨H±!éÄ=MUqç3âp­f–ak±êšÐ› Ö(£®99¾Äƒ ­Éq3øùªì¦l»’w@‡«E3Ñw!ô«XŠì¿×Ly·âÓ\ÿcƒèE~Õaã–×B6IjÛz®Cï.¼œ¿*ÁÁ±Ê³Më6‡W Fœ™MCD@ËR­,o³“š}e€ç´|ù •0j«8ì)ˆ¥ÔŠX7kynœËà1(Waö ЛæB7ˆ‰ý(e©S)Öø¾0mӢŠ˜AxE[€p"øjIŽY$ð¡ 2Xì’PÇÛñù£ÒH>»ààòÙKŸyr„óˆšVÂ/šZONßrúŽ h}àƒÀgP·ZQÔŠÓå•ÖFsn;wÅ=,jø~¿ MLç݇ MŒD5ÿú€ž `Ëu&}î˜tŒ0迟QªÞVú=_3ª°,0‘ÿݧVù2£È' ,¥œ5¦6&ÜàW…qƒD‡ êy×´Èvd$}€ KµÒ±ÑËŽ À—CEU½ÔÒ–. È@eΙœXý¿¢?]û4¢gqèÊkÆÏ±Ã“øOÑ)ý?:tÒøÒ¾ôŸtìb$_†1kçf%•Œ%5žž9áßh€_Iendstream endobj 1197 0 obj 2764 endobj 1195 0 obj << /Type /Page /Contents 1196 0 R /Resources 1194 0 R /MediaBox [0 0 595.273 841.887] /Parent 1177 0 R >> endobj 1193 0 obj << /D [1195 0 R /XYZ 72 786.278 null] >> endobj 281 0 obj << /D [1195 0 R /XYZ 72 313.424 null] >> endobj 1194 0 obj << /Font << /F27 394 0 R /F15 393 0 R /F26 391 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1201 0 obj << /Length 1202 0 R /Filter /FlateDecode >> stream xÚíZYoäÆÎó¾ä/è-T aØÙì—òz7Ql¯7k%/¶±àÎpV„9ä˜ÇÊò¯Oݼ†#i$H@€¦Ùguu_U·¸ˆàO\yaÒ$”&½Ø^ˆ þûé—¾‚:î©cÆ¿žè¸ñ=7*Ó$Æþ_ܾøÃk_ˆ(´‘½¸ÝSßÛÝ÷ÁöRšà.‡Ÿ4ø©½Ü¨T÷wyw—7ü±­ÇË ´ÖmÑåX§Ü ¬É¶wAQíëæuE]aEä¿m×rhâ^0-ÏšWÛšfÝÕG?Ã.ÿåòÇÛ¿üáµ4J•±a¢O/,+¸×l?2t /7±‚›=/ÖÖWP°:(: ŠR`¹¼Ø䔥1MÞõMë8a:uœ:¢¨î¾èËþwèwýú®Y² ìÒ± vY—ñ€¬i2dþ7d-Éø³Â¦þ€ÿ?À´&ðä?÷YÉÅ®¦]E³í ǵÁÇ&ÏxU%Ü WQðkÞÔÀ%£™KØ“÷…&oû²ãEËuŸ.ã8ÈÊbÇÃ?ô×W5ÿžlÆ.·­R‚Ýen4:Ï«é^bÚʾî+XWé„éTB´ ‘~Ž€\q¥&PíÚ³2Aê4víÉI‰;øË²“:M‚›Š«·Y‹â®mP£$j8]×’7Mݬ!*ñ¾]®“Á¼Ê€i§¼Bc7þV¼Jªze J'¤ëçhóŽ÷"ç÷ã* å\Ÿ²ã±©M‘‘ÑE¨ÏC#’ÐÂyL‡Ü’uÉ96ù§¢î[þÚ÷ÕÖÙ˜]Íz@ °ã^]^–\ÊHiP[?ò˜Œ¥«î;&e4p¤nÕ=,!aok6HAQy¶½®«îæË¦)ÚAF 0qÍ‘ˆ­à‚ÛMÆS)ç8íiVa{»ü‡HèªðûΖB“£[Zh¥‡©xM?˜…"ª5°ºp Ü’LÂg_øãç>o ’$Þ·ÈI ûÅ«ÛÑÍÄ¡݈H…V«ó^é¼§"©dFjÆóhà#œZ,c”Ö›ö¦ÞTYù6÷CGÜ4ô᣹â-1À—t~@½Õ6àœg:BeÓ‹&¿Ø¿“§saÃHÅ* …T+Íÿ…kyNSÃí£+ŽB¨‹ …ñLãý6_¯êº•^×q³~K£!ÂXÄc¿a— Œ H-nV$+tnT¨ ¼IB!Ööé÷óÔU°¡B¤Š›å(ý)~þ)öø£è69Wy˜ AŸ‡?x´ßu i¯4úŒÑ— wrPÉsV_‰0ÑÞ5 E¤õ#^È“ãÔä-7REº……2ëH±šó+T4;¶ƒ•+‹-;4Òk ¼JQ6&z]¸ýcuö j‹¥›‚z¶èÚ»¦wFkêýI—¹Îãô óÝPhÚܵ—P<Â5 §áŒe<:†SU¥oÆâ:³þe‹.BÄÁ¡øx‡öM¯ÐN,V„ía’~†ÿ…¹é@•Pä˜VpArÿ_Kø¡¢HÁE„‰ï˜lÀxÌdÄ pæöÃVXèÑ{PˆX v´u¶giù—Ê:Û!l щ m,O]¢¶vœ, ÓÏ}Ñ ‰Æ/tÈØmüdIµ t†u tfG`œÿO¸}žÁ§ƒ¨82+KRNlÀý;êOüùà¸Ï¸ƒr£ÿužŽüå·ß¼}ÿòÏ×ïÞß¼yý-;ƒßCýŸòî%0EûK€âÿObC¥ø4®æ_’†&¶Ïñ%*ŒØÝþoø­ãIlÐ%ã'Ðk‰0ô$=ðÀøäY¢ºïË…W«áTY’XC·AW Œ6;už>_s LWs˜>˜{†êÊÛé…Á'„@oŸÈB+°1Ñãæå·ËùÙž?™™Ânz2ùªÎËlËÞe*©Ùv›ƒL%AÇßíÃyäT£tBH§¨R/Œ%§˜ê£Ÿ,s£›¬ú˜»1û¦>p­pBZ¯*½qóòVõ‡·¬§àU¬ãçâ§Ê7•S<òbëÄEۨûT'|©æÝÞ|Þ¤’)².¯¸8 , P;ßö$)Ô«"“H¥- 9À6))â9)Á„é¾¾iòÊ8lk9בé[÷••÷x>œÙjGbœI]$«“." WŒÂU”¸½ª(žž$6¸õ[ ‹9ÊÚ¨"· ; OÛ’ŠDéDE–gœ»co&Ž]³ù#Û¿ïÝ1GÓløkéå¡XÔìÏ©ýÇp——]öËzžEÄñ$@9‰Ò•K³ñòÌä¥sòžÁÆÜSô¶2e:ñr@ßZ.‚éÌ4«¤ô˜È8uX;Éj)9ÑYÄçw°]$Ïìhx‚@¥áp"£ê¿É,üpa sOF,-ƒ?«å­“PQhRåçeŠ~\9-2eÌ(P"15¯ÈQ‘“õ-ZXiõHí]Ý¿º0 m ÖÊðÜmÐÆ˜Àåè߇Jš%4xvæ‹á#+À¡„9ak‰ahI!™¡ ž¢2{V® à=ýd¢A’©žH6Lîâ<ÊlÐbKzÅâr,#–£­òÜ0…%«6/”¸Ÿ3ÜÍ“àIãT®H×ÝD¢B«ÏÚr׿åÞeƒQÂb==ºuË&” ÆoáT璇ɽ8§  “Ãôò ½}Ç Që¾D›a¦É t˜A^%ìöVømEh¬™)ÊÀ¡¼Z1aÆ9"‚“Äì7ñ:ûE”„Qä÷ûæo_½fK%”ÒñÆ ¸ñùx•„Z‰9ÐäÛð¯^袽òJå3ÂÓ|»b¯*U$Ÿ 2™À¡³R0úǯ$ôàž½óFöGo —aƒÃ¯ðbàg$š3cNÓ+RÛ•hRÆÑÄõH=æ@°?s kGnáW{Çb‡eÂ@FA"Zç1}ì›<ÿÝŽËCŽ}éTÑ÷ ± pç5 Z¦.Îfæ” å|Ç… #êf7\€ÔÌÊlpŸuá¼í!?Ôd9 ¹Ì³ŸÓ‡´"J“KõÁœßå«é³ÕàlS%‚ò=”Dà}é«G|`åœ/λÖós ùOLÕb®c~s}ªÒgû¡45 ȧb—/ÁK›¨#+‹îRE­í) ‰Ñ·u6ýOÈ„}ñpƒWÞO%ĆÚÂõþ>ìß‘«ø=…³Õšñ„Âð{±xŠÁ—øè1e ‘AéTPʘ(£^Î;¤’ïªiº3ï2°h{<öZ‚„1€(ú©ôl‚ö1GFþ¢$ùØ©Žåð”BN²J0#F´€Uù¢[GÖ±àLMŒ¤àˆÞ}ùÜÖ¦í Ž”q`íV¨Zq¸‰_îí¿)s~챺“èÑ[^‘,NL¸3qãÇ‚£‡Y§W Æ]5$gúÎÚ¬]üHcf'tö£á¬ìÒ.A¤`åKi×y2ƒªÅx%CNŒ7²¡õ‡;\çü+%þ(ºjàŠUœkÐ};Ú¸¿öyóðLç($Z5IÊâ‚‹¤,Ór]bž 3£è1y(ƒÓKܲ~w)R€gúIž¼²¸ƒôq¶ gަ|á‰^¤ŠóR!y ½¼àÏI@-É ØÕtˆˆâÉköojä.I6²¸}Œ¿`Ÿ­ñôÓ“X´®ˆ‡Z¸7R{¦Që~‰OLäÓr*’Ù³˜Úí¿K1&Úm¨ôÜ÷óõp‘Fá/#f™*¾…šŒZ#çUž™ÐNÑÚY,›‚§PÓÃÅ×q«™GŠ1Ïýêúï¿_}óåû·×﮿yuûêÝ÷AxÆëÜç¿u×îPô*Ì»â°mþm¨1^wa¿šÞÉ0ËÀšhnŽ9‚pI˜Êå ûj€–î)ÎnT¹{Öƒ†0:š¼«3·ûvþçÄ> ßb1È#jÓµwFIp+|È»|í(“Ä<+Ødqd•œ àáL¤QŸuq$ÂHz. 7~ F¥±Û:^ ïါ-çÊ’I®,ñ8ßelg ";7“LÛ2”½šÝ?dÀ ¿HpÁáá¹OSÒ?\’g"Mÿ:K>H=ÓØõ”±s»~½{ÎL =IrÑ3\£B&ÍedÒƒ/Géw[3;À“µ\ÃÙ­dx**~:i3Ëç®Ø‡=ɶ£×Iê²OT†M°ÄÆß 1¹·é2_6€p÷ˆÏ”{U㺜\OÝ©bÓ!¤Ã1œ`2O¢ZÖ™Ñ>_AÉRq~ö¥J’ŽfO, Au4ˆv:.~šê[>ap1xuuúü%ux*è¸b=W´ ÞÔ>8{£œódž*ð—qìææ,\¹}à ûT&XJpùdí ÌI8,ÁïIùH®ùì’¡¥endstream endobj 1202 0 obj 3571 endobj 1200 0 obj << /Type /Page /Contents 1201 0 R /Resources 1199 0 R /MediaBox [0 0 595.273 841.887] /Parent 1177 0 R /Annots [ 1203 0 R ] >> endobj 1203 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [306.514 294.732 320.454 305.641] /Subtype /Link /A << /S /GoTo /D (subsection.5.8) >> >> endobj 1198 0 obj << /D [1200 0 R /XYZ 72 786.278 null] >> endobj 1199 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1209 0 obj << /Length 1210 0 R /Filter /FlateDecode >> stream xÚ­Z[oä¶~ϯ0òRð("Eê’>9Æn²m6l\´@·XÈ3ºi*jÖë"@þzÏMI#Çøa(òˆ<<×ïY]Dð§.R}‘fI¨Óìb½ÿJ]ðß§‹~ôW˜cJcãÐ|z†pÕS®bf‰Eúïn¿úæµN.TæQ~q»%ÚÛÍ?ª,Œ/WJYÜ^æIе?­«/ã8è.Wq?õ¦*ë{|2A³åß›f€‘_vŽ)ovE[¬;×z|Ö¼È ó®åÑ«/«}ÙÔþò_·ùæµ²¾V: mn‰»k_npc•Û¶Ùó¨ÛõSpP?UÈhM<élàI¥ÁúR§AÏNÙ ¬·M»/:à‚'öÅ%¼ôÈ›ÜÑrJ±^;ï^Cåð"3­ÓÓq’‡yœ‹H;U•w WÓY˜Ä‰]-l“„V¥Ïlë0ÊúMÖq*ÓP ­ª>§ÅâØ5xÃuQU¿’L“€*×¹êŸmÐô­ó ãi<”ÝŽG­ó,Q‡Ò¦WùEE Étû«H>É;^ŸÈÝó\¹%Ž£ «%*/M‚‘2õ-'«(³«™j× ªøyÁßüú&¼\Ù4[S“Éûòó¥(4MÁ$y¶¬}WÔkw…f™ ^?z^w_Š}Y;9g'ooO£ áv«…[½…ÓA×âY¼}ÈðCd£õ¾U pœ¨8øÎ­‹#Ê.ΜWz&¥3öD°?œÍ£€t’‚NJT/Ϲzݦ6d­ônËfr@$ Æ)W´´ƒ°•®îÊÙZ¸Ò-Í%a”€›†±Ì¾fÕÅiö+ÿè;·÷ _“¤¤dg¤)TDœuÓñ î[¾UÓè»H]ðâÆ‘m”l `îtµsÒ ÍÜñëMéÀ|Ë¥@„v  ¤ Ä?2èÅã| nóÈ<= > Ï®Á#L`˱˜èNq¢Áwþs,[Ò<݉ÊDˉyª(m/‹t,Q|)AzWmyË5DÑ®=‚ƒmx‘M+³@‹ó@HäG!*&Êu£†”{ŠR1AèÑ@µD2qºY*×çÙ§Š–Öভ+èz8ûï£ïdz'ïúb#Hœ¸K_ùÐ^HoŠ–ö˜P>Ät’ Xzœ LLé6W½@OwyvòZÊŠÅÁ *äÒC½‚ï9'¨^¾ `ònMǧÁ®ã·ž ï{a„õ¤{ÜΧ o|L)oùŽÔ‡C·?tƒ(R®\i° „«¥*fã©—Uؼғ¶mJhŠLP€FN@§°Ù¸/â:õV,sŠvÊfŽŠS´å &b&H¯·lãùYÒ³ÈúAj†zðœ¹gÐn}.žÞn{¬×ècg) ÉlmŸëLÀn`ê£T4‹âìï*œŸA(²Ï7>0Ñ™çÝ“!Ç„VgBT1 l>a‚20 ĉ‰-üI¨jr+¡`'ô3}ãW¤ë+4$!s£—Ú’0 &T9®U\I®©*¢Žÿ—˜í±¢°óKGZG1\¢Ã²S€ž¦ì#^Ó1Ám¦b¼¥ôPŽÛÐÔ;è&8MÕOÓ~*¥ÝðXT„ö¸¦C†ÐIdà¥ç{fZÔÇ÷,Òˆñ+æûò~'0®ì(^õ=Hüp5?Î+š›†KÜg’7 ׉ F\˜á5QE -Îù§ºéjZ¦¬JŽPü˜’l¤˜Õ‚Sŕ̮'y°ƒ{;ßñTHM X5Ž‚ÇoÑÙ“à]-„HAâW}¢åã°}±Ô–8TØñÐT#õŒ`PLì2T$›'úeHŘž°{¸m[”žL8 Ã…ûªÀ¼ª¡ÆBê·¯yþsY7ü6ɨz2ÉT±±'Lm0K,HBga”Æ/“„:õ­ 8#@èÅdÜ-À#‡¶Lð+6¾÷Žc*²sà’ýÄØ> 4üĶëUsσ¡ç«Ô¯’R) U2MV}ÒËZRxœKô¦¶‡úñÝ÷ÿ~ýþ§7?}¿p×4;iýÉ’_+=l÷ѵ-"‹%ÿéØ>zúzÂ-²…΄’,Æ[¿zÿþãÍ»·?¿ûåÍí«7?\¿_8F)3éÐ3Þ…˜§ì´Bǘg¬Dacc©oGéÔ?å0YFCãÉÂLidàôýšó\6>õ ŒUTÙó´P×r­ñM†+`yêÄ_jyÞ@º³xç4´y> endobj 1206 0 obj << /D [1208 0 R /XYZ 72 786.278 null] >> endobj 285 0 obj << /D [1208 0 R /XYZ 72 761.372 null] >> endobj 1204 0 obj << /D [1208 0 R /XYZ 72 463.518 null] >> endobj 1205 0 obj << /D [1208 0 R /XYZ 72 371.135 null] >> endobj 289 0 obj << /D [1208 0 R /XYZ 72 195.501 null] >> endobj 1207 0 obj << /Font << /F26 391 0 R /F15 393 0 R /F27 394 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1215 0 obj << /Length 1216 0 R /Filter /FlateDecode >> stream xÚÝÛnÜÆõ=Ú_ú.à¥93¼MÞTCjÜFv`«E‹¦(îH"Ì%·$×¶òõ=·áeE[yLÁæ\ÎÌœ9÷sfÕYê,ÓgYž†:ËÏÊý7êŒÿ>œùÖßaŒ!ãÄ„IŒ½g·rk’0O“çàUšÔð¾¹þæå¥1g* mdÏ®ïæz÷ŸàO›ÿ^ÿ훋ëqYÆIò<6Ï6WÉÊæ×n³5&šbO-´wøÍ‚ÁO•íþ°ÙêU½ 7Û,6Áå&ƒc‡£û¶s/6À¤ ¶…¯ÑAÕl%¸BSÔ<²s?E*nª¡jQC3DؘàÜûýÐUÍ}Ï»ªDð¢{äþ¾@ê<2´û\õà ¢'×7 PMðiSž:hq»øŸëºjçHøcVø#²ÌÉÍ ày×µû“½Î/¯¸°5ñDögP ¢nÃTÅ¿ ×A”ÀVÿÀ´Õ™ñd­î¹?<·Šºfð‰¾k|èy5¿/8ëù@k—|@°%€˜0?1G’@Îé*ׯˆNÕœpm!‘(13‰Ì“T!Žc „—¯²hXLfZ‹N;Bù!³cð»VDÈ}.ö‡Úùµ,ä8qìálÄôå¥ÎL˜ã}­nþê†óºF|߀Á銒þ)^ºàŸRy¨r%\ôÌÝU}V`¿Ñip[#t÷‘*w-k÷ïL /XPƒÊzòíu ‘ã™Îõ  ‘¡hùŒöÔiV\âÕÁ(¹âƒˆ!ΔE'-V \GjCåÀ ó4ù œ”u§ ÇÄclWÚ[©$ øÄ$^8 à$ÊØ–ƒ$<•3¥t˜#T]Ý®ˆ”‰C£= +ÄßèW{”±®sµû¸IÒ …`æF šª… å€!N$v©úr†÷ H‚­Š³P%fÍ+ ñ’ÉÍA/E_ÃÄEqÛLÆ('£Pu 5™´: €S{W4ý !Á@…±UÏR…™‰¨¯öxÓc=k}ýȈP<€gñ5øÎ&JB­“Å)^È2‘¬,}J9˜«I& @È·àY¯ê((`>¿'I^Ô‰G¦äyPøu‡C]•…øÂ,ñSî³Èn7ÈÙ?nH”‡÷eWŠÍÉšufã âÚ6$NQê)*=‰œ¢láz^ñ±*¸!ìD°Éªc CD†âÑšŒ#YÜŠPm‡R`ÒàÕL;ÙjŸª#̦Ù)¦8ăNÓQûuš³èÁØ®úƒëÄuñȤÄì›pìSEŽZûß±B}ÇÎ ,ƒíä¬Ñ|cï„F:Mèò¸RÐe¾eÈ·ed˜Ð¥ž0\3‘Ý™89͈<ò^®wà ž%Fÿ/þs. /$f{¨˜`£‹•ØÕ,½,¬Ø³c¥À`kç2˜ìbp÷dGBÖ<ú©B‹×¸›Ü•¶¡Všn–„Ên¶`MpÑut Ðï‹fW^ùÄ“lu&– s^à^_P‰SÜ›R˜<öG¶‘ØéÜp옖ì vw¬™`:Á~ÕG׿@Q#¿Ãœ¶lâ±’|,F†Z !Ãd 4;RÏuù©wrÛ}aM`ô°lÈÑšž¿Ì Xä5«¯n1D -ñΆOâÀY­ É-8×QÃäh/ý¡(å$æ|{l¼:zBêóÊÝ$&‡S þø]¹ÇŽvœ$!mÃÞ\¡K×T±\ê¶àì a+öãf"”Ò~Û[6#ÚJMhg€6#&gU#PÚ&øÙul‡\Oô´ì{V­%ã—虞$´}¹NGÃ$1¾Äô-Ìî¼LHRSÊ:Öc\˜¯ž'ëêÚýI™˜˜õgîW‚GÕ{ (î—‚I!תÕ4ö)ËmâÉÉ,' '´³©ÐB;Ë´K½,.“X%*õ-âjsÊhq1‘­Ð g$pZÏ2ä(ÃعœØl¦OŒæÂù¢’Ž{ŸØ_b,‚›{{‰C‹àñ }2úº‘¹nG~W¶<7o‘-Ÿ¤ËŸcS¡}&þC8á•f¼iƒžfˆaÆäÒÁè<åϘÜ×í-¦ûØæ»wUŠ¿Yæqî3IuH¡ŸZTH8rG8)„x5rNÒµJ’º–Hµ;–Ør$¨!2MÓe²D常7ÁE òi"ª+äd VâàÈ„iö NTåa”wܲ€3Ú{á°«‰=qîSbA¾Æ¹/…ä#)W82ŠS9àKX-µS6Å[ºö¾+ö}¸²;8¸®¥FÑx;lK^­}1–¤’Ð]›$oˆ¼ÙàN‡¡™Ç¿?Ô•,—´³õ§tΉ-Il˜éôÄÉBLÙR5‰ãNùî\Ѱœ·[­šS(¯}éIø˜Ãõ“1ú ÆŸà‡¯7@#ÏáãØn+þ\nÀ9)À&{}YÕâKÞÃÕ·L´/G«±7‹T/…äTÀpŒÎðüž³çekèa8¼Vãco+%àyÝ«q÷UurŸSŒ¼ÿî‹õ-“&aªÒ_Wë¤XèÕîâÝ»›÷¯ÎßÜ\¾}s ÿ½»:¿^+jmeÖ· V¿Ûl3“çÀ‰ÌWÇz¨¨jgypUô”ÍÆy$!¾g+ŽPþYôÜ)†ÁíÄì’mÌì¥â ç9«žàsâÆ{á—¶ŒÈ“ýñ0ÏY}…Ó®úe’™™ÿE¾ üŠ4„ѯíêYaxýÃÅÍÛ/ÞÜÀК8ÄQ˜µ+‡XÄ_e¤üM‘Y:˜ŽªÖû ’AâsIP擆f5æ(¬fƒ9Cù-?Æp½â™B+Ž”ê\ÚNa¶¹è䘎«9Š|9.rsk‚];ZEœ#Õ{*4à¼sÌ·õØc{±A:mÀ¯Y‚û|~Àâ=WSý·> endobj 1212 0 obj << /D [1214 0 R /XYZ 72 786.278 null] >> endobj 293 0 obj << /D [1214 0 R /XYZ 72 552.504 null] >> endobj 297 0 obj << /D [1214 0 R /XYZ 72 353.656 null] >> endobj 1213 0 obj << /Font << /F33 497 0 R /F15 393 0 R /F27 394 0 R /F37 380 0 R /F26 391 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1220 0 obj << /Length 1221 0 R /Filter /FlateDecode >> stream xÚÕZYoÜÈ~ß—ü!Oàá’ÝÍkÐîÊ»ÞulÞ²@‘=BrÂÃZ'>u5‡ÔPrò(°ú¨¾«¾úª8áEÿ‹D]$iì«$½(ß„üïþ•~…6–4‘ö#ƒµ¯nŒ‚ ãìb£#?#”ÿ~ûÍ·¯Ãè" ü,È.¶;’Ý–ÿð^_¦Æk»ËCÏþž޵}…µØËüx¶)Ú±¹T©7ØÎ–,:´÷Øb®ª»=IpuŸ_ªÌûLØ¢¼ÛËJ<Ëò †S½eñºmîüËѱwÕ´ÃÞÊ~:›÷­¬{¨KÞÌå¶yùÏí/pšMˆ”Ñ©ê ¶š× ‚M~°\ÚµuÝâÎzlHa,µ?!þ± Aº…ñ€ÿË&:îÀ¦\fµ¿¹³l‰ç‚=oÝ\‰W‰Xƒw b›ÀÐò…èràog‹ûø»•sîºö²1¼Çž¦…’íº¶ÃUUà½o,7Öy?p©³}ÛQY¹;Åf9·Ó ±¬ú¼ï-œ7önkëV’®mäɱö[Ö¿ó_áD‘7öUs‡;þöµJfz§£È7°{Ö¾!¤%,¸PP“úqìäèœxü Œ†)ßBÄ“À†Î Sߤé´Î8Tu¿¶ŒöÁ^Dì˜x¢ûËÔêΑBб^§AÕ Œ×dÐD× ƒ/t¬<-U÷¬"y³í-sº6lÿ- —c¸¹ŽYOÚ¾¯n]ß窭ó¡j›žEÚ<ý,4‹×ç-¤‰·E-ùrtOˆM¸ñ4å7ÊÈ,SÔÿîK¹GqP«¢Â¼$¨M {ø¹½d†éDùàYMz}{°<ó}ÃBµ-ïdÍü–¦lGZ"vûKgëÆ¤ýØV5kúÜv…õ±ã›ëí ÑT©.6YÀ~ ÃØ×±f $àÓzøþðxÐKP¨¯Â+Š™Ùä ¥s“oÃëo>ýpõîæõ›·×7×ï_¯è^›¦¡ŒAÚ„¨sß¡ñjï n3 ¼cgáòFB Ñ-6ÍP1¨Á)–O0”…ç¸娑ª*x‚cÞ¡•VdˆP¬in[3›”Wk~@m¼2?€”¾Ø^<;Øô`*õSPZœ"òÃÌW—0{z.µòòaª ½Ÿlð‹ ˆuã]#‚­+(‹ ü(ã?ò0[GédGÕPMN'ÊÖá;òN$ÀxmÇCJnaÛŒRÆÑžËÞÔJsGÕü(V—ËÌî~u”ÀýÒ ¡T€m ÝXÈq <ã¹þwÓ¶«þM—ñŒd~ ô‹±ƒWÛŸo ðþãÊ›fÆÏb3³Étl€AÞ‚¸%Œ)бc.½ÓÚÝ9ÎïœÈ…!ž`qÍk7ü=´à0Édƒóg:ví- û4„pa«Ï¥c?`öBžëã§ë'ß+ ?œ+>˜r^qË4 á¾" U' rť틮›$ÞÅZ—y¿…Ú Njܨ*þÈÍÓtäK¨‰© ±¼/šlyþ„üæ}WŒ¨q°cU„pöeUæƒe¼$hÀ‚-psþsÒ+šP”íé¨ÂÀqY¢´¸Fæ—I <ç>ïr ² rÒrM¥Ú'6åü¥Ý­±œÀœÔ+!RJûJg‹KÉëaߎpÐëN‰%ú æØÙ™!HeÊŠ7H7çêQ`bÀ'€ýŸª¦cSâ1 zìG¼zlë-+¡A¼™5’·DÏgÎ,l Åݯ2±zpŽîp5/ ü·”Hƒ/;&<ÊØåJl¤ü´ØÞï…DQmbI1e 08$X„ŽÍ Y.të¼ LN^ßÛW¬Ѐñe!>`‹˜ë ’F ÆÃ¨¤®ú&ƒ•‡‚°>šñ„}=m‡‡0O¾–ˆjdiŒ™Bilv%û€ø`m‡¤ ÖbZ±šß!¶×v:¾‰€7¼Ù¹Ù*‘u°Å±ìy$Ç °LÎu{7¨V"6 ^Å&pÎÏâÖ&ôˆy”ïªÏRVμá‘áSn¡®Jn„X¹®Ðÿ“ +::¯ÝýȪÇ52K˜¬¹n{rÃPCÆ‹{’)ïºw™§Š®‡ØÎa|Ãj‰ ÃÁ»#×Ñ<ŽM]ÝãyìtËq˜yïwÜ ‘eד¨vú›(O’…Nÿy.¯X= ð‡½';ÝVØ‚²eꪎJ"v-Š"ª_élà ™7s}½ -òp,].U~àCC¦SÄáÞž'.TÞ 6 Xn›±óþ•~}&; A³ñõÙ´‰Ÿ&éÓÞêéùÐY¬ìà…Áµéóˆ]¯9"ãÇA4¥Öj òçSÂD±v‰µÍ“!=ø_™PûHA3UC¸dLâøùD¥É€vl;.Z';é&ƒ(ËÍ_5©³‰uìû`9¸à¶v·FµuèÇ&>?õâ8‹S£Q¦”X©:žy%!!iRŒ_¥j¡Éýwƒ(ßCE‘-¨cp ª] ¦PÈ k¸ ºÑý±~ºÜ9O $ìïƒö}qš~7r¶ Ë­ŒÚþœ–M“)J^N2âÍ»¿]½}óãÍë÷ï¶o~\ÍÊ!“žS³0nA„K)‰Ø¬@4Îò Pƒéáoä¸@´@2¨.ã#bV‘Îäc|àÒXŒZäͤ)n‡sMA;ÐÊ}À’c€ÈJM)”†RÎBáQ¬†@€ýSÔöŠë•ŒÊé”_¸Rää”>MÖŠNI=Rìh{Ž%`*ðèßϼèB?!ª–– `p*Îa\¸s¤ÈîÄ >P„6åØyÞžìP´øî±ÚÁ–LæÇ„_SkÁÉ\­è4ï?çO£þµ^ÅtVÌÉ ÔHù௤F…¡õÜHLÍ0•t#37òa_Ñg=WIŸL(t ô³nsÆ è™=t¸¤p^f<=ª OÃuÆ mW®Ç(E9;Ì.<â˜K][  b•¤ú¥¼¥Nõ¸u–^"„/Œ­ÆÀßœÿÈÉÇp6;fO„Ãݰ;ʾUÂfúzC…ÿÜžº¼¹³OôÍpÛù·…}¿ù‘9:GÈO^©ÈGÂ1ç¯ Ñ:X@tìå’ÆZq? E DSf‹¥³ÅÌó‹¥Àv²D¦úóÚZÊ•ûŠ3é¥ÜÈ(K¬rŠøUæŽÑ´7pmÃêGÊHY2±Š'UüåÀÑ“Û.ï$‡î¶€Œç‚oäÞ¥©†êä 0Bu„<‘¦]b?×ã¥ÎŒ¦XôJéíù­¡âoXŠTé¥ñ›W¯þr½½^Íákã« ™S÷Õ#/þÕz ùu§°D†¯äë7Žy—€fwò£†à’Ì€¢èŠª§|þþÓJBld_sðÀË?£ÈÁß5Äèƒt%¤Ò“áÑ×ì$ÀŸ¸°ñcïé'.†÷c0Ÿ šµqF Ï‚’xì•’9£%˜ë öNþÐhT¸Y¬ÙsbØùÈ ŒŸ ík—Ò 0舔÷‹,»4_ìõôãùLÌáÜÍ«µtrùq> endobj 1222 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [355.575 346.298 383.453 357.207] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.14.3) >> >> endobj 1217 0 obj << /D [1219 0 R /XYZ 72 786.278 null] >> endobj 301 0 obj << /D [1219 0 R /XYZ 72 629.216 null] >> endobj 305 0 obj << /D [1219 0 R /XYZ 72 331.033 null] >> endobj 1218 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F33 497 0 R /F26 391 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1226 0 obj << /Length 1227 0 R /Filter /FlateDecode >> stream xÚÝZ[sÛ¸~ÏKÿ‚ßJwVXâF}s»ë6±3±Òv¦íxh‰²8‘H•¤6ëýñ=€H™¶“ÇìxÆ@\¿ó ÄORøã'¹8ÉMÆDnNÛ7ü„þ>Ÿ„ÒßAF-•–L+|{¥á,´œIÍL¦_kÏ3&3IýþeþæÇK)OxÊljOæ+×f¾üwò‡ÓÿÎÿöæb?ÓLiýúl°™t.ò‰ÎçüâãÇ»›w×7ó»ß_ÍçoqÄ/¹|À…eÊXÿÙRrÿùŸOgJæÉY}:“"MšÝéLäIÙ}ÕxY¿.z(q›|9&):ó¤n¼´Øl¬€ZørIƒK;ÜÂ~ráw½©,ô‹¥j[NÌY[¦¥ñ_­iÜ4¹§–5~Ge30ÚŒãÙY×¶-ÿ·/»¾\2\Læë ?NSXX۴еɢÙo–X4оÛoú°I–¬Bƒò—b»Û”^\­HZÔþ¹Ûmª…ß&ì¤o«²£º¾¡Ñº²§BAòºüBï÷U¿-vnéhæ»b¹¬êh%yòó©Ö°»û_eR¬ú²¥ma677a›z¾©î'öR P1ÚKè÷Ò¸½t¯U]õU±©~Å;B-lºëa¦,˸úntãìÝ»›ó»÷ï'6ÅX–æÙP'dÐ P#ì5)lÑO½ô5ÃO„+ͬѯ g&U¾QKÀÜ÷¾°¢ç¶Ü6í#–9 !k,!Ї:§ "Ëk ñätõ% yUTÒ ¥‚n€Ø¯‹Ýš”CJáõñ·óäP´Ï£Cf,ýŽ˜óòêÝÐçÅõ¼MÑ&W,ËÔ"ÊCÄè49;i™œ«M‰eíY ¥‘-5l]–KàFWᙋnsñ3¯‰$ ,\Ó9Ô ›VT5=AÕ% 6ãi°ÅÐr[µ/z7µÅ?‰m° ýfW*BgA—ܾ‡ h¿;VìÃ÷_uù™†Hë),#ƒe2Y’^Ì´g1àæE±ï¦`iÀ@øç9`‚/™îÛ¹Îpš™G_6Ps’;Mµ“n°4æÛ0’ˆKòhÝþ DO&ñÜb1„a)7£Ý{Á—JÄ#Àfû¾Ùȱ¼ Ã’¥mI¸j›-}4Ñ¢oà¸Ë@VŠ ‚9Rè¶ζÑ4 =­Çà¸õ#5F Azk£ùŽ–¶öl°hºžÈÙ’$Ûݾ¸šˆP46Ï;Œ< :þ^ÆO×·.ί.¯¦£l0 &ÕCwQÇ([hñläGp=Œ*°ôkMgȸÝEÛS3ü\ǘ\»xŸÁ{‡"ÙãÅbß¶©ÂÄF±Aí­@À’:„b@\R…±ö¶*‚ A30 :W\ù¨0.Õ@•áeÑÔ]µ,[²6ÒÑ’‹Lœ«†ˆþüJŒñýD ×7w ‡woÏæg“á,Õ£ÄL áÿ™Wü}½Z•‡øÝ]oT\¤ÚQ;²C ïtÔŠHAšcRˆÎ$Â…&åà¢ÝÌÜW"ËÇ_AÌI®Tæ}[lQo!« :.? !Œ®+ØÆ{Ä© qi$ÿyß—Û]ß‘-J=µ•4–ŸM$°ÁÀ0 YjG4}1’_ñ0eT$ã‚ åT®J3-Ùt~E‘3œa”%óz.E¤Óãù‘Ž4SI nÕ 3½ª«þ]uÿ‚·Ÿ–‹QTø{È÷ü‹óéãÉÍPÇr¯cZ+J~b(ãÙÃ/*ü{u…ƒsn²¡VÂ7ÚuaH–ÚèЙ3 Bð½¢Óã*œ%wH•›Œ‚àŽ/Ñ=L„6ð$Ø@5Í ¹…e»*¾î (£K5á»¶r+‡bÌ2ÀÔ±ó;þ¹*¾&:¿-{èåCÑÛîÚÜãêwÒó›÷nn¯æwç?MG/†e#ÀšX™9£Ûæ¦ç1çÖ¹`ˆc9“’ËŸ+*¤Q×™z g°èÏÉ (’Õψ%Û@Sçj¿qÑ‚3>*•páË®mÀl1KÕñ«T»°Ÿˆ°}ѹØš8KˆA|: báx=øÝÑz°Yôc°WôÔ@¬š½s…rIzŸÓ(OAœAH™S}ãÜö-¨d7E®9K#ƒs‡Ê„¼a4Æ:‹Üë$<ï‹%~d©òÌ¥_\Ó£˜‡ÔV¸ÈÏ%éð-ÆnÐæ`ÔeÊt––NvÔòAòBP´‡É墧 uI•”2q÷òâO˜´ôѾî€9:àƒ>f­[8زõ©î¯[üw˜O41Ÿˆ’Þ“(, ¶³érNˆƒ†/û`Rç,Wãœs±~ —ýÛ[lü«·³ã´b&¼Ÿ©ÜEÛ’D¸®¶sn§ôw#™¿(£ì{»ì¦V—eÌfâ[²æaBÖMè7—Íxœ“÷}!Üký4|-¬fÚšg³Dà'ï6d>¡Xþšã’xùG2<²}[’Ìßç7Cs‘ü4¸õù¼µ„ù­‚ºJðsÖÞZwÔkA4CNtüe:ùM™úŠëE)ÈýáÎÀßÑfí˜yF£ùº„Up‰ƒCìì\L*l]€ñ8òê©}`rÉý§ƒ~7ÍÃpŸ¹ Ä!p%.ëCæ³yðyXJ‡âÞÛðø¢ÑΩöÝ!uËÎÙ0 ›Úõ­cÒÜ 2¸S·˲ü[î€AëÜEDáÝÑÒ†±,tè3ƒ×ùüy|y9„Iâ5rÄì^7 °èkT',ý ƾ½;EÒªö {{vg=Ó4Y !ü@`d&AÛòdõ}báàå‰4èɉjø¬¨¯ÃaLNõ‡_¤L5™q–ió²I¹œº„fV /u;§ù ³×)ƒØý— ~:Ï™d€id<ä§ë ë€~r ;à\h˜ÇuŒæÖá’;J nÉù™ #;ÝÄÈ¥œôG jÄòdœ  \´Õ}|'B!ÄcP\4-x Þß«½aÃ4èT&”I~¸}‡~^¿)ðÉ>u{—? TúÀ‰·ûY0c–Ùö§ìH¸ËÀŸwðÃKšø)ϪjKÏîøó'wcئ˜²X<S«¿"¡®Ç m%•¿_JãÜ(_è* Å´Ä4œfé'Êôó²&¦Ï™9r'C±Ãð"ü¨dê‚Rz'é«ùª‹\x‹Qõs`‚9ˆ¿VÄ,Ç{™â&ò]µåK·Â¨]1þü#yž ™9ê£ÅÃ_¡íÐÐ> endobj 1223 0 obj << /D [1225 0 R /XYZ 72 786.278 null] >> endobj 309 0 obj << /D [1225 0 R /XYZ 72 143.718 null] >> endobj 1224 0 obj << /Font << /F33 497 0 R /F27 394 0 R /F15 393 0 R /F39 496 0 R /F37 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1231 0 obj << /Length 1232 0 R /Filter /FlateDecode >> stream xÚíYYoÛH~ÏËþ½ µˆzد}sÛñŽcŽØÁî" Ä–D„" q<¿~«ºº)ê°,°ÁŽ10`öQ}Tu_•øÄ‡?>‰Ä$ŠC&¢x²Ü¾âúû2q­_`Œ(U Y °÷ áL1K’Š)=Nÿøœ3 :ëÍüÕÏ"špŸ%~2™¯ Í<û§——ÝtˆÀ›óÏo7zùå¼Ìò´ü—ø4þµÊ3èñé¿çu>5 X;Í"øËœÂdO=Y½š)Éâ`’°€Ë‰ŒòÄ4¬—‘²S¡œÌ8 ƒx`BÊL\àå~¾àÁhä'”Gn[€”X7Ð |JÅ$Ùåá‰{Î$“О…Œsu‚OÇìIxH<øØ»«ãc¾ÉÛéL&Â[õå²Ë«{¾·M§"ò°Ã½Åtéõ­ÎhEWÑôIá!ñ󅆺&mÞV·öju0¿I›ì~*/m4ÉjOg¤ˆà-œP;^ä‹‚—‚%Üi—=©éË2/×ÄMU²é,ä °kN™Ìdè³ TðÖ MYÙè®o})¼¯Ó ôÒ¢Ç[J‰›ß- ‡îý×J˜ ÝÕWUC[]ç]WØmIñ±Í½´ÌNœÁý€©Øm¿÷7ùúø„mJ•Ãs0§sƒîÃ9  ãIü¿3~´íÁúßõÛú²x¨7;Û¿¼þíã{jþum§ŽA¸?áÐ2¢'AÌ¢ð{ü€d¾R/ÄÄßåx8ö<ð¶ùz3±×Ñ$z‚Øx¡'XõÑ‘êE¦ýzM–ã¨Öf¼Óm‡£Ç:.BxÏ yÆÆ‰˜!"°f%ïÊÞ*=²·7Êß³Oo¯Ì]¯¨ßèºÑ­.ѺtFN@$R’€œ€Jè|úˆ¸ñU"ä«°aô‘æj㫼4²A‡h(+ú.С=œ2gÏ(cËíwÂAüñŸWÜ¢í@¦à5í%û®î;”‡Þ™= =ö¾¬›ª/-]Ó5ñ¡‘lO$:#‘ð(f Œj,’îv’1Þä”s }ç˜ï7¹ñ{(}@g´»£ ¤»£ yñ`ülV̸îÑû_±FèÀœ¸9A‰p·³U§jRT‚ãÍyýÿ[·&~Á"ïZ·&í¨µ¬¸kmè+âIáó‘ªI•’ûª†Ç)ß÷–=¬,Qi:¨Ó,³Á+ÂX˜Xô&I‘ÞÖIÈ8¾è·v Åg¾e«F?%½OÚhÃobÕÛ±ámo²nªu“n·ÖlAlãÛëo鶦HïU” Ä×@A@ Ñùà(Î}™¸Ö/O8$ÁÔá–px"“Ç¡ì㛡}(å]•;rvÐZ¦­áÀ½= íd?Æ–~“¶Ä°…Dº¤.¸gzçîD{‚º©:4ÝÐ銥µfjóßm˸›P¹)5¸h¶›ª/2Z:€1³|›5uYõëÛž‚‡A=Ųeü´ï󬳔YEÛªÐ++{Aým©Ÿ‚ÜÃcÕ5¢Ô èGZXù.¨eΰr¿òæ>oÝ·Ì¥/:’ c#ù.«­}Ÿ¼(ô:_úºDŠÅ*†°°HE?»|L»tÁÛ_ç×W7ç¿Ô4ý'|ùQiŒ·ƒ/Bq‡ „tp>Óí²ÉkGB)‰™/‰\"i1šè«\ô…ÙQôŵCôå $q7*ú6ÿŠ>ZvÒ†²2³ÖåSÀQ@÷ºo0®„^Õþ¿`÷Oº»K[0ÿ‹"]·;+²û•ÿSý\ïÑ{Aä**Ô·û֦ݘ±Ç ÄŠtaB7´ÊÁÊ,owƒK€ i^Rg¥SÈŒµ=Á@ %/ƨıÆ$ÙÊ»Ö-"húRÀ‰‘îHã-|Џ Ê J¨;ŠÈ€Ì䨀Ì 4ÆFù6õ€qÝ4ޤk,6*¸mPIÀ—éUJá ‘qÇpS M§FßOèÓÌ‘ã§a1äžOÀÆæZênuZZ+h•øv¡¿Ç%t¬¸].˜W/©K‚ÚMN sXL „Mgt¢Ü±â*·œ¹ ‹ô°`·±Å€g#‰™òº³i/T-ðƒB…te>"Â\àH…ÄöÀã5[À±XÁ&˜à|œrï=ñm†ü.¼»H ¨jЃ'©lÐŒãicP 6Û¼ëS4–ú÷n‰óæ*Ë #6‘À6>Ѿ§ò8ð_)Æ8ß–#°‡˜h£‹šniÞÁ|wÖGDôذtU•žv*;x]Z ¹£å¬o{ð0öB­»x{÷“¶W‡O² h}“¤ôz ®*ç­lÜÃ[£èËÜ<Ëßãè` Þ:Šž«m"‚ÿt0øËQ cÂ곕sJtž‰1¯.onïÎ?_ÜÞ½=s{ýî(Œ‹ÈÈv&ó!mþC1uöáêú·³kè~8¿™?ÍšøC±öþêf~usù"Xzwþæ×ËÏ&Ey ÊGìÜ_^ÝÞ¼ ÷ùx6ÿ‚Þçâö…8býÁ©h>pÄ™ÜÂò“è@2‘¹ÆNP#ˆo+XRµ¯ 6 °ö€ð±+ ÀÇ\´Õ…†<0PHЄ”#,ˆ°=x[K8!H:€츢?¶óÑ×iÓµ¶Vä@Pû0*šÚ²o8&8Øh6¥'©›ÊáQƒ-`¨A¸ß˜:fÀ}†±¢¼ÖÙ:äk‡VmHÎbÜ@íŠÍ”8üdë¶i‘¯Ë­­,ÓN¿W¥¶uç…+¬Úªð1ä]¥Û¼x0»Eòh7r»EjÔE£²W¤ÆA‚ñ5G,e7kº|•.;»7J¿” ±W”„=0:ñÓi¦:¨va®ûÆ,:V³0b~$-)½œƒ/bUqÈÙå>P5Õ}¨À{gTk(›’p¨}(€u{ W<«þLj4ôukƒµ¸²í‡TÉp©"r Å>b€œ%!?´ëG ³8I1@ÌàŽ¦ŸõK“-쥡"ޕر½j "*(%”Ï&¦Œª³<íì¨Cõ6å½îtmùœq¸^”„‡Eæ/ ýÐåŒØªèÛ£ù˜Òö•˵ý`—>údŸfyÕP)IwKéu}Iö „÷Ã9›´¦ú”6y+Œ˜×2›ÙKG³ã €M]|û£ص˜4Km2»ÀûP5Ú8:›Ö¡¹ƒ'ØåG>: žÈ$¾¤€­ªov|}ejÕ-5Ç é«ý]ëLßWV Ê±¥†ú÷ë."ÓVUœì@_+›¶YWÆwæË¾H›™Ò${4`r3?VÏÅ4J.±þôtá(–‡ ÌðÄQó? É|endstream endobj 1232 0 obj 2587 endobj 1230 0 obj << /Type /Page /Contents 1231 0 R /Resources 1229 0 R /MediaBox [0 0 595.273 841.887] /Parent 1211 0 R /Annots [ 1233 0 R ] >> endobj 1233 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [127.454 588.389 141.393 598.086] /Subtype /Link /A << /S /GoTo /D (subsection.2.4) >> >> endobj 1228 0 obj << /D [1230 0 R /XYZ 72 786.278 null] >> endobj 1229 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F39 496 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1237 0 obj << /Length 1238 0 R /Filter /FlateDecode >> stream xÚÝYI¯ä¶¾Û@òrR¯e‰Ôz2ƈy1ðs2@&>‰ÝÍŒ–¶–éÿúÔFµz™y×8èCSÅ"Y*V}µ(~ˆà?äê!/²PåÅCÕ~?ðïÃý4æLR¦ >½Â¸õœ[†E–"ÿÏß|÷V¥qê${xÞïsý¯ ÛlãX%ÁóÁn¶:Ï‚wq¼}ê6Z“v¦²›?ÿõ»·1,ŽÂ2*yñVÁN©¢-ÞŒ¸² úÿÿ#Äÿ"ˆB½}ÙlUØÉð.*_íRäa)‘cŠ÷rç(­Â<+…ÉuU?aË<è3Y9xì[¾ˆ‚ñÈçUÎ4<·›»jr}7²LÓÁL<ªLÇ­ù°Á5¼Cãv–¬˜ºë&‚vPȇm¬"¸5PrŒÊ.I¼ãÐïÓ¶vAi¤ƒ¿ŽV¦q0õø¯A a:X!Ön¬æqù`ÖMü?ú¹©q¬‚zaË]?Y¡Ë»6­ß^Þ÷Ÿ³àtpÕ–x›FÛìè"–=%ÑgZŸ+}Ý^X–…™ööîþ}©,,•ç1òkÓ|ÆaôGÜž®'Ëáê˜ÞåöÄͬ,^·0sæák…ÇÉ5rˆ!Ó«¾=º†tO¦«™ ¤¾Ñ>“mG¾n•Faƺ¾î“›à–ð ÀYÀ0BMà Äa‰ŠeO)C³§da,îöÏzª$OÃ?ƒñêøl¼É­/~ÿgŒÂ´ä‹|Ó PûÚLNæØŽã&ØïÉ'´3âC ÂÇ~:6®ò+ö= #4\uá'ø4dW2˜A6v]mѳÀ¨Cþ‰Ù;Ð#^í0ÈÆÈ“WÆ)š§¡ïö “2ÞýÜÊÖè4e|ć~rž…½µdÅÂü8¿Œvâ1ò¬p9ksdÇ‚9rÕ’ í¬™æÁ¢Wg: þB‚ã„ñ >àöà][2o~|^€Y²$LTü¤ÇY¨3ÍÐOP®õ…°éÿñú€4LÒôõ€lÉjó+ëwG]$‘bÃÁKDMºôRó³á¿q3£`›p¿üíépv5“:VhvøhŽhŽFîèÞò[5ŸÈ8µæ{„û2üxpè8 ~1/®c×y!ÛȈ@'ìÓÛ$Iƒ·›" ȪpÛƒ™a€á™ ¹aöJÀkÔ^°¶"!R?Lk)nß§E?+ÜQ$?lÇ£yd{‡!Û) Îvze pS­¾’2Ìâäw`oœDéÊ„t7Ê¿9<®½Ù÷®cHË_!ÙôÊ‚7®šÈ@Ž0˜¼LG rÇÆ^«Ëõ±: ó4“÷¶Û…ˆo¦Ó_ÜÔšãxG˜¢ £Ì/ 9%J‡ NXÛ+)Vj‰ã µÄ˜)XEÇc(ñ¿á]ÎÙÓû(N*!ºßäŒwÌ?ظzWÑ[3ŸóxO[Êÿ|äYÊx๱»éŽ¥C^×q²%ˆ  Ø£®Ý’,@¶·€²x5ø¹R@ßBð<ù{Á’"?ŽHA0€;”Ý=Jy’yY!o0:¿Ùj)kì¾Ìƒ3)õ”¨žE“u‰J¿)°T3¬]ôUªµ!4b QQð†çڞÌ :ôoRG!B½YÐv¥¸.Ø ç¼§T‹ƒ >r(¿}©•é$q.9&ŽêÁ h'|* "‘Êq)ö“ìP‚éž;@•£ÓtI Ñ,9Ľ$2”É;# PPH¿««B!8„ĨβÍy_'Ïñ ¤½4uˆZœåiVÜdy÷½›~ÏqŠ‚Åàö®c&ZsNöÓÄáa’ìIÐ[|¥ç'SUýÌ”/Cw Gÿ~ ;¿€îËŒ ëž™8@ ¶¤R˜•­êŠº04ÂY,eÂ9‡Æÿ ÝuýÇðSÂO™¥w&Ã| ÞÒ¯6÷y"õ¬Æo¶t†«„\AŽ))(Vz™ž„YAX¾J` ÞiØ>y†\KŒáÃèÿÂèÄ÷Q™RŽú3*ôý,8ئâ{¾ÜóaT &¨9D„f0‘ië´%)/QbU¿Fëj#KÛãfÌX3q7ô-Z˜ÆÒ×3ªÃÖ€™ð“çöy Ùm`ÐÙÓ]¼m| öq¥­i毥:™cð„ÿ}yÂ+OKoy™Äå´¼´’ߥå"À2'i»RÁó½~âXÕ­Ûá?3þ¿Û^8’@v 1*=ôŽ—†Éì}ÈX»oí9Tâ É9~¿Ùæqü¼¤ÇÈ eâù‚¤bDE»¾x0Ž4ŽðìÛ÷p–,Í~ i:3ÍG&9:Jj”[jôNò!È=Õ›¾'ôÍÿ›|[lgP¿n¯•gH’„ì`ÝÀ3ç¼›l=ÁtE •Õ#§&.´á#g2KJç·j £–ë„pâöæ‰ öKîGãιðsG– 'ÿÈÈE UÜAÆÂgÌo›ŠêšwvâÜžúØÐY²Q)¤¼ë)¦17Íž7PN¬4U,-UUÞtœ€$iz/ çô?1ñ–…ó¹=?Y(‡]: üûX'£ÔMxbvnb)guÕ¬½lèJâ®K û¾äI(Ⱥ‹„9æÑì­Ÿå‹ìO1Sœ\Y›ðÌR0™û­®ux†rî$ò)ÖUE®‹†é+dE#æÙú7½³äóQXˆ®m dþó`NÏ#2ûéêŒ<èÓK½Í!ºБÞ|yURtÑ…ôˆq„)d¢súÔÏþSGNŸ:h9AÎ Ývühøï×ÙM–‡¶±{³8 Œ}3K¤ÔR¿èbIW·"õÕ—ˆœ-%éE3Ngø1.õç”Ñdü+èi†ª{_EF@œËWX(iEꜧ^6$®•‹Êœ_" ¶P0²ó˜ÒoXvD”u•—…Zló°½ß=°¦¸*A†@ƒBtÎ;¢¦8ˆS“y˘* ŠH¢z®/ Ÿ«Ã–+Õ €-2Ïp ×îÕÜLŽ:À Éðø¡|W`¿®¸ÛȳŸ<ò:l›ŠD—°_¿X\\$åXÞvÅëZ·15§ÃRùîmOq 6äF8 VQVƒ›î­yð°6>wáÉ5"¼¿™ uÅ{¢Uü]0c$ϸElñýÉÌ| Ì|3SWåÃ#Í9Ù¬ÙŽnß±Q«ó‰0!WšI—gï´ t¡ "ˆ}ϵÜÀè?qkîxÜ@¬„Û¸EŠ­_|™ðºuo Xi û0¦¤è‚Ù—yºn#˜QHW}ñØ|m–¾É NþÈc*³náPåE¸àæW¾˜a d&ú^ §Ga²ú^ËMæã½ZØH„„TÉ·--ß¶”|ÛzâMî·¥ö¤–ö-Ô{Ÿ¶^ý²õÌ _’ÈgðßΞx0¡ïÜûtÇy˜ªWÕw{µpó¯(I²àCw¢Œ8H p™LiÉI>B½ótNmds˜J á?ý S |«”³b H¶90áÎPJDÉÕGgpÞÖŠ÷¢é Ö›#U)V>D¼,ÅÊòAÄÕJŒ”ÜçK•Š"(_+&”ŠCg¯•Er}B›T_)Wþ Uˆøendstream endobj 1238 0 obj 2957 endobj 1236 0 obj << /Type /Page /Contents 1237 0 R /Resources 1235 0 R /MediaBox [0 0 595.273 841.887] /Parent 1211 0 R >> endobj 1234 0 obj << /D [1236 0 R /XYZ 72 786.278 null] >> endobj 313 0 obj << /D [1236 0 R /XYZ 72 761.372 null] >> endobj 317 0 obj << /D [1236 0 R /XYZ 72 670.148 null] >> endobj 321 0 obj << /D [1236 0 R /XYZ 72 157.947 null] >> endobj 1235 0 obj << /Font << /F25 380 0 R /F15 393 0 R /F27 394 0 R /F37 380 0 R /F33 497 0 R /F39 496 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1242 0 obj << /Length 1243 0 R /Filter /FlateDecode >> stream xÚíZmÛ¸þ¾ýþ¨=¬yâ›^ ôC.i®{w‚dQ¤èV–má´¢+Ê»Ùûõá²dkÍ¡—^_ ¦Fä3ópž%|þHÅ"Í&ÒlQÞ]ðýùiF߃Œf*-™Vøô‰‰K¥3–ç S2}zþÓ:4SZÓVßÜ\|ýZ¤ ³<Î7k7åfõ·¨nûË¥:ºáÞUý{Îß]qgŒuL/^Õv×ôðÕŠž®èñ/µÝuï®.ÿ~óÝ‚‹üvp48w[í[[oÚjEÓ‡WÕ®ßz}/Mcº»bGO¥‚³pÔzñÇ›‹x±‚%:󾋘É<[tÕb}±”ãB.–`:üø§¹  C‚#èOX–¥4c€T,•àx©s98QÊ'¾ÆÓ}ýšëÑ;ŸPþ=:3q¤‚s¦¹>Ì …ý%ÄLIy2sÐ¥dÆË„qXjj0$Ø!`Ï΃Áwƾ̩íåRrõÛŠ/‘F¦n/EõU‡Rõæhší»}ÙﻊޛµŸÞÓö—"V»]S—E_›r8BiÚ¶*{•[`ØåRÉ,ºîIæ™¶¬0—Þ’10-ž?‹ª²þ1æÊé’2ÚVî RE·Î¼ª,öÖIð`N1Ì*Ðä{üËÔ+/£cà­H™·$]E¾ª 8sóèw"%u»ñë ýε~ šÃ¾Ç.g´IX.¹ƒðÁTº£3–)‹'ÊG§v¯ÍÑ´Q€…’ÎèÑ{vwBŒ$ʶu‰Z·3À<´ð§êySßÎ3‘§~’Ýš}³"Õe‡nƱ>œñýõ]±©,AŠœ%àš±‹úmà­‹¦.PêœG×~æ±=m[¶Âà Õ½ßÀ‹z&G´Åšà“iš,›ÃÕ©×UÄ ðªZû¦§DyŒ1vHe“8ðX2Ì©n#s©Ygßl«ÙX³Ô'"ä„™- ‰%€hš´,ºÍþ®"ÿc¨øø&[”rŠ ¾&µK ÂEyæÊ¤ùLO"NA Ç ”hˆ™K¸!wtt±Æ “Xzœ‹D¦XœÊ‰‹võGà=‹XP‚’™Œ)™Av@ÍÞ?Õ+ïHŸ`ÂÄŠ÷—:‰Šf?çxžgLºšw¾Ýíæü³4 °{ÌÆþ ÷:Õ© ¯ÀjPY¼xµÅ7uoßTÝ›úcÕLq #¸“:1§­ª@ŠC%€ S½Xfx÷5²ŠñåO‹0úž˜n¢<0f\+å9$õtmö´6´Ä^)(“üðŽ<þ¤„{M!ì' ã¹¢õôHcà“a½tA ¤ÜûIÌR óq²F 9'–dó„WÜ:©­z&©„:m®n€\³qÝ8ög;¾®¿Ã2=Æã u) p/ØÊÝ 5½ð‹„KæÄSÖžÉ7ä’gOÞtÁ„ éà®Þl}² ›yƒŒ§“,eBO|S4q)=%‘5wž”îLçeÎ…žuׯóë15x.Þwè¶$2ÀèžÂP£-‚î!(žþÔ&d=©©.÷ÖÓb<­Ž£ŽIF9ƒ"œ„ež*†"lM"ÚÓ-EL[:e­¡)¥®P@ÞCC¼î¢]5àˆ«™xJ%½SÚzyè Î×2¬qeí¯Ê®3·Å-Ujüp;…œ  1¿j—_) ÌÜ‘®#ÇWi„.pè‰óàT{u5®{ã{XÖÊ.*@¾Þ·%ª°ô¸Û÷4–¸É:9¨;¿õCí’M«;°¤niìêN÷“ØûÔŽùÔABW‚v9o¶Á‰ÞÂPçšîŠ–yù¡ð=$:¾+J[¥ËÇiÒ‚=df8Åmh$VK "å8ÇC_ÍYêêž2µå/h¬¡gã™øTg} ÁÐZÿ`6HÏoŒ­1nïíõÐïŒýàlÚŽÛ@ìÿ@ý2gÔÏõ¼ÐÐdzý_:×ñÒëeÆÒä\»«b¦(B „Sê¿®Ûeíw¾Ã2ØC希îT4ýŸû5$þ4$Ÿ?ÄHZîŸ+Ñ’P‡é¨ú4«8L‡6@U½ÝßÚêû¡ Å•ã ÄÐtÊ 0çxç¡G—8†'žV$]eázÁD†.F‡ë¥³:ñÒ],7Åe,Q(?\oÏMµöúJÓµAZxÙ°l&}€Ô§º=#¾h‚—>ÐþT¢Œ2É aùt!ÃäÐyÛÞt¡—J!U¸\sè°ƒ?}é´)j¯Ö{‹0Ç䨯5íòçª3¾æ å¶/ C€ü©á·„ Wpé …ò%ä"ÿÛQ8S·,WÑÒSÄ¡š eåÔ¸v1Çz©hÌ Ë|‡z ¶-º=ñ“M9%Ë~Nº´(áUSæ\áÃǃ5‹D@®˜²ï¡…±$±õG¬Ç¦ã}ŽY&ò1C»2 £°©o¾Ërt1æ>_Ú¶¾D¶}7°ÍmÝc“uðQ‚w6Må9+ÔÊ®vWyi`P§{ÚÔ9!ÜãP7 ñ÷Ùþþ„‹è-D_Br—¿}ûÃ_ßüɤ¥Ï¼/Á=#zÕPäTþƒ¬ÿûíKúÝ”WGTugVÕ±ìã±àÑ æÐ,«é·aÎkÓöׯüÊu•nÓÛ½nLáWÛúçp 0ëæÏ/nÞ^¿÷vÒG(þæÈTjè³3lºä‹q†Ohr•?‡Qñ²Ëßødu†RñüwN‹óäK¢ô»¬_ §B³<Ï> §_Q:9ÖW~¹q߸;Hf½ž9ïº)6¿ìUÆ2•žƒ½ä,áü ìA…Ù3`-Uš‰ÿÃþóaÿ˜è_ úÀ°ý ò½ôóÒô Ï‚õ¡^ ÿº7}n¶ýÜÚφ´LòO@šKuÒ±x&¢eüÜý›í¾ý~É‚ã$òßHÁ!ÿg ŽçôðZKÒOýO !8“¸ßùf?ÓÇå·Ào»B?ý½ÿŸÒ KÓendstream endobj 1243 0 obj 2342 endobj 1241 0 obj << /Type /Page /Contents 1242 0 R /Resources 1240 0 R /MediaBox [0 0 595.273 841.887] /Parent 1245 0 R /Annots [ 1244 0 R ] >> endobj 1244 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [498.875 613.108 518.269 624.017] /Subtype /Link /A << /S /GoTo /D (subsection.5.13) >> >> endobj 1239 0 obj << /D [1241 0 R /XYZ 72 786.278 null] >> endobj 325 0 obj << /D [1241 0 R /XYZ 72 422.697 null] >> endobj 1240 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F37 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1252 0 obj << /Length 1253 0 R /Filter /FlateDecode >> stream xÚÕZY“ÛÆ~—ÿ+OÜÔÂ\8ô&Å‘";.»¤M•\qÊ…%gIdA€@ín’Ÿ>fpØ]:‘S•â3==3=Ý_€X„ð‹X.â$ dœ,ÖûbÁ¿Û…o} }L© ŒÆ§gWÚ$AšFÐÐVñãôó"‰äµÞ\½xùVÆ i˜.®nˆæjó×å»?ÿøÃŸ.VFšåï¯Äϯ_´íǶÎËí§ŸBòÈ×uv—]–Ÿ6—üÿîü¿]»Ž¼l¹±¯6ö´ïþ´ãáòâoWß,„Šmäb%P6)mª£y[•íû¯ÝÌõ.«ÝNÚá)Ç–Ì3q+ªrËÍ![Ûêæff¿7E¶M64÷¦¨2GÔäÿð‡A]}÷úêÃûOn?m•ÍMUïAf¹¼øãÕ‹• bùJ'A¢cwùp!J“Em7/VZ‰Y¬”"!* „TsÀBCˆ(H’˜ z… )ø—A ·îï\©™;‹;|ùV˜Á¨›Ôn/Þä„(•y]wX¥zŠgÑÌFW*PÐ^E€ùÓ“úƒÈ4 œG™ ýÿŸêý»n¿´Öÿ¼±M;Q}×Kú/ Xzr†þOtqªê’»|Óî¦3w6ßîÚMÿÕ:­žSi¡ôÓ*Jq¦J«Ðüÿª´ë±’@!’ús¼/›Öf› _´¬nðß,íý¡Èò2GSB/íç /mýÐ¼dÚm³¼¸Ä‡tyw!“¥Åv úPŽ$oÖǦáîª,¸»ÝUå…óÖîn¶;ÔleµÝä_ÙÚ–È»%=ZTR5±®ö@®ƒåFÓfå&«ñpÊ,ë NŠ(\€·Spƒ‰ZV5“º-æUÉÏ$‰!¯CVg{ ¾Ñ‘Ë4 ¢(õªA64£x¿ _Lu9Ã' b7Š®g æ=ÃE› [}’KèÇÙoý‡{鸀Ÿ›a!b‡{±1‡ êbtOÞ%>v²øÉ=E‘w.tŽMH~&ĵ2‚ýz%š»sHáOßA× /c@L¯g­·öÎ…2HâÌ5†}“¹b7Þ.|ëÛ'LØæ”'È;ÕG}ó Ø¾$ÂŽHGwµ³sb€Í›ÈÍÞx6s))à˜§ëŒ l+V +ÄuþS(´E ˆµ3=þ$7€ý…t Ã~{s†ŠŸîvùŸwø({&­½oã ^ó²æÉò®x0‘\¾wP“¤¦co¹ÏÅ”"&11Q”9,Xó@Ƈü~Ÿ¸]‡îòrSщ‚ÉÎ`Üv=g†`5^s Û:;€D¨[/×ËŠdÃâ80Ú`º^Vîfê¬%hľfW‹ ·ÛìÖ!>N§±¶ ¾È¤Ëï¯ñ`ŸóêØÞ',üªìw¶¯'a*FÃÐ ßHªUÝf{”5lWÈ«=o¨*;hp€á ˆ;6ús󼒸й±ƒ\ Nì&¬uçb¨¬ÙnëêÆÏšP€×Ù™Ýöƒ (ªzîÇÑR+ŠüzŒ%$sKŽ Y€" hœbѾ»bõñËOÎSi:åKÚdâ7é¬4EhÔÍÏýù¤‘GzLP 3À)£’ANÕ¡Ým|Ÿ—t v–ìƒc¢t0-wÓ¹#Ð:#–Ù/ǹ N7ª£œãÇiÚ!3ñ*æIO¶lçp¶ Ew:Ò³Gîw³ÁðA¥89Ih£Ôîg±b‡rÆc÷—1ø¤ˆ ¶h¸—ëâ¸áÐ*Ž'†}CrŒ’°D¬DÂmæŽdoáÈLÄŠ»]ŘI2nQ ÿã.ì‡vã¸Á{ÄqÈB ¯1”Ưáú_º„HŸFSˆÚ°*‰3J‰“˜ 'ÿ`yœ;;¹"ˆ`tF1$Ž”U¹ë:ö«N\ÚÅ‘Óst²C Ë—0Ò…ŸØ¼l]<ÐÞ¥NGz‘KPï|ë÷<÷Wä‡}ÖÜ·S¡ÎÁ¨±«ÄŽÞ2hxd`Gîü–¿`Žò(+“èʱ;ã‹PjÈÁ‘L5:;½93ˆºŸÁþ4HãgÃý¤Kîža±±xÄ’µƒV€|Ž]šœƒ)•$ ,RÔª´…»k¸„BŠ’†ýäªÎ·$‡Ä6Ðñ R±¨’ÔG·Ðê• ÒÚéôäeσ¼•I‚_ÕÇÛ1ÅÛs† OJ~>߈ 5p*Þž5Dǽd·ìùXBÅ'Å@“=´\dØ #ÒŠY¹ÒL»¦Š4F"§£‡ÚK Zû|»óŠzKƒFvÀ‰$Yí²I¹îÈ“#lC¢@(Qüç˜2’}€Öå+Ø‹8ZÝä­m[Æùˆðˆþm]Wõ¿r"d>2¤ƒ¨± )Ð\Yx&Z´bªnñ"ßçC›Âã~gÓLŠÄcáø0ÈÑflvC¼Lõ/áÑ)`jÉ2pºÊõŠûñR=…ÃÔ…¼n ×vRÓs9É7Óº{•6i1Ä&ôPqè¨gLèŠFü8<+<’üªúÖqàÎ"oÛÂ1V®pÁ(Å}AŠ ­ÚvÇiç<}‡Ò#äÇIÊÈ…Lý‹öI øƒÔ¼ÆOBé-ëéCaÙ;¿sËù¤#ŽzÏ…9رó2d‚ñÀ‘Àm˜‡™3Ðδh. ‹´Ãwã¼­Li3>5NÕ»»¦Þk°`»›zÍ­)O2T¢®f€LAæ"RWâç¶ý$ÄXªhÆÕÜ1îǃBH7Ö¡/•`%Y‘NNâ¶#Å$ZNäÎÝäæa+ÁÑAbÿ/ÇŠ$†C.*Án—%Ê$vAiÂy=þß@ÎTeÅ=“5'4ƒq** ±¢Ò˜gû÷cãȰ^ZCv7sÓ½Öho¸1—< £Ù;‡G±$ôøX¯³|ÜÖa¦;ù ¤Oô]z}—=ÅTñå@ñ#¯øz´Íù a éÃðç¦B E*ÙzM|Ë1 'èz2%Liœ¿ÛÛW§Å»•T*ˆ ¾ÓP::zîå-ìYQJüd¥_§ %&…†½ ´ÑÏq¿ò…ò“è0ß™r…,ÈO®Jõ ¯<â`ÿP䎗Ë«®8Ÿ×®¸?@МßV0Íl¿{ãöÖÕV3÷ÝÕ”.ùŠ ÛºÈ•¡Ã]©«ñªpé &ïJ'J,bˆ )H À1ÀZA”ðRf€\—Œ=ÍåÌ:XºŽÎ_æÝÌ2XdŽÏX&>™7³Ëàç ç/s=YFÃÜ/.´ùeäsBƒVŒïð:¢.I­4z'pÆRç.˜ÂCLÕÂ•Š‚02_äo ï]ÔUïí&·!œèKŽ ?³Á§b¼iè“ÿS·t6ëÒd ;d>=">.‚ g+ÇÓûSìXªs4?yR%Í¢§ùçÌB(5sŽæ'gh~ò¨æÇÖñù§y.þ›ÓÈç–Yi‘"V@‰v$Î5²3Nõ˜‘¥gœJŸª7ó°‘Š¡.ø˜•êÙm@8“—˜qúšHk—ðTnz ô—Aõ›¢Á[|ÄÅ8=´a¡Àßq¹N-!¼tÅ  r^|ÕÖù¡pÕ8ŒÉ}°‚òóÅé4+ã*À9¦ðû…Æä#ý· ]ÁOõùÈ4j˜$¢î­`ÑÝ›NN†-ÿ"òðÁKEWÉð™ Nö§ðÙ‘/ªem'Àa” ˆ»ÚBî´5Úöï-±BÈ©sÈ/‡¤ Œˆèh¯¹Ê…E’ é%qaÙŸE8ÉŸ_q®õþ†‡¾À:[Ÿãê¯XΔ`fÿâ5ßÛæ¸¶}a÷±ÏCªC_8Br,³`¡›š=ÖfXî®êB=Türþ ?ÉRîÒ]zé‚~˜@rˆ|u9’®¹ú‹òõ$¾[PѨlnT¸ü‘,äèødsEæ#½ cÇ3ŒPÀf?“Ú&!˜¥÷j÷Ûâá°›+ÒÅAú8‰Bì0W師[ä÷Š3ømV·sõWÉŸeýšµ9A å$ÁÐtûÙT®4hÜ¥tŸ$A$³´µëcœ[¸ÏbPˆtü9Ý—‰—×Ƕå2>â„„+4¢@Fé"Éi1üÆÊ$Xö¢ ðø»Â˜–ZÁÒ±O#âë×î X¿ 1«‰ðK0!fÖð‚AW8·ÉŽÁ{?ǨtÂgÆ&q/}Xª ¾3hFl&Û:Avn³¼Äú>´žÙ$É3¦³ ƒ•î¼|1H76ôi€Lžuj”LásOŸ3‰&ŸÞ ù„_û7èŒj”endstream endobj 1253 0 obj 3516 endobj 1251 0 obj << /Type /Page /Contents 1252 0 R /Resources 1250 0 R /MediaBox [0 0 595.273 841.887] /Parent 1245 0 R /Annots [ 1254 0 R ] >> endobj 1254 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [291.815 564.018 305.755 574.018] /Subtype /Link /A << /S /GoTo /D (subsection.5.5) >> >> endobj 1249 0 obj << /D [1251 0 R /XYZ 72 786.278 null] >> endobj 1246 0 obj << /D [1251 0 R /XYZ 72 248.207 null] >> endobj 1247 0 obj << /D [1251 0 R /XYZ 72 212.143 null] >> endobj 1248 0 obj << /D [1251 0 R /XYZ 72 176.078 null] >> endobj 1250 0 obj << /Font << /F27 394 0 R /F33 497 0 R /F15 393 0 R /F39 496 0 R /F30 512 0 R /F31 881 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1258 0 obj << /Length 1259 0 R /Filter /FlateDecode >> stream xÚÝYmoãÆþ~ùп äKéÀâq—¯J‘m'×^ÛCë .š¢X‹+‰8ŠTHêdýñ}fgH‘2íëè‡Ì}™}›y晕ZøS‹T/Ò,ñuš-ÖûWjÁï}é÷hcÉ(ý8¢ÚG—½ä2Œý,‰Iþ··¯^ߨx¡¬·'{›ÿÝ»?vWË(Ð^·³\h¬)©z÷f}¥3ïý¶©UNmÊË–;»ZÆ5¦j¦±Õú‘[Š–%~:Ì™ŸYHÐlwnšzÏ}§Äü«e‡Þ×uÕÚŸŽ"Y>ž·öÛßaÇKEG[¹oËÇÃîj†Úk­Ý·TŒÝ¶Â0ò:õ,WÚcãŽ`sª+tbúG*‡žáO·+*.•Åvw¥W´Qªn3’æië&·O{z}¦ ¥üU³V—zåkº&~tµTJGÞ×PjWT[L’†ÞÝ»?,oŠÒÒ–ÓˆUÁse£¹ì"Q©ÜS§Êâ~fÅ0ðÓDd–ß‘JZ–šÜöR«ÔÓ…ÀW±¿¥G£·v»«éüiB»ãŠd“©»TúVuǽíñpetN¯hˋƮݵQ u;Ñéh'Æ™&ÉÓSMö«3? {!ØF 5ýÙÀškÌ¥dîÌðªÇ®(‹Ž.ð‘Û7ÇjíNG&´Ô™öaSK‚:C'kRÚ;4–왦U ¦ãöBZ*»¶mkš_Á€È5¨½´°”Ôû@Sñhñ**ŒtŒZ½á!C÷»âaoTDï2¾žÌ£¼º’žaÙº‚Ÿº‡9v»ºé5‘EÞµzݼ8ǰ4 ·ÑÐÁ²˜´E‘ Äø%®7gÁA©®V´_Ò^}{{F¡Ø`¡0ÿÐWAø9>_þ±¿z•d~4p؇sÁZ!`D㫺Èy—*]ùmv’lÇ’l¿-öEײÜÒÞ´ÚL8Ñò¦ºÂYÀ|6fmgvH®1l@¿à‚{≎Z7yËU#ïô˜¢¯9i¤·0ÜÂÔWp¨–…]Ÿ£bTp> G©€稓ÎF†™HÀ¡)p½¸àPý¢ˆÝä±*ö¾}XƒÌ> yô*j WŽnÓ‡¹Êõ=½‘8xŒ• s º¹ß¹CÄèADz´÷F>­¿¦Äš,˜ *²C;9íêR„Fü…ªtÁôÑTôŒ1y=£ií¢ 첋@žLNžËðàj–óK8o;à‰iäéf´u+qPT‰¿ §©Ð-m¼î³‡½?´ï§8ìºè×Õõð ÚNSŒÓƒœþ<·%Þpý™³`"(õÅxb\sOOŽõ…±vÎó‘÷rœ˜ùÅ‹¯1¿¸\…³š¾ÆÇË^|"ù‹9×cNé-]ÑXÎÐtO?äõú½èOq4Ê8‘ܺ.ëæi^¦S§fÇñÏ@M‚!ôéê@1Ù/Lf deð‘GÏ™P•ŽùÙÝ79ÝÚ‡î^€D®&$òy…&?…Þл0èÿÛÉ¥ÑEƒ‰i¤4#b˜5½Mgü6ý`œo(A"ƒX)Só#áè7$X.þ»˜lmu–ô¶àÌJú¦h…–#èXþiî5ýRç_êz¯?6ë—¶é8m/)¿¥`‘²'P-û‘„1ôúXXäöËgï-ÍÒiVkå‡ôý²n³ôr *¢õ w÷o~ðc»endstream endobj 1259 0 obj 2552 endobj 1257 0 obj << /Type /Page /Contents 1258 0 R /Resources 1256 0 R /MediaBox [0 0 595.273 841.887] /Parent 1245 0 R >> endobj 1255 0 obj << /D [1257 0 R /XYZ 72 786.278 null] >> endobj 329 0 obj << /D [1257 0 R /XYZ 72 719.477 null] >> endobj 333 0 obj << /D [1257 0 R /XYZ 72 313.395 null] >> endobj 1256 0 obj << /Font << /F15 393 0 R /F37 380 0 R /F38 495 0 R /F27 394 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1263 0 obj << /Length 1264 0 R /Filter /FlateDecode >> stream xÚ…‘=kÃ0†w/ý Ú*A}±N–×@3´«†Béà&25qâ ;-ô×W¶ìPL©Ñp%övMTjÝÍ€É_â\ý!¾cFÒëyß×í¹c©‚öe³ K1§ÎW­?ÅN92’ÖÕ̺˜ø²ë¯¿ÀCCÛksJ¤ïAÉЉ½”~Ð.e^bèœÿdãhO‚ðQ"‚âztnƒÍûÉrSWî!¦UÛ;X®ì& ‹PâÚî9ˆ0he{Æ,¡@@üçw~eóŠIendstream endobj 1264 0 obj 272 endobj 1262 0 obj << /Type /Page /Contents 1263 0 R /Resources 1261 0 R /MediaBox [0 0 595.273 841.887] /Parent 1245 0 R >> endobj 1260 0 obj << /D [1262 0 R /XYZ 72 786.278 null] >> endobj 1261 0 obj << /Font << /F33 497 0 R /F15 393 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1270 0 obj << /Length 1271 0 R /Filter /FlateDecode >> stream xÚÕZK“ã¶¾où J.æ¤V ‰¾íz½©‰—«<·8µÆHЈµ)“ÔÎŽ}ú’’8;qNqÍA`h~|ݘt•À_ºÊÕ*/²XåÅjsx•®øïã*´¾4VÇÖà× ×aäZÛ¸È,Ž{÷ê¯ï•]¥&Ö&[ÝíhìÝö_Q~³NSe¢ÛæF§Ñà»ÆÕýÍZç6ú)±IÕlÚñöƒ‡¯ôæßwõíÝ«Ñqª­ìJ­’X—Ūó«Ý¸´(â<ËVëÜÄV¥Ïoûù£ØØXÃ'¦X»R&΋|~‚ïÛÁÿ wýz•¦q à–&V ~u\š‚ÆÞí+8œ*MÔûÍPµ ŒÄ¡ªklÚè“ïž°¥£IÜãš­Œnž[;·zínTuž?švàÆÐ„äš§CËc⛵ɇ=٨߷§Z˜ßÃOɤ8Á<åJÅi’Ê©r:UÇÐ0âP5[dª³è›S×ùf¨Ÿ¸ç²hï>y&4-S†ê ”(6zìªÁK'í ;EZÂüíià·2µ{⹃påýú#wÿ”¤æá2í¤,cèZ­U%é)’±óã*´¾“›Ÿß줻Aßaà‹’KÔ\­–˜oÚ¦¯ú„HR_ëRƒæiS8î°mXê|ìÎ×Þõ¾¡ÝÂ<Ž<ñ³_@Fú&Ko*OsJRé€3oP3¼\º, ÿY®…4t¶±é â ±µIT\%¿ˆ3•}ɧ±X²)F¹¥àPe9—Û-ÙT”'I‚ò¼Æ¯\¬F')t×v̰ˆZ™ ú Gž|ðhwlá*Ÿ-©t§y* i]Ýó¨³i¸Ú$“AaOÕ'’"«´†Ûñç®0MwÓx¿e l—IN6ê3ê܃gEQ™Š“<'M±¦¤eO½Ç©6£[ÆßŽî(lÿК||¸zwð°Ç/ –KKUÍŸš­ïzb–G-ùŠ-÷<îÝÀÛ‡V¦e,a„.DÂè#v¨`1¤òPÑ8üÈ£½¯»SMLÎNVí@6 Àc×Þ×þÐóïhö@·J³¸ÔÙÙÄ;ÔMƒ ¹¾Úp³Úz‡-‹÷M¿,lÂ1r4#ÒÄß­ï7]5n™ºÿ­„inx3€K²ZEØV”Ã\?éfç§°tÚhÆãžÌ‘ÔÞ?1Í¡Ba£jª¡ruõ«ß‚ ˜®k‘P¹h8-pèüt±Ùxôå™±ÑûjÉ{ê$‹0‡µ5qZæ_ôž‹†ºà=A/{O€™žyÏEæÊP—QÒ`êN¤SÐLˆD7 çf}xOkñµ)xrcÏôåüòJ6FlÈE—Q䘹a3eþZ² c‹iø®mDÝñë±ö<àöSœ™€åÉ‚®F›}âAž}Ã}uë¶t‘8޵ªýDq°sK†Óƒ>¬«¦\5Zj1ZùDþBO‹ªB“ÄE±o]i‰ oz¦Òù°1†]š РBmë_ "ÙKÇ Ü•Öñôíå‰?&gcúc] K®€åÙ² ö÷ÜÜV@i#¥?ݯq)ÜÖwÓù{YÜ ;6aIþKkµ§!p÷UÇͺ}€“Õü±;5ä&ú˜#ÎÏB;=V©fýSÁ¾ÿ€‹æ¾fÜ›| …ü[ÝÞßÜDïЉ\Çä˜Ä¶43t ñSĈ­h™ƒ«fÊYØÓeF†B t’Vë2„u Šóƒè”ˆÝƒkª_gLМ°ç]GJm!ÊkõB¤D( ­ Bç£Á†žÍ3Dî±K-òXeçÁŽ U8×è„t[ì1ºS¬9õüµì¾’ Á7« ¶ Ä© @©8ƒtà c–3€g^ŽšCòÃ×G}²ïmÛÈú¤ÂÞÈçËÞ8à[ðÄÉY\¸iy»•—0L¬4Ü$l)µç@7Ç)Ák¡·¼'÷†TžƒžÀެHÅÕ3ŠÔš4Hú(7òõe$˜9`“ÄIöbr ‘ñ<(h½þø?FœË4ðLó÷Uíwðë½ë6û£öý‚.¤)bX#“¾F%ÏÃÍÑ=ñû¾G æI ”HYuQ ‚û¢$•˜½–'ýfAS\#žˆèëD½àI÷4˜™@ ÙÞÜž$ å Ž›°g³`™…ÜPËÙ~JµI% âÄAk¶;!ÀÂ,x[YK¢&d/l·@bÜŠ#w]{à[)4®ô§Žº™[Ì‚ÁX׉ùäX͹™ FÒä,! [0˜é‰ûy@|—íþé€bçHÝÖý’û½…ÄCdñÃû7o?‡nAfÌ! ã^/p*bç›÷ÿ|Ž ØRù“Í|ûý7Ïq1qY†KF±äc“‡•Þ¿{îTà½3H Ê¹ç|`Ô 9H @ÌÚþ† $²{)¸N[¿©áCJnIäiÍ2ìíšý@^ß*mö®ãÖ_v[XhSt2ä²evR\ª²„z?TÈvYd®²beˆŽúLO ëHâÙ# ¾BBˆÞ&»'(ì½<´Úš8ª€¼owÜI•È®c¸ú9ÿ™®O(h’lý!3âKšÒš ‡ ÌûäùzÌj˜¼i»ñH-@Jfˆ Ñéâñö²PaFV½GÐVp¶†ôLKZkÀÒl¼áëK°pQ!Øÿùµ,wÂ.ð³*V£§¨¸ÐA«ÂÛ† g´÷p.þƒ¾Ö%¤_ç) —f0—*5m÷qį۪Eh!¼€|â«°«LåX±L4ø›ßAÐmÚH†þ ©áfÅì ÖZ€ä<PKe¬Œâg »>øúÚ .±é?;U,Ë<·€N¨<ƒDy>… þv˜¯QDïäžè2eŸ37Hš`!QËB†ÖÈz@£™§1¸`†Ç#ßY=n¨g² MR)›Îœ$Ž%HfõÄ}á4vðlBµz" ”Àæ#êhÛm)¡²pÐá9ÛFT9IxŽFCQè˜Â¸åƒRÊ5¯^´m.˜á†»^ì ®!_Aà…ãÎðìsbÊ8KÍïÈ@^ÂDË\ŠbY‘PPôùLôØÁ…1À”›á$`ˆj³´å‘£‚ÖôÂÔü¢Êt,¯•Ñ/'Çë!€ÕŒk¡ô»õÒ»‘bÆZ¶«‰µ*~ƒ¿˜À:O ~lÀw¬4â¯ädFꔲaZã±a§ªRƒ(¸+Ôˆd9z(“Ŧ  î.ýðM{|z›Çg±ðv±ÿbB1F”-‹*)&èÄS(ÁbŒƒ¥I°2 Ç:HáÚ áú$t~äÊÿ‘¿†Îmð‘qAÍ\ë éÂÂIsÌ_ó—5Ö&±¯r–Àâ?.ìIh‡¶o' p¶>–àSú,KØvrûn)l‡mØk$ÃMC=É qŽ£ÄõÁ{É­¹Pe¸l˜cÙp÷4ïÑSÞ6¯,I!jñ="Óq9‰/UYÎP΢‹^)8¯ß¨«‡KàžÄi‘NŽmÂò‹S£ÃTgz[‚)Â|yƒ1Ñã¾"íßóçÁZ~±µãsî Ñ#Gyic^`]Ý·¬²²é«ðIï³x®ÞÚ|Ùý*ÎÆ×§Ü_Žcí,³¶V–…½†ˆ›°´|CV$³+ÄO §z¨ŽµŸã°Æx)=X ðûüÈsˆ†A¢·“ò×#ÙbŽžÌŽþ_:ÐbÊ;ÿË©êBéÊm·šzÓñ¾qu.š^•‚g(Lúo†Þ_?£”ŠŠžhwIYüög§öúe;Ö¥yÞ¾žç†r¹ö ’ þØ[ÈþÿÂ}5ÜñÃÑm—⻸É!èb|OEçºÊݓު䲆®Â£ ^†¨ŠŸ—pä=¡iNË=3Çä~ãħý|^*©ReY­mHÐæÕn~¢puÅ5b…Å©0[Y©yc¤±e§“rJ‚C+EnDa~pêø½ÖS‘ÚÉ ºÊLä+Æý8‹^€ ¾DÓçÖï˜<ÓfÆ‹}ä8̶z‘Wç?ÖÓÈ5> ILf¯mÖ½Ô©åvœ5¡\ÞoÒ‹ó0£çÒwþÃLþãG?¼­@¬?¸í\H™ž=b0SðGyvâ7 ð‰’0•¤1ãéû±8Î!””J°ïçâ«×ÒJ³¯b9ü¬ÕWÏÇö<ì¬^24¥ÒXS=ä‹O­Ey¹ŽÒ €ÚLù?MH±endstream endobj 1271 0 obj 3295 endobj 1269 0 obj << /Type /Page /Contents 1270 0 R /Resources 1268 0 R /MediaBox [0 0 595.273 841.887] /Parent 1245 0 R /Annots [ 1274 0 R 1275 0 R 1276 0 R ] >> endobj 1274 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [465.234 645.672 471.087 656.299] /Subtype /Link /A << /S /GoTo /D (figure.7) >> >> endobj 1275 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [378.027 527.131 383.482 536.828] /Subtype /Link /A << /S /GoTo /D (figure.7) >> >> endobj 1276 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [491.907 142.771 511.301 153.68] /Subtype /Link /A << /S /GoTo /D (subsection.5.15) >> >> endobj 1267 0 obj << /D [1269 0 R /XYZ 72 786.278 null] >> endobj 337 0 obj << /D [1269 0 R /XYZ 72 761.372 null] >> endobj 341 0 obj << /D [1269 0 R /XYZ 72 471.219 null] >> endobj 1268 0 obj << /Font << /F25 380 0 R /F55 1272 0 R /F53 1273 0 R /F15 393 0 R /F27 394 0 R /F37 380 0 R /F33 497 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1280 0 obj << /Length 1281 0 R /Filter /FlateDecode >> stream xÚ•“Ënƒ0E÷|…—°À±ÇïJÝT)RÛU%vmy@‚J@£*_ƒ¡M£ž{Ç("nP¤)-1(V»€"?>Ñ4{q1OrÁ°àýêOdÌ Ãoñ3*¯%¾r˜ ,µÓ’°1Ðç@{ïÃ3d M'ÆÈ>8 Ì’5h^¯¾˜KéR*—0|¼@3£Q“¡ü¨æ‰eÚíÊ>áCêrR(Á†”曮ߤØtMÅŒËPÝE1W4L·C@…E mÖT‹Ò#ë…]ø½Ö6Ýʺ³­ß©óè#}ž% ŽT€L8µ,-‹¥§þx%#„Í=tÕ:kÊCQmúµÛny*½hF¶ÝÖèð«-Uå¡—C1ôʸëë¯Í ByÝ8Œ±ÐRnòN(oZëyí‹?S•&˜ÃTTRWöi~OÎÔåúASõS—‚Çôè­'77šÒLa¡ä¿º÷ò“rjÜß .·ý7*4Êfendstream endobj 1281 0 obj 380 endobj 1279 0 obj << /Type /Page /Contents 1280 0 R /Resources 1278 0 R /MediaBox [0 0 595.273 841.887] /Parent 1245 0 R >> endobj 1266 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 612.998 467.998] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1282 0 R /Length 1283 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kh©à’ÏÈP$¿endstream endobj 1283 0 obj 30 endobj 1284 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 612 467] /Resources << /ProcSet [ /PDF /ImageB /Text ] /Font << /A 1285 0 R >> >> /Length 1286 0 R /Filter /FlateDecode >> stream xÚí< ·^EuJîå˽ß]šV£hü"´E’{œ÷ƒ€‰€R `(A Ä¾À𺡅4J°6ö¡«¦´¥­}?ÁÚU«íÏë~Ìž3sîw£¡7«,V‹ÜsöÙ³gÏÌ~ÎìùÔ  ÿ+?³þüº^<½î†hœñ‹Ï¯;môìÂæ¤>„!ë…IvpÞ/^øìúƒëÏ/4Q‘?ŸYÜ~rý£_èÅÉÓëB|œöC^8£¿8yæ¦w]õî•=9ùÌzBœ“OÜ´:»_2½î­ÍO=·ñ®ùÞù©VöÍ®™_‹ŸMVåûü:|ß´Ú,²EÈÑw]?qÓ¾ùþ“ŒO­µã—}s&O0øãøö‰“‹Ö]t~p»7òd†8Žü'°Ÿ,£$&½¹Ä¬¼çÀ{WöÏWßÿ>°6n‘~¾þkeŒ‰ñ×~ðC{xLe–®.sB/ œIn`Òõ·:?TçÀ ¢ÖE=À¼Ù@âB; ’.{¬ÉƒYXŸà_˜„ÏW¹ï$31¿áàÚ|ÿØ„¹i÷úOÿ•þ‹\õ}ºÒÝBg§—eÝ­=x «|/Œ¶CÀ¯+âæÊZá’Þ8;´ò“,—úS³ŸžŸºi~ê#•§@/^GªAµ0ÆZd¥<LW€+€$¬ÅÛ)JÔ”XÚ„=7± 6À|šój€Ögª¥ÈÖ“Ræv„m™&à€+º<äè,´XÁ†ÁƒôŒXi±¼±ƒÑºÁH‹åTþˆ%ËÀP± 9H ´Å\¾ÖŒmvl5÷¾ùȾÙÞ9{5_D}sX›ñ¾q¾JÑ€ØiM.q¿úèVgYhh7/ÞÕH ðÁÃ×¶îά¬ªë}?»½Më xÐ–éØ«È=å(®Ñm4$µ¸­F¢!9Ûnœ¯±‡×¡¶ß?§Á¬öa>H\²éœ4Ô$rdS¢–âÁ÷Aˆ°lA oreƒgf쾋`B¡×:­¾ ‘ a`ŠN^úñÐ6§)B±+–/¨]õšQ6QøÐš¬¨&þ0šÞFc&Nõ®4° ›—!þS®µymô>Û˜¼ Ønñ€‘Á›Ø˜¢±µ (<­m,Ñv”Be{·ÛŒÖ¢ ‡G«"Ϊ0#¡µcé°tˆƒim¢@:,åíZû*Kb¿K V2N3.^¶µ³o_kçÞºµ3»`íܵv"VC>Z1H+&VEˆjZ!ÈÄuª¤§Ìé°ˆ‰w-VtX%þl° ¤Ã `zbÚ%ùµ Úÿ7ÒëÞV¾úí/½Úó†Ud%Në&0WJ‰`é”àˆ íT‘A1Y¹Á؆@ZB&f5$ßbH‡b\l± ¤Ãò9«ÜbH‡ùÛ]‹U –Öà˜B‹U Ý4ä9],l]®¶ 8ÑA]Ò,½…v@Ê’ÞºrÛ,ûØáãW·“.¸"·ÍŽoÜñ‰;WŽoÜ&_Šv}ò(½[/ˆ‰ÅQרñvþ~×JÞø™{î^¹÷ØÏÞs'a†$BLjEûî:ˆ÷ݽrÿû7î=ö©;0:ÌÉŽ„ï8q|#}@ݺqבÛÔÏ©ãpçÊýÀÆÃedtwœÈܺòIÂ6eZémÓ£²2ÉÛ?¼rÿ±[fÇOÜòè-<ÏeíÞŸ¿¾ð³ŒùÞŸ¾/Í£âGO¢Å…þÝ+ŸÙø…_<ðKÜOªþöÅóQvý~yãWžxüh>z÷ ¢†w+ò)èí¡V\>»ñØ{7>ùÈíSÝÔ•ñ™—8?r÷‡¸½nûôµÏcÓ>7 HÛÂ=ˆëì8ÃÀ„戔ÚYð6Žó,šPf–߬ }v›­r&[öhÉZˆ‰c…´JêtÌèѬé°$'®Eb@‹c3<(Ó ¤ÃJ6¡%%+ ƒŒÕ¿F`<@XßÙPMàèµ’*Ë´/÷6-ÁäÔ‰€ Ù7;ÍÞÉ,6õ6gU}w*~ôÐÊiÞtuöZ^f£—»ªÙpºûæK{I²1¿·ß˜/Î7옩¾5ÆÙ#Ƽd÷ÿÉûè5ÙÜSLEÞqLOñ¸ëIÁžÒ;S;¸!Äéù~ðîש˜wÊ*Œ¾œdh™pî%Èb÷«6~Ý~úCW·fƒ÷ö•yo‹6Ë80즮>ðÌ£ÏÜ]…ø~möäÁÕ9€ùõ%`ÿðUå¤K[-jvÃ} GŒŠ^¤& ïº %oeülS•ðý³r6¦Þ7¿þÙ5¶V…[cµ‚9¬ÔfOoÝ|ä†3€[Ò Q¦‚ë0ɨ‡e”ÌižX·òäÁÓ³§ .?t„‡—˜Ö,ÓÝ~hš{¾þÙ1÷€TNh_Ön1ª„ôÕ1¯¾¿%‹íÀó+†(»äį³?ïæ]3‰•ž+ûe› AÂû¥ú®)ˆôýž|xXF¸ÌbVÔR+ÝŸ5>y¸‘ܪrãpkmçTªàr*%Ð4ò°g›‘²Ù8p»­Ñ(‰iÑms7¦EËQUÅ úgÝbH‡å“|kÒa•£Í«@:,ëá[k4ÒaÕ•ŠUOT,m;Öµð]óŠÒå…ż֤¯š×.é+X5é«X]Ò'¦Z’¾ÑT·I_±nʦAµ´ÒaÀb¢Ú<†tX^:³X –M5H èx¯ •÷zÚ`ÉlçŒ ¤Ãª kÅêÖ‚UÖŠÕ%¬«¦È«K‘‹ )I¬øƒþÖ]ö;çgµÿïÞYÎÁâQŽÍ?ÜC˜L›y]h» NƒcbCA±ùQèþÕg1H¾ú×|Ø«ìUûÊ,xÓH;n±) 0'G÷ÎßsàFŽ·m.8 /ÏY —:así®Ý gÝÊÕÁÃv^9Ò?êæÔ4ù‘ÝŽ†Ÿü£ð3äÀŠíi÷Pº¥~~æqV2­Ëd»(£±QvA÷´n¿ïg¥¯&KuxÞÔé^€\È>¨ôxÀVç×<IK‰ŒHòÈ®nœ¿wEÚHZ×nÁúP¸¥äA=v&ß—AÑò¸eA •¢-DÓ6¯Cº ›l·d:ö²eP‹Íw]š—÷Ò6ˆ1Ô ´Ç-jP:(ïØ pP1„çB -×8 £9 !€††R¨† ËÇ~Ë{3²Š!C òÎ}4C‹¶S ™öM;yüÞŒ­b—B¡G\àÕ~ŒÖ~=ä)©Z`$Æ4öCgêP ¡ ï¢Û#„µ¤ÀÖaìCìÇÈ…`—B¡G?8gaFb;8§WY²Ni<ú®—÷fp£°^)È;÷Ñ Îaýç|âÒ¿7ƒ«Â¥PèÇÑ‹eÖ†óùQz±*®Q·r¢Zµ^¡”ï¢LÒ¼¼—™Ì&RƒÒ¾”ªÔÊ{#’Cx.ú!и&ET²i®y¢§¶ “âP笛 X?Eñv‚âK°žËJ©Æó‘dúÓ]lU2€·Æ”¾BÆb*íí /C¤SeO¦m_qðCÀ*j»‡éLÊ©®\7g·­’ñ²JøÔͯñe•LEIz‚’J½[Vbc_2€²l&Çe«4n«(bÿÌXIZ [#¤Í+“Pó–@šíY7¯@Àc"îx£mÄNš±½RyÈ#NC7М&HOg²nW®›·óºYðJž¶µ¢rnÍÈÖqxÜ\ôÁ›Á¥eeë†U„¶›ÐŠ]'4€šCzÙL¨àŒ:¡3]·+ÖÍÙõÇÀØ€î¹Åg`éžX‡µ1HÐ… ‡@[”–4gÃx;5BÙ¡D›U¿À–Æê !@QýÞõc…ž·ÜÁ¥/,MXÐx· —Ae7jpàùÂÒ6Âö¸%]™j¶¤§‚­•+ˆOHj5õ ÆNPŒëo&€·ŸÈ¾vEÒ½I—l›ÀygÚ#w Ð*WÈV… ¼S*5¹#¤©ÁUrhM¼ ­Æš^EÂÞ´¯8ðE3ï@Ù¥8LgZ…{źÙf~ x+÷Šè©»ÖdÙÄüØ{bUo~@aú:i[+«³Ë—\¥"øJ¥¯B¶FFTs,ùÒH©½h× Â`…”;4Vgl˜´”¨=X?â4£ò|21¥3Y·+×ÍÛxÝH'ŒÆ-²U!£í²É¦ÁÆeeë–À¼˜ØNhÅ®š $v±PÁ'tBgºnW¬›mëfœ• wøÔÝÀw;¹¤ç¼š x=E y‚ë•A¥.y‹ë0øPP^‡üœ±øþ%zìU Œ›ƒ0YD“¨ ŠXH¿swd6~Ç †dŽxј¬ßéa»Êé\n“ÐS§,ˆ‰×+3Ƀ৉î²@Â%Hz娙îx'³#‚ì9´õã1b…ølðv3ŽÕôùÛ!Ej{s–<.'42&aÐ<Ùàe< yà 2a] !)H‡•m zEúض¤Y•™Æ‡v泚¨bž˜Ç\ï •ð$ÛÔ#Ø¢—~ë¥ö³(QÙA£îñz,ÃÙ®UÐ/,³¡o ‚Òƒö­Ð/Á)DvЫ]îãìx91ÛÁ¤Vl2Šm[*55¦å¦ryê̠͹×Hå©1uS,¥h$Ó)J½%­w¸%-l;Ú¡éèÌ b;´˜GÏ¢Û!cÑÀ¥m,‹:ÎÃàL£18l®Ì»“8!Кn’Néì —»ßÍÙæ:˜ÔMTWT§@ ãTV-Ú) °Dn¬©‘>õ&×L¯;c9~âü%Ø©ávÕp‡KF½÷ál››Ș›ŒVøÒv™õ ™AÁ)ÊÚ4®ÆE5YY—á0‘ Â.÷q¶Éù°ƒ²i7¨„凙 ]ñî4@û;јÊzÏ»bðÅ m*Ù#ÐÌûŸÒ[ºx =:xÀ–O¼…7' H•ng¥YÚy$´ÇýSc‡ÀqFþð.ŽøSx”¹ŠÛˆã©sÈÃR‰œ,í'­Š“Š:¢°ÜG@D)ŠŽ–@I¸–Ù`ª õƒÆoq\e"nUà­è3óžMâ¾ð‚Û”ÉÕS$Ú9ǵÀ}¤“t¡Œç0¯FÄÄÖLõã)Ð1Þ 1É—¾x›!.Ái¼Éd  …d`Éêt¸ /ùF¶ ÷Bµ†°Ù³¥°ÖkäyÞqcžjÄÁèyöó¸êt·!r—É™JnâøöœU0½|ÅEã™ 7îé&FY«\¦ó5 }FÊ 5±e­¬bè’ˆÁ£(€hˆôùÚˆæ+smGÅºŠ™±Ô%VZd¾*dµÏ<¡ 9žÉDœ$Ä®I±… ÄÐež\н–J²+œÈ¦+8:¥¹uÀܤá ¹Õ:*H@yBëÈ-ÞLMíÔØ@F ‰Ë-þ° Ñq¥tÑ:•Ê2°Î ÏGH(:˜tºËãX,†Û†V\ã‘ BR!+o Ç+TxÞ!&iX’uíçaÃÆÂz0.8[Á£Ð!÷Õô(¡Ö—CÕ@Åß”’RÅb= ý ,¡"ú6ÀpIŽ@Ù·ë£Z…±!0¿‘VÉñJ‰–AΨ°9@ð§‚'Ç‘!´5…#*<Û‹vÀu0¬Ðžsgcd¡qðò‰o! ´CµfÀâµfe[v’– o&Ù})¢£Ø?„ê»ê@ž§v.2Ãk]¬ú 4fž^†ÍÑÕa€YˆEÕ&‡áéÄ׃‘cs@Ò#†!¹x«Ì¡t9Pöâe`–P½ìB2VF\Rí@—0Q+H? n.XxvDxÏ7RÀiYÉ ý2.*y Ž.q­ìçG*ïˆg}¦"]:v(®ÁPÖ&†€ˆ¢L8o2&àͦƒØ€"¢°¹àØ·ä?h lq/csqo ÷‹èð•´<ƒ!õp`Šc`ƒî<ý:BÀ‚dì Í8ÎÀ–£S_R —"ú'€8îÜ*,+@@Ùk²ÊP¶¨1~µÅ/ж€+Î߆ Û8°{Iž<´ƒUg1×( )þ¸zv–…ºx°L“'D€.ÆÕ&>eæ&è°ë©óVýu®!Šr¤ø…JoÁd×v„µ%ɵ¼XÜ©k¹2#ãÍ‹]Gm1F ÍÄ@€Îò[çÎ).{ç×áoÍÄv ð‰$¸.“Ͷ¦YJ‹¿Bâ)Ë ^ z ëÑŽ¤Qj¬ÿ¥L#X_Ch„Ïâ)±²€‚§ð,Ž"Ã6(݉9xŠBX47 c£-07äDŸÀOÐNõ¨râ'ªV‚Ÿð¬ÚEqÁM°Í­ºMn"ÚONƒ¼jÀI°-¯6¼„¡³Úò¹1Eà$[ˆb­øDj ùˆ£G>E¯F›<­N±œà 4ÙÀjZmcëBc~’ñ·F NÄ’'+n1…Pa\ÞíȈZàý߯îÜ‹Ÿ?î /ÿó_¼ð›¿õ%ýÛOœ{ñwŽýîW¾|á÷>wî•—ázú—?÷Õ¯ýþ…¯_À¿ßøƒ‹¯~õÄE.Œôò£}@ë<ÓúC õGüÒW¾~áµ Ï¿tðÿä«Ç.þÙŸþù7Ÿ=÷ÊÅrÿŽŽï¥%sñê_¼Òrñ¿<÷…—_„¾‰— H‘«W±4Óâ†þ ¸×ßœ•‚àlÿ?ôýb3yº~x«ÏŸš×bóù W¹SÜAù!æ\$¿ ™–Ž÷â¹W`^|íÂ/üÕ__<ÿò…—/| áoþîo¿vñük^zôÜ+/•èv~[6“üê?üãÅóß¾ô•¢{,ñâ²ÕR¯y#|köÏ^?ò-õFø¶úª’•ÌÿzæðFø·Ù¿ÿÇ›³ï”iÐK5·ß=ñ=š—R*üŸ4ܰØä!|ûü÷Õ›³¨ïyS}ö:‘Å]úø].;ÜÜ÷_¥þ–ß¿Wêoéå¿_¤W² öë|=ŸJySz›ÜÎ*¿­ô?(`¶endstream endobj 1286 0 obj 6056 endobj 1285 0 obj << /Type /Font /Name /A /Subtype /Type3 /Encoding 1287 0 R /FirstChar 0 /LastChar 184 /CharProcs << /a184 1288 0 R /a183 1289 0 R /a182 1290 0 R /a181 1291 0 R /a180 1292 0 R /a179 1293 0 R /a178 1294 0 R /a177 1295 0 R /a175 1296 0 R /a174 1297 0 R /a173 1298 0 R /a172 1299 0 R /a171 1300 0 R /a170 1301 0 R /a169 1302 0 R /a168 1303 0 R /a167 1304 0 R /a166 1305 0 R /a165 1306 0 R /a163 1307 0 R /a162 1308 0 R /a160 1309 0 R /a159 1310 0 R /a157 1311 0 R /a155 1312 0 R /a153 1313 0 R /a151 1314 0 R /a149 1315 0 R /a147 1316 0 R /a146 1317 0 R /a143 1318 0 R /a142 1319 0 R /a141 1320 0 R /a139 1321 0 R /a138 1322 0 R /a136 1323 0 R /a135 1324 0 R /a133 1325 0 R /a132 1326 0 R /a131 1327 0 R /a130 1328 0 R /a128 1329 0 R /a126 1330 0 R /a125 1331 0 R /a124 1332 0 R /a122 1333 0 R /a119 1334 0 R /a117 1335 0 R /a116 1336 0 R /a114 1337 0 R /a113 1338 0 R /a111 1339 0 R /a110 1340 0 R /a106 1341 0 R /a105 1342 0 R /a104 1343 0 R /a103 1344 0 R /a102 1345 0 R /a101 1346 0 R /a99 1347 0 R /a98 1348 0 R /a97 1349 0 R /a96 1350 0 R /a95 1351 0 R /a94 1352 0 R /a93 1353 0 R /a92 1354 0 R /a91 1355 0 R /a90 1356 0 R /a87 1357 0 R /a86 1358 0 R /a85 1359 0 R /a84 1360 0 R /a83 1361 0 R /a82 1362 0 R /a81 1363 0 R /a79 1364 0 R /a78 1365 0 R /a76 1366 0 R /a75 1367 0 R /a73 1368 0 R /a72 1369 0 R /a71 1370 0 R /a70 1371 0 R /a68 1372 0 R /a67 1373 0 R /a66 1374 0 R /a65 1375 0 R /a64 1376 0 R /a62 1377 0 R /a61 1378 0 R /a60 1379 0 R /a58 1380 0 R /a57 1381 0 R /a56 1382 0 R /a55 1383 0 R /a53 1384 0 R /a52 1385 0 R /a51 1386 0 R /a50 1387 0 R /a47 1388 0 R /a45 1389 0 R /a42 1390 0 R /a41 1391 0 R /a40 1392 0 R /a39 1393 0 R /a38 1394 0 R /a37 1395 0 R /a36 1396 0 R /a35 1397 0 R /a34 1398 0 R /a33 1399 0 R /a32 1400 0 R /a29 1401 0 R /a27 1402 0 R /a25 1403 0 R /a23 1404 0 R /a22 1405 0 R /a21 1406 0 R /a20 1407 0 R /a19 1408 0 R /a18 1409 0 R /a17 1410 0 R /a16 1411 0 R /a15 1412 0 R /a14 1413 0 R /a13 1414 0 R /a10 1415 0 R /a9 1416 0 R /a8 1417 0 R /a6 1418 0 R /a5 1419 0 R /a3 1420 0 R /a1 1421 0 R /a0 1422 0 R /a89 1423 0 R /a49 1424 0 R /a54 1425 0 R /a59 1426 0 R /a88 1427 0 R /a112 1428 0 R /a44 1429 0 R /a4 1430 0 R /a134 1431 0 R /a2 1432 0 R /a11 1433 0 R /a7 1434 0 R /a28 1435 0 R /a107 1436 0 R /a24 1437 0 R /a12 1438 0 R /a31 1439 0 R /a43 1440 0 R /a48 1441 0 R /a46 1442 0 R /a80 1443 0 R /a63 1444 0 R /a115 1445 0 R /a108 1446 0 R /a74 1447 0 R /a77 1448 0 R /a30 1449 0 R /a69 1450 0 R /a150 1451 0 R /a145 1452 0 R /a100 1453 0 R /a109 1454 0 R /a26 1455 0 R /a118 1456 0 R /a120 1457 0 R /a121 1458 0 R /a176 1459 0 R /a127 1460 0 R /a123 1461 0 R /a137 1462 0 R /a156 1463 0 R /a129 1464 0 R /a140 1465 0 R /a144 1466 0 R /a164 1467 0 R /a152 1468 0 R /a148 1469 0 R /a154 1470 0 R /a161 1471 0 R /a158 1472 0 R >> /FontBBox [ 0 -77 85 111 ] /FontMatrix [ 1 0 0 1 0 0 ] /Widths [ 0 0 33 0 31 0 0 35 0 0 0 34 39 0 0 0 0 0 0 0 0 0 0 0 38 0 60 0 36 0 52 41 0 0 0 0 0 0 0 0 0 0 0 42 30 0 45 0 43 25 0 0 0 0 26 0 0 0 0 27 0 0 0 47 0 0 0 0 0 54 0 0 0 0 50 0 0 51 0 0 46 0 0 0 0 0 0 0 28 24 0 0 0 0 0 0 0 0 0 0 58 0 0 0 0 0 0 37 49 59 0 0 29 0 0 48 0 0 63 0 64 65 0 72 0 0 0 71 0 77 0 0 0 0 32 0 0 73 0 0 79 0 0 0 84 57 0 0 90 0 56 0 89 0 92 0 76 0 97 0 0 95 0 0 85 0 0 0 0 0 0 0 0 0 0 0 68 0 0 0 0 0 0 0 0 ] >> endobj 1287 0 obj << /Type /Encoding /Differences [ 0 /a0 /a1 /a2 /a3 /a4 /a5 /a6 /a7 /a8 /a9 /a10 /a11 /a12 /a13 /a14 /a15 /a16 /a17 /a18 /a19 /a20 /a21 /a22 /a23 /a24 /a25 /a26 /a27 /a28 /a29 /a30 /a31 /a32 /a33 /a34 /a35 /a36 /a37 /a38 /a39 /a40 /a41 /a42 /a43 /a44 /a45 /a46 /a47 /a48 /a49 /a50 /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58 /a59 /a60 /a61 /a62 /a63 /a64 /a65 /a66 /a67 /a68 /a69 /a70 /a71 /a72 /a73 /a74 /a75 /a76 /a77 /a78 /a79 /a80 /a81 /a82 /a83 /a84 /a85 /a86 /a87 /a88 /a89 /a90 /a91 /a92 /a93 /a94 /a95 /a96 /a97 /a98 /a99 /a100 /a101 /a102 /a103 /a104 /a105 /a106 /a107 /a108 /a109 /a110 /a111 /a112 /a113 /a114 /a115 /a116 /a117 /a118 /a119 /a120 /a121 /a122 /a123 /a124 /a125 /a126 /a127 /a128 /a129 /a130 /a131 /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139 /a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147 /a148 /a149 /a150 /a151 /a152 /a153 /a154 /a155 /a156 /a157 /a158 /a159 /a160 /a161 /a162 /a163 /a164 /a165 /a166 /a167 /a168 /a169 /a170 /a171 /a172 /a173 /a174 /a175 /a176 /a177 /a178 /a179 /a180 /a181 /a182 /a183 /a184 /a185 /a186 /a187 /a188 /a189 /a190 /a191 /a192 /a193 /a194 /a195 /a196 /a197 /a198 /a199 /a200 /a201 /a202 /a203 /a204 /a205 /a206 /a207 /a208 /a209 /a210 /a211 /a212 /a213 /a214 /a215 /a216 /a217 /a218 /a219 /a220 /a221 /a222 /a223 /a224 /a225 /a226 /a227 /a228 /a229 /a230 /a231 /a232 /a233 /a234 /a235 /a236 /a237 /a238 /a239 /a240 /a241 /a242 /a243 /a244 /a245 /a246 /a247 /a248 /a249 /a250 /a251 /a252 /a253 /a254 /a255 ] >> endobj 1288 0 obj << /Length 1473 0 R /Filter /FlateDecode >> stream xÚ3P0CS3S…C. ̇'çr9yré{ú*”•¦ê‡Õé{%õœ õÝôÝô]llô½t õósJsóŠªìì¸<]ôŒ#Î:ÿÇöÿß÷ÿ·oõÛ »¿×¹YLtýþÖôÖº Ù[®8;¶20r¹zrÒ…A§endstream endobj 1473 0 obj 134 endobj 1289 0 obj << /Length 1474 0 R /Filter /FlateDecode >> stream xÚ3P0B#Ks…C.K0ßÌ,˜œËåäÉ¥ïé«PRTšª®`©ï”Ów pV0ÔwÓwvvÓw °±Ñ÷VÐ5ÔwÎÏ)ÍÍ+V°´³ãòtQгÿ°08p¹zr‡»&zendstream endobj 1474 0 obj 102 endobj 1290 0 obj << /Length 1475 0 R /Filter /FlateDecode >> stream xÚ3P0Bss  #…C. $d NÎåròäÒ÷ôU()*MÕªÓ÷P0Õw pV0ÔwÓwvvÓw °±Ñ÷VÐ5ÔwÎÏ)ÍÍ+*²³ãòtQ°®ÀÄ ÀåêÉ£ Âendstream endobj 1475 0 obj 102 endobj 1291 0 obj << /Length 1476 0 R /Filter /FlateDecode >> stream xÚ3P0B#cSs…C. $d OÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(èÔÿGßÿß_û7·lGöÄ>íýë®go8ÔÀÁÐÀåêÉÄU30endstream endobj 1476 0 obj 126 endobj 1292 0 obj << /Length 1477 0 R /Filter /FlateDecode >> stream xÚ3P0BCCS…C. $bb NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(ØIÅÿ;Ñ%_ööwÙûÝåww¿»û=ïÛ÷êêíµ·÷½½_ìõÿ#ƒ—«'I¡-?endstream endobj 1477 0 obj 135 endobj 1293 0 obj << /Length 1478 0 R /Filter /FlateDecode >> stream xÚ3P0B]C KS…C.K°ˆ™T89—ËÉ“KßÓW¡¤¨4U?\ÁRß(«ïà¬`¨ï¦ïìì¦ï`c£ï T®ïœŸSš›W¬`igÇå颠gÿ>;ÜÿSÿÿƒ—«''@'-endstream endobj 1478 0 obj 110 endobj 1294 0 obj << /Length 1479 0 R /Filter /FlateDecode >> stream xÚ3P0CCSC…C. Ä7…Pɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.OÍÙ<´ª^+Ð^á¸×6>|ÿõ×]6 H4x µˆ²:&¬h¾Îê˜X[ñÿõºßë.ݺñ6ëŠi–„C—«'F3Tendstream endobj 1479 0 obj 157 endobj 1295 0 obj << /Length 1480 0 R /Filter /FlateDecode >> stream xÚ3P0BC#Ss…C. $bf NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(¨ðÿGçÙêÿƒ߿і߽£€‘A€ËÕ“ [´.‘endstream endobj 1480 0 obj 116 endobj 1296 0 obj << /Length 1481 0 R /Filter /FlateDecode >> stream xÚ3P0B#cssC…C. $djOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº((¶¶È²s^^î¯hïÈöåËìË×¾ü_rÿÿ/ßÿ`°múÿ¿k_gÿÎÌÍ]š«S¶6j+F¢ ƒ—«'ôR5êendstream endobj 1481 0 obj 151 endobj 1297 0 obj << /Length 1482 0 R /Filter /FlateDecode >> stream xÚ3P0B#CcK…C. $df OÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(¨‹óWÿþñèûýí÷¿ßõ÷úû땊_ÿ¾^ýûß®ý{Këë—~ûÿ+üþ×/÷_¿úýoßú½õUUÿ¾~_ÿ†Á…ËÕ“ ù²ACendstream endobj 1482 0 obj 161 endobj 1298 0 obj << /Length 1483 0 R /Filter /FlateDecode >> stream xÚ3P0B#c sC…C. $djOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(s8k8Ê|¹ª*»J)Àã]ó Ûxÿÿßÿ¿mó'îË)&q¿YTTò˜y4T†©¾zúÿ÷¯÷gæèö‡­j1XÀÄ ÀåêÉš[9æendstream endobj 1483 0 obj 169 endobj 1299 0 obj << /Length 1484 0 R /Filter /FlateDecode >> stream xÚ3P0B#SSs…C. $bfNÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(Øh ‰ßþúêß¿©ÿiÿþ«×¼­ÏþŸRºþ=P dÿïzïß樂·ëßý×k÷_ýþ·tãëûqÿã>02p¹zrSð@òendstream endobj 1484 0 obj 162 endobj 1300 0 obj << /Length 1485 0 R /Filter /FlateDecode >> stream xÚ3P0BCK …C. $dNÎåròäÒ÷ôU()*MÕªÓ÷P°Ðw pV0ÔwÓwvvÓw °±Ñ÷VÐ5ÔwÎÏ)ÍÍ+*²³ãòtQP[8ÿÿF.WO.ÁÊ@endstream endobj 1485 0 obj 103 endobj 1301 0 obj << /Length 1486 0 R /Filter /FlateDecode >> stream xÚ3P0B#cssC…C. $djOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº((¶·È(¼¼¼Ü¯Ã«Dzɯ¼Éÿ}¯_?þëoMÛÊõÿOŠ^ÿýÛÛ¶Ç^Ýz+L"ZômTÛ ƒL \®ž\*}6$endstream endobj 1486 0 obj 156 endobj 1302 0 obj << /Length 1487 0 R /Filter /FlateDecode >> stream xÚ3P0B##sC…C. $djOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº((1â(yyy­Àä*~Ͻ¥µæ¿âëë&zHÿüOu÷¯G×]ûºuák㮘&:¶20r¹zrH2Sendstream endobj 1487 0 obj 150 endobj 1303 0 obj << /Length 1488 0 R /Filter /FlateDecode >> stream xÚ3P0B#CcSsC…C. $d OÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(¨ssi¾|ݯÀä///ÕßÛûÿýTÀ ÀÈåêÉÜô1“endstream endobj 1488 0 obj 124 endobj 1304 0 obj << /Length 1489 0 R /Filter /FlateDecode >> stream xÚ3P0BCK#cs…C. $djOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(ØÿG€¿ÿ÷ï}_)ñÄrýûýïw´+\`hààrõäý-¥endstream endobj 1489 0 obj 122 endobj 1305 0 obj << /Length 1490 0 R /Filter /FlateDecode >> stream xÚ3P0Bs#SsC…C. $bfNÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(˜Ê(‰\-½>±jÿøó!ýÿ§F0³ƒ¡ËÕ“ *í0endstream endobj 1490 0 obj 120 endobj 1306 0 obj << /Length 1491 0 R /Filter /FlateDecode >> stream xÚ3P0CSs#…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAó_ƒ‹BÁ\v¿¹VŠý%ίñ^ª5÷¾üÛóßþÿÿE/­MÔˆPU8ì"4×áˆPËBV‡¢7 ™N$Ìbmmõ~ýɧþÿÿÒû—î—Þ »Î£šp0'lmTÛD¯B&.WO.tÓ@Åendstream endobj 1491 0 obj 190 endobj 1307 0 obj << /Length 1492 0 R /Filter /FlateDecode >> stream xÚ3P0CsKC#…C. $âèä\.'O.}O_…’¢ÒTýp J}¬¾S€³‚¡¾›¾³³›¾K€¾·‚®¡¾s~Nin^1P™—§‹‚RÂñ»õwë^ÿÂïñßcÚäßíÿúíõÿ_yûÿ^ªÿWÿþë—¯ÿkþëÿåúõÿKæÿûïùÿݾù÷_ÿ÷ý·ÿËÝúß—¯ÿß÷eýúåßýª¯_{m#ƒ—«'µUÄendstream endobj 1492 0 obj 186 endobj 1308 0 obj << /Length 1493 0 R /Filter /FlateDecode >> stream xÚ3P0B#SS3C…C. $fn ‘HÎåròäÒ÷ôU()*MÕªÔ÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº((2Ÿ*Èg‘QxÈÎy¡äµß¼×þO¤ç;²}h~½äï®ÿÿ­ÐÐT“ÜÄ#õÔ"ëÐA­C¡K½š–¶z³:&lâeäY,¡›X¤ ~)þÿ¯Û¿" ÝXÿ¶:lmÔÖ¬+ zx04pp¹zr‚xDÈendstream endobj 1493 0 obj 202 endobj 1309 0 obj << /Length 1494 0 R /Filter /FlateDecode >> stream xÚ3P0CscC#…C. $âèä\.'O.}O_…’¢ÒTýp J}¬¾S€³‚¡¾›¾³³›¾K€¾·‚®¡¾s~Nin^1P™—§‹‚²ƒû¼à_ÿ~ õ‘A€ËÕ“ Ø;endstream endobj 1494 0 obj 109 endobj 1310 0 obj << /Length 1495 0 R /Filter /FlateDecode >> stream xÚ3P0B#S3Ccc…C.3°˜¡D&9—ËÉ“KßÓW¡¤¨4U?¨Tß$­ïà¬`¨ï¦ïìì¦ï`c£ï­ k¨ïœŸSš›W TfgÇå颠Ũ’`ÞÄÎaÅ'Pòòòr¿Ýë^4u4îQ¿|u¯ýñß÷?ñ¨qÈ Tøs¾|ùòõ½]r»^4õb_îùòå_õ_õÿãæÿƒ·µÿ¯ýßZº?:ìÚ5 m¹ß'²øk×ߺuë>î —y<" ,\®ž\æ$Q2endstream endobj 1495 0 obj 209 endobj 1311 0 obj << /Length 1496 0 R /Filter /FlateDecode >> stream xÚ3P0C SC#…C. $âèä\.'O.}O_…’¢ÒTýp J}¬¾S€³‚¡¾›¾³³›¾K€¾·‚®¡¾s~Nin^1P™—§‹‚÷¬Ææýõÿÿþÿ¿þýÿ×ÿïÿŠÇýÿ¿ýÿÿ¯¿ $úúÿ”¼ÿ‰"ÿÿBqàBÿ?nü[ÿ/ýnà`hàrõ䔸xöendstream endobj 1496 0 obj 164 endobj 1312 0 obj << /Length 1497 0 R /Filter /FlateDecode >> stream xÚ3P0BC3cC#…C. ,d`–HÎåròäÒ÷ôU()*MÕªÔ÷Éê;8+ê»é;;»é»ØØè{+èê;çç”ææ•ÙÙqyº(رÊÿûÿûß Íw÷·ï.ûžwOvwÙÛÛÛooÏ» bµoÏûö>ï÷Þ·¿¿/6ˆÿ¹õk×ÛîÝ&v°)âkmܵõYWWs]1XØÊÆåvŠA‰ËÕ“ o9I¾endstream endobj 1497 0 obj 182 endobj 1313 0 obj << /Length 1498 0 R /Filter /FlateDecode >> stream xÚ3P0B#ScKC#…C. $fn‘HÎåròäÒ÷ôU()*MÕªÔ÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(pÿGÿþÿþ}ï{{ó‰,©ÿŸ¸ûÿþ¯¿_¿öˆ…C—«'"ª8@endstream endobj 1498 0 obj 131 endobj 1314 0 obj << /Length 1499 0 R /Filter /FlateDecode >> stream xÚ3P0C SC#…C. $âèä\.'O.}O_…’¢ÒTýp J}¬¾S€³‚¡¾›¾³³›¾K€¾·‚®¡¾s~Nin^1P™—§‹‚äÉ×ßwÅÿ{õúï÷uûïÆ¿Þ÷õß6íÿÙ¿ãÇßúw ~×ÿwÓþßÛõþïëu¿¯Ç¿ß[z¿êtýú¯Ûãÿ^/ýW÷ÿþ®׿_ß·ë߯׿_ÁÐÀÁåêÉÍzSÙendstream endobj 1499 0 obj 187 endobj 1315 0 obj << /Length 1500 0 R /Filter /FlateDecode >> stream xÚ3P0C3cC…C. $âèä\.'O.}O_…’¢ÒTýp J}¬¾S€³‚¡¾›¾³³›¾K€¾·‚®¡¾s~Nin^1P™—§‹‚r¢Bã¦‡ì‡ø—_~ùåï—õõõŠSßsØ WÕÚçû¯ÿ»·öÿúßÿÿúÿÿßÿÿë^ÿ½Ýëu×]º#~ýú =«¯·Þßz[&ž½aGbAÂŽÿ0p€…ÁËÕ“ W!Tšendstream endobj 1500 0 obj 188 endobj 1316 0 obj << /Length 1501 0 R /Filter /FlateDecode >> stream xÚ3P0B]csKCS…C. $fh`‘IÎåròäÒ÷ôU()*MÕ*Õ÷Ië;8+ê»é;;»é»ØØè{+èê;çç”ææ•ÙÙqyº((-ž`pžEFá\ã!~Η/lÔV/_¾üÞ¼¶] oò¬ÕPøÐ¼`Þ\õåáËׯí}_õ7nÿŸ¼ö_öÿƒSùÿwÿÿ÷÷ßO &¹í_ï×g¿ºõ6?::»mê†Ý^[O˜$m¼µuõ­­YW Ö:s]1Xpбibaƒ—«'AK[†endstream endobj 1501 0 obj 223 endobj 1317 0 obj << /Length 1502 0 R /Filter /FlateDecode >> stream xÚ3P0BCSsCS…C. ,d`–HÎåròäÒ÷ôU()*MÕªÔ÷Éê;8+ê»é;;»é»ØØè{+èê;çç”ææ•ÙÙqyº(hWb¬pxÈÎaUòòòòØË_þ ÜÌçkª»7oúíóöï­ýÿïÿßÚÿ¿þýG«ÿÿ»þÿÿúûÿ®_ÿ¶þÒö·U72›­_}ëêÛ¨­YW Öh,xÀÄ ÀåêÉ®äWendstream endobj 1502 0 obj 190 endobj 1318 0 obj << /Length 1503 0 R /Filter /FlateDecode >> stream xÚ3P0B#SSsC…C. $fn ‘HÎåròäÒ÷ôU()*MÕªÔ÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(X±4±s5$²-´µºï·rÝ«öן¤¬[ø=¿Èï›ÿ÷÷ÿ¿ÿ÷ýÿþ~Ã{ö›<çüæßøûžÜ‡•RAkŒS2D<¤ï}¯Üô÷ÿûÿ±¿£³Û¸»ö_}[¶6j+6&'ƒ#—«'³EH½endstream endobj 1503 0 obj 201 endobj 1319 0 obj << /Length 1504 0 R /Filter /FlateDecode >> stream xÚ3P0Cs3C#…C. $âèä\.'O.}O_…’¢ÒTýp J}¬¾S€³‚¡¾›¾³³›¾K€¾·‚®¡¾s~Nin^1P™—§‹‚…t$kjÁ‡ßÛ÷¾¯¯þ}ϱéŸôÃßµ@øûý¿û¿ÿ߯¡ÿÿóÿÃ@Üþÿÿ×ÿ­_ÿ+þõ¿éq{õö¨,ŒúumëÚlî¶› Œ \®ž\Ppendstream endobj 1504 0 obj 174 endobj 1320 0 obj << /Length 1505 0 R /Filter /FlateDecode >> stream xÚ3P0B#S3cC…C. $fn ‘HÎåròäÒ÷ôU()*MÕªÔ÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(¨:apž…O DFÝo®UÉËË_^þRˆ¿Ç!ïï¹×VíËÿË×þ/ÿÿwÉø¶>þß¿ík×ÛözDtfÂÁœð­µQ[«ÃÖh‡-låÑ0X2£‚¡ƒËÕ“ WŒF[endstream endobj 1505 0 obj 182 endobj 1321 0 obj << /Length 1506 0 R /Filter /FlateDecode >> stream xÚ3P0C3C#…C. $âèä\.'O.}O_…’¢ÒTýp J}¬¾S€³‚¡¾›¾³³›¾K€¾·‚®¡¾s~Nin^1P™—§‹‚KýT0Áâ<„¡àSËQ  \®ž\É > stream xÚ3P0B3Cc…C.°¥9X<9—ËÉ“KßÓW¡¤¨4U?¨Pß(©ïà¬`¨ï¦ïìì¦ï`c£ï­ k¨ïœŸSš›W TegÇå颠ÅX°jõúõ…×ÖÿGdÉçñPþ&.WO.î: endstream endobj 1507 0 obj 126 endobj 1323 0 obj << /Length 1508 0 R /Filter /FlateDecode >> stream xÚ3P0B#S3cCcC…C. $fh`‘IÎåròäÒ÷ôU()*MÕ*Õ÷Ië;8+ê»é;;»é»ØØè{+èê;çç”ææ•ÙÙqyº(pÿ‡ƒ‰ 5 ?¿üªµ¯µ›¿§ú÷OžõŽf_~ù»ê÷ë·ÿýÿÿßQûwý×»ÿoýºõßõÌÄÖÃÜ]¿~г¿ž ägoØÛ*p¨™•A€‘ËÕ“ V$endstream endobj 1508 0 obj 185 endobj 1324 0 obj << /Length 1509 0 R /Filter /FlateDecode >> stream xÚ3P0C3C…C.3ˆˆ¢“s¹œ<¹ô=}JŠJSõÃ*õ=@²úNÎ †únúÎÎnú.66úÞ º†úÎù9¥¹yÅ@evv\ž. ª‡™[$gè TÀËU¯qÙsX9¾|yéå÷µñ¯ÿþ­úÿ¿þÿÿëÿÿý/ýý?únþÖ«mÛÄ$Âl¿ßäu|¿õÚµÙ‰‰k 6$lüX¸\=¹dqIñendstream endobj 1509 0 obj 176 endobj 1325 0 obj << /Length 1510 0 R /Filter /FlateDecode >> stream xÚ3P0B#SSKC#…C. $fn‘HÎåròäÒ÷ôU()*MÕªÔ÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(pOeØÿ;øûÿÛþÚõ‡£½ÙÄåýd=ÿ¶üë­·e»c I$,`bPàrõä …@¤endstream endobj 1510 0 obj 141 endobj 1326 0 obj << /Length 1511 0 R /Filter /FlateDecode >> stream xÚ3P0C#CC#…C. $âèä\.'O.}O_…’¢ÒTýp J}¬¾S€³‚¡¾›¾³³›¾K€¾·‚®¡¾s~Nin^1P™—§‹‚Kýàƒ—«'Ê/Ðendstream endobj 1511 0 obj 103 endobj 1327 0 obj << /Length 1512 0 R /Filter /FlateDecode >> stream xÚ3P0BSccKsC…C. $dhOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(ØñÆÿÿÿÿC—«'+·oendstream endobj 1512 0 obj 106 endobj 1328 0 obj << /Length 1513 0 R /Filter /FlateDecode >> stream xÚ3P0B#s3C#…C.3°˜¹)D"9—ËÉ“KßÓW¡¤¨4U?¨Rß(«ïà¬`¨ï¦ïìì¦ï`c£ï­ k¨ïœŸSš›W TegÇåé¢`Ã.ÿÿÿÿMÒl÷î½½_DïóËÞï¢òí`tw÷m0:Ëèý>02p¹zrš!8Oendstream endobj 1513 0 obj 139 endobj 1329 0 obj << /Length 1514 0 R /Filter /FlateDecode >> stream xÚ3P0B]C#C#…C.#°˜¡1D&9—ËÉ“KßÓW¡¤¨4U?¨Tß$­ïà¬`¨ï¦ïìì¦ï`c£ï T¯ïœŸSš›W TfgÇåé¢`Æýüþ¶ ÄúÁÐÀÁåêÉ‘Ý1ªendstream endobj 1514 0 obj 114 endobj 1330 0 obj << /Length 1515 0 R /Filter /FlateDecode >> stream xÚ3P0B]c3KCS…C. $fh`‘IÎåròäÒ÷ôU()*MÕ*Õ÷Ië;8+ê»é;;»é»ØØè{+èê;çç”ææ•ÙÙqyº((;ym¸©zØHÀBáå!¾¹V%///ùKqæ{…EkYxÚª_®ýòeÿ·×ÿý)½¢ÊÍÚtb†éÁT3G ¡–…‰Z!+´BDY[6„8Gªˆ9.ñe:˜°!dþ};¥Yýÿÿz×þëu×—æ\çQMá)­[µ·5ëŠÁÂV ƒ .WO.—¥Sžendstream endobj 1515 0 obj 237 endobj 1331 0 obj << /Length 1516 0 R /Filter /FlateDecode >> stream xÚ3P0B#K#C#…C. $fn ‘HÎåròäÒ÷ôU()*MÕªÔ÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(ذÔÿ‚©Œûäó†~ç#ƒ—«'FX&cendstream endobj 1516 0 obj 116 endobj 1332 0 obj << /Length 1517 0 R /Filter /FlateDecode >> stream xÚ3P0BC a`¤bÈeb20K$çr9yré{ú*”•¦ê‡Uê{€dõœ õÝôÝô]llô½t õósJsóŠÊìì¸<]´ëÿ£Ï‰+ä¶Ì+<Ì;Êkïßÿ~€…ÁËÕ“ «3endstream endobj 1517 0 obj 122 endobj 1333 0 obj << /Length 1518 0 R /Filter /FlateDecode >> stream xÚ3P0C#C#…C.#ˆˆ¢“s¹œ<¹ô=}JŠJSõÃ*õ=@²úNÎ †únúÎÎnú.66úÞ º†úÎù9¥¹yÅ@evv\ž. fÜÿqL \®ž\Úç0Yendstream endobj 1518 0 obj 101 endobj 1334 0 obj << /Length 1519 0 R /Filter /FlateDecode >> stream xÚ3P0B#s3sC#…C. $fn ‘HÎåròäÒ÷ôU()*MÕªÔ÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(¨1v½¿þnÝ¿Þs<~ýÞôÿµ/ëþÇï[·ÿwÕëßï½ÿïûúµ~õïëñ÷–þý¾~ýýª_û¯þ}½þßý—uß¹\=¹ÌyEÐendstream endobj 1519 0 obj 168 endobj 1335 0 obj << /Length 1520 0 R /Filter /FlateDecode >> stream xÚ3P0B#S3SC…C. $fn ‘HÎåròäÒ÷ôU()*MÕªÔ÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº((;>UHobç°*h^î7×öÚ¼×þ ÷jª÷–̾üß?ð׿]ÿŸˆùÖÿÿÿD\}ë¿õÿ³ÿ‡]ÿ™[6µ»ïúÖì[[³®®È:Ô&"báÀÈ Àåêɼ’@xendstream endobj 1520 0 obj 183 endobj 1336 0 obj << /Length 1521 0 R /Filter /FlateDecode >> stream xÚ3P0C3C#…C. $âèä\.'O.}O_…’¢ÒTýp J}¬¾S€³‚¡¾›¾³³›¾K€¾·‚®¡¾s~Nin^1P™—§‹‚kýÿÿÿÿ4²ÆÿÇ >02p¹zr½:Ìendstream endobj 1521 0 obj 111 endobj 1337 0 obj << /Length 1522 0 R /Filter /FlateDecode >> stream xÚ3P0B]CKSS…C. $djOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{•ë;çç”ææUÙÙqyº(¨>ȼà¡UÉË‹\å-ÒKä}/Õš{¿}½ú÷åÿ_¿Üÿ·Âÿÿ]¿zÝ¿©û3ss—æèIxÚšuÅ`Á¡†.WO.NÁ<þendstream endobj 1522 0 obj 161 endobj 1338 0 obj << /Length 1523 0 R /Filter /FlateDecode >> stream xÚ3P0CcS…C. Ä7…Pɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.O;wÇ—õKÿMÿÿ²êõëõëv¯]÷Znß&ç¿e¿¿ý®û]»ïïþÚ}÷ó÷ï³ÿ˜¸\=¹èp7endstream endobj 1523 0 obj 143 endobj 1339 0 obj << /Length 1524 0 R /Filter /FlateDecode >> stream xÚ3P0CcSSS…C. Ä7…Pɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.O ~ ÇË ^û+j¼Pø•7ùåþ—¯/ÿ ¹\=¹wÀ4™endstream endobj 1524 0 obj 120 endobj 1340 0 obj << /Length 1525 0 R /Filter /FlateDecode >> stream xÚ3P0BCcSS…C. $bj NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº((rÿ‚猋ÿOæ™^»ÿÛßïoÿoÿw?ÿïþo¿¿¿ýþñúêß¿`apàrõä¥í4˜endstream endobj 1525 0 obj 140 endobj 1341 0 obj << /Length 1526 0 R /Filter /FlateDecode >> stream xÚ3P0C#S#C…C. Ì7Sɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.Oõó¾m_»öµìê‡Ø#OË·¶:|\þC—«'Ó`%ãendstream endobj 1526 0 obj 124 endobj 1342 0 obj << /Length 1527 0 R /Filter /FlateDecode >> stream xÚ3P0CcS…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEÁÌU±:ûúÛõówýú»éï:Ûø×÷Uä¯þ]¿ú÷¯ðÿ[÷Ö×{ýû7õïÿ]ñdzÿÆÿ`hààrõäõÛ6Bendstream endobj 1527 0 obj 147 endobj 1343 0 obj << /Length 1528 0 R /Filter /FlateDecode >> stream xÚ3P0CcSSS…C. Ä7…Pɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.OÓnGöË/}bo£~¹ªþåþ×ÿóÿƒÀûKÿ¿íÛ¶Û›·È¹ëöÖ1;@ÂX¸\=¹jà7Íendstream endobj 1528 0 obj 142 endobj 1344 0 obj << /Length 1529 0 R /Filter /FlateDecode >> stream xÚ3P0BCcSCS…C. $dbOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(ع)Nÿ îÿ_¿l{éîØ–ë*w¬{ÿj·oÙ¬Ž ƒL \®ž\Y:9endstream endobj 1529 0 obj 134 endobj 1345 0 obj << /Length 1530 0 R /Filter /FlateDecode >> stream xÚ3P0B3cs3…C. $dNÎåròäÒ÷ôU()*MÕªÓ÷P0Ñw pV0ÔwÓwvvÓw °±Ñ÷VÐ5ÔwÎÏ)ÍÍ+*²³ãòtQ0Šoà`hàrõ䘢…endstream endobj 1530 0 obj 102 endobj 1346 0 obj << /Length 1531 0 R /Filter /FlateDecode >> stream xÚ3P0C 2SH1ä2òÍÀTr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEA™¥EFáåååþJuM¼/_šÿµÍ÷ÿíåx«ýÿõ¾—ùÛ¦];Ì™¼5ëêj. †.WO.|2 endstream endobj 1531 0 obj 140 endobj 1347 0 obj << /Length 1532 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3#  …C. 22Š'çr9yré{ú*”•¦ê‡ê{¥õœ õÝôÝô]llô½êõósJsóŠªìì¸<]T”]}­2ÿÝŠß6}µìz>‚æ's¶oØpMŒ_¦þÿ.WO.Nw%endstream endobj 1532 0 obj 130 endobj 1348 0 obj << /Length 1533 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3cKS…C. $ff•HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº(èIíÿ¯Ìü~òjüÿÿ$¡Â;‘ÅÿÿC—«'…K.òendstream endobj 1533 0 obj 124 endobj 1349 0 obj << /Length 1534 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3ccS…C. $ff•HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº((7‡ÿ?qõ?À ÀÈåêÉê.endstream endobj 1534 0 obj 108 endobj 1350 0 obj << /Length 1535 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3CK3#…C. $fn•HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº(ØpþŸpú? 6p04p¹zrD„+endstream endobj 1535 0 obj 110 endobj 1351 0 obj << /Length 1536 0 R /Filter /FlateDecode >> stream xÚ3P0B]CSS…C.°˜L"9—ËÉ“KßÓW¡¤¨4U?¨Rß(­ïà¬`¨ï¦ïìì¦ï`c£ï T¯ïœŸSš›W TegÇå颠Éýþ|Ȭÿ3mÉþ·ÿ·ÿ»Ÿÿwÿ·ß¿Ìû÷ëkAÌ÷÷þýûþý{F.WO.;n:xendstream endobj 1536 0 obj 140 endobj 1352 0 obj << /Length 1537 0 R /Filter /FlateDecode >> stream xÚ3P0B]CSS…C.°˜L"9—ËÉ“KßÓW¡¤¨4U?¨Rß(­ïà¬`¨ï¦ïìì¦ï`c£ï T¯ïœŸSš›W TegÇåé¢`#ÿï¤Ê¿÷»ëîÉî.“{Øžwx;ï‚»»—½Ïû½¾Úÿÿ¿¿­z[6uëÁ¦0ë°µ‡&ä1(0q¹zr´_7®endstream endobj 1537 0 obj 157 endobj 1353 0 obj << /Length 1538 0 R /Filter /FlateDecode >> stream xÚ3P0B]CSs…C.°˜™T"9—ËÉ“KßÓW¡¤¨4U?¨Rß(­ïà¬`¨ï¦ïìì¦ï`c£ï T¯ïœŸSš›W TegÇå颠zG«¡¹å廹8îµUûýzuÕÿ°¯ÿÿÿUûw½þÿïþ¥¿—î{½eí:Õä­YWW$zX1(0q¹zr¨æ?¡endstream endobj 1538 0 obj 159 endobj 1354 0 obj << /Length 1539 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3Cc3#…C. $fn•HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº(¨-˜ÿgúà'‹éÿ, \®ž\Eß4¡endstream endobj 1539 0 obj 112 endobj 1355 0 obj << /Length 1540 0 R /Filter /FlateDecode >> stream xÚ3P0CcK3…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAóH»Ÿ@É÷(EÛ‡ìòc£¯ß³û³\ð¿¿¿,Ÿë\õåž/ÿÆíÿZõâ÷þ­ûvMj㉹k¿£¹y…˜ ¸\=¹£7ôendstream endobj 1540 0 obj 162 endobj 1356 0 obj << /Length 1541 0 R /Filter /FlateDecode >> stream xÚ3P0BCScS…C. $bbNÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(Xõ¼°ÿ×~ýßË¿žÿ?Yöúýíÿããë×íû»ÿׯW¯ÿ»þßËÒÿõÿsóö¿^ÿûÇ»õÿ¯Öçí¿ÿUþ׿¸\=¹5öD×endstream endobj 1541 0 obj 165 endobj 1357 0 obj << /Length 1542 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3cS…C.c°˜™!T"9—ËÉ“KßÓW¡¤¨4U?¨Rß(­ïà¬`¨ï¦ïìì¦ï`c£ï T¯ïœŸSš›W TegÇå颠> stream xÚ3P0CSS…C.SÈQɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.Oå‰+ú–þÇêÿ×_»üû­ÌÄe;úU,y¯{+{ËõÌm‰, \®ž\³Û>Lendstream endobj 1543 0 obj 133 endobj 1359 0 obj << /Length 1544 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3sS…C.s°ˆ™!T89—ËÉ“KßÓW¡¤¨4U?\Á\ß(«ïà¬`¨ï¦ïìì¦ï`c£ï T®ïœŸSš›W¬`ngÇå颠<ý? øÁÐÀÁåêÉ‹G%õendstream endobj 1544 0 obj 103 endobj 1360 0 obj << /Length 1545 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3KS…C.K°ˆ™!T89—ËÉ“KßÓW¡¤¨4U?\ÁRß(«ïà¬`¨ï¦ïìì¦ï`c£ï T®ïœŸSš›W¬`igÇå颠gÿ|`dàrõ䃼%1endstream endobj 1545 0 obj 103 endobj 1361 0 obj << /Length 1546 0 R /Filter /FlateDecode >> stream xÚ3P0Cc 3c…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEA9õÿÿÿÿ‚;[¾È‰ïåM‰_"7W}}Éþû—þƒÁÛøÿ[ë®]m3svø~ë֭ä8¸\=¹­ä6endstream endobj 1546 0 obj 146 endobj 1362 0 obj << /Length 1547 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3S…C. $ff•HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº(èùø?¬ÿÿõßþÿpý¯Þ=í¨k¾O쨱Ïß~ÿßoð¿ý/ë[êT]ÛÚÚÔÀÁÐÀåêÉù <endstream endobj 1547 0 obj 148 endobj 1363 0 obj << /Length 1548 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3csS…C. $ff•HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº(èÙÿ‡ŽËþÿÿ)Ùá=19[ÿ‡Á…ËÕ“ 9]/endstream endobj 1548 0 obj 119 endobj 1364 0 obj << /Length 1549 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3c#3…C. $ff•HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº(¨pª-¨µ›ï/¾§}¾ïË/÷æÿÚ÷ëÿíÿ`°õõïø·úoTÛv¬™ð?vÝuÞ2î~°Ä&.WO.Ó3:öendstream endobj 1549 0 obj 150 endobj 1365 0 obj << /Length 1550 0 R /Filter /FlateDecode >> stream xÚ3P0CC3…C. Ì7Sɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.O+Ž€€f_¶•/¿­pL‰\åøEÞÿßßÿ¿¿¡ÎY~“äýä=6Ëy>-rhÝûçÂÿÿõ±k·lü¶Ö™K"€‘A€ËÕ“ âó6±endstream endobj 1550 0 obj 158 endobj 1366 0 obj << /Length 1551 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3Cs…C. $ff •HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº(hž+aoâknyyy> ïǽ¶j_¾Ì¿7ÿëßËÿ± \®ž\Ê;âendstream endobj 1551 0 obj 132 endobj 1367 0 obj << /Length 1552 0 R /Filter /FlateDecode >> stream xÚ3P0BS#cS3…C. $dNÎåròäÒ÷ôU()*MÕªÓ÷P0Ñw pV0ÔwÓwvvÓw °±Ñ÷VÐ5ÔwÎÏ)ÍÍ+*²³ãòtQ0“úßÀÁÐÀåêÉœ”"endstream endobj 1552 0 obj 102 endobj 1368 0 obj << /Length 1553 0 R /Filter /FlateDecode >> stream xÚ3P0B]CS#CS…C. $f“HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº(Xñÿ‡–úw~"ÖûþýcP`ârõä}Z%Îendstream endobj 1553 0 obj 113 endobj 1369 0 obj << /Length 1554 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3 2UH1ä2@bf†P‰ä\.'O.}O_…’¢ÒTýp J} ´¾S€³‚¡¾›¾³³›¾K€¾7P½¾s~Nin^1P•—§‹‚Âñÿ˜à_tý.WO.œ(-±endstream endobj 1554 0 obj 107 endobj 1370 0 obj << /Length 1555 0 R /Filter /FlateDecode >> stream xÚ3P0CcS…C.cÈQɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.Oµ%ÁÓÿ#ƒ¿ÿ¿¿®]º?±ðI{ìïØuWœ¹˜¸\=¹Â•/þendstream endobj 1555 0 obj 120 endobj 1371 0 obj << /Length 1556 0 R /Filter /FlateDecode >> stream xÚ3P0B]Cs##S…C. $ff•HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº(¨ëÿGsØìÿÌÙÿÿÿ÷=í¦µ`apàrõäXJ.Áendstream endobj 1556 0 obj 121 endobj 1372 0 obj << /Length 1557 0 R /Filter /FlateDecode >> stream xÚ3P0Cc#3c…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAmé08Ïyˆùå—¾Oøür¯ÝìËÿÃïÇÿ®K}Û[Ÿýwéß– ×E'Éßz[õpEƒ—«':È<Îendstream endobj 1557 0 obj 147 endobj 1373 0 obj << /Length 1558 0 R /Filter /FlateDecode >> stream xÚ3P0B]C sJ1ä’ 13S¨Dr.—“'—¾§¯BIQiª~8P™¾PZß)ÀYÁPßMßÙÙMß%ÀÆFߨ^ß9?§47¯¨ÊÎŽËÓEAëœ ›Bã…‚¹V%ÎbŸlY¤/_Ê÷÷ýýõÿ®—abBM59¤T4Zjq5ò|UâîhZ$¨tm¿"ûÿÿ×£ëc¯n½™"tµïêj®+šŒ \®ž\± ;‹endstream endobj 1558 0 obj 183 endobj 1374 0 obj << /Length 1559 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3sS…C.s°ˆ™!T89—ËÉ“KßÓW¡¤¨4U?\Á\ß(«ïà¬`¨ï¦ïìì¦ï`c£ï T®ïœŸSš›W¬`ngÇå颠<ý?> stream xÚ3P0BCc S…C. $bbNÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(hß¿ëIûï¥ÿ·{ÿÏÿ²¿öõë·×ÿÍþ[_õïË׿ÿý£ÿWÅïg`ärõäM-1aendstream endobj 1560 0 obj 140 endobj 1376 0 obj << /Length 1561 0 R /Filter /FlateDecode >> stream xÚ3P0C 2SH1ä2òÍÀTr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAóÐ!¾æ–—ï¶8ù>d_roÞÔï×õÿú¯p-ûÿIñ—ùûÿ¿Í~»îÒ†CÖÆ]]‘èÌÅ ÀÄåêÉÈ4«endstream endobj 1561 0 obj 145 endobj 1377 0 obj << /Length 1562 0 R /Filter /FlateDecode >> stream xÚ3P0B]C3cS…C. $ff•HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº(è±~¨¨¨¾÷Éj>ÿáÚ}÷ÿ~ÿßïÿÿßþ‡€××ÿÿÛ·ëÿÒÓã¦sŠX›¡ÁÐÀÁåêÉÐg;endstream endobj 1562 0 obj 150 endobj 1378 0 obj << /Length 1563 0 R /Filter /FlateDecode >> stream xÚ3P0Ccs3…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAóH_ór¿¹-ß[¾Ì~¿|ýêû×-0ÿÛ®Ù»?zuöÖmSû÷fIµq1(0q¹zr5°1‘endstream endobj 1563 0 obj 142 endobj 1379 0 obj << /Length 1564 0 R /Filter /FlateDecode >> stream xÚ3P0BCc3…C.c°ˆ‰)X89—ËÉ“KßÓW¡¤¨4U?¨Nß(©ïà¬`¨ï¦ïìì¦ï`c£ï­ k¨ïœŸSš›W TegÇåé¢`ÌÉ9GEnÞÞEê­ü÷}}ÿÿdðƒ¡ƒËÕ“ Î-ôendstream endobj 1564 0 obj 122 endobj 1380 0 obj << /Length 1565 0 R /Filter /FlateDecode >> stream xÚ3P0CCKS…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAyú8øûïÛ'튾å¿ßqnà`hàrõä8¿*Þendstream endobj 1565 0 obj 116 endobj 1381 0 obj << /Length 1566 0 R /Filter /FlateDecode >> stream xÚ3P0B]C###3…C. $fj•HÎåròäÒ÷ôU()*MÕªÔ÷Jë;8+ê»é;;»é»ØØè{Õë;çç”ææUÙÙqyº(XY)I­z}âÓþÿppŽYþŸ_<ˆÅ ÀÈåêÉ·j+Þendstream endobj 1566 0 obj 119 endobj 1382 0 obj << /Length 1567 0 R /Filter /FlateDecode >> stream xÚ3P0Cc33…C. Ä7Pɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.OSÖ&¾æ–—ïv õ5ñ/¿únoÕ /nÖ¦/¡QÖ¦‘sY[¿žuýÿV{ÔõYWWdI02p¹zr¹P-ðendstream endobj 1567 0 obj 150 endobj 1383 0 obj << /Length 1568 0 R /Filter /FlateDecode >> stream xÚ3P0CCKSS…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEÁXÿ?0“øæôÿÿ¿O‡ß=ÜÀÁÐÀåêÉhP,!endstream endobj 1568 0 obj 115 endobj 1384 0 obj << /Length 1569 0 R /Filter /FlateDecode >> stream xÚ3P0C# S…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAmáÌÿŸþ£ƒŒ \®ž\¿:+Rendstream endobj 1569 0 obj 105 endobj 1385 0 obj << /Length 1570 0 R /Filter /FlateDecode >> stream xÚ3P0BCccS…C. $dOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(XMû[þúSòþK¿ëׯ~oß׿/_ÿþ7oû¿/ëÿ/ù÷ÿÞÔÿ  \®ž\j2Ãendstream endobj 1570 0 obj 137 endobj 1386 0 obj << /Length 1571 0 R /Filter /FlateDecode >> stream xÚ3P0CccS…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAmé(xÂ}INîû§P;ùí÷ÿ} ü­z}½eãë¨C‡8¸\=¹9¡1ãendstream endobj 1571 0 obj 128 endobj 1387 0 obj << /Length 1572 0 R /Filter /FlateDecode >> stream xÚ3P0BCc#S…C. $dOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(XHÖÿVQz{ûÛÛûeïw—ßÝ]wwÞýíù·çñ¬ÿÃàÀÂåêÉS‹(èendstream endobj 1572 0 obj 129 endobj 1388 0 obj << /Length 1573 0 R /Filter /FlateDecode >> stream xÚ3P0CcSS…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAm‰cÿ׿õñ׿>9þúe=>x¤êo}C—«'óy9xendstream endobj 1573 0 obj 119 endobj 1389 0 obj << /Length 1574 0 R /Filter /FlateDecode >> stream xÚ3P0B]CSSS…C. $djOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{•ë;çç”ææUÙÙqyº((1â(yyy¹‹â=*ßKµæ÷¦/ûïûÿ—‹‡ù øwÿj¤}fÝýë™Ño ¦ID‹f]]p¨M„Á…ËÕ“ –˜5vendstream endobj 1574 0 obj 157 endobj 1390 0 obj << /Length 1575 0 R /Filter /FlateDecode >> stream xÚ3P0CcCS…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAmé(øÓ–Rÿÿ“„£p)ûÿ&.WO.gå,tendstream endobj 1575 0 obj 114 endobj 1391 0 obj << /Length 1576 0 R /Filter /FlateDecode >> stream xÚ3P0CC33K…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEÁBü¿†ýdð¹±þ#ƒ—«'=î'sendstream endobj 1576 0 obj 107 endobj 1392 0 obj << /Length 1577 0 R /Filter /FlateDecode >> stream xÚ3P0BCcSSS…C. $bjNÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(˜²´ÈZ•¼|R¿Dúºç^û×%ÿÿíÿÿw}ô¯·ºë$¼Õ,~ÇíŽæÑn—ÿ÷.Ëþmþû[a×3#ÞFmÍ’`dàrõä›5endstream endobj 1577 0 obj 160 endobj 1393 0 obj << /Length 1578 0 R /Filter /FlateDecode >> stream xÚ3P0B#cSSS…C. $bj NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(X±¶È¨;^þâºørÉ|ß׫ÿo³ÿÿ:øÙþ[Ñ1Ó´_«Y„g7³nüÿ¿~ÿ'Öûÿþ`apàrõäT1:endstream endobj 1578 0 obj 149 endobj 1394 0 obj << /Length 1579 0 R /Filter /FlateDecode >> stream xÚ3P0BCcSS…C. $bj NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(XðÊÿ™ÔþûÛ÷ü²·7ÊÞX—ɘçIoϓ޻»î·Mþÿïÿ_Ý-½Ÿ«Ûº1lmÔV †.WO.F„0Mendstream endobj 1579 0 obj 147 endobj 1395 0 obj << /Length 1580 0 R /Filter /FlateDecode >> stream xÚ3P0CC 3K…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEÁNüÿä÷ÿ±€Ÿ\Ùÿ8¸\=¹ù90endstream endobj 1580 0 obj 108 endobj 1396 0 obj << /Length 1581 0 R /Filter /FlateDecode >> stream xÚ3P0CcS…C. Ä7…Pɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.O;÷ ÿÈ`ÿ¿¿yÛvdO’ ¯]wG\$ØÀÁÐÀåêÉDš1> stream xÚ3P0CS 2QH1ä2…òMÀTr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEÁÎÅHElÿßÿ¯¿ÿ_ÿ_íýÿë¿þç_ÿÿ«þ=ˆÊ2€Ä¯ÿõÑ@FÅ¿ùÿöþÍ ÀÈåêÉÚóGiendstream endobj 1582 0 obj 141 endobj 1398 0 obj << /Length 1583 0 R /Filter /FlateDecode >> stream xÚ3P0Cc3S…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAm‰c÷ÒÓ×íÛõeÿ¥¯×¯Ç˜ï¶M»^ºõëÖ£Ù*ö[ïo½ýýöÛïo¿ýö»vß}οŸ¿?A‰ËÕ“ Ç?Yendstream endobj 1583 0 obj 153 endobj 1399 0 obj << /Length 1584 0 R /Filter /FlateDecode >> stream xÚ3P0BCcc#SS…C. $dbOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(Xq²ðÍQßUâò½EÞßsÿ¯?á\œŽ)IB-¢¬"´¸£žýÿ»îÒÆWßDLy48¸\=¹ÔN*™endstream endobj 1584 0 obj 149 endobj 1400 0 obj << /Length 1585 0 R /Filter /FlateDecode >> stream xÚ3P0BCcSS…C. $dbOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(Xqr÷¨ß›7_éû‚c“ßÇýÿý4p04p¹zrå'-Èendstream endobj 1585 0 obj 122 endobj 1401 0 obj << /Length 1586 0 R /Filter /FlateDecode >> stream xÚ3P0B]CCSS…C. $djOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{•ë;çç”ææUÙÙqyº(˜6â(yyy‘À{[…»úþ«ïêÿÛÿ1V#"B•eIBzS€WÓ‚®Ž¤-ÎÓ›-ýzÂøõÿ·~½Î-›Ú&.šuuE¢3ƒ—«'SÎ7êendstream endobj 1586 0 obj 169 endobj 1402 0 obj << /Length 1587 0 R /Filter /FlateDecode >> stream xÚ3P0CcsS…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAmÁ}öö½ïUW?Ü'¿ýöÿúÚÿ·ÿÿÿwÿ?üÛ[ÿ·¶~½÷_½=ª‡"¾¶®Ñap`árõäùx5xendstream endobj 1587 0 obj 143 endobj 1403 0 obj << /Length 1588 0 R /Filter /FlateDecode >> stream xÚ3P0BCCsS…C. $bj NÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(hèÿ‡‚?}ÜÿçðñÉ~ÿ~€…ÁËÕ“ ý $sendstream endobj 1588 0 obj 114 endobj 1404 0 obj << /Length 1589 0 R /Filter /FlateDecode >> stream xÚ3P0BCccs…C. $djOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(ØETß¿3!ìï÷úÝ¿ê¯×í4¼ÿ?úò¿íí_WÕ_û¿ü{ü¯ªûÿ=÷ÿß«ýÿ¥ù?&.WO.ë^5øendstream endobj 1589 0 obj 148 endobj 1405 0 obj << /Length 1590 0 R /Filter /FlateDecode >> stream xÚ3P0CS…C.ÈQɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.Oeîÿè`6¯ÿF.WO.€,(Ýendstream endobj 1590 0 obj 103 endobj 1406 0 obj << /Length 1591 0 R /Filter /FlateDecode >> stream xÚ3P0CsS…C.s0ÈQɹ\Nž\úž¾ %E¥©úá æú@9}§gC}7}gg7}—}o]C}çüœÒܼbs;;.Oåéÿ‘À?&.WO.Ü&"Óendstream endobj 1591 0 obj 99 endobj 1407 0 obj << /Length 1592 0 R /Filter /FlateDecode >> stream xÚ3P0B]CCKs…C. $dnOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{•ë;çç”ææUÙÙqyº(X¼ý]_~ûßý»ÿþþûÿï÷ÿ@p}ý¯»¾ì¿ZúzÕëK_01(p¹zr\3mendstream endobj 1592 0 obj 135 endobj 1408 0 obj << /Length 1593 0 R /Filter /FlateDecode >> stream xÚ3P0BCccSs…C. $djOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(ØÄÿ }»ùþ÷ô>´›}ù¿ïÿøßõ`‰ºéÿ·~Ýz+"{’Lx}ìºC‰, \®ž\ÈK6endstream endobj 1593 0 obj 146 endobj 1409 0 obj << /Length 1594 0 R /Filter /FlateDecode >> stream xÚ3P0C#CsC…C. Ä7‡Pɹ\Nž\úž¾ %E¥©úá@uú@I}§gC}7}gg7}—}o]C}çüœÒܼb *;;.OÖX}¯ý¡Wkõ_Vý­úÿ5þ?ü~ÿ¿þ{ýÛÿù÷ËïþÝŸÏ ÀÈåêÉy­.òendstream endobj 1594 0 obj 130 endobj 1410 0 obj << /Length 1595 0 R /Filter /FlateDecode >> stream xÚ3P0BCccsC…C. $djOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(XusÈ(¼¼|W°¾EzÉß½µßŸu>Ⱦ|ùÂ5ÝWªJ_^_þßûþÿÿÿ¿þßû·î{tØ5©:ÕÑos[> stream xÚ3P0CCcS…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEÁ.þ? L8\?_ÿÿ.WO.–N#ðendstream endobj 1596 0 obj 107 endobj 1412 0 obj << /Length 1597 0 R /Filter /FlateDecode >> stream xÚ3P0CcSS…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEÁª›s¶ŠÜ®ª‡[^ÚÚ½¬ß¿ô?ü}·ÿÛú[Û¶­ñ–~›¸Æ`#Pì ƒ—«'+3lendstream endobj 1597 0 obj 139 endobj 1413 0 obj << /Length 1598 0 R /Filter /FlateDecode >> stream xÚ3P0BCccSSS…C. $dbOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(˜rsX8^^î¯ômB¾ï¥/_÷Úÿ÷Üÿ~ßÕÿŸ]uëöÚµ¦Y‡­uæ’`dàrõäâ0/endstream endobj 1598 0 obj 144 endobj 1414 0 obj << /Length 1599 0 R /Filter /FlateDecode >> stream xÚ3P0BCcccSS…C. $dbOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(XurXÌ{yQ|ï¥ÚÒüøúK?þÁÛ¹Þëßïz¿+:šW§l}–DÀ¡†.WO.} .,endstream endobj 1599 0 obj 141 endobj 1415 0 obj << /Length 1600 0 R /Filter /FlateDecode >> stream xÚ3P0CCcS…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEÁ.þ?øÁÐÀÁåêÉ2^#Êendstream endobj 1600 0 obj 101 endobj 1416 0 obj << /Length 1601 0 R /Filter /FlateDecode >> stream xÚ3P0BCcc3SS…C. $dbOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(¨pù4û¨­°»š0Íõãº_uÿßÿ¿ýýý†:gÉM,ümÖŸì¨T³þoWÿÿÚ-Ýx›uÅ`a+ƒ#—«')45^endstream endobj 1601 0 obj 158 endobj 1417 0 obj << /Length 1602 0 R /Filter /FlateDecode >> stream xÚ3P0BCccS…C. $dbOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(عýGûÿ]«û›{’Lx}ìº+ά Œ\®ž\<°,_endstream endobj 1602 0 obj 121 endobj 1418 0 obj << /Length 1603 0 R /Filter /FlateDecode >> stream xÚ3P0BCc#S…C. $dbOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(ØÅÿ‡÷ïßWT*žpŽ¿_û]lƒ—«'í}()endstream endobj 1603 0 obj 118 endobj 1419 0 obj << /Length 1604 0 R /Filter /FlateDecode >> stream xÚ3P0BCccSSS…C. $dbOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(˜rrX8^^Óý®‰÷åKó¿¶uö¯)\ÈÞrùßëÿKõV;»mjßÕÕa 5p04p¹zr9J1endstream endobj 1604 0 obj 148 endobj 1420 0 obj << /Length 1605 0 R /Filter /FlateDecode >> stream xÚ3P0BcCKSS…C. $bjNÎåròäÒ÷ôU()*MÕªÓ÷Jê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(¨X8\¿æ^úfóÔ?KÒX¸\=¹Öû)}endstream endobj 1605 0 obj 115 endobj 1421 0 obj << /Length 1606 0 R /Filter /FlateDecode >> stream xÚ3P0BCccS…C. $dOÎåròäÒ÷ôU()*MÕ*Ô÷Êê;8+ê»é;;»é»ØØè{+èê;çç”ææUÙÙqyº(˜¯¸¿e}tôÒ}/ó·M}]uëÞÆ[ûÖVÕÍ_>I>ìkiUø½©ß—Ö¾ŒÏ›î¹‘A€ËÕ“ H×1endstream endobj 1606 0 obj 146 endobj 1422 0 obj << /Length 1607 0 R /Filter /FlateDecode >> stream xÚ3P0CccS…C. Är@Tr.—“'—¾§¯BIQiª~8P¾PRß)ÀYÁPßMßÙÙMß%ÀÆFß[A×Pß9?§47¯¨ÊÎŽËÓEAmÁõÿŸ<íÿƒÀ©øÿÿ'y‚Ù?Ù6Çÿg`ärõäfÒ+$endstream endobj 1607 0 obj 120 endobj 1423 0 obj << /Length 1608 0 R /Filter /FlateDecode >> stream xÚ32Q0€ÃC.¶endstream endobj 1608 0 obj 16 endobj 1424 0 obj << /Length 1609 0 R /Filter /FlateDecode >> stream xÚ32U0€ÃC.·endstream endobj 1609 0 obj 16 endobj 1425 0 obj << /Length 1610 0 R /Filter /FlateDecode >> stream xÚ32S0€ÃC."¸endstream endobj 1610 0 obj 16 endobj 1426 0 obj << /Length 1611 0 R /Filter /FlateDecode >> stream xÚ32W0€ÃC.1¹endstream endobj 1611 0 obj 16 endobj 1427 0 obj << /Length 1612 0 R /Filter /FlateDecode >> stream xÚ3²P0€ÃC.@ºendstream endobj 1612 0 obj 16 endobj 1428 0 obj << /Length 1613 0 R /Filter /FlateDecode >> stream xÚ3²T0€ÃC.O»endstream endobj 1613 0 obj 16 endobj 1429 0 obj << /Length 1614 0 R /Filter /FlateDecode >> stream xÚ36P@ÀC.سendstream endobj 1614 0 obj 15 endobj 1430 0 obj << /Length 1615 0 R /Filter /FlateDecode >> stream xÚ36T0€ÃC.ç´endstream endobj 1615 0 obj 16 endobj 1431 0 obj << /Length 1616 0 R /Filter /FlateDecode >> stream xÚ36R0€ÃC.öµendstream endobj 1616 0 obj 16 endobj 1432 0 obj << /Length 1617 0 R /Filter /FlateDecode >> stream xÚ36V0€ÃC.¶endstream endobj 1617 0 obj 16 endobj 1433 0 obj << /Length 1618 0 R /Filter /FlateDecode >> stream xÚ36Q0€ÃC.·endstream endobj 1618 0 obj 16 endobj 1434 0 obj << /Length 1619 0 R /Filter /FlateDecode >> stream xÚ36U0€ÃC.#¸endstream endobj 1619 0 obj 16 endobj 1435 0 obj << /Length 1620 0 R /Filter /FlateDecode >> stream xÚ36S0€ÃC.2¹endstream endobj 1620 0 obj 16 endobj 1436 0 obj << /Length 1621 0 R /Filter /FlateDecode >> stream xÚ36W0€ÃC.Aºendstream endobj 1621 0 obj 16 endobj 1437 0 obj << /Length 1622 0 R /Filter /FlateDecode >> stream xÚ3¶P0€ÃC.P»endstream endobj 1622 0 obj 16 endobj 1438 0 obj << /Length 1623 0 R /Filter /FlateDecode >> stream xÚ3¶T0€ÃC._¼endstream endobj 1623 0 obj 16 endobj 1439 0 obj << /Length 1624 0 R /Filter /FlateDecode >> stream xÚ31T0€ÃC.÷µendstream endobj 1624 0 obj 16 endobj 1440 0 obj << /Length 1625 0 R /Filter /FlateDecode >> stream xÚ31R0€ÃC.¶endstream endobj 1625 0 obj 16 endobj 1441 0 obj << /Length 1626 0 R /Filter /FlateDecode >> stream xÚ31V0€ÃC.·endstream endobj 1626 0 obj 16 endobj 1442 0 obj << /Length 1627 0 R /Filter /FlateDecode >> stream xÚ31U0€ÃC.3¹endstream endobj 1627 0 obj 16 endobj 1443 0 obj << /Length 1628 0 R /Filter /FlateDecode >> stream xÚ31S0€ÃC.Bºendstream endobj 1628 0 obj 16 endobj 1444 0 obj << /Length 1629 0 R /Filter /FlateDecode >> stream xÚ31W0€ÃC.Q»endstream endobj 1629 0 obj 16 endobj 1445 0 obj << /Length 1630 0 R /Filter /FlateDecode >> stream xÚ3±P0€ÃC.`¼endstream endobj 1630 0 obj 16 endobj 1446 0 obj << /Length 1631 0 R /Filter /FlateDecode >> stream xÚ3±T0€ÃC.o½endstream endobj 1631 0 obj 16 endobj 1447 0 obj << /Length 1632 0 R /Filter /FlateDecode >> stream xÚ35P@ÀC.øµendstream endobj 1632 0 obj 15 endobj 1448 0 obj << /Length 1633 0 R /Filter /FlateDecode >> stream xÚ35T0€ÃC.¶endstream endobj 1633 0 obj 16 endobj 1449 0 obj << /Length 1634 0 R /Filter /FlateDecode >> stream xÚ35R0€ÃC.·endstream endobj 1634 0 obj 16 endobj 1450 0 obj << /Length 1635 0 R /Filter /FlateDecode >> stream xÚ35Q0€ÃC.4¹endstream endobj 1635 0 obj 16 endobj 1451 0 obj << /Length 1636 0 R /Filter /FlateDecode >> stream xÚ35S0€ÃC.R»endstream endobj 1636 0 obj 16 endobj 1452 0 obj << /Length 1637 0 R /Filter /FlateDecode >> stream xÚ35W0€ÃC.a¼endstream endobj 1637 0 obj 16 endobj 1453 0 obj << /Length 1638 0 R /Filter /FlateDecode >> stream xÚ3µP0€ÃC.p½endstream endobj 1638 0 obj 16 endobj 1454 0 obj << /Length 1639 0 R /Filter /FlateDecode >> stream xÚ3µT0€ÃC.¾endstream endobj 1639 0 obj 16 endobj 1455 0 obj << /Length 1640 0 R /Filter /FlateDecode >> stream xÚ33P@ÀC.¶endstream endobj 1640 0 obj 15 endobj 1456 0 obj << /Length 1641 0 R /Filter /FlateDecode >> stream xÚ33V0€ÃC.5¹endstream endobj 1641 0 obj 16 endobj 1457 0 obj << /Length 1642 0 R /Filter /FlateDecode >> stream xÚ33Q0€ÃC.Dºendstream endobj 1642 0 obj 16 endobj 1458 0 obj << /Length 1643 0 R /Filter /FlateDecode >> stream xÚ33U0€ÃC.S»endstream endobj 1643 0 obj 16 endobj 1459 0 obj << /Length 1644 0 R /Filter /FlateDecode >> stream xÚ3³P0€ÃC.€¾endstream endobj 1644 0 obj 16 endobj 1460 0 obj << /Length 1645 0 R /Filter /FlateDecode >> stream xÚ37T0€ÃC.'¸endstream endobj 1645 0 obj 16 endobj 1461 0 obj << /Length 1646 0 R /Filter /FlateDecode >> stream xÚ37R0€ÃC.6¹endstream endobj 1646 0 obj 16 endobj 1462 0 obj << /Length 1647 0 R /Filter /FlateDecode >> stream xÚ37V0€ÃC.Eºendstream endobj 1647 0 obj 16 endobj 1463 0 obj << /Length 1648 0 R /Filter /FlateDecode >> stream xÚ37S0€ÃC.r½endstream endobj 1648 0 obj 16 endobj 1464 0 obj << /Length 1649 0 R /Filter /FlateDecode >> stream xÚ37W0€ÃC.¾endstream endobj 1649 0 obj 16 endobj 1465 0 obj << /Length 1650 0 R /Filter /FlateDecode >> stream xÚ3·T0€ÃC.ŸÀendstream endobj 1650 0 obj 16 endobj 1466 0 obj << /Length 1651 0 R /Filter /FlateDecode >> stream xÚ³0Q0€ÃC.d¼endstream endobj 1651 0 obj 16 endobj 1467 0 obj << /Length 1652 0 R /Filter /FlateDecode >> stream xÚ³0U0€ÃC.s½endstream endobj 1652 0 obj 16 endobj 1468 0 obj << /Length 1653 0 R /Filter /FlateDecode >> stream xÚ³°T0€ÃC.¯Áendstream endobj 1653 0 obj 16 endobj 1469 0 obj << /Length 1654 0 R /Filter /FlateDecode >> stream xÚ³4P@ÀC.8¹endstream endobj 1654 0 obj 15 endobj 1470 0 obj << /Length 1655 0 R /Filter /FlateDecode >> stream xÚ³4R0€ÃC.V»endstream endobj 1655 0 obj 16 endobj 1471 0 obj << /Length 1656 0 R /Filter /FlateDecode >> stream xÚ³4U0€ÃC.ƒ¾endstream endobj 1656 0 obj 16 endobj 1472 0 obj << /Length 1657 0 R /Filter /FlateDecode >> stream xÚ³4W0€ÃC.¡Àendstream endobj 1657 0 obj 16 endobj 1282 0 obj << /XObject << /Im19 1284 0 R >> /ProcSet [ /PDF ] >> endobj 1277 0 obj << /D [1279 0 R /XYZ 72 786.278 null] >> endobj 1265 0 obj << /D [1279 0 R /XYZ 120.194 102.296 null] >> endobj 1278 0 obj << /Font << /F15 393 0 R /F27 394 0 R >> /XObject << /Fm19 1266 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1661 0 obj << /Length 1662 0 R /Filter /FlateDecode >> stream xÚÕZKoÜȾû ¿@·P€‡Ë~ð mlÊ®½‹X›²A {4Œ8ä,’µ¿>U]ÕMrDYNN6ˆÝÍê«ëñUÕˆ³þÄY*ÏÒ, ešm¯ÄýݹÖ0F”:Va¬±÷áÆQnTfIü½HB•(Z÷ûëWß]*u&¢0ò³ë¥¹.ÿüáüß×{õöÚO‹CÇ/ŸÉôlq™®,nš²*Üá»KÏ”†³i¦úóùFå:x3vUs{¾‘JUS UQW¿CÕ646ì 6T°/ºòá\fAÑñHÕãSÛs™{³Å—wøÏ”ôb×vDÙ™cgzÓàËÁ/®‚vGϲ ^“ßÌ¡íÏ3„ø!À}:ûFàmäö ®`¶R"ø¾º¥Æ[úð’¹=޽)_/ÌQ r"_dYæ©c™[³76€9íÊÊZ„2NyŠXY3•Êø}Ñ”¸T´Àèî¡ê ­\ 4L[J·¥XßRHf©[3ZÙ3Séή¬Âüÿ‹1¥)©] |WIÊ|qW½¹G)1]Q#-ˆAu0v‰ÜÞPãCm»Òt| ^åWñÞ}@I,B„‘H‰±Ý¼n+§*°j„“ÂS3°‘$•›D…ÌÈ×olŽ—m3\t]ñ¸&usƒ£µ®÷$::(ˆGÐxàaEÖ¬PÎí“Dž°…½ êÿUÐݸÆŽd X»oI…t0XrZ‡ÜÎÙ™®#±mÕ¯Ù†¿a.Ì—?½¿þùïWÿ¸¸~»òÑ LPN,«fMpXù‚àJn•x•Ý$"Þá‡dy°m™[ ÊßÐÓ¨eJfÅ·g ÿPÕ5Ýc²€ÉJÓo»Š‡ÊAMŠaO ‚‹ÞÐ ›D:¥ >=«“t"æOÛèFÚn mv½3Bû orçè-O*j8ÎkaÝŒ‘ÛI`­OÅv¨WŽ+u¦‘â#4íÇHqÿö\9n*ÂD»ãN Žh)IžÙEå0EÍuÞYŹ•sP{’öšÆ^¦¡sãE:¦©‹îÖÞEœuAŠ/*¼ä8emà òÎ$= Yцù‡âî|Z{ìÝÔ/ßÞ‚¹­©³cÙêí*‰‰¸£ù´±-.¹8kcy‘“|JvèYJ=KLÊ™Db¾é¯6‹éja¸išÚç̶ú5Ú”¼ÙÕÀÓ™þ¡«†ÁðvÕ°§ÖÁ œÝX¯þþ~h”U¿Ѳ#EÐ0ʦ¼«¬ãƒþÂÓS,<ãœ`eW„#A:¢|ž‚ä3!Áõ¯Ý€¯‡•õc¢”ø¢å7*à~åÜ¢€ëÃhΪ’€+ÚxKXo/À"$x1»BèadÉ3è’¡ALn¨ã¹E‹¡†dá.˜üàœ`¤’·,ºº"é‘Ò‰0ÏæÍܦdzÖ0‚R’(»zMRd^O(Hí‰îçrýg(d˜¦é·à /.ß½AÜ÷T(t<ƒF :@ àëiô‡£hðYÐÃ#ðtQØbˆeëÑ3¾ºD-õÆ)ÞP¼-µƬ`±Ó@hì“,´ŒQà™ËƒÕ-¦ƒb›=5´\ÚÁ¶{zÞŒš-4'°?ãaE®Ã$v x,ºÞ|,v‡µˆB+«lŽ…ÍÍÝY”{Ëg|ØW6U·_¨1ébžœÉ37 Ø’cð$òdÁý` ÒiÆ> Eç½­G²ÚiòL(,ÒPë쌅cXœó°ß¾8é| À'Z㇡£Ì<;ŒéœòÙ¯z¹-lx”¢¡²6ŸÑ´ìÍ€Q¶ÀM þO}A‹¹y81l=~ƒ„ε.²#¹ËŽLŽì¶" Êßoâãš–«(›% ßÿòã/C‰o?Muýx4âótš¦J€ƒˆÏ³OÍ“æhOKví8@‡XëÑM1>—ÙDw½ÌIa+h^Õ€¨8Ó’õ¨=4N%E“VþV²R.…‰²'ÁÏ6ÉØ¶]uhìd{•§¸=>PÃã8øÙZW›gÁ_÷`fDâýÜ7¬ÀÈ6 ^£YÁ‡ñ¦kÇ¡jLoGDð*L? ¯e ¬mHâ……ÆoŸïŠc d°Æ •$ŒÐ61„CoÊgZb>­"Ö†w¤”€J4ߎ•.Ô€Q4«Ø™š{©ºÙÄ\Kâ y~ÞÝ[yß·Íö ¼},5ª“JWs½)þ”s½© Ú£•„šz[uÜS`ê¶$ ¬€€Làô…"™jZ*OÈÊ™×çœùÊuÌ™—˜ 1:Y/Ä@(ì½ï—XÖ×´(¦Ä´oEp™>Ak‡—õä•‘ª4»b¬GbhÔy—?ùµø+ˆ@zÊ@â8†[X?^o&h•QA-$…8™Ù4>&φ=Jˉ 3ÓŽ6C›â—RÍqš{ìÌ}ÕŽ½M… ÷°}rbš®œ6ÙuíÞ -¸œôÔ‘ö¢áÒ. Ð2Zq·ZŠ ¯G<R8Ê¢ï«[V [x.ËÎ&õ°ƒðÒÒƒ½rUR÷ä»´ÈçU¤èÛƒñnD2‚Z§“BéªQI“0…èðë7*÷‡˜¦X³)QåbAÍQ+Ø;Zzâ>[pŸ²IÆÆ}Õ #êpeŠ)R¬Oÿ6VÉ›ôZ¶˜ë̹}üÒÔÕʈ9¡k»ê¶Be#óBÇž ^WRî ‚ÄTÛ0¦¢ :t±ˆZ/ž†ÐÑ |ŒÁð Ðcæ¶Á¬ŽYáƒgAøO´ ôïVö1§g1·%ÕîiÝ¢±õè½9‚iÝV”òO€®¡TS5ð³§çÏãˆs˜1ÎÖP ÐföqP°Ð*> ì];ªeRp´#}MšöZ°áü1”z[þNõÌÔX7Ê¿ AB¤”‘ŽÕ©ÓÚÜÜÕóT9ý~Q*×Ê®$ç¹±1 ¢ÀøÚ-%&¶±5Ëo÷áVyp‰Z o²Ø_ªiµ~(:v·hƒ QlÁ;OW!¦Š$âéѧ_GH¾Å! ÿKÊ~ŠY55³™òŸ‘K² 6'›0ýtDx˜Ðg–_„‘` þ-Ïì''ÖÛxÿsi«¼É·‚c?€à½1Ç~­ø«yçx@.¨P¹’º‚˜Æ¦®²˜=48a•iŸ°š¿µ2­Ð›ŒÆÕæˆÂÕR5Cª˜·ÐS‚Ü.äâDgz€ËçŸß‡?  朔æú+å/›¾ê]ZÝ nMc:ÖcìÖǽKQÔ£û•Rëê Eyä ñ#àØ{ö“6qAY">ÅQoÌéݪLËôç…»ÃQ|wwæZ?Ð}.îÉÝ'ˆÝé’°T®Ÿ—ç×Z/S‚ûU4U¾~GW€õÿô%¿Ñ§~A5éͱmrE˜£×~ÿ‘‹P'.CW¶ãMm^ªnǾø[LuþÝ#Ç&¹û™C´¨Í¹£¡´çš~Gí<¹p…ÉŽm@¶D´t‘ó´†5iåJªz+Ô¬¤ Î×`¯¡²ª"¢{Óh¥Ã#ÅðõìHéV­¹àëò~Øš@ œÎb­Ø~'¾GÍkO‚).…ô78«8`ç²>ŒÝ’¼5y [Ñ"ÑM?KNá˜/óõÛ¢v\ݎ󨢜Raêbø—Õ_(j_Qq ðøÙ\IôbªDJ*‘ÌTdUÕsqº<%ågTð¿Ò*&…endstream endobj 1662 0 obj 3495 endobj 1660 0 obj << /Type /Page /Contents 1661 0 R /Resources 1659 0 R /MediaBox [0 0 595.273 841.887] /Parent 1664 0 R /Annots [ 1663 0 R ] >> endobj 1663 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [482.362 133.989 496.302 144.898] /Subtype /Link /A << /S /GoTo /D (subsection.7.3) >> >> endobj 1658 0 obj << /D [1660 0 R /XYZ 72 786.278 null] >> endobj 1659 0 obj << /Font << /F33 497 0 R /F27 394 0 R /F15 393 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1668 0 obj << /Length 1669 0 R /Filter /FlateDecode >> stream xÚÕZKä¶¾;‡ü…/ÖÛ²HêÅ\;ökÇv’C‰3-¬ZjKjÏŽ‘ŸzQnÍά“Ëb°Û|É"YõÕƒRWü©«L_eyê,¿*Ÿ¨+þ{{åKßBSƉ “kÏî<åÎ$až&ÏÑ«44©áy¿¼ùäóׯ\©(´‘½º¹#š›ê_Á¯ÿ}óÍ'_ßLÃ’0N’ç¹A²x1¹Î6&ݵãM_´Ã]×p¡Ï_«dA—Å2 ÿézÇ&øâzgŒÅØ×ï°ã¾±¤‚‡ºi¸t{½Óyà¸RvmYŒ®…¨Ç=÷{!z}› k¯µ Æï–³w<äØCAgAu*Ý<˜¾Ú Ÿ;…`‰ÛŸ"·2“ÄÁè÷XŒ5¬@mÝþ&²>Êk`x_ôE9º~¯w‰RÁ›‘;ëÁSûÒtÔZœÑ:ÚU#´iX²–% þ¹“Íb-Wèø× n0ZmmhŠy•ÄCëù×½ƒ3®\žË ˆºµaªâ@2qã†Dê¦UHŒd[bÄ·K 7 à ‹Ÿ¤Ö#jôM ¹÷z‘Ø>õEã¾÷ÏÈÁÇ0ÇýãP—°«KIˆÁ|«|–„´ö†t?NøcqüÀ’•¨ß{îf¸ÀÒ¡èßÊ¡ïkL ë™@Àž´ë?)÷HÌ\~ÊCº~înº{êÊ£@$@x_JÀr¼Ãd ¸6”¹§rd7k1“€#,1l³ÌÊfQ­ç9ö5›O® ñ žË㑬¶ã&µ5 ®Ù¸¥„âz0ËÝ·¾›d K/,eB;_Hylƒ¿"Ã!7\EN’ÖN¢¡þÍíjÐ#_”˜=èTL]cÁ¥Z¦;ön˜qh&GÎ83õ}ˆÍy„ §A=·àO´L\ÊôÅ0¾Â!Fè÷ã Sò=ï6œ¾ÍXåÓY~ÊÕÞÝûÂeùXe$PÆþT‚.;nEˆ¨Hü5‘>¬TFY(’L>ãßßüíïoþñÅÍ׺“fpøÞ>?ì»ÁñxR`AûÇùS&ÆëÛñæñèÔWxܳ«0×ÖSÃ]Í90×àƒ¯¡p)&gQÌýÍ>ü-ÚŽ5Ó˜”nõHrÄ$"a²‚ƒ˜B\nN«,ŒµyÙáéÐZ¿½Ýâ¶p9VŒ<({çÝè|¡»àÒ€;€rÉuLèÕiܨŸÿÒ1À=Ò¾6"€<Ìg‰ö8Ò,«q¤‚º`—Dükì¡æÓÿ¿eÑêy,‰üBèÞÕû-غF«82KÔÄQƒüö÷§ƒ×?˜ÕuÀ*yfG4ˆQ”¹ µ%§[±ïí•/}˶cuÞv€J'çs*?mœžžÑáÜ ¦9ì"«åPéG`PwÊî´é´ŸTØT“"ž$œé¹á-i©;b!FÀ¿å^2L)à}‡Üx@t9M&ZÄ-Pœå¸¶¸W$×4ÜãÞ‰"—£ä:þ%ç›è/œgìV<Üg5^_çqÐ-“ß¹±o˜Êr¼P:Ï_@KU> áÆ&¿D„Š}6Ìñ¹nËxcæ%H°‚ÿ-HIý/I¦©¼² ·:8s^°‰(ÌZg‹»]\­‰ […Øçä’­‰L˜Fñ2Ô¨[š9¹ÁOÆG+˜»t^`·+¬æYð딾 6æ,€ŸÇˆÒä&˜¯1#£‰t ô“9¸^¹¡ìë[b³8mâYø·.Ieq˜Çù ®;Mæ)$qÎV¼É:qÖ¡‘ÃNVE þÚE’VÃ&q%ö{㼓{@:ske7`h£ýbiÞ²'²žˆIÌJÓµ–ÑâD> @”+Nu4 -š¡c’Ö¹Š6­'pÞÀãN5ýPáßùa«´pÍV ¡sï‘q-Y"ÛpG©Ê|ÎW-Í L¸òѰŸìâ*ÁÕ#3pݵմÜÚŸš¬€×¥5øì ŸŸê|nbÊ ìBìsHò}Yn•¥ öcHs‹Òý|ìθlÀ\ª\Í®s–iŸ‹²™äGúšó#ØBZE½r™Ø÷èŸ#(̲à3µ•{ǽÙl&Ǭ1öé”/ÞDx$“ò gæ}ïÕNQÛ"™Æ6xswFÒrì.1„ÏKBoÅÜ;q± <çöâ(æ±Ð²–òyF>“¹VG³{gO/ÏÞ¦ôüb¸¡a¨ï[¨í(¤ö_côk›¦C®ˆ^<Š ßMO6ïe¬¨÷²"8')+Îm™çliöL‘C¾¦+ä²TòÑçL´L–ñûÜyxì®>8.Ü¿êL¼yèìÝ|7¨ìàp&Á?M˜ÂSÖ2Rrjbhk·œ•¬N–MV'yÇ>I$ÉAR“yt)ÞÆX/­X<“VÌɰ+Ïägê‡}Ì#>ü6–*~i@âc߉P÷cÍ2V2SùK9(zOæÆË¬hq,ú‘s“âMÄùœ|ô©/h[Í<|Æ—üÁ ÒHìå¸KS´»œßH$ÇÉ13tÖò[ñë.M™Dó”«gßËKáw/’à¸kºžÅÖï\3p™½~(ˆyÎf±,.|–‹,åÁ¡ ÷›+Ã|·"³­Lž•›2ÿ4´ÝŠË­ åµpTM}ûÔ«f2‡ä1 îĺe%Á­µƒï’Mr’(%ŒUqz‰RÆÛõ£ö:I1N‰ÄUrt¤>ITÔ°j/¯ŠœHÆÖóç0ìDz@Éy÷6š‰9…‘Í9zBZ¦7²é+ÚÜG­eñ?äl”Ì|ÍÌ'>‘…_N3XO9_ŠÆ®µ»»Û¸ ¬yšù[”×~ËùÛž99ž¨ >Ê«ï¤å‰|d%a”d°÷|gk~OFò2!iÂÿ1y…õÐÚl7–È}<_‚²®aD$ƒÞPð·!Ôsh–s@IÏ<ò6ÞËûÓ˜MoL‰÷ehêÁ0™Á0Û/1Xâýc?ôRÜ.pL(~YY©–ýq4#g°e¨m+û¥O§°˜&^ÇÙ™1Fþ”…¨àon2yüØðŒòëj•‡ã{B‹U°òs£¿rÐ×ÙÀö{WT‚A 0*·«xxð/~@WWþ…™¾ƒ1Úß  $lê9tî„fºÜdz¼&Îî?øì°WZ\önŽ´ µâHZ®wJ阒R0#½ÿdI ð‘ßÚàG|ý{ïFÉë~w„dqðúÚÒgIÈ/|âq*ÂÄ@˜X>€—oŠ™SäØ?ÑþÕ)Q³¥ÁÊüÕT‚[oÈ8B»1çÀƒ9`K1òÌ_Nüm04Ú; GkæÌ_Fîðž–¯q瀲 !ôN°ñu±ø@?¢X¡±zÉf_"™S0×»ÖI¡1ý›UÂ-².·’ÎCc×W®Gµ2™¨t®(9^XÎxéú§øÐyIåÙ,~ÏGŠò%‰ÿÞÓçG‹O,9=`-w¢‰v2ÕZ4ñ2)4 nž„:ÑÏ¥m´Vb.}âfSc¬¾xT6:Ôú=‰¡ÿÃo,> endobj 1670 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [121.151 544.648 140.545 555.557] /Subtype /Link /A << /S /GoTo /D (subsection.5.15) >> >> endobj 1671 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [504.329 237.7 518.269 248.609] /Subtype /Link /A << /S /GoTo /D (subsection.5.5) >> >> endobj 1672 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [450.459 147.851 455.913 157.548] /Subtype /Link /A << /S /GoTo /D (figure.7) >> >> endobj 1673 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [451.036 134.302 464.975 143.999] /Subtype /Link /A << /S /GoTo /D (subsection.5.7) >> >> endobj 1665 0 obj << /D [1667 0 R /XYZ 72 786.278 null] >> endobj 345 0 obj << /D [1667 0 R /XYZ 72 182.393 null] >> endobj 1666 0 obj << /Font << /F33 497 0 R /F27 394 0 R /F15 393 0 R /F37 380 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1677 0 obj << /Length 1678 0 R /Filter /FlateDecode >> stream xÚ•UÉnÛ0½ç+t¤€Šw±·©n§úÖ-1•Ù2$9Aúõ!iÇvÜ…³ðqö¡XVÂÇ2Ã3SiÊM•Õë+–Åï>ÛsŸ@‘R ª$J¯ )4Õ¥Ê ¡h¥âß-¯®Le¬¤¶´Ùò.`—Í7²l}^H©I·ÉyEf?n\E–¨xÚæ7$X$›]ÄLó¸«çÝè§xÒ}O\ŸÌÑVE|Ý}/™ôÍÁq¼ÅùÜ«!wÄfá$ðnïi^˜Š‘) !ÚØ sþcù1+˜¦Vh X42}DÃ.f™¢2 5¤ñS=v«\TÍ­ŸkSü¨”â¡dÕ‹|B·ÐyèV˜GÁ UÖœô*N¯ô¥ú¢úðkï6mBKQÊŽL܈ i2H³Òì8Í›Å:µn¼ªIàǶ«Ñ}]tÉ·‹âÔú¾/ܪÑv¸ž>!6Ø… šµ©û]ãÒ¥ø*C¥Þ»œYKø2®Br ¼:)^·9›½i{ÐÀTÔó0>]ðg%Õú¿»N#@€%F-3ÄÄ$¼Ú ^[nŠ4Täc\’Ïþ!‡åó¸êFþÅZòµûí‹[ˇ‡›æX°°pZä6l%Í-¾<Ñwyòt¼„i’Á)˜fZGb€þêýòùo°ßCm!PÉ_û{pΨ›ñÏ߆玸à”sõ÷ÿÓƒ³vendstream endobj 1678 0 obj 745 endobj 1676 0 obj << /Type /Page /Contents 1677 0 R /Resources 1675 0 R /MediaBox [0 0 595.273 841.887] /Parent 1664 0 R >> endobj 1674 0 obj << /D [1676 0 R /XYZ 72 786.278 null] >> endobj 349 0 obj << /D [1676 0 R /XYZ 72 664.978 null] >> endobj 1675 0 obj << /Font << /F15 393 0 R /F27 394 0 R /F37 380 0 R /F30 512 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1685 0 obj << /Length 1686 0 R /Filter /FlateDecode >> stream xÚ½]oã¸ñ=¿ÂèË)ÀZ'~H¢î¥Ø½vÑí¡(® pÝ>(‘%Ÿ$_6‡þøÎeÙq6¸¶(Xäp8œï2j•ÁŸZ•zUº"Õ¥[mö7jÅ«8ú`Œis“ægo ®#æZÛ´ÊŠ×ðmž™]­•«Òzu…úڤƕ+ù¼ä/žtò¢bͬ~Œœâ ?ϸøöã^g«?ô7?Þ¬~¼Ah‹¬Zkð <Ógñú«ŒÎŒT:-tÉG¼®€³²´TÅoPÀ%_'(•ÿf¨Yk]ØÔñ5_Y'Þvõ°®5©Î‹¯Ëú1<»¶¥KÜwQð\ƒ(ùBá–•õ7žç©«ô[úþß;\‘–_?öû]=Ô›É,ýge¬ûŽ«d;ô{†nûîVWÉijïûýá;þÒß®u™4~èxáoý¾îÒÛµsYr·}ÖÃÐßj—0Æ&£Ÿx@Þ«'Û£“§]`x:!Ø]Ã3vØÓá!tuË`C…Ž×ëø=†ôAÙÁÎÞõÃìsn? µ¿|«Õß4YêÜÉtŽæß^ÄÝ®•üt ‡“ Êü”!Gdä…9±1àlT SírЛ¤.œ0tØ¡Žq„a†z›xºíÊp6hü Û9ùúÁd^ã§:´rhÍ©¨?NgÔ`¡}L»=NMr#™©gL¶ù•¤uæqF«äš #‡> µ” £3<œ `"Û‹}×ðÞŒNÃdÓQþ‚I̘˜÷l–|š¼!§€ÁηÅíà`ÀÀD9ÅPÒR’tÂŒ}bhÝ4Wó1#{B+t²'¬ƒ'ŠKLϯÒͳÛ,Í*ÁzÇÎË¡à8 ¸.ÚWBjôUd0 Іij%:îÃ$XÓPw>å(5ç0ä8_¤ •%÷õgÑ04¾æjÇfURs@Ï–âÅóÄ¡–¦Â=O¸¥„໯¼:í–T8›¸?páêX¤LȆ°ÇÄÆYc¶¸¨ˆ‹ô¤˜ [SRC‹ñÌ@¢º÷â_ cœòžd5„Ì~õEÖ¥2ÉO»Z|bl¶;Q? .½Ä¦'To•ì~Å¡~Â’íÛ¢ŒnY E¦#%?ƒ#ÊfÊŒ£MO:0´)=¯ÍÁ w%ˆù‰?[ß   bfD<#ç¹MþÚ ”Á‹È`°ø™ñîA±ãÙ(U+¥!ØDÿ_&LÇ¡£H4JA„ßóâ)äU, D;I17íÛòBÃ@Áaʇýà <“£ÒU›1Và¶lÍ U4ŠcS-ãZ‰¬ˆñB’«FèR‡ÛRÉ@¿ .h®Zß^É ¦„‘‹ „%KâØ™&±Äá”oõŽå@g銇:à0Ó8ºoëî1å|Çq6ð‚¯ãkÎð2‘ Ù‡‹¯‰²E9¿ˆ¼“+)VÌ+†BT¹SA›È•> …sQª\ œ{‘rÙµ”É"_9|/í4FR°dÙ¢»†É¦…» ]§!EÈËöÅ Šr*Í3|g30¨ ¾ŒÄg÷Çùþ‡¯<_¹K’yjsûúÿ}LªËâõ§t^~ó%½H jÖÿÏé6uöͽq7¿$£µ¸¿Fs\äAÅGvËëI–v\{_§¢¨3—Ú‹{ ½¹ãCGίôÔˆáŒ.ø•Uÿ¥Æk3=³h¹«â »%åIj[ïyÃ⥟Åcñʈãøf¬åU[çñ™7.žñÍ¢[_¼êÍÒÙ2U&ëYOk•U¼e–Ê^¤NµÎ_÷Õ‹VUendstream endobj 1686 0 obj 2672 endobj 1684 0 obj << /Type /Page /Contents 1685 0 R /Resources 1683 0 R /MediaBox [0 0 595.273 841.887] /Parent 1664 0 R /Annots [ 1687 0 R ] >> endobj 1680 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 280.999 400.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1688 0 R /Length 1689 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kd à’ÏÈOí·endstream endobj 1689 0 obj 30 endobj 1690 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 280 400] /Resources << /ProcSet [ /PDF ] >> /Length 1691 0 R /Filter /FlateDecode >> stream xÚÝVMnõ6 Ü¿Sø‚Hê‡í°áX:’«^lÖ'OIÙBÖÅ"ö,P9%á¸ÎµÇsÅÞ'^Z%HÌÎ6ÛaSA¡½Zž*áj6޹†œîË¹Ž¨AÒÏ{¢ÈÙ¦ h¸#JŸ6룧}_%EáÒdþÁ [(³ôAE|ÒósÁžw·¢ìw›8£†ž²¬ÖÉÔu4ñV÷ŽåÊ?¸.©o[²–ÆÀs+tHÀ¤8Ï+Õ‚÷{HC9ÓÙyfùÆø»SÔ"t0 ¤¤EÎ!z;ÖÐÆcýQÐ '‚ÔœídØdùÃf}ò4Œ+!,Rªž[Qœ€6'”h.;ß? ÷@êš2—x²Ø¦Eµ];Ö»—ŠÉHå@¤T0JAuÄÚš¢¯pq z(WìýâŒl‡æ´#F›õÉÓ܇‚e´ ª 6\“§41z1¤éÀÞ¯¬)”„†(y :Î%œYk &VŒQÀN ':¤éì© §V'‰“€À8¦ÄŽ.•rSö–ðp®Øûeê±³Ï-è«nœè 5eŠ8Gv¦Z çî©(ªb ÂòtL>Ê]éæ:VèJÙ‰ü‰:0>#Û´1§C®mÒÕ‹Íúài ˜aEù ù A ‰Ú:Ög娡ÜĹ!‡r›C¹ )ìÈúäÉ : ó@8A´Ì–ŒL*Ó\A9©öü\0ÜÊçÐ Ù0c DŸ6룧´ ŽT<]Š× ÄA φ½ÿµ7ú‚ò¹ãÄœ<ÐAdªÐ×xF~÷âÜ˲´ Ue©Nþñ«f~ÿ ÎÿO§º`ë!M£˜ ŽbMÁs›°-LúéÕôà™yôè+7×_WÈm0ÛÕoêUhçSJÁ³­K#¡ïÐü¸=û$½M›S.âSÛ žIšËÊ`–Ó²€x>Šq±ÒŸLWÌø B@ïÒÚ†›r'º]/&UÔƒ€âìäÁ‘!µÐ!‚<´QL°HÞA†£ÌµÕvÍΫÈy•ò ئ…š,=[¬O^:ñRmùè¡2|”dc’åi’ è˜d˜8ÌI6,æ$ó7vÖ»u&iHÂÀp (H0^šs}–ÆŽ-£îgd;lC®#¥\lÖOí“«O’I˜O†}?3ùÆö?^ÿâ1Òendstream endobj 1691 0 obj 1151 endobj 1688 0 obj << /XObject << /Im20 1690 0 R >> /ProcSet [ /PDF ] >> endobj 1681 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 280.999 400.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1692 0 R /Length 1693 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kd¨à’ÏÈOô¸endstream endobj 1693 0 obj 30 endobj 1694 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 280 400] /Resources << /ProcSet [ /PDF ] >> /Length 1695 0 R /Filter /FlateDecode >> stream xÚíXK®$'Ü÷)ꈄäw‚YÛ^޼zVK–^-¼òõUPÝofkË3Oj•$ä‡Èkd³üü~쿲ýùTŒ ²¹MŒiÛ/${ã|Ø$“¥l®4 Ñãû1þxˆw&fIÈ¢Aæ50ãD‚5¶ä­kð˾Ï8wqJ¤ECZ×xþ§mû¾9Ë¿ßÌ?É¿]o·Ö(ˆXÐ&ãÓöùø ÓÚÅ„ås—w"X¿ÖŠñTXÔp[ž–ôáÔ-ÐÞ$™ÀçC\´ƒÄç5%Ù<ïZ¢:#š¯•-LKp¡-ÞDßÇçÖëVlïH,D·˜Å䉘 ÊÀ$ôq3hÆö Q­-(e”ù¼dŠ;ç+MÖøkýÃÝÉf n[ÂÁÝð¤Êöë··¡Ck·o/²â>Séx}ŸË÷kF ÎhX •’6§°Cºáèźœè’#À´a¸\èœ6ày×’\€§´/œ¿%&KÎçpʉÚOÀÙàMrÈ k4ÀõQÔ$¹2¼ § oЕásSݹZ$† ÷¹ÏZ vCGN;K³yŽÂœ oCôùpŸpÜ£›æ®X7Ûã ¹{ÒÌ_!- RårÁ¹¼iŽ ¨€L*F¡#KÄÐ}Z÷Ç›Mû,k¨)>"xÙ¨+u/+¶×y±„:ORnR ©lM€Éƒñ<.5³6~I‰ÚÂÈÍ'w®Æ³ùöÚá¬5´UüY°+/&’p‚êc%Á»jþŠí£á,¸ú¥ød ÈH:áwýÚ‰³( G‘Šù'°ÓîY°½Î³,]·z8qÆ • =#‡E“©Ãш‚Ã?.Gzã™îò‡«Ò\¸VIr*¬À›«¬ÓÆ3í4 yHùš•"‹±ÏŒäŒ`”Û²œ1Bä Ø—YC2¹Ò}a(h ¨;6D# ×¹^ÕVEÎ: Gþt&ñ¬»lP(ÿqi±bû…AÉÂF£ª”ç+LâV€'äZt_eÅ"¹7À– @£½@§ŒTÀ"'R9²8 §•3š%_P€á.‰ÍƒÑ„T¹çç–wàX‘-ÀƒP- Öƒ^fö™¨òFL7{M“ïæÕŽHßò_ý\7éÛ ‘ o8Ù­ZID Tˆdª¤‘¦QÔ·âa™mÉäQ˜±½Í‹ mã«c:!‡ÑÑ …œÅ:(§ ™ŒêTƒÅMƒ$‘xDwÖM)[/t%Â+<´<(È4«›®qÍêVhgÌ5- ‰8ÄhR$¥Åú!SÛ8œ¼Úp⣱,Z)Ÿ@Æ!Hµø¸<á| gjdI _%Å*Šr;3Nj5¢4F_±&ìaªº.5b‚íêIàh ¥"ƒÂ»€`ϵ& ëc *-þ–w­µM•ÿ”Ù<[ßP»ü>øoÅö qH.ìˆZÇ£ ¾­ {:Ðü†R ¥åK'.¢{E*ÊuQkÃé¢Ö ž?ôë׌ÓJ Ö|7]lç5uB>/BÛ–‘IæùJÓ°ÉNüµØ†ð*Š·ÿ^+ŽñT?ŒÕ ý³ 9ýÄû‹Ê5­:¹ä½—ç§€û »»àxøgè’©ýŽ»‚®I§ªj^¥Æ]¯ØÚKžHŽ(`Pe>Ô‹`èÁ~9 Ãå0Ô6öñ…•ç#Ü™—Œ>+Ñ‚!ÁÐâÈç%pñiHL‹Ì󅦎ÄÀTe3·µ‹™ö‹ÙG¿¬épYc‡˜ФUÞ˜„/VÈ Þ‡ ;Æs‡Ò°á¥&ˆo ÂùÜuÊ o5휺ù±æÒį¼Áë'˜ÅK(K—Ð:ØR È•£cZ0ö§0{(«/€mq… ©§ÓQƒê|v ¢z¸cº)F/´4àÈcÈVÔåmn¾×.HÜ‚AfÊׄU ]g*/¹>žÝ·Çk8‚¿<þ•5ž0endstream endobj 1695 0 obj 1709 endobj 1692 0 obj << /XObject << /Im21 1694 0 R >> /ProcSet [ /PDF ] >> endobj 1687 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [253.501 94.919 258.955 109.148] /Subtype /Link /A << /S /GoTo /D (figure.8) >> >> endobj 1682 0 obj << /D [1684 0 R /XYZ 72 786.278 null] >> endobj 1679 0 obj << /D [1684 0 R /XYZ 124.505 518.117 null] >> endobj 353 0 obj << /D [1684 0 R /XYZ 72 440.858 null] >> endobj 357 0 obj << /D [1684 0 R /XYZ 72 184.923 null] >> endobj 1683 0 obj << /Font << /F15 393 0 R /F25 380 0 R /F27 394 0 R /F39 496 0 R /F37 380 0 R >> /XObject << /Fm20 1680 0 R /Fm21 1681 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1702 0 obj << /Length 1703 0 R /Filter /FlateDecode >> stream xÚ½YÝã¶ß¿ÂÈKµÀY'RE(Š\šÒ´E’.‡¦Z›»VÖ–ö$ù6Wäï|Q’¿Ö½¢)ü ЇÃùøÍX-2ø©E©¥³©.Ýbµ»Q þ=-âè[˜cJSäiaðí á2R.µI}f/Ñ›"µ™Y,•óiQØ…jxdiîÝ¢ ‹‡‘Bg:õÎÉ'•§&×L1 çRïaGå= Ü”`rùLáÇ–Ç߯*¼€ýÌ5uÿïí­H³«—üÕ¦êªÕ:<»J~R¹¾`=öÌ@gQ ü—XÙ¨ùhª ý~;ð˜”=²‘‹!]à,è%Ä᪠Õ@Û¸1àÓjà%$mOŽçÔÈw 4€§k¯éÌ¡bÈ&)´w"qvn²qwq„Á¦Â}>²üøáù¹kŸ»ºÂëÓÞ'kˆ")zL#àFwb9Y>ž2›Ÿ.âQ+4í ÐåCè(@á[ÕãÓ’à§å\j 1 Ì)¨9= ÏtêW€mW²„N‹ÛœgŸÜ´’I^ç^ëGî¨С`¦£ø¦Á›Êr…-ÓÒµ"ž{‘Ý·¯D2w̱HMQ\.(r•ùePÌŸ¯B4›¿ ~5±™T_‡áõv»‡˜ ÆÖÇ;­e._ñè¡í¦ §ÁA¸—<æTꕺ‚˜#Þk¿€ -FÌfí܉¬‰N#Š$ð½ Ï0‚ç‘Øa“#Øã•Áxµï>R|—Å/›®#/b|@ÆþCCöUÌÑÔ ÞqX˜aIDZ=gç¾ÝÖ’'a#rfDn¡—äÎÿQ‚,®žâpídE ñg%1òëx~¢éX’þb¢ý¼áøõBÁQ;/ñÂgñ&=$ÔðÜó\7‚íBœ]1 —õB9©gùqŠÍÏ¿yAü‘ <kÖVsÌ%‚Øå™“Íåš37qAF[~J5'“h4âñq?©¡q9;…K„ºVìLNY…¶zYŽPô$Êqâl‚ð•¨c@©‹ƒ†Ç˜ƒW@„=B”àÄßÈ\ÝG¦}Ë£öžKÏvß¿‘¸RBÕ¦ÌQÁNu2(”$ V-)‡ýãœ+’°~ G=‚åÏ‎=\Ï€BP&Žêø ËœJÁ G{¯ªi÷ãÍ˵»sX|è¦>-CÃoÒpàðÜmÍýˆWm´(êéá¨×ÕËb~DW.f GœÁà´Æ±cµi»!4ç,è,¦ÇÖsö¤V@½°™;ðu­ŽÌ|ê-Ýï¿j©Y,qy•Ln“¿Yµïù¹Ô#”6’t«ÚýÃ|Vüq¬UEbe¦Åu3ë{BìyS#|rj–‚Ä’dÉ_•ôáNý•[}=3ñ¯ŸrÖ„ÕS;UÇ ë”™”ÚMu”nåAéVÎer\+IU2ñtÇ<¹Ê)ìDvŽ×‹ü=´9sD‚F>Ÿ*z|E€9lÚG„/½üÛâã=ùÙUüäáªæ1Œû™‰7Ó’s1‚(¨¾sX߉R Á§Ÿ9@Îw~ÅSwÅSÜä)Ô @P~úßÄ”¦=ÖöÚŸZ+¨§í5øà‹“.a®S­_)®þ YDEendstream endobj 1703 0 obj 2719 endobj 1701 0 obj << /Type /Page /Contents 1702 0 R /Resources 1700 0 R /MediaBox [0 0 595.273 841.887] /Parent 1664 0 R /Annots [ 1704 0 R 1705 0 R ] >> endobj 1697 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 280.999 400.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1706 0 R /Length 1707 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kd¤à’ÏÈOû¹endstream endobj 1707 0 obj 30 endobj 1708 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 280 400] /Resources << /ProcSet [ /PDF ] >> /Length 1709 0 R /Filter /FlateDecode >> stream xÚíX9Î=Íû>å}91"¢FHHD\Ÿ*¯åêe†ôÃ'üæ½ry©Å£¤ ÿ·ÏýØ~nZüØ´MÒ‡(Lò2j'ŽXe¤IFh㥶^X]ZµïÛxß²–9';ˆb¡ûû6¥vAt Ưsôñ¾u/£ûÝ,ðuìÛ÷zm_„Qø÷óÛæÄ¯mØ«Í «ÁnÔÒ:ñßöÎühµÂ¿ªU åLª5IºT´ªh猜û›”—Á-ªë9µÌ­Ò"œ¹ î£LM„]ZˆD GhíâQƒÈŠ éìÒÊ!»KM?ŸÌ…v.ˆcà—²ÀÏ ëäãL•9Ëž6‹1‰69°j6½§¬»{5UÉÁ¦Õô¥[…é„IY¸nÑr YF&a”’öúºsαÅkú€2XL¬ç´Ô]TIãþÚ²GûÃn®Ìc Ī IÂ7èPÅâÀމðD]çÕ˼À™T;ÔcGËEá1{pαùì¤ o$F$ʹ ÇkéÔsòàœ©ÊhÎ׈àµíeV±5– / ò¥R˜Ñ1â—›À0صtD•á6d×JKƒx×ycµÂ°c Újø|ŒaƤÚw½Ã0çáM ëœóV®Îƒ‹zµ}íc¢VÃ^­3rŒ²æÊO~1Q)U’Ìb»a“屜㺼 2xáÚ-Ö6–ÓìãzÂ+VrdÆ]ª–S`5ŽqN˜jrµÂ0’Û_Æ/g^÷Øjñ鮸?K?°VäBWr2„bЮ§²›bǘDû´œ3U}ËJ‰da)ˆºhE†¬ª”ÖÃÏ#ícz¤óxA'™Ý@48J­ŒÉq¿JÅ ÃŽ‰¼ZƤE´ #,¡hÝÄÆB驿®uZˆDI}J'ÏÓÙós"9­¤!=åUÛ+6YÁz™`Ò}J€H(ÅÊŒÜÇ4#w Œ@u—> $XXžÆã‡xCš9v är˘DKb‡c½ü™…u*mŒsÌÃ˸äL¢¥kb°°,óܯ3Q‘¦æÆ/Ƥk"Z†á±BÇ Ç ›rÓ´3t{*Kçð2À¢6A&‰p#­…6$ã3Ÿ©-1´ê÷ígΗôÝ "ÝÎÓïI£ÝéÏï‹“j:±™9)ë.+ŸU¯_bœIµ˜1Í’Ñ;FŸF“uûhªù<›ªÖ -YÃ0÷¼*Ï1Æ!ª×ež1éCœhFXyƒsÈ.¿®çŒyÝ \·÷­ÀÉÙ¥ý8ëš´øÿW¯¿tmïýÆe.û×?Œ‰Çˆ~ïG˜÷²é]îôו„°€Å{XqèvE‚—¸ýºì-Ú^m;š ½°86YË»˜aÄVÆBà]lpa”f9Ï.¬—.¬a˜mi‡ª5’ê®÷qŒû¼;i6§/o¶¤ÖL/oÆ›,™KûÒ1[ºÉù¾¨ÃåyQ!rƒ*Ї)áI¬¹­>.¹ü¿Ž“Ûotw¯ôendstream endobj 1709 0 obj 1155 endobj 1706 0 obj << /XObject << /Im22 1708 0 R >> /ProcSet [ /PDF ] >> endobj 1698 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 280.999 400.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1710 0 R /Length 1711 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kd¬à’ÏÈPºendstream endobj 1711 0 obj 30 endobj 1712 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 280 400] /Resources << /ProcSet [ /PDF ] >> /Length 1713 0 R /Filter /FlateDecode >> stream xÚíX¹Ž1 íç+òQîã ¨Q BBb *~{rÙžìj·Á"­òüÆqâ3k´Uúïó:~Vý8¬/:¦¬\‰:Û ®‰xã´+NYµõQyÛÖty_ŸGµºÖâ'’‘@4ŒõØã<&’ª¶!©¡ÁE¾ÇXŸÇ°b2†Ý]ƒ<Çy|ÿ·Ï¦>_”3øÿ+8ôÛ1õÎÓÖˆ· 7[íƒúy|>Ìý]û"¨ßýÊÊýîf»ÉàF‹‰:ÆÆ=P·”!;€®šC„³ŒÛ Ñâfø²Øœ‰â=Û»Cä4”47ç2rS„=¶—2Ê^ÆJ ,0ø•±¦B¶Ø>תKâ d„]‚ƒiº¶ìd,áÿÅ..¥0ò0àeªº~ Œ-1d9]¤X1F{€Rv¹æ–ÂðO'¯’ËÍKÉj n’.ïÌß·p²â²ëH˜:æFŠ nݰ<±k! ö6> /ProcSet [ /PDF ] >> endobj 1704 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [327.734 373.331 333.189 387.56] /Subtype /Link /A << /S /GoTo /D (figure.8) >> >> endobj 1705 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [290.029 292.036 295.484 306.265] /Subtype /Link /A << /S /GoTo /D (figure.9) >> >> endobj 1699 0 obj << /D [1701 0 R /XYZ 72 786.278 null] >> endobj 1696 0 obj << /D [1701 0 R /XYZ 119.553 518.117 null] >> endobj 361 0 obj << /D [1701 0 R /XYZ 72 169.644 null] >> endobj 1700 0 obj << /Font << /F15 393 0 R /F39 496 0 R /F37 380 0 R /F30 512 0 R >> /XObject << /Fm22 1697 0 R /Fm23 1698 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1719 0 obj << /Length 1720 0 R /Filter /FlateDecode >> stream xÚÕXK³£¶ÞŸMþ»‹«Æ=Pvs’LU’UªÎ.¹ °­ ñLùíéV 6cŸ;¹›”«ŒZ-uë믱 † 4tª"®Ó ?>±€~‚±õ ô‘¤LD”H|{ ¸%·\F&V䙌”ÁV$2bF£xð1ˆ#íÆÇ'ô~¼Lñß¾;rüÐ<ýúüú´Å‘0©ß/è­-ƒÝ´ÃQ’«HJÔôüÊX°vl‚—“|)~ ßÙýЖ›-OuÈâï6[ÉYø}Sw};ä½mjjvôýø2‹'@a¤•y«*2BAà˜(MÔýÈALÃ:ß¾f6ÊY”ˆÔ‹œ6 '¸p{‡>t„ŽŸ¿Ð®’Håç<ÜásÐá-NæbãÔÚ:·§Ê½ÆaöžŽ]t‰,„DÞpöŸIOÝгjê½ _PäbžÙ¸€m ’jÚ‚„؈|<Ò-‹El6?ØK0ÀÁ*mÂç!ÃXhwøŒQ¹d<Ü•gjdEa‘cÐ926aîx'›„MU $EZ¯/Ïjj¹%½d§SÛàÌOö¸,húÇÁö^€cæ`»rŒ¨ƒW´Zw6/T fTðÝ5ü¶#¬d ž¾„B J~B¬Àï›ëU8ÀÓŠÉ™ò/b{+b‚é&QaÖ»,]¾C…®ˆ9 ©§ÎòS^ºÐ!êkêËêýPe蘅-¼y˜Kðibzå¾-K—*À/ê¸vSq`<›’òH×Ò¼ó É11îÇûQï<•ªt‚™ÒS˜ã@AÙ«|¥M81wô8õ˜¹«QŽö`À>Ç5!Y”µK2ŽÓŒŒtjæé×åR\FŒ›Æ×c®8º‘ñD(¡ LãÈœ¯uÝHË0}”Y ¥F¦B¡z¶®wKž [˜…@ž9¦‹ÛÁGèð …@NÕt5Cõ…ƒ­òU¶Îvlù©dQû™:ç5 úhªéÍmSÿ§'ÙªÌ  °Ñ¤R…ûƧ+ü/¨¯-Oö°ˆñ̇?ô;Öp ¯ÕDßÞ®ˆNsŒ0HÉ\8©ŸPÔ·tþ2QSU.eœÁko°Oàæ)ŠaÜWj0¥(»¼µSˆsLL‡ôâ,9ÜÐ{‰ŒSá%x<å .˜Á¢Äƒ¯\ArÆr¢"“>¼éçð¥!˜zD[FÝ,°1çw¾ÔÿŸ=!endstream endobj 1720 0 obj 2049 endobj 1718 0 obj << /Type /Page /Contents 1719 0 R /Resources 1717 0 R /MediaBox [0 0 595.273 841.887] /Parent 1664 0 R /Annots [ 1721 0 R ] >> endobj 1715 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 606.998 506.998] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1722 0 R /Length 1723 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kd¢à’ÏÈP »endstream endobj 1723 0 obj 30 endobj 1724 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 606 506] /Resources << /ProcSet [ /PDF /Text ] /Font << /R6 1725 0 R >> >> /Length 1726 0 R /Filter /FlateDecode >> stream xÚ­X=¯eµí÷¯H÷ ¸!‰óY2€¨f˜+½bDuР9HTü}–'Ù‰„ÞOÌÕÁ޽l'Žílg½qüŸþ>ž×_×üý÷"g(™'ÿ&GÙ|¾²#¿ý?Ö?_¿]^Î6ç[öæÇË›ß/ïœ3_©:›Z4‘’­ž±| f™à„eÈu:*’Ò± ý¸>^ Ÿ Áÿ~‹¿þÿžÃ‰29© ¨l² 6×dbéÓ®Ò+¥j±+K"©18žl Ñ j»A?®áÅàL/áŒãq½a?ʶχ]óƇX¦Åu³v°èùààÚðm˜4 …ÉÏŒøÖ6 ƒf ݇%Q€r˜xCJ–ídŸ7NwŒ\GêøÊ…9ql0BkÀ¢‡ÙÅéŽ)©ßÃÍȆK¢å0ñ†\*[Ž>'9q,%,…=«•æ|ì‘ Øv€AÏk°8Y1÷&N êÔ(@9L¼] Ar†"4²ÅUÓB°>ó‰g‘hn¬gE©µYòäÔ²#,zìèâøfC2 Á6œj,/T‚v„3Ž-øÜÏ~æãâtÏ‚° »çÁk¶¸[ð>Z®SÂn³ÁƒÓ=[î°á¦ÆðbHä!6Þ®H¾ŸeÀšÄ¶8¥°g14AůHÄPu½Ó ºâÙ’HBÚl°ÆàÄÈž-:lÐÔ^¨ÄôRŽ8¤B&ªÖ5Þ©Q!''f[‘')4ë#èÔ«SòºžFýâkåÒ’ˆmG˜ô,‘“¢-Å,ØðÓÆðbHÐ@‡ ÔÈ’œeŽÕ’ÔÈÉIÍ¢‰ŽÛft™œE‚‚ÓõN£‚ùmJKÂ×aÒqj ŠYá°†ÆôbH„ሃcû¤ƒ@@)µûR[°è´ÏÅi¸ Ȇ@•lcšD"PÖõNãN5[ÒM"a³Áƒ“›mÅL„švJ³†z1$¦ßŠpÄñÀPõñ …K ¤ng!Žnr"äƒ Å›™N"rÓõNÃr.dc¹I¤aÒ~j('â>á\&B,» ¥¡1¼ÃËpÄ¡Ñ9ä”Gä›9¸É¨ÙF™1œ  É±@p¡/wfËRî:÷º©/:wùňiꇰáw’ñÕþXχzÞñ9¨Oœàò×4aP]×y+óô”þ MÜ/W» …ÆÊR i%=¬UHy_£%>LôgVC-Ð*!0ÿå$HŸîS²w‘l%>›ßŸá?NÅd1ß;xÃîQÂéÕfRÆ)ùÂS‹ôrž’=I)EØq&VÄ”"v…"2ÁäŠnlÞ ´F\0È™9â×}†O_4Âs<çØÎÃÞ>ØïQÿ¯€ó˜Ç6|þ¢°눕¯é¶Ý½êøŸ:y„ùo!¡Ë_×Z³Êš2hë׬uòЯg¯ìOBsõܦÁAI*¾ÏsHC…¨]bn¬Ò¸P.H|KÂn³ÁÊá’ŽÇãDp‡ ·4Ô‹)Q„zØ@WÏu;ðç|T Ÿqgù·d‘X)ÒiØ•UºI¸Ám6XC9¹5䈙¹î6”f õbJÔ¡6ÐÕ)oiú\œŒ‚2A;Ø}â‡ÄLl¥¹ã¶Û2'Ç]}Ðj€Å/#`)®Mwp¥!=ÌO‰¼iþË›‡§‰í2Úb_d\(œ.nG_èõ4¿HÐk\]ŒGPzUµÅA Íd^Ø›ACC½XiG8âèæYB&ã¡kÈìžj†“%fÑQ/’«&‡gæÌ_&aÒahLŸ)zÔ@Hu·1hä¢z1%†—ŠpÆÁ±Õ´ÃçSŸrèJ$S˜H¬òÙixÚЬMN);¢ãИœ€rk€;L8UXN¨DÚÎ(ä=Wê½€?'#ù^m¸I{~RS¯_Zð•”‘ïLp»¾»ã³¼2P:ÑÆ§:îøJ²¼:0ê®_w|\²X.58‰?Ö¥ˆäòüuÏëG‚¨‹^8FìÝ$Ü]Ýý~qøY1U6ƒfîÂ’¨B=l¼É—Ê¿ÐäÛ¥þ<žæÝëõÍÏüÈ7¯¸‚}‘G4Œ×çWß~ýúÇ…®úšyýõ«oÿÃ4Œ‰ÉwLùÊ͹2ýÓ!sñaò{Y†2Z&EùÉŽùÎñÅ›_Eè]gÿÓï½ `¸ôÈf±Ð4I̼§Ž €<„E  <÷„‘DçýRÅõ÷™?¼šçSù&+ã Dæ'¶Ý_$<õöº¤œ(×CBBUkò‘G±ii,P +úÁžP•¾é|éñð‚øxþþ¦o†ŒÌ=ò¬» o^|£~jÂËüiQ7Y|ŠxŠ÷“Æ4­~XOKàè&æÎ”]ûpýù/{öendstream endobj 1726 0 obj 1821 endobj 1725 0 obj << /Type /Font /Name /R6 /Subtype /Type1 /BaseFont /Helvetica >> endobj 1722 0 obj << /XObject << /Im24 1724 0 R >> /ProcSet [ /PDF ] >> endobj 1721 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [123.724 106.036 134.633 115.733] /Subtype /Link /A << /S /GoTo /D (figure.10) >> >> endobj 1716 0 obj << /D [1718 0 R /XYZ 72 786.278 null] >> endobj 1714 0 obj << /D [1718 0 R /XYZ 124.464 380.735 null] >> endobj 1717 0 obj << /Font << /F15 393 0 R /F39 496 0 R /F33 497 0 R /F30 512 0 R /F34 583 0 R >> /XObject << /Fm24 1715 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1743 0 obj << /Length 1744 0 R /Filter /FlateDecode >> stream xÚÝ\I“ÛÆöY? g9eî}qJÛ±*N.9(§8hˆ™AD##iR.ÿö¼×ÝXÙÁeœ8¥ª!Ðxèå­ß{Ý]øGš-´Q Ófq»}Eþ߇E}õWhó”BòD ¼;B¸ª)W\&FI¤ÿþÝ«oÞR¹ $±Ä.ÞÝ9Úwë,ªnVÜÐå&Ïöþê!ÝÜÁ•¶Ëê!óMûª,>Ü0³Ì>çëêáæŸïþòÍ[N:ÝQÎÂEèô³§è HY¤ )vöù†iõŒÃå]Yl#}K•PÎ,ÑR»·E¢ÅŠ%Dàߺù»ø¨œËzÔÝÚF–ë¼Ìn«¼ØùÛ<°`UY¹ÍwY ß™dÔMq³‚æÛ´}¿¸ 3£4ÑT/V%aÝà@­—E¾Ã¾ªÈ29I7‡Ë„®doßGÖiÃXXfr³B,ßÞ¾,J˜çaÖxÑp¾ð ·~E¹Îwiå”ZýJ„lfæKôA'VûùQx‘'VGA"kP‰1¯Z¢ÏNåpBbù3¡Äw8©U 1†7‰"vr|‘H˜hg|N ²Xé„ꉲ˜Y kWÖ/òMŒC4‘´V·ïÆð³‰*®GÇщ2vÑÒ|‡%”H å¦5¸W?¾{ŘY7@TŠã€°`’pke¶¸kœmãÊ‚³:ð“>‚Ef`Ðo*ÀÁð®RöË´ì.ö9ðÞb¹Å~[¬¿šÍÔçš~Ž$!”.€šÙ+€Àpåì ~jFôfY3â_‘Ù‰D1ßj{ý‚º0¡Cç_Åål…‰·1‹ã=…¥†vgŽ>UÄY>¦eºÙd¸“3ƒ4¿ðÜqÏ7›Ã³ì~›ãÔ²Ú&•ŒûlˆÊl›æ(¼Áù"}o˜ §ë`án œË" ÝÔû×1#%<1’E…SGgÓ3ÓnØ@D=-(ßv…SàkÑÕDf¡Ðµí?Df!µ>]E\÷BK´'Ê3K!ír?ŽÁ)²úÙ7 :áUçX²Ú?m*gYØþ}öï<ìÂBîðT~BÑÊôÑË$KË}h ¿¥±Aàn°Ì_e~ÙGxì{5u¯~Ê í³Ý>sK$½µ­3—$¸¤ÃØï½WÀ®|‰{ òëð^ûæO8—˜¹¥qoDø»M?ÃA‚F_H! vŽ_ð|и§ 2`þ‚ÉÅNò”ÞVOÀóç0»VÍâšåXxÍGÛY[d ´±çåãÝèôÚO¢ÍòèÚÇ'HÉci·ä±Ú´e×±æ^ä” =;ІfðFÚr»xsTŠSÅ²î œ ´iÖe:²Ô:8îÁ,€éÐüÞžHͦà wo.Fƒ¬çíK,ý¸¥V® £M«@ã86¶1Ûß×íuÀLñn ®²/àÀö¾¸U; ¿û<¼aµí9÷~,Ø'TĹÊ/&ÚÚ–È×äÎì‹möù!óa›/ ‡fX SX†±´äZ|¤véØV>y<„meñôîæ8ƱX¡d/¥ôëvu:œÙCº,´-ØÅ\„€Ü£qôÅŸË/Rü׾Ȗ'Yƒ-TˆqEÜÓEÓ‹¾¦ÑÃt·7H—DÀ–èMÜÊ¥”çÇ«cSÀô¢3…¯e€8Èø)î`”±£•QíŠë- &(±"sb¡Ó Ê8WÌçFõ¦Î«rQ&j’?ó.•@‚€ž`ŇŸ—Òñë¤tR:-Ž×z€»=Èí6ÏQ\%aUÜ\€­'öqs‘3Ì…Åà]'Ôy 8n/ìÚæòCÔ\PÏ0££å…%üC†Ì…6m.Šªù¬ì-À3³o/q{ðáþ,s¿9¸š·öx‚ÑO³xšÉާ™æÔ4à›rùg€%±(†w«/sÞ *JˆŽ:Ž$Øü+»Lña(¡xw(¶HË `ÚçUE­õ²öleª—ŸŠ}xž}AÌé.?ÝHµL7Oß‘z,ÜiÍ7›0l­Æþ¬*09È{ëÝÊÉ´®Np…d¾{)šªK̈Ě Ã/nû2~\‚,‘tz(qªëB Þ¤~±»}XÀ±‚?q”kÏ”Á&­çÙ®&ËüESŸ0D,ÿ¾÷eǶG_kÛlVAh$2(Ä|Õ9èœa=fs_”yõ°õ·³ãU²MžYèñ]¡¥,°åK¾õ{¶®ÕÿÔÖ/Ðà£Oy é—í°Åç 8b]¶Ó®¨¶â ‚uí 1ëÔ^¤[M–îsWj²UGë3.Ç{ì ·Ñ ­Åÿ dò@þaZýâê@-¥¯ilq0ÿb“F\‘Æ-:*ÜEïvg$ä!Ê⤊tQ{ÿ&ð¸YÕëKýmŽS càþûjÑèÖ/ôƒŽ‚†Ú. \ņ– ±J äͱ€* .E³ÿø;äKí¨GC'BÖìcŒqµ^œª¯½ÃT}=. ­Á]éºLÚÓ0¼íåCÀ(cBÿÛ| ïHºt¥kŽF 7 0±*‘4¥ …ãáCp¦‚É„ 2ÿnñQ©®1`µBP_+Trù6¿ò•ª€.5…hk¨;.¡›ñá‡E}5….(9è²Fu'#´^ÍëŠ ¬fé»¶úÙÔ(ºÉJ05ŠW¯IVüÍ¿ÍLã¶Á#! !‰Šˆ$Ä]€45Ÿ+Ïg_ù ¶50¸ Qkíišó9Hïžør5Übå$$[¦*Ô°Ž^üU¶ÎÓ*œ‘é#­ý·1®Xš‹ªÓB`³EtÙB£ÑL«.[ÞøØýÒv¸Á  nT2w×ìñp׳¦ã@§fìþ‚cT¸á tÊ7ªæ\9¦0^+Eêìyä°‹Rl~Ùíà`H`GÃlXâYÉ€¼(` &€U2ÓíF4‰Œv¨bú¸Šéî^þˆŠé*Æ|η"è&4¬&ƒa˜¸ž†XŸBû¶>3¢ar$›• †„)+`úS*sÀøT c':1>¢a,îÄFUL:ãG4L £×T1£Åüôy¨bmMãëéšÆ¬c5 yDÇ,îÓê˜æÕ:¦^LÇÄÿŽ ÇR× Tê/Æœ½žc3ð\\ay«‹Ö\QaOvŠ³Ã®œTX}¢Â»òân­°úe H­°zŽÂê3äÁ»sà“ «_Raí•NÅ1Ôy;(î<Œ;Û¯ îh<ƒ9Õ1«Ë3–6©Á”JŽkyC„ò ÿ›ŽYŒè¹šã˜Ùu³œë˜!§6µdlbˆJFái]ZŸ¨•M #ÓB1WI+ʼnY%˜ «XÚ¢ÔÌ?)3•XŒr²rþÀChIÿkÐ㉾(}¡$êù¬ûô㺞/”â™ R¼Ø§[w¥–÷Y±Íª2¿Å“nÌU‘|²>* ¨À"ñ–›ñþÇûä€)ÔßÕO¯ï ûBsšÁ–{Ô¶ÂÞJÿ4w"”>g¦,6Syf’iÓî"ÔU=¼Û ¡µ>ŒH}ÛÓ.¯¼$|]ö¶*ÊØv㊱´rùסùrwà/x{:§0Ù_¯Ûê ¬£ôUÂl·ÎoŸ6ié#nUô¾·½#²£'*%ÿ ^®ÄjÜ·^-MŠ÷UšÇÏR3ת÷U]Œ ÞÙ¹fÕ/ã_Õ @Â0 D‹Îg/3b°œœÈô—hjÞ)ó‘ÀÔ,ÐÀVTVZµGM ¥HŒmIF1Öúðä¿ÉiÍîcû=ŒUè¬(‡~ã±Û“¬ðè§ÒÓNfÆöØüÄhZS.ûdhÆ,ÄÉú*pJ‘d¡7Ž?ÅóÑ#™Ïª% øa„½T:Â+ñ÷*Ÿb^Ìßç¨Óµú,ööã3w5W„Nœž‰ZèE¨…°„(vŠöz¤"6éYõ ÏÿhqPbˆónö¼c–€ùØL¯û;3j)øZ«ùKèlÂå:’H.Oî–‡r–d~«x8ínÕÀæ¸[vUwû;ÃcîöTööÜ­0y;wËÎt·ì:I"ر Gÿ3ÜõåT˧¬>X*ÇólYІô×òendstream endobj 1744 0 obj 3422 endobj 1742 0 obj << /Type /Page /Contents 1743 0 R /Resources 1741 0 R /MediaBox [0 0 595.273 841.887] /Parent 1748 0 R /Annots [ 1745 0 R 1746 0 R 1747 0 R ] >> endobj 1745 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [197.712 386.324 208.621 398.997] /Subtype /Link /A << /S /GoTo /D (figure.10) >> >> endobj 1746 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [322.372 176.102 327.826 185.799] /Subtype /Link /A << /S /GoTo /D (equation.1) >> >> endobj 1747 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [351.184 176.102 356.639 185.799] /Subtype /Link /A << /S /GoTo /D (equation.2) >> >> endobj 1740 0 obj << /D [1742 0 R /XYZ 72 786.278 null] >> endobj 1727 0 obj << /D [1742 0 R /XYZ 245.077 721.804 null] >> endobj 1728 0 obj << /D [1742 0 R /XYZ 243.414 674.798 null] >> endobj 1729 0 obj << /D [1742 0 R /XYZ 244.773 536.586 null] >> endobj 1730 0 obj << /D [1742 0 R /XYZ 244.865 503.163 null] >> endobj 1731 0 obj << /D [1742 0 R /XYZ 262.296 370.917 null] >> endobj 1732 0 obj << /D [1742 0 R /XYZ 262.098 341.703 null] >> endobj 1733 0 obj << /D [1742 0 R /XYZ 261.842 312.489 null] >> endobj 1734 0 obj << /D [1742 0 R /XYZ 259.062 283.274 null] >> endobj 1735 0 obj << /D [1742 0 R /XYZ 259.062 254.06 null] >> endobj 1736 0 obj << /D [1742 0 R /XYZ 200.712 214.152 null] >> endobj 1737 0 obj << /D [1742 0 R /XYZ 211.37 149.614 null] >> endobj 1738 0 obj << /D [1742 0 R /XYZ 207.275 106.128 null] >> endobj 1741 0 obj << /Font << /F15 393 0 R /F30 512 0 R /F34 583 0 R /F31 881 0 R /F33 497 0 R /F39 496 0 R /F28 523 0 R /F1 882 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1758 0 obj << /Length 1759 0 R /Filter /FlateDecode >> stream xÚí\Íã¶_ô˜Ssi¯î̓¬Yñ›Ü"‡lš h¶‡zhzÐz4ca=öFöìdÓ¿½ï‘”õEY²¬Ù h°ÀŽ,QÔ#ùÞï}’t‘À?ºÐl¡"L›Åúá3ºðÿÞ-Ê«?Á=ßRHN¤À_ WBRb¹]¬8'4q¿~óÙo¿åð4!6±‹7w®í›Û¿/ÿsó7\¬(Q [¬ÑR»ûÅûðŽXhb5¾aˆ¤vÁ‰•ÖµH| fN- IÕb¥ˆæÔµQ¾ •µ/•]À—`ìØfîn€T¾Üío˜Y>á±|{³bz™ùëýÃûÇcvëÛ¥‡@[}å·ÐGw|ÒbTLÒfšˆðœÀŒ ½üê«L‰Æwû"ƒµàZA~:ñé&Åjwpðo‘}ÿ˜î¦úaÞáJûuÁç‡íþý èá7ºÑÀ/œ]Æd!ÁŸI±û:ŒÁ`Òm˜‘@¡^îwá"ÊTðÄæ.ª—Fë\3Bçž-^S¹/½" ¢…—žñªÈ¸$N¾¼öu‹ O¾Íï=ÖñV[¢4Œ¤¹ïâ³w‹òê’Ó¤ƒà¾Í ‚s'HÉp—\ ù.¡bwS‡@:JxB UŸÀt¡ÞQÛ•éð"F'`9¥ãþr2UL1Ê!Ç!LX_‡^–X0ŽÜP-|RPIÒ5ùe¤M¤„1!Ò™ Â-êÂÝ7ߪ&ܽóÍâóÍ/¤At¦!(<ƺËÏcBt &ÆŠ¢¦|ŒbºÜh—5a=6¥rBûmÊj²ÌóSÉKÔ=E‡GÂ:Æå`k$2fé¬8|¾°MÈè€ÁÇ",Ã`Å„š„áý<ÖP¢ñíeÜç^³Z4¾Zìyx W WG g Ñsk%ÑjµCàîº]€/¦@mY¦C`_ ø»D$±nÀ 7Ë)—cæ-ns¨³’V·çX»s†êIŽfÀ:\Ãážµ0é‘×Ï¥68ýi¦·»Ä—2>9½5þeèpJ?ÇþË¿‰)Æ@lÑZ |•m®éû|mºÖhƒD Њ¡§S£žVTÅô*®~†ßwh%‚×¢Áé–pÀ‚ ”17Ç<®¨ÑÎi^qh L:‰—Õ 3CçBxfnEYQ«Q~™i #™i¦UÔEÒ²AÃë †±ØLãÄ ^3Ó=¬L9Ã)1 Õz†³ ×TÄ1œÓˆ4 `pˆ¸ž¹ô2COJÃÃ^à$­&a/ÅE—];ªD ÌÊxFtl&H¢+Ä„ùàQ6ÊC&µàõ1™²™÷W S£1ß¡Á8Hw.Í–›l·®;—évû1:x°„\ æRòØ5ga·ãºÅÀ j4À™¦‡3ÍYØíÐÐ`² =.•60-™ÌœÅÄyH(YÑô°¢9‹‰CKa˜¬Ó…2˜¶ÊØPÃyȺÆÌ,06ŽYx³w-mè}6à}X3Ç×&Þ/pmâ?ïQ €B«Z³W ¸ë’ ºTË´ ‡˜'ÃÖ¡áö<@þíÆ ”1M[]¼sÜàÇþJ–Ùï‹ìpÀ„èZ Åû!œ{zk½ßÝæÇ|¿ƒŸÊö…Ýa9¹œÇ›‰çÃh½ªM¾óijâáàéݳ»µ) ÇÑnÒ"]C«üpÌ×þ¾Vï¡ x~l½ú?¯³ó¬ìÌ9zU+Š áÍíZ*,ö J˜À·ñ÷]Ši—‘‰²ày Ú‚ ÙHÆ$¦ŒßcX—©%P¾ÝúŽ]—ùÄêéë·ÎB¾ËÈtë;â~óý´yIÒ¬~D‡{y»GI„c‚½R úE©î6¦„ÒH¸ŒRq!¥gE™Âœ A—Ùù‰öé˜ä§`('nÓ}9û¤çÄX5e0T\eïï+ð–£<Œâ!½ ¹)‘H—o¬³üã!ØH.½Ãy=¦œ$l·«w!ùJî³ýCv,ò5fôðÍ"Û¦$ÿ<Æš+ª½Ã1™7elÅåL‰ˆ¶;Gó“NYK{!™ý=‘€Rl~ÔUµ5{zx—ÉÒÁ·,ÑQØå!}À+éþßfE¹6øÔ§ùðj[ö€<7"<½5i®X³ËÓGg›©Š±‘rWœ‚¤?ù1kÍÃz_œ²e¨év÷þ>æ Öó³+ á¦9»w˜¹nHBS³ÄRí Wú‚\ÄåYD9"‹ÈjYÄW±Êàj´À)ð$£Ï“£U…ÃÚ)*´ 5ź‰Y<ÙU+šÀÈ„`³QkKyŠŽÊ–ScŠ4âD¨`c¹yb„xμžÊë•9ƒrξ˜!6O–4ʃ%™Î>É1å"ƒ%oDd‘š§Kï ‡fXn.XZå‚’‘J«q1À‹Ý~0ö™·²ºÑ3JÍ¡ÀIѧJ=&× †è™ƒ!ÓbÐçi€÷m# óäÀ¤Qe`nš‹(grx‘ðo~x¿Ýƒ?‡zŽsSçš“„O2Pù³–œ"v‡ýöCwj8W‘U&Σ3$vˆ3ªF/O¶p(xåeM,Ú½ûâ>Ýå?f¥áÛuÉ’ôÝ4¯@Îg<½Š/R†â¤ˆHø˜(ÕŲ‹¶u”½éAg ȆbÜç¨ß¬ŠLÔlu—Æ?Úu•%^´¢j Í”ž1bKfÙ¡ÀmÕèÅsį[4xãq—BUŽ&F˜¶QóOÃ\2îbzX–{qxl”ôƒyŒ^²xô’OO7±Âèû}£fÒ7 b ç[ Iû€>‹®R~ðW¥À)]•øY±L]±)´IßnÃU¶Íò]zŒ–&€1ŠÍ—íÈ‚éªÑÛ2҄ߎùñ1(ÔPáëÇZ¤»h§˜³¬YÅUdÕ !C¼cq³æZÚ¨k)|vê't-Û{BÓ"ªÎ»k‚3FÁNA=¡s^jîýÛcšï¢•À E?‘â¬^ê‘¡« Aä¿Hδ'¤Gê1•7úÚšÏóªPϤ '×u̧ §WдT!H(ÓŽA™9«1àö—AK;F vßÝt¼µ–SÛÄw¹e®Z]Ÿ<5cŒünò”ÍVrEòtÿMMžŽÒˆc’§¼ õº¹‚}•ׂNöÁôpS&p…ˆ‰á £°ÂDåoih„„ZÉ ø¡ °N[nË£Õ/Ü8 CËÕý÷mƒV‰ˆú0s8y3ª¶Ÿ½¼ÿK/O"œ} MŒ=§Ü—¸J«õɰé‘as™ _ƒdSft$+íìëvÖSïÄæ©wÒÏZït \®³/\Zðá·}¡ÉgÇU›E!^Ž‚xyâÅÏ߀x—c‰RcãBÿ¼HÞ. ®„žE%šö°í8\Dz³p[hAzüqhßš•dNÕ»RãQï_šÉÊgB‘Ä"ëPŸV6ÙmÖíNT_9•ŽüXö f–Sßý‚o–¨F¡T·¿ÇD\‚i +Q¢©‡&̱¯Ñ~®·38aÒ‹éG` PÌ |§?\kœ´ÓJU¸€$ó·Â Y¹dUdM©rç ´¦t\A8ð=…?a JÈLSBìç¢Û~¤*“œ£@@ôAmSÊð÷ †´àx–ÆÄd1Ìœ½@ÄpœgúäD$z‚ˆ –ˆØ 7 ×Eì¶#b2H'ˆ‡m¨ÙFtD;…ÏÀ"墯.ÙW@ÀK‚MÍèÞ¿$ ¬«¨<+¦ÈÜ‘‚ÊжåÙ pqHß•ISk}u!Ü}[dò#»?b`Ö½-ªô*´ ¡ðbï"ã·kf·®zØî]¬}í«¸Ü­êÈ‘Xm.Oá¨Qʬ “†NÛ‹º<8Äœ2Æ8!>©mµ'Û.oó( $ë’1ïÅÜéMš/ÒiÌ8@´/•‰ òÖSO›ÜW\‡¢¸ý}k\´¦¨ŠåÒ"}ÀÒåhm ³r¦LÚbE¶|›¹];Ù¥µxL‚Ú+êWÎgj¦Q§)±º¢YIøu¨Àô9$i£¥±4)QÅÎT =ª2Ö21­j[N*hÐó–9תA¹Jj{¼`ª Ò£“@‰\âŽ.ÃBPß4ßÝfáh¸ œä¨^Ê ?ã5(¸qÀ0~EDmBJuFеÍwYZøílxtØê ÿë¬W /]wÀÃøi2ô2ì9øþ1õˆ›óìð²g‡œâ¥Øþªƒ8 ÆÄ‡,L´Q8]TÒ]»p§t"jçeLLx¢\ù8 ø‹2q¿wÓ`¹9@þ˜³ZÁ%¥;1‹•-á¾€7x¾Xy¼S˜'¶åŽ€Vž˜±r÷€XùýÆguÝÏMØM—ˆ ‡°*wÕÞŽîvE8X.žžg‡…óÙÔ°Ư( ð\)qÅq±!@;îb+Ó³ÂzÞ¬ðËúÞ†°ñÁg…]ZP3$ †¬ÞÓ© -¶w—ò²Â ?ð‹a?Ûõtøx8fX9ÁåiÛ…i]ÖP^u[Ì ëÆc”Ösq-EªŒrâbjiûxu³¾$9Àûâvs7[C@/>iGÌýK‡³šIµ¬'ø^ÐYWÕÒ0ˆw€þàójsv+»pǤàáb"xÌqìC®x´î\ÍWJ”›WÛn,z¿½«àW¬(å½ûªñ kG®|ÙíÉ׎ Ä…%ÀµÁˆÆá]Wß Ä}œ´fǾø4ÅÄÍD¬%ê> ‚j­eÉɧišyœ:f\,¸°k_<8S .Ò3Ë´Ü«Xy.N‡ƒó>˜i0t¡‘ÃSÜØèëÂ@ižöÝø•® n¯÷ÛLJ¿®õì4/CÍöJB³êm¯5U©jU ¨Ž³š:Ëók«•ˆþE~“®ç™MÕ5£ÄüB×4Ðëkd}$/"g¹JSZ#´óxZߨ1€×:Ž×æ“ൎ/¤y¼î„¹eàçÞN„v-žoF§¢ºձ♩¡ö üvN7cXÓñCpŒìŒçð_²ÈÏendstream endobj 1759 0 obj 4215 endobj 1757 0 obj << /Type /Page /Contents 1758 0 R /Resources 1756 0 R /MediaBox [0 0 595.273 841.887] /Parent 1748 0 R /Annots [ 1760 0 R 1761 0 R 1762 0 R 1763 0 R 1764 0 R 1765 0 R 1766 0 R 1767 0 R 1768 0 R 1769 0 R 1770 0 R 1771 0 R 1772 0 R 1773 0 R ] >> endobj 1760 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [220.978 686.632 231.887 699.955] /Subtype /Link /A << /S /GoTo /D (figure.10) >> >> endobj 1761 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [327.153 520.715 332.607 531.624] /Subtype /Link /A << /S /GoTo /D (equation.3) >> >> endobj 1762 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [357.269 520.715 362.723 531.624] /Subtype /Link /A << /S /GoTo /D (equation.4) >> >> endobj 1763 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [466.619 520.715 477.528 531.624] /Subtype /Link /A << /S /GoTo /D (equation.14) >> >> endobj 1764 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [305.423 507.772 310.878 517.347] /Subtype /Link /A << /S /GoTo /D (equation.5) >> >> endobj 1765 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [323.605 507.772 329.06 517.347] /Subtype /Link /A << /S /GoTo /D (equation.9) >> >> endobj 1766 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [319.475 494.222 330.384 503.919] /Subtype /Link /A << /S /GoTo /D (equation.10) >> >> endobj 1767 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [145.03 438.412 155.939 451.085] /Subtype /Link /A << /S /GoTo /D (equation.13) >> >> endobj 1768 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [360.341 438.412 371.25 451.085] /Subtype /Link /A << /S /GoTo /D (equation.15) >> >> endobj 1769 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [156.645 367.91 167.554 381.233] /Subtype /Link /A << /S /GoTo /D (equation.14) >> >> endobj 1770 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [173.754 203.397 179.209 216.07] /Subtype /Link /A << /S /GoTo /D (equation.4) >> >> endobj 1771 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [204.633 203.397 215.542 216.07] /Subtype /Link /A << /S /GoTo /D (equation.17) >> >> endobj 1772 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [494.735 188.207 500.19 200.151] /Subtype /Link /A << /S /GoTo /D (equation.4) >> >> endobj 1773 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [76.242 175.693 87.151 186.602] /Subtype /Link /A << /S /GoTo /D (equation.17) >> >> endobj 1755 0 obj << /D [1757 0 R /XYZ 72 786.278 null] >> endobj 1739 0 obj << /D [1757 0 R /XYZ 263.922 750.413 null] >> endobj 1749 0 obj << /D [1757 0 R /XYZ 197.152 573.379 null] >> endobj 1750 0 obj << /D [1757 0 R /XYZ 195.122 478.166 null] >> endobj 1751 0 obj << /D [1757 0 R /XYZ 221.002 424.922 null] >> endobj 1752 0 obj << /D [1757 0 R /XYZ 133.303 340.871 null] >> endobj 1753 0 obj << /D [1757 0 R /XYZ 202.629 162.463 null] >> endobj 1754 0 obj << /D [1757 0 R /XYZ 194.546 101.346 null] >> endobj 1756 0 obj << /Font << /F30 512 0 R /F34 583 0 R /F28 523 0 R /F15 393 0 R /F31 881 0 R /F33 497 0 R /F1 882 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1781 0 obj << /Length 1782 0 R /Filter /FlateDecode >> stream xÚÕZIãÆrœòtdÓ4káv´'`âC ¤’8Ru‹iŠ”IʳÀÈoÏÛŠ,JìV19 hÖòj{õÞ÷–’Ú$ð§6¹ÞäEë¼Øl¯Ô†ÿ7¾ô´1¥MMœZ¬]!¼õ”·&‹,Eúî^}÷V¥•ÄeRnîî‰ön÷ÏèïíÖÝüûîoß½5IЭË8UçiNdÿEšÍ­Š3£7·sûk7y\æ8²ˆS8Œ‰Ë´$Š„)‹g±5¸¿‰h_ 7·Æ˜èýÍ­."çZ®n»Ãñ4ºÝk®Ö£|‰ÚF®>qiìÖN”صY;6gúaåL…VWÎãË,<Ók"8Ð'.ªÇº}àòip¼õî¿:úñ×§}õãÝt•&ƒèœï°ùqãK?=s¯*;Ÿ ižŸ§§Š™O&SÐצP¼øŒßóYîÝ>KïUÿ(·SáeæQw’[÷Ž ÕñØwÕöF—Ñž[vnØöµ\þN¨¸Ú!ÿ~盛9öu5º ÎÝš.Íä¸í8a%xNiT›Ì0wˆƬpâ/çˤ±MÓë*‰d6˜|•Íï΄»j†ŽKGæã0Ôï·”÷%ÊöøþÛÓèºE~kš¡l\(KšQœk†eÍ(žÑ ýmסfTíŽEöØžiÚ€À%¹úzZ4W¯ÌÒe×®ì:ê¤e¬“bµÏiþÐICÖ®(B ·[°–Hÿá%×jµ¨õ§ƒëëmÕpÓ0Vïëìƒ*6U#G?¬wÑ‘d;Ö9¬N#‡rgµ!È] Ùžú™Ð®?Ô­xàDwìݽëÚLªÃDxÉ?ìë-N†ØfU¨E4r ŽMµÚër SgA+P,Â^ê®å÷]/3zCË“°ïŒIHE 2S€®C×ÈÒ ð5ÍpN.»¾ã^’Ê€Ã·Õ ¤$2ÔDºWF¾½¯ÚÄü0ð¢7×*3Uý°–´5^QFoZpm²­Yt ¥ñvSŽ!–µwàPˆâ>ÂB]¿&ôuóé¦ÈÖî8ÿ]Cžð„|¨$g ü4Áÿ•ž;HÓ“4º?õps=WÜÇ­;ŽN„<Ð@,FÇWï⇘Š*ªïy’3(\ ;àIúr{¹„pPU*‡t¿žÀƒZYÃØØP¬y;I.ñו%@›M:iû­5)r³åã1 Bah:>ª×Ùæàa¥ Á¬&¯¸–ØÇµ"u¨˜'Q? íF?fë…6Œ8®sØ‘Úu†«k gåIì õÂ~z&ð:zè$ðÀÿ;n#c ‚­Ón¯O›JP fn ¤†˜XÀÓoR°»=ý}I“¨q Þ¢ vk®³Ž3?œÖ)¢uÓ𞺶ùÄ›çÔŒB€Ê†Ý °¸w‡{' “žjNÒÛvõ°= ß}wQêÐ Çç·º; ÉUí»f7 €ßðŽÄµðâê·#‘n¶”^à(3–¡¸ðB\`8õý +uªW<ËÉKöP;òâgg}Ú&hE_?Ô ]P›ÌÅíÌ>VÞäXe å=V}ÕÐías¦žÛª4ó½ÀGt°âëÃlcBu­&Lè%DãCh ­?¸Ï5—Á>N•ôáUÝÏj§!ôPš¶[ÄææV)pXßtm‹n1ù“¹f¨ÉÓèçX«ÑeÍmô÷pP3à/ÜÂ!ö]ÓµMqÉq0¾:‰Ó’¥æ®¢’éIÉ·ßj;>“8!Áû±"'/A·£©µˆPa[Ùû…Â=\Âv¤‰qŠÓˆ,ñÖ‡oÚƒ«ZN¶¯™ ¥½Á×û—ÞÄ–ÙGW—ÊøVü^‚YµO .ÜŽ‹¢®”F¼+cËvGRï•#eßAˆ` ºøâ±¸û?äÀšKG¿°á ٳ̢¯ìùpC vyˆÖ‰ë$ù™žÇåYÈ+¸ê£ÈØ3–PΑø[Ðì,×y~ÎIh!ÆÀ€wuª‡=Ï)ú0oS}8$Ø35 ý®Ç C8“DŽD…¦ü3F`“=;;ÜPƒ\´=m”MÀ"•W-’co® u±NÛâk™¤7,RÌÛ¬ûoº¾uýÊÙY ,bhÝ*V*TX,“ ¾ºŽûÖe{fYÀ, X:“›¥r‘Ø ¢wê[YK–àà »™ˆÐiªu[Ù*0!|d*³ÈÑN Ê@g¬¢8}«òÉÅ…§ýÁè£Ç/7 áN@ %ž)dž­Â(U~€·Ëcˆ¤ƒ…i…§Š§6ʳD3á´;.{'˜È=:€aK#i ˜Fبæ4T-7ŠÏçúÁ>ö ¶Í‚€ x¹{á¤Ñfæ ­&€;&À*ÎÙ uhû5ìÖµŒ¸ZŒÖ^Ö] úü<-{=~ð8‹‹"YÒÚ'}ž€2‰u¦¾Žþëÿ·þo«ó ø0¥š+¦L–€}Oè ŒA™xc¥s€xÇ+8´V'-$0c?K2m‹| ,¬£À–R þà€ÆÃ€Î¬ÉŸfÀV‘[eè"_ûC+ƒSÊùK‘+9¿ÎLp~ÈçÇÒR8qŽ…¦] ¦wð4Ø¿¶þà^¼OE…ÉÂïîÔHçÒ¸j°Æ” ž)m}}8¸T:ùî]Ý3ñ%àTË·˜³w7è1LǬ€ÁÝÇ/Q‘ùRЧ¢3eÅâÐq¨§$ôއDõµÓÓvÒæaȽs2xZ)¬†™#œµåY™†¶Sõ²#Ì)Uk.Üa2ié}1ˆbª3¯Ÿ]|IAÆ~A¾¸‰ªw0£Tùù‚¢@îî9ëõè©)Ú‡I‡@¦Ú2D{&bgõJ„ql–» .!Ÿ/OÒ»pã3P˜c‡|rSv¹s™$à°ÎDoI ºÃÙLõÎU2NÙeŠÛHÂ(¥ä1<¸~de¯øsf/,‰Õ,LØ#|=¹ÊLÀÙùb~#~Í‘"Î)†:°S…+ûg€SФBÍ֞ʋ &¶œ™Á¤ §g’{¾¥Xþ¸‘£³4uÕ‹¨•çÅ~ÈrïìòË@WŒ€Yœœ<Ki°×Ó³ªÞID˾´÷ "3Mª%¯¥A®I 9l×a$î„ÈíÙjîã8áò‹ Ê“i+¡'ï1\h‘ fb8ÿn^Ö¿H<ʳøns‚ŸÌðMai›yÇÔvl{¡‚™ÓcïR€Ð|ó³­ôÊkwq´<ÜàÈê i4ìyÒ–«<¡ÞÖhe.ÞQ“8ËsàJZÄI’ÿ·õ5ßJnm^ˆãh#êÈ"0ô£O¡q‘Kà–Pš{Ñ¡Þí)÷^ËpÁ¢ô aúÇr€ó;±³vÎóŠk€¶ «»jØ“DX|ˆ çÆýÆâ8ïÇ[Ì»BY¢{¡Zý¤MÅ8¹éf½ç <ôž€‚~1“{|Í=çé”Ó©¸=°’g±üZ:X(Îy6¢ÐÅô( NkQrv˜,£V’@6ÎÞÌ4h?s}ïhÞu V¹i˜éSb»ÈQ¥gFù‡t>öd;n1•­t¹L€•kH×Á¦¢o:H±“ï^,wÈ^4ÔÚÙtWü¹pLÙv³cJ±cê­øn6冊èäÄè ¢øéËà}%̓Äâž^èÊ5Zë¾ä3ys}î³Yaç Öd ¬·5!Ä žÚ0 ö¾;µ;Ö%*F&º?;NOÙüÆ–kõœ(…r×Ê„áµA•ù-$)àr²|zñÆÈN™9€š·Ú]¿ÂÌ ºD½œ™êÌ|ÍëO8Ad—vg?Þ gìd+ «?æ”}Çl§ÏÞ‹Ò…¬,~™µccçeÃÔ¸ ¹ôNà8/âLëWé7|` Ãßðé|þ w2Ñå/¾°ø\{^O¯\X¢”§ïKY¬²ç1¬øRé§@Òú­-äŽvÊáaꀕÈ\ẌUf±)–FmyYàn6ÌA8ËigÍŽQ"¨2ü!w`Úµ¢©`·(`Óqì»öXÆêe ÿepa1·ª<Ë<@ÃzäÛ…~ò·±cz_üÐiö’8-ôµü‹Ö*6êêo¼Êòâ''ÐU?“áù{õýendstream endobj 1782 0 obj 3336 endobj 1780 0 obj << /Type /Page /Contents 1781 0 R /Resources 1779 0 R /MediaBox [0 0 595.273 841.887] /Parent 1748 0 R /Annots [ 1783 0 R 1784 0 R 1785 0 R 1786 0 R ] >> endobj 1783 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [439.927 748.292 450.837 760.964] /Subtype /Link /A << /S /GoTo /D (equation.16) >> >> endobj 1784 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [412.343 712.227 423.252 724.9] /Subtype /Link /A << /S /GoTo /D (equation.16) >> >> endobj 1785 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [300.393 662.613 311.302 672.31] /Subtype /Link /A << /S /GoTo /D (equation.18) >> >> endobj 1786 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [409.949 179.632 420.858 189.329] /Subtype /Link /A << /S /GoTo /D (figure.11) >> >> endobj 1778 0 obj << /D [1780 0 R /XYZ 72 786.278 null] >> endobj 365 0 obj << /D [1780 0 R /XYZ 72 525.605 null] >> endobj 1774 0 obj << /D [1780 0 R /XYZ 72 448.053 null] >> endobj 1775 0 obj << /D [1780 0 R /XYZ 72 355.671 null] >> endobj 1779 0 obj << /Font << /F15 393 0 R /F30 512 0 R /F34 583 0 R /F33 497 0 R /F39 496 0 R /F37 380 0 R /F28 523 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1790 0 obj << /Length 1791 0 R /Filter /FlateDecode >> stream xÚµYKoÜȾ;‚Èe)`ÕÛ/’M# '16ÉɺÅ9PdKØCŽù­K~{ªºŠÎ %yí†ÍbuuUõWn©HŸŠ2e.:sQ¹¥"ú{Í£¿8mbDbñíÆë™óZ[‘Ëô%þTd0Tˆ>DJð'~õÃÂÍ„Þîuý±{õó«èçW×,ÃÁz†5Õ‘&wQ£nób ™MPЛ¥’HI˜›G7wó¦úWü¶¾Ÿzumu+õúê:5:þ=¾»xØMƒÃ,öŸJßF¢#ǧÁ¾®ª†Ç}}¿»Òy̶LngAu°ï=½VŰ#aI<Œøá±ñbÃŽŸüxÌ8-ò;µö¤q&>€%ô!( OR¦œ¨ùÝ@Ä£(Ëz?øGðF×½èYÄÚx­ù¹÷U=홥kꊇϙò¾kºö~^Å(ò™± µ‚}ƒCf·AŽMÜý½§aðϦmÑÆ‹‹[? AWºY… Gdé‹¡.1…söù Ò9°þÓ_hGr û²˜†ÀCØÅ/agpPvmY Óêg>ù‚6gjƺ½Çצõ­ïÖÜô£oKÿ=Ø.“¸Ÿž¡éAñ…£â6ÄIØÆüaŠÃ¡©ÑŸÈTŸÄP,ìú*€[a=AíÖ—#!€`¤e< AC£ 7Œ}ðébf;œn»Êb„߀Šk £¥ž á—üà#q!’‰²€Ô Z±¾(Ú†õA¸{ŽtñÛ+gãà/üJšhûpšÁ„uà™ŒPÁ˜4þÈî _g³YZpáZü! äˆüøqç{Æ×Á²u YêÒ¨Áßï9vüüÃ[#WPµPÚŒa¼ˆA»(y†Ÿa]òDjÒÀ¢ˆåîN(•EGÌB—+i¥êÙ•Üz%ýÄJnµúUYN}2gT%Ñ=}¿J`¿iðOdTêtÒ1„å 4SXxðmKèù„ É;Í–óNCP<ºÎ­°PÛ×{r¬\·ƒï!•… ͸ö½ª{ˆŽ¹b?¦>¿¤>…9¸ïA8ýû-¾>ÔÝ44ˆY¶ß? |{bài@—ÀQ€küâ'ª¢Sé‡ „”Z˦(;C €Ë(ŠGJ½sCØ`¼Æó¯­6gñ¶çY!U" 4ºmüž'à.S-Q©ÈÍ©ËÉ·ý*’r‰I Á:µÑ0ÂxÿåW0Xo¼v‡åÉ¡YìÅ”%à ¸VØ¿y¤m1NK™§•Sÿp•¤qøHÚ°&tOjî‡`Àú°úD›Ú“­ÂZÐ{Æ8’ZªÕÄŠ>·+ï˜ú?Â)’¹vX鲄²R…@!h5Χ’‚#õ=áoѬõ\Zzœ|Q?xWl<5|‡c»ä¬sVøJ½²-)³"Þ°6tauO¤²ÛïÖÙtÞXßËF¢”“¼Š{aÖÑWeª¦,–éÏ,à=Yc*îÜu°efi¾`¤èA© xI8`c‹ž×ò‰DóŒDë€ŸËø}MM!g.—s‡@_Qø è"lî_˜~€fÚÜf~£Ö2©Ò@8™åŸ_¶KMîÒ—KNçŸ_Ôô+%«•Ê¢%ÇpMÀ…PÃFEk2)²\Ÿ†,ä‚Çp„À|œÄxÞ€|ü“7wVÕô ‰ ³ÿË©@hôÍ‘~saT*àœð²ûR½6êhK¡k E{ïçŒb’ŒóB9v=½Lç·A0õ¢aIBÃºÕ h!MþµÇ©9O Ý–ýœªŸÐ"ý*§x8ŽCužïÃd’’¬E’lx;Ýö¶RpœO¾. ¬ÈŒ^™€ çýa˜ö‹FãnV™Ó$‡-u¤Ù´/Û;’}%Ì•ý,\X»­Eö µxʬµè e×Lû–vDA8í¤“0£'å¤j} AKí`×ÒS¸T lF±bu æbcâáÃDªàÙ¸ûú7XÐ,ŒýTòÛœœ±aöÜ}­T&B(Áðœ—÷g .õ‰hÝ#µ-þõ6r%LhÔ‰ÈÈÿÕ¦s3éпåïQ' C ²ƒósxðÈ8ïv1Û¤ºê™f¹HrpI¤ùrÐfkОž„Üo…Éí—Ã1;ãÑ#¹ÈŒF8›~±CÖw%ÐÒ eQ1©‚ O\™<};òN&RKøUç²UœðK.RXž½Œùófb„*N—Œ3˜Å¿Ù€›c—c²Ä^7{]+€[«¨‘šN¤Ðe[=_è¯XŽóÅ@œwT .jem…;ÕòwßPËÓ³@–ftýÑÍ“—”Âܦë†~i¡k<Y™…ÓÞ†Q©Zmº4FÒÚ%ÄA–$›4wå(|hº£’:|. xC@Ç™\ž–dJfˌ̆‰TL'8?óZC7‹,xŠÿ¶çt †¦n£Õ5;êöq¹øœ #ŒTß®ï,8á$6%E¼7+ú«†Ã‹wÞ:‚@¯ÒÒÓtïÌT¼©ÁS§ m& ?Œ».T"ŒÂ–H{~sãh‘‹n æ>LpŒªH‚©Ð„znÒæKèëë»ëà6R'/å!­œH\N ëé ¤¤<_BãÿYýtªû)¢Îendstream endobj 1791 0 obj 2173 endobj 1789 0 obj << /Type /Page /Contents 1790 0 R /Resources 1788 0 R /MediaBox [0 0 595.273 841.887] /Parent 1748 0 R >> endobj 1777 0 obj << /Type /XObject /Subtype /Form /BBox [-1 -1 400.999 280.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1792 0 R /Length 1793 0 R /Filter /FlateDecode >> stream xÚ+ä2T0B™œË¥ï™kdªà’ÏÈP¼endstream endobj 1793 0 obj 30 endobj 1794 0 obj << /Type /XObject /Subtype /Form /FormType 1 /Matrix [1 0 0 1 0 0] /BBox [0 0 400 280] /Resources << /ProcSet [ /PDF ] >> /Length 1795 0 R /Filter /FlateDecode >> stream xÚíYË®$' Ý÷WÔ4âià ²Ž²¼Êª£‘FºµÈ*¿Ÿc((U=ì’hFjù”ÍËæ`ûje6ÍÿŽß×þøóa¶¯§ñÑ1ú46i½í“S~cÄ; u‘©i@~›HФF^ÆÈbžjÓSÏQ’ça¹Ú´•4 ·Œá†y¾ü'öh¶_›Õüÿw8øÇ0rÝutV+G›I.+o¶ÏÇo] 1k†´ýµª²µf( Öm²ù£Ô7sÑž ©ƒ­•6Ù*b Cã¶àý!¾xŒÂ^kEž Ì3BûÃÙàT6‡ìCÌÊ„-Güb¤&ÇðKešÛ;œ7*Ñf£3ʦÍìØa­&`/Ô岨 >hP=Eyþ‹Êâ¹áè-äÅawÞ^ÃDß#a3áÛ¡2©Ê©ÃU¨L÷~LR}ÆàD£#»¢!Á°CÜtÀ­ˆ]–nœ±½#9Ǥ¢Ù\Ô^yœ àÆ;±¯3 Npqx@ŸCpžzÑ¥¤4ôór&Y¾Ÿ(·¢Ì7BÒ2ƨ5Ú˨™Tn<6«uóÚ¹Ì ÚÖ˜¬,¬|ìËš1ÖÒF…ÄHP™ eq{9 –ª.•kíq)ùr¤WãÇjkRPº­bÄX+a‡±øcsZ¬"È¡l6à~Œl5ˆ+—5ôC^Æ#ãAÉv3™ŒrvË:$Þ'D¡É]–1ÖÚ™‰"©\!:uÈáÎÛ0•+¾ÏÞ肇ëlõûî'–ñ̵DOç6ð..´5|¿]1F~â^…¤FŒIÊa9AšBJ>”,*Zä=¹ ”K¢QÑ4%÷j\Þ¸ˆz|?fkr¿~=V[cÒœ¸ìøi¾Ï9fMÌ«³t2ÊÄÊå(ßAÁ…ÈgmåŒ4¶18ÇFÐ7ͺ£³ß…Êj[™Qüßåþwìñ;{Úx(oÚØ mé’:6g~1¬¯×òH{D›Ïž©Ú ÊÖ´Lºf,Åo¤í€OÜ¢ô[æ_O“eB2c{GS›-u‚í[ûp•®§nà¤ñc=äÅø*+èžYÓƒ€£†g­­Mï9¿Âæ#o'uYvÆflïÞ Œtíõ¶„²f‚\ ÀÙàϤ§ßJª{o/zIBµ‘ÀEÂÑMJNв›Ds¡Acò)ÕÆ²…ZÁÃgPºIuþƒ:eѱOØO”po NŽY§¥ ÙS‡8BJÓ«9µ šoi¹6W¥wZKï!åÖüŠR¥îç@ôkŒRÑ×MÿƒþAÿƒ–Ù;y'•MÅ_ ä¹O_áB^Ô}Ú®4çV©¦È âtPóˆ0²g{ªÊÝí驪À@X¦RWC3gª¾‹%;¼8c{GRÙKÚ\¡‚Üw[O-ÈžHoÒ¸vï¿°mendstream endobj 1795 0 obj 1815 endobj 1792 0 obj << /XObject << /Im25 1794 0 R >> /ProcSet [ /PDF ] >> endobj 1787 0 obj << /D [1789 0 R /XYZ 72 786.278 null] >> endobj 1776 0 obj << /D [1789 0 R /XYZ 128.284 418.427 null] >> endobj 369 0 obj << /D [1789 0 R /XYZ 263.359 156.415 null] >> endobj 1788 0 obj << /Font << /F15 393 0 R /F30 512 0 R /F28 523 0 R /F1 882 0 R >> /XObject << /Fm25 1777 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1799 0 obj << /Length 1800 0 R /Filter /FlateDecode >> stream xÚ•TMoÛ0 ½÷Wø¨‹j}ZºXÛeÀrÛvpc%ÑêÈí.Ø¿?œ¢]PC€˜¢ŸÈGJªªá§ªFWMðR7¡ÚïTÅ¿§êb}#­3ÒY\Ý®/ȵq2x‡ø›»ûå*UËXÇj³#ì¦û.æCZ­MP¢¤¼?¬t«µnÄ0æ²ÇZLiLeÎyB¹ðÎK0 ÷¹´=»Oí|`ë×Ë0£¾ðGâÿÉß§ÝÌV[:ÞºyõsóŠY+¬:RQKF‹sî1)cD7ðw¢¯óÀyHŠW^FãßlèpÅS¦3ˆ²c–Å郳Ï%aÞ.ˆ.MÛ1s©cl»è‰ÒþÆ¿…5O {¡­saŠvÂ|îL|Õ,í•ÔÚ,-;æ9+§É)Ñ- Al]’#š7=FÚ`ÉݼÙ€± †ê¡’k£I!¡¨PÕïkQîÆÚ* xÅz:‚æã‰…˜ Oë­hñ£!q¨‡Í¡ð—ÚŽÆ9wØHëI.*µÅÅvK'˜0uÖzáíÌA/DÉ{2¶s†S®+7pgT0·j7Ò7—Ú¡ >Ñà\<:O\¿;¼~3O¹[°y‹E¿Ì`#Δ1z¾"b˜æo0G'ò99È~DȆwi×>÷3 A€,“$Ó‹ç‰æÃ[ãÁ å|¢â¾$†¡Î¸Uó’®®Û%$—µ²ºÀì<Œ×WÚJ3v÷ióò6ÆÇ(µÕ·^1­‚t!òs÷þó¥jõïÚX~ÿ¡ü Fí[×endstream endobj 1800 0 obj 600 endobj 1798 0 obj << /Type /Page /Contents 1799 0 R /Resources 1797 0 R /MediaBox [0 0 595.273 841.887] /Parent 1748 0 R >> endobj 1796 0 obj << /D [1798 0 R /XYZ 72 786.278 null] >> endobj 1797 0 obj << /Font << /F15 393 0 R /F39 496 0 R /F27 394 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1805 0 obj << /Length 1806 0 R /Filter /FlateDecode >> stream xÚåœíoœ6Çß÷¯¸—´RüöË\’Ko½dÑrK+mÓDÁÉYá R%ûëgCNK×Îö–(ªD*|ðïñk0ó嘅pÒÀƒ!ÅÛ7`ÖüÜÎvGåÿ5gb‚<‚Õo='¾ÛùbùAßù¾<1ð°Õ‰óõ›÷ Hf{³õu}Ò:ùõíâ€á·÷Y\‰<;x‡Büv™%üáà÷õoNÖÏ®Æ<¡ÆM‘ïQŠÿ¾i8¾|^öü¦kðÇááB¤éO÷U*2þ›O|ù¨»¾_òìO€<Ÿ²§?üáŸÏ|æ…$h^_ó¾|²ÝÑÇæ!¾¹âî!‚àû‹Õçô€¾D¨!a°§¼š‹ª¼àÅ…xài0$c´ÁúÖ#€ Œ%hˆ‡ŸÑãU”Þó² Wš$Á¸‚Q´l<­|ǰ´´q¥åÀ´ãC¡uÞУ2,Ô¼D÷òÅàj ïùé+ã}eã{ùÚ¢³>ÚDE(õ=Њ)KŠÇ k8š’…u¦ ù¹‹RŽ¦ßŠÉ`ýZG`R<~0eÁƒ)Æù2R-у]ñ¯>jjP§xè˜Aý™ÇÕ‹÷PéÄC‰ÝÁ¼ÜFEµ[™fœäÓÀ·›OkÞ³<éîí¨GAÐJ Hýž-ÓÊwŒH["»é@eÀ i5cê!ìÏ[–3îÁÎ.•1°½]Çž™m‡•‰!ªd¾”yz_ñ‹¨Ú¸ "L<'ÕÔ$YäYW– ¨ÂV ‰ô•Q Ç'S™Û‡2GU4Jî¢@‚¡=-â[ÚÏ«Åq± 혴1ÆõÍ-#"]g¯ó…Hù%ŠxÓã¶‘©5ä£ oO²DDÙ´¤G…b8¡v–ujÐE^(›^;©%0ÛO-A´a—™¨\$ž)¤ÏQ*}UVù-_¤Ñ“®5°”Ò¼ä+ñ¥3Ä2*¡Övx`”«âñ®*{+eGÚŒyGÕiúx·)]/²W55¨OsWeoP M48ÄZƒs”ß=ö‰†Œ7`öŒ÷î±6Ý>½ì_pAû\ˆdÿ„«©¢aŠÅ,ŽyÊ+~˜¦—âOGþ‰5ÿlhO²8Oº5s´ˆY¦í‰G¦DÃU ­â˜Ê~]`úÖ0ï·w®âî„.f Ð­({ºRC”î§üëÏ-'ÏGnI¬Ùkƒùá,ª ñàdÕAÖV-5°W.a±5X½Õh/ 8ZœåÛ;55®T©³QÔr[ÚÌF…ƒx]¥˜ UàÀ£(ÿÿæÛŸgNyu¸8SboŸÌk®´]ì M Y‘ {½U°çÑ–O…•ZÑÔ‰TýirE›¦*,)ÚÉ YFi‚˜NÓáÚ¹¨¶‘, “>¹ Ë ¶&—6ë°æóüÁAlÂöRëh³¥ƒ°âÔY¼o*.Øf\R´½K<ê2ØDkUðë'‘ô/}0•0±•4Ë`cé& -¦›ç´óÇz—O4Á2LµC`ì’¥)Ð!T“} w²h/®¹V‡Zku¾åqw…@×Ê€h­ËZ&Ƭ6+ýD´¾Œ7¼»F6¶rûÖVî+àZ•™ÖÌŽ2d2¸™m¿ÖwÈ—?N"š $Èò¡A1tmEúØÛ*0¶Y诨2æYÚô,¥^»jR°Í&Eê¨ æÚlf±îÙÑöYñ–èºê?íÚð}š¾ Ðe¹<¹UìÈ|±Eg]VQ*âÃì&u£+`«ºÂG^dÝ¢‚Ɣ鸚5œ¸ýiPf]ñlyÕ7û÷>û=A8¸~L1Š/Ë„wΛ HÄ·¨ü­DÆ/òR¨†¸‰GÈb> endobj 1807 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [181.756 711.087 192.665 720.784] /Subtype /Link /A << /S /GoTo /D (page.66) >> >> endobj 1808 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [204.665 697.538 215.574 707.235] /Subtype /Link /A << /S /GoTo /D (page.58) >> >> endobj 1809 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [193.21 683.685 204.119 693.685] /Subtype /Link /A << /S /GoTo /D (page.59) >> >> endobj 1810 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [198.937 670.136 209.846 680.136] /Subtype /Link /A << /S /GoTo /D (page.59) >> >> endobj 1811 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [198.937 656.587 209.846 666.587] /Subtype /Link /A << /S /GoTo /D (page.59) >> >> endobj 1812 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [198.937 643.038 209.846 653.038] /Subtype /Link /A << /S /GoTo /D (page.59) >> >> endobj 1813 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [198.937 629.489 209.846 639.489] /Subtype /Link /A << /S /GoTo /D (page.59) >> >> endobj 1814 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [204.665 616.243 215.574 625.94] /Subtype /Link /A << /S /GoTo /D (page.58) >> >> endobj 1815 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [158.847 602.694 169.756 612.391] /Subtype /Link /A << /S /GoTo /D (page.57) >> >> endobj 1816 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [164.574 589.144 175.483 598.841] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 1817 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [193.21 575.292 204.119 585.292] /Subtype /Link /A << /S /GoTo /D (page.59) >> >> endobj 1818 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [164.574 562.046 175.483 571.743] /Subtype /Link /A << /S /GoTo /D (page.58) >> >> endobj 1819 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [158.847 548.497 169.756 558.194] /Subtype /Link /A << /S /GoTo /D (page.57) >> >> endobj 1820 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [164.574 534.948 175.483 544.645] /Subtype /Link /A << /S /GoTo /D (page.85) >> >> endobj 1821 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [198.937 521.399 209.846 531.096] /Subtype /Link /A << /S /GoTo /D (page.60) >> >> endobj 1822 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [187.483 507.85 198.392 517.546] /Subtype /Link /A << /S /GoTo /D (page.60) >> >> endobj 1823 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [170.301 493.997 181.21 503.997] /Subtype /Link /A << /S /GoTo /D (page.57) >> >> endobj 1824 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 480.448 186.938 490.448] /Subtype /Link /A << /S /GoTo /D (page.85) >> >> endobj 1825 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 467.202 186.938 476.899] /Subtype /Link /A << /S /GoTo /D (page.66) >> >> endobj 1826 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [147.393 453.653 158.302 463.35] /Subtype /Link /A << /S /GoTo /D (page.28) >> >> endobj 1827 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [193.21 440.104 204.119 449.801] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 1828 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [216.119 426.555 227.028 436.252] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 1829 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [216.119 413.006 227.028 422.702] /Subtype /Link /A << /S /GoTo /D (page.28) >> >> endobj 1830 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [170.301 399.456 181.21 409.153] /Subtype /Link /A << /S /GoTo /D (page.82) >> >> endobj 1831 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [187.483 385.907 198.392 395.604] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 1832 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 372.358 186.938 382.055] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 1833 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [193.21 358.506 204.119 368.506] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 1834 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [153.12 345.26 164.029 354.957] /Subtype /Link /A << /S /GoTo /D (page.42) >> >> endobj 1835 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 331.408 186.938 341.408] /Subtype /Link /A << /S /GoTo /D (page.36) >> >> endobj 1836 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [187.483 318.161 198.392 327.858] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 1837 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [153.12 304.309 164.029 314.309] /Subtype /Link /A << /S /GoTo /D (page.69) >> >> endobj 1838 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [158.847 290.76 169.756 300.76] /Subtype /Link /A << /S /GoTo /D (page.37) >> >> endobj 1839 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [170.301 277.211 181.21 287.211] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 1840 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [187.483 263.965 198.392 273.662] /Subtype /Link /A << /S /GoTo /D (page.41) >> >> endobj 1841 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [187.483 250.113 198.392 260.113] /Subtype /Link /A << /S /GoTo /D (page.39) >> >> endobj 1842 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [164.574 236.867 175.483 246.564] /Subtype /Link /A << /S /GoTo /D (page.41) >> >> endobj 1843 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [164.574 223.317 175.483 233.014] /Subtype /Link /A << /S /GoTo /D (page.40) >> >> endobj 1844 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [158.847 209.465 169.756 219.465] /Subtype /Link /A << /S /GoTo /D (page.82) >> >> endobj 1845 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [153.12 195.916 164.029 205.916] /Subtype /Link /A << /S /GoTo /D (page.82) >> >> endobj 1846 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [164.574 182.67 175.483 192.367] /Subtype /Link /A << /S /GoTo /D (page.50) >> >> endobj 1847 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [181.756 169.121 192.665 178.818] /Subtype /Link /A << /S /GoTo /D (page.53) >> >> endobj 1848 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [181.756 155.572 192.665 165.269] /Subtype /Link /A << /S /GoTo /D (page.54) >> >> endobj 1849 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [170.301 142.023 181.21 151.719] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 1850 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [198.937 128.17 209.846 138.17] /Subtype /Link /A << /S /GoTo /D (page.42) >> >> endobj 1851 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [158.847 114.621 169.756 124.621] /Subtype /Link /A << /S /GoTo /D (page.41) >> >> endobj 1852 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [170.301 101.375 181.21 111.072] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 1853 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [187.483 87.826 198.392 97.523] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 1854 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [431.688 711.087 442.597 720.784] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 1855 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [437.416 697.538 448.325 707.235] /Subtype /Link /A << /S /GoTo /D (page.48) >> >> endobj 1856 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [420.234 683.685 431.143 693.685] /Subtype /Link /A << /S /GoTo /D (page.24) >> >> endobj 1857 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [414.507 670.439 425.416 680.136] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 1858 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [414.507 656.89 425.416 666.587] /Subtype /Link /A << /S /GoTo /D (page.48) >> >> endobj 1859 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [431.688 643.341 442.597 653.038] /Subtype /Link /A << /S /GoTo /D (page.64) >> >> endobj 1860 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [425.961 629.489 436.87 639.489] /Subtype /Link /A << /S /GoTo /D (page.75) >> >> endobj 1861 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [420.234 616.243 431.143 625.94] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 1862 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [437.416 602.391 448.325 612.391] /Subtype /Link /A << /S /GoTo /D (page.77) >> >> endobj 1863 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [477.506 588.841 488.415 598.841] /Subtype /Link /A << /S /GoTo /D (page.77) >> >> endobj 1864 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [443.143 575.292 454.052 585.292] /Subtype /Link /A << /S /GoTo /D (page.48) >> >> endobj 1865 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [454.597 561.743 465.506 571.743] /Subtype /Link /A << /S /GoTo /D (page.48) >> >> endobj 1866 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [448.87 548.194 459.779 558.194] /Subtype /Link /A << /S /GoTo /D (page.40) >> >> endobj 1867 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [403.052 534.948 413.961 544.645] /Subtype /Link /A << /S /GoTo /D (page.51) >> >> endobj 1868 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [420.628 534.948 431.537 544.645] /Subtype /Link /A << /S /GoTo /D (page.52) >> >> endobj 1869 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [425.961 521.096 436.87 531.096] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 1870 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [448.87 507.85 459.779 517.546] /Subtype /Link /A << /S /GoTo /D (page.28) >> >> endobj 1871 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [414.507 494.3 425.416 503.997] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 1872 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [437.416 480.751 448.325 490.448] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 1873 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [437.416 467.202 448.325 476.899] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 1874 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [414.507 453.653 425.416 463.35] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 1875 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [414.507 440.104 425.416 449.801] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 1876 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [437.416 426.555 448.325 436.252] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 1877 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [431.688 412.702 442.597 422.702] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 1878 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [408.78 399.153 419.689 409.153] /Subtype /Link /A << /S /GoTo /D (page.47) >> >> endobj 1879 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [397.325 385.907 408.234 395.604] /Subtype /Link /A << /S /GoTo /D (page.75) >> >> endobj 1880 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [414.507 372.358 425.416 382.055] /Subtype /Link /A << /S /GoTo /D (page.50) >> >> endobj 1881 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [437.416 358.809 448.325 368.506] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj 1882 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [443.143 345.26 454.052 354.957] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj 1883 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [431.688 331.711 442.597 341.408] /Subtype /Link /A << /S /GoTo /D (page.46) >> >> endobj 1884 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [431.688 318.161 442.597 327.858] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 1885 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [460.324 304.309 471.233 314.309] /Subtype /Link /A << /S /GoTo /D (page.76) >> >> endobj 1886 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [408.78 291.063 419.689 300.76] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 1887 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [431.688 277.514 442.597 287.211] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 1888 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [403.052 263.965 413.961 273.662] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 1889 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [425.961 250.113 436.87 260.113] /Subtype /Link /A << /S /GoTo /D (page.46) >> >> endobj 1890 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [443.143 236.564 454.052 246.564] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 1891 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [431.688 223.014 442.597 233.014] /Subtype /Link /A << /S /GoTo /D (page.46) >> >> endobj 1892 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [425.961 209.768 436.87 219.465] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 1893 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [431.688 196.219 442.597 205.916] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 1894 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [420.234 182.67 431.143 192.367] /Subtype /Link /A << /S /GoTo /D (page.52) >> >> endobj 1895 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [466.051 169.121 476.961 178.818] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 1896 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [471.779 155.572 482.688 165.269] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 1897 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [408.78 142.023 419.689 151.719] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 1898 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [403.052 128.17 413.961 138.17] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 1899 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [391.598 114.924 402.507 124.621] /Subtype /Link /A << /S /GoTo /D (page.25) >> >> endobj 1900 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [431.688 101.375 442.597 111.072] /Subtype /Link /A << /S /GoTo /D (page.77) >> >> endobj 1901 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [420.234 87.523 431.143 97.523] /Subtype /Link /A << /S /GoTo /D (page.39) >> >> endobj 1802 0 obj << /D [1804 0 R /XYZ 72 786.278 null] >> endobj 1801 0 obj << /D [1804 0 R /XYZ 72 724.167 null] >> endobj 1803 0 obj << /Font << /F25 380 0 R /F27 394 0 R /F15 393 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1905 0 obj << /Length 1906 0 R /Filter /FlateDecode >> stream xÚåš[oÛ6€ßó+ô¸ Ë«H=&µtuÏZÝ0°6c ÖÅä`ý÷#} ººÚ¢€†Û %}:â9„¨_ÈáØá˜ g_!çðÚ8§OŸôo‡‘”À¨ùV3ðú4òš0 \fÆßWï}Ì='xÞ –_ ÐßãT.ý4)þ„ ê7z÷Wðû{±Fs ôVùÕ ¸¯{ |80óÕü¸qNŸ>vþŸÍvNøÏ›:Ž©‡ô0€Øs®‘aõ0®Â…Œ&iašÌ+X†:¨ ax„wÁ´3."ê6æ}I¸ÝE²PY¬«h¡¹¥´ˆ*HZ·{pÍ9&>ÐÖ_Àa–¥Ùýƒ,²ðŸJV ðJY¡8s»°2r+®ž¥#»‡ýü6`G7ÓÑ,˜<}| *X=ˆ‹ËQé>Wt¹†Ï@ETç Ñu’…I¡ÓÔYÙÊÂìTöýCoMVÖ2«º€ ³Ò¨±Ï€¹Û=ªÔ¢vÄãp•W€ (­7ÚíTnèÕ•ï“C+Ê9B³Ýv›fU"af£´¼¸"€QX|ÆL% ä5­6S¥’EºT5ÊÔ[N"žµœ4UÚ Â—:‡è/ýr{¨i¡e©¶ªö†Ê¨5Ô™aõ´+¢0QƒD•ÙCUÅÍs쇑z”±ªÕ`Þƒx nF{±ÜNärˆÀbj3°5úà m¥ëÎô™íÏî…F—r¯jŽˆsûBxÆ:µ¥jÆ;õ,wQ1255LVƒ!…Ö„pOü.ÔTåi´3͈*7D”h9,EÖ;7]ËsÕ…ÚYd“gJf‹u];3àyåÀZÕÌú± ð.¡ƒÀ8m¬åðNòVæjæ—Ñáö´ó±W9‰yUÎB”îwn™1¶ZUŸ±–§S7qˆSkë#l°›Dåù¹­Sa—ïWÐm‚›®ÆêEEU…€KJk‘'ö•Þn3Æ´ô0jUЦ2/TæG²²AÑŸ lSާjQ aŒì"ÆØœñÿ®Œ3½H¯4ž:j„Ú꨽RVÅRhW‚¥®¤Ï«‘–‹5JAD§Ú¢´hÊt£Læ^³v/ãöK¸lpK®tË\›évŽÐDf2·èE‹½ˆµ^Ùܿ֡Aýü6P#™5=þ¾ê ƒÖêL‘ÌýäŒá2wYDSaj"Y_J™íúòc-mÊÝ·\qrj3xšÜ÷µô´>;牀–ë³ “IþœfqML{´#dÍŽ^aël髥ºk¯é¨4w£/YX¨ÿÁ—QôM.6¦;:D˜#k=àùÇX®”Ÿ¥ñoÑ÷ízˆð ÷ìðš‰Æ½ºñ ÀÄñ,–ÞÚÏ„‰vFÊé_»ñõwendstream endobj 1906 0 obj 1072 endobj 1904 0 obj << /Type /Page /Contents 1905 0 R /Resources 1903 0 R /MediaBox [0 0 595.273 841.887] /Parent 1952 0 R /Annots [ 1907 0 R 1908 0 R 1909 0 R 1910 0 R 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R 1916 0 R 1917 0 R 1918 0 R 1919 0 R 1920 0 R 1921 0 R 1922 0 R 1923 0 R 1924 0 R 1925 0 R 1926 0 R 1927 0 R 1928 0 R 1929 0 R 1930 0 R 1931 0 R 1932 0 R 1933 0 R 1934 0 R 1935 0 R 1936 0 R 1937 0 R 1938 0 R 1939 0 R 1940 0 R 1941 0 R 1942 0 R 1943 0 R 1944 0 R 1945 0 R 1946 0 R 1947 0 R 1948 0 R 1949 0 R 1950 0 R 1951 0 R ] >> endobj 1907 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [153.12 748.292 164.029 757.989] /Subtype /Link /A << /S /GoTo /D (page.37) >> >> endobj 1908 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [198.937 734.439 209.846 744.439] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 1909 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [187.483 720.89 198.392 730.89] /Subtype /Link /A << /S /GoTo /D (page.67) >> >> endobj 1910 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [181.756 707.644 192.665 717.341] /Subtype /Link /A << /S /GoTo /D (page.53) >> >> endobj 1911 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [181.756 694.095 192.665 703.792] /Subtype /Link /A << /S /GoTo /D (page.53) >> >> endobj 1912 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 680.546 186.938 690.243] /Subtype /Link /A << /S /GoTo /D (page.63) >> >> endobj 1913 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [153.12 666.694 164.029 676.694] /Subtype /Link /A << /S /GoTo /D (page.31) >> >> endobj 1914 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [210.392 653.145 221.301 663.144] /Subtype /Link /A << /S /GoTo /D (page.76) >> >> endobj 1915 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [158.847 639.595 169.756 649.595] /Subtype /Link /A << /S /GoTo /D (page.47) >> >> endobj 1916 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [193.21 626.046 204.119 636.046] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 1917 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 612.8 186.938 622.497] /Subtype /Link /A << /S /GoTo /D (page.39) >> >> endobj 1918 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 599.251 186.938 608.948] /Subtype /Link /A << /S /GoTo /D (page.67) >> >> endobj 1919 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 585.702 186.938 595.399] /Subtype /Link /A << /S /GoTo /D (page.54) >> >> endobj 1920 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 572.153 186.938 581.85] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 1921 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [187.483 558.604 198.392 568.3] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 1922 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 544.751 186.938 554.751] /Subtype /Link /A << /S /GoTo /D (page.24) >> >> endobj 1923 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [147.393 531.505 158.302 541.202] /Subtype /Link /A << /S /GoTo /D (page.33) >> >> endobj 1924 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [153.12 517.956 164.029 527.653] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 1925 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [210.392 504.104 221.301 514.104] /Subtype /Link /A << /S /GoTo /D (page.40) >> >> endobj 1926 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [221.846 490.858 232.755 500.555] /Subtype /Link /A << /S /GoTo /D (page.24) >> >> endobj 1927 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [204.665 477.309 215.574 487.006] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 1928 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [193.21 463.76 204.119 473.456] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 1929 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [216.119 450.21 227.028 459.907] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 1930 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [193.21 436.661 204.119 446.358] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj 1931 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [198.937 423.112 209.846 432.809] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj 1932 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [170.301 409.26 181.21 419.26] /Subtype /Link /A << /S /GoTo /D (page.31) >> >> endobj 1933 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [187.483 395.711 198.392 405.711] /Subtype /Link /A << /S /GoTo /D (page.82) >> >> endobj 1934 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [147.393 382.465 158.302 392.162] /Subtype /Link /A << /S /GoTo /D (page.35) >> >> endobj 1935 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [153.12 368.915 164.029 378.612] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 1936 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [158.847 355.063 169.756 365.063] /Subtype /Link /A << /S /GoTo /D (page.34) >> >> endobj 1937 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [164.574 341.514 175.483 351.514] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 1938 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [181.756 327.965 192.665 337.965] /Subtype /Link /A << /S /GoTo /D (page.55) >> >> endobj 1939 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [187.483 314.719 198.392 324.416] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 1940 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 301.17 186.938 310.867] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 1941 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 287.621 186.938 297.318] /Subtype /Link /A << /S /GoTo /D (page.54) >> >> endobj 1942 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [176.029 274.071 186.938 283.768] /Subtype /Link /A << /S /GoTo /D (page.54) >> >> endobj 1943 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [158.847 260.522 169.756 270.219] /Subtype /Link /A << /S /GoTo /D (page.50) >> >> endobj 1944 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [153.12 246.973 164.029 256.67] /Subtype /Link /A << /S /GoTo /D (page.81) >> >> endobj 1945 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [164.574 233.424 175.483 243.121] /Subtype /Link /A << /S /GoTo /D (page.55) >> >> endobj 1946 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [164.574 219.875 175.483 229.572] /Subtype /Link /A << /S /GoTo /D (page.74) >> >> endobj 1947 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [170.301 206.326 181.21 216.023] /Subtype /Link /A << /S /GoTo /D (page.63) >> >> endobj 1948 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [181.756 192.777 192.665 202.473] /Subtype /Link /A << /S /GoTo /D (page.51) >> >> endobj 1949 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [193.21 179.227 204.119 188.924] /Subtype /Link /A << /S /GoTo /D (page.54) >> >> endobj 1950 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [221.846 165.678 232.755 175.375] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 1951 0 obj << /Type /Annot /Border [0 0 0] /H /I /C [1 0 0] /Rect [193.21 151.826 204.119 161.826] /Subtype /Link /A << /S /GoTo /D (page.86) >> >> endobj 1902 0 obj << /D [1904 0 R /XYZ 72 786.278 null] >> endobj 1903 0 obj << /Font << /F27 394 0 R /F15 393 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1273 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 1953 0 R /BaseFont 1959 0 R /FontDescriptor 1960 0 R >> endobj 1953 0 obj [ 529 816 762 593 653 686 707 762 707 762 707 571 523 523 795 795 230 258 490 490 490 490 490 647 435 469 707 762 490 840 949 762 230 311 490 816 490 816 741 272 381 381 490 762 272 326 272 490 490 490 490 490 490 490 490 490 490 490 272 272 311 762 462 462 653 647 650 626 704 583 556 653 686 266 459 674 529 850 686 722 623 722 630 544 668 667 647 919 647 647 598 283 490 283 490 272 272 469 502 435 502 435 299 490 502 230 258 475 230 774 502 490 502 502 333 375 354 502 448 666 448 448 425 490 979 490 490 490 ] endobj 1954 0 obj << /Length 1955 0 R /Length1 1956 0 R /Length2 1957 0 R /Length3 1958 0 R >> stream %!PS-AdobeFont-1.1: CMSS12 1.0 %%CreationDate: 1991 Aug 20 17:33:47 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSS12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /BUXHDC+CMSS12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 46 /period put dup 55 /seven put dup 66 /B put dup 67 /C put dup 73 /I put dup 84 /T put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put readonly def /FontBBox{-62 -251 978 758}readonly def /UniqueID 5000804 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ\ôéÒ@[I‚vù“btn—2}|Ú?Wsà­·3J “Ô ‚úBª±XŸ}`¨¬z–¿ŒZ¯æÔ'¦ýÞ¢þð¸«Ã|m¶,‹@tÍl8TÌf头Åùë½÷«RBÍÙØ¹ËR+Ž©rðèúöƒ u l‚†«4œ$ À,÷óáSÃI˜bÍtÀ¶4=WJ¹nº”´2ÐÊÃ"@ÝVžc›JÏ ïêÝð`eQÈì„§¦õ‰´Ú¹5þv3*VGÚ¹q‰uE1ue”ÕÝó©¢ââ$ÞÚx­ß–n瑇,‚Ý|;×e÷.|© ¬–˜£Žº%M™çÜ£IæP,˜ø”™N÷ ®íyÑñ.¡±‹ø¼;X‚²êuXQê -z%?m´Iÿ+%÷¸8[&¶»³,œ‚ðE¢âLXÙ¡3Y•2~×S½òå‡ý‰Âp°yÎ]£Ì U㫜@fÍ'?æíy.*&·$dž“)ÈôbSETo»gߎ—ÃöYCJ¨ÿfü ™áÝŒ?‘Ôoß²­Ûo&ÿûX¸Š%¶ïâk¶\ä¥9ëlÕqÉOís]a#áuŶßút1\vƒ÷'Ôj¹2‡ú’â¾&k¯ а:S|öµXÀ&Žƒ„§_éx%. žÐ)Îà~ab>Å(ºñ£{Á@ìð—nˆîS>·!f Òð%+2× \Ïí`í¤ÕèΘ,)¯ìxÖÔÒ ò< é³ÁM­ ~Q„Ïæ•˜šòæÝN´ZGp–¨Ðñç…tAÌèÚPo²„ó§˜6ühÒsàÖfy÷I¶§€;àâ̾¸©ô¼”d<&>?iÝÌKí…8œo¦`Ž%‹Nó{ª—…ŸÃV¶óŸ;õ¯öŸWhÀtO¼´’q®¯_¼qâŸÐ˜Eyz–>“7!µ-tÒ&/J¹Ž}ß09 4ø€8pþç&üåïDueXœ¬rý òÖÒF0íá#ºÃÏù•‰–V°’Rtbø«Lm¢•˜ƒd©·VÝó@2´z«Bé­š˜wÅþ~© ¥,ØÁ”O.µì~³ UbtãÞHi|îiê¼õi\óo‡†Sp¼:†QåI%}ˆÄvÛ‰Ð|Ö~ë,A)æýy¾4»Žæq¬Êçô0X×À‡L%ó±Ã•¹˜ä-x«µš…™ç0¦«-Û¶(§ƒßöwbÇ.5`FM)´)5ˆN&jç ¸9 ²LŸº2ä³­tm[z+*ÒÃ,³wÿuIOiâa’ÌÅæÉ-Ÿd¾fûÏ;¹'¢…4x”;ƒ‚#Z"+ %ä­ä]r»£OÃ!g÷Ýq,V|ÅÜ$2Áò† ï¤[…† D£lc#‡•¦ðKNÆàØtr¾›/I&TKÓP~w6¿Z!bfƒ: §àõŽåÚ¿Ôgà­¶»0,®ÞGÚ(k×#µ%o?)Awù¨‹•¥(„nYÚôj){÷ê]0S^Ä­Œ`ŒûkðŠâ—W=ijžYVtíZt†L¶ṫqiö‘Å®{¼ß”\žÅvç~z¸ÖR´_}>7åPd§¼]JÓA†= tÀ·éˆô‰±Â6ßZvžJ¿þ~ïƒQw¸¶5°ÿ¢=¸˜©B¬ÏIh?¶ç6GÛÀª ç©BÊ0t´#=ò!#Jd™„·Â·×aŒž´Âîî—ãG(Šþ¦T ö–‡ƒõµ¬ X60iÅÐ'ÃÄ¿F14 èZÄFé÷+áµÁ+/0—|¯ZеŸ²öj¸÷ƒVÍy:²ÎqÚt¶ðë®gÜzü?à¹8è°²SÓ¯s0¸6®t¤áäÓù=J’‘‡F–ak ŒÔŽJë7¼Û¨EdŸä¯¦Gë†ÃänQ’\L!U›,ü2']Éqøl;â>Kgõ0Ý>ñÕ­c „s-Œ=¨!ä¹âa4œ+¶œ´=CŽócR¿L.1AeØItÆêqÇcÓ>2Ÿõã~ý„Ü/™âÜúŽOZVgq˜eí) }vð:*#-x”†ûÉJjvò_È£úè‰8„_³6]×z"¨úõÞ¢Ká£zFR¢ôøbÕˆ6&®iÁuÒ¹ˆ½c-„$ÿ´\Îb”ε2‡­¬vÓ§%"GrÒ‚òSì×ÎütÃTÔC?®ÇþH׬.^xÚLí~ÏmúÛvÚã$…Ãnné{gâZ_\6 £òÊâJLú±?•qs …ñ¥±<”sSåê|RiÒwM—®¸ »¬ßŸ(#—òM½G¤é‘äW§ÍÖù;ó‡nšE3Ñc\kû—Ve†åÑʯyÊ!å{Ê¢/Z¿R )péç!="á#Ü{­µ–ºÝ]ˆÇÁò ‘«C˜+%a<‘ؤËrV[s€žàÁRâ'G³Wì9$1oµÉ~mÜ÷Õ‰?`FÉØ Æ£ #@¡”ÓþÏõ=(+†ÝFɯË(Æ]è.ºSK׳ð6·ÐF*¶ÙòâÏJEÖˆM&2âÍ Ô!E.­8¿ ² !/ó‡wš›àz!%Ná6Íí~ ¯ŸI¢°!Z"+ŽŠ†#Ù…LWIx̃âkÿéÖÓ1Ù(³Ê9UóÚü–¥Ñ#öÅc°B×̺ã|®Ìr Ö+ÝÁgÄ÷ïšéJÊU€’¯÷løÚOE µó[ÍYrQÉ)làêHèÅ;šß$Øaˆ¶¾ç=ÌÉhØO‘±u=ÇCˆsh@fHáANÚ“9N^ú IfÀ֯Ɠ¶Þ—š k¯T®^³uÊ[œDZ± CÖ»Ú‘þ9=ñ;vÊ.îÃl¸”À"²1 °™9Å5ÂÆã´mFûõcZªÐ/¹m'l¨x\$¹WÐdµŸTÞ(ÊZ{¶Â7 Äç«é!LÆ0îÞæR†ÈÎæ "nWäø4¸¤ê3´øØK¬¥—Ò~vö³ÅßlôGió¿8Ñ'“Ùx=M:‘3R/4z~rÓ¹¿T@PV8 ™KØ<´0½@%6›÷,°”iëÁwqµ7ñãm „¾ —¯Ò5‡NúÿÁeª…§´_7ÇÒƒYpŸ{6fµ©¢„’¯¨±8€.K·Z:=`G4B’‡Q©ã¡"À^šMW.¾Àf?*¦§«7…¯2Ú¿9ƒ!I»Ú‡`­!L‘eF…£V›û ¦c3–qó`Àƒjç½—[D&Ö4xÖ¾ñë:ôÄ%âb¸*œõ=Q˜gGäŽUåo-Wp?8™¤Ê/L}Ò öÂåÑ­Oÿ+›]«,!*®>·ä„ª pô{Ò$½Û¼ËWÆõ“æe›Òççèl&=&pkbQáàÖ Ò Ø}J‰t“ ÍSÉ̬ùÉ¢Ö‚½" 7€Ä^þáŠÉ(,MäQóª°KÈÄq6Öõ=%ƒì– µ>&މXÊÅ%Ù»·ª Ÿ&ô¹ È©£`YѨ¤;Åû¥ßÓi¶¯°äa›C¢i›2²Øóã°sÐôaàsÊÖŠ wü%ÓÑIÅçØ’?SluaØvHæÌ*r§ˆS8¾•ÊÒXuzŽ16%ò{Ñò+¶QûÛþ^à9ù³õà“D«! Âß$³õ÷Jùô­æ„Äé÷¿vW-†—-§¥ŸÙ-˜Ò7NÜñ3ö-x'r‹ür°¬ÕŒoÁæàí£”.‰©©ÏmåíĘFÛxL¸süÉÕ)PmåF]qŽ€¹ì¦ËØÚÕèɪšIëÓQ+Û@ä¼£ ·ÇOH;1¸x;CÊØ[¤»š^(/¼0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 1955 0 obj 5846 endobj 1956 0 obj 1196 endobj 1957 0 obj 4118 endobj 1958 0 obj 532 endobj 1959 0 obj /BUXHDC+CMSS12 endobj 1960 0 obj << /Ascent 694 /CapHeight 694 /Descent -194 /FontName 1959 0 R /ItalicAngle 0 /StemV 76 /XHeight 444 /FontBBox [ -62 -251 978 758 ] /Flags 4 /CharSet (/fi/period/seven/B/C/I/T/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y) /FontFile 1954 0 R >> endobj 1272 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 1961 0 R /BaseFont 1967 0 R /FontDescriptor 1968 0 R >> endobj 1961 0 obj [ 581 917 856 672 733 794 794 856 794 856 794 642 586 586 892 892 256 286 550 550 550 550 550 733 489 565 794 856 550 947 1069 856 256 367 558 917 550 1029 831 306 428 428 550 856 306 367 306 550 550 550 550 550 550 550 550 550 550 550 306 306 367 856 519 519 733 733 733 703 794 642 611 733 794 331 519 764 581 978 794 794 703 794 703 611 733 764 733 1039 733 733 672 343 558 343 550 306 306 525 561 489 561 511 336 550 561 256 286 531 256 867 561 550 561 561 372 422 404 561 500 744 500 500 476 550 1100 550 550 550 ] endobj 1962 0 obj << /Length 1963 0 R /Length1 1964 0 R /Length2 1965 0 R /Length3 1966 0 R >> stream %!PS-AdobeFont-1.1: CMSSBX10 1.0 %%CreationDate: 1991 Aug 20 16:43:06 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSSBX10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /TADAAA+CMSSBX10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 33 /exclam put dup 78 /N put dup 101 /e put dup 111 /o put dup 116 /t put readonly def /FontBBox{-71 -250 1099 780}readonly def /UniqueID 5000806 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª)s™§„̾…´™;.ëÞ;Ôr·ÏTeò…ji«–íK­/df5à¶A|Ç{S/…ØÇ )¡šSïcë\^ÈŸÆÂm‰çÙäp·+ïÚ#õßv¾¯Lé17¢íŠ©×Öýó~kÍàÙ ˜d#å– ]Ÿ»L•eVèßËúìGo£oÙ¥È\šõþÙÂÝÒkÜ ™9‹ŸMÕ™=ü 1Üh©{]N À${ãéEV´žN¯n©Ÿ @Q”ôØÖDòáðè õÇÕ•…Á®FÐ%¦|Õ¥žËÞ*¯‡÷%©„5‰3…Ænm« 2tº\Ü™-—fÛ9bÔ†âh%P¯ÞËËv¢ŠAw[.ôv|¤(cn¦ž€³¡Ó0`¹ð%–ï$1ôS'Ë»Ëc] ÆF—gYå.°že· §¡n¶^½&-½¦–Mk‹Â ¹rÚX Éúg¡¢k›Éq*šZø#CÑkÌT/‰ÒŒ ¨‡\é Ѩúúeø“ÊF/Ú©n*q«È©¢ ç®°äZ:ÞWê#·R’B{(-œ!×e¨Æ‚z÷tºï¢MË-²$Ê<8î1£é™_°‚ºø?Îö:Se(ƒ”(­ŠhòT¶\ìjÛÛµ$Ôc“ˆ7J\tÄmòý0Ƕ•í2¿ûQNDK±ó¾öCÒ»ü²”©‡‰-¶1°›Ÿ$†ãúôO8éù@TH­;‹`8Å/ætÎ#ðŀ‘µZp¾R¸YJ”X52>ÇçŸV^– ^X™ u,àMòô¾‰bÍ!-ÀH 3ÿ•aX|Ÿ+ˆc‘SÏR£ aÈ‚JÖÞG¿Ë CqsD¦JúIˆñŠ%iÇà òK9^P(w˜Vx>Ô=Ž+(!çÌà·@´ Q+幨Dmöóò“E''EË#Úz¢æÿYSrJ:GQýÔå Óÿ¦öÉ]œ–.oEBm@!‹=‰D¢tzð•YvøÝ“Ê3“åt¥Ÿ 39!ñ‚.Øeå‡A*yR¥އH[”ÅÉód{èÎèÕlÿQíh¡lÏÙL[§ã¢Î¶ªc˜‡7‹W0™ýáý:•N6‚™í1È,][Ï3Á_†½#M脾E—){“3Æɼ“åHŒ Ø©ßÙ‹¿Èbà±@³PÌ’uö²¹SôEP"{Ê®m• oL£÷ÎÃÑ]“nà„ ÎƒÅøâMmÇÍÞ JÝW¶«¸Rc+RM«4]kÆPÁÙòMvÚ­K”á2Ÿ“KrQ}·à´u!¹-w¯|²0‚J¼ŠæŸF¹ìÇÆ­_¿*TàϨf­nÊó†;#u›JuÒ] }-8ÕðA¾…û{¾O=çâ÷N­ûí÷äsñnh1Pžo V©G$ÑÈ\ó ³Ðþ/þþůNúOƒÁH¢–üLb>[šñ+z©IØ@Ä·´ÛT£W«J-#öl»2O¹Ü€± ‹‹ešA.ͯ3Ag§ã³,é?ÙCeèqÙ~¾¼®„À7k†¾50000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 1963 0 obj 2970 endobj 1964 0 obj 829 endobj 1965 0 obj 1609 endobj 1966 0 obj 532 endobj 1967 0 obj /TADAAA+CMSSBX10 endobj 1968 0 obj << /Ascent 694 /CapHeight 694 /Descent -194 /FontName 1967 0 R /ItalicAngle 0 /StemV 136 /XHeight 458 /FontBBox [ -71 -250 1099 780 ] /Flags 4 /CharSet (/exclam/N/e/o/t) /FontFile 1962 0 R >> endobj 882 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 1969 0 R /BaseFont 1975 0 R /FontDescriptor 1976 0 R >> endobj 1969 0 obj [ 458 458 417 417 472 472 472 472 583 583 472 472 333 556 578 578 597 597 736 736 528 528 583 583 583 583 750 750 750 750 1044 1044 792 792 583 583 639 639 639 639 806 806 806 806 1278 1278 811 811 875 875 667 667 667 667 667 667 889 889 889 889 889 889 889 667 875 875 875 875 611 611 833 1111 472 556 1111 1511 1111 1511 1111 1511 1056 944 472 833 833 833 833 833 1444 1278 556 1111 1111 1111 1111 1111 944 1278 556 1000 1444 556 1000 1444 472 472 528 528 528 528 667 667 1000 1000 1000 1000 1056 1056 1056 778 667 667 450 450 450 450 778 778 ] endobj 1970 0 obj << /Length 1971 0 R /Length1 1972 0 R /Length2 1973 0 R /Length3 1974 0 R >> stream %!PS-AdobeFont-1.1: CMEX10 001.101 %%CreationDate: 1992 Jul 23 21:22:48 %%RevisionDate: 1997 Feb 16 10:50:33 % Copyright (C) 1992, 1997 Y&Y, Inc. All Rights Reserved. % Please note: This font is NOT in the public domain. 11 dict begin /FontInfo 9 dict dup begin /version (001.101) readonly def /Notice (Copyright (c) 1992, 1997 Y&Y, Inc. All Right Reserved. (978) 371-3286) readonly def /FullName (CMEX10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /IVCHLA+CMEX10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /vextendsingle put dup 16 /parenleftBig put dup 17 /parenrightBig put dup 32 /parenleftBigg put dup 33 /parenrightBigg put dup 48 /parenlefttp put dup 49 /parenrighttp put dup 64 /parenleftbt put dup 65 /parenrightbt put dup 66 /parenleftex put dup 67 /parenrightex put dup 104 /bracketleftBig put dup 105 /bracketrightBig put dup 113 /radicalBig put dup 122 /bracehtipdownleft put dup 123 /bracehtipdownright put dup 124 /bracehtipupleft put dup 125 /bracehtipupright put readonly def /FontBBox{-24 -2960 1454 772}readonly def /UniqueID 5092766 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ\õ¸ÊƧ¾µÐ"våÿ¯*áÞo$1”Ð|¬Ã#ó`ˆ¡ݧ’ó2Y†ý°«ßÈŽK@瘉!ÕQìgëÊDÀVWðÜ‘>{0¥óá3{i‡þ¼Eù‰ÈÜmÀ­W~?ÐÕB ®(Ç4ñ0Á3´„"¾Ô†9¢·NLòçâJ™óGàô9LæN¬µIWn‰NRê¾Y[ÉdmŒ+«IfN•|=‰ÄÇcÕèßú¬G5‚ÊàyJ©i,dRhŠt§¦§­ ¸©x<#^Áê!V&OL IºrV0ºø^ÅEí²–7€½Ã“;k?ƒ‚­ú¨ 0\j,2dÜz=ýsÈ%áÛ†zêS'ØS3/å!:¸B>Í vÊFÍ R ù Ô¡Ô!ü) ¯Æ^ßÑõ•…gç½i³ýhßSš…KÒ'59›ïE·mo‘>=Ħàg›Y(„•‹M‘}’¿œö]ï»ãåg.ã·×ÇŸõJfùíѪK¡åR•¯yä†L´Ê­ÇÐÃÀR°JòI€_RÏ!µ™JèùKñìvçF…†Ñ 3µ‰ó W=ŸeBT&›º„¢Ã$¼Ê•X ;Ý7“> Ô''³Dä?^¼Tu«t~v2°a…§Â®'T›Ôšø-9sÆuµF‰Ñ(Í™ß8wbVÀé4ö G Ôëò÷¾_Í··Y f ·«©M½‚¡òâ²qm5B"ôò–LõvR5A•[,œÆe]³k7ÄHeµj¬²èþU™9«#œ(âýc’º²zðI Ω«n~#ÆOÚ)Ûˆ0/3úÛ™\Ì*–àhØ— üûÞÞ{€úóš£|ýGÛÏÅ#54%µZ™‘Dß‘‡¸¨\ªë?y£÷ÄÿÌúöáìÿÌ“"›Ø¹qÉW ê¶+ŽKð¤,Ûž‰®˜*ž„èO‡LÙeíF”dR¸VHJÄg|s[åìzˆƒ˜Õ½¾ôêA0P.Îc.m"ÿ‰ü"–Ëø™èîÐ4_PzäôDe¼1!gôhû¥œ!c½·Ê÷w·¢Q} ü‰opÇ{Õ‰í”r1£†È¥ʈ¸O¹RFŒÛn™hˆÖqB?IIÐTá “\« \›Wÿ×g°Nc*K•Ó’£àÌpùª&öBtt žd9+¹É¾þ3*:‰ÛgdͯáQœ˜HÆ3òMÞ2S/ü"ëU™Orì+^§¦W;:µ yh a\!ZþÍ B¹euJ+a·ö ªDa¼&kÎJq³ ,ÕÈ Cr(&¢z¾È^Î"_ZzŠÍ+†Z0¸%È¡7”Â#ßi©†e†ÖõXƒÒ¦›š°îÊôω‰´—TBèš‹!L¸§iK=¶8¿Î²Üì´îíÊÙšPõP—CòßÖ³[¯oÁ¥z£‹!ôæÑeØCûp]\柰IQ·$¤OƒÃ T°ÑÝÚåN²ýÊbå¦8üÝ´(N÷ƒC<Ћå2c †4”ÕíöyБzG'Д…¶bå;w$ÊlEÙ‰úãôášàV*NlYN!‘3¯ Lªß•o§h"›°’‰{ä¤ü²_¤(çúÀ—N`f"õ™µ„­%»¬ ï~)·S³´§¢ÁÐê…;a¤»äÜ›o¼™~6εÁW!›ˆ÷Œ3 $æEõ¦WLùE½:U'Õ±šaµUg²ÆˆùˆZ‘…‚Burk§ÚIf@ÿÉ™†žNƒa0Tíü!? þ˜÷9RGw7Ú¿­XgÏþß§Ryø›Ïõƒ?ÃàV¸^m¦ò høYoýæí‘V\b9þh$`‰èËê›-\~òÙ{o؆…deÝ’g_EÂêSO­€ Ý¡E£I«Î©bÖÓÖw`¶@Y]t“.?Uo¾oUÚÇ€“î\Òi1Iœ¨ÍÕQLÐϾ¬Æhà L®Hð™åñà^:B”lyÂ$ÃUãyy1·®Cãß‚·JJî’ònÌðóƒ8,Æü¥?–Ëz _¹­úâ­ƒA•ÛÖªd Ö‚ƒä ]œãÇîÿ¨Ž `nŸ²mo«x@ÍÏà ÜÁ®ù±4²@óz}§\ ÍßR¶æ#Ø;¾l~‡MºoóUÜA ãÚÏ*“ÿ.˜~û©z§Úð˜µ@h³—ÔhIêðÂÉ%ø½4›ûØ[9«TB´×"Eå ‡]û”¨) f# †š¨óªÃJözN­‹¶~CòH aR€5ˆ$— ÊámUšÁJœî­ ÄÏ)/ú‘êÞû 7«62Ðu Çù Ä©’ørfé±…ä—´Ûÿ!å@~Y,á\!øðTZãè=,xÙ]&×Óßµ¶u+CójÆœEÀRÀì?ÊŽ·½ÆýUç½~! ê¯A&}Y1ìxE“æáÁ¼7æáQ)^Aå¾lœÐ@J[žkâ}°ÝÍžÌõrÑ–zîÆÌåHô¨B‹ôájèEƒŽ,šÆ]ègã½,´v]~Ð’ÕãÓ¿}…K×^OÌ­‡›M?ˆP¦¾ã>iŽAl±ÆvR7†ÜÕá°ÐºŽ€Í ”›¡õ,,ÿÙŽ1;Âj‚Ű¡NZ·2³Á¯}ƒ¼kžÚ×`1 ŒJV=mŒÐcA œ˜C—øIŠÈ{9KJô{xét/p'L¾ôPΚŠ´“—õ·oz̰DÃÓ·¥èøh¸Eô7 Ëž¯st½ë;+×aÀÁ_<·ºS'*DÌñ4ýÊ«ÎUËÕ#QÓoJ\zƒ€ùþÕþyy½™Q€Ãïnm ,ÌêÜ«|añ‹SÉ¿7NÚDiH°QIëû·ËÊ_=a9Ø^ÌÔ+æ<¶×!wƒ kÄ+C´„>gkyøP‡b[AÉÝóuî´Àj­†"É?júÖ>€€e¯M `Ûâ0²–ì[sü—œ"Ýθ…ñVn!H;Ó£Ðm0wùWíX¹¾g²29ߨšÚÁJ>'#ét „ĬöPÌ3º $7ß+†i<9ïGzå¯L×I4 •È;UšJÕ<îÒÕÒ‘»ûÌ“­n¥ª«~¾bôaí6E­šOêª9ÍòàݺˆÂg[þ‰ö²»GqjÙ@Zí§øX«Ý ;¼OÙ•íØ SÙŒzÁ¯ÉÝÇt:ÇžlEœÊM˜AÎGˆRIÎíÕ3äµè›þ«ޝõŸÃ0#OÂt‰Ââ×n}¶‹q6ñt/Ôˆ›À™²ô¾X!Ϙ};¿K°0?õ઒íõ”e?hÉJÞ6%|ô`iqå•ó5ÐÃÔÊÖ¸÷Œ‡Å:ßF91ÿbßZîÆ!Bž5Þn­z ¿0ðÛhÜö½Ådùšø‹cmÉú”bGWÞiŸ+RA›Hˆˆkw½ð«þª0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 1971 0 obj 5014 endobj 1972 0 obj 1367 endobj 1973 0 obj 3115 endobj 1974 0 obj 532 endobj 1975 0 obj /IVCHLA+CMEX10 endobj 1976 0 obj << /Ascent 40 /CapHeight 0 /Descent -1760 /FontName 1975 0 R /ItalicAngle 0 /StemV 47 /XHeight 431 /FontBBox [ -24 -2960 1454 772 ] /Flags 4 /CharSet (/vextendsingle/parenleftBig/parenrightBig/parenleftBigg/parenrightBigg/parenlefttp/parenrighttp/parenleftbt/parenrightbt/parenleftex/parenrightex/bracketleftBig/bracketrightBig/radicalBig/bracehtipdownleft/bracehtipdownright/bracehtipupleft/bracehtipupright) /FontFile 1970 0 R >> endobj 881 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 1977 0 R /BaseFont 1983 0 R /FontDescriptor 1984 0 R >> endobj 1977 0 obj [ 643 885 806 737 783 873 823 620 708 655 817 682 596 547 470 430 467 533 496 376 612 620 639 522 467 610 544 607 472 576 632 660 694 661 491 632 882 544 389 692 1063 1063 1063 1063 295 295 531 531 531 531 531 531 531 531 531 531 531 531 295 295 826 531 826 531 560 796 801 757 872 779 672 828 873 461 580 896 723 1020 843 806 674 836 800 646 619 719 619 1002 874 616 720 413 413 413 1063 1063 434 564 455 460 547 493 510 506 612 362 430 553 317 940 645 514 535 474 479 491 384 615 517 762 598 525 494 350 400 673 531 295 ] endobj 1978 0 obj << /Length 1979 0 R /Length1 1980 0 R /Length2 1981 0 R /Length3 1982 0 R >> stream %!PS-AdobeFont-1.1: CMMI8 1.100 %%CreationDate: 1996 Jul 23 07:53:54 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /OEDBGB+CMMI8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 23 /nu put dup 66 /B put dup 67 /C put dup 71 /G put dup 82 /R put dup 84 /T put dup 99 /c put dup 100 /d put dup 101 /e put dup 105 /i put dup 110 /n put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 119 /w put dup 120 /x put dup 121 /y put readonly def /FontBBox{-24 -250 1110 750}readonly def /UniqueID 5087383 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª)s™§„̾…´™;.ëÞ;Ôr·ÏTeò…ji«–íK­/df5à¶A|Ç{S/…ØÇ )¡šSïcë\^ÈŸÆÂm‰çÙäp·+ïÚ#õßv¾¯Lé17¢íŠ©×Öýó~kÍàÙ ˜d#å– ]Ÿ»L•eVèßËúìGo£oÙ¥È\šõþÙÂÝÒkÜ ™9‹ŸMÖ¨ð[G¯•ï(©ÅaÛܘÄ|õRPé6n¶ý=: ªbãÕÙ9s2m4{~ÜC‘ÉßD…¸ü˜Ô%Åx’Ý÷Sd,Õ&©jÎÚA x"±ÐŸ—”æmѬ,+;ÆþÅboB|Õ®œTÇ÷bÃoI³Âåæ*ûVÜî‡DZ©BÁJæÑþ©ÏŸª2a{YŒå‡ï0Qâ(÷/e@­™§AòGÆ€挄éÑп™ª]w}ˆ§ÓÎÒêgô®a輕çÚ8.‚ݲ° ÝcS,tã¾^ÅU ¼»j³‚†×q.’o†–ƒr¸!N›]@Ájß ýGÄ“75uÆÊ‘ämˆÞ$æ‚ÞÄKWêŠøNWÔVF2PØ,KPË» 6™2aƒóÔbw;S³ÉæÛBÖ³ö{‚ Õu&D“C½ùúÏhN¾ã›e^±½L2Ib^ÇžY6þ2Ùò"CSò¤l5Xï!ok²£º÷R¾ì6ÄD UjïìôTº|»§S{ËëÂG3:‰‰6A…|Ùõžº °£ÙºJ 3•3kLÚK¦EnMpúÙ½«·òq¼lHÙßZo®xV Þ#L’èöŸã³’jýë €:Fzâ3j`yînжÛ7 zº fÉ¡0€%é'›¸"„•¨#Õ4Þ„»ð…»Iôy½ˆxP&! ‡Fæ‚Òÿ̺µÌŸê€1õ}±0æØE–|N w*TKLÄ–^y;W¡ÑP÷cËÔ;Öâ™—Rfݧ{ð€Ñ80§æ 5p„;Û~x^ñÓžöR]ÔÜé£ ™ACŸ Ã{Œ,ÀS &$˃ÿqr.9>¤%²æH¢`丆ÓÿÄvÕ¼ë5ŸFà²F‰ÛÆIãÖMÿÑuª™Â~H´.‘ Påd8ZÚ15`è¶–::ã©Ù)Tòȉ Kð@ß,”0 ³°‚ ?Ø–ìgŒÀ„Bþ̓YÚëºI)ÄÔcçÉñ­\~n¹™’ÜÛ_º•Ú¹Sš³z„ÍcÐ9Ÿ°.~÷”Óòä_ vöϼ•…맯õz·Œ¹Ü¹þžý‡TV4Ƨό RË{¿Í·§ú•2ƒRe¡*1èýúNÓY\ÏDÔè¨#Ô‘ÑFp^•ÂV; ®ÆÙù}«ä¬<Ûêûqà$ç®KZ©9 'bDöSÔ9 4‹Qè본ìFÆ¿»wm1>}¡£µKã½nïhæ_Õ{ÆðöiŠ´þÞ”®Pý¡u>Ô"ø1Ö¿DRÏ!•/.ú mP-N Ö±Nq[ÝÀXZ…gáTšù¢U£we` 1ÉaY0@v‹„ê¡¥öž1%ARfdÒ„ÇDÃS…}$âáU[ôpŒŠš–^¢î]'xLƒy)É ÙüDE«”,þ‹™Î 检ӡOÙR¢² n¸Ï­Ä5º§¦Ú4O¶:L䵇ûlÎêÓßáhÌÆótžôüα/ bùcF¤ß¡ÃÎoÊp/.åe2-…RʦáŽY cP¶|uÐ,ÆMNŒýP¸¤áÊd–íN5–d dŽò!!&JÛXy»ì.läÀpÊA «™B"Αyøi4ÂZÅy0škð´Ÿòó5–Ó¦ÓÈi\ce©@e@Þœ˜ …í9¡6B8Áê?!¤Ôá³Ò"ìG89£§ð*Ѐa@Û#’Uà9˜§á 5½·‰³×zdæ+¥Wæ§ë¿ì‚Ê pÂO}LÆY2ôUT<°ñeÒH¯hq*sñ.ƒ úOoþR¯5ñ<_oÏ^ˆ{„a·1×ſȸ`_Ry—oAfÎ¥ìc­Äpö<µ{—>‹mÑÜY,ÑAºQÉ'M+øÝ®SÀZ³¨@=+V€éÎÅDºsòî˜Ü×MÜB|—²^¹CZ¾ÙüJòóœá]J^ÔøXìò¸ýìÖkSú$ˆÉ$n'¹‡xšÖ_ lÁßOæ†VÖ´ÖÊꉅZûº}LØ-r:é=ÐûVóŸŽ”0 E›Òãy¸\MŽM§Óc¬Þ½3¾¿¡B"Ìʽf>Hš„™åïi±ìï ÁCëÑ›YXŒËÉ¡J½&])ŠD(2néŸóåY¤W½ßû+/öYñZ?)4hœÉ†Œ¼ÍÒî½Á¯‚ˆBjÑE'`œ\qò'1­ú€ŠíwŽR5b›!Òî@}š:ûjvn ýqØŠwÁœšlpAJ3ö‹³áX»÷,7`æ&n-ǪΗâú‚)šj°ÓRšZã•RÄObàO²sÇÒif¤ÖìIJw}Í—Oú— wn_ä“üùkùW©vqþÆíç8‘°Ѿ\ž‡‘Ý‹Ü8[~­â‡ãÇ1”Z€¢6Te ÖÀ#z.ìóŠ£XáðèA³p\D¦O{ CêCr°NwdŽšä‹Öy=›ÿ7Bö—ÈLÑÚÝ7::‘t·ÛÔ'þS±k]qÂåOÞ\ݰre–|#Ù÷û öN rWwº1&¸•&]c˜¾ášùV£R?úyMY}ŸX{¢î¡øSÌ^3u ݯtÃCþ/fÂgrg`<=Ýg„.kþ}*Ï1@–ÌZaj /‡QˆŒÀкÌý(‡¿ËÈ?kô¶¯9x¬wl2\„sýèŽ þøÝµ©Ÿ—ù ãRyîÍz€¬aUMüðÇ}€‚)ßdÁ^@ar9Ø| ZnWúÕ •˜@ˆCB5µ´ß›2Ðë[£ ÿvhgû{ÇZÙ›ˆÿcÝ4_§n#Îúk=¬¶…±RÀyB*B?„ÝÇÁûäíÆ¿«³«=<<Ý¡-^ó:/z¹ñTø|æðr~öêš/ˆÉO+¬ì˜=(lš€ÔU,Jj\D|©*Öðo™}nºÂCe9Ê Eêo@팫Ù3`£ÿDu^¿ƒÌ¦ð:ÂáÿêN„#KDË&Ùãå9J±'o7CðÚ"ËRb#Èd©Ù袂þÀÊÙ㳇·Vá|TAY·wÍ\M0õv$†fË‚Âދݺ©Øú‚À’zŒ†*ph]´­–mn‰³9Ž÷/œ-Ñ䤉.]»Ñ?Ïõp $ÅÁsN€ÕªŠ#´ ~ˆÄ'ØÙ !ÇÕ4TUáAÖ£©¥­nϦ7Áx öÓ{N9©{(º‘r½·t²üê— +©ãÙJ üð¸CeÊÈMêZ›â) b7šRðNH Ýô¨³‘.XòH ËÖ4³ê̬®‡m¦Ì¨ÕNxŠËXTHzdD‹Ó³H3ù…ŠÃ“T?ÓO3_ \¥Èß1{Gh†RÝÓà¥2nËî•`GîÞºä©ÔuÁ eˆ=àq™A†²oÉ-Þ".,í¶“á|\;…š€\˜8‚!X/rAp¾NfI’ìæjƆð/qåÇNŒG—#…Ýâ¶$§ÿ6»ç2QÅ/MyÓ9ú ¯Xû¯Y4ȶ²—w® æ9^3+ã—mkX*Ô¼üdd82+¿õL9ZØr¶ÇŸÞþ—t" jo¯6XŽ>YvXú` Äü– T3F”·^¿/½ÙŸÄ¤ÍcYGðïG!Œ”£Ôëç+¬è›.yl»pQ¤úÿ•y97jk9–Ž- ûhÚ | )OeáWÚ‘üvL! þ§s†=kÚ)ö“[m«]¨ÑR ëH𣔯³Æ)#1†¬éS[¥'¸ñéãtèhà4½…¯Öï‘t{;ëØlH¬4k¤´†cd=À‡õ=^ ÆêïNz-­´¹âm®ÅÌ!ÄîQ¤GÉU& 6âÀt9ç×L}íeóA(|íF@×aHçzÄjYÜhˆ¤š3²Ù25ƒ#Ï)R7,Æ·¹€×î(´Ã>//`³³Û‘0†´Ýý£+mŠÛò\Ûµ,UïMŽ3ó謞¬¨ºÖ~»ÚM‘+Hé ¢”|%÷Ò.’J7F¶g¥áÎU’~Lú/|þl€²*e‹Fí’öU«¡8ñ¦Èâ v¶ä%Ñw‰~‚WbÑly¾À‘kO—Ú|dѱ@#uê+ج<&û“œ¡1Í0gQdÐCõ„ Òô°/‡h°a¹Qá'¦^+Íœ­~ÂM¢þ­2ýÉ£L/Þs‡Ünê Χ›qÿî².w£…r0Îp@{ ì U+fOÉBEáseÌúOÿÈJBzý¡52ž$:ÍÚn(7ÜßëA×ò»yz(•b_~R–0éñE¾÷–ë÷zRëJ3CkÌ7@ûéŒRççi‘¹âžöϹ/Ýöw»ˆz3žæâÉ­ã8”í¾| ”žXlÈOìØÉO›¥¡k[ÜyÚ<Ôf§\m3K.i†sOÍmö—`eòÙ°¤¥‘xhŠg/~P½¿Æ½ê¤°ÏæK[âg¢Ê/µ¾n°®Õ£¤~J:,¤˜nRàˆX½[wÚÜ‹h0’—Cˆ½l]ÊQ=a|'_u2+q~ê´¾îÊÕ'Œø[)G*< M<öMFE*ѵ4‘„¼ï¯OÓÝBý~uDž¢¡ÈH%‰©|À€ñºÙÎLè\ta\_tÃÐØNÿGP4h £¶©¤M„zîʤ=íµ¶éJ7L,39<«‡9ÉKweÿÇŽŠz±<ˆWÀÆD¹`à¢)¥½=Csiþbn£+6ýêR¹·¯ÐU!øêÎ1Ä.ÐàÉ Äô˜@5áFžB‘ [vØ,Ši×äq'cK+ž5ädE¼]µ Ye6Ù=¢;U€9„ƒ½µgÈ“|ǽWÛ§ˆóµ(WY÷ðç6[£>¢0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 1979 0 obj 6252 endobj 1980 0 obj 1017 endobj 1981 0 obj 4703 endobj 1982 0 obj 532 endobj 1983 0 obj /OEDBGB+CMMI8 endobj 1984 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 1983 0 R /ItalicAngle -14 /StemV 78 /XHeight 431 /FontBBox [ -24 -250 1110 750 ] /Flags 4 /CharSet (/nu/B/C/G/R/T/c/d/e/i/n/r/s/t/u/w/x/y) /FontFile 1978 0 R >> endobj 713 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 1985 0 R /BaseFont 1991 0 R /FontDescriptor 1992 0 R >> endobj 1985 0 obj [ 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 ] endobj 1986 0 obj << /Length 1987 0 R /Length1 1988 0 R /Length2 1989 0 R /Length3 1990 0 R >> stream %!PS-AdobeFont-1.1: CMTT8 1.0 %%CreationDate: 1991 Aug 20 16:46:05 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /LMJFEL+CMTT8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 33 /exclam put dup 40 /parenleft put dup 41 /parenright put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 61 /equal put dup 67 /C put dup 68 /D put dup 70 /F put dup 73 /I put dup 74 /J put dup 76 /L put dup 77 /M put dup 78 /N put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 95 /underscore put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def /FontBBox{-5 -232 545 699}readonly def /UniqueID 5000830 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ_‡1oƒÝãâÒÍöÅÎO•¶î3½‘·’09Ý5þ£‡Õ϶ÆéÜ„ÁxóC)”ü¬nZíA¡âë£P¿ëE”Es¨'}ÚÂ8üi¥Hk™TwÄiâât“°·ߎ&}=V´P!hQGAÉG%€½õ1/mõC+*N¼Q¨,–‰¶ú”-„›)p–1a=¦M÷¶ðY¡“ô <5€Î;Q×B˜A”Ôñx€ ‰/¶çaÿCÆ?’Vµéô"{x"+ªÔÕ,wF-ð’"œlžE»Ÿí|ÕØ´×+àá)i¯êþñp`<Û‘Ë$1s±šVM);€£Ruô÷ŠMܘô¡ÿõ’F=”I`û1kåð9`ù±òËÌÔHeãˆñÔ+ü•qÌ`Ï#Ç%`˸ƒZ ¢þgk;H°“˲ÀÅ:ñ~ųr©w¿Õ/ûpb´þ *Ôï\Œv#ì“$¢Ë;@/ÌÎR¿Èf/Š9Õñ´—çÎ4ájŠ”zê}LQ“™ñ·©Hú}Ûgg$O Ÿ•Ý`f‚#ô[½¨±ÄRé0©óóAÅ5Yê‡F/û0'};$âMJ«‡;²±m¥²;î%¾,(ÄÏ/OCŠNR Ûo¼ñ§sÖŽîÌ3϶_ÅûH2ÀÔÅ=AÚü©‡…qã翚×üPG<’rff­0–Î}«AR,ܯ¤ßÄùÑ#Âx*¨apM-PW8ê†WaràGT± Ë#½–†xú zWR¶+ÃANŒfaBä²dê^¢hŸVÔûO=ÆÊéºûUÌ.Ô¨æ,~ê—YÓ7¬Žõ×Ã;4vÜÀº‰v ú ä¨U(®ªÕ]¶ iNB“•LšÇÓ¼x/Ç>c#`¤LkÚj\’Â¥„!Ø«8ÝìHö:$åÀQè÷jM —I‡€ðȾï A®ÖjT–Œ·›ßdEäßë<¹•O©ímÀuû„4¾\éõ™¯Ée©6hc•‰4•ÜmRìËÛW“$j# øoèØw„–NA£\˜¼+lè½S1Ð0N÷[ì­9Ÿä™÷R]ØW‚R(]w‡`™g½)2Ädøi½.M`P©„K´XDÞqÒžXˆÐ2ë? uðb¦±©Š÷Ž|ðuze²¤ß…”€Q°’¹¼¶¹†•P›+Õ µÑ]Ÿ¡Ö“jò[ϰé'Žk@ÆL‰î[<í?ûÝôÎFëٺô^RmÝ„=»!ÁË;â¡ttˆa¬pöÛ…¯„—¡Ë\ƒ;þ,Ü›(!fÞ›CBÝ_ç´Þ5^¨kz ,„&i=ªI…ö?4!miÇtÉ2ñýÝ×}î Q?·É¹i=Ы҇U¹ø3‘û©TШ7èdHh,^ÄÆ}€•ÜÊ[u×y ã§"‡!4í¹ÂÜ<Æ‚¢ì‹^_áÂ…àe,v ÌÉÁ©2 ª›ÊòmYõžþ´·çãD4¸w´]LéW«pë{'1h¼o=vRmvÆ`ÒC­¸%H”r«ADÕ)IFE£¯–WɼØ4 ÃàÁÒÆØÑèâ%•:QRè×ì]ÐfÇÇöm&Ι®1ö¼¹Ô–šf P9j,ÈlÉš~^QŸùí+5}ðÈ»=ú(ó6QHµÄIaß;Áðƒ)ZðÜ\_åýš¦&Jøóÿžü<¥XîD‹ØíkãÙÔ$9àú& /-pî3ª6{Z©k{Èß Ee´8§y4lάʱ§ÒCÐYÖDDž`ç`q3œcÈdáìןVY1æ Ù1 $;œ•&XöÊaqk¥Ksŵå$=MñöºÉk¡FJêº>Vp¡dž¨j„êÕØê¯™n"þHLõæp¸qºÓéT«£-_„/È-#Œ|Q|ª/ ÁD/™ÁjbßZÊrÚ‘|kŽk^]¡ÂèrµðÓgtÀ³ªÕNÍEHº¬n $åÚ¾/©Hó™f—µþßé]mÙpˆ·Þ¹ÕÇ4Ôï­T¿lV¹‚$Ü|ïøÅ"QÄœtíÙ]v,„ üÞ·FšNš[+ï‹̽¢f·ÞdCé~^D˜¾,7bH\Šñp¸c‘€Õ–ÇOÈ(±0PœA5ýÍNiæùC‘ô§- ›»†äÝ$àïãêö óÃczB©ÁôźÓÃ…2v)ïÙ% wmê­çüœÊœ_Ì\ÖX¢ý 6ü÷2y_n4®—¦¡IÙ™_C¥°Oa ìèŠ#2ÃËþg­Uß’õ«‚Ó’[¾Í/ 䲕YÐ.È>EÞŽÁ‹mà6wXä 0·–¶NKCHüÍah³‡€þd7ñ¡ Yª$óà—o#÷ûBzòIÝŠ¤šm ÉØ"Á‘i‚VÝÊ$!®“t5£âq3Eª 6óT.Ï­Éæ€:…ìD!`IÏ£„¼ê¼ô@&ˉ)H4“|“Øê5¯’÷C¸þ ǘaTéh&¡-žï_­wýÿ¿4.™c  î*²ÆŒøpÄ9ËÅkQ£7WÀ"±– 6X>Ú{SÏÍÜVvMÍC¦ýí_Íââ׿WÛœÖcxζЯ%ឨBðºfý©8½tøÞÄÙèC²íéK{«[?ÏaÛz«Ã~éŠõ;8%¢äNóÛ8¤¶AËÆdÈ,£&éI ÊøvZÆËwy6ÒJŒ®Ô™%P$ÅãáI…ùíÏzþX˜ÖÒðÁ×}÷]Y BÚ²²"óä˜y([&«kŒó®KœG5 ùèþœæ=Ï÷ÿçn/ír7Œà4!ŬkºÌv øÃ–v{¨#Q’dØ¥Vºû]Š¿QJ)M°RËÓ Âoæ„ßgœ.K úÊ3âvJãñ#¥‹ï^„§}~ìΩƒXÜÄáõ½Â(­ÔÉ ]Œù±ºÇ]­íµÓ%ì`œÆ)ÎMõ¡:¹7ŸTMžg#_ c‹O‘ΛôñZ”x>"4ýyZ8š¤%Gr>7ÌHÊÃ`ðûLù*Ÿš´~ÆE=þoc0^Us¥É¦b>vu·åmP—€yìù«Z`í¼Lâf@{Ô¬,¢ \Z Úv©‚!ûxÔZ¤mcWæ|KbÂ¥ª¼‹‡ûÇH¬ãŽi·"ü~{dše‚±r¥e¦×P]–6v`72ºvQ¨áwOúÚÇ«ºG"ó†ýZ†‚oô $ØîÍ Žïâô—yÚS¬“| ^LMšF/š ö;¸£c"î„ÜWX/Fv††s§´jÛ… ‘Ó0Ì«©A˜/ƒ¨’¢O^ˆT¤|Ú­ eïõ…i>l]´·3„ÆÍÕ¾àB”D¦ÚmòªL] Ã÷wT*§z=[PVj }L“ ï+½½ùêp@ð¦ËÂÔÛEy­QÑQ%¿,+0 Ü(>á…Ó¤¡ìK¤Eü˜wˆÍÐ:hRŒ4£ÔÅ£õ[ǬÒ@O­p-Ã( T”ÂRØÞiøVø^ó\jeÏÁ¶ dû®ÐX:ÐÖi5`¥r¡×«’–-ûH8¤Má+â‰D£ÄqÆÎ ø«óEîZ¨|fƒ‰xh®(oWyòVÚãB²1áíáñ6ý2Õô®FZŒ‹h¼ÛÇî÷¥ãæróÉ%ÿí‰BÎíÖê»0àÄâÁ“C4&ýZœpVd'8ähJn¤ú/ÌY7€×ü—Ë9+#wtQù›oCIOAuRç•äI•~øÏÃ9†ExùCíg,ae×…ôgVJu"àÂH•ÔÕáÔüEž¸z³^õËßQ9ñ­éÕyŒB›# ¶Á} ê\½F M Óów7ìi4æz›tÛÓµ±uùz¶ÂI#̬ycçÃä)r "cä~0`Dþ7؉0¤"QW½ÿuýØëÂ#4ÓÉ 1àÈÐ;"deíûsZ’]GåŽÄyŒJbMÁÒ¨sñÖ¾Œ{çlEÍDZÂh’¦‘´¡Ix=Õ„“íÙEÄòIõˆ [í•ÝÙ³!z­ŒtnCg½ õš¿oÅí‡ÊD^¼WEžA¿ú&±j]”€«ˆ:F Øh\†ôúridðX£Â?¨–á¢Æí þ{CÊúÿ Õ åzwLË1* …âH/U~NäDï¤Îħ€$ãd? €¤Ÿf‰,bW³­ó7x%ÜhHé{©‹K¶nr_ÀonÌ1ŸÁc_H"Û@Ã<•¾Ô0\„tpÜg—ÙØœ÷ž©LÑ B‘@bBB ÆüFdK¡¦÷w$«ÑƒØ(héýÌÏ[ô Öꦊó!9_¯¢j%™Mëå°jKñ S´UË1ówñ¿íB«hfŒ®l‡áÿ9šû€ú²XÅ¢ÝóÚ&ó¼'Gî("ðî›~¯U^ÐkøwŸœ¿a ¯&ƒë¤q[h ‘qÛ¬Þ/ ß³™)ù¢ ˆÖBßM{VÅ5ä'ñË>{¸KÀ«¬{aZD•$„-¿7[J¥o_‡;¸ãñ’+9n‰À“ ¤C½kFX/]¨S|dùhá¦mZ‹õ@5*‡&çe ä¤~Ånã¦"Ûî¬ÍFÏÇ•ìÝ£Êt0pÉä Èìc’l8º‰rü5$÷';´"XÇp²ÑÍ0Tç¡|ίÖë÷4ÏР&>Ý:³Ë44!"ŠWÓ)͸NÞK÷Óì]ð6e9Ìðl²-Ƙv¤äÙiµ)žçË—ú‹:Ç‘²1M/ô‘]óõBnͳU&Ly¢@þ ™ÔñºgÏ(kèSÀ‰€þMá?ÈP°SèËS,’ÿ¾G›ù:?ÁHh`ÿóÕ¾… ßö¥A’܈"4¤àÞiŸ˜t§ví®uùá}|&!ö[–A±’£Œn”¤çY¿wÊ•8èêûK¸<Ÿ€Ô¬(‹\l+ÿw2-/Ž@.€ÍÇCqµ aHK ‰ÀÑcl˜äÐÿG^: QÐNM®x‹Í'Pë@H1ÿÏ“&¨ô§“)Áy¬L.?†Á|Ÿl]×1Ü2(p³8/9{t$»¸æȪ!÷Y^­{S~³Âeʪ¢¢ ôëJrï…×(”~ó©ïó i†Ùà4ýj¶"ØhÄÞý±QUj—Š`6…†÷çÏ÷ ‹àÓÒïÂnŸKZüËUX|?ŽŽã/,ýBÐçKé ‘kùý´šÑjqÓÛšô§ð-ó|<ä*Ûsåħ/GYNð|ݬɾ”0Ä‚…§šõ U83¦—\p^°$’Ø“Õ(Ͱ¿Ìê£ilœA|èáòšQôEKc-Íf2ë•RNGOo­¥µƒŠ•Õ#ô²„ß Øp#ÒºPi-ò­Üµ)Wj÷x‹"º8oÿà1,5äuýWJã{ Rj÷|ú.Lð¢Ž`ýºº•<û3W*BÃbœ‹åTVVi]W;¢)š°õŠmŠˆ¤Â?Ñ@#ÃüÊÅé…JàL3†«ìv­ú·’=…\\P°2ÈÔ<¥oœÚ]µp+‰çcÚÒC°8¡‘·Á“*ËÏW¼ i2,á³+lnŠUë66QÕɲ‰¸¨¾„Ã(›H ”ùœQ[1É‘~éAKåˆ1}ó¸m›“ fû»¬¦Æªƒ±¯ ë:‹Ñ±0šV͹4÷Qm.ùj-…A`Q²üå¥ü64¢+°¤%ÃX<¶GÂò­]…õ+¥pqùÄáH9*®×IÖ¬ÝÌÜeÖ¸ã4ª9dòŒ¸žH@×y $×1ámJ¬$~†&þÌh„]øf•véÈ"×mÐJ'½ˆ…îq”+mHUtêDDXu¦E~p§RAaáLæžÎ05]|³®fSJ>D߬ÎáÑaýW{f'=ÇQS‘–lë°ê€çð pÅ|S§¥(~d-Ù÷,é¼gsIšŒºèq$¸¬ñÖö'ÓJLÞ®?) îÖÖÞàŠn U iŠð_TôŠùÙúeVìÓÛu,æBDZ1:!ž ñ3óvûc@š+ãI~,ãHb ¬8Fìcã› 7÷m’{¥UlúŒñ&£¢#O ×æÆ±Sº=O[çñ˨üš¶*ãAõš€äDg– ËÅrTútwý\ùa¶lDE+½&9çÒ†~›Ájà%Šÿ;Z¥y²>®à‚VI Á„±‡.|qíbæäß6©ìFQë#UoH¥ƒË³çœ9þ-î®$édÄ«Aè~;I~…\¶VGI²d0ªÆ˜é¡Bã›”´ì{D"ß'×f5ªg…cþÅÃVÇÚ²3ÊÑ’ •™› ”Òu*×`ë†[ùX“TÀDú…ã•ÊyR˜¦³üoŠÚ¼¢ ˜]íö ra sø6iâÍ›% Æóæ%ýØ#ÞáY0SXÉÙ?3“£Ít*Ð… Rîíé!ò™ÚÛß2ûdòÀ=œ›î²Ï~Ë·|™¡î°DC`̈5@ìC—݃ ¾wñj(èÛ”± 0áÒ¯7ÃF_KR21&;®HŽ!Z¢N”æ.üò52Ù©“t³—ö™i(ѳzªH6«h]ÿ¤þûÐ}û$”.9 ´‹ÿ³D@üÓÙNÝú»%u¥ÇŠFŠa”vWq7@¨!£æ&Aûâ—€)–gTâá¨n“•!Æw…Ý”ÆØ§øèá<^óm“I+¹(ºCÿ |Ét‰ÔKdÎÚg³îQûµØÐKš´E§›À–*n;¤Òwâa?~pƒF³uŠR`4>:'ÆO9ÑÜö{FaÄ´H†ÈXÂÚ|@5`-’þ•ð°ç²Éñ•ÊwÙ¢š;eÊ$¬KŽë~eÎUˆ$Èpƒ>%sôuâ½bÖ’Dè`A(못µUAÒvGÃSj·ûx·8Cí žۥã‰ûóÐ,*W–,€‹)%qó¸Âú¹¥ø}Mn:*‘‰N¡ÜÿšÁÁ£Ža*\›¯¼[îÑG Ñûê¿p@¢ìPŠ" ™þ®‚(°,gE0¸ÜäXèÓ’Ì8ª÷’d¿ŽÏ­ÏoµÛœå4Ç1íy­Ÿ”wÈëìO©èäK¯¬oQq îˆy‘¾Ê[p>™èÉMbý¢2'ŠÿŒYcÆ LaP5ÝãŒS<_ r”SÄ®X›¬/†ËË‚dzz}ÁX ÔoTÚôÿY£„ ŽÙ®mIxk Ÿ¤¿þC_=þ9"‘•5 Pý¢ÂCƒ¤rß5;6c£`Ò´?œU[IÓõ:GÅo(UÜ>Á³ß ¥€ª”:y"«—¿XÍ)ÆŠ©•~×3´”ÀÙ–8ž3^zæ¸ïø÷ø)-Àln.EN‘$ÖuFMM˜«x!íшõ$ í¥ô€`[?ðõíÀ»¶§ðO$G^±!×U¤ÿÕèÜyœIXÔoî¡Ô=Ÿ]Ùw25rÆzŸ)Às@g8Å^wÍe ¤ ©Ò£—Ÿ¬Ý¾ôAÐ?’{Oæ=Çl–w*GF¸ˆk{CñeJÕEQ‚¬ æ#ˆðGMHÎÍÀq(°<íAW®2Y½%óXv·/‘›Œ¦é ™~©äV¡Ò]ç¬Iz΄Ìû}Fº¬R`óÔÓ‚î5«}:™9 ‰þVpAñ½Š]݃ ­¢ëÕ˜ÑyϦ”æ iÓ\DÌÁ Lj•]ÒÖ/NR8±“xì2Ë—š]ÝÅ&Zp›ŽçyN Xâ!‡YŸ„Êù¤)MµÇHë{ß=6· ¿æ,=èeèû'±Ïddczt¡^rGº>oŽø™£âì`I<ãb%u¹•N‡-aB¢ž×Tm‚J1¤ª™ü‚ÀÀu+âö§zÂŽ$À'/Òñ <ÿ#VTVÐÂN‚•d/ÌzR×¢];<^0•Âhö&ÈÆ™ƒ±˜°Ô-K‘E$´¾¢§jŸC<2WBùx_F¦ ÚL•ÿ ”‘‹Ù"xçg[tûÖÞ‹ZLIfÆÊ¡x-®Ô’¨1òéˆBMV7Òzó¦Ç$¦B!Ìv¬‹¦“D&!Ýî|3Æ•8|¯¼Éõ: +u¿îÙ*Up->€ºaìÄ£@‘þ_ó$U”|ËF”ÞwFXÌŸq2ºŸ@¾s|Iäî´—2ÙªâÚËTô†@WÉ…”êµ5—=|÷†ÙV@… lSÂ5¦Ó^Eû‡PÑäËë×m ¿¹‡š.gO¶åj€l¬³ée 98óŒà‘b¯ÔÊiƒ·Ñ}’›°2k¦îÅ–~V)ßdxâª]{ÒÐCZ¥ÍØøðÇš|µ¸Y רn©¶þìW2ÀWÊÀ·ß²ž^¬¥åP{¾k£‚¢Ô`Lÿ+¸Ï_޲ÛÙÛëÙovõÌ> _‘‚.Ùè­Êièëñt³\;Æ-SÞ+’ê+˜ˆ¿WñýcµJ×NÕÖs—uèé[–°Ïh øÄpÐ[Ä>¤¶c×ãºx£¢FPf¥t`â $r:§é·.bëÞÝG Ý·œO¼ÚÈ²å¼ ~2‚mþîéܪ’K 6ã)«Ø4Oæ""¦4|+³6}G¯e=¼¦¤ OLK-B3ˆl%%ZÚ1™ÿà¾EÃÎêŒ()º·êfa0·PÆiÔ¹™–zuNe!Äd;R˜­`j»WKóà&åË^m ,[1Þv` Ò"ÚCÅã½õG–‰žz.öÏm:e€Ë¿ÔZæ3÷¥,u6f Ñ‹%Ûfp™mUQ} úY?”( å{K‰º›­.ä—çévèáïës@\‡eØgŒ¢Š•h}XvÍã 8z¬ÔúÝöÔ+³¯Ô£™\„õõéåÙ+Ž®¸ßºQš‘? °p¸7‹övrê^cøÊ.¤PFd­ P*ÆUâ†ÿE^o½Ïß_Ïå†~¾Ö0ø#¡{)uß'åâN t5Ô-»lÃ%Ñ£¼ô¿…ê(NýsfÝ«Žà5ê•ìgyõ¶úž4  À s—{¬Æ‘0áLêëîA&¿*ºÝIjh 3 áh®>ºÀÙ÷tñ˜ÄY$*… øu­ó®¸Ñ6„í<8E¬8ÞÉB‚Î<%†Ï{)*ˆ‹¦)ÀåZb×Ì!x%©&/^tÏ5í= èfaçÐ2ˆJ–sxì–Úí^Kº£:˾¹<4¬—öX^¡,šÁH´¿êv]˳úþ¯ŠN~éMzg§6sªŸCòe _ 7Úà¿.?âüæ - ³ÚAº?/°ÿyÓ[â{Céyãh¥õiªQßÝ.@úär×ÞÎëŸÖQ£ÕÜ^XÍ0gbÁ¯õ%1s†]ý3[Ø»àä–'Òéï$ô¥Z$㕼%--3øØJ̯J熕cwˆ]ö¦Òhá!ÍšiÚ‹ÿS'Àߥçè ô榕T¤1>)!H¶ã{Ù‘™%éÉ)Ä(eHZ÷„zE%LªSæ9 eþ9&î#ÙRžÎ t› ½›ü0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 1987 0 obj 11016 endobj 1988 0 obj 1612 endobj 1989 0 obj 8872 endobj 1990 0 obj 532 endobj 1991 0 obj /LMJFEL+CMTT8 endobj 1992 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName 1991 0 R /ItalicAngle 0 /StemV 76 /XHeight 431 /FontBBox [ -5 -232 545 699 ] /Flags 4 /CharSet (/exclam/parenleft/parenright/comma/hyphen/period/zero/one/two/three/four/five/seven/eight/nine/colon/equal/C/D/F/I/J/L/M/N/S/T/U/V/W/X/underscore/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/w/x/y/z) /FontFile 1986 0 R >> endobj 706 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 1993 0 R /BaseFont 1999 0 R /FontDescriptor 2000 0 R >> endobj 1993 0 obj [ 625 833 778 694 667 750 722 778 722 778 722 583 556 556 833 833 278 306 500 500 500 500 500 809 444 500 722 778 500 903 1014 778 278 278 500 833 500 833 778 278 389 389 500 778 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 278 778 472 472 778 750 708 722 764 681 653 785 750 361 514 778 625 917 750 778 681 778 736 556 722 750 750 1028 750 750 611 278 500 278 500 278 278 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 500 1000 500 500 500 ] endobj 1994 0 obj << /Length 1995 0 R /Length1 1996 0 R /Length2 1997 0 R /Length3 1998 0 R >> stream %!PS-AdobeFont-1.1: CMSL10 1.0 %%CreationDate: 1991 Aug 20 16:40:20 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSL10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -9.46 def /isFixedPitch false def end readonly def /FontName /FYAFTR+CMSL10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 47 /slash put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 58 /colon put dup 68 /D put dup 69 /E put dup 73 /I put dup 76 /L put dup 87 /W put dup 97 /a put dup 98 /b put dup 101 /e put dup 102 /f put dup 103 /g put dup 105 /i put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 114 /r put dup 115 /s put dup 117 /u put dup 118 /v put readonly def /FontBBox{-62 -250 1123 750}readonly def /UniqueID 5000798 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª)s™§„̾…´™;.ëÞ;Ôr·ÏTeò…ji«–íK­/df5à¶A|Ç{S/…ØÇ )¡šSïcë\^ÈŸÆÂm‰çÙäp·+ïÚ#õßv¾¯Lé17¢íŠ©×Öýó~kÍàÙ ˜d#å– ]Ÿ»L•eVèßËúìGo£oÙ¥È\šõþÙÂÝÒkÜ ™9‹ŸMÕ™=ü 0)xfáÍ 1›kÙX”)¹Ô $Ü“%ÙÔÌDóù—©žlÀgg5ëÍhZ¬‘BÚþÇ‹´ü/!™½ôby(Nö¶—vʼŠ44|0x5>*ãTχµXwj"ÇvÇ µ«\áùAïÂÙÊÃr”¿@zgät;øB?O}þæCº;½‹¹ãòJ¼Ï ß‹¥b >®ŒNòÁÞñ:Åuñ³»¶o =;xT¸+gÿ ‡¯W+"0ùòq€ÊX§Ù²È"ÿ¾lÐC²ÊpXǹSöÙµÖé˪\ÞY°åœƒÛ­–ÖÈȺ±7NöRÑ >çDrÉÓW*¯-E§ ÷Gâãÿ#ß9Âѳ[BÍR—¾¾kÉO|ÆæÆ~OgrVþÙKÓäµq±Ò|¤åªž€€æÚµ1îø|@…Ÿ©5±•$®ƒc±cúƒ—½ÿD2'þß}²}Ã]‰û^C] aš\ˆ¯Ç;‰¢ß^v|[SkÇz„ 2½W¡Mæš} šÃoó/ŠPpó)ƒ»t7ãP™ß^ Óq Lð [éŸ.¹ÁÂÄDý•RÐÜ ˜©K;ñvõÎá=·ïúí|Gµ­ÏGõy‘¢š10žÂo×YNÜ0 ø?yY4”xl #ÈùcQŸXñ\’¦û÷¾ùýî;Ö;3þíU(ø9%ƒÂ–fUAƦßÓØþzTFU¢%¤óGÙu{7Ï íè·%ìÆQtè»Ì‹k«« 0sàÑu0.Å»þÐêݺVK2™|¬)º(…–ÑŸÀä%ø@xéx½”›€ž®{îMYÒtj óhèÉîêÅ8ëehöàÏ5 ‡®dÀ¦ÑVGgÿè¶›WåAƒë«SˆÒðÏŸ=¶HxU‹‰ÿÖå½]×G^%\c3˜…Œü}4Oƒ7`n$=‚¶kL¿±‘™Ö[“¨œýv³a\ç°¨jEï~'»U×8‡ŽnsÐJcãkiNë¾÷8 5‡SbçB•Aïó]Õƒ tv17kª.²á†>Ôåzüä¿Ó„²/Z÷ÐË@ ¬§y°P''ƇD–FšÍdcž:[ªôþ¥¼¤6½!œ˜`”\O¾®¡LµõäÖnñQZã:À 1¢;|œ)ö¢ÙbêµÒ²½ý[]VV¨‚X¶ì0®†<Áæh±² \àjhànF¹ù ˆ0Ì3ðüá²úGüü¡ý… 9Vb½—ãà¨z¿Ï ës…¶æ”!zŒñˆ0Cø®³SæfmcÑ?¯{‚«ö­ÝXýü[Ÿa¿éH÷H™d1س„žbëù¥«Ck 55Ó9Åu³d¦œµCàs§ÍWsA «Û­ÇJ úå»óÒ²ì|f|ƒ×¹18=DOe4¦§»ÕQY÷{ÏÂ$H̶@ª›Ã˜2}yä^£ÀkkßÛ©Í(©šªÔfF²Ö0Ë šÉ¹C>½þp8`§ãlú\YôiÓùÏuvÞí‹+!–R"…÷×߀‹}u/ÇI‹Îª„dè4ôOï5×Òª(É[ÛŒ/}ÃÉ=ÎñÆ?Gi‰ùRqç_¡†»‡BðuW®1dêϺ“™^œÄÉ–p•yÁ¯jfãy§Õ¾dT ( Þ¢½7๴´Œ‘†áa*çý»¹–r¬“òÏJØO8Ù{'¯ÌÆNÕ´ÔPì¯Ö‹à°äèì°ê.Àh—å "ÍB¤‚16-ƒ_4hZ[² xÓLì¬F'I¼(è®Îé0,¸¥· ¥ ™}lgÓà,Ö ´iCõ<~ü¦‹£·>ö“öäP¾å‹ÙëÓzÌÄ41ZÒ(v" 2ºø) D$Ñ/ ÿÐqüqB;p~# ¼úRL©ªÙbq§MwšQÅŒ”›P³TÎ ,"xP+ñè¶AC2¥d…¹!£ª¢@?YPb¨4òén¤ qK·úõ5›Û“hwGÅ¢—maAUxËU€,N{ÔŽž†·¾eÓÓ‹NôÂMÏxso–۪ĥóíŽp4Kpê?ò1ð'Aj¤%/¼ <~HjÈ|r¿H**æuMУðj{:EÁøø,à%¾°ãÕQÿøç½ì C=ÄØÒµ¾9ï>qX7“Û쥆àj§B™P÷u—ƒz±”8HÆùqôŸ Œgg•)âè¿Û=… oÜì ÿžÍ »²‚¹)ÃH“¯U¥ìV}×΋'ÔÅ:ðBñbrX„8g«ÕƒP_2ÌôbßaÓZª•)3֬䆣åÏH5½•¨‰îxw6ɽlÑç¦7X‹ËÜZNQ6Nqú#8ðÚN’€ÁæÜÆœ˜@.耮9² JË•ÉA°•ð¨@h2AM¾0 ‰LÆ7Q8.%Ò‡ݹZ |B²Ò¬$ÀÒ.Þ¤°0ó¹³)N¿‹’q„ÌÝô¬Þ ¸ åŽF¬Ùd}!“ Áš!‹Ž7£ü”:ƒèÙ–?¶|whDⳫSípØ#ÿGŸê®Ní¸œ¾Swx£lýFëzípž%éÅxXoŸ˜ ä^ëZbJ‚º„¾…ÀÝ‹^ºÉÌÀp‘¬;ØuQIyèJ‡‘—Ù‚ F@R-¸äÈO·‰»Q3›ðórï¢~8oðnœßä"_ ,¤ÕSŒ|°ý‹$Iþ—ISênKt»–eS߯¾¢UI[7½èp€ÔNDØ(Ûx¢®Q] 64õ-CÀ~e¬õ¥ -b$ÿ>ÃdÎtRåBoß»T0ÝÔë2–iÝ1ø¬égø_¨Ýª}.ú§­Ïà× $,€¬¡Xl»Ó²¬û±ÇÚ1›MWí=*ö½¼ð󳢠ޤmÜu£¦¦J«xs~[)|ƒ ­„ M]½zCR‡ÝeËgJÓWêÒ¶qµÕÕNiöyã­âu3þðAö¼Ç1xœ—aԹǜW/6àY'>»‰Kˆ¨–¼2‡°’šøð£,úç3¡GûAœ„6fÕH“ãõ8¶ÄhL¶¸ñ›é»îm©ý¡§k-Ò^¥&W:ÓÏiÞœjyŒñ6-“D%ôá^Žö¾îý©ì:áqHT*#þöÞpaÑVƘ€š‰ƒçž# ø-d^ÕaŒf Q3øòr ÷Ù·¢îCщ¢D.QÞ-;[õmS5§aÜJJà‹Ë ;-¯~·d 2œò²à)Mý£aƶq hÖ@’ç¯Dé,S_º(í€e'Þ€ÍM&Ìþ£ú—Ô«¶ËÊ]©;?‹LZÄ9Vêç–åhÀ-—†@"F 'ŠlÛqµ['¡ƒÈ[FY"ÍÍŠ”ßDlýÈ_zÏ‚mi«GÙkUÇÝÇ–xÄn~ðxì1¢èx³ÅTÐP%#ÿY+jy”tÙîªûÕ§pa‹.^1RIËÞ5±cHgÉTÎÖåTаä'T& 7öTF;ÒÀ[#`k‚jÅ•¯7ž6ûØ‹>#P.ç’>I5l›?Ãüúý¡7xB2ª§uEÖ†²œÏË!Ea‰ì—ÜðŽ³§~JüKQëŸj kRòÇC%ìº KÇ ¡Ü¹åt 1ó¿6úúÒð R¶7‚$ï+°“‰¦Šúf.9¹­˜Öƒ‹]‡è‚¥¸¼ÑšD•1NJTŠžíµð©J ²FçSœ=ôéƒÔ‘ÿRj4‰>Uïr!˜ü¥­À±§|Ö†¡s/I;•«ãÓä´Sí<é #ëvZbaÒ¹ãëØ†ÞX³ˆ…¹´2,ZÞÅÎMsÞ•Ö}ð:wGï¦!¶87Ï©0TÈÞ;ø‡?˜[C¾Óoݬ$zõwÁËK»žïiÒ‘¹mò*6”^®Ì®•ü~ J"f \·¼ak=½é ÑЧ4mO ¶Üß»$ßç¬À?Ã?úŒ§º™Hšì’ü}ý!¯¥ï&ø”=[N)¿äöïÁ™ôR¥e†ËkÇ0&/áÆV•>¨OÙDß*Ÿé¾òaŒ˜ Ö&§RjcY°_D#s ˜týnf•‰S~O‡@¨RRâ<yÊyüzuÈ`õ'$°Êÿ\-–µ:ÒaWõ]§ûÃèÌ×[ñlwOâ£ú×ôóýE&ò9»Ó^¬u=ö6¨“äx‹Ä G¿½=tÔo_r(IøúÿE*6ž´ö§¤'ßîž\´ZÆÒŒ™ºÕ-Ú#Ž Ú¢‹+6Ö“Oa*E%ªqUf;jÒÒ3ÔÎDoó?Iý7!®ã­ßÒU*¤F‚–êl bïË)1ŸR·GF÷Hå­¢m`ðÒ8:êÊ#ECð‡FJ”>;-¾Ü÷ñíî¨×eq—ÅéCýƒLâÃóìJ¾ÏÜÖ*ÃÿËpëØ¦ÇOe)±\ZX«W=Ô`»‰W}bݕƌWnÌÔlafa}Ìr%¿Aƒ¼^Þ5¬Ä8‚]ËÒ©9èôOúI¦—¼{²*9…r1DGrÌ´m!W?zö!£u$¾åõÈ—1±E¹T ™¬·0FTn±Æ‰bí°_Ñæå÷É]Ž÷ܳ“ÑÛXˆ®µ> endobj 583 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2001 0 R /BaseFont 2007 0 R /FontDescriptor 2008 0 R >> endobj 2001 0 obj [ 826 295 826 531 826 531 826 826 826 826 826 826 826 1063 531 531 826 826 826 826 826 826 826 826 826 826 826 826 1063 1063 826 826 1063 1063 531 531 1063 1063 1063 826 1063 1063 649 649 1063 1063 1063 826 288 1063 708 708 944 944 0 0 590 590 708 531 767 767 826 826 649 849 695 563 822 561 758 631 904 585 720 807 731 1265 869 842 743 868 907 643 586 663 656 1055 756 706 764 708 708 708 708 708 649 649 472 472 472 472 531 531 413 413 295 531 531 649 531 295 885 796 885 444 708 708 826 826 472 472 472 649 826 826 826 826 ] endobj 2002 0 obj << /Length 2003 0 R /Length1 2004 0 R /Length2 2005 0 R /Length3 2006 0 R >> stream %!PS-AdobeFont-1.1: CMSY8 001.100 %%CreationDate: 1997 Aug 23 16:21:32 % Copyright (C) 1997 Y&Y, Inc. All Rights Reserved. % Notice: This font is not in the public domain % Notice: Computer Modern fonts were designed by Donald E. Knuth 11 dict begin /FontInfo 9 dict dup begin /version (001.100) readonly def /Notice (Copyright (c) 1996 Y&Y, Inc. All Right Reserved. http://www.YandY.com) readonly def /FullName (CMSY8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /BDAAAA+CMSY8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /minus put dup 14 /openbullet put dup 48 /prime put readonly def /FontBBox{-30 -955 1185 779}readonly def /UniqueID 5096649 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ\ñ~ûþliþºƒ‹C–c²Ž_Ã5µÐ[|*ÌHk ès%1ü`çÛ6 L^¯}b­ÿÙšiŠ5»>ø´ÜÚ !–7+z,߉ñ1¼O5$´HGc"Ì^·8@ùòÁÕmu<¹ÿÆJ>Gê¶Ü8ö¢¬õ‚lŒ<ày|ŸŠÏÈn'Q°sLŸ2Ž>c©øÖÆY+6)?;;² Ü«&Þ ­Û2†Ñ…ƒ­*¶ŠÁõqä:÷hfˆ.Ü[bXZ‘‹¥ðgÌÜ-A­!((Æ5ªœé2ÓL÷ÿu|¿ Ø®p P]L¯ȨÞèq^ hˆ¥*"Q¦pL¦³ÈÀwªÉ~àJž£6H1TÊð¢tl*é¹®’ÌK"T‰´ KÍøK¹în$þ}ßâ‹ ¨eÄhnÜ>¾w§kö±J'Kh,©î^í¹ƒCÂØgC˜o@Ïì ¤ÑË%»MÒLV×ìĪᤂª`0að÷j—†¤Õ…P<ÑÑY˜Âýzò»õT%W!5[P…#ÇÈk^6ȼgKê¥1$G2^uwæýWÜÉøKàpÛÔRÍíM¸Ðœ.Á®ªaltQ58ñøÌa‚ª'¡T‰'†ïeœÊÆi6D,Xg]4O<ì¯3ê‹>â¢Zs?z”ᔊ‡öå¼ô½å¾mþìéàb༵¿|“Ñã?È9Ø"šQɲ-›rè:¼ziÎf762çës7båKßÜó¼Ë¨Š\Ís÷vò Ãâd† n1TÈy^cÌÀCÉÜç5X·ÎÝuC'ìd·c&ÒSãí$å†Yø†i_ͤãàÍçê¤&d'&Yåñ½¯3t¤w±àd`¹µÿt]Ç€<ªqª ^P]k‰6çÂ(À® —GAXHÑÀà0–à„*)Ôî7%„D΢³~LÆüÃlÿŒˆA^£,©ª?äVöÌP$‹j™Ðšà ²¶ç‡$†`†®B¯¹>ë#ÕÛ{iã™¶H¥óI._zùR„­BhÓ µü}ü±ÎGöê¶ăcØþôE(ŸÐ2™ZŸÐxmeË'À¹q ÿޝÆkñÔøŠ@ Ämqd{¯aÆó+™”‰Šž‰g°)i&xŸ2m@SÈÒK\H*Ç3ÿq}C‡ÊýÀQâÑCá½sM®Pn>“`¾Ic¥Ôÿn´Çˆû ¾ã³ÚÆêÿ“_Ba/©û`0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2003 0 obj 2730 endobj 2004 0 obj 963 endobj 2005 0 obj 1235 endobj 2006 0 obj 532 endobj 2007 0 obj /BDAAAA+CMSY8 endobj 2008 0 obj << /Ascent 750 /CapHeight 683 /Descent 0 /FontName 2007 0 R /ItalicAngle -14 /StemV 46 /XHeight 431 /FontBBox [ -30 -955 1185 779 ] /Flags 4 /CharSet (/minus/openbullet/prime) /FontFile 2002 0 R >> endobj 549 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2009 0 R /BaseFont 2015 0 R /FontDescriptor 2016 0 R >> endobj 2009 0 obj [ 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 2010 0 obj << /Length 2011 0 R /Length1 2012 0 R /Length2 2013 0 R /Length3 2014 0 R >> stream %!PS-AdobeFont-1.1: CMTT9 1.0 %%CreationDate: 1991 Aug 20 16:46:24 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /LPMCRJ+CMTT9 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 34 /quotedbl put dup 35 /numbersign put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 52 /four put dup 53 /five put dup 56 /eight put dup 57 /nine put dup 68 /D put dup 73 /I put dup 76 /L put dup 83 /S put dup 88 /X put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 121 /y put readonly def /FontBBox{-6 -233 542 698}readonly def /UniqueID 5000831 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ_ùc‹‚2BžØ·Ïj=‡š-)1Î_]ÆX` Yð{ænnü’9׫/¸¤ËÔu¸ìòye )å;¬9*fHHÁ„Kì»-\ûrБkg\šš5ñ&–¦ö(G<`J•7dhàn)ZÖ÷lë“”52 ZÒôžû”$Ù†a#¸žþœŠq13@²Hö…;Ûð+žôG"á1×ÕLûŠ¡(ºêsæeºËERÌ í¶;Ô±Jšè¬o "BÛèÚF¶Kküv/„òü‹‘ ÖˆÑpZC‹õåÞ¯*˜@‹;db ãs*M®mÕÙ~4Ç]®꽺–\Q¼¿±ß)¦:ƒÛÛž3#Ë‚Ð3u˜¸?O+©|õmMìÛ‰fåHÀÙÁ”É21–ûCê†2/æA«Hwñ;Ôu§&~#ˆV=@Å…²*˜†F‡¾ßtÙ¾Žä@º*¿(ê¶s9››—)ÝUdÆ•F!;„»ÊøšÅ­²“$rß)­¢½½´Ð_eò_LR–ÖXàJ*…'¦*|–o+…µ è_Ò|fýÖlWU6y€ŸMæ€`M¤FøÒ„PÂz£›Xkt¹w²_ÓÀK¡ëúý¾Å1êBov7Œ}âEžö(>à[)AËbцêú>ÃUÃu èsº,íH6ëWa7]_ΑAXφ©N“Þp콕½¡€ñ°TÄ©Âé>2oשW¹,¹1±e±“~OøÓÐØô ¤6YôÌ®X~Óï¬À¥š¡ÁÕ)L«òÁ˜îÌLÃ3—Ó^NA}êY »$Žpï0Fí¥¥&7¾Äá¢fá’ xQKñÐ [òbíry½nó,–žs1j@©:Þ٨뾌øV†Â‰7ô‚ð øp—«¶ÿãú¦Oú]íoáUºÔÁ×Å_©¤áuÐþmJ4 i Ät¡ƒ'8‚Ž_ %èÿDœ™zÁÑQè¢T^oD †Lªâ¢2J[&>œTbßt6§Ÿ-Û=ðaÍY?å˜dƒOÂo¬Ä5*°ñˆ›¹Ì_âŧJ· Ó‚ž4Éz O¹´$ôKƯ'ì¦ïËo»³cIÉÿYN•+™Ähó÷œÇ‰Ñ¤^¡ƒg¦½SËm­{Ânµdr³m2¨e|ÚllÕ“(qÒêb™™7'ST_bMO*¢à€/©L”=’gOºý3,ÿ—S¿Ò– Gèm3yŒ€÷; e•âdH¨*ó÷dûYBž¨Õ²º¡¸§†Àñ`R=)å§Ž¬Ó&M¦ËóïÖvZ–7¡r¸J~‹Ô5›ì ëÖv#ß–?.?®¸rbŽ9ü±ˆœ6ƒé·žÞU©«µ:f!S6Š èI!˜5êÇ ž¾3!¥’ô%´‹›:>ðK¶lå‘¥¸¤"ô ŒžÉZýĉxc^?-4jÒª{sêXÊÍ¿îòÑFR­ÇgéD DjönpZL“ #ò)¶ÐËf«8\g”™>螀œÑ± OÆ^›qU¬t£Çp¨>LÇDÑÕ/”•`•Ïít¬¢Ù+7˜Š ‚´ú¨}²D0.®<ž£ê8QmÇ‹¿¢_Íßt•ÙnþËC7SQE)³ã´##Ë:«0#…Ó´M·ÉÒêƒÞ¾8|“(Ýg™9¢ª. §q]f„Œ eþX3˜ÿ›ªùbOÉã&”Ö„ÙÜ?n"v£´’$¡+—óg¦B¤¶^‰îQ­®u£CòõÓsYtACÑ(®¥=} µ«æÚ2“vFsOý*F»>X©Š+hªW\g×—¶‚~#£:\ZlnžA|E-h‰Ôç.§8ç¶é„#á[€{Á×KÞÓ–H/YwE‡iË—¥ž; N­]!OàH¾¥_n fMÜçJr±Ë·õíÛ½ÞÐŽá¼dÉçÎu×Eíóîpq½)õêeËì<„Ò8›Áv£¶h(ðêi¥°}Íå˜jb:³D)iFÒ¼ë |]Tÿ™íòá÷^‘a³6o®Å¦rR‡u'`Çýè&~èÎ:cÀ½ŠÚb͉SßÔ5 Å"øš?¯a¯¬:sttY‘±XHÓêȳÙÉ•Ý?ð#0M˜x`ÿ5M‚o·—çöAîÜ ’>&G7«nm?t˜m²z¡a4œ+¶°f“í–}õƒ$ËwÅð1·î”Ujµ8Ís/Œ)¶ªZT“ËÌs™†’giºæyÅZ¤:ŸTÕª#ˆŠ lj[κ A±v¸È·¦y9! ùLØÈ°E€ûú%’Ò’øè/Og^í¦»m U^’ÁÅòCG'*Ï+åÒí?0ÙîPn˜>‚@k‡‡Æ ‡ ¾©g4­u–gƒä¼œÚìN!å¿Àg¼PyZUÌžï˜ïfª†ýï˜aŸëÿLñïCh-Ü­²\D#­µÔ<®€˜)a–-Ï « [_‹KàOÞßo´´_ËðsQÄW¦ðIÏÛ?Ùdà 5ÙŸ0“¾Iù1ºÊ*ÍöŸËmüÕP¨üÂ]ms²a²Ç¥,ì{-WA—Ì_ Eq”ZØæŒ£„z§,ߌøÏ£xÚòÂ!¼b>d˜(6á´Cêšž¯,7Qjû—eh-­(v½*kÛî¿v—”kI‡¦ø­¦D ˜R ØqãR³ÆÀ[o8÷†Ó(a9á)›ú>n¤gåÕX±Å5¾UGFoc²Î¿8DÅÔgoM7FÛûм®ޤŽàbÃ`þ¥(ÎæFÆ´'R”•Qû0xþ¤AEö7‰ºC)V&{¿áZj‡ x6Ü\¼Ötþ7Í[%8´;÷è0(RËJä«W_mš@Ö”A«€oo²ÌTüî–ëi§S¦£Àv1 |ja{îOþü7c§ç·¹ûáçOU–ãÒ3n÷ª~CSaGïu`~ª}¾Â4a̘«¾]¿DH‚RnÅv¥ ÇöRD)¢‡VÔï%U­@éq'àHݸ >zÜ‹e“+"ÊÉ­‡öì¾… ž1ä|c.… Ë¿IŽõ/‰Öu‚Yn9%] è¶šu¥×5⃀V'¸és^Z N †®ïù[&ع å²Ä3ä‹Þðí‡s½«åÐ=Ó{±tCÙ¼ÐK»í½8?~Ù4æ|eþƒ&e\I :U…a‡`>ãtì?§sî0ºj#ëb8ÜðËwÂY_±=öŒ?öÞò-ÁØN“câYá/´ìˆà±&,cÉËÊòF;š¾AÛ%ÿÁCL†Âäas³*oxö‡j.IÜ$Å€©¥œur.¨ñþóÒÊy'û0ɧ\pôa±Kë Ëá2aUýä@YkGåLÕ¨¯ÆQò¹ZŠ æ&h¬æÕ/_ƒ´É bÔ«íj[¤ˆÑfØqE´—îœ|$˜AϾ‰½AhÂûíOÎvëz˾ðóGB’cáþôuŒëÀSŒçÝp.tŸãìL–姇€8™Ð¼Õ"‡]šF­sFVìøâd8|8ë;ÀMW½A*pû›Éó,ZŠ„žw5šyaïÿE—]Q‚ø#NÍ-Û(IA½}Ï%ìɃq&Î!>ì5†æ]3¿»¼ý(–3Vî§ +›ù(uš­§Ã,,¥¤ VÒ6Ú•ª‚Fà qÚìzFœà2)´»%tËØ(þéòÃ*÷ëâ$Å[¯gGZH;¬MËŒa<'¿ÑqW¡@ßçy˜ÜrÕÈJ&O±{£:&m¦· ;Ê€ü[$¸µ¼4Óz9üŽÊÄ1ü½üw™¥ú:,ÝMù³¨Aÿü¿Aä¿U[2s“p‡º´)A@ÕVMGñÔ*¡–2D%p¥7±$‹h½ZDö©Å$1±j?KåíOæÒ)TxÈH ¤~Nè¡þtâv@8c7íA¶ˆƒófd/{|\Wxó Î iƒ¿vM¥’" (l®òš¼›&•pá³ÃºiÖÆ+kT ¨Ï׿*ƒ“‘2½d®À°»˜˜êö-ä®}À·ýMcç:‡!CX&̶nÈïZ”ë&Àdòtb‹ 5¥Wÿ'œŽ“å´Hs"Ð ‚÷ÆÞÆM ËÊyAP×|ðŸ›Ù,ÛÖÉðh±™FG”`ôŸö ŒcpkÚ<%gÀ¢LØîŸÓöÌ¥'™d¯»—•׃¸jðÅãüéF»ž>./nJì+ =pL¨ê§&T 4XÊ/e°^¬»}+IÌß>eò à}ôK°““¸iæM%ñ~3ÅŸmüÄ%âçþÝ|Ýl¤øY|l×~®ꛤ1›Ýãj *œô«Ù)=pîÕ¯˜f©hy–ËÕçÃÁS°SÊþ×6 r]Ö{ d|²‚¾÷yɬáEÓíÕÖUgнsÔ¿BÇjqZa"f­xDóIÍÄZÃ07]=Wh1«: %hŠ>£÷¡w‘;JIPëI‹pUÆg–¤rÖ¹ U ’ +a{¬ˆWu(nò–ý·¢›£`$\ '®zc +J.R%ë~µË/öƪ þ×Ç@Åáê/ddêkÚSèd.b:/k7È‹ÊÃùæcRL1úý6;”Eà+ÿF|dýVåï X<5÷ÿG–*óÏÑ0%;©¶‚€°ÔoþÖÞg“qÆk^OXFŠý¯šHžB‰O å90œ¢BºhZ·g ,ÀÖ2¢YàNÆÁŒ]-wX*¾ÙÇæS4 -.„œ“DôÕœ”Iç;„»H&ú8¨gÓ–ec>ÏþÍ¿Îry¨‰ƒËGâg?/µ#nX-rçé„ϤÝ{8L)ónëT‡tø·Íð†ìQ …Í,ÆjÃŽ³Çl½5ˆäOŽ<ݹ†¥3œ"Ô—6C 1d¦ÇPÛŒ9†ÍI#¤bFEqÛ©Á5$…‹ðŠn*€õUÖì®JF&u+êéF¦! #Êø¥zˆsä´6Ïa"Í ^Òfiþ½ˆ m;•<™ûû3>¢™n1*ìhs}Qq„ûlRkžµç°[ôâ^B`ÓmýѼÛÚ}<ÙYìb nžÒìšÂb E ¶Àùüp~Œð{¾ß{ÕÀø´¾ØžVÖÓNUáÜZ$EUÙºöaKlÞÅòF&â¾ÜŒ+ø¿Ž#%yܳI=xñeæ×±úÃ1Ÿ¿fòé«$ç)r©ÖElÐKÝ>ãŠÇØ&û[i»»d¸MÈíupÌõ&ž¸u:hvŒd«ž(!a›=C*.ôA(1±…Öõšos[Ë(.ž‹&¾:¶°4—K(íUÔÛvSûY¼õ°NJéW<øÓgK[ÉMðusb‘’ÜÏp±~DÆ{â2Ó.s’ôHËCÂ_°Õy©SžÁÅC‘’C@±'hëæs¸8üCÊ'ÁÑ8óÄÁL¿Ë:œæžÐX‡¸¹n|4Ì´…BR¹é>êevÙÖUyDIˆÝS™»K o¹ Á-£žV¥d'r§:÷*¾7‹_μ×b×uŸ N:Û÷K+Æ" Y ]â90õýBžu2žãúâBz"쬺x-ZùÞß×qwS”Éë/¤.ߘ f¾m×ûÖ‹‹fõIÏä-h‘БÄîýµló噜úÓµœ«{NŸp¡`7ŸeN4Jp,ÎÚ‰µ¢°µ™õ‡_µû0õ¥˜×®LýñYêhX_ ºñë.ëË€ÄÅ@N€æ´Ñò윰·§ÛAKT°A Y<‡Ñá'2Ö`7îg©šnHd4%}µ˜L åΣ*I{‡'FñLrý¬Wý̦¯i¾óIQó ¹ÓGRËc.j}'%œ°çÈþ¢þ¶F•Û‘D¹d›ªç…«Ö̺Vºd%LÙXißE,ëßm ¿Ù1ÏeC)tH€Iô'6jYÔ¶¼øµxjÄx_ÏGõ‡ß^îÒ,´²˜Ñ¡¿»{¤ºþp (8‚w«1Ÿæù8ÂÅÑcwœbRÇPÝ\í’Ð2aÂþ®Nçöf‰•±5=((a×ú°“.Ó&íÃP£I…€=5ÓŒbE™Ë@{t°v6°èbȬL¡³9 Wÿ~-ä*ÇùkºD.lÔevŒQQ×ÑÔhL@Ĭ¦õtБ¾êéa­=EOÀï#SžûRý»v¼Åš>DãéGôૺÙ5LÍÄÎôô~Ù±zqÚbÚ{WÓGãï|_z!» ÿLK‚²¾ZFzUgzs@ð3µé _’Á†êýr•šø-GOZ T»= wÉJ^h¸;aZ{-víH(„^ƒùup€ü¤è*ó’ë¶Á¨ß”µ‡Æ2ˆµQQÇG¶Üìê¥ ƒ'¾ DDÑŽh¯”·(å–ÒU/%ßý1FTÛéÑK?¥——ÎÇ£¯¿LÒ r ô™0ŠÐ=W!YL~¬®þw¶+Æt΄¤ ìNï;Á¨` «IåôÖ¸ã8¦yxttenёīÀ¨D¦­IóḺ:M!¾\ølÖDò=C ¦òp`î^ÛáV¦Ÿ;¾Y÷ƒ%*ÉH/Ýè¸TšïÃBüb¨–—öÅ·šç-,ŽfyŽÔü´ ÐÅTÞ…¡ÛýÕ_Cߢ)xü@ÏeñdŘÕBCqêbD.øTÔÝLd&®,‘TiÃH¦Øxó]þc%“°¯‰B ‘&ØS@c2YýÚâñ\määò °´uê{Ê¢‡Ñ¾Ü¨:œ&È(Ý{¯gfàTØ0(sCù¾Ìf‹ Ƈî+Ål*Χþň̅—¢ ˆòô–O¤–íûmÒ=…NSâT[‰^f ˆÝGWó'£qçc{ꀇB•ŸPe2ýip”PîÊTPXÇeÿ}GD_££«<ÇþÖ?¿“BéÌâþTX~•ðÑmI³9S0æý¡sC„bV­&ŽQë Co9d!étäR¦ÒÌó¯u½?}ñàØÿL œX+\±¶h«Aß‘ýW¤òhºm¡aº+¯6.¥ýáxIj}•¹Ëµ¾þ ô!.ÃüÚ]÷šþ]UW×[Ë’’]tÒ'ä’áy'¨Ë¯Swð0¡œÑæ‰@ZüºˆŽt,ŒH¿~ªkÿdö|ñ~,T¶ù~ƒ2CzäÄt„»ï,è!µ¤ÖÐkƪoq`Ôâ(磃ìáh}Ú™4µ?è_F`ܽgLJëê3;̯¶Åk;:Åþ n®¢¢‡šž#]õÞ÷­¿.‘d’ sçcË9}ÂÍ]½üÅc6Ÿo[EÑq•ά™)V¹¥]2ɹ ÉéÙ?SóL(ø»³T€9ÓÔ ¤XBDÉZ0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2011 0 obj 8356 endobj 2012 0 obj 1376 endobj 2013 0 obj 6448 endobj 2014 0 obj 532 endobj 2015 0 obj /LPMCRJ+CMTT9 endobj 2016 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName 2015 0 R /ItalicAngle 0 /StemV 74 /XHeight 431 /FontBBox [ -6 -233 542 698 ] /Flags 4 /CharSet (/quotedbl/numbersign/parenleft/parenright/asterisk/hyphen/period/slash/zero/one/four/five/eight/nine/D/I/L/S/X/a/b/c/d/e/f/g/h/i/l/m/n/o/p/r/s/t/u/v/y) /FontFile 2010 0 R >> endobj 548 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2017 0 R /BaseFont 2023 0 R /FontDescriptor 2024 0 R >> endobj 2017 0 obj [ 642 857 799 714 685 771 742 799 742 799 742 600 571 571 857 857 286 314 514 514 514 514 514 771 457 514 742 799 514 928 1042 799 286 286 514 857 514 857 799 286 400 400 514 799 286 343 286 514 514 514 514 514 514 514 514 514 514 514 286 286 286 799 485 485 799 771 728 742 785 699 671 807 771 371 528 799 642 942 771 799 699 799 757 571 742 771 771 1056 771 771 628 286 514 286 514 286 286 514 571 457 571 457 314 514 571 286 314 542 286 857 571 514 571 542 402 405 400 571 542 742 542 542 457 514 1028 514 514 514 ] endobj 2018 0 obj << /Length 2019 0 R /Length1 2020 0 R /Length2 2021 0 R /Length3 2022 0 R >> stream %!PS-AdobeFont-1.1: CMR9 1.0 %%CreationDate: 1991 Aug 20 16:39:59 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /VXPPDG+CMR9 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 14 /ffi put dup 34 /quotedblright put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 49 /one put dup 50 /two put dup 51 /three put dup 53 /five put dup 54 /six put dup 55 /seven put dup 65 /A put dup 66 /B put dup 68 /D put dup 70 /F put dup 73 /I put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 83 /S put dup 84 /T put dup 85 /U put dup 87 /W put dup 88 /X put dup 92 /quotedblleft put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 124 /emdash put readonly def /FontBBox{-39 -250 1036 750}readonly def /UniqueID 5000792 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ\÷c¼3Râ*Rç?쨤‡±ÿÄȯ@› gSr æÚRÊIƒž†¯zE_ÑðÎEˆMvï,¹¼X!ý%6]Þ¦ä_3+_h¤JØ¥0ð’£o­¶yÏXºýÓåýÓ¹`U×)î Ä%ýN5<6[À¼mÓRð"ŠŒ-%QÍgÍ !ÞÕ2o¯ù±‘g’Ø,YdùÝßàÒhhu½_È1©AòÅÍ .UŸm;›·3YZàê`“ù†7z– ñ*¡µ%ÍŸ§AþÕJ2¾ÍU¨hÝcšCpø2,Ë숛§#Ë@üJ© èsêÞ8,©Ï ûeð«íýšd»?Ms.š‰"ôA# pÃ9É–v*³\œXšé K ˆ Q­F7Áq “èÝ{N{G„“¹¦0oÛ?¦×8ª±Iû²¬*™œ!D]ã!ضª³8iÈ‚a>¦µìVGkV4Ëð;þÛWðyêÎ;3Oo8Kßp®½Y,ŽÏ!7‹T¨µÛ÷Ë’‚áj¥áHC“9µçÅ[‹ó»I?;ˆJÂ_ž¹Ëâ1™­,>W7'p£RlfÃa{•Öñ“ —ÁxÈ[ý›—:3Ì;9¯ñ˜ÉÄÔ«£VõŒ¬4z^‡ìEÅÑùŸÔõ­Ð©öª!6A_ÞxcL8i¢¸<š÷äU#öã#6›|i%5Ÿ®œë([Õªwÿí•ÃÒˆ—–…°SI_è0˜øŸóº8 9T)Oò9&½M…žäL¦'ó@ýí÷&,yh1*ÛT§ÀË(T5¦¥@ƒU€|`2wÝ™Àè ×&±òøÜv÷ê"BtÚxPà2UCLCñ`dƒ«I3‚«/dÍùj2@F˜2NÁЮ'—býÕ×xKù´aíê]´°Çš5=‘ ¨mnYýD²FoH´­Ÿý1Z#Kú+DˆÝ£LƒïûHpÒý‡WahèÇÀæ}ô»$†~Šÿ\ ÔAç{•ÚÆ;޶ÿÎL/²ìôáQ#+Smuc݉E…ˆeåÎîö-çN#ÿýûÑ1ó '¢ç+QVngbÏáä¹½{ýüÒü`ïÖ"¼˜nÆ1úð- `¹û'!N‚œ…äü×dÅ-`Æk[oE 7aÆáÕ£LÀH¾{ÏH]½5JÖ¬ñàìþVNhm…ŒbWz[ƒ MRÉF~‡ƒ GCžD›“¹,ƒæVùyE Ç€¦.†T·iXz(Æuþ;Ôå'“ÖȹŠòßö7‘˜5^ßZWÊGÔÞ—¼-ÓÒõGBÅx!mkµïVì‘ä·c ÚÀ"…J棜ƒÌWí ì´)=S©Þæ"¡åA@ñÏ•8 ¬Ú9»”£i6)^]Ê(ÅlG¡0 /Uãñµ¸®ægðqXQŽŽ†²@'SZ=«ÔÏ-:ž^ZëÓkqj~Δ¨â¾ã¨ô þ¨4¹‰&v™öCÝU á!(ŠËÜõý;{)špú¡¥úƒ¶EÃjÏ,õ0—1°"×=“ãùjZV MÓ^ŒÙ½¡#5Ê‹øyÝÁ·Éù¬õa4Fزâ/]¹/õ×'"uÞR9é)‘9Qœù«‹l/½¿Ø©l¯áÿji±¼›š_Þáùc^÷ˆò¿{·W‰W¼ŸÎMÏ!X£ª)­XõKXBlKsw•îÞQ×*c DçmÎòã±Öî¸ðšLÄ›útÌ}p—Kx„ÅD]¶Xžh·á¥šH̤.m[C(‚­Ù&Xˆ™ÙM0 fá¤5cŽ™o–YªÃR%Û“ÿåO¼UÖ<\:—=³±€–å²àÖGaa=蓼•}úãׂbö4]i;çÍ9kÇYæË]•1žçåÝoÕóRÙ+\5ü)±£((Ô|„ãou‚ˆ1*X`wðØ·‡B¸WJ‚ÙWôS‘ºñÃ÷@ÿ„¨¨HS f’rƒ*Ùž~Þ­­;!C(;Ût“f¿¿±[°1ü_B½7+6IUd’a®[/P™~ÎËÕTÂ7wìÚ‰hŒ”w{_„AøcÇÑ—¸à ¬S¾)$2FWE•¿~ÌaÖ_A6VóeY+äqÍž¥-²dv#=‹‹óí;A}U^êdoxFaÏÙ––ÁÙˆ†²Éâ1d½‡k ,E ’WKK*Hbþ9^‡ à{'*ä× Œ!)ýnŸÆÉt~æF?+á:»?43*rö™ñUây)Ž®&ðq©U2˵ Á w!®§bÀOz5‹ß¦ÃÞYYŽåÙCÅoHdçï£.BºNƒŸÓì6¸p,Ù[œé"‘x4`D í Ð_ëÒÌÛ.™œª^íú»lÔÔ)~ZƒjúïÀZáÎÐÔW^S}YÕ6ß\ îꓦúV] †¸„ƒ9 ¼^™ úH[ ‰C>5Å6ò…gV1 |B¯jëÝ®s‰¸H$’fsg&÷gnÀd­2ŠÚ\m|E*ÝKÉ w £Wê€ÔžC ±t8y4pʸ•h°c‘ÖŒ’‘kd#à‡~ÕÖëxí —H·ËÆ´»/Û&Tì¶ÃË æîGãn „²ÆAÐÚ£||æ¶, š5l’™VòÛ˜à„=SlÆôk€d¯„ï{ô*w͉ÞÔÜûíxº>“ââjmà¤Õ…h¼«—oè"3óæï~iÜ×¾ºþ¸?Î#á L¯ŒÌò}“ÒP]½m— f§Y;Ö0m”+ÜÉ‹žQÎÁëKÒwìfõE@ÓÖ–oaþ+ž‡E?o̼mÔ¥˜©S†žXBÜÕeGÌ]Ì­xv2¡g©)¦ø}|Ö|÷DÓ|[§Hž#3»K}Ãò>CãUOÙ²’mŽ8¹ñ¼ùƒü»ë¡ÛÇâ7º¼š4‚â¨ÅµžE²…ÇëÓcã\¢ß¥ %@ÛT¨g—Z+ÃÉlúÂ…îlT{Ç.ã|ý3Ù´+EïŽÞYÓ<+wêõ±P ÇaÇ8æL0?.ƒÄÏý%tÝ—ÓG?Ñ \O¢˜UQÇJ´“|£pŸ\×á42 ȦûTí.ôIÔ¶¹ìÔ#Ý¿J÷AîŒâ‚8ˇ6^j›2°Ã6Ëy›¦elû¦ åUÒÑ…7Þx¢ó¦Ý 7YOï…ln„ô±¹måC?*©À¶Ë%×7øÄ¢VVmU9-uÊàeÄ­³kiÂC‰©¢¸wôÕûûô¸;бŸˆà}³vàr›‘J üBãr3L’}ð§Þð±DmS64§„9LvéŽä­7˪ê+|í8‚ÒëÏ|©T1ðk[Åúµ–k]P»›ìib(yˆQh]SEº‹¥Ð~êQ Ó½ò#kXë ZØûîªô[$o7G«™D¼Œˆ® Â15"h€2ê¡ó¿› «³–ß!¤ª`ÃBݰ_‚èÈ¥Åî_™Úb•JA3›yN¬ÅS_L·Æ7 wP'6‹`¯ÇtSi”6;!w˜ÙÃ×a)Û•²Õ|³Nc“ºb1ñ1ÎnO¿5ã4äHK)3yÉHôÉá+T¿Éüu¾î³ øüQìÖSí¢}¶Ѭ9¯m  (Ƈwß)±ki“À»@ÖÕƒžÄ#•S†Yf˜S¼me]Arª"2Pg›oåS˜¨mF¨w³®gw†…ѵ*a£m†}n8ÿÄýÕøÏ“ô—İ2í ,z|娬LªN¬¸ sàåˆàÅ7w=eê–‡7Ÿ-d¡Cô´u/-‚AÍ ~g3Pæbì>~P$Ë–â¯ÂÑz˜¦0ªc~¢±x™Æ•Ó&YÃöyΟZ8°ÃÌIœX á‚i”+oÅd}lHQÎCF§õyyèŸz´p7bå9B|å…ψÐÈä ïÅ ÞǰˆCºÜÇsZ(ìðßk½Y\ôqèäï ,)°´[C ylïV9òyHU²Ò„N†/Vta#@ùçNKGé!„y€K'_µãGWp>ÆÑñ ˆøvt+/£íAZaQAgÞE…mT‚+@ó í_€bR÷œ`_Å¢l ¯–Õ-aãcôÊ% íñ$ Œ9LUd4k!±× ~råŽt¯jjü·îÁÑùQïOÑc1¥·Gw"qÒëájÀÛ£LeÔ>ërG`È×öí/{òlu(jñÀ%l”ÜÇê÷Ä ËÓ[¬µg>dyPÓm÷ c ŽHYÄkÊC †‰üo­zBP¶Ý_#˜½PLr©ÅL›ÎRL`3‘‘R»B8xÒžO“ŒÅÞÂîÞæÐªUQë…áÙ‰l³)«PÜú @¦±7Ðè½€¬l®º²Ä¤ï+T¿$}ÒO;brÃbœäk+ò( ýœEìåIUE#†0æÎ÷¾eºV~ÐJûéÜ,캠5»$ÒŸªüIv„·ú Dí8d•äÂÊòÏÅK«Ê¸¥½ëÏßSîI¨K-êƒ|m úödÎ/ýÁ8’ä6kDÙöú–0<ÕC¿O×à\6°Ñç›BÆ*~iùÜ+[Õî+’)\­3®W=öëA­ï9Sôáˆ8FÆN}I&šŸÏºR”6Gúµ6A‰U5›`×9 û*Y ù%çÊ+Ø(…3›€RÎ\+†¤^3ʘϡ!ÿ”@Þ™Ú —òIÓ©Sˆ ¹t‘¤¿.áÇ´ų±™ø‚ñ,öÁÇzÅSXÝt!iíÆ ”>¹ËXq'C#Ëã¦bÑÄjèèð[ÌÓºˆJƒ ¸.±½Ík‘Z»3^îë$‰8|ÀñîÀ©¨Váns?É;)æ¢àpg£þ)ñ@n+ù˜Û­‰ÇýÐw þq×ð *ïM[8ORýÙ‡Ž¤@gÏ.CzÇdÊÓ‹YP/þ#`Õ:lAG5ìÒu#¨ƒMxe¾kÛ­¦õlu¹OÍi%»DîŸÆöÜ=oj—ÿ:í³–Ä?—ä¤2Œñœ¡e@m÷ÔV¨CØ|{oh¤y^«1ÓYîjuüÅ -+‰FKVåu›)ÅD5B®ˆâ€p[ÿ¼au ¨±.Ê;Áxv{.¦÷ŽGtÂßÐC§smjÑœÈÛÌŸ¥IÕ]ocP÷óåÍ]ʰ½Ž©2ÄupI~|ùœ÷¼:ZJTIÍÖš×Þ˜‰±`HïufRÔ«(ÑdkÌ<‚Lj§ýhÔ ÆLf!2ŒšÍ^ÜôZ©c¢Xe¾¬ç3¯ìz覵XB$ÍEB{†C‡6çz;ë¬f ³þ‚Æ’"“´õ Ÿá?ýÆž7=MR–+ûPÜE7åýãÂN â¥_›‰>h8®un6ê%ÑÐÈ­÷>¡ö Â”—å9%„  ©4ï1Ô§z#ȾGÚ gÞ)x“#B¼Š0ù‹¸&ça»¢“–æPô9φ’‡É±D7àC€=JOÒè´džMOC‰ô‘F¨£›øKû4Ê6è9àC@ UÕ XU^<„&Í{‹~XµK^È»'¢ù„@¡–Žî ÞRnâP)ØnÜjÏ-üg5h™"„îh6ÞÐÈF}Qb¹2Ä™&ŸF?âw‹’'ÿ0Z˜Áû#ä-Ò\Þs`Öyu¢øÎ1/Àþ{ 5$u‡µÊ–Ä«E¹‹™¯‹ÆU æO5}Sª¤ÚÇ··¶š ƒ_…ŽÅ0ýá %YïôÉN¸ì¸›F³È=¢¨GxÇ®íÞ!ܧYök£ÊÓû þϽÍâíg ÚœU  (‰ÜuÅÇg½÷ŸŸ´€ßž8Ëâqòµ³¼ ‚X¹Ètr0Ï<!uÂU• †n¥Mæö—“‡]„õã„gUðgÚ·2žØO“ "ïa:ÊÕT÷Ìh`bÎW‚¼Gé×)ŒXŽ7÷õÌ)Ö_yPpÞ@Nà²b<¸Ôh>ý*þÙüFÀö‘T \͹dè[«PFŸ±}cÐG.•mO곘‘/÷Á¸öŽD¦ó‡L–q G¡ÿ©"œIqf°>¼å;bFoÄØF,˜¤± !Ä›˜uçÁ°~ü­†N-qœÀÎ¾Ì ÁJ=‚(Dð1]‹«^ãyaœY¼)Iý¦<7‰õ¦Ç Ë/f9ØiÉ‹±-ó°ÒNÉê¯&Œ¡(ö¹®‡Ve‹ò¬Ó:Þ1åšÝåÍ»‘dtv®Ýž(Bz3ç¶,v¢ì‘=ÉÛРW4ÐýÎú]ìaÀ’í‡Úo¨1 aÿ ?6<ÄçeÅ”JbÞqîÓ‘‘Í|/uf¨AÉ´ƒ §•ÜKúYéz̯Dìäck0tÈg)Í-33»Š–ˆ_aŸsO{ ª™j0x›æ¼ÑôÐÜì¿¿@Ç–Š’aœÆ°ƒ„hß2 ¯;÷[†7aò[‘“¶@FÝlµ½ƒ†„QÞ¶_]3š>ãÉ-k&;KE-º?ä¢ôNwxµ«æ/'IU:Mu`âÔ©mói{¬ya™ÞwÔ6µë0jz¼Eû<ÁN]×7÷ï ›ÄÚË™jèç~Ã~¿W5óB|@‚²™Íùkó #Âêˆ ¬ )gù#A‹¹~µ‰n¢–Ѐ°Z…ðT-ñ@üͳdÔ¢±—É®wW6þ©{u‡äAf—~wc%)ˆ´vÑM¹–›¥ä°>CÈ>„2˜>¶*Xƒ¡>'qDÛ…sÕı´ ÜŒÞáø°¯N§3pà®Ó›#–ã’›þß¡8.T¿Q¨ñÛ›‡Y~,KQå9JñK݉„‚Þó+ä·îZÆ]ÄÛ›wN×P\Q´G÷Áñ}d@;ÌMr2„H‰èn\¯ÜSQ8aJåÊN.´ÆÄ¬¤‚1×ðn§+ ’6’"õ7ôt‡Iº{J^ ,àqWjÉYËJ䦑ýˆ9/[ÜÑàå2‚©DvñªÀÉï¾È‘{Q´öê›ø$GOS¯‰¸EŸ£ìîOj³ê~KS+!‘ï$  eÞßx€"PrÏ£’ì¾÷Ÿ; qœ“ökX¼=ňaKžôoú‚ʞ7ì/ÁüÆpá_N¹ Ä–Ëúü‰¨‚ñì¯È3ñ·ƒIïX k² eâ ás#Ú¡@±“›@ &.–'PB°³:QV±ÔcBOü'×ÖoñP"O’níÔ…æ –T°v¾ŸļÜ.eSL @á—%®C¥ Ç@$*j,¯éÓ܌ݩ€J¨Ï‹žüО©Õ—¶ŽÜ9ÎîG0‡òObÁ“¼©âŸÝçÑ¿>åe„Càw[gíËz)ÒºÌt¸õ/ûÎe8м²°ÃÁ*t2‡—x…˜H“‰çþüCf⊆õ"‰„•ŽÝкþ%üdÀxLù¦B>IA«ÖÕ70lV^ÆöG ë#0ÛÜËSÂW--)¢æôœW‡?®³£èƒºh{!6›jÝÎaŸÐQ+I=lúYVz}iì(ƒ;òÛ#Ej3•­‡í%Ãk- uƳÕEÓÃ_‡3oí àÎæt›ö—«_Ý/^,¯×„ÿ†Å°LÛ·×ÅrtT²TŸç¬§9ÁSÙäUjÌhÐÐçÞ'šht݇ds*bf?dnÀÖ|>­hC-Ö¤Ïl6¤‡z™)ïüÊ×ëÅ—}ˆ€JFpgG§3Ôá «ßÖÖO9GO”oëÒPN<¢:>‡Ùî;-Ñ*¹hŽÛϾ™H<¶Ï*ÉúçŽDÿ±[ƒÞœTwÙ®„8ï/9¬ÉÀØ ZFÿtñÈîn£9ÌбZ,Á=Ž*Mo@ÏOKJ m Ãc¾)>ýéºËÿŸuoÌR§o:ÚljÇb!x¬ƒçÏ‘¹‚ÿ‡ãÑY ÑS’PΈ’b¸÷Ï-,°‘Œ/E¹±4+Ï-6¡¯'*36²É„8œÃ¥Ðí´ÑŒÉO‹éežëí˜ð]æ׫0ÿ7¡–Uõ†99Þ|BE8ty(<ÍŒeëB7ïþ=Ÿ¿ÛI’&w>ä¬6z×Q ðÔRÖ=ðNJ]àUôüt,9Á&]áN€_0HQ/ý÷ûÏ;du7Iáø­Âýr‹$¹§/¥¥òzûnßµ}Z^«ˆpö†±âÙtÒu·g!ÿUÌZuʵ<ó¥R'!‰T­Ñ¼Ÿ ®ŽX…Â_Àƒ‡amŽÿÆ]å«yjaËæß@Í´9xZ ¯“¿þ¡Í[@3¸;/ò¿ï]aOuÉ#ôƹv¨oÛùÉÏêuα ¹Ó\ˆCp7X BÓ™! .eµ‹úŸ© ê§ kèæ ÷ZBZ›CXgÑ@ܲt,ä~e¾Î` ô(¼¹hÁÌw¿HdÍ8Eµ‹ÿ;·ÜiÔâ’ýÂH ¦&|Ù^6g1€pNض(Â:£»'+\½îɱÿœö%^Þ¹Àíâ’˜”zbQyèÇL l|'@ÇãtˆL×î㥕–¸)O“^«üª©œŽïƒûô$Ø)¿²|p mtôýÚÇw¸Öoø«­vÊHÚ³Ëyd£CmÁ>¢Ï ³"tËÿ)+k ¾ÓæíÄýØê¾>å²3 Z¤°…h@Tv’Oœš¢~6SÒØ+¾€R•u‰±Ø(eE}µÍƒ ®˜ý–ÍMW¼þ_˜%a.E†UšòàŠµ–¢+\Ж›ô2„Vz ¦Çž•{¥þÏU.䌺/Nünó|hJ|6h €…‚½þÍÖ¶1JÊ3•6xs½Ñ«tr Ýño·M^{í~+E¢ùo¤*\<å&7[N'ÀM@Ϧ’¦ÎlŽzòÂ2)]‘+]ëx{…ÝUÚ%CÑ&nJ³BkhR ´–r’Je"È~7Z(Еé ôÛ~Ö,),5—+ú>¢!eêÚÏÃuOÃbÚ@bpŸÌPξ†Õõ¬°Ë£,öÙ{»GAض‚wG ýñ²C1zCuG‘†V28:\BDô‹×^?q=Ëó·}´Þÿ(Îä¨é±®ÐÂLC¯«‰.DŒaXÉ4¢Ù»Ã:+ãÕ0É:ÉíjôˆñÿïÓk4&O€Z`®7ÌùÎRµb%èÁX¾d†„ªÐ~gÄ"ºþp§ iæoŸ®ŸüÌíZ¤¤f#ÃÂ^tÞ‹U‰TûÖvjïà»ÆÎúÁû[Ø*³U®£HÅ^W62Ù&6€snW¬æZ½<•>Ò?2;‡èªQqÃA{+¯¥žü¬»¼=³Ú¹ªà1}ÞøíÌ •Õf¾ËÞ4ýØÕÛ½æÔq|Í_Žû†:“x‘À4­z+ú¡£Ê˜ [%¥ùäøƒ]C ?³]“«‘Ó¿'5ù?\.äuz% Çg8÷Ib¾Yx΢¢É+-øÿD]Ì `C¢ «…€¬ÚÁ†P•â_Û^"=ày3+üþû;·ER>ðOä‹Íª¯ õÜÛÀq¾Zmz«\ñÛïb^ÐíÖ ulWøÇb±~àÑ£åMºIs¿Ü]çœ%a{b±"«dœŸPCK/^w{4·'Là¤éO5Nðànƒ"ÌÂøG(ŸÖ™ ÕÓË1ÆTã›G4XÅW^½¸Wÿ–¾Ã­z°~²`»‚Ï;ö¹)×Q©wƒP®U?³yéXý!ëà‘Â%>¹2óºöî fò»æè6œ`H”ó…ÇqDsD_BDj ÀÌqžŸ<Ç]í>#]`:$µ'üX¶i¿Z¢Wh«ÇÃdÍ ±ÔV¢_ï5 ˆ¼ªŸƒbbUµX†;ÓþCNÕ'ìûy0âÝåòÀwþŒ?®J˜1c2;ãql¢i“[r4Ç]àÛ<yæ¡’ì"âÇ'$œÇ™³Œ8¦:è¬äm?F=æÝÅ €¡C-¶Ÿ³É*&ߥK˜7oVïxŒ`ÇØ3‘·Àˆ¸HŒ¹w†œšÏ> ãZÅþÙR:¢l6åöKhó}çf,›Ø‡¦T&)%"\”„Â!6ªXFj7H2Œ½ì‚ì77^ûƒ'×€€¹‘“‘¥8jÌû‘ÔÿÐIH¾jÇ:òkíwHbbgB?â9’fL‰sû“úç-ý™%ævUòëâxêqƒ+9“ëoÔ0%õã¯[×:c&fFMZ3ßã˸ Ã×ëRiT ,àÔK·gJ^˜c,yI°}ŒoþÎk§ËìOÝc—Ów’|´Ï†F;Àânw°ÔjÐÏÝ1µ=~Êl^M‡Œ^äÃ}/b¦?K*#v·<$ë}j¼Ç+àhì{w¾îlìh“©@ àoÖq–°-'`0ÈAÆÃèölÂ÷ r±­\½¿-Ýtc¼šŒ'ÃÏp å£ÙÈð.Xêl]Ð}Èóá-\š6gúµŸóÝ5¼­WW51t0]31 Ëv]ÝNtä)Y[r‘ƒñ”–lw伯ìöuåQ¶Í¡èÿ> 5Ž¥ZÄ·•ñcøÅŠ;æÒ›²vˆî*fQ†ÑCÓ qïBðµºö¨¬}žH⿉5èXôòǸÂÄæ”?á]4åùH{ôáGØ'8ÎÚð¯1ö|]Ú/ÙÂyÿ 1Îý¸6Âè0ã÷ŽÂr¤úØ£_1^hÞ:‘}OUÈ 6.Ö¸K^Ðå?ædmUŒº.¤V©Þ–È}P8“°8×FYÖEµ…)'aòBÿ“.Ýî÷S õaêÓñT߀¸ɆçÐXˆ†³yÔ8C$¥U©ìÊ«]L};#ׯ¥‘Ê”.p¼30+VÌZ”™de÷ã“ÍëÇЋîŽZª¦Ž)¢äaâËÆ-×*.=ò¨’† á ìgMÚc€ã º"¶àÕ-ðËOO| ‚ wô.Ʊ.:Œ; ½0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2019 0 obj 12493 endobj 2020 0 obj 1673 endobj 2021 0 obj 10288 endobj 2022 0 obj 532 endobj 2023 0 obj /VXPPDG+CMR9 endobj 2024 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 2023 0 R /ItalicAngle 0 /StemV 74 /XHeight 431 /FontBBox [ -39 -250 1036 750 ] /Flags 4 /CharSet (/ff/fi/ffi/quotedblright/quoteright/parenleft/parenright/comma/hyphen/period/one/two/three/five/six/seven/A/B/D/F/I/M/N/O/P/S/T/U/W/X/quotedblleft/quoteleft/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash) /FontFile 2018 0 R >> endobj 547 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2025 0 R /BaseFont 2031 0 R /FontDescriptor 2032 0 R >> endobj 2025 0 obj [ 754 1000 935 831 805 896 870 935 870 935 870 736 704 704 1055 1055 352 384 611 611 611 611 611 896 546 611 870 935 611 1078 1207 935 352 352 611 1000 611 1000 935 352 481 481 611 935 352 417 352 611 611 611 611 611 611 611 611 611 611 611 352 352 352 935 579 579 935 896 851 870 916 818 786 942 896 443 624 929 754 1091 896 935 818 935 883 676 870 896 896 1220 896 896 741 352 611 352 611 352 352 611 676 546 676 546 384 611 676 352 384 643 352 1000 676 611 676 643 481 488 481 676 643 870 643 643 546 611 1222 611 611 611 ] endobj 2026 0 obj << /Length 2027 0 R /Length1 2028 0 R /Length2 2029 0 R /Length3 2030 0 R >> stream %!PS-AdobeFont-1.1: CMR6 1.0 %%CreationDate: 1991 Aug 20 16:39:02 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR6) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /REFDAA+CMR6 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put readonly def /FontBBox{-20 -250 1193 750}readonly def /UniqueID 5000789 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ\ôéÒ@[œÕ6]nÎÕ×hÖmlha‹ŒH+4Œ£Ž›¹ºüú­œ/?Ð3¶&˜nÔ=œ“a6E¸#’ÕÊá|´~.‚ÜÔ…Ë¡}ÿù_B$Ï~Îä\¿·ÈÇ|" 4PxÒ>ËøÍÂþP%ú ÌÅïÀÄø~ËíÝß4äôqÆÝ.C3s蛼q翈Ÿb“y?ïZÉÝ7’ð2ãz6Lp‘HC÷ª1DÐ"®28s B ~ õÐâOPQùÍìá ÷áOñ\Oóü¤}ÙÍÔlë4x<ŸƒÿKUûžh§ÉX@øµK˜îyðÖ°öQJ@lRJ›>áæ… Î^Ã;åëCý÷’ÿT—Që§Ìò”Ê[I/¨=ØG6n»õ0æX9ƒqŸåç(Cïîkéí .FŸsH/Â&V©|ï7¡*¬MÐq5½£Ö'Á¤KpÞî<úèNe—ºõ+Ô¸O¦‚©ª3‹cVu)'F¤jµµ³³Ð W´Þï‡l-¡ÌÚCB£tN!B¯)ÄSë¶]îaÚÿ(ƒ:·ß÷º­‹,ËR;I5Æ#°Ã´{K ÿ3K¨nœ?¦µØÜt¨½¥sÞ/^:Žæ„IEä蕚”(Aˆh”'QèE=ö±ŸÙ·ÈÕ®]ÈZÜH+]Ž·/AÈv´ ¹+ˆéõWDmù-r™ö_ú˜ „ ùÑ_hI]ÇÂw¨­º¡¶¶þUU‚Ãv3È%kêìBCø{€ó–·Á´³@|ndâ#ÕEýžd[f=¿E²X¸§\L2‚_ÒG‘µ¾Räûã|Åì‰äýrœ@»#×þ6û*.«œ¤u^Ÿõ×T´ã!(˜Í˜ä¼*ä]{K n‰õ¦€êCÿ¸Â•n ÌX>O´¦"øCt\H'tÍg7ªªödÌ¿/~8 h9¨O÷-¢§ LVÿÉP5GÅáŽîó궈´²=lh¡8¨´÷ɨâÀÏa¥ñªˆ>#4þín,#½®™ÇÏ1Gÿ‡pýmæ!ÏÀ’^À‘ïŒ.˨qsU0ˆ2Äuw.ì†\ö\½náéŸÅN^C:8¼ïç‡qnW‚xxÁÂíפƉ«ƒ&ÿÆùSµÕ‚Ï(Y$*&†€õ.ü¶¡Ùkzb]¸`†ã%#GíÉй­Åà¶ij檣aÚ¹ÄÌ*„­ƒÂk-ºYa…ç$6Н•ø8Kð mv„| ®% Rè¿…DÍÉE&KýÎcAú ò'ÏÝÊÖ¦jdIì¤?Ys)¨'*ù  ‘mâ¨L"ALËläi’”¾~PeÊW•el‡¹¨-OÐÏêŠýzdâ ÞynÕç¶LUÐjîc’¾£½ˆÁ#GÇùõÅ™àŽå²ÏÙÚýhmPÖ¼‘Û¥Ï"îã‹°_}a¸kÁ… žÃ¼þDàÄ%mʸšÅnÚé—s ûnÍIs>"¸zq®ꜯåÕðš?Gî¦lrl}ƒh3ø–*Ó ºb:=E LÄae-·ËeÍ$á“•QR C§ëvÕ¼¦í¬×YeQ3±&´£}ì'‘Ò‹ p<%xÖ»½3賟d]ÊS†8Þ•ub˜>‚ ,ùò§>%¶ÖÙƒ7Vh-¸ãEH²wu€Qþë:&Ú«pƒ³v¡Œ²(6Ç®z‘)•½¼¾œ³'nýæ®æZø=lø —K3Ñý‰‘©¯÷…¾\Ii“äº|ÂÐ7ð\ƒŒX”/Ìs9&Y7;ódü_Óè±Dav÷+ƒ¿{<=ó— ÿz§Ù¯‘¡pË(ÚP5f´&4´œ ¥/qŠPÿö‡áY•I§3oê© T }x¶•`©þnÈVËû)"›Ø·Œß`Dʼ—[sÛ7¯Ðï-\õš±Ó×™ÞÍuÞ½ÄÛ%!¶ðµÔÙ#ÓÜÆÎÆÂÈá~-¦uß±_•Yj¸®>¼ß1 `¦)_5|³ ‰—EíÿŒ–rmM¯3eJçÏåoÊ¿c’„ÚÒGâ:C1œ«B¨¶pºøŸêƒ/$ø³‰ ©S¥ÜÏÜá/dÚ†ëœáО§7õ»ó}¿óªöÆ,ÚÙüÎTÃw-¦ 0Ž¿÷¢J}¬èUªPrÑ7ö…·ÄbÍm†›)¼Ê{1 K€st:é´…Âxá¡ìG³pàD£mãzC¤K4yQ#×rÎ|¡üƒÙ “‹Y(ÒìÝ^nª„su,bøHD®#ci^w³§ÎatW¶å´š…ÒJxy½{`w®…Ùxtt‰Ã>à·Í§¨¶» ή©„QgÈkG𦤄ΚÌþ )Ûë#¯/äÄ-×ìÐqf`yqlø%}*ï«–ÓP¨æëÿ‰5~6SkÆ{:ƒYn—ì–6Õ‹ÜËí3à ŒKuh AÍŠª–œ]IÚ‘46ÎX=?'ˆ²¹¿£%¬$®{ï?m0ýQ ˜¿BÆVL{ÂkÕ:¼zøÍX†’MXH)zª¥Z¯^ALì6EB˜ASLoÃ$%-Ö¾šÞ¢BUi˜À0â¢è£Õa‰-$5tüûFª…q-m·¦FÈÚ¹JÛÇLûXJá}Ú2ÓTƒ}s› i)¼Röcÿ‘@Ix®©¼S “=½Z¦á êcŸU¿€Ft4yG4y‘PSé­’«’¢ dG&¿'7ó·°îuyûw1¬)çàCRwï"›ìÖ¾—›óÉ\Q„=†ð0‘xëâ;Óìbcª)þ­¤ék%†|úæD6³ÅÇî2¾IÔ‹#Ð 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2027 0 obj 4133 endobj 2028 0 obj 911 endobj 2029 0 obj 2690 endobj 2030 0 obj 532 endobj 2031 0 obj /REFDAA+CMR6 endobj 2032 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 2031 0 R /ItalicAngle 0 /StemV 83 /XHeight 431 /FontBBox [ -20 -250 1193 750 ] /Flags 4 /CharSet (/zero/one/two/three/four/five/six/seven/eight/nine) /FontFile 2026 0 R >> endobj 523 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2033 0 R /BaseFont 2039 0 R /FontDescriptor 2040 0 R >> endobj 2033 0 obj [ 664 885 826 737 708 796 767 826 767 826 767 620 590 590 885 885 295 325 531 531 531 531 531 796 472 531 767 826 531 959 1077 826 295 295 531 885 531 885 826 295 413 413 531 826 295 354 295 531 531 531 531 531 531 531 531 531 531 531 295 295 295 826 502 502 826 796 752 767 811 723 693 834 796 383 545 825 664 973 796 826 723 826 782 590 767 796 796 1091 796 796 649 295 531 295 531 295 295 531 590 472 590 472 325 531 590 295 325 561 295 885 590 531 590 561 414 419 413 590 561 767 561 561 472 531 1063 531 531 531 ] endobj 2034 0 obj << /Length 2035 0 R /Length1 2036 0 R /Length2 2037 0 R /Length3 2038 0 R >> stream %!PS-AdobeFont-1.1: CMR8 1.0 %%CreationDate: 1991 Aug 20 16:39:40 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /YLKGAA+CMR8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 65 /A put readonly def /FontBBox{-36 -250 1070 750}readonly def /UniqueID 5000791 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ\ôéÒ@[œÕ6]nÎÕ×hÖmlha‹ŒH+4Œ£Ž›¹ºüú­œ/?Ð3¶&˜nÔ=œ“a6E¸#’ÕÊá|´~.‚ÜÔ…Ë¡w,ä"»rƒ­g[eH§êi¨ƒìª>žÎu†ÖÏ ŒÕWÇåת>©~ºÓ–Ñ¿ÏJmdv‡Aíê [û¿4|ܾ.×V–z¶ÛÄ_¢£1. F¥ýf« |Xÿîĸ9^Rw] ü×ÛŠ³31S\D¤ËKZÍW`– äP”Š^êÝ3ê ’eÛŽÈ Í8`2?Òl;ˆÈŠ!eXxh Dfú@=$»—*I¸BÁ€äÒXÉÔ!ÐWx-b1ƒ £™³ÅòòÝC; p™À}½âhÐÿíQi¼Ð=H²ðX­bØgŒbmÇ£óR,™º–>ù_ŠÑ¸°ÓQ! äÂÅZØž¶Ar“]< £˜óîîÃQ–jt8ï?îB,mN3v լǵ+í˜Kú­6ï t‹Ð{äAJc—Q%ÒrúØ?væÿø60¾RmXsŤ+pú‘Ǹiñ:þUësõ‚ƒ‡“¸Ì)káÜÏPýWË\~Ú;’í” 7 T“.ÅN ¹„ü¤«}.¡‚¼ñ&:¢D°~Àê’ù¯4³LD¸V­Áð5bæŒgä¨AN”ÓªÚÑ&×é¶ûš+‹Â“§Ä»•É‚¶£¤á?ÌéÀ êì\SeÐké¬öáÏdäŒVóPzjmSƒȬߤj;-è0@€3q!Ì,ayÈ ,Ê–`yÛªi¨k·9kmosrAû~}wâ‡Ú‡$Ĥtºó¯Îâ¦t—®â&px: ÌßJ,‹ìM†e°òî'–×EA"NóL’Ëþ?ˆdFµ¯GÛ©½S§íúCý;Xön•Qð‘TÛË<–¹z*‡ Íg ‚:£9!òâ/cÍiíŒ424?j(s0×go&­ÑÞêµ&1/€Gy¼´®—;ˆø$©ä¥üÁS¥²,­‡¨›Æˆ;`ž·ô¯úÕL~YîÓ™ ù÷<Ñ.g戤N·#¶„k6”uùŽä„Ë®³°»DQ\z Mq9FŽz?}ËÕ¦KóÀ“)ñƒÚÍ¡#(šh¾äT¥F}¢> ÎŒ„‰êÀÃ4jM¸Ä³Nxôš\_7‹¡MÏøjYÌYò{O3÷v=Aï²¶àÏÂååÍ[æ6DPφwH4L”Fïhc ó"ëßÖÒÌÐfl"®øîd~åé•ESáËñçŠÛH“füN.ì;ãAðåßO°¯ÄÀ¥ž <· \r¯l˜5_ÐÂc™©m@vÆw.¾âIâKGAæPCŠ6žr¢´|ê:’Ó±méëõE£åÚÀÕ7¾9Ìx¥fùÜbä§#O€Ó@G>ŽšÑ7sˆæ,š‘+Ë úé{È Ë'%)äWÁ¦c&Üj`W©rÅuxN¨eMÞÿ+ÔMa¯x0ÜѡҕË=u®óÜ«“wÛ{ö¾p¡A¤ÀÕ8Ð)ÂÔ¤lJIÌ >¡Š˜¥7]‡i ©-éS‘¼JºG`§©Ý»µœ½›GCÏH¨bÍBôòÙø¢ìÖ^8Y‚;⣠?=³@48°ž¹8“(2¤d‹ì(ô«æIÞ¸¾|ÿ…8ßÒܵP¼\F‰ GmÊãmP…çE…89 ãé5Ý0Ðèl’$Mµp¦³}ª·wgùíKŸ¸m‡¹}Âá öÅaá“8H ç?¿äˆ’ÆŽrë£t¨?Eˆà%"óß7Zþ³kÿúürºš¶w^-ÏÐ[5³2„mýO*§M$#ßÛÎ&ôù*@ó³FãõÔ‚ÕÒkŸ" FÖ½¾·9¤å 5µÊþ‘lk4q@ýÑÿí×}7Oˆ\íS3X:A¢Ð¸¼÷z26Û[‡º-6íÕ÷P_ßú÷|0H½àƒè¼²v‡`úQp•ãc—4¡q¶z5Å&…«ÅVĽ_ßÝ+Á”4¼3E´S„œ}Í5]ô(bV%UcÛ$œ—n¯AYøÝ< }‘¨Ïd+Ÿk“þ&r%µ<¨3§fã58ÛÎÍ\ &C4Oë+›9§Vyà|N[ù8§_©À†]%ùb“°5NUŸÖ/µDŒT$ õærÝ7DéNl»GÄ´f¨Zuâ#ZÕ1ü÷ñæõ(ø;¹k¸‰eÝ¢KŒç)Çù±(¹ÒÝRšåé\ Ìr=Çj@òÂ^ŽR¤[î`À4)Á¨N.ÔZ?ª_½ø.[VîOgË’u5/ÄÀIáJ¶ô­ A3Vh>WZê2¡ Ñ"KÀµ“ ¡Å>ñŠ ÁŽÁ” «³¼¯e2h‚,gµ:W/Xà®ND,ŒázÂÆð]KLˆ·Í×PæH£žªâöeHÍdÿsó/Ÿ\ŸmÁ&ì>‹¬Ê“S [ƒ#îÍ'‡ðÓÎÁG®“„ùK®åwîöÄEØè¡Dk@¾“‡¶dnÆÏz†®ÒµôïÖ5TRèwë»Lœï»~~!^þ²×–ê3±ÿ³+Œ<-`úÌK–qJêÂ9•ÅZÚrû×7jJ¼Wƒ  ñZ2¥HÖl—Œ J±„2"€WrIä;}¯‹þ‚5ýh«& '—["WjÙ.Y¸q‰½yÅZ”œ_«ÍŪ…¨kˆ ƒÖy ¦ßŸ²âwE¾wß@2—Ý»*LЦ™ï¬;`ºŠt.i1@'ódÊz•,O"=ÔÉ­PéPÿ¦+ ˜X^‘Èwuüßбï€ÚÌ„)Òš ¬}ÉY;hd«CMn'òü+N„̪ž®@0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2035 0 obj 4323 endobj 2036 0 obj 925 endobj 2037 0 obj 2866 endobj 2038 0 obj 532 endobj 2039 0 obj /YLKGAA+CMR8 endobj 2040 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 2039 0 R /ItalicAngle 0 /StemV 76 /XHeight 431 /FontBBox [ -36 -250 1070 750 ] /Flags 4 /CharSet (/zero/one/two/three/four/five/six/seven/eight/nine/A) /FontFile 2034 0 R >> endobj 512 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2041 0 R /BaseFont 2047 0 R /FontDescriptor 2048 0 R >> endobj 2041 0 obj [ 615 833 763 694 742 831 780 583 667 612 772 640 566 518 444 406 438 497 469 354 576 583 603 494 438 570 517 571 437 540 596 626 651 622 466 591 828 517 363 654 1000 1000 1000 1000 278 278 500 500 500 500 500 500 500 500 500 500 500 500 278 278 778 500 778 500 531 750 759 715 828 738 643 786 831 440 555 849 681 970 803 763 642 791 759 613 584 683 583 944 828 581 683 389 389 389 1000 1000 417 529 429 433 520 466 490 477 576 345 412 521 298 878 600 485 503 446 451 469 361 572 485 716 572 490 465 322 384 636 500 278 ] endobj 2042 0 obj << /Length 2043 0 R /Length1 2044 0 R /Length2 2045 0 R /Length3 2046 0 R >> stream %!PS-AdobeFont-1.1: CMMI10 1.100 %%CreationDate: 1996 Jul 23 07:53:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /SGMUNA+CMMI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /alpha put dup 12 /beta put dup 22 /mu put dup 23 /nu put dup 34 /epsilon put dup 58 /period put dup 59 /comma put dup 60 /less put dup 61 /slash put dup 62 /greater put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 78 /N put dup 80 /P put dup 84 /T put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 102 /f put dup 104 /h put dup 105 /i put dup 108 /l put dup 110 /n put dup 112 /p put dup 115 /s put dup 116 /t put dup 117 /u put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 126 /vector put readonly def /FontBBox{-32 -250 1048 750}readonly def /UniqueID 5087385 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª)s™§„̾…´™;.ëÞ;Ôr·ÏTeò…ji«–íK­/df5à¶A|Ç{S/…ØÇ )¡šSïcë\^ÈŸÆÂm‰çÙäp·+ïÚ#õßv¾¯Lé17¢íŠ©×Öýó~kÍàÙ ˜d#å– ]Ÿ»L•eVèßËúìGo£oÙ¥È\šõþÙÂÝÒkÜ ™9‹ŸMÕ™=ü 0)xfáÍ 1›kÙXž9JS:6ÔV ™ =!™X>¹¸KMîãÑ)9ã!™ ÒI‚}–HWIUöª¡c©l=G¥e°ÂZ¿m>nÁ‡ä°Q‚k°Ð2=”1p·•%R`ùý%ò$ô]ûûÞ÷ÿ‹¿ïc{!®W+8›?v(+ë)Ì0ÓˆÇ!Yah“çtA?HÞ @‹ÆmÎ?á|¹øM X9Õ€Ö¨ˆ#Ù2 é:ùm— ,MZ+²¸Ç’\Ex9YÄn<á¢ðêÄ¿‹›2^FC[Þ`¼T×+ȬµÀ£D¬‡]ǸFF£$¸oØãB!>;A\äT hŽÙÁÒxìh½|5úù«:6Òü;åÏ–UÇ·í§6~åƒkŽ.ìT*{8î¾K¬`yÐ8¬³ÇÉ'—dT|-Q—k«©K©†myñ9 •ª9°ð1 |½ôA¸ÅfŸr ¯(Kõ*)Æ%_ʬñtPû¢`.rY?¼¿Ânrnä®ù{v2¼O_5;\gþÒ>§R¤¥{ïñ×4‰_ : áØã9pEz–~ÿ„öØGu E¸Ì[Ùn窙ÝÉài9ヽ¤u#=X­&>¿¯Â~J~П°ƒUöêtå0°t1Cò¨qs-bØ5±ŸÒÇýð„Õ 4AšÆG˧÷OE1Ü»Ú"®ê?»»@~ ÌR½Æ ¢”ÌO“ë‹öÔ>›¨XÕO8‘ŠÈ' IVÕ‘ðTnPü¯¦ÛÐ ‘#õìÔ«3³ÛL®3z‰ŽÙ›oH9@ÉuDøˆêðËë JÀsÐf*¨+ ­5èx/…Jöl ÀþñÍÑdc!¹=2~SØŒ è%ú•ªW½qºWå†c…Óú÷ð¬¾ç–È+ÃúžT¡bUìÖp©Uã±b“f†±%ñÝ™i²eµ÷["–?”íêè™PkH¥&õ›j÷OëoÄ;ã§uB‡ÈL·]rÚAÈqÉÚ¶‰’9¯È‹6ciéµSD•Þׯ#<ñƒ,1šVÍ ¬‡åµfÛƒ–Óx#û8—zWº¯º×ú1eôÊÃLTˆ¶V‘Ë[IËqr«¶i™È}×ï/¡Ã¦]É÷1¨Ç•èÍ&W5«=Å7¦Ï}þÜCÑŠoo¼/ ÓóÅ–ÆÒˆ„¸6{Ú·T–ÚÚñOò{…Ç‚3ÿ ·Ì½üHqh¼8ňÛî/Nh–p »gyçöáÌ_+8&5´…ãN˰Gd3W­L™ #äjqâï%B´íaè?4;QÃît}˜ gïýA/Î{͇kPÅ/ášÂ ÷‹=8QÇ5WPI^‡rö|•9ð/$#ˆd±4å/í“DÀ@Hg‚#E>‡í0ѺìQ€‹KO‡uPîñn{Ó¬ëÂâ–Q— ‚õJ×_ޏ£(¶N< dÔ¤"g G;Û´ ¶|L‰øô0~‘jÖD ˆ¬³ˆ=¹·¿sÁ}³¼´$~+è/­ÁI}ù^$ˆò^0×OÕ#]:bÍÑäJˆ+Ûæ‰¼ËñW¿È&÷rˆÇËüV»»¹:Ç–¤ý@ gµ¾¾¡‡àáŠU7¢+6Lw• ß¶xf¥­[‡øïñ}äÝÄý¸û¢+O¸b#OºÆšõp$+:ñg6‹sãe¬§;ºÐ@+fíóŒõç9OÐànw4ˆü<´6h!/3%šdþwë¯s‰ŸŽlL‚݃û,«)õ ¤»x¾ÝõuoØÔg$|<ƒÄ ‰.—+áö{›OÐÚVÌš n{?Iÿ ž` …Î*fõÙ%¥hü6hQNºÁfD]Õ~%Þ©ù~Ì=j_2«IŽÉ(Mj¸'ßhªÛØÁqÔ£›ä.ö éý¯iðw2QY¡µ+ËZ1ùœþø~Öèu,W/Ð ©LáM/W¶rFTˆÌEzȧ(Rj¸ˆûô ýÁJ¢ùu IëðøSzö6·±³Ê1¡§xR²÷ ¢×‹d‘cN?U¯cŒç*rܸÛ4¼Ñ˹Ӡ3Mœªb÷2×I\Pô&¤íL£{WÑ÷{σ¨òpcÍž1(Íåh•±_\G1ü¿²5j¹wª ²qŽ·.CžŒñ6ð½W¹ÊÃq³ß9³*€„´40ëZ Œ"cˆé¥fžËsÿS>î-Ôñ]÷ÿ£ònOÚ:žÑ¾Ù¶Ýýú›:qkƒ”ÑY£Ç÷JDä¬Ý–ÖMø pÈ'ÆÃÒÓ¨›®55Rt%´÷ìù´eëJ5W‚Ø8s®÷ß·\çâpMj--0ÃSyÊ›øºô¨û)«uµûŶ°yjõ Š>ަ?çËm4"£h…<Ë"–wVã—¯—DÆ’‹>ø:éW°•Afsƒa¦”‘HŸRj¾ojÿ}ý%µ¡ñ܇¸#Í 2›N:|¡W…¹ÑZRÉbL«£+Ùö†9Œ{çS4SàŽ†A¢¹|SÖΑPòi6-Îè&¹ÊNèåhùr`ðÒ%¢Žù5lšI¦¾‚в¾ŒÆÒà‰¼4­÷ÁNÚ{#&ŒieR lŠ{Õruiû,o fGlê=!ЇØ.®¦=¼ W¿x;ðW(e˜óÄ(¶Û÷kO¹Å%chæ”dœä3@â,K s’¡D«2Xfhµ¼ 5M…6þ:Óæf#Ç&<Éâ²ìvö÷?,tÐË5>ämPØô÷Ä7=åD°‘¶ i•”ÛN·gb Þü‘öe}‰ÜÝ ²9epŸÇE¹ÿ±ð™sSp.îköµ&y™2Òlg±[4DPûkl ¼ulÔ¬|DëY–<ö‡Í“o…™ãŠL®ºÕF÷°8!\õÝ/¬­ ¶W vëF•_0ÄÑ OÂpRs¿5ÐY)™YA&dL«q>IŒk¹<þñËÈ,ò~‰ºÒ{Ú+ò b«±ø9nà!«\Jx ?äÙÄ={ÎÆßO5 úÍâc& Bô¿ÉüòÒÙÀœ£Í x·Ó 𔕦f)™anðH•]û ±²xŸ€8æÁÌt,œfÛ8ñÅ"èæ.MD‰{ßzT&ܬ¢£~ƒMñ}¬ dê=>ŽÍ(¬v/Âz¥­üQáÜ÷R¸z3‘ðÞù¸0Ø”÷&ø„ú†}°+úéà'ošÓ—]²“Ö¢;Þ(ƒ&q§PŒ»ˆÌ‘Ù!)ù+­Üü”ü–·%Ÿ=¿~+’‰×Šã‘tÊá[ûÁ$}J‹ãDÎ肌õ oþnŒÛ¤Ãavý*XA?xˆçGWl¾pPáv¸,D°ÀÞtü¢„"‹vu'gh»¿šŠ6 |÷õ9öÅ”lØ‹‰+9’ÕÐà¯þRA[ã¯ôqW=a͹DD¹¿¾šÏìF™Vø 7V­Ï>5{Oõt×W°oI7‡ ôÃðøÀ·ÈõЭ?Zó›+¾«.;0óÉZŠ'4ñ©†ÙOÔd‘§ôsXP P—’ ‚žñaÈ0½û¸”z¥MªêþZä•uö» ±O»gS¦ÊݖɧçKvñÎÞ©mòêûH†¡Ì4–œØ2XáV Ð5y[ÏHO”îÍ=Fˆ šE§Ü©'¾ˆ„&DÂ^±Y¥/åÂ’HüfcÒ”/jƒÙxP׋ì·ÇÀ¨ü!üεãqÆv’}SÏï!¹†p$¡Ds®Ç:T4Îë¯9œiûÖb…»Ä¿aèDê±)6Ùšf|!Z%tK'ë·`Ÿ#@}§ÐÖÖ¹‚^™ž´b$!Í4‹t¬)ìª"Ï1båìÂOþ4ëØ8ýO×6"°Yãâ&95íFRÁO‚~[0´ ±ÁV!î¬ýW°ŽÎ((æ&šïfaüWV¦|šúÌŠ~0'Å“>$0ÈçOújû5âŽx1”°%<¹ºU¾Ñ0k Ñm3­8­Ïá˜:½µj‘Œ¦éõaTù1ñúÀAÕÙ‚`î³aÿ¢xðm‰éGÛ3`ÇjLi>;ËÌ÷åt–ñÃVL³õN8Cü)qñ<¾å2zógìÑ;N8ǹäÐ\<4øYŠ_úBçãTº»Hâ)ϰï®g¢[Zi=» Dòåa,RP¥yr÷"¿Ž¢–Õ´åHD®ím›Û•}ðò>./ öeÐêÓ½FkEö%Ûl›í¹¥¶).uu¥ÙžÄõ¹f}š°"N‘¿Èè,°ÁîÐn%wÙ¤½n*T,®˜±–YMq®˜°u?ˆO=Ý”–4f¦ô›Œ±û‘ ¸ãyRuÿÔÞ6z¬è ÉND<õDþDÅš3XªW.þ–¿ðµ­Í¶&£s´ŠúõŸu…F󟜇$ª.ÿ´~\Oˆb[p–-… Ð>R©îïÖâýÇÉ´ ¤(L25Os‚šýÚGýtªÓ"èÂÙ Æéî‘Κ ÞY)d›:t=<¿ãÌÑ£±åN­=„ÿÉ¿5&cgv9pFËÿmU¯Qn8É»£÷ËHJyž¨tœh¹èyy“ÚUwi‰páþ³Þ³Âü«¸šïœ†vÔÆ†3ºpÍSÄ*ójú{¢üŒ€âÊ…é’– fýk nÎs| Ûò¼Š¯Ë™ 9ùzÛKÁJ©a1Ë…œ¡Ê$þž…©‘ 8»³§=("±/â-õßBJñv:Ëç©ñôü/ºeœÖ³+ý„Ôƒ÷Yù®Ö‹p_(¶\e»‰è•Rê Á;½Êøë“—K},Ûï«7 ;þ<¾6zk8ïHÇF|kÍ6‚×Â+åDH«~úƒ‹Œs8£§Û˘š{9KG¾”¾>zÀÓ­¨Ÿd¢ÇërÈ’fTdÿåQø}„(–+ùVCW›ö@«ô̬Àn&]Ùvl{1ˆ¸|dö»\#”q6øô=Cƒ¸ûÏŠéÇ ¼’Ù|©WWW-ÅÂß0ëz“hµ—–Œ3e3ÝJ#< ,ÉÐì׿3-^Dº¿Ø—t$™~Ø)™ì=ycìóÑ’k¨"¾6Œ¶EÃjÊ’]mÛv¢>öqè\¶$IMd‡N5ÑJ˜°Þ0ƒ1Q綨‰ù’U‡ æTH—÷}õTÏúÚÀ,ÎýU°ÒèDk§~·3ø€.íY¢4„À:§˜ïGÌ"´é…onÎ(,:éÖ¦²ñ8>›Ò©~N!BI…Mòài/¡Õ¡ëzž™îç:–•óughwïº0g×MWoyfHp´De÷3Ì…(Z7‡Ò£ÀÌÆhK’¸äðšw¤f·&p^>d8e4RîFCNªFŒóÐ’I7¹3žP ð;îËnh v™¿^ƒš1Ü*áN ¸ub’8@Ù›¸j˜Æ!}ä¸ü$Ššt´ìÏݘˆÒ—f7¡nT!FÆŽ£§wþ2v)q“IëÓ^fM´_zIJ¨U§uì°¾ün:§˜~+YN[_Mã±GáÔúDbÏJGësåJcêÐÓ½c¦r³Œí<ËF{ímÃ1ËÏ2 êräkÕ@ß÷;–óå ž ùñw¼—4ÔuxUÊ2!ÒÕÇî!$Fç~!›ÀÑ0D@ûÁ¬N€¶ÌèzO° 3Âz¤ºæ_°°ÎY^x|Ç6ž«½Dé*í7.•o‡IijAÅøü·ó6I·ø«ïB€…ìÿ€ àõÖ "éÔ„A%•!äk±œ°®Q'ûjØ3V`›u„cbõº@ÒIu¬Á¡àšdJ²ÀL¾rÅXcD«fF. ãë„Îe6Ó“?óéA¡à…Åij—]›IÖ·°ÕÜ׎¬E’em\¢WÄù¼…B|Ö¿oØàÑ+¨XÌŽ»Ó šº²ŠIÃ&PÒukÆŠ•û¶™ƒä])mP J/‚ ò‘2‘Ʊ$gHö±¦ûºÝ$õ’ ,“†å> "ƒr?‚mªFÑlOÝLg‘oI˜~qMD#`¡Â¹nøñ4PýhÔ&ûÚNè¡«qFˆi™‹¤íE á•c èFD*¶r~‡ã=U.£4—ØÉ“ AY¶ãÏ'0»ú®õ)n>ºV+—zxûÅO"©iÏmHeJÒ»l€AÚñzx„®vRPªµ¼H §ÙÉ/T`½œÞÒTÑc:Û^æv[;¢Öè!J›e¹áš"*Oäè&K¹¶Þúa×w§¤rzƒMÄäÛùîÇýpÏ'"û >:b(°hf’cX€›Ãž!>kˆGG’&´ò(ì*F)I“k*ô·/æDļ³Uyg§I#Sn¢bïR6ßc2d#’‚ÛrÁ‰¯WxÏÀ¤…œÂ1%€ªO@nÿ^âébÏÏõT9Ñï£}(âæÚx«…ÃZ¯¹5½£šmZ 7âPÚÔƒ}¹ÑÅÐ.E¥2úìŸÆóºA«o[nƒP¯Çò• –…ÓÀ¯B;0ˆ‰‡12ëê k5Uùø]*« ƒJvÎn×jVh®¤¬ñÆ¥Cv‹…†k‚`êìŽö`Œ»jóiÒ†ªÐ@9tœ‹1X´‘µ¥=«ö¶d8Ó‚ÿ}¸xª{â‡1Éß3…Z (^ÕIå·\lÀà ÖlG¸[õG”÷šNÔѸñL¾–Ü Àa‡ °~OéïƒSêåÉü…¢ÃañÑ,sm!ì6Õ´Áœ9´Ê¸ZêÅħ Îbr 0y2›Åý‰^Y%"øßà«…õЯ…c½&55O.~Bu h‚ºçÁ Y™ÿÑÏË1\k‘–‘J… 4|]ùP«T~SBu"…X‹•›ÉærøÉ'«fz?e*;ì}‰á/¡3AÀMå2C½5‰B ~È]‡«¨Zh®<ý³¾LV$Ð'ÏÕ24õ‹ÏVØ•¶zdW‰ô.`cÓZUõà hH¦i 7¡¯ÉfÛb;÷Y¤ü¤±}˜ì@¦UGÂ&)¦MÆr¾±ÔŽE¦vk¶‰>*¹M"¦×榕jü]Ìô´`¯äYOm¢\çýVpb]cæìâ¢ÒC—ƒMé߃o ~n¡ö÷‘Э+ŒMÙâ#`ÂþomÊžÓLtÚMœ"‰N!¦OgЧŴµEm˜O‚&Üï±ð+{ï´áLçGÞ?jáÝNôT­Xà ôl/ƒ½§…À)ÊšÖÛS11Md"ôh7XåÙMµõñ­–$Jt3ÄHäÑɸP×UEA³qæëæyˆ8NçlçŒÀH£àêÐ_­†Jº0IÆê``§9Šs:Î/G ¨l4¤Qj ¬‡Iò'ˆt(sA¨Fµ¾—ÍÓ5ºYì>ƒ€ÖŸ¢ 2z«¥lµ)˜ÔŠ–N­ìä9—ì=Z”†‚Ž m©þANÍ– vÒŒ«i»¸FÑ'Ä %°K°FïÌ¢ÂF×~óáïóªÐ Äç'€­¨D8Òe {cÑ–˜Çt'  Ϩ!ßnKÆe‡idFIç’”°w)]Ö*±æ^jȨ‘»]ähTv·N¹DªCþ˜Ñ;‰ò`[PTN›*J`Á^—ÆGÆ?]“ù¹¶ï…v™6Ïo:Þµ;?0ùÇø™è!Å[þ„œDÁuç9XSªä© é ©ÿþµ±]P[b²Øë³äìæW±Ê„’ê *Ÿ¾·ÈB{øb^V´ï‹¢jv\”Ó(®`Z*Üê~·¨ª@S‚‰nŠ«½nˆ?_Æ~Ú—çì‘ý&% \â@wL%é0÷Û{€_RÈ ´ÇãV³Í;¸Ú)Itþò#!¥øD!\QK„÷º#ˆ~Žsغ ߿ٞi©u|Š3æd†Nõ¦b‹¸r6Õò3ÏÅ»ŸLp‚väëÀ}aMÅ^tA²_Ø3Å{ª ð }/Ö¶û]*'…ãIò{WQéÁ nWšÎLhdòWÝXºÞ*·áÇg]kVÂÞòƒˆÚɇ¡ºx|PH!-fi\ZêèwÊèeåŠn"Ï,ØZÛ–-·ÔÒÚ —¤Úšf˘‰Ø,z¤YƒxÚ@9Íý…Ä®Êö]˾½´IbœØÍòŠí A˜†;Jðq[mê|$@:>|]ƒU“[¶6_‰ø­1'o/|‚ÔóÓ~[Ôóü~,å^I“ìI;å9Ôï?CÝØL1ç´@ü¿‰®{Œ# H•Èk]Q^ß«1üìú¸Á*œ&pøk ȼäB!±Ž¦tÆÙñFm,ªv<¶¨¢„ýr:?낾ñ´ ±Âh‘6šÐõN7I”À:¬_ð„B@m¨°Ws©¬IÄï`ûWÙ!2â¯bu–o²pJµðóÉ“è OOQ3Å:? 0gqåRt$§V±9§`ÑÆÿmÓÈgcï˜kÚ¹¦¾³™²5M‘7¶«¸wäZKÕ“ ²¦>•×'£Ä\Yq÷±?%o2½ ‘H`M½ Gja1çd2rxÏì6[Á.­_bç®ï½‰óJ‰ý¢Jòš´pq–A-ý.hký ×D[Ê.W£Æ¨>/ÉßRåRäX’ËZho÷Ñ%b¢þrkOcO=?Æ”ãg“5üO;Î]1gs7ôØ¿ÎrövþBJG¯A ¢.MÙÀ u˜ŠÙ½„vð]›g€Â÷ ðLcZ‰ W€Ç_tóöÙ$Y 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2043 0 obj 9390 endobj 2044 0 obj 1303 endobj 2045 0 obj 7555 endobj 2046 0 obj 532 endobj 2047 0 obj /SGMUNA+CMMI10 endobj 2048 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 2047 0 R /ItalicAngle -14 /StemV 72 /XHeight 431 /FontBBox [ -32 -250 1048 750 ] /Flags 4 /CharSet (/alpha/beta/mu/nu/epsilon/period/comma/less/slash/greater/A/B/C/D/N/P/T/a/b/c/d/f/h/i/l/n/p/s/t/u/w/x/y/z/vector) /FontFile 2042 0 R >> endobj 510 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2049 0 R /BaseFont 2055 0 R /FontDescriptor 2056 0 R >> endobj 2049 0 obj [ 612 816 762 680 653 734 707 762 707 762 707 571 544 544 816 816 272 299 490 490 490 490 490 734 435 490 707 762 490 884 993 762 272 272 490 816 490 816 762 272 381 381 490 762 272 326 272 490 490 490 490 490 490 490 490 490 490 490 272 272 272 762 462 462 762 734 693 707 748 666 639 768 734 353 503 761 612 897 734 762 666 762 721 544 707 734 734 1006 734 734 598 272 490 272 490 272 272 490 544 435 544 435 299 490 544 272 299 517 272 816 544 490 544 517 381 386 381 544 517 707 517 517 435 490 979 490 490 490 ] endobj 2050 0 obj << /Length 2051 0 R /Length1 2052 0 R /Length2 2053 0 R /Length3 2054 0 R >> stream %!PS-AdobeFont-1.1: CMR12 1.0 %%CreationDate: 1991 Aug 20 16:38:05 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /TXXFID+CMR12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 33 /exclam put dup 84 /T put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put readonly def /FontBBox{-34 -251 988 750}readonly def /UniqueID 5000794 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ\ôéÒ@[œÕ6]nÎÕ×hÖmlha‹ŒH+4Œ£Ž›¹ºüú­œ/?Ð3¶&˜nÔ=œ“a6E¸#’ÕÊá|´~.‚ÜÔ…Ë Lw2.²æ§sÜNYÁ ¢Ú»›÷.,òVÝnµNìºX«Ù3µ|裠Ñk(Q×IOs mõ;Üf»ø–µ‡ß–C1}_a Ù˜Io#Ýà0÷²wÝ™\‹œ®œ™ŠÄáPÍü,fí’ë´Ì *ªŒábG¡3ZÓ2Ú©PÒ•§8L3ÿrê£[‰vnc_EÄÀh­~èg9°|¹M)ÿ }Yÿ™aÑ•©HãØ|1‚’•¥m!‡[A˜z¡XpPÃÇNCU»7òUÖ²7ΖòTg÷¡ž…x_ôh”œÌyòø®WÕ÷›¹ÅÏ^í]˜W¹–}›–ÍÏsÕÖ_÷Zú»fs@ºâdYr ÈŸÑsy&vJ“Ðx´ë)Œ‡Öî¢Ý±®ˆÅ~ÏïKqä 4•Ü5h¨LÉ#q§‰:4pPý¦ì÷?gÒ |GJS†nœˆæ^i2º‡§6†ê°“‰øM˜ Ęz0í”.²° ¿õ¼Ç ôâvÃ3›1¶ê»°xCj »7}0a¢ ¹‡–¸`~ì¼i”Eê¨fÃŽB wS:Ûü;9l[ v¯qo·ý Â(Ï>áDlqY°?¼kÚ‘ºòŠÓâoˆ^â8‡KþèLG¯7èq«Z…°Cè`¶D/g\Þw´kEñƒ¸çó)gcš¨¡Ë‹5üeË=ÅE »I¾=Tègl {Ë Î³òÞ±Ž´è!÷+ýN7œ7_©¯À+—šk·‚S”ǺíJ"à•ª#§ä#NQÑênYmh3^^™µÄ¡Qp-:ÈëQ‹¿}?†oešæ"D…Uˆe¢`£KQ! »®*dø5¿w™²âd±‘pz®WI,qø`AT‘|‰3mÍ ÁÙèK¤€¨6»#¾ø'ˆà(Ú—7HËlÛÈñM£ÂÍÊÚ9†+î‚BKû[sgÌÉbM¢Ñ@cØ—>Í3·øÍ8½'CFß×3Êi|„ߟ¯+ÓmIðèj9Õ\ç¸4‘9W‚ =‹θ JÞ®;UŒTsC×1,‘2çÈÛ€xVV\­è,÷7±ŒeÇgÏ.át ECi#ŒÚ¥¤%¤K¯lä"omõx-òéi*Ln—²[?$h'`°ð†‰ëŒ«RϽ/džN°M<¦Ècj´.°fšÎ ¿`±²U&Z­ áDHu7YÒä‡ïK|/9~1²SÁ²|O(¡BÇW^q%KÃK˜g=æ“kÁ5|z1NjjÔÒ‰7>WücÙ‚.XkÍ/šv[6Ûj¤EŸjÔøëÖ æ€Ý¿;.¹;{€YãÆt2 )œzòèÓ…®Œ tdÑíØŸp5ªŠzo>Â…ùqù»þÅ›VW· i˜\?Ú†½L:˜Ÿü˜éÉúf4¡ÓÀŒ‹ #=•&zG•Ÿ°2iu‡Ï—ÚtUÊZwsq úKÂ+z—¯õlêO9¾S•ŽVS™_ŽÛ¤©óe)­”jÝG–UÓùFm;30—õ¾íÒ³¦_5ùšÜ¤œ²LyŒåzkίøû’ïõ<7c.¾Åu ?íTyòÜ•jJ€ýŠòåY\×KZX£jâîv .¦2”÷¢Ãÿ4ñ{Žøb"±Ek½L ;rpI¬™üT6—Ó*È.ýï9·‰ñº)¸È_×~Â^µX7J‡戫Þkõ㦯S5)™sê¤\QòØ(ÆÍã~óUá#ºô¤<º+L×Þöç#ºÅPÂêÞdݨR=רã0až;)Îè˜[Z‡E¿pÀ{5;«ñÃ|s}a€÷PÌY{"JÊ|cfØÈZ>¸ˆêþò³>ÿh#NäˆV±v-V4ø !7„eJêT ѧ8 c‰X ,aóÜž%øˆçb 7g[¥ôã7®JÛŒVprJ!jÑb‚¬ôîŒtUNŸ(¢ÉÄø¸•ϱf?ö×ô±!9]]ÃÊúÇC}§ªZ=ù¬+¢ŽåEyÙåë×½î'½‘—ØÀ¸µwA $­®>Tï{#¦ZëŽæß墄Ùc⸷E6Z÷^åýá¡¿é¤Õîsu»;馵 Y°c[ü ¤uÀ³Q,ƒuîB¤ñý‘vðPúÄÊhäùlü8âÖKr@uº!&¸ë+ò¤€?T¬;¢žï§ÖOÑiܬœó—$4ñ݄ߌsY 6bÿ‡ŸÇ£}?­~8'‹·H ·S® ÂL^©ÐD6áUX áã¤M]9å9Ýɤ4Òñ‹b45ÄÆ~j-ˆxiQÆ€§25+jaÝW|œ ë2¨—™Úç1£hþK¥ ÞE¥aeYŸMì™êФ")·ŸtÐÔ$XWXcÄ|þkA•¹“eÉ”L"¼§µ$/mü~(áu¸ëSaô~hf©t"]¸g44:ü³Ç h eV:jå7´±®°ey`X—¾*µõB2bE¥+̘cÇvb½‚¾³úUwìQ4¼nã ƒ¯]Šëfý¼@ÿ¥<Ó—ÙP”šÞeÿc7•á‰&\§¥B•Æ|³Ü*ôŠš, §nïÛopjD½ýá|bvžÜ&²Ó±[ÀŒ^¡€ô¾ñz¿$jÇò@»i¿Ú’]/[D\?kÖ ÞZNõ%~ÕáXg;>©è£Fh”û¨®KËßyheñÏþz„ ŒÆÝס¦AJoP(kEŠ\ˆÚ‹Í”Ìùº'}jpñMoÆò­Ó[kÖ± Vyîëê²2 *‘RÆÕªZkµó?$ú›º€6å#ꋹ? 8¢A‰ÍfÅÃxClœ &Ì&ˆÚN ‹¹ÎÕ3hë½µ«´ïã׊cè]t,lM;¾!¯žvIÉŸfð†,<7‘ð?z‘´§N«†‰!dV †m5Ó‹ö@ZQN«å“Ào³ë*: »ºfAVÕK®Á\É|›¸ŽÚñ¾ui”dùÞŽ$ŽÄ@ù‹ÒõqT ¶7r«dá›ß E6`ƒÊ!ÍÂÄ YÇðüNƒäM`öÇ6JÙdï»ý‚n+Iõ™ß`Ó÷dÏ~Í‹ßÍ’íÈ"Û" ýUì¹²®Ì§«Ò˜(3?¥F}ÖD#œ> endobj 497 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2057 0 R /BaseFont 2063 0 R /FontDescriptor 2064 0 R >> endobj 2057 0 obj [ 778 278 778 500 778 500 778 778 778 778 778 778 778 1000 500 500 778 778 778 778 778 778 778 778 778 778 778 778 1000 1000 778 778 1000 1000 500 500 1000 1000 1000 778 1000 1000 611 611 1000 1000 1000 778 275 1000 667 667 889 889 0 0 556 556 667 500 722 722 778 778 611 798 657 527 771 528 719 595 845 545 678 762 690 1201 820 796 696 817 848 606 545 626 613 988 713 668 725 667 667 667 667 667 611 611 444 444 444 444 500 500 389 389 278 500 500 611 500 278 833 750 833 417 667 667 778 778 444 444 444 611 778 778 778 778 ] endobj 2058 0 obj << /Length 2059 0 R /Length1 2060 0 R /Length2 2061 0 R /Length3 2062 0 R >> stream %!PS-AdobeFont-1.1: CMSY10 001.100 %%CreationDate: 1997 Aug 23 16:21:30 % Copyright (C) 1997 Y&Y, Inc. All Rights Reserved. % Notice: This font is not in the public domain % Notice: Computer Modern fonts were designed by Donald E. Knuth 11 dict begin /FontInfo 9 dict dup begin /version (001.100) readonly def /Notice (Copyright (c) 1996 Y&Y, Inc. All Right Reserved. http://www.YandY.com) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /FVYAAA+CMSY10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /minus put dup 2 /multiply put dup 6 /plusminus put dup 15 /bullet put dup 21 /greaterequal put dup 25 /approxequal put dup 32 /arrowleft put dup 33 /arrowright put dup 40 /arrowdblleft put dup 41 /arrowdblright put dup 70 /F put dup 106 /bar put readonly def /FontBBox{-29 -960 1116 775}readonly def /UniqueID 5096651 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ\ñ~ûþliþºƒŠ ±*»Ñngœôv_ußGiÚüµæy¾"Æ”ESìøwÑ¥$L*àeIzÞÔÉÄq‡pæ ^öªQiù«X»¼:b(ï&Ælb0Õj³¢}÷‚Îá‹%@½$WNY6Ϧ¯vTÝRØ´R…p?#›'ܺõ¬ºq /U£ŸæB3Yk½M™xý²‚Â2qúö)%òýµÜTÂch!yg<ÆZeÖ›®M`Xãéà²0« '‰mé9O/¦Z7é!¢ƒ‘¾‰ZV9Úz2¥Žõ~·<¶^^™kuhÎ#䨹+§ašÛ8µ8Uýõ|°Dg1’ÞÐÏwSž‰O"ÍiýœiÅÀa 5S-œGXɆC„€¯óa¯¼ÃXTÔxÜ´íFo32| NèØï5;û¦>ÔRyEÂ-Ÿ.ÄhKÂo»|¤Óî7ðÓ¾à&À‘ÝKÔºy#ò¶Ïb™1¥ÿSþ{`öý  ^|'ÊAë[ÓÈB?ÇÊós+¼¤:%gñ§ÒÌ¡ÅwåþbD![Æ,¨}±”Jê¥Ü?së¹À]¢ØÆ£«›û‘œ„VÿüŠCGÀßÜps…¿åȰjÁ›9ëôQpGž}dî³è>• ”çΕÐðYx‚OÈ-0PËzҀ𙗹DŒrël«PÂh;ùŽˆÝª]äÆàÙÄ mDÏĤüÜc¿>jçÍn¦”ˆa  «ÈOá¦<ª«B¼Ïáó³p¥BœBü20„ÉH¬î˜‘¡ôf¶Yù_%íû­É ›¤ô“Q¡ŠÑ’w>7—‚¦F#¸bµ©T÷Äñ½¢«@¿ÓBÒ#ÉüLJM¿›¦9D>IÝÄ2e:lbz^Pê6ÞþMs…·"n¨ê-–™ýûJªÑš*×ÅOIV®æ²É˜cÙ‘—`Q¿I­ƒ¿˜Ë?]$Zdò“˜€¦¹4n·*»¦‹­bhÙ§¨öÞT´<ÅN°ÄÈ\‡ëŸtkÚ"iû‘Á`Œ²&BŸEɘ”ç¥í@¯{`.þQÑþPzÉ# ßJÃÚ{=ã–ýœ%Öû7µ®þPJ÷aŸ ](@¨¿Ú"¾®1¹­òòr,Éæý’ƘŸRp­–T¡Û{4šüèaPÖWç gû8:k’ª2î(m,A‹­ gR,}ÍAVÞ·BºÓl ¯z•&Pöh€cÅj†¯Bú/Ù3%ð‰¶»WÁ7]—<ÿX½…%¶ ò˜lõ«†{L+î §nzIhÝcÓž= ÍãSûà“ ÙvñѵDó½5FŒ¿Cò’ÃŒ$§FöpíÀ\€`y£<õyÝ&pDv‘ƒm);lÿ®>³)Óxƒ)Ýc­gÖbzøYX2÷ØEHÎføÕvæžR0QB 뽎wÊ¡+(ZÞT£…-Ü 'ĆòÛÍP,ôÙÊì6v…”a a®” htÇ;rr²²Nñy'ÃQç1cDôUýR5mj¶ç…úïïŽo¼bÁÕ6çìóÜÆIØSÂá*Ö5›lðAHª2ÑÕU›^¶¾F5q’޳x¬Ä‡šÏ¶²½"VE=‹ùQÿ4Åòe{Ôàc¶±Ñç.h³ž[½ÃGî—gãë@b!Ùå kÿÊ¡1' 38sCÒÒéËsL€qéJÍ*ÜÁÑPà+&ÀúaŠ0Ü\ µpù6Æf5¸‘æó \ &5ñW±-xíJÛ¡P"uËÛ¦& zrj[Á#P¦¼3–ª©MüÀ2rk^ÎE#Ä‚¸j±D,,ݾªÓÌɶÝh“¡·=îX¹IõlÜ2Zê©NZáX'=(ªö%‰|¹ÓD”7)}zÑ.a+p²¯YRØG^ÒXbsn˜ÍÒ RPõ“¥ÆŠˆÆ·±˜Ì¬d†Y`‡‚×ìòBƒ"]ÄÄIVP¾ž©Hîh=$as\Œ˜ý°&ã…tïü«3˜[;Dƒ@ž;hÞU×@ž•³ŽCëe%æ¤u_´m§_WÒæý'tO!vjj”ä¾ ó gèÛ8ꪣ¾*¦”m«§¹§n—?O(Á× ®ÏãÅd y„ÌÂïI» ¿à‹’ÿÚJëÍ’ÂÅ[»ÞªBÁz,$ÉÁ°wŠJØ nQ–dcÒVŸÃ>D¼*ñ˜*T9©ºþNnòr(Q˜œf®¹#›²ÃwÄÃs,"û-±>:åb÷3ÎS™+ß? #•÷Ù2}j‹ò³¬çˆ½‘Jß?Öîð…¡- âæµG‰yŒÍŸÌ(r\ÊöLæwd޵¨ߘ*TŒ'Ðï;Á„†ÊF™uc›‰9OÌMÎV:ÀŸÈ;¬™D:dÛJU9þG‘êƒ2@êƒMú^3°^„ïä«. 3"è¼´Ð`©C\èn)Mà‘ƒ4ë‰íiºÉ¥Š…X)·ï^6}[ª]ФoíuÎïR ˆ³a ܱeœ)éˆs`¯·3™‘qNŠ!§—€OCó—ÚÙ¦@“öEMu¯&”‚XVÆ:˜ºê‹’{Â7ž7¤ge'°ió§Å<ä/ËQ¶K™Åp0Äw àB4Aê­‰æ‡èðë,¯…l%£%kƒ†4àW[0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2059 0 obj 4385 endobj 2060 0 obj 1161 endobj 2061 0 obj 2692 endobj 2062 0 obj 532 endobj 2063 0 obj /FVYAAA+CMSY10 endobj 2064 0 obj << /Ascent 750 /CapHeight 683 /Descent 0 /FontName 2063 0 R /ItalicAngle -14 /StemV 40 /XHeight 431 /FontBBox [ -29 -960 1116 775 ] /Flags 4 /CharSet (/minus/multiply/plusminus/bullet/greaterequal/approxequal/arrowleft/arrowright/arrowdblleft/arrowdblright/F/bar) /FontFile 2058 0 R >> endobj 496 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2065 0 R /BaseFont 2071 0 R /FontDescriptor 2072 0 R >> endobj 2065 0 obj [ 627 818 767 692 664 743 716 767 716 767 716 613 562 588 882 894 307 332 511 511 511 511 511 831 460 537 716 716 511 883 985 767 256 307 514 818 769 818 767 307 409 409 511 767 307 358 307 511 511 511 511 511 511 511 511 511 511 511 307 307 307 767 511 511 767 743 704 716 755 678 653 774 743 386 525 769 627 897 743 767 678 767 729 562 716 743 743 999 743 743 613 307 514 307 511 307 307 511 460 460 511 460 307 460 511 307 307 460 256 818 562 511 511 460 422 409 332 537 460 664 464 486 409 511 1022 511 511 511 ] endobj 2066 0 obj << /Length 2067 0 R /Length1 2068 0 R /Length2 2069 0 R /Length3 2070 0 R >> stream %!PS-AdobeFont-1.1: CMTI10 1.00B %%CreationDate: 1992 Feb 19 19:56:16 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /SLLRHK+CMTI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 39 /quoteright put dup 45 /hyphen put dup 58 /colon put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 75 /K put dup 76 /L put dup 78 /N put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 87 /W put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put readonly def /FontBBox{-163 -250 1146 969}readonly def /UniqueID 5000828 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª)s™§„̾…´™;.ëÞ;Ôr·ÏTeò…ji«–íK­/df5à¶A|Ç{S/…ØÇ )¡šSïcë\^ÈŸÆÂm‰çÙäp·+ïÚ#õßv¾¯Lé17¢íŠ©×Öýó~kÍàÙ ˜d#å– ]Ÿ»L•eVèßËúìGo£oÙ¥È\šõþÙÂÝÒkÜ ™9‹ŸMÕ™=ü 0)xfáÍ 1›kÙXž9Hÿ°´ç!.ÉvÖP™ØN 7§§qÃjÒj7!ì6CžìàÉ«T´w.]Ê‚ÐÔ¬Çô/´“ª£¿JÖìá†1]¾œýËèÓè0'Í:ú Ôf¨èÊqdÏU³2úÔ4‚tÔ¡Ë?@Ë^g+‚ Øþ0ùð[ðõµÌ K–îT•B/ºU¾é¿ÙFM˜zÄÒ7Âú† .UÎ{7‚£KÂ.=ãUÙ¯ñžI ŽC¸^ì訹…ƒ$ÒO7Ûù—-tæìG„rzÀ œJ:ÓÚ"½ia~ ÚõT"ò*Ê^MÍMùüч¥f·ûf0EM ÖÆÅ z8uÆËøìwió*?ÁÀrºÞÉw”Ôé5(*5nZœÙ«Ø Ä4*RƒäX§&’RôT»dR³žÕM3m ’ŽœÑ«&­ƒë ž.ÇP¢d8;]»F |H!µòÉ%Té ã[-¿Í˜€šŽÉü‘Þž †E|p¬°Vëù$MÀ¥»ÔUá]n1€1RÏP°¿} dó¡‚ í¼.{®µIþQŒ7™Æà‰µÕÖ^N-+C ßú#̲]•\MØ…1 pk2 ²\t,o)•2TúTÚ®æÔw‡}¼ÒŽšµv°êqý `×;líSãgs3c-ðh®ðþ}ûW9;Ú¤9¦¤Ã–ø`2©€ êá${}è;;ämò‰…˜ÿ^l¦•1'C.Öá]~/»Ù?ƒƒa„‚ü!iñc7øŒA°þî›<.ÝÐʤpIÂDmŒ1t}„ÅJþ]×àÐj_ÃΆiŸ† U­ÇµÌe4q8}áÅ’ —±lð¹Î~°Ù$‡Z0ÏÒ¯#+2Òa}îo‹«]Ø!È3ÌZ¿ÊÍaI¢‡’|øqxi·çÜ•‹#NÉÕ9 ¬¨5.+¦lRé[qĹöÛßòr[İ©œÙU߬Ý{(WoŒÇϔѢÓÕµ‡´#>i0‰ Ó1.EWNTQ0ªØÓT“4c]¼©[+ }ï–Ò}=mã¦î-”‡óáaû±~úž:¯@òu5“WáîÅ¡ýƒT,¹ô¢R,Τì ×±®»ÚP[šÉ*N³¡Y5žL´5<âq;’ƒvÂ[74v¦åýî(Ô¡äÎà8šìÎÇUôŸ~rb2°óT5g®á|ˆµ$¶-iÖ˜î·g±[_Tæý;ë›K*6ö­ ±+ò¡/*KÇv½š=†Là¼6®?€•š¡ï(ÉZ›Ï9¿oëæ½RRº1صÀ1ÜFÚt>},=Qº„”êà¾qGÝÞôÎý\‚]f0ßýk.¾ ?à ŽÌub`üõœdÇûÂüæ‰b×绺÷ñu}ÚnÝûüª÷>‚õuq>·k 2®¸‡-É%‚ËÏN¥¥…’˜‡Þ‰¢i&?ÈùÚ›‡ÕúŠÁO±h}© ÔåûL´‚ç©Øs. aºÚ6r¬È½h+¹HõbÙUµøpÌÇÝK’O°Éúé1ÈTsèö`èïmr«*™Á›Ä"&ÐÁèä\ЄóÀWqÆo®:ÚRìZѨúÞ~%5l(éØãE`U‰+Ül‚{¬Ýé^ÇM?÷Mš·à F×Îu-Ó{ màö1b‘Æ'j›»üŸ >å’}J920 zo‰LŸÍ­9Q|wåÞw‘Âéâ6 W7U®P¾ft*=¿Í¶³ ‚Ñm€åLÛ„Hú§bzEÀXåŽE˜cúë3ßO7]ðìÜ7tv©¤»l‘»Ð9ûdÂM Ú‰ “§Üó)qA?_U‡I kªHC‰7u<Ö“ÇŠ‚ôÛ bzÿÕÜæ^&šG™ –S%³r;¤ÝÏšøY€° ³Ææèî†iá½ÊšÎ†rÓtB{‡üuafL„6pQôeNïÖ“@²Uî°úA×(€qn@HòÃ[¯“ú¤+ƒÇæZ3O+Éö?…¡¿ÙÆÿ³ÞXæÏ.kœ/½Uáx{Dmç¿ãoÉàer-°b»›¨rG0sZwöÆ}Áám*Az; ˜øqõ»yÊÕÁ¢ý³7I/…_ËXÖÁÅÄǵ§õ|œ¯È”ÈX’´Ã¨d'šœÞ9÷ÑýÚ¤Ü%ÊÔÛàÄžõBX”,<+ö'¸.“^7tcÍ{®Ò‘OÔaD]¾!¾Ä'“96Þ`Ê÷C&8v˜îò-rÏ R-WÞq½a°¥"±™±«AVõyÜSï ¼Zÿˆï‘aj€ª6&ŒêŸìÂò[ÚDQÝ}Ôá-ƒ‡>Zô¿¶ÁÞÆ» ²«÷îqvu·¹†}'ï«@7D_‰Dz:‡2ŸÕR0ËUûô¡ÏÚr!ì9±s…v-&ûçx _zgÐ1é»mDV>´ñðÏnºmÙgºp?ûÝôúI|T'áÓÙh×b;þWV2w„eþ_Ñ—#–¶—°[¢XÌÿY@FHúIE#ÝÏN p¶ùÖIŒŽhÞÛÑæ§õp[F«S63Æy')Òp‡Îä쥥 #©ÍMxŸ>mÊHÿ¯=Y½±­÷Å0 +N AR-áö‰oú¼wT”{xüjÚ{”“éUõBÂÈyÃ4€§ (!Äy k¾Û2x™CC¯üw™°›Û=ì ‰ìi{Íôj€RmÇìÏ`ŒBòsßDúBX¾ÿ¨ý4è_>5Èåªìu6½ùgZe°hÆæ6㋹wƒ[Ìmæsbõ<­áí‹ èD-­ôx×Ä¢Ÿ•ÑÉ Á0,ªùÑû|Ë6ÜàÁ½¹•5ô2e EÖ²uLº Ͱµ/&¦ÐøQ•/æã—ÎC)ÿ+‹ÊÛû”¨Ž­½‡.)?b¿È±«÷ÑŒ‡Æ(ø`< ÿî¾—ÑàÎ}“,»YòÛ´®4\4@Ó é+ˆk’Ÿ] ö² Ü¥!_º~”9~ȯx…ÁiÉ)–r1ùÏ ycä*+Ì»¥.2¬0×ÀË]Õ§N×ô@ƒö14a…Ï™s¥nìîYrÏ_ûMCÙTY±f¸ãP]fî.]Ìäƒe}5ïi ~Õ"¹»\>k€“~ú .¯&Àw©j˜r·UB¶­Ô@zO+@'Æd¹cö¬X¢hñ–&: ߟ̞‰Ùs˜ÎèeŸ­ªh &EòaN8RðÇ,ÚI;Цþ«¯Ý¿\ôÓ¹KE±òE+—˜y„8§pa·àRÊ ~Ä"§ö•:ùÿðÎ+fól×Jp¦/iúy¤Þu¶€µÇ·ã“e¬ÕÆ”y÷†ÁÉ|Á¤Ó•æÎ`.Qÿ¾ŠÑd뮽ք'´ïÝ´óýð·yJ)둌M"™Ï£²3âkm§>{1¿ÓKÐ%œƒ¼FÅ™q NÛÐÜýWj%*—¥ý'ûˆ$.¬¾™(°EÒkâ,ÎÆVže}•m›Ì*@š;›·Æ6ÍnÛÌÉ5à0¼É#KŒdë‘Qkÿ5 Vpw—êå÷&O…h‰*±~5˜ñ<%‡€Ÿ³ð¨ ŠXÓ0mL QE ¨Övƒ;N8½¡Ñ"L$[°9çH`c©òöîŸéB”sÓ•Ó¬Šú·ÏØLó\3ý‘åÚZªEÔxÇ5îk,îÜÉgÞ=öýßf.‡°“_¿áS]yMÖ]Ò* úF>CˆCg<¦’Q2W¥¥ânãûsÃ{Ïçèû!îxᄾòÒÀt*±¹°dðy¥›þ®5YÉ„F£Ño¬JÅaïR,bCÔ…ñdÚ‰À—~´§Uà H;«ßà'‰ÖÊøëVËðÚ‘W9mAg÷—¯É'€65oæx(¶cWO›:ʽ‰gWˆ:Ÿ˜©Q%V¹h„ºä+‡ì^£ƒ¸H†Üí^QIö÷éW Tk)«Äѯ°eQ ’4°‘™¢ÚßXÚ®ÎY˜¥½Õ|â´ˆ€¦Ú2º^'êvâk½}‡$1èØÙ¯¿¢Xm™/œmÝË€ :Ó‘âfné¬M¿f—:É'Q á g Óz|eG©²8'‡u°2¡Uý4ךכÐ'SRµ_»“ú¤Ùõ.›™øDp\Ä-M#Ð^ Qíýš:»Å§êDâXMUâ* µðuUwò›î_ëÛ¸ûƒÝîÒáÝü-Æß0çN/­Tgf ¹ÊM­9î7¸9Ÿ´‰4OJMÁ/v<Œr”Ÿ5pèáè m´µ9×1_+p5y,­K³@ïB&3«ÌgK9r±ËÎ_cdœ°ÄÓ—fÏz`¿›!¬L£^<»ÑÆš*ÓøOo©œ#V-òõLäYC¼) ÀDƒCwcîsØðÕÕ®£¶jÈyW µêhóå-e6hñ­jTƒQÞ åo|äÕKÜôa‡Ý‰ m¥ÚɨÝþUlV‚jÛŠ3^NÐX/( E‚§ÆSñHxùR±æðDvÄ,rÜb6Ì8œY{<ŸJ0¾‰Š¬Í4Dg74¶îE¼¤"Ï­3±iÓgÝì$,Pw ™Pâ lPð²ÁEY‰WÎ<„¼äÎéd|=íg˜IUÊlŠiàtqUžñÈ¡ÀÊ…€„DÂöK'k™dÜšÜáG¯ˆ˜©$È„“T”$f%)Ž1Ç35c\|Dõ‘QÝ“Dùà…À©öny½Dìá:¾IzWà]Õæ I¥ý‹ؙvìk[Ig˜·Ç¾*áag‡9¸üçDª»rá7'Ùפ^üÅý„•ò@ƒ…¦[Aå!s'ðñ/(÷¢$.šŠR—KG$4¨Ýržçú\(kaYíÀˆÿ܉®šòwU¸aºìPÁÍ®Rg9~¬€P¸/ëÆö¼ ãÎW©³{–WÁŽâ\Å=Ñø;vÞ;1€^øÐ\âù^ 3V¿«X3Ë_Œ—¤¶ŸÍL¡çÆÝª@%u]é —rÃ4p“M/¬å¸Tš­X)“ðCÍ ª´5Èž4?]6pÃû9½YZ²8Ï—ë+u5n@ÆEúÀ!±-À´nêôrâI•0Â3~ä©ay1F´hð»µsä8!„Æ ¤Ö ?É»}”zqóº&´ÔÂ*aZBCYU±52?Oxš‰D¹¹Þa«Å‘ÆÌŽ \òã1cW"òÐúUÞ 0ü ã`ì$+@ÂOŸK†£ÞÉ­2ÈŸ1ø |Øî+Ïà¢bu·Ýau’wÑ{s~‘ÙàYÔHÐ.ýËÒŽÄ~ª}•ñ^>•ü¥ÕXLÇÕ ö´[NIÓS÷Ø\]¦Œ"Õ½Ã<‡y ½ÂIŠ% /ŒÿšÉ€cgOŠ÷pqƒS…þ-yñJÓCeüîp¹IÎÚPÎeqhÊM¢  \=ZvÓÓ,t'ä÷wÀÀ/ÐH½Äw›LtÝQ\>£‹¦ò)mΆ62ÉRÎÆ^ôìo÷̲~¯ø%(Îl3vrÊF‚c±«ªÇòŒ Ë+øøq]äÌCÔWû1xÐɾ5Nc"‰ÖGà3nöÊFëOïÞ<¨½V<>8‘û,œÎüˆgIþß™ qîZ`Og°&1ŽA3k¾Èõ<„™ÅŽÃ$…5ž\øá‹¦Ì5Wì®°=í¶¦zŒVòNNtÀˆÛ¬ÜI곎?Ms_U9eª~J˜€PÒð³šøû ǯÜÕ𾨾%féGÔO\VÛî?¥ˆýDZ}×ëOÛµnÀܵSÓ¦:ã›öD¸ÁØw„a;¿—w¬nªÕ/Êw¿ßº&l{ö SÑîÃG÷³‰]Y·Ÿâ)mÜS{þÄ뮾¦îß›Eÿ²Éë¾D¼E9wÜûõµmÒwÛ}×ê:ZDO]an©³û q”ºçÇåIØ–(ÅŸ”–w At^Áš<Ÿ}ûsé°;À•̉®²ÅÑKv`H"ý2FöÏÓ¿Ñ2òë}ºÔuŒOfT±% Ó|S©HÇK÷D@uÉæêP´¿ó\›íærô¨†#”ÍÏ'%ÏHÖx×Ö&J¾[tÎ œœ5³š]© ª_JyÝú4§Ò\/¬CACXðú{`cÛ…¨k®”µƒØä…ú o3>ºúÃwSÒ´FµÎŒ&S×m=n`doòid³‡¬59®‹ ð#þûçþ•ùêÜ¥’¡QzæÁÚ Qó×ï*×¢5ûr¾œþù²ö^›þ"Ÿ’ ãåËEìÄÝX8%±]j/•6B˜†GË„%Iµ1u@É7ôŠü ›‰#95¦D½{› Ó¶%ø•žjÿëðANü™Í¨shv”)¶²Ø«Aæê†@ЉÛ0å€-‡õ›­­ÙcÐm2Ì,ã&ÒŒ397ý÷äІ1Ü;ˆ¥ªC1ý@^¹5÷ –,ô¾ïS¡Ëº5y¿ÂFÙ¥ Æ»‹^xÜÒÈ¡¦íñ*‹™úx¿±}Õѯ¬¥`rM7¡uN,]t‰%]#î ýÔ'¥â›Â¨4MYè^·t,Æ3¬-ªÑþmã»EØ­p‚!®õ‰'$-¥tðl³MCZ§£a¤¾Š*ÊÖ2œf«ªÍʤš² 4LH8¬ä•|\c L0^‰íï‚çŽÊ® ÜìzäÅ–Ø–í[໾ÒüQËê3VËôï|›_p¥þ¢UhÈ´tÜů=‰ùzv¸ÑªyÓÙÒ«eє݊ºY˜8>.c´…éD×y¸ÅýE`.É‚·ãìí{„úê¦w6QQë¨R`Ê_vÏ\z ¾Hr2É$ž|^¨kVÕmÇ_çʬö{¾u’UZ«È¡—ÃͺšëÿËd_ëõ˘ƒÖh1Êj=06ZØ û®§3Ñ(N‡NßCgÀZq‘}íÓŽ+Ùþ¡çj-2Ô¾£ŒÜæ+f ÏŽÇ?×fÖ—xñðàÿ¼m,ŒÃ¬ž:¾£Ap*»ë#®\¹ú^Uv‡:vÚ•Ÿ¯QÛH´Œ%‡¯„ý7ѽ(õv2 ô¾ãS±VþUZÃçÎC•µyi†û¬òQEìŸÂßoYÿÃJÖ›Æ.7Š1ó‘ö‘;1Ù˜$p†»ÃBÿÖ‰ozg*e%Ql?i¢i~­‹ÂÓBÉŒ¤ +7lí†+îõ‚Ý6¨[ps‡ódf(žör5¾É³ß£ G׳›@bÃ8MÝ–i>}m(ã]ò¨–Ø"æÆzÚˆ«*áΣækg4£LedÅA{”í«ÐÛkÚÎÿ¬›¥¼µÓk5Ì\ûu] Bɉ5ÍÛȘÇKŒm®©kßk‹õ2öâRnâ"±ÃÛXÖ™d› X©]9¾™Ðî¯-ˆL›‚VîÂØñœvPåfH®À¹`õc/‘P5ù'g îÈ‘¾*+P HoO|Y›Ç[ÊŽ®8³^àݳ<Šß¦’ÉÄw¹,„Ú(ìöÐ{/µKymW„ëKsý‹vMW `]YÁŸ€&Å*†n×Ã̦ ¼IøWµ¥ûÿ/Î×cÀñé,÷0:MçOÅ}t÷ ×%¾»›x7ñ2w›)¬›áþ¸[Åx;ßPï‡c>y`¦M ˜‰-þ-®ÇRs ÇD-Vl_דY+ïe[(¥½7½Ã‹“–Zšó±§®ÜÄok…üàÝ÷TõwÉ&´rÿ?ÛJLŒ¼‹3éÝãr|jboZ²F®'1nv)h^ü5™·ˆ\º¼Ù}ý ‚GÏõ½7o -/Dw>fɲLl9ý2â×@®Å³ RõƒàZ ø9_²´­ç˼¡æ#¶P:£k@þ š>\bNúå[o«¤{wY«½à÷yH±Í«š1ÕÊ‚Ë,J{JUqC³Ó]åÏVÍ΂ÊôºcÝUrãwwš†®I*•¥s÷k|>< Œ‹}•ÑBŠ˜à:}D¨Ê9¬(yÀ,¢ê:¦.À!±Õa¢ÃÅþ¨?L‡!ÄÝËu{ˆ³`œ¡Ò |ñOP<¹¤œøè+4;­/9à+ÇöTËK¨2ïmC ¶$Ï—­áSR8ßZkin¿ˆ047ÉÕÓ¼ Ä_ñ¥Ûñ5AZ=øššPw§êà tHÄj&\¿[Û9è+`.d6ZP Œ ¯úÚȆ>Bšªn„ˆtÔÉŃÜ.ÝÓˆˆºÀÿ×\οt† jŽæü©Nèüìœ6tG—ƒÍ±ˆî½WØ@¯yËÛæ—×|Ü‚ÅUZ._¬V¨r(gåRí;@–ñˆ—QÕ™"®­,d,²UðŸ¨ü± ±…Þ8Z¦G~#ÉãÿôÄþ ”_\µ«†÷ÁnúP«×pϵ»wðžñZ8Ì0Íϯ*®7†)Z~‹²Úl„¾–2r<”ËÀ×z45@p+ì&Í^·HWŽ{ÛªøW—ˆ´¾G铎&Ë¥*¶ãKäÙx&íŠc2œáV_YŽ >™PCW<`r]m´¯øÐÊîœFÚar>”äûÔEþ —U›&ÎÃÜÑ;ù…qt~j½Ðd)Þ=#kPtý±ü‘Œ\8 oèyþ÷À*²k‚|4 ®Ôc+s2oY߀çG°¾Ó½Ø;ئ%+éò¸èÙ^Ž˜hÍ¡‰ñ5í†!‡(U„ÌÔ! ZC„6YæÖ¾$š9hr§¥â0IðKºáŒM‹¬ÇŸ*åGÖ¸<Öu÷IJ Ô°e¬ék-ÖØ2£)ìç ø‚â"”©µï’ íYê.©(ú•.³À£®¡gY2â¾7M È–“Èâ`–¾†|Ð=¡ì&»÷E ÐÜJЭ{«N>‘N3Z4‡³{5‚÷µYéKC‚º7O‘¢Át5Ž5Q‘Úx¼ 2{IÊ–»3>B¶{®Á…Ϭ¸Ó|î2ï’ðp-eCº¢ÑÄQ8 -]ü;é‰c¹­ÛР{JèÇÃøöÉí¹D:»p²HÄ}sÔ¦ŠBF:Ÿši…ø°Cbó0\¤_ÖØ£7þv'¹«"¿—˜j§ÏGú?ÉÝNZúN"„Üý°Â öòBÏy ¾4Àæ2$DÑÙ“6“d"‰5XMñy\ݢݺ'ìíûÞ„I§®€BúQp ‘sLÛÏ„ «˜|¹Ç[>†/Êm*‹M©p]Zšû ´r1‹O›!WWÖ$™&‘ù&pØLºmKz°o¯ûûpŸ§Î×—½©KãoÐ<‰ÒÿÅdüÂ]áX鞦 ¹~¥P”CA†%#ÒŠE–ϵûbŸå¢þ޶q ~Vô·‰EÊ«†as¡uõͨk>áêd0uvŠ%úvŸ¬“z ¹ô}7CUTNÞ5[ +ûû—ª­ãä†îazŸâ`Ê+‡.ñ‹?+ŽùŒhKš˜üôø¯’ÄUY1®´šR:Ö¾¹{â3¶ÓÛ<œëbÐ-h$â F»Ã ÕÐdþ"Óoeü›'Uáu0;ÇH/ u]¢1†Ãvþ$PÔ;ÒÊÌÚ3ËÏÉèfÊV<òÁ«Ï¥hϬ?å’‡B1–c™ÀE3bLj‘.8ÌM; ÀCY2X.~<ïv"éAÑ{zÖÛÁÿ?bm6‘ Á7‡†­("8îȯlBDþ1¦šI" kÎnWÀM¾Ê‹#¢á`Ýë8huÿ"¬ÏXŽ`IgÄl³%¬q刂LÜÎÃѸ<;r½q9%pŠ÷´?õGÙ,£µœ´ÝÃ4¿"_~Š[•b% >/d$VÁ6)•ÔóѶC.ÞÛe1;>Ur,MKΗŸ×R!£Ç—æV$ͳmÐûÅ8[²§¾­Miè4·Áš1{sΑÑôwßt;MsoЖ>øÁ¸)å_"” k5³TñÖ£TEñm:ר—[ggLÍVý·C‰98gº‚(ªP«Ôiwóñê‰ð£Ný„¸ÇU¤”¥gÉ.-U°Lº¯?9L™ sSë^±ãÔûïêÚz[B_¿)¹²ë¸¬J§?¦·“Ñ…‘…+áÉ¡/ß]ÁÁZž{¿nœ_0•HaÔÆH)ø)¸V{lÀ/‰×Õåuß‹ÖL’×Ù—„Iíл'!V¾0wä»`EþÉ¿+´¿©)Ös0} «’8…Ÿ=Û(Ü ²“'–=ºÇOGC“*0X“%“òyRm½•g7>ÚÁU|‘AÇOqôq–½ŒC>TI×ÓIj`.Üe­Îð ®´|—f»çñ È3ë”W͵óø±ä:ICÞ¬O]¡"d@¡£t’æwÊQG³ÜRÏwÑŠ<«ô¡ûŠ”apçEm*UŠ'Î(2²4{µ`ƒÆå¡Qæ^|«(òà’íX$´Zñ¬Înßç·0›Ð¸¢cD}»ù×ëÑŒÝÖffò!Ö›„ö®D}ÐYu‰M0Ù¡þª®é´ ÂyýUl¨)i°NÏÚiè(Qr“Ó ýP2«V¬NE=(µŒ‡¬Ø£lÈÇñ5mp?C#}†ëHÑù*Yt˜ÆòSYå–ÕnP½Á_ Ó·#Ò¶rmWÂÓ˜fXòôh7¼6woËñOcŠcF=ó…LL9¸èáŒSL0aC:bøË¿©”ùÆä¢õ×$ìZtûàÅ:ë‹¿¡” eSš„f[C¢q«° +_ȈÐð;çÏOŽ7WVÛÅBô9û0ïîôzˆ5ºáPPŸ¶¹x8TÐ%mØ;¬,&?¯PF*QQ¦çþ?i¦ð¥õ[u)ý@ü—nõË&´fn•“9…`é¯a-Ì"º^VçôC‚éy¢.Üõs6ݽ?Cõ#a Ñ¨·×QÆýÈPêNˆÃêþf8oue’â§6Qp€Å+Kä‹(ÊŠnÆ€kKXd„ÿðÔQìvE(ú·\LiH­ÿÚøÐöƒñ* üÌC¶`AP "÷Ýü£_ÓÎ|SÁÇ6jðP¿†ÕÎ7”vA/޼ÐÖ¾ÏRÞ1+ÆÌ£ ×ÖO„…½)Aæ”ÿÄŸ¤Tóí—LiqÔ®ôí\Ú4¯Äx¹Ha­B;’a& åš4f0HÝp¯vosöÖoiP­Gà†$Î Ñ=b©É8íg>Üí× ]åÿSuñHÍ«Öü°üV)C›[_œb¢íp(“l]‚˜yæ1›Å‹ªüŽ2“U¼öÊø(7GwW\X”ÕËòMû TtL-‘N뢊ƒ—ú1{ý¾:”°Ä­†fíü\‡/ý)tmn¯Z!”˘nÃo*nõÞe2Þœß|R¯`k‹Äg ÷S.o'yê-öø“âcÁ×l;…(DÿL‰²T<ÌPá{ÇY€ñJ6޼À¥çl–iÍÖœ[a‚¦á»2ϧ’¼„ßO,©IwÛ:Ù¶®'¯:DZvTÂfHCö˲Où±$Ç¿˜D«Ï޲AêýøÏY EÀ Ȧ»%ŽíðWÌNMã(ùÂä¡éJ7)aPøÎÜã2¢´ݤM½¾Œ«‰iÜH‰ù>ö¥à(¬ &.V6(TûWëNàÆC Ëcïþžäï=QÎÎäðø£L<Ú\»¹Þ]L^ñÕ¸•Ì<1áÅ­ÏZdQ‘¥Øì¬‰0É ägEïÙžÒ‡>.#ÁXÄãœ#XØ]ðÐK¾O/Sèî^mÀúŒâî8H<5L€ñ9|xbá?CDV଀›ï+ Ú? 0䯱<4î–•U„u\ä˜W;ùG(8{±C5––à=¯È°sóp:7Ž®½º+jq¸Íþøeqó¡§7ÓPÎ+0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2067 0 obj 12906 endobj 2068 0 obj 1442 endobj 2069 0 obj 10932 endobj 2070 0 obj 532 endobj 2071 0 obj /SLLRHK+CMTI10 endobj 2072 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 2071 0 R /ItalicAngle -14 /StemV 68 /XHeight 431 /FontBBox [ -163 -250 1146 969 ] /Flags 4 /CharSet (/fi/quoteright/hyphen/colon/A/B/C/D/E/F/G/H/I/K/L/N/P/R/S/T/W/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) /FontFile 2066 0 R >> endobj 495 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2073 0 R /BaseFont 2079 0 R /FontDescriptor 2080 0 R >> endobj 2073 0 obj [ 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 ] endobj 2074 0 obj << /Length 2075 0 R /Length1 2076 0 R /Length2 2077 0 R /Length3 2078 0 R >> stream %!PS-AdobeFont-1.1: CMTT12 1.0 %%CreationDate: 1991 Aug 20 16:45:46 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /QXQEGA+CMTT12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 49 /one put dup 97 /a put dup 98 /b put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 108 /l put dup 109 /m put dup 111 /o put dup 112 /p put dup 116 /t put dup 120 /x put dup 121 /y put readonly def /FontBBox{-1 -234 524 695}readonly def /UniqueID 5000833 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ_dÍV`þÿ¼ œH ÍÈ[üfðI“Ýsð¾ ±?S±ºyþ_aŠOg+Àkã%;ËY›ú`AûÕXGSpÖ“©Y%š&™ºn—Ï@C[ŽŠKBcCáEßå(Ôà”µ7ã@$æÍàêšøŠ2` 5Õ±ÛSX/ «zÞ)Ϻ ’Õ©Frßùsó›ýWáaå-¡´3È"aäy™}ö“]*z•÷¢]³Â¶ª2k˜,2ƲXg‡׳Ž1£ÞVŒ71§yê¯ ¬\æÅ¡)Ä~Vˆ+€hß7É|v”ñ1jù>3ÿ~ /%'5Î Ÿ{Îkî–z¾ òMË¿™‡Gí%+g@|³–xÌ…Ýü/EÅRº–~AX^ÑoìÄã*ÄÓ³ë€FÜÝ7É/ßñóq ¸ï\£X«¬£<~ZÊÖ¿]Å‹ßÃÏ º*8)E¤Á_ñ‘oâìGýÈ ëœaõÓU¾ßÉÛX…Gv:Åð±ÌÒÿ³.Ó~2ÚœãlT3eU&¬û:0Vú°ð{]‹GhsHÞ¹o?œSÎVÝÓ¹=9Í’¯Sû”a†M¸8‘ pÅHsÄ,Þoˆm±ΠK>»CàРkç%t¹Ûh‡1¦Ëehù‰@DŸ¹/·ø!0eÑΨ‡È4¼êtþÞÎ`Ý] ËP´´¾(þóhËúk¾Ðñ«Åê4øâ>r\«÷>+áŽÂr¯þå¸Y]Q:ØüN"F5H«Fxñš&Ù¾÷Öë’u©õ¹b9‚ž¤Tc_RHb㤕 ùïÕR»ÿˬãÿ§¹ì ™œz¿4¬‘&ô‚ÛäÐ)o¨H•fÜ ¬]C¿cuFÚÕ,P=Âp9Qgòùt• ýõ}Ì$¢™$Dëž0CÙÌ•ªâ>öm¢¼èÿ©ê ½„ô×§79m(¾#º=ápÄëkñgû:Å úrRÙ¬ï(2g˜(ÜBÍʹB˜ ¶M×í‚E!ÌO\œrŒ´lR• R‘ó%ºS“659/Q;ïãþ¨¤èàî<`î%7^ÌûRB´ÛßõÍвÑd¼Â÷ÀŸÉÅ M·¦ï™ë‹¡½ŸÖœûù°Û¯r)q¿»Ã#;®W]½6L^ ×oO"ü} ¬4F¥òÈßÚ5ÙrÎ ZùûÃçù”¿îè Ô>w¼Û¡°‚dJäÐm©™£­% ±yÐ7uÇq(š=ÞùÇ>|)O;.’”# ¡³ÑQÊ™@¶¢‡½W”ÍîŸÕ®ZJ!שØÏ+³ä 6õS‹[ªß'UC4Š¥ûd4™oÌÕO × 6z':éæAðýwÜ–KÆ×XÑšßBUu‹ÚH(Ë÷¾¬FŠˆ°¯ªû:1%ŒíTßö]PÙª”?÷œþZ Sù°ý ‡¶qL€i0Ǔ̇ÐÒ'4€È˜Û‡‡q¶xŸ=(7~t†›&Xó¢ûÇ ç\ìž¾á6ÉÔÙòSÈÀÃRDmF1Y À䳯jði/ðZ¥pX”ÑN‰¿†ŒÊhÊÞC–ñß)ĦÈ2sgQÂ×<–ž"HéAÂá–mIÂmaÞ~IfŽ5 zz¸D*CÇ °º%ÔÆsÖS2,±²iŠÁf‡Gc-*QŸ[©¿-ÈL¼¥«€ÒïJÓ:Øvâ©Ù°|m¯÷†9õ¸ÍCÆ×Ê ®$ŸD»4EÖõ^*;>œß@/†ky.ö=Ì=X÷¡EM àT/‚ÙTDÈš¿"ŽŒW9ÕÍ ã{1x_‹'ÆK_±Ý?É]=Ôw÷>.zù†Aä¿I¦¹—{à )dŒ§ w„i˜ÎMñG¶µ™´yH‰°i­0Kÿõ^þ¨c¢GŽûÁ¢g¥DkÕm”¼é‡¿à´2oè-±Ç㵯ª@Õ(­ç³P±1æá@Gç8ï8¾hVdž¬Á{Ê“•ý<+ÔÇ‹%‡µVù '£÷]{’¹7C¢õ`64–¹8J&‘Â(‡˜„æHQÁ‘¹idÐýZO{vuQ‰/ 5•ßê»ʫ)jûì£ÄÚü Üf/—>Ë·ÓÅK¥¦&¹+§eÑ™¨p›·, ?tÁÔ]yºûü%&+‰™;„=‚]—¯|kÑ“zµÃí#£˜µ—D!¬€ß˜RolÖ6H"íègøúµ@ˆdãcæÆ²}¶®þ»ç9Ó™¢÷²NÆê=ú TId{i± γ•-CæÐÔ¿«‹r°]Ï‹ÞÜÂ6˜p–µï¶/?WÞ°qÁýÑÞzo>ÄöڥȲ6F¨Ê¤™ëÛÇJ« #a†zjFuY{ɤïåã-Ù“°i #6•ð½müœ°)½qšoƒT¡ÉŠ9Ï+ó=„ßò Äò­hûìÙý‘>oOM: Ej¡§Æ×T}‘óùu;R!!l'nó¯Ó˜ .ßTŽÄ¥«)î5\Ö‰^#_׿H¸ƒp=]Réx‰wå]ÉÎX]3pt¤Î®†&šˆèÔ<‡w, >jÅ…ÐõÈ GXõ7qV·”ævúŽ-7ŠC$ä°€8iqî.Aÿ|n›€f™•xC~MÄÔYUð,ΨzÛ÷¾&{Ñ À?÷õd ÿÌ눦ók’íUN8ꉽ%Îî£eâ‹_ÉgБkc”кMæÊ€R•ñìàÖdW˜îãè ûwVœ%*ûÑDÎöÒûÑ÷°¬— ½è’–NI6Îȯõ¾i§Ái)^ÝóäÊz ̺À…Õ©ç½`ú ­aåíÇÕÀ&Óå7üM\'˜€Ò¶Ç 7w7øS$½Ê{¼ºO¢”Æ€{h?0‰˜qÚÌˤ…b÷ 0¸%-È%ë“JÏ(ŸãÂO± (Ø©5qôvœ,-V>Æiˆcw‡Så9ç–Cg§7úЙ‚ •¡ š[Ô©GðA %ßô6ÐRi*I¢Ý·¢•±ðþÂSLÇaýjm;Ö ˜ûÄ¢)¢–1§£Ä€uÞògP‘¿è• ŽX< ¿x ä®ç¹Æ+)Ð"aQ$ô”ôöÌÌìl´¾ä9qeÚ”åAän«‹ç• KÍ|Y4öQûzŠœÆQcÛƒ^k(…ßûÊ£á³HF¨¹`$TÿìNuxÞ£>ÜùßÖæøJFEº$˜ÂÖ1Â¥ð3z%;‰áß2§µ"&Òo –‰kR¤ïáäÒA_ig‹L®l̨ CQ–‡½ª×0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2075 0 obj 4782 endobj 2076 0 obj 968 endobj 2077 0 obj 3282 endobj 2078 0 obj 532 endobj 2079 0 obj /QXQEGA+CMTT12 endobj 2080 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName 2079 0 R /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [ -1 -234 524 695 ] /Flags 4 /CharSet (/one/a/b/e/f/g/h/i/l/m/o/p/t/x/y) /FontFile 2074 0 R >> endobj 394 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2081 0 R /BaseFont 2087 0 R /FontDescriptor 2088 0 R >> endobj 2081 0 obj [ 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 2082 0 obj << /Length 2083 0 R /Length1 2084 0 R /Length2 2085 0 R /Length3 2086 0 R >> stream %!PS-AdobeFont-1.1: CMTT10 1.00B %%CreationDate: 1992 Apr 26 10:42:42 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /JWHVAP+CMTT10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 37 /percent put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 95 /underscore put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put readonly def /FontBBox{-4 -235 731 800}readonly def /UniqueID 5000832 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ_ùc‹‚2BžØ·Ïj=‡š-8Ý\DgùÝŒ] ³¦¿/%b›®Á™®‹ÔºnÙ»÷Ú¿ÐáSº±ÁyÔüâ b*ÍçÇL(Ð9sWí«F Rë:E·¬Mks­ƒH…02§Eô”?›Oíe+ƒZ¤—'¨´zÿK΃µ¶…–оi‚·f Ë<àÂ,¬ÝE“òDÁNìZ|JÄ#’ø¼BWþ¯3ô¿ê‘ÿÏ—MÖìp¢ÄÁäó(¡ë%ä5%ûÀ~(Ì5öBk}Aêj „Ýc'S•¥ªéáÈ-8ŸÑ*!èi™yž$©”G.¡®w g ¾ ªÒJ0Ùn¥r û;Òà¬Á¡ Kèr^×ã©o™x¼7p4Ù= C‘åyÃOùü#yËŸ[¾©â4éê¨9'nÀÙ*¹xÁxÛ/J}û¥oÖ¯†pë6OÞÊû¯e}hà1‘W6Ϋª‹¥À¬%(ƒi]I½‰«ïèiš ãí…´ŠË""žb3™É=çÙ5sJÚÚzbÁÔJÕ>£[Wåеü H ä2"ÛŽüÕÓùº0O¨y9.à¼Àá¦t³¡ü:=×$E€Çª Æ]t¥þoŒ¿`% Ì'EK¿—ÊKœƒ¥fr•‡RíK^yá†`vO^†ðžúŸv…òõ~ÈZwR‡³ iÞNMWçÐ3HS¢p+§T,q!s0Ï(عÆ;U–©´+3çÙ"”J8q3ƒÓdŠJñ`£°Èó7›¤7+åkX©Ö»øvšuGga懨ÀOü|?Ja \´âL‚p¢©|–äj¸ ž5ú Õ¬õÎÐò–hE·…ÎRý5’ÙÊ} Ëd˜߀˜Ø?eu6°¾æ¬sÔjDh*ï/Ó"„qJêrƨý«Wxíë #‹˜1™]¾Õ.²kKy;‰¥ö"%oÚ×ÓÜó(UÛY’Oâý![xµÔéíá;å–oÜÿ_*íAˆ*O˵c¬¨TtEîQ ã®&…Ä+KÔŒ PJ>è–»—¦CÔç¬êy–_Ùò–¥¿5žÔXKåÓà" ÉðÛÙè¨0¾Šá,pö–r0Æáý ÇBZo•¼3ë ¿ijŽ>žrÌ:ÅÔ«vÃÔÊö0…ùð¨ÓààIÄ7vç qŸtÀ@©'*ST‡g¶‚“8Eô.ÞZÚQpì׊Pæ%²äxž^òaé&(-X–%¯O¨ÀfµCmT¹sŸCJzª´Zø×¤…4¥k^H… J=o¸áì9vM¹ÓLg'ªÏ!ï¬Txå}á’¥©ô–M ì©F Ä{è'óãçtV ¾2‰A´NX§ªèã8 ÁFÓ]E­˜Ï ’{³æb&‘bfo—_ø%p–T1†Ž}ãÄ*‡ÏêÚ¢ÍUªëO˜4WÍ^êtÔ6U¶:05:aµ³¼ƒ"ª™¢0~Õr¼±n:ï%g@€†A—É e®`Š„OÚ€j’|Y¥€}#xH®ÎŠÍR~@äpaAY¸<î ßZŽ.#0ìȼ. ¿ Dk¸Q6Mç¶ßgDÈ›ƒH¿hr§øtàm”¼l)!|=îÎ~ÜtWPAß¾­âXx›ÔÉ®'é[ÒöY"£fý6S2P)õQ1åÑþÝùDõ¯¬Àl¸œ;†ž;æS¨z úý®$Ì¢!Áª)Q\·Ðdí’ ¤–D}N\½ip, ¼ª×ëÌâ‘:2Ô2N”÷ì^x"¹À6¶§õÏ?à_Oki³¦Ö§@’Ó2|•[¢Î(±ˆ_cô6ºw¨Lé*Üð^ÈÍû,&l»ýì¢!üàÉ+ŽÓÆU+¢.¯>êAZÄœ‚¸öÐXÈËYêÂVχ®ª% ðCšNí+´7an;H#¤áe2{f3zúU§IÝÁ9ØãxaÆ]X¥7ôW^¤^Ú.Øüø=Å…SÏ¡ p†Ý¬@ºÀAýäØÎµr$4í±ƒäq^š®§Ò‚’òfÞŒö¸‘]¾ÌøòZ^¨óX˹}ðù‹ãh¹©rÐÔl%ŽHb–÷% ð¢½ehõ-–×2= ‰“. ;§$CL÷½oî5où$ü7×§Q¹0²˜ñ¢>¶n›ã¡ìb€2&`Ú%ûhù‰HÎòÛí5èBã«gsd]û¬´[ÒTÄÌüYÞÔ Ø•ÇW”yÅ(¾ylÔÑìˆî®F\0$ûŒ²€]nUìôd‡@qWcõI¥K³¾#ïvHâ™ñt3Áƒtõ¬‚”]Ç~ŠÉáÑ!Î[£R{»*Â4AC,ÆcŒ·’Ü$ºfœ:"ñ´ÉX èH…HÛÃñ\ù<ÒrjŸz77𸇩ÊkÃÓQ@šïâ©,ÏMUÒÓN é†^•§NjTíÓMK3‰“%±ŒÁ©¶5¶„¨ô7zÎ^i½sœ‚› ›êN–èÏMsUéàâŽxw€4SRÆ+.t$’¾ÁÓ«×ëœÝ ¿]>—g?Ò&¥)” ¸RÖ¿¿L#<;ž ‡,Þm‚bÁ6ÀÒ °9Âo¤Q²}|Œ±±&s%,E·< úOä½H 9¶À‡^>\sðgÍÄîÜì=YA¶®‹«Ëp-q–ÎÅ–yÕAÖ¿†F·0‡ƒë±šIüjÞ0®ßÜ(N¶ü6'¬qÁòg±OË:\$ØÄïâïô=ÉÁdù‡@*´4ÄÄ!{ýDùIZ’!4N¨Dð$í4¥B|1Ú3}óÀId@46úIšñ÷[ã:µW±Sôp9S+è!©EG-^â<¢LËú:ÙJåßSz‘f  ^Sºpö@¾ÊÏþ*c+Çïçæy`•°Ê+äÌТ»HIc²aŸ§ÆítÇQÍ(ʰ݂۟ˆß¥äWaxò«“nN÷cåÞàlÃóYÔë¯æî#x¯DßQp•öO”9c±“z´ºn¼&üzw`/èo†êÈלQXó¡ÄIÕ {ª¤`cÓo:#:²A%LJ‚ñÒïîÃañ¤9B—ËÐ «\ê˜ÿmwRì=Ĉúž LJ†TIXHYj"H-Çê/í°™OJñ¹5’ýÅuÃÏ]),9 A )„¦!y予ÛÕ,ÿ¬Ó7=õ†~.Çjdrj•¾§†SFŒ&{ûæäm›æZ÷öŸ©ïv·Û9‘ žïG©Yܮ͢njy¹P*õˆx"q§ùLîxG»í™M÷}ãÀDt8yÖ8NïBš‹çýÚÒ8ñ[Ão ð%2Ü‹¤ÐfãÒã´àª5²ÈG¦“X¡“@Æâ ¼žÁ¶ ©š¨¸nÌë~’Jã>_í†Î,Ɇã1å½x òfXa;žlÌ\û˜xè“j: WùeÄ<,g:F60¬ìµêô &”AsQfÛÊÔ¯' »‘jBŠð ˜wéé3‘Å1ݬv±Qpà¤Þ©8¸6‚^¾ä2m5æ ¬ç´Àû?\…¤^ç¢! †bPö¬1>Mp{’Z”…ÖÌaOüžÞ¢†pâ}ÖXìr–ˆæl`ò£öí•Hy?eJr’®ä!ÊûÞ¼ ËùYqó#n9’Ñ>ÑÇ!Üw«èaµÌy´Fã(md-^u_Ò®/Å_!ÖàÐ"¥*ëÅÚþÑz×çä†}]x³ªÇ¸ì‰ç#¹d>mnzA^³ HŠÝJÊøþxGÕ¨ÝZ’O4Èì–~øûçwŒ³ƒÂû#Ê!ë4ufÇСŠüéçÁxӒλì×ÖÅ™`™I6­ú×ÍË¢¢Pµ XÿñÝ¿b³ÙjzQ S P ©Râ"[b@2¥ rgÝžð™þ¼§Ø¾¨Ë ôƒky,ŸW/,ëè ¼¾Ú÷|ÁÑ;öFaÿUšå#õó4Dµx£à¨eî>%CCÉÙBUG´Hiª P×¢vuðÔƒ+€\êciÉPô-}pË4øû6à°º>ü!¦cÅÞü@ÂBó';-ê´×ÒKb‘Z´ì«<®—ÕïÁ&–ñPqhKÃf'þ/~å²IîøgE –TÌô²-rœœ)âýw G&#ÏW¤ P[Ô¿ƒë• òé>(û€?Z6„µ¡&ÐG!²Ö,=ìÚ sùy˜Á·£œ»—ùÕÞáz±*´Àßì\[Þ 5â9¦ xìp\¼'²ÈpÜ„­%Çÿéü2lûxSůì‘CÎL6—;âƒc8ìÝê•%a4\ax\BÒç)Ÿ¨>£ ¯Q‡ ?׿‰qŠ<4å×Nó~´êüÛÓ$ư籮 pœSZQnëMÌn¶å¥}xcµÝ¬Þ¨%Л¬´+Oü M±–Á°.T‚ÂQã+ïA{¹~",Ž…mTô1Œ?feI<ü‰ —Uêw`XPIeÎ>öíÄD»6y™g ¶1̲©€|›Väb“åuÒ‰½>Ž>ЯE½S…Õ­"õÓ ‰Ý+ØÀ »ó;É)D…s÷K& ’A†+”Ÿƒ·:œñ]Þj> ãLŒÐ+ 5óOÇ8”öz<Ç%¸ýz·§¡âØaªþ1hø¼)T: “ŠóZ’w²X¼<Çð6¯b:¥Œ@ðe*ZUzí½Pµ>WÊï™qLu=‚ï êŸÏ-ûÌÐñÏtëxUÜB|ã'Åã1k¯¼6áØÒŸÆ&eø{ÿ?4é ®$R±Øf«òÉ~[G|ŸÌÈ@Qy†Çöpv‹÷¹~P«‹d¸Äé·œs#mªÿ\~Àk2Ç-ÆþÑú¨Ôye©¥¿Ì&VÄg¸ðš³ ;¬uOʵ9åžÕñ˜ÛãîstŒqŒïÅŽÒ5¯ËüNEª"DŠÐ¾Ú}Í¢ñßÌj 6ŒžPpŒL A3nrqþ°×rwy7øim¡DZå–NÚÙ¢ ¶E}ÍäÕ°:›â×WnÄóÃõ§ºk/TT»Q®É$˜Xׯq‚Ô9é€` Þu5oÉ}l!;ëÙv¡Ô=&ûà>$îŽs¹et¹ÃþHqúãª[5A°Ë툖øuŽŽñÀKš¬1]¾Ò½ ñS~~”1wÕ1Q1†ê^0ÅV]YÿþºcŒÓs?ÉÛ2oÁÿ “q£&ˆ µe5l+yxÛY­Èá(•ÉÑÔ;Wý…t#^ˆ­_•vG£1Ð9¸Ìøy±2Né%p­ÛÉ” 'Š3™íUW-Ì–²Ñ³ôò;øÕ°Ñ­:W½LŒý@ÊžìÞçE.ìнÕ狯½éQ¼áhí(¥hëðEÀŠ’“'Þ{±°'oi‰Î¡hƒÿUTÂŽEç ô?¨·©ã-f[S2³¹ÍÔjÞtR£¢/~ËÒ5ù¥çPöj~!sk‚ 눋H>ØÓciôP¦ mð£ŠãþµYãq=B Yã;{ÐMÚI¾28eà°,±.’:KL¹iïr!¾$„»9Ý×°ð©áhà\ªû eH×`ð1ƒ81½—s(ý4½1æwÓRK=§,ù9¸J—d^éÈ M[½ñåfÖ!J •JÀÖ²ˆégŠö#‚Þu‹ìVí·‘€‚}«\€žF|;È­]ˆM]ñ¬Ž±üuº(•GáQY¥X#K—w4³µ —ðç1(xÞëD­Ñ¸ßx¨ä0¤å!u4¥•sPBÇŽbŸÌŽ.Õ$Q£³´ ÁoŽ\¨6ÝN:‘Ö˜5„-Œ!\z‰9°~kîÈytc|J@­ï¾âÖ“÷Ž‘á>¨Á#‰ sJ/H+fz>uü0¢±¯_mVNÿÔÀ†Q÷í ;Ì9£¿ ý »í4ÇíTv’B<¥ÒZ®×üb Z{"Ñe=˜ 85ûÜ_LÞ5j0¹¬Ú–ö0·¾ ©Ü“§Œ3ÌõŸ6g]‰°³ ²/»-âË o?˜`c¨QLúÛ¥â®t¬–µöÅP<¾ÈN‹¾§à[*@=pû´ÙÌ; 0;¤W‘Ž™À‹È7\tVÌ!´GÌš6Àh-+íËiÈž;D%œÎKO¶§1xðÓ‡1ïg²#`wé­¾°(|¥e£íãã.ÌHB%yèÖ8bgÉû¾A©%t7¤ã,lqÆY ²z®ÁŸbÌ Ðná°³°ë÷ ø-ű3ÐðÕdÒù÷¾Ä~­v/«j„ù úÆ<ûq㥟ŸôøkÛJŒ‘Ã2Ô€gOûEZØb¨ ~­å…>ý‘´|1c,ÜÇ"ƒ´–– ¨¢\ä'¨1[Ë7Œ•Õ¦›3Š#Ée/ÖƒãbcÚñOîóЬñ¿!Ò»Âʨô|5ÅF!žŸiùt]«îZ^”"t@dÈY'_ sÒî¾½^a·g ×7››dúC îÑ<úaU­0K Ê¯_)Óžþä)ý ;÷iÎû¶)5±O,%ð?"ÇÚ®Æ-¡|ÙÀ›wF|@£ÇCY«DzTVõHâÍK}‘aåphM(Rb­A°‚@¹Ÿi¸™ØÄý™yw£&xmì³ý5•üw°©šËÙ¥$æíÒkt“žœÚ*ïœY©ç?Ë¢ “e£]+@R¿²¬#‡'eDL)U=) ÝÈýjØ=û£¿»&`/²ý`àí—x[Éflb׿i‹OÁÓPü3°¡e¸an,tØ íqqT]¯ ;=QÚæÉú¢~FD¶ör!þ0“wW:­Sd̆ŠÞW˜·¶?ùýæW¬à°Ð…Êø&æ‘çCZJ flˆ¼±nOø©ļD^PDw¼ðà9†â¡yåÛ´"!h”œ¼"ï-iÝà\VÛÉ ìÉ(â8ÃQ¢ÎYüÒ}µŪæ|ò¢Û‹K‹ÂʦûÈ~.|˜E%PÒäË…˜ ïçŠÁ¾#M/e㘀]G›G‘N&‡”[Y^ŒQg öKbÉ»Yºm0ŽŠwtXN«ú°ŠA£]føXü–©8ÞB÷)·‡<ÂM•ŽîY?«Õß £ÿ]vcuÚh=øÊßV'µ}ò‡½ö•ɨAÑŠß<¢1P‚m\öÉBY}~ýŽ_qÉKÚS@hoYïDÜæú@=N "Ô«üLyFš„ öÞÅw‡wéä—ëMUêJÏÕ‰.Q¥¡Ï³†· ¢+“x6ÖCƒg´ÊÛÐF¤´ Ú]ô¡»æ:Âí-dYã|Æy”ÏïÝóåA6Õò–×ý6í½îK‚Ñïr`}Í´\KaÛ®®5§Óì)Üš Ü’‰6ÿ26‚û.®ù߯‚Í´Ñ£ÿtŠ‚Ê³&åtòy0sâó»‘u*É}± 8£9¢R1v÷(b>¾€>éEb¿YÍåüóÅ6D‰ÇZ2‰Šìþ·`©%!æÍuB2¡¹o?ÙÐÎóc)My4Ï ]ßס£noðZks†SB„¾cœ\´Ô§6¢ ?õÓ=2©ÂÇBY,kŒ6cþŸµ"Cn‚ªŒxlæØ¹Hµ…K2Žš¶]éýlÁ5´5uëØ…EØL6.1°9Þ;O¿¹×@ý‡ÕmàpÂÙ †‘cÃ$MN¿a:g4–,i;V#kx¾Ø™éÔW(G ŸAœKÃÚ£` 0ŽHæêÖb\a6ï%#K@åÃQ/ Ö™ñб✃<û­¦ã¿|4·U|8 ¬ïWo95úÛŸ]í-ðÛ£1‰”ݳ äuc¥Ùcø0­'Ê]¿ªà°B° ÙÌÈþÓ Š Jýÿ¸#-. þõaÉÖ!i“Ér<ùN@G±dÁó=¢‡Íi qddžŽ Pžjz1ãQ~äéžXG Âuãóƒ^ ö)g{ŠLkÌÈ«8Õ7?nËÕ×Ù¾ý§ú*Luæöÿ¥ÞùtDÍø4ö…ÚV^¾D7t€†àÙ \V(·V¤·Æ,þ@~´ëšÐ§í¦‡-8ÙF/B+i2É_>ÕýôµN-OIÈ q¿(T¤W ÷rØÄÙ .¯&+2×E›³þrŸCÍëeâE3Ùà*ãiÍ$#î›ØêkÐçü)·/6€š ¿Ät1Åûðî^ô5kA!ô€}I…¬´l»7F¹Ê=jõÕl­?ÿæ“lã¦D7CJ“ê IöŒ,‚ƒ†˜ØÍAÑ J,çºÖjJBÔC¬l6Ô¾£TÝ:Oˆ ²$ÉÐu14`|qå\þ§XÑ.ëK¿­iØfÒ§<&ã(¨‘tNǬŸ¡fÂEó <ßaY¨ð){“ûù?9Ûú; …‚ ð\üwjÄIÂDùEîóê úÂpÝFH±!1?tОµe?÷µŸ_°‰mQ/äÒã÷Ïá{Å}ÅýÄ$ Ú ã|û"k°2ó³b ®~êÖ´ýµ&l§% .§1à¥OË{ðº8ꨞ0ððtª‡I¨,ß›á }¤ü£u{y•a”J¶Ë/§n¶‚³¿ÜIëÆ¤RI1}k>UZB4ØI!ç-¶†àÉq÷𻤷ŸOše¿üNdæ,Kì–À®Æâï2)«~⎕QJãxÇÑZŽÅV}_œ‰wÕ4ˆdí¤’yúä+p…È­êø~S¶`vú}t~)V¾¢)ËWŒðÃt¯Èýؘէ#Ûç|[Uí¿{¤” ’„ÁÒA´º!@\^¦TüÉþ¦³<¥ß£±nËO­°›ã„igÍ½ì½ Òc…b {M˜ÉãB¹îÞtd»ž ?Úðǯ~IÚßvíî§x^ÐGy £ `6·Šo£CBVCà´"ŸP * ²ÿè ’þR‹˜y{Æ–›g}OëxMÈMJTSÃÄ}Ÿh* ¾.bÛ9 ÿZ¤5B©¨4™ž´ÿ\£…ÔŸ0ü|{¦08¬/âwÿ˜‡ãddÖO‡pݤ r8Óîp’C¾³ÜAj«˜_bv½rèÛØ¥Z9:z—óyKþZ©ÄÂò•UvÈÅÞÁÁ+èaúùçoITÒHÂ,Åíe§j ÏodB­";Ññ~ ULj[뤇4µr—TÏOøQtN:ÕXoX¼ÓÙ¨4#±<Ç ÍÀ^!#òß$ƒgèö«¹‹º <}ªì i´7C£¥_Nˆ&©tο!N°ópí¥ÉXŸç À~ZÀ>1àuøP˜çêw8dà;=ƪ&8Kž‚ê…–t‹ØåËDâ*¬Â™¨n‰bx›Ÿ‘ü³T³ Ì¢š^I(Ü;Š‘ùäýÈ;Å]¦¿»Âñ§TªÔ\ð üX”JôuûA0†’ ‡—(WB/ ×Fñ Ì¯%Í`ä*qð)ç®K¦y™5 '¾ÛÉXÎS³Y¼¥H?´UöÓÕ²Þyç™îßA¤4|¾ƒOª3Ùˆ‰û ¨–‰–Ì‘Æ<-ýÀc¯ö‰Kp@K¨ô†T–0tµgzšâ{¬±Ø_Fæ;/*vÊŸ¬C˜ !’éÏGÏ´?b4ý4S ¾ ¿«-Rlv¤ËǸ۶Y1è'6×+ZÆí>î¬er ¸Æ©“ãWþµ¶‘&¢äd—6KíüÎÕ÷o$ËP`æB™n°F¸‹^ØxdGU¬¾fTa¸d É&²½í̱ éHí…þXÝ™b޵ˆ`±fmÕ·«Êlæ1ìP¶6XÒµ5î=&—%`^¾Ã`¢_+“Wí@ªfF6ñD$bf"PîŠjîr”æW6#µßõG¬€ÈÕœÞɸöð½ž?KË4´øP0;I]•×Ú¼žØJ;H¤6 ž?§+¿Ý5{òÌ,8v¶^\ìG&ΜZ[ååm *Íހؓù]ér`ÐÙT]wPšÅÄñDëžÒ&$Z‚’<=¿åäà£7¹üÄ‘õ›^³#Â{BÖ˜Áà«Zwt .œ¸02|?ºér쌷?I½Ìš<…r„ôb¦–àÆÜÕ“x«±Æ~û=ï¾P±TÍP¹·ÃÌí$×â#K#kïŒiŠè×,PB·õêªEJÑjJ»íd"§[wW¥1 ;H÷o÷ •Vü[÷Òq¶b±Vø? ‚¡…ÉO:à5cQÄÍÄÃfÑ[œ+ü"LÅrð $¡’ˆŽˆ‰ÖÐ… ÄМ¿WÑ$Ù&$’ºäÙË“ÇÌ'vÉôÑËÆ…¡‚Æa1èçL.iv¡ðÔÁ¸Hy•;è»2[»FÛ‘—voÅ®Õ4g°N‡LTñš¯4&Æëè'nèŒ•è‡ Ný˦õ"½ýgÚp]tæsx¬Ía–æ©C h®w¡7:åšüX$Ë3/âG’ýg¿áýhñ¤^l@ŽN–+(áIþþ•nv­Ì6´CÅD4 !0å}øË£E_P*•-ÛÍ‚·øácU˜6Ð`Oß›X¤æj:”ÿŽiéĺÍ=©‚x¯?Ä·©Ë¡+h‡k9»³.öy±‘îÉ{XtšýÙ]ïŽóBšçEšRžqNTEÞWŽ6ƒöçØÓ6|3MW+uÔgœ)ÓÚª¿ÝÊ& dLÖ{çßÖªMÆc^^r"oª\ë«HY³vð¡H°5Ro¤9 ‚ míT?}±^È[ø>hîÒ9ÀòõëžÆ”t<¦Î·a#L)é¨8Gƒ±–3V¨™ Ù¡Ó‚e¿3¨^Ä8¯Žç`?MX|k=Òª:DUÊXü‰¾Ñ.1Ç 2?ƒÂþëCªüR6\çÌÉO¾ç2CŬل@N§Ååù¹ý¢Î¼sÊóµÏ(uX„IaÃÿ³½Ó¼:fïFïÒï8¤„¸…«ŠJ/å#À¡8ä¦÷Ò Œ«ŽOÏ 0E­®÷!аô}< ;Õ®°×6Æ9M~fjáy$VJ·jdZ¡m6hŸ,OÉq}?œ € à¶éu~À ëË Œ©H䇳:n”œ’ryùëÙhxÍÒËJÊׯ U!-õnäÀOBk|É¢Œ…PjÓÏ6¶´Tv^wS‘¡ªÐ=˜òÙ OK:P³éËÙãÀÛÛÖŽ|a‚Ó=Ð'õ›ÕDM/Ç«¤ßQ¿?‡ZpYGžjïW½*DQÿ¦J—å£q <ìAôM`;Îl5Û¸WÎÆ zõç\rkÄ1­µùP²ŠInêÌð$ÏÊXf€‹ ¹`|>±Àå1TçA“Ÿq8øæ¿îtk0=.ˆ]©Ý“-É¿õ¯•Ê÷ªÁ­­5l:²Ê3°°,‰©ǰ®LëFÜt佞×A]hÔ´¢Ÿ”gvv8±nÕ‘µ€>zÒ®É&™5]˰iÃúöã  =¹ÎN[%¦Vh¯ïé&ÔÝ/ `©¾ÐÞÓÍ™…5å^¾AÙjW]Ý/©ä%ÿؤ»ç¢ „Káæ?H¿Ù¥Ç)<—ª”r^Zö̺ûù®ÖùÏÔ”ˆ_ÓÛ1u?iKº0U³†Pö.g‹CàzÌYaIÐPDílR÷àË5ñááH"„ ím9Ï äºPGV ùÎ’ç$0·¦Ø‚©ƒƒß¨¼>‰ ÒRa•XÎÁ°à‘Û|øų®>i›Q нI)hº\)áIž rÄÁñ’—-[ѰñvrlŒ­Ð5T3P~Tƒ0üñ ,r6;$×Òlpç´åFZÂh3ÈÔ{G:_ãS’güGš³ùªÇRS-,j-Nôá\õe‹áò«Ia eÕʦÊxHâøÊ1Y¿…öÜWçÅ"…u7âþø±|ÁkY-ç´ÅüÿÊOS±%¾¥¡’¹­Ÿ\gTLMm˹k¦7¾B-y÷x¬¡ZA'D©ïD¦ÿ5›_2Úç™çjRçMª´@w].ý*¬9ãa,í!ƒ—Èõyê±ßÈ5í÷Á£N!1ËLRl•1;¹t#Ø…J4Ä ÖÄ\OóP²#`YçsW.Ö0kÔ4T[hˆ 0 ‚Ö7'€¿Ó÷’… Ò—áXËÊMMÖÿøà„¿Äí–ZÐâ_•\s6cg¢—çT\wÔXÿæKìÀ§}«X‘”Öò¹ÒNü_Ë\xª•sç¯Ì!P Í/ &öI‚d%P’D|uNµº@ê²µîd—„áz¼ ,ѯ«N?Ñ’©™ŽV:žÓC|ßLÎXôiù…¬ÍÒÜŸMÎY |¬ûß}mÍì ³»¹!`.Vžì1Þ/SÉ ÏKzeý¼íX˜¤£<ÌõÞÀßÀ.{•BïdeÁòxAÐûnæ/D6|Ü^fCHÊï»-nÔ®ƒØ§ìPþ—3ü d[£Ò›v8!ie<dÈ+ƒ —§·0®'½êÊ®çüÐÖâF•ãm¯lí†`Lô.Û¬Sã}—µ°9q]xѬó³0¨™ÎHÉ,Ó{!$(uXáVb%ÜzFZ)Y¬ÕõICPIaAèÛ‚UYýdvÛ$ªi¦¿©ü&DÀÐæ‰ôe[ØO…'ÇH¸ŸgîCt6ÎïÀº©åµå¹ÝxeµhCÃ4r½ äw……ÂÚ´Ö4—QŒ#™ ¡=§zwæØ„§³)ï/ò—•^4ÚÕÆØe@Üä\¶5±tsvº ŠêÒˆÄÏ»ÕÃ˰eHžŽû;H@<œèa=¾R$̶ LÄ‚½ìÄššÌ">ÓÖ=ÂÎ(nG#B…¨˜í8qóV-Ü ®ûZr#¾²Ë“iÊ&9À ü¡u¬Ö•RÏ3ñ"ú¦×+½|ˆïí€Ý_æß ìvçöèÃÃV Ê¡‹„B%üiåBP‚;©Rûڴᮢå8òG,‡·éžÅ9:ˆçj–ÈÊa`Rë {%€ùgôÛB–Já»ÈÁt=…Êf[ý|_O¸M«,hµ¾•šÎ#}–ÂOï6P ËÊO–xö'u— gmø{0ñ”hNÏÙÆõµRÂ7c'ÈÄuõ—sÑ«ùI D¼/¶‚>Ò.\gþÞõæˆ`Æ~§zcû¾IŠž^£ünÔÝøt™Ëq1òsQ³–²`……™u¥BЗnZ‚šþñ>R Ú55Kfœnæ·¦b¢oˆËv×Äb™aóê® kñgÆ¢¾ñ7'H"Jš°ŒVÑa9MØM§Ç¹ÓN7ßâêà1 tõòžM|}Ž?°äÝWuˆˆ³ÆËµ:Í’ƒÎÙ¨Û]%55ìC÷ì÷wy9c÷EÚ5»|ÌϦ&ZvAžÏ¤ Áóö04u)¿FHm±°W"”×·˜Þáõ¢MêÞµêÕc7ÉL¥(ç¾'v;}(¦âB _ÍÛ(ÒRLÎÉ¿8Õ]NYò'©à\Ó´ŠË ‘ìyûVl*a`Hâu2×LgáþÂÔ_»unhöVóçvDfLÒéå CJ·{÷ªîOõ½Ç±`7¶ây÷ŽJ¶e龎h§yH@·ÂSso?&œm¸\:¹gyêo€Ö®ïåÓÓœQ+•­VíJ%ˆÝîÆz EƒBzòÅ$<÷{q®¾–!ÙG©%>üeX&âvŒ”4Ù¬ü;'­Ãíw×dV`HX¾‰8h(¨Ã¯c©é†¿VR.ñ/힎HÈЬ-<3À¤ :ëJy  ®Ï•hV”&Ç+O®¬Æåq«\hžpüš×ëõãFu²×¡ø¢•‘,]Š–÷5êv3à9&ÎÔçaOª(ƒ|Ÿ‚Ž)ar’± 3ï:P yÆÐ”R%2õ*Óú•´Æ„²ûtpÑA \jþ’´±4Ÿ*кbë=¸ýÇzÉs!ÝŠj<—tH·Ñ§·î"Å!'í õ†ÍW¤,Þƒž$û“k†3ŒJ²eÏ5í ÉZƒ_ç£S‹Ëi/"x<,«v¥ÏÐ}Q›W‡¾Îž%3æYøP8Äñœr†ð­Þ¼Ê×B¿×U?lYQ%”‚…‰n—‡Yí@m8b1°†?°ßgÈΟ¥ÇLHäsy‹Ž cÀ³q°5+¬MŸÒrÎJ"’cî€}¢þÐh^[æU éÞ(e‡°*‡Ú÷?vÕ¼ ¡Ng‹Sä ÔS¡tzp¾õLxAwu,¯•×+`pµLfVdã2ñ>oïÁûˆvº¹Ú¸Ó)î\œá·\Ñ~ô-û´šô˜!öËÔ[¸×dž4™Gú^Ä:¥›¼e»ª°ºví=«·…ÂÙ„môsÊ ]"†¶’”"ñdCôÈôØ,÷’ˆüìu63@ŽÙZ6ÂÿÁ$»c|­7ôi2_DJkKn›¶™)“¸j['Ù<‚´3{»M\ÈÎìIaÆÉPÚ«n yY>µúû™–îöí ýS¿YwítZ [B\Ê6ÂMÊ~ª–u©ÇŠ)Âéq:\R-;RÍBïlm¿Ùçu&¯ùðÏUsä mk’: ƒõX]u&òh§'·ÍÕ4høøâÈI ðÅnõŽ'Q­”lWs 5¸Ùj;}“<Ì‚•©û²JÎýZ Çß*òðQ¡±C`´«e«ŒŒ=ç2ó¤ë "&æLôõˆ0ºZJÀëB‘™…)"H!x¦8v‚•PÚáÃ跙ԭ9úñ¥R&Æíw%0qµæE¡WS¸kRXo Âv!ÒŒžðTß:¬ÇNÀdkô­N‘ŠIxé¿…:ÑøôZm½ùgâ®vÍÏ_Ð~f£Oo$ñ©0&}¶>[ñúéAë“7=ëøëáÓ £~Æ— ¤˜+CN¢ÛЧŠ#/TönچDŽª¥{ư¯c;•1ÚKÓù¦ÓnÜ÷àÆwFm`ðedr9˜(ùj}jýQ!r(Ì/)!Ï•C>ÃD_ ïXÛfYÀŽ”êSc£Ò#ÒbíÞuR1mkÁf&k¬9+žØ‚“÷Óý²¨¯ñÏŘÓiBõ9v;•é…Ó)ðÍVY¾‘¼;$ô±÷òÒùP¨@èÇæ.ôÁ~xbøæWÚ£.³{cÀófI&f\®BÔ>+IÆb4wu0ٲܜM{fZ-iïwK(,™þa­þô‡ñ²ä‘©,Ñ¢[ åÂ/0/Æ:8Ñÿ&Ìßq4ÝN¾c¾L"LJ1ì…«8ú²Ù~ª¶bÁÞ¬N9ZoTb‹HÙûôÿ(g©»/°Žž/40£©G’È<²« ¯¡g?^(©wØn£¡H¹ÊGs:$BÀ´KèK¨hÖ h¯E~< ÁˆŸùãò€–èõ»Ê•sÖê “aŸŒi|‡ÞßÎwrAl^[G H”;r8+üQ˦Iž­û~ücRƒö¿`”Å} ö½·5«»G:ÉB× ]V³åÈåÈÚ‹Rñh w/ÔÛ!¦I2ñ¬lQcxæ\• ‰% "GŒ¥s†‹We.ðZΓÑs]‹æ˜,­tîUí¡©ÛÑ˗ijGÒË´?cÝgZ2(½¸ŽÁ+CítFÔf•€×²‰jŒ¿ð%­ø†F­}‘ªMà0„]Oô1„‡•Ü\Aõ#÷­«W%îap¤¤ní‰Ç>¼zŽÄùÙ ÄíÐ þ[ïD24:süçñZOæ %ëÄE\Ÿ z®·ðœ ¦Âü´™,DÅúóJ1UÔ1!ºä Ù7ý!¶«£š>©sšª¼r¸ÈÆ®$ ø¡ë… QØ ‚E#ô"gaZ2âs÷Å"d=?¬£¨»—¸í¿_Í6Ëa³;ÕJÍðz1»î›»¦xRSÞ‹MæDÌŒþ"çF»evèÜ3-zRÙ•˜õu®—]ò¬¥™]š2Ê›¨TǃÃä&Ô08N«rucIž¥œ±žT¬©êB…µŒ !a§’¬Hco³áe«¾úŠ XÕKb>µa“/Ú)@"ßË82 . ó‰l¿ï¼ÄgÆ,ö@8:’†tfNÕ¤£ŠçõŽHÑD žŽ %‡qå&P^ƒ¬ë|—¾iÆÀðóƒÒª }Kl3%n;Î.ŒûÓz=Õ(£Î‚vGtvqÓ±Ågó°{ ½L´è®Ïâø‡þ›—%cùÐ!¹Ýa ¦˜=¤AÙœ§,Þn,P>Qx #¸5–,­¹Åam?(¹"·d‰{hñ!À$ìòPµ¶þRœûgÈåyÌß'E@N®Ê«½=ô-øÕfæ^÷-#äêË#2n¦ì¤ }è:ˆ`L/ªÈ‹9Oò%¿Ðò$&È'RqñQ„vñwÑÅ Àv¤»\::ò¬@#iøHË /ø¥¹Ü˜ è»HB“*×q±«h.$Ï]#ù’$½Á¶)Îæ1Ém @›ÁÏô?VùjëÏÊx»µ£¤¶4ó‰…)î7Û·ú­ÒŽaðýlßò-€mÝý9$®Å‡§³ ãÑÇ.Þë<<åk&5„pêzÖ$^B¶‡AŒl¦Iü¾ä=CoôÖy:ªßt¡ê#@l tðêð_{9òc˰ߜøÍ0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2083 0 obj 17294 endobj 2084 0 obj 2231 endobj 2085 0 obj 14531 endobj 2086 0 obj 532 endobj 2087 0 obj /JWHVAP+CMTT10 endobj 2088 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName 2087 0 R /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [ -4 -235 731 800 ] /Flags 4 /CharSet (/exclam/quotedbl/numbersign/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/underscore/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde) /FontFile 2082 0 R >> endobj 393 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2089 0 R /BaseFont 2095 0 R /FontDescriptor 2096 0 R >> endobj 2089 0 obj [ 625 833 778 694 667 750 722 778 722 778 722 583 556 556 833 833 278 306 500 500 500 500 500 750 444 500 722 778 500 903 1014 778 278 278 500 833 500 833 778 278 389 389 500 778 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 278 778 472 472 778 750 708 722 764 681 653 785 750 361 514 778 625 917 750 778 681 778 736 556 722 750 750 1028 750 750 611 278 500 278 500 278 278 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 500 1000 500 500 500 ] endobj 2090 0 obj << /Length 2091 0 R /Length1 2092 0 R /Length2 2093 0 R /Length3 2094 0 R >> stream %!PS-AdobeFont-1.1: CMR10 1.00B %%CreationDate: 1992 Feb 19 19:54:52 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /YRLTXJ+CMR10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /Gamma put dup 11 /ff put dup 12 /fi put dup 13 /fl put dup 14 /ffi put dup 18 /grave put dup 25 /germandbls put dup 26 /ae put dup 33 /exclam put dup 34 /quotedblright put dup 37 /percent put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 61 /equal put dup 63 /question put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /quotedblleft put dup 93 /bracketright put dup 94 /circumflex put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /endash put dup 124 /emdash put dup 127 /dieresis put readonly def /FontBBox{-251 -250 1009 969}readonly def /UniqueID 5000793 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ\÷c¼3Râ*Rç?쨤‡±ÿÄȯ@› gSr æÚRÊIƒž†¯zE_ÑðÎEˆMvï,¹¼X!ý%6]Þ¦ä_3+_h¤JØ¥0ð’£o¬'ùzþê –ø9¢¼K“$à€ï|“t¡V\)Z! ¹j#ZÅš›Ðz1ôœUA~ "p?”ÿ{u@š]A}¦s iãújB)ü~Ob ÄÆ°Ê{z;þ¨Oí9ÌûmT[²¼Äž^—d«”UlÔð$ïW›h¶Ü:¯„ ?Æ‚(r6Ž;BtÝÊ6¯cFÁCÇrÌ$/;!,K×q¡§Lš”í“¥ûeWôàuG¯× ˜ì£¸®h˜7–åñIQß[u2¢0ý£µuZ8µç—*«Á# ™üøq¸Ûô•Pºêœñ¹|¿ÇÌ–IŽÌ“‹¶pe}é#¦YÛ‡W{ Hs(çãùÃ}ˆ²„CE à¼îêäŒÍcˆóü;ïØÙÄ[e/SmV&±ÿ i×2Ç¡ƒmc\0ÀkíC'sp)åºX0¹èŠ@$Ã2jÒóOGµG9´ˆ%­f™÷ÑêLJìD@¿mª™Þý2b5–\cdy!‚‹òiìÈz+Œ­lx¶åa°—¾+ÇÊ2´S@uöIéYÑö5F>qgžROEowK*øþóØÆ;/‹™þsºD³Ï¦G£Ç¡Íx=>´JÎå u›jLDfâØ÷džk­åß4ÒÆü‚ÉëÔØ.ä vî¬Ë|Î1wªm·à% Q–iw½Œý½ôÐXDN}}‘xê™|¾E.gK{£Í ôTü¦ š >kµ&ÒÒ½mxâ“o.<nô¢&lõQ>¿IÔÙ, “‚ 7 L‰³ÒUí/ÇGGS©ƒL@PŸÌEdáõ·Ô‘ÏŸ5ß: :""lØ5ùȸéM-‹á/Êê5p¼ªÿ7þÌZÕ˜òB×8]4ÁÁt/Ä«É+Iüªëιc/xäêeŸ\Ý%ÚË SqÂúP=¬]ÅóåIŠ C!­å¬#áÊÔ½¼EÁ~í!™|kZµ `f<ÇÒæ§·$TtPx´Cí÷·á·Àçkõ¤n¹ñàó÷ƒKA˜ŽAYÑsrƨíF0¥Š,tùšu|¡¤žbk"]ØÞfL`ú­*ðyd­NÅä)ìQÉ÷Éùl¡œ1$¦?ŠÓá»èXN¥ˆÐ €EÐ>Äc‹ÃfÕèŸV=Íÿ[miGU>L’áfqcÏD t—˜.¯2'§-ì;p[ÌMŸôRÓÓ+¹êS"Ñ÷#bpôøë¯`1Ôi0ò³…ÕzàžéÀ‚C€±D] ~+KX>`·Ÿ¼ìÆoþÝì÷™ø9ûN(V%úåU™¿Ø0H¼?ìÓª~¾'XèPŠl¡ þ+MŽkг‚p(ã¹éIŠ-«Žþhqœ®—.í¹=fKræ¶„.¯¸¬y<,=l2ž“Ï0êùÃÀ‰¼F¼nd°¶¯ì¿ÛQ6£_ª@ësPNœÑ†¨&Ðÿù- ±ß&D¤r!Û€ÌOp]ìñŠÜ!&|šÊhŽî]–×ëÍDD•_GJÒIK¤¸'íÁ‘.ŽzËH*‰$Q]„"©A eì€ÀÀ…tƒ`Ã[°ªvv3&›ù­g}`5¹–ê dzˆ+“ÿuÅÎ éYžŸŠæcÛåÂvã¥päo‡<˜‘h,Ë0EAâ¡0ܲ‹2õîL?ænø(”wK}¸Û½y!•Lÿ¼°pÕ"iôÂÑNÓgÙ”ù°5xïåíÃ|HÙE´Î5é!t-÷¥ÂoÁЙt)ÏÀÏ%Ôß/ÛŸ›¦Ë?Œ£Tî׉¤˜GÁðKQïó„,]Æ~o;õú¡GM!ŸØM†jŽçG`žiÿ Bî ;ÙÔv£ A^¬:õLÈÖoŠ,Ç$¯2I ká6ërÄ@¢‰¦xÕ‚~³LõC!B‘Èru¢Ù}ÒŸ5cK°ŠWJ0äT€ôÌ’ÅË€àEÓ¼²£“ªð8¾i’®;Ÿ}q÷[vr’‹Wˆ4˜!kç6 ¦owc–:Ÿ§²ÙbQ$¥*„ˆ“<·Œ!¨Ðû¡N†’FXÓ‘‹éAß9êxï^-¢ôÒß  ¼»/€J¸DLÿ¾ˆ;ÒR°éexô’Ûy~A·¿‰¡AKŒçÆÜëšò`zJGH×Ò—<©:À¯ðÎŽ4IPMÿû±Òøó‹žZO­ÕÚñ‰J¸^nN·<Á dØÙ‰•C?â—“ïlèê,¢|Æ(/¨HnÔùåío¼»6Á¦n7t3÷Pzô¿ RyºÎa™Þ¯„|9Â÷ô’Ô‡U}7eǶJÃ<Ÿ§$¾S2C¾S*ìj[SM—¯t*þ÷¼1¤§afq1ýD²¥g­“]À­hFH{¯:¡Êvu¹£†W÷1^žÉØÚ‡#ZôÛ‰ÀK4\Ù{ü%}IÔ§Ñãÿ’k¢ÇHtÚæ¥…²«6r‹ @&±ŒnËWH¯âûP \4±ª ÐùÓ@qÍdÊB‹é ñleð ‡-I[#КMŸý_ À²Å ¿4"a“¨Pqè›jB1\/\¶¯^ä¥ÏtíwütJí©8”QŽª/éÜV%ËA´Sßl)×MÄf”| û56ºXx‚9R&®†áå.s[+¬bƒ¶Þƒ’ëŸÇøoz—.w¶M„x¥šëåx™SzHƒºœèd@‘»ÄŸƒ¢òÉýð–]Q~)ü’>ek6T7AÉJCì>®DCx鯖 Ú†s|Ý#3Ò¡R™gçÈ=åáð;'Œ6«©}Œ+<€Õòì1ɦÄÂc¡,ty†:òˆòy S‹’FŠ›½™ž€]ÑêËÇ{¨??€0Œ©ÎÙYhç\ø$ðÇé ò,äÔâüsõíú„š*‰àÒYô/o%ÌKg^¦6\{~›FßrŸU‹2÷Š8 úŸÜ˜˜ÑRûK¢¾©Ð ÑÑkëÆ-~ÿ7äPr®›`ÉÿãË—Öù´–%&5Â>YÀ¥Ÿàk©jýaù˃9××$È2&ñu´Oú¬)çõ• ;äØf,-Û4ý#‚y½úSQFsjáÉø6”¸-<¦X§/©¥?ƒ³ë±”EÙØííoJU„Âd%ûÁ¢‚(ñÖ5ív¢¦ü€ðl€ë©uX£«`ͽÝ~驜 ì”>½>ª\@«ÞMÐÙ¿pÅÎJT£”í ²ÓWÜnš šoTø <°fÑÓŽÝyW‚Œz¤†Ü©¦ ˆ§bOYD¥LŽ€²+cQÓåóÉÐÓ"ŽÎíîsÊ U§{çG=Õãç[£—¹ÏÕËŸDàî=r„ývgc{Kº¨î„ßj {1´$ÝVÕ LÉ1t€­šÂ´%–B%k½¯³ÿ\ùo+\â'Õ`_ÉÚ¿·Ì¡¿i4(=‰ir©[õ°o åü%³åYÁ •¦>zâ˜n ¨•_ s±†KªÀLÇÈþ³}ž• 9­j¾ncWR·“ŽÎý€íæâ÷?Ã-Y"`Œ%W`nLý†þ¢±¬eÂùü…:ξ±ÓŠ®ˆ/Xô{VÇ“€î;»Ü;TjQТ˜yËm©èÄÔ -hW—д- U¯Åu÷®§÷" 6ÌÞ:Ec¡øïæ²:×Q§›NC¢ Ö< ~@_C9ÝLz‡üh|’F…ù?`œ¬¥Yˆ2ÝýzD)CR—äĸÈò¼³©û\_¶dê^ø’Š€ÿ"Í}"õDœÜêΜ™a„Îÿlv;è¹õbOÏ¿òꎎ™ÿC‚ΙA÷ |X¿{ P–Êf-±Sk ³;¿“× öõ”&Á@¥8VØ>›Â©‹l‡‹pRÈ"79\äêurÜ„â*³º)Jœ.á‰ÌÇNŽìÍé©ì• 8Kþ@B/)ZG· ¾‘”ž±kË[ û3¸þ®ën*Ä­.¹ÊY2Ð’Øt™ÚR×ÖJ0Ì«1øiLåcœ£˜x bûªã_» ²”¨Ä¼Ÿ¼EšÜ7Â%+äæ^ mSÕˆ©"¡+¼àG“҆&Lp…zó›xZ˜?æTØê¿{‚€ÌÚ{6bæùœQê§ê¦ù [0ƒfÚ3—aRb²ò«H²UC`²w¤5LEœ,«å–vdxåãª}ün[êï¯-uƒÃ}Ö^ß:(Ï'˜f­Í»¿QžÁH]ƒîw'4Ú`W>ÃâAQ°¬üJ ϸ…=†`¬37½¬4g1‚o€p¸3úL®¹•žye#ö“¾ ôÚ±öm3÷=ÔðGÊûÁµ³gÞ7€¥èn¤·"ú½H y‚䎭ث% |­[øÅÔ/.9¡T_ƒá8-•)›Ø?j²ü—þÅIOºäl鹓Ú1®ZBÆß¸¼×æÅ%.{” à¤@"º“áÔYóL ÊÁå„A¨ñ+ɵ² 6ç Z<ð×$"ä_1Ôvî Ô ÜÊY Ô#e2‹JI†€O(‹eÚ]£ùzÎ ÙæËçaSð€!8Ág+{›.ù90·o‰€4•|™üäèÑáOö‚A¿rù )‰ŸÚˆa<‘ÃÔØ%<€yžì¬ž®þ«×Ïgâׄõ™T zÄ‹ÎzDLM ÀÁ7†/ÐT t?»únÞ=û_!¨úXQŠ„ƒÞв1*Ç“[GZe“…L¦îLW³Ó„Ô¦¦N’Ë5¢Ão¢ú¹¦zVÕ”@às·ÏV»F’ ÿt¾·Ë·ŠëÓ¥)°±hGn™%ÉÅ™Âî²F@H–î/î6îá­þ#øúä²[ó!4Z,bEBd˜Ÿ[µ¶áÁÉ×ø¼}Ú4|#m¨kS,$Ž‘¥x¿Ê-îÕ‘È÷P?M>°ìiFÄ[zÿV|äìTPZÑ6–¬«¬óâv2ÄÑ`nŠjiΆŠtNL“aŒñ¶ÕQ¹ãh€¾ÑÎýRBaødÞË'ìsLnéeôòS­‰æ/dL¥vWƒý¡F¨ŒxG_EßGÔ¾`ض˜*ÀÒ³²§íßã}ÄÆ`¶­)ïY{Ç!œí•)#³ƒàfɺÚð,ÉbåÓâ•Ù~\,åÊ×Hüße)†=[öЙâéêE‘K/ój—ÔiÇ…à,©SÄò+öˆ Æ·Íf=÷l8ÀiÑÄÓœJ¿‹hdµ@ÔV <)þÀÏ€R7 ®NÝþ ÈL 'sbNÔÈ­ûëXvB@þõš´q¶ÏJÉÞ{+¯è>óV~$ EοÀ„À†~ç„ï)¡¼X`8\à óÌpó\¹Ã ´nZ5~ ÞŒ1 ì¿Ü\¬¹§ó5G*@„iÖ²+1}V”´¥DcÈÓÌç‘U#Ç9ºf.Û ïÎAjD3LC È׊Oi·[½%hR™ÿç¢=¦ƒ+EðYØLCÕû.“˜‰×@—jøÆ%h s&beÞ…$^b”¯¼„ÚEõh¸ Xü ¤Æ7byݬÆ^P±Ÿzã¸åPë]߉¦÷íÁ2|¾7h__ë,Ðõa\ƒ**©­ÎRuâ$ú‡/ ´";ÞƒÎ$Uá…ÈBÝZ/Px繟&ßGG¯]+רØ÷T51ÏðO–âüÄÖs=”0eÀ3ç¯(ýh1 `Ŧ ï´FÎù4ßÔiXƒO?«PQ éÐå´VßÄž8KønNBÚŒ`~:Ì:Ä(—‚YY0‘#U™’¦;Ø«&çÓNÙÿ -¾é©?6P‚šUƒ¼ôeYFúÔgDîj;r-%Þ‘b´ ÔÞ÷Ð+ò£¼Üƒy4Î1>×ð mÙ`6/Ô2D¨ä«b$˜âMVe`$—º+[ØÝßw¾/èYŽ¿¿O‡Ãð±ó׈ ‰ éFñÀëÔ*·î†¡›_©!UfT„§ Åû I¨áWvþøæp  øÔíè!΢•Ṯ0éúGÍ“•’Ÿ•.~¯V±•ÀO½‘ËÂIf ís"H‹ÐpîsVèÞ–}&n.hQÅÓ^.âo~ =¶ßfG0ó¶pþR9¢ÿP‚Wá ƒ*øó X$lÏŽÀ±ãæÊ/9,e¢cø“¦\n<}··7¦1)YëÿßÝw9.w×õ&v8KŒº] —Ê4G*Ô²ìªméqpò}:B2µ‡œx*îÞΘâô{PcŸ?~ÎXK\y—î'¶-Õã Žµ^·2ˆ ©)à9ŽèwÂN»Ø;q ¶n£Lð‡è-¦Ð†n=î»*ÓÌl+ ;”ÐÑ_’àŠ7 û‘þÈâ;Ù_=FŠEZ|hŽ©sÓ` Y/oBb‰Ý'bfHÏ:‡áÿ¶ëפC¶ó°­·ï[Š=SA$3àyºŒ³¤ÒÌí\”DiG»&{å•Y&âˆÕ LjNÊíÍæª,«”R0¢.ÆŒ%tíG ›µø54=½ËyšÁÛ7k’ MôÕMç’P3J·VØ›EÛõˆ"Q¥³l˜gZøÕV®}q&Fg9°|gî;gø9€:ˆ^šï¨e”ø‘–Vù»ó¯—/î¡çN…Úþšý­ •Ê×y*jbÑî.`4+[©AJ2~ºO„¾”ü»5N?O¡Ò~a÷þ{‹¼•.æÒÜn²^Æ;Éœ¬4ÅsŒÅ+|XýÄ’wSÝ@Äß­*ãtw L­á—,ýp#>Z¯)£Žl>Ç´Ë<ñ¼`Y*ãWÎgUš‘·(¡ë¥ ò£-ÀŒÕ‰»od>ŽÌZß i˜ ¯,:Ýõò9ÕÚ€é{û]bÔð:‚Ù3ÅÙD],TN<ˆW_?; $˜û©~*)ñSË‚)›»éçëTgxõ\MM”þfÿN÷·H!§4R'…\³T‘JÎwë@|PpïTج‰Ra¸]™~ËáÌoHœ çòSæ/,·¨BQ]3 ò£I•€àú:ä¼¥««CØminÀ®¹h‚--­·²¯pú!_ú·’nùT0‘ïÀÒz–¿‚Cª‰†gÊSc›-¯­å×¼k¨(Ø[bc$2Àn¤Q¿Øâ^{]v<ÙªM #:ÕdRŽXn'"hÁþ¹6( Ü™¨Jà•qÞx¾Ê‰k‡M`RfÙIÐGN“¯]œ¢ì”Rt3yõÊS e|`”.A|)h"QŸè>˜¬ëyôz>ü­{É.Àïš ÚÆò’Þ. ÄC„þ¬º~“Âj•)€…¼½™]oFø\lÈœ{’yt¥Žï1¾µ5º¼½¸¶D˸S‹0KÇ‹æQÖF˜;ðç´…oŽA«:9N#5à–Æ™¨¸×YSòªý. ÄûÔ8 JÓðB+²‘ÄÅûÍÆ~Qì87ªö—‰ÄÌâGº¦ð«FªÇ±5‰öS!L\…nOz¦ý±žzto"0ó½ŸjÍÓÓ2eÓ¾¡•þÒUÎÖmíljI2›zI>YƒÞÁ|ȉ–­=¹FÒÊ')Æõ¥Ås—zF·SZ²¶",ºŠô¢¤„X»µ£êìÌÁÃzÊòá$;šRÕŸÆ>î`¢ž¡Q½<‚rs´´…òSXc,‚Ø”Ós=?a¨üúL?ÿ¡ìrÕc[,'ª;Û¾ØeCÒzŒuV%skxrXÊ”¿µRðIwr¤EßD…È?1£Ä¯K ÎH“½Ì\Êy1Å(ù`?¾ ˜A¸ìL—ŽÈ|;Ã|ë¶ÖÙ&SPs]A—ÑøsçÌJõ:«Ä¹gêt ’i¸Ÿ{53}c:;¸ACe‘“ÝŠ†‘—SVYˆp"!‡ÇÊ€i›®ìLmm_uûDk|¿`m-à0´Gdò5»×J9MÆäoŽ±Î pŽ·«àókw:<î·˜YþÊ2”<Êô_d¤°,SIL0~\rñ^®Ó${kSMy1¼%>O0¯<ñÚ(|«Ô— )êI=ÎJ¾m³¯¡Ú©PW„µvàðô)³«(4ƒ02¿iÍpŽ@×´Q–KhnÌ«®¸ê¿†ä._g ÕY0ªÔ'†?©ï†Õz±/ó¾0ž#Ž^žÖü‚ÜÕ}ŽõTãd‘åKªxÞ2‰n6y- KæWÜêR B}3ü<ºÞººã*ïù’È+Ïz[IxÅ2Âø’ñW¤‚Ó~D+)d'ôé8( –ÞHÙn$^–"á‰^¹‰—[#âåØz¼%OŠÑY|†þS[¶®Ô§vµ<Ú²A:÷×éÚ‚xóæaÒ6JÖD¬‰u¼y$®îâ4-+_ÎÊ#ŒX7qå•^ôCT~ÓøD1$ÅÞ7åJ:×® U¥Ž™þLQgìðaqÓó½N(JADp…˜ï…A¨C½ÊMeýaÄÌcáy†oö;”«Aüj؄۳ K¦“…~ý‹¸¾˜¡H’µP]`=p|0 Æf ã^H•’û}ª6Xß<)îW.k|ÈÃoÊ•U=êÞ4˜E§½ëô…R l]êSøV®ê@¨ƒë%¦U sTŠtÚ>Õ ýåRY`¦¤îkF‡…éÃÓ+Š[ÐËÝ^ÅCB‚¾ƒŒqéù4Ÿ[þô¤–%t$©'6oŒSF„Ì3·'òó»•ÍÌ·`^‚ø²Cß`ï§rMˆÛÌ*rP±eo΃é kŒK$µ¡RÁ^ÂÂ<€ÉŸJX£¬#íÞ"çÚC@žxS\Ì.3˜ÖÅŸáÍöG$¦ž|檪`¨$d' _ÇNcQ )W»åòéïE›KÄ,‡Û0ô‡:éüFQÈëp³ʧۈú~c$‚“…/{ý=á{y_ ZœˆüÕËó:Û\Ë!üÌïØVÏðˆá Ÿ‚YâDñ4j¢YÐÍú©SM"BzK=.6ÓƒŒÕ»eOÄÊþäÜsîLf bjTg Ë"’Ìà­óxÏb´âK8}ÝPtlq —ãÙÁÿCÂW–|ì¨E½î’ DÎÞsò„"–žüIÂòßhÒಓ“¬óI&&5°¬'ä´vò€“¶übKЇ†áÑE™-jÙœ “ò™cÓ5׸š+,1)°Ó<’'_¢C„EðR?>ô×CIJÌm‰'µÙ9º7ÌÏš‰ÙÛ$R5œQuû™q—ìžœhËxáxõTÝèŸ(V¥G·âúªÚþíö˜r‡Ø»Á±Øõ·T‡œÎ‰ø1ÿÞ}–[5ZR9×ùAÕœ±‡ÿÀðÃeX)ŸÉ/+÷9Ûa«.º9-ÕWµ¸v¨êñ« *iƒ›zbÈ _ ÕÀÖ| h©“Ágb|@íU°Êbb^ø˜*€’ÿâá±;´qlj›ûŸzÌíë(oG©-*ü85O³ QþSuÍ=Ë•(v×’5ió™×ùl˜ÿÜÇ ›˜´'´*ƒÉRÚQl˜\þ3QBIÚkèñîÐ0YòM{¬"…I¢‡†džK)¢¥±BšZ5‰¬4/Ö_¸©K4îæ˜Š’2‡gäñ)„ØÖ‰k±q¬ßZèoÇ5‡f ô–¡ô`[tLdÏx겯¥ö9øEn\¾}—4UÎâ¾ÓOOäÅàbG³0r]ïÙÅHEvYw9CBH¤Ô0E´&™¥›5·J€‰ZI ÆÍ¸™Kk[6àd˨#ocÆr›;ÉãNÍ7MÛ.Fð†Z!³d ¾3--sw¨ž=´?’Õ‚Ÿ!hówøgäqjrh;J‚áÔDŠàËUn7¯Þh¼§Í|ƒõw—/‡d×q#§0*)ÛXÌäJ’%·Ù·Lkn¯.z^×QëKm;„áöÌÞJM˜|øüY®5½^z‰ÅDÔRµÚ0àÌ—OÏÕ™ßï¼Ë à×ÇÌ P¸ Ý 9 È#Âf]› ¾ ®0âäÜŒÝ:ÒŠW„‚šc'ETO2¾òMxª$¿Å±·êQqövWhí<׎¨‰RÔZŸªèÔb^­ ö+ÖÉì± ]¡ÖÆNUþÌÕ4ö÷³$ •JŠÖ—÷cð‹¨} =<ÒÊРÆœÝ~žHcÙ™Z41´ °H%¢®‰þ?# Ûˆâ@™îîIþ&¸ŽÐ€ó*‰jd¸KIF{Õë÷ÿä›t:S ‹»¾Ô¤n‰ôU÷×ÙgÒ*[´pìs[`¿:,ä5çü0ÈÆ|Ú#äûôB¡gæ¼LÀ=Ã; R7°ºÒãðoÉàŸ56Pˆ†Ñ ª–àÿƒPƒœˆ+vªV1fý&ZûBîó 1ñðèµòp&}•ø­óZ 5¿¥]M3˜c/U”ÌÔ¥Ù¢Dôòߦ³GoüDšo Ÿg‹K{+Aô«Å°:D?xD!Ö6NŠün o~½˜ƒ2´›äô‰Ÿ0ø)™.d§—ЀaNÛte0†x5–þTžÍˆÁªa,¬–n0Vx ¨“ ¶8l!]áô8Å(¯¾uJ&·õÁµ˜„Ó5I…*º“ÍHÔÍÂÛßóNó Äå ®Äè»X=La>0¤?'0šÚƒ•÷iÓí¾NíÀ­6n•Ôbëz¶Çª’$iˆéžÝú×ÄUH€"–ÝÄ8„r@•²®°ˆœÉKÈ£Âb ”#ôrL—f‡õ§2Íã³Éc§Sž A7ëvŸ¤Á؈Î,Ÿ'BWå>]ÍöŽ;|LßMyÔ°‹Ú›ÆƒK63SMªpUŒnK’O×T?™(±Íw˜‡ …OÓD.”0Á6®[È!lÖÖÅH1rÖ©¦ÑúœßÌü©r‰wä¿ 6Qcð­°IÕbIÎM·Êy¯Þ0ŸEÖ{fèǘe+‹sábcüØ”‘€úëRȆþ„ÌÊ~ÉûjÊL"c„`'mÛ B¦4h¦1^Ø”;Ùbw¾Êß9ÕäFo&qÅ¢j.=îÚì>È ¤3Ë +6•tàXö"¾èVløT§6¥z“ ~šv_:‰H1À(k&Äxç¹ö"±Ów³¦·úê,šp[ÑÞƒÝ"Óé2©Ï†à¿úÃlªŸÙ05]-˜…GIÃ)hŒÁÿ╦úÉ×öÛ¡>|H»^ÆvVŽOƒîzU`KíÊ"`ô¡Í›ÞCtÎZ Húç-0·œ€‹¯ Æž#;j×ë¤B9–\ðB N~Àv™:'FÂêÓ{‡cÍn…K `x\™ŸÖ¨ËÍÏÉoÄBÑ]ÐKSh±hƒ‹Âf„Êß=ñåðŽ1WǬ­U6Z›„4è+fâÅïã#RUóÐ]Û§çBhnj ~¦‡vÚv¢Mý¦ìsÕ Íƒ®;Æk^†àyÖRO©ëðíØäË2‡æCH­  èÿ  òÄÏÜêù³ä ƒW$B*WG!¢.ê³s0&›wrÍ{6£–j¬2ûu|rö±ž±¹8IäN”’soy<ý®BRyØcV®-€È­À+a&Þ^?ÐÝ­¯ÀNû$J1,Í]ÌYQAƒ3£úЙúʼnšÊoˆ>ƒÎ‘aá…±õÜ+Ž£,Þw=½Ëø.+A­0êEÕ4»pR™èüPÂ]ôL˜ïÉ}øíŸ>i:!šñ&nú¸Š-ac·f«÷n†Ì!ãâÇì4­Ù™ùf»u‚úšx)·«tþÁ^lÝ>¤¤›ÑxÆ Þs•*¨¦ð5ÏCœÖò(7­6 ì®…I#Ü.^ Êo‡„2¡žùœâ"ÑŸË ZTót„UCÔ†/¨†O‘Ç®r—#=°´>è{öêwQ„2Ô´¶X¤ Þ6[º c”“¤;õÂܧ#\© ¢PÆÕ¨ º‹ø`çÂäjf|ÞoéHT/›k~GâÇoØËÌV/ÛÒrðNhZ|2à`U™3¶¨ä{Ù3ôG>ëÈ]˜ˆtcy+@ªŒïÑf)°ÃYì[!¼ÅÒ ßN4öÀŒëéÙ&m$ &fÃŒEA¶ü•à»Í¢¨¾Ù†Ó°"§Lž,éŘt8‹Ã¥ùÊuÐG²eŽ%ïb©úà 4Žßµ•jÂ'5VíHéSÒÚKLóÇVŠYwp.?éHŠ ”DiFÝ‚Ÿ¼ìhë"dâþZç¶¤Ž¾¦ Aq°«…@‰âÀÊÄP¬(WYÚÎHãCwÌo›NÓ·)ÅQÜ—ÀßÐó­Ð€?F‹ã×3ÊÕlj¾§ûÇá³"@´²*iÒÈ C5­âb uÞOôŸÇ,ÙmæšØ_>BîXãÁáyR}d¿1ŽwJŽ^áÚïöì£Ùš¬ìJæS03 Ud8rï—ÔÀصâ¨êr•* öèûÏù+<_Eå Ö6Cê´6B¶Ëi»ÀÊÐÕ"{¿|lêü¿²'O¯" ø¡x‡¾œ†€VÖÔ…v½¢&rßž¬Â'…ÔAÌLIìËötËÿ€ÛìÁùgW“9Çw‘Ÿçš‚óÄOÇ -¤‡p~¤`ýÿÚ®õ¬/[Ó^Už—óá§ìŠg›ôÅP+Ò4zKá„cº2]•ÓŒ¿tôÿŽåïËi¾Ž/¬7ëE—˜ùçGÉ–á¾qË\D*²4Ú/@D—›Ì—ëúÌw!">™¥é”z @oåÖVO¿P{`P=Û›þ~žëç¨CèJ ívF³2`Ò#ª1’Ø= º¨k*ÿË]Ü • ‚?GÙ3™®ŠrG«Ú†1æñ¥3ÃPy+EoIÐ-ü¡ ¨K`´mQU ­õƒ'ƒQª¥qáB¬’µ Ý7r¶Šá6mñ%×=ÝÛ±;ìë§Áz=ÒÎèb;¡Ð[+¬¶ÈÇÑ)¬8õrŠ˜z«mëÇ|ôt`2ÓÕU*­Côþb±|UéŽîÅ´ lÆÓBφ#MÙÿ:Œñéòz.·#¥1oëû~ï7sX¦(sªf¯ë$¸F‡Œ§°ÒÂD;‡â)°‘¡ÄTàx…ku&®¡Îhb`ÇOȸÊkn/®mš7û1;"zmgŽ­<˜Ž§G0ø”aÕÈá*´‡½ax_`l¿KR„Éq猛÷<µºŒ²8,}ÓU3þêØÙŠþÿb®z w]Üõd½€Ã‚HËkGZx9››0F^jNÇ|$4»¶/>< 3öa>Ôƒá8Hë}̬ëÑñô4a‘ƒö ʰ‚N?i¹2ZÅbÆnÛHü?a´Zô¸Œ²Í³†ø²ÿo!íœêv6Í4˜ù³ˆ’÷ÒÞCº-hºÒnŸ‘l"¼~T$ìZ‰èŒù˶;4íAÕ•©jt> Faÿø”Q$š¦$«dç®>²O\ƒú «®–Rlú´o*ÊNa'2›¨DFU1cZD¸ d«ßì­Èêt66r\ló4Yƒ~y›Ä&RÀƒ(Öâ“ê&  ïšºù>x?•=5ùþޱ>ÿÍs“pbù˯@¡Ã7å<²^¿‰e—ßÿð îì*â?SG" ËúE äg€ƒJ³º¬SBÕ;9w‡Ú’ðǾٰÁ+-rÂhýòМߙ|0u§1¥—Ѿ=sßé&Í_452¿žOاV6è²Xß7 iŽ&VIm5i`žÈú8¡K¬wD"=üÒâºñ½="ƒMU—œ)ðP"ޤ΄±á˜¥:–JGŒ ®9UâAŒè#W Èà«}Ç JÊA î.±ËǹêD"TC&.c!&(Ò–ÓÿNÝë“Ë*œ”À­Ò_Ña#oÿÇ^8õïù1 ¦š)‘7p´bNqGü‘ɺ¨×É_Qû ô„Ñ:¤1ˆóU£š¿#…‡ÏŽ qÂJtKZ™D×SÀìï\–[ÎoeP ™Ç &~õKo¶šæÍ–ÒýÉ—Þ‰z²tR”ñ ÖHž •8ÛaäÃúÅ´ÝZ뛯Èõ±r)å\‡ÒÅ»d ,4º¦D/ìÞ…ý•JdãŽYÑT §Y§+DIó06G_7} gßoÀ6%¹Œ¸ ~0-7èGø£#²Ö¸0…?Qlf`Õ ›ýíÊ2û¹-’}ž*@cÀÁÔ»þTgXH¡ÁnY=PWËXW™Ö#Æ2Bë eÊѵ íuGbâ8½#ä q½Å¡NMþESK½£(øÿÕz‡¹ð`ô©vÞ›ø\ðwÄWBøhhp0Í*[ë‘ðuz`é0•ù®Ø2Þ·å-l+ÇzÿKËúü‚XzžY¸ÙƒŒ¼É^P¤æëÀ_3ºiÒ;¶u^Å–ŸhKߦ݅`~z0ð/–Å–›âDàÝm$ècвW·ö9ÛÄá›0Æ®ÆÁèæ;v!RxlÈ¿]O3ô’zjÇ…RôL¦¾úà—Lå¶@hØôsÛÓ¹Ó±n{°}Å÷ÝKÎÝåÔ.ᶉü#wŠi3TÓÏœôæëÿ!ñhüÁÏ0Ì¿ûf#¥Úp¦~©¡"°©¬.VÀ5„NÑ}î»Gƒ»£Gµ€¾Ðåhš°u8jmlä‚ÇL’ˆ„:‰Æ]èþ®<¯|Na݉?ðÎ+ìÔ1|¤ Ì‰Õov?5]u àO oFÈÊYjG¯×qÕ¬"ü­^6rBP°_²ó &kp²“l¸rƒOò¾¨îy¥F&!Û¥šÖ¥ ½Ä—ÔÇ4aw9t|0Ë´ƒ9#ý1é^&æKe 5MÕê`Ÿ“D‚ÖU/&¦M·ÖÑ.<° âf¹"™·ý>ÊݾվxõˆCÙÈëmײÊdP»GŒ¦»sÌ㨂¿umÅš­æÕ0>Û î*j¼ÀN*d®óã¢Yg\"(#—¿ÃPâ„D1¥«žÇí„y[ Rñ;ˆ‹@åïæ¡£#¹.­j%ŠÊ.ƒ€TUÔMG÷•Û¸¾/”¤ØD¯sÛ;Q7ìÍ_GÄÃ`±âÃ@¿ “àÿ£2Õ°«_™íøxýû,F(ŒŠkuwƒdÁVg+!ÍàPFvœ9WÛþ§R«}bü,ës bI# GŸ^qaº]<Œ拉Z±ôÛñN¾tèŽM"¼öY|[Xï°ÝňØÿn›±Ñ_i¯è“ =øËH.ÛÙ˃¾Ê\ y·dè<»Vc¼ãîDu€T‹¿`žd̓,¡DÎMð8:fhRü“æ†3 ä"6IU"^˜ tawvB"xÚµú3ŠÏïIÜEêäEb3vOÊHïk{"bH¾¬V´U§{éJsÓrE ïU_îÊÓœùï ]c= _*^úˆAø¯¥:9ÂyM˹Ø(0£oÆ'ìJ}j`_Â/d[¸‹ú˜>Ö!o:Žà„9Ñw'gpº,0Ó¿msKF¾æ®œˆÚãÅ{ï½ø§Ã{žXûõp‚Ë]Ðż0×"´r¾¶¸ ¼dò/ˆ»÷·ñJ¾ë¥§×ü£…RiE-yñ,Ÿ—ŒÅSPÁñvµ7<Ìc›ª þQ—KpŸçÖ„1?XŒ1‚É_:V3‘%á8Žð¹{Ð Ñ'ò5È: Úi.ý_6a0ƒ•ÎgcŽIÁ2G-–ãXz§{Óë—]J ÒÍþ—›l‘?é¶î8¦‘}´ã ñç¤òsm¡ ¯›8EŒÔ<gá×±êU. PÈN, ./!Ð}‡ÏÄócæ}ÿlæËRGüô¡}šã¥Áµ­¸y±é¨dº¼¶$ŽñÇïå›ÃDd ÒЛ¤i]¢ËkX”¯ƒÕ?+eV¸í¾Îs+‹\èÁ€Û.ýMˆìêðs¸1sÈ^à)yˆÄÁÄìU`tÕ%C[~}d8”KœÎ?ÍðSf0I’ ¤ëÚbÆ -|Ö/¾‚ @ù2ÊH“ ¡r)OüëôE¼a}¶÷s-^Ý*™Ð£¹Ú¬& œÕ>¼^V²ú€ÒíH1½}º@A.Ã…[<+vù1e"]#¿è%JŽ0C zü Øù¸‹?DíÌÊSoÈé­*ž;rMˆÒsŒ‚ w™¨í¿ÁåšLëð~ çþ›ˆ®°‚ÇŠ HM¥q\UVÌg}RÆö(ÕI…µØÈ†¼¢¶XÂlË—->Àäܵƒ.&„=Œn Ù ö^è:M{ÔÔ:1´i‹^Ú²{  o:[Hª£âÅñÇB-)Ñš†FYAUh”¿J ?qãK3+‡÷x†Cíð]sQ]`Tâp9N` ;Ç<ëp¤¡,"|=ù5í¥EY=·çåü å.èqèÛ:ë«8T¶Î?!¢¥›"aGú\ ½ß!ó2k.®ºà[;¸µk,œ¯”‹úC\™´]h&ôòäV3¬¾#ïá÷·‹µPg(oÁ¸ì 9“j¬F™Ñ è2QìÌ&Ž€R¹e_MøÅVEhÃuu±˜ÃÒì$iïw4DP TШë;¯ ˆSöï{‚Eؤ,I°ˆE£´(¨@µ{¨©cr9=$]ùQiÞÆ!Œáì=uA 7}q‚ë-G>VBGµ²|–|7¥ˆ:ÔOQfQ~âpžïšMØ0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2091 0 obj 19646 endobj 2092 0 obj 2288 endobj 2093 0 obj 16826 endobj 2094 0 obj 532 endobj 2095 0 obj /YRLTXJ+CMR10 endobj 2096 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 2095 0 R /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [ -251 -250 1009 969 ] /Flags 4 /CharSet (/Gamma/ff/fi/fl/ffi/grave/germandbls/ae/exclam/quotedblright/percent/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/dieresis) /FontFile 2090 0 R >> endobj 391 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2097 0 R /BaseFont 2103 0 R /FontDescriptor 2104 0 R >> endobj 2097 0 obj [ 692 958 894 806 767 900 831 894 831 894 831 671 639 639 958 958 319 351 575 575 575 575 575 869 511 597 831 894 575 1042 1169 894 319 350 603 958 575 958 894 319 447 447 575 894 319 383 319 575 575 575 575 575 575 575 575 575 575 575 319 319 350 894 543 543 894 869 818 831 882 756 724 904 900 436 594 901 692 1092 900 864 786 864 862 639 800 885 869 1189 869 869 703 319 603 319 575 319 319 559 639 511 639 527 351 575 639 319 351 607 319 958 639 575 639 607 474 454 447 639 607 831 607 607 511 575 1150 575 575 575 ] endobj 2098 0 obj << /Length 2099 0 R /Length1 2100 0 R /Length2 2101 0 R /Length3 2102 0 R >> stream %!PS-AdobeFont-1.1: CMBX10 1.00B %%CreationDate: 1992 Feb 19 19:54:06 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /DUKMHY+CMBX10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 40 /parenleft put dup 41 /parenright put dup 45 /hyphen put dup 46 /period put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 87 /W put dup 88 /X put dup 91 /bracketleft put dup 93 /bracketright put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /endash put readonly def /FontBBox{-301 -250 1164 946}readonly def /UniqueID 5000768 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ_ùc‹‹sˆ×t Úí?‚}¹ß´7-95†ãžç¬Ÿ¶©µÎM/®ÀåZà+üFCxw¹ö\#㺴úãDÝÉ«<ËÀa‚Ø=ÇVùÕ¾þË-°ã™—òdÔ½oe¥~”ÉÈ„š²é Ï£¬Í‘ÿRJ­rb±QźдÍUÒãiöè6È,YáåÇ?Þ?£ÊÒrÆ|l¿C¶oä¸g}¯î¡’ˆBþ±ôªhz­mÛä2qNyœúIØ¡¡(ó.‹($¼€AñæNÎ@SÄŸ ìišu¸'.Ÿ•‚m³öC3…€Ž3Љ –!vÏf¦.:ïm‘ÈŒ‡Þ°<æÌßO¶Q™†Ñt ñ!w=hwß…ß²i£Àz¦f½óÅ=¢1‹¡† ³N(ºÆè-ÛCå :Éß’w .BÀ÷½ÆÙ béw0$[ŽŽ‰¹"P˜œU£~NY®*ž6¶4Ÿ¢À›±õôC>NïÇ^?˜0ë^~o¾&f¬Z9Œ-ò(*ÏŸÊVV9 ƒ|J™ì7@ØsÏï.$‹DÊF“§‚YMÐi+M¿ÄÍ즒ÄDý¾÷¼SW[ò'1ç÷qy4­qZÃ;]6y·„É@FæÍ< ØÑöV&±N3ÏÚn²‚]ÄDúb a[Àsÿ½üÊKõ kÔƒý†9ùèÐ$[F=e ñ,&Ȩî)uv–Ãñ1DØêVIj­a©Iç#«µ…™“ò 5Ík~ ­…QÎäa’MÃjFJ¡±L3úû†.0ÆlÅVemÙ;Œ Ynžâ±ª´y÷ú£Ry­´h¦$¾&Õ'¿õíàgYŽ‹x¤¼û Qi-°¾»“ o —´7âŇka¥c¢g92ÂX3ú£]²*Þ#5ÓkîÉÕ°àÌQa?a°¸»éYÇtVSQj)ng„Èùàk‰(Fº3㊮FÕÝH~Q¸G Zxš8=÷9IB“rü•Ó{ÄÝ_áëYEMnŸ*ܧ}“ëÀKyWÀü3ÎK)U£Nº—ûÞ©ã>“[½GR"øõ‹¥÷õaç¬1®bÚ;:ÔjŒ®Ì3g¢©Šß²¥g¢Ò€¨7†s•áêÒ…÷RМÇhU§©ËS‰©h7ù~£ä¨d¬šú¶—UQ[ã²#ÛOMâýü/»Ü‚U%ÄáóL«qbË ±µëÊ”°†Ÿ´”GG>ÖÊhmÁï¢ÜC–19ãÛ ‰Y­LcªìwI+FŸ‹²† î)sí#‡¡æ2¤òTPˆ– Ž"L#ý¨á$²æ‹ôÓÿWbÒá8¶´y¦$; 7í*XÊL,q¦—è±]8 "Q¸SIJö†œb •û“yþÔ¶Åÿ!Õ k8 PÔáD—Œ³Ýµ%ÕC¢;è8_nPÃzŠ|èä%¨úüéb³7µŒK#–ál2†GAj:¢‚c"¢Q©êÓ9ÝØacI{¼¾kû¯‘~º®ï]ÖTÚà@«˜s»d~ØæåkI½Eÿu´Aˆ‰œŽy™)ä[:ß6tÞ]Æ?’„öXõÛ3«T û‡)*üÆš¤Ù¥÷dõ8e,'$ÙeT7OŒTl+‡º'#ß3ÕY4ö„•ž_45ÿï§…ߤQƒ6)AÍÕXÛLM²›3”´*1A°xOIEØb&e9¸ýÐ|ÅÌå ×Csãùíç§÷@ÀÂJ;¬s„.m¨PñüQDbÃ-6x~[`VãV`*Ú*²¯–¬ âõJ’ýI¤®¦ÝS"ïŸ%Ê<ùu“ž%vϼ¢Ç˜O<ºÀÅ8½’a·(µO–¼àH`ó˜K¹}ÀSW÷U±âuTTàÄ‘Àid³‘YCm™Œ€úÙ¢eøL¥ÓFÆ ³›Ñù€Wk&#¨,“¾µ]z‚°ôÀ#tÙ=«‘÷q¤>{.sL·F[[”é¥hQ8Á …kíÁnñ«‘b·ã±åˆT*pŒ ùKGQlÓ‹w±ÑÓ &Š[Äœ‹$•kçwjÜÖßÍðÝ‹TÊXT1’½¿1¿€(ŒuÜ¡uõ\yøöþ¨“å¿áÚ[¹^_Š#W•€ ¨ïô–HûuÍðrF(÷!p%Þ³‹9%{ þus©†?ŒD¯ë~HØi$sJ2UË[Ø^‡\´óÁÔ¬¸g]€)ÐÝê~-Ç ¿ª¿ãHBh5>¶¬Ù‡P®y@SB­Ìðì€a®ó{2gW)’X1º“ŠAcР¢0Ñ ?ϸöðAÞ&Ã,9GZïšG(z™Ô‘1{ *&«šôoÚOFàþkØÿ?*oÊnJ?TŠ»3³{œêt«nq)TÔbÑb¶zŽnàÛ Ê·6ší*Š`áï8Þ»}4_Þ…¾4­‹»8êÂmðHïÐëF-¡+J¶ Œ«¬Ë'bßÀ]¬øŽ@J¡à!à´™ëLsy­°Œp’s: E!f#…(#‚ûw²…N¹iÔºBWÌü1¢û9º3ª à(gAcü½ pjqåÂÅcÝ&Ët(U¥ÝË‚ÿ&³ªI0ǽGU{/ŠÂäÎó?hx>M` (æ¬/ ·|#³ä}S¼í˜©íÖå`ÕUpÍÆ (E0,e eŠù|Xî`f•YÔ¢|;= þŽcµ `û f.Ô…žFÏ¥„O8'ï3§áüU <ŠD Ÿ¿Uràp¹ÇÜ”LÐHùÐd}¡²÷Òò¿{¿®{g¡mÀëö‹fbYâ˜NjÁG9ÖÜê¹²€„Cñ šÍ±rÞnî¿v¥=Ônÿ¾@ç>8A=9VqË«[™Kå.Ò ·ØÇꓘŸu„õgÁJï÷ÿv ßåjW}NÅØZ Ã.! ì…1~àNå*Ô?’漎K‡1ºw‹‘œËk35e2:ÚùÇT]ž –*À-³&Ÿ5[0<Ù.µML©Ì€ÇÿšYÝ’›D× iÕc©Á1úµÂX¸Ã;Ùl¢"ÝÇáÉ{Á®6QŽrsõwI¢·£Ïéö1™¤n›¬íp ¹´ÖvöXЋ4Ûptr©“N°0j6yA´%šÃ#b>Ù Ð]Íþ±®­¯ ˆ»˜<íI×…\©í6óÒJVˆå+4+¢›UØ© >Ò¦ z? íÜOp¬ÚP‡;fŒœšˆHJSwè~LÉsòÏ2x^ŽJÙ«Òñ1X;yŠêZi¸#ôÖÌ)æÕ<Ö³Ä -,ꋲÛ‚ñä)æsŸë—Ÿ7¥}QØïftþ²>Š¥-NÔ n–$Úæê (’óÐ%W-ú1=6_¸Ë©pŽáûz© SÌpÁ¯ÏNœE|$",=ÿ› Æ å”GÿLÝŸ®X VÿèÈ¡o©”þsCOó©—®Øbí¨ã¿p¿JÊ:{¡ÔáÃ|)#Ó…g>5¬xeã‰ÏzJËfŸælèUfÛy{N¡ˆà1x{²»‡Ä~Šø+ââdÆ>z]{²{¤@-R@JÖv])õ„)³x?ÊCDJ79—0Û9},Oð¿ýê·(ãe@¥xYã£ÅMkíwøñiµová;2ôã5‡;Ý7%HÅÎí­BîïLø´Zí&æ$ŒZM´‡âùðüÕ,!€oTÑ^4í¢v¦ä×%çqÅ\¤ÄfD׿n¶tîésÒü.}èû®Þz¡Ý­¼µRgÙLºá[2>>‘í©ú;½Ñ LèiÄaÌäm%£ÿ#  t1½keÖð™ ¾5‘ ¹­ðÊb3¦Vo‡ºÙŒZ0‹¸&¦hçº5ÒQå7mU¢|zG5QëÖv†Y#K£U14;!Á¸¾…l‹~FYd‰)'}j¿õM©¢ )¨]tËŶW¬à·Ãh^žk)üä¸,Ýf"cମ&ˆÍ,$9ƒVñ:N¤ßBá`yÑæºsçúS}}=ðŽ?PÒÃéÛ‹Ÿ†ãøÁ¤ü«Uw ñT©Y4Bw_gé” (‡7vŒ‡I¯þ SçÞÁµ`¯Ï*¹ƽ½3G•]@!g_H¾Úæ)f‘¦{<\¤û¡¹+Un¨D÷yñFH¡gd]/ü[òX!ö±¡Ó’•V8èâÍf\H9±C {uè~8sÀÀ¸‡Qdï‡Ã¬¿J ¶=’ÙåDIK ƒÁ¼YW¿^íÝãì–ËÍÁ‚d‚ŃXCy?ñiK[ªl¥Ni²‡³ CúhÅ'²MBQ•ûð¨Ü 4ËžGyÏà9YêæÿŒ9Y‘5ËçPØAî-sì› ·tMÕŠþÖ(ä¹x·¿Pk9™kî™ÝcîWI@)d.ÖY •[¾ÅÔ€g²^[+@йA•ÒÇ%°ßø8¯ve‚Xä¡aºéÐå-K0'Œ¯ZH'¹Ð5K/NbúÆJ:#ÁûàŸŸiµ†Å@Ä£‰t­+™ä)lÉÓqE‰ãL²žßÛìkÐÓs8Ï‘HøöDü‰àìT¡ õ£OÚóZ´²”ª­?^ ‘ÀX}Qò”IT@Á4®6$ß¼2m©ÀnŠüþÌ·®äÆù‚ië(û‹kiƒNtzÇÅß O?<Hæð“}c 2CÍQ÷ß 3ÙþAÕA¯‡pù0¶bÞ€8ËùÿüHÎêÝ6‘È:O䇻AJ=ëš¶íSªÒšædÞ%=ž‚…í¾ UDÄ6tŽ‹¦Ü:*‰ûJ߻ב·¶’ @ËsRA¢­±“CÄnÿ”ûä\$~rf<®¡éÖ ½#JæQB~9–¶Ö1ªÆâjÒACyÄ'?ÉàÛÖˆ·äw÷:Áî)Œ¤Ö› ¹W—Axÿ((T&Fc”ƱMµòp”º§3¤5­¨1tiÆx‰z{|ù=ín²Ìmî/#¡Ù”{-«÷F:³ ÷¹n%i´ØX_v£ge¹­Û À½Á™ý¶Kãµ²uáÍ=p»Í£è†øòs§Û¤à*ï×5ï{}$ŠÞÝ"9Ó#Ë•CC¯Í«#™ï‹U—g¯VÿuÞ±mWEÁ*à‡2¸äA×ðuíßêiüN8´òËFídTò‡Á ¿Pf¢ÞúìÁ•áj?1ÑIÃÌð‡9:')£õ•‰ “iÎA%¹6öŒ÷>ycˆ›d°P?à çW4WžïÇɺbý‘o|ˆ/ÓžOs©-›šv0æÍȸ& uþØ¿2 ³3P2„_\‰.Â¥MKCÉ·&×Mââ´þ#»´ÿÈTfÿΖ|÷I,êStß?–@@Ðv\Õ©Âí?E{‹"ý—JÞÇQ’ËmžòŽÄWaБÊrâÈCs4sÌ£-4έ:Í1½žÁiŸ·ü0žj>‡ &ý‘8Ù`WH‹ñº Ü1ø”ûPÜÑÒè“ßî zŽABWˆL.šÑã5ç.1º_¥ ðJ§'Î »äAh E²¥$¨+wJ~Wº‚{zVM¿ÿ׊éFjêÖWb—%9¶9æØâØ2t·ÌÀf?¬Û0×äºä6ñÈèØ˜8꓃âCd¬ëaÖ*½œYÓ"=šš7Ò܃‰ûiËÝËlÚÐkf,b² y¤¹XK¾‰±mɬ7.¦cuÕ¾öŠ*7IPu•½i`Í7Ï<^8Anx èáôÏË_Ƀd{¾¾‹‘Á¥Íé[ªr ÈàZ4ÒbWÑÕŽ’ÎiA‘ÙÁÓôÃãø:ú=¦lІÓL†³ý’Ž‚ß;—ݼÿØ9!Ù‡ì€ÙF¦ÁBg:ðëÇPc„sÌ5ÍÀt‰DÙ^ëÝ¥ˆ¢à,g>„®'˜ü†>ú•’½ˆ>Hbº™éhÇl<Š,õ±Ý¤Ù ä%á(>DYužÆº=„ÿ­³wa}’Õ2Ú|]·§ÎÓ/£öÐ00ˆ¸<2åx:ƒ×.½*\w²„«=6M ¥›PVhT‡vjcÛ’nþ~°¯Î&ŒÁÑ%†Ž“BUo@wÆC‰by*t Ê5¬öÚ»Wá¾Y¡:z»¾¨ˆÃòWË Õô<Ô(ÐëFö°ÀÆYv¯ 8ð¾ÙUôvüg4_Ê­ xþŽì°pX)²tÕrè:zw—SÏ^.r9úHl4)ɦo¦ú.EÆK}ÒG2óÕvÐ@"KõÐø¶5M<±kŶ—+ªŒEæÓ•Q«Z¬ÅCä·ñLÒÆé3<ÉHQÁ+&Yû¥"ùTÓçL{n™ ⳟfOJÐÑvìÍö’)ê{;¤ŽÃ{ö6|ÃÄG';I¦4!›eȯ‚–"ܘlÁ1Vâ{R™¦05@Öÿ§èÒ!?ÆY‚~c–|èq 7²[³IsEáä<=äþå>Ø–'¡ª‹2‘ÝÔÇ}ª´šM›ˆê‹GÿºS@'Ÿ[¼Û$/Ì2Pá-œÏªtë`kÌès7`j W…KÃòIdSá9zØÉ­Ãó?§lËòðY£ aúøl æ/q,nÍb$Pøl!™Ë²ÞhŠõíWdâR/yzÝv•Ã>³o·egQBýæÆÂùsÜ+Fφg)Bxžßy>ž6× àרžsp| ‰‘ºÕÁNÏ3ZCÓVy'm$bl/–;ì!ÈfATº)í&üà‰…JhÚ+ú.á}J}ðÝ÷§û­‚w­îu´Îe–r¯Ž_ bdW¶?„hŠÚãˆÿdQü“Ë|¯¢Oׄmb¾o²ušÄÍØŒ“ù(o˜ó˜Í 6ðœ3¨zÍ^°nÄÞ…ÍÚ³Õî(‡c¨@¨¿öÀ¥—ëî ²ýÎþÁ8Ò—CJï–‘)_¿¡@‘‡È(Ø ¨žðVê`cÀjØ©8‰TœÿMÝ÷Å/93†šÜäÆ}<°²ýǛ æ5¯Bäë ËX÷8ÎüHTzï%ÞWÊ .»}oãÇD–ÿª å(eñ»­"ô£8Ѝð,\©è‡ëàÍÂûZy[Aj“6ØŒåÏ…fDoç¹æˆyË’É7i†ÑpmàEØZA®Jн&ÓiòϪe€_1¢3‰ç3!(ë7§­Â±_S)î­ÚëKâ`5n4ŒŽ^g¡JqÊ´§šg™ãœ×¨,';.%§E}E»dS/hy&sÌBˆ8È¢A즖žNÌ“e71ò;Ó°&héë¸ÒPw^Íf³.ªæ‡÷ÏXVúQqÿ!æFõÅÒ%™…R›lõ8p‡™‰\$æKIz ãLì“avŒ•9:ÍßwH¹÷ªYšÅ…îA_ÉŒÖfÕ:Ã… @¦rë_DÚÖ”. ]é¥mõ¦dFy‹Îø‚páé"ahåaØ.1s²Ãù7½!®\AIkÆ÷Ûâ¾f¢MÂûЛ&ÏT\¥Éz­=-OO:À µž›o¦&_„Ä ¾| ŠøÓòcGìNFE–&ý ò€ XL7 V±ºÈÕÔ̵/c?°å|{«nÇqpsÈÐ#aÜМ—usɾSýÔ'¾ùýz¦õ3ÓÀ¸ut‰ÁaÙšgÄ¥Ö]›}_‘Ï¥”"€3yÿ9ˆï¢ºÉ©9S /Z£yá׬Ã+Pר‡± [ËJ‰¢ýR¨'\ÛûJï‡ÀV„Î:n!ÌnN8"n¸ð,$ø¥È%•ì ú¾ƒ9¡:¡t€Is̡֯¨³,rÝ\>àzÇŽ·œ.@‚² íé|¶:H±ñì+Puo?öÄ#²`¯÷S21Š…QŸ€OVÕ¬U=ëýÞ*6ŽÀ‚ךָ;Qjè®I’¸Oü“ÍÌœŸy!Œ§æŸb91aéúåÊ,3ÛmÉ žûË}Õü(Ù.4™ÔÕmaF¡\¨E TkÞHß³IžÆ|•/—’«-;Âi)WÆ#|¢ uˆÃœw¡Ü¿¿ Ì´P¯³$Ù]ŽÉ4ƒ ­gN‡ý«]Uò¿$‰¡b6õ¥Ì˜4ŸL\|°±,*×íÊ8j7+ 4eນº`÷ßë¥[‘I—Þ*]G™ £PWIAEŒ ©qsþ$8tÍÒ²@›ÝZpl@§‘àKcÞ’Èì3MÏé|Ý‹t1þžûwáä ºÞ»’Ñ£°Ú¬r©³US#â” ;ígàú¾\.ŒdϦ‰Qu°a×o/ý–0BsS_=¨­ñ„G—¥~Áž´O ú©Ï¼ ÙT{ê^û ËÄ250MbA”G“§à“ à~a]˜à&°9?CEŠìB†+" Z’ÌÛ'Xsº×6ñu¤ªbæ÷(ä ~­—7ù®¹LCÿ‰LÍyÎ=då (FñZÞaSžw\u&}£ÁOÒ¸ö1òóïöVÄYYBÓÈ”±FŸ•&WóËçY¹F²ï[Gê‹Y~Ìu‡dGínZ\+èÌ©2#Ó»BÆ ê¸)¤ê^×°H}×GÞÓz™—,Ä¡TƒåF§D,œ^=>ÄtŒ~¦´EXA•G¯x$ˆ­2 å1S<YGŒz¯³ú—Û!3—ÄÃÂѦvkK8yý§ʬ–ŠÔÃЫ÷mã§;©jõ îÁÙó7„bÝp[ÏŠV_sÇÇp¨'ËÿA&nuFÈSn;çNYˆó¢÷¹BQWaÑ@¦/±v˜_ÔIUþ”DmvI ü…z~NNšÈDP¹L±tµ§KòØwœE˜w)"ãd¦)žï1¥ÁïëJ¦eǬ ½àœ€JÏœgZ•ú?V=qAþΫ˗ñÜKÈa"\ð_g\íSHöFµ&0.¾t·ß$øMT¸k\ÐÊ}o\g \mH©qñBi•É9Æf4D™³ÝOËAz~ÐíýúÓõ¿C-»m¼ëòŸ£yËJ-ð› =ùl0#5†;F†ê¸¼ä0zçGó^A¨ŽóO&ù–ÐNhcñã–>·~[+«ÏÛ0Õ)›†L Žë|¶iIØmà®™SÜŒålm '­ ³r~y¦ýkŽn{s™³¿ÆŒF97|’’ä¯ÙÍòŒ¶m\Á¦8^ˆ÷]¯æy0uªG<â ÙBºhÝBQ½z>ÿÚ¤Ÿ~`S‹ˆžm¬4Az2¦Žžµì µŽl÷µ_Dw?m‰ìç;jA4¼ãÉ l ÁΤÇ|,_cG{ÌúåU¶£Ô_óp©Ÿÿò¥=€X$%Ê7Åù¨%í× ìÌK¤­&0ñ;†øˆ+„ÑEV@¸º±†Ê…Ê„]g d†¥2õ‘ô¯hi¯d¸„<~f¬V«—7/F¨sDã/E†Ò#öê,›½{Ò¼Ï ‰ ²ñK¦ºùáªãâV/*±=á eÉBm~&y&x솗›?þ(kšs¯p»?_IÕézhJïe™Ñ ¦Îg–· ¶¡Ü ¤ª'ËeÕþ”hS3*.ö½20ü©¶Á ôî£çÞܧ¥æîÙ•\÷BH‹,ûÑ™V¢ÿ‰Ã³Ý·f,ßô¸ëà+¯²¸»j«Oc’”ô³J[Ѩü#^ `aÿ=v^$Ÿð1çrK¸pìàu‰ÑO‘|Ãï[+z÷ÅN±i"w³l}“ߨ#i„—Á2¶´Á´H a}¿ä{}2"£ ø È (~Ë‘ö•RR¢AÝ`›` ïž;‹ ^2’”™¡§Î‰ØØÑfÀ0î’dO@.ªË&0ÖÊ‚ùý¾°S¸ªñ™ƒÿšôO!$éTQCªÖ*¹~ˆ´ÆÃä?Snµºr<ü‘!UÉIQ·€¸ ¢©_VžšoY>ÊÛÖ¾çG®ð¢ž>µå­¸š¾ä²½xÀ”®Ô¢>´wrí^«N·ZìF݉kªxzº`ÿ˯mÊMxs5Êd “¿ O•)KøÔ­!¬ŒkÏ1‚r4V¤Ý)PÄòÂ00E\ˬƽß°>’ÔÎÉýVÿ…Y‰GŠ‹茂‰|3"X8¤ÿ±Ò"AþsÙóðÎûzÈ™¬ÿÉ;Š—zتPÚìÑBš¢¼ä|_Pü]cŽ..ó&.!s-e!Ãîb2”µ8®@yb}g„¸v0é:BSì4¢z3úÖÔZ¯ÌRËg!]“ž#øÉا‚Š –MaAa•­k–wyaëîÿ‡‘ì,y íJKo :îWP’§ðz¥àúL÷bÏ®˜ÇìzQ!“[!£Qe£}°Óh.Uùõ#}‘`u® ®-JS|r˜>ÜÅâBcëQ¢"Ú1ž¾¹K’í}ÿ@«á‚Âé™§FDÈŠ ¡«Ødbþ«ºãd%âÊõøñ--…ºXl–T£rO„ÜòDŽ)?p¡zß)®¡€ŒŽ@ŧ׸¢±Ô É…ˆ€³|ñ~MØÇTaîj"™#M‡è?ßb¹_ç[y@L2X$(Œ¬ˆŠgæ²%ÄfOaa%ç Žþ„ðh»"'C@Ðç«Âc5¡çñùqi±éL•3ÐM!¥ó‰­8­ý÷[kƒz y¼RÖèð”²Y?úÉÇ¥Š”‰€rU˜‹vñ·Jm«¶µì%¯…·¢™nP°#¸µ÷ßdùúM<°³¸‡T"pØÝßïØš^G’€J iþº6ˆvX\:„›†C»êRÿµÊ¨ãЉMÜ™$ÕW©¤Ùs3,kô…°ËGòRaÓe?à&’Cbî´¡›ð¡„üJ²:êFB%Ñè§µ¿oËé Ð&†VL±”8еc˜¢ÐTïíD.â fì‹Ù¬H¶7€PÔ¤¢_ º{ ãïY+,1taMèñF™“^Aø‘ó?…`«÷Јݼ^ÑlP<µÿa ²9Kš›’C᎔ïûÔ4Õa†IðÇÍ¡¬ò×!÷ðcyRc®0(Ômv èf‰”I¶Þ¼•ÄE;‰L;%->î¼´!—X¦Eä;D`»¦Ÿ;Zá›Ù±—úN! Öc$™7:¡±Åÿ°úÁÌ÷_i‰wÛú¹Î0‘S†g¬‹8Ø0™Ê<í¹gåu£Át‚a92üQÈY•T‹I” ¾¨'ÄÐÕ’8¦‡1OêÛ¡RÏc_Sž/[ë¿‹Þ‘pŽàS!šf@c3‡«'táØK®gñº4û½óXùb»•5M”,z V{ S¨@OÑÖ.™Wm„¯*ß› 6U!¥DçB,ûx1öEîÚò\ï²,² @íúÅd1 ñÍ!xóÏhÙy±Å }‘ÙP¬XJèIø>ðžìÒp%~² “d4V¡ç–§N/\µÿÝZñxLIjŽtŠÌÍÈdâ‚R>MpÖeÖ›k¢;H›úÍš–`Uú Ì|ö·ë=‡sį u1ûsb…Aä8t’Ç@-š¸À‚î‡õ¸wwB‹U…³- ËyqNЬï£è¶?ÕÄcƒ«†4äÿÍS¬ëzˆ~smd fvRiÔ(m÷ÆÖÁôBžÍSç°ÑSÇê­R{›Á†¡N]1€³Â…wÃr5¿ûa¸~B‰R&cž'$y§q¬36E–tïk­ÙD ŽònëDGªâýÅè¡\Aµâ‚Iâ;ÄŸF$¢,¨ Dí¢ÒG"±…ŽÛû •'ë„Hë û¨Øù0ç‹CîKQŒOÞ ¸1Š™5 ý[›ŸýéìÄZ:ÏéRóÐ#êŒWÁÃüó¯¢ü\zþùÁxp”ô}_‡@êgŸxœ‹NPÙ € òàg@øZL¤H»Ä¤_©+§èîë‚࣑-ôØ@y=“ IbÝ\§ÒÍ‘œÙ%ÕÝûF U¤q¡™ëû“jpû†ŽvÄ·ýmõ0Üç?VC?·%Ô–bË£vÕÔk+®ÖÖzhD¨+'Š2Ü`1¾ùn­â•¾ ¨D“iN˜å9nçrœ-hÉ3/#p¯Ug{±ýºò4ûìÛëÎBC݆҂—÷”¬œ ê–g¡‰ŠÍ‘™^´P¼ h¬¥QÌÙèˆE2Ö†Âe%K/@’NGl·´%k¦Þä_P i1[9.v9€¾æ’d{=ÇV'³µn¬£a¯Ãüôà¼ØŠc£`ùXÇð 0oç?–œÜYØó_.6·8º‰õLB›ÑQ$ó&r<ü¦._Yµ!7™ŽõÞ¢ILp€äÇarÔ¾æR(ƒ}Ã1x 1UÌ4"¹;Î9YsBØ?Ë¥¯¢¦øü¶øgß#_×v©vœgú(ÊqÆnG÷UVñõü[*»HMÀÊaŽjSî'缨Á¡N Ã­ÔøgÞp:v8C¤BUýéÛ7ò¡ŒîV\V`»úëdõ¾QCf×ï¡øAÒÖĦN¶#?cÛéyìXÎÐYáil vCPmÓ´ßL,Òwfü7LŒÔ%TùþY/{e}ŒM…°…š}œd‘» å7#•:ij‰H`80 }²UÛqI,¼Œ.õŸÂÔˆå8i±}6Ä7üU/¤cqŒVƒ½Ø€ùA;2±dÑZã¢r¬pú?÷Ú“ñM´ÄÁ)ûˆØ«k~?Ž—y¯²¶Ñߘ•Ò`õ!žÕq›”WòUú.Ìx¤jp$•TÏϨ>ŸŸìxúêí¾[á».ŒAÑêQüm̘JWêeÊh@±*å–Lä[…/1óÙFüªí{¥à©Þ"ÍÕhQ«ñRÏvÝ=÷™÷§ Îbœœ@ŽÆ]‚^ ÁóÎÝÄèsêäEŽJW‹¶äÞYÈ[“Ó>Â>máÅÛêýXþ.ɫ㠷¹@Òf' òÀI»èl$ ¿ ëÌÌÝ_ ^Â~umqîP´»+ŽçAr0BíÒ`¹6Ω|·×]ŰûÎ)³%ÿãb@pâÊœ*üöfƒ1“ÁTh­”N 9'ɈÑ…/b¸×(UÈÊ®Çá'nïw¹ßUÀ™$Ç}NÕUºAÝŽ"Xâ 'ÔC¾ˆhûrŒlñé=ÝGµÛvbÉ;¶4¯ç;aÞ˜i£Ÿ^¬c â£]2Ú'›úD’àÑÄÉ]nŽ^$}÷’Øv¢,¬tŒEî ž¤¿R¢DFwÏò×h€þhúV‚¿¢ë5ºðcE²o²xGœ‹_Új¸žAjÖz ¼ºV›FÙ è t¬ï<ÄðäÎä÷lvkØ–ðµ´£“=7O×ö´óo^m·êuºº.‡OÆc‡ï$\&/À>5o;@Q —yæãø^»¶y`b°Iuï4Öì£ÉoÓPºy*I°²Xf²è7úEN¢»×á…Ôw‘o;¾¶¬Üö B|Ľ*8×m¯ô¦ð…²)öÞÞe/ÞD±p§=GŽh¾´ Úeù¬Èµ°Ø¿L+—JtâÓ}ÈžèÒtPmA2Õ“¾ 8–ˆL‘‰ŽáÓ”¾Þü@ ´ÁĉóÇçìl ,1ët+ÏøÕjwŽz#él ~Ä PS©ËNØÐaìiææà¿qïÖ àÿ ÌÁ˜8x]0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2099 0 obj 14775 endobj 2100 0 obj 1786 endobj 2101 0 obj 12457 endobj 2102 0 obj 532 endobj 2103 0 obj /DUKMHY+CMBX10 endobj 2104 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName 2103 0 R /ItalicAngle 0 /StemV 114 /XHeight 444 /FontBBox [ -301 -250 1164 946 ] /Flags 4 /CharSet (/ff/fi/parenleft/parenright/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/W/X/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash) /FontFile 2098 0 R >> endobj 382 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2105 0 R /BaseFont 2111 0 R /FontDescriptor 2112 0 R >> endobj 2105 0 obj [ 683 903 844 756 728 814 786 844 786 844 786 553 553 319 319 524 302 424 553 553 553 553 553 814 494 916 736 824 636 975 1092 844 319 319 553 903 553 903 844 319 436 436 553 844 319 378 319 553 553 553 553 553 553 553 553 553 553 553 319 319 844 844 844 524 844 814 771 786 829 742 713 851 814 406 567 843 683 989 814 844 742 844 800 611 786 814 814 1106 814 814 669 319 553 319 553 319 319 613 580 591 624 558 536 641 613 302 424 636 513 747 613 636 558 636 602 458 591 613 613 836 613 613 502 553 1106 553 553 553 ] endobj 2106 0 obj << /Length 2107 0 R /Length1 2108 0 R /Length2 2109 0 R /Length3 2110 0 R >> stream %!PS-AdobeFont-1.1: CMCSC10 1.0 %%CreationDate: 1991 Aug 18 17:46:49 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMCSC10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /AJLCAA+CMCSC10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 66 /B put dup 77 /M put dup 82 /R put dup 97 /a put dup 101 /e put dup 105 /i put dup 110 /n put dup 114 /r put dup 122 /z put readonly def /FontBBox{14 -250 1077 750}readonly def /UniqueID 5000772 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª)s™§„̾…´™;.ëÞ;Ôr·ÏTeò…ji«–íK­/df5à¶A|Ç{S/…ØÇ )¡šSïcë\^ÈŸÆÂm‰çÙäp·+ïÚ#õßv¾¯Lé17¢íŠ©×Öýó~kÍàÙ ˜d#å– ]Ÿ»L•eVèßËúìGo£oÙ¥È\šõþÙÂÝÒkÜ ™9‹ŸMÕ™=ü 0)xfáÍ 0ëv“7ϱ9 ¥ÀàE(O&k¡{ä‡Ç›”úÆÖHF„ſꇼÌwÔ ÑR^•ãq&AŽÔ›hF‹8¡NˆæŠ&{˜o—i¥¯¼(^[ެŸ’ol WÙÃ%®'5,Ù.V‰à!0‰½&¥äu%ËŽ«ªKx¡Zê4pX‰«:ÿ¸•;[4‚å+ú @c ߌ Â}s$)žé€èPòͶ'–/CÕ¦xÄBCÍéxS½Æ«Eý\ ­'M¯‰’ŸX<ÉÌÂK߯‹’U«¥òm-Æ|poq•wÖZçF¦ 0@æË$¹Í­‡®8¢ûðä«Ò§@ñçù]ÈÊPËØp-ŽVÐÙ/vÎ R«Û‘ã$8Ò»óæ¤ {_»CxÊÆí)–÷`mÉbÄýâÿ2'‚ÃCßDÎÅÿ¥\c é® Vsup“ýͰÎÔŒýž C ìq6 ¾ 2T‰1ûe|jÔ²H*} t—‰.ž”-õŽˆÊðÈ"ók÷Ä5¿,h:J.ôËèX ¨­4†Z@0ºv)FÞöžÊE–ÖäÊ«ø@‘"©jKÇŠÐrþ·Y¦ŠD¾dc‹m•!Gî~,ìöf\ÛHÖA«Ó®´hc†éc”¹ç¾ÑÑ>SK‰}¹¦ìpkªàkâþÿúRX>›LÒÓfU—8dWNb‘䊌b ?g›~Ø8o|½R<)Cì©”ÊÎcÓp}‰Ò% :myÿM·ÕÄM>í­C‡ªfqupа¬üYŠí‡~}‡wȇôM³ŠN¼Pþ-V)útø`3<6]-‚û+‹Iå‰twQÜKÃ]-¯›®3#}ÈZꜰ£²JÊì P5ˆ-öHn}³Eœ](}0—Òš5Ï·rMÕÅ÷ÕÛÆ3«¢'ÜÁà­öMo¡Œ÷%¹SRK-+ù«jsËÏ$³@èl°P¾Õ»‰Ù”µ‡Ë5æ-δs=ŠD:‰nÚi !ü†‘ª\EücBõ~qÅñà&9[­D‘%•Yy¨'$†5t׿h£Q™5ýѺÒTlžÔ„µR%oLÀ?k4iFMªš£"Rô{|i£¤Ê~_ ×εṴ̂ù—ÛHÖxCùþÉcJ¡o>Ūô¹wˆØ$èh…´ÊÕš¸F¶×ÄÖ«5…€7©xφë8‰á"ê tgŸ0EÛ3ø‘ÀSª —}éPýÜ×ZFéçîÎ#ɸ)<ëx ,åÍæWS»È55&´ù?ÕsÖ϶]_ˆÅ#ïåå[CÚÄ› ë«Ç"„rrõb"ì“É*Ï|pg޾¸˜žT?¥ "Ç^å–˜gFì_‡Nsw¶V"üDõ€¢˜Ft÷lÍ©Ô× 6sÏíó´ýR ؤ¹Þ&,˜„¬,Ú®JµvñhU`ô ˆ®«JMí²$Ï–eKAôCvÚû–MªèYw¦ßú¢„„G{I#ϤËçñBnÛ1±”I+6ô“êœe¼a·d´É¶~C>«þ]çœÚEÄš—vöT:.„hÕj»¯?l²¸ãVGºkÚRYI(‰Í˹CdZ3 Œ YºIc ×Lp ¯sýð²ÏÈå[rÃ7¸7®\ªPý÷*ÅPß® V+‘×·A2õU­œrئŠ"Ålûk æH²D‚¦E !&a¾iqVjì·x5Ùøa£~@e!Ðj÷ýáö·§®zºÔ¨)‚ŸÐà ´R3¾··½ 6delt¤{+æêz€ù¾¹Á-|ИƒX¤Wð[CÎÊF„5‰Û å `Å(Út¶Ž"Ì•P´wq,¨Ã*cþ”ÆÑ®‰!_F½¡d|ê©ìú\óC%J¢ˆpø9mÿz<’ðáÈ3õ%~aW¤}?+–Ø¡žså'†wËp*S¾ÿ04Cî´’cû¶Òn%=áuú¨d2Kúåá±"úÈôäŸ*?OÑÏ6üœãåÛ>†(bkÛWùR'ì~ÛÚ$«£µÿ ¹ÕfEÊân¿Ô¤2þ½åÜ„§zÀƒÿsC¼¬Ææ "<•[6µïû©Û™"ñÎÁÞ uMÍ[ˆ¢ïçŽ8‡-•1N¹ Ib<Å?½µWí! 癦!­ì£¢¿êºK<%:ijϬ‰„KSÈh@—ówí!–=#ÈÂg˽¿¢Ã¿å¢æš…!1¼.‰$í囚S£‚PÄ>ÃÔ‘Œ ¼Å‚Ò'úhIó!ÃhºJže[ yhlGO à4ë>ùª¨‰áÅ' {ݤà‡§Aæ¹0ÔœO£Páè²[~àA±Ãd ûÞW‘‚ô‹ö[}Òj Øü|ú-Š¿ä#L²+V†çÉ)KC¸§¡æÀâÔÌßC9b¦,ãpdˆsýu ]yÚo[¯t”†·–÷:×ÊõT8¼d =ã•Í*åX£G„1Ö->þK¹ BÜ¿Úx'\6Wñ ú©ë4Ͼ9#Fœ 㺼â.6Öaè51´Rø´S^¸ðw ãP0E­:4!hQׯøy+¸Šî ]G¨EKO”ÝFH¾Ôò™¸óßžu;¥)Lî'§‰…•$øõq¦yUØB“§ú%V+:úýŸiÃVº°ßÑväáØ5§ÊË‚5¬‹€hpWoX˜CC‰[O[Éî«3Nª1R£}e:gàŽÒ£dæ[Å&~©0¬ºIvRݘt**®o°4ÏÍÒÛ×ÌÏi$,ÀjKœó¦{vôEG oZ‘93iœ&Cëã˜x®±r­yyßÊæË(û¡²`;æ] "Ý‚D¨W•üï!I)¹!H \ 5‰¹–ÜM;XÄÂ9SRH4´0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2107 0 obj 3893 endobj 2108 0 obj 880 endobj 2109 0 obj 2481 endobj 2110 0 obj 532 endobj 2111 0 obj /AJLCAA+CMCSC10 endobj 2112 0 obj << /Ascent 514 /CapHeight 683 /Descent -144 /FontName 2111 0 R /ItalicAngle 0 /StemV 72 /XHeight 431 /FontBBox [ 14 -250 1077 750 ] /Flags 4 /CharSet (/B/M/R/a/e/i/n/r/z) /FontFile 2106 0 R >> endobj 381 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2113 0 R /BaseFont 2119 0 R /FontDescriptor 2120 0 R >> endobj 2113 0 obj [ 612 816 762 680 653 734 707 762 707 762 707 571 544 544 816 816 272 299 490 490 490 490 490 793 435 490 707 762 490 884 993 762 272 272 490 816 490 816 762 272 381 381 490 762 272 326 272 490 490 490 490 490 490 490 490 490 490 490 272 272 272 762 462 462 762 734 693 707 748 666 639 768 734 353 503 761 612 897 734 762 666 762 721 544 707 734 734 1006 734 734 598 272 490 272 490 272 272 490 544 435 544 435 299 490 544 272 299 517 272 816 544 490 544 517 381 386 381 544 517 707 517 517 435 490 979 490 490 490 ] endobj 2114 0 obj << /Length 2115 0 R /Length1 2116 0 R /Length2 2117 0 R /Length3 2118 0 R >> stream %!PS-AdobeFont-1.1: CMSL12 1.0 %%CreationDate: 1991 Aug 20 16:40:41 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSL12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -9.46 def /isFixedPitch false def end readonly def /FontName /CNILPA+CMSL12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 44 /comma put dup 46 /period put dup 48 /zero put dup 49 /one put dup 50 /two put dup 53 /five put dup 56 /eight put dup 77 /M put dup 86 /V put dup 97 /a put dup 101 /e put dup 105 /i put dup 110 /n put dup 111 /o put dup 114 /r put dup 115 /s put dup 123 /endash put readonly def /FontBBox{-56 -251 1102 750}readonly def /UniqueID 5000799 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª)s™§„̾…´™;.ëÞ;Ôr·ÏTeò…ji«–íK­/df5à¶A|Ç{S/…ØÇ )¡šSïcë\^ÈŸÆÂm‰çÙäp·+ïÚ#õßv¾¯Lé17¢íŠ©×Öýó~kÍàÙ ˜d#å– ]Ÿ»L•eVèßËúìGo£oÙ¥È\šõþÙÂÝÒkÜ ™9‹ŸMÖ¨ð[G¯•ï(©ÅaÛܘÄ|õUûÑÎ÷8ï¸ékKaÙÁ¢O_Ⲟøž¤2 Ëã"«’nºÚ¬ýÅxG@˜*Ü–¿ß5†øÁ.onX‹D"mˇÞü3ÍÇ9ÎBóÍ9X¡Úg#£¿àüjÎ8•i`à¢ø!›Ê0µfšnôŽOÃ+¼ÃÊ|ÂÇa]¬ÇqåŸÜº0óI²¾ôìkE]#½îÆi³¿RX…{”+÷$`Œº¨7Ë’¤r¸”!ÔºbHÔô÷ªÚNî´³ÕzL/A·æiš§MŸGC¬h ¡‹V{½Š+ÌêÁy\ËQˆÇ|['ßñXYAÍ&—1”xžÙµ'‘6¨¹ÐÙ—ž^€ùZ"8Q¼àë¹OÚèó/è‰wMrúáyõ¯98Tû©ssKÊåMÓ=ê0±¼ª’ÙkÛÆ®•ã`:Ú ²¥*Ýù5þê§YQ]ó&ˆÐé[7Î#éôZErv‹«tdØ¡¿{ïíþÄärogŒ^/na¯žZ]m¸Vå8SX‰öÃa¤šl6œ&€ËvšU@Õ¦$)ÚîN*õ—Á-¯7³Úëfº”)˜­Ýcß:ë/ÄÃC:êüÕÒá»#ÄDÔg•J“×1uB=¢uH¾‡¨Í¦Gæk]‡êmÊhˆÇö¡óƒÒpÁ1(µãõrÊsÄTòíùÕþåèÈâ_F ÁÑÅn‚ܸr–û>Ý|×3 ™©ûwÝCÌfE¾$Ð*Î+úK½¶†1â÷Ù`¿[W¾/EöFqn³=xŒˆßw!ôÓôí°=<&h·ã„ ¥«[;{0+¯‘£Ž?±nIG;Ъ}üo…ÞóÇ8Ë÷Ø`búg–ÁÌX¨O4j+ElýŸ¹Z]ÿ¼ÃÈ«g«ñ.™rn- [é`Sr8‡ï?Ë%M›™÷ò*%mà‘©ÆçùJ}ÚÔH©X-¿ 'f÷Å »s´ ÜàXXŸ–p°–MÀ0 µ.ºæ}+›kͶYûÆÚÛ’EØ&nð6k•‰‚-;OÖ‚¹€vÙæYÛôjTkˆ}ƒø ðU×@ˆ"ˆMhzpP,¥Ø_åw‘ë†0Æz2ý™gz~ï=òÂ&]àîõ[›Ð+¬[A¿§!¶ÛZõØ_S$Ôø£‹ •yþ~X¶ ­)eGhÐÙûbW§"!–RºµN¸®NªŸºÀQܱMM1ÆýÔ¾Žÿþɉ#Ò.6I[ Y06ݰPÑ.×.žË_ ƒŒªsp®×B òW–t@Â÷B˜þ•üJ¾™'yÑO·[ku’úó,dmÚa‚31Ñ¿îbÖ õ®X";pVb…Sy6øÓ¡Ö›:0Ge7Zsoð!E”#6}îµ< ¯¨øã ØíÒ—œ®£G”мÁ²ÂQ™6> œ0S%B,1Ÿ¶òåkðY<$ðÉÔÂÀA„iIèìù¬¢˜?cÕ#/Áy¸˜Ë ¾³r¾ê‹:ˆÕ…ìÏA—ü4[é½úþA ÃL¾U.°:H)Íú2ÃÓú’k7LOÙÓ*Ó8ÚV²XÆÌÃtT÷¯ö¸¨h½åÿCƒ^×M—÷šÈHK‚É®úÿéæÉô£oqM& ËëÒ´ç±¾©m©tv"«þìÎêøÎ=j:®Å=§Èð(Û[QöÞr}èvEµ¯útbÓ%Œ“y¸ï—y›z­³ @¨,k Êþ…¨d|æ{°uúˆ04èdmÑJy¶žŠVÏ®#ÓàÝ7/ü…­ÔŽ¡¸r¢”m«5†Ó̽{}ü!+Í.€1I†r—-œe‰®x‰UnGn?§b8•–kåÓÝkÖA½¤/ ¦ŸTØ&ÝL¼ƒº¼rQþö€ÚkŸWò€{dß’(Ì¡q* ÙyÝ%:Or{–I,yž_?Îd´ŽlGQý7ëâäA³ÖÍÖbÂy *…PÊ]:‚Mq¯*«"¿‘]¸)>$&Ÿ†ëI±âj«€Œ{Ñý«‘óé|ÏË ã7ê<¶¶ù•Éi«ñpĆÑñÔVÇB`Võ1±üGyõÞÁå¯KÜCITþÂcok»Ï³ç&0[yš ÐMpN|{½1?ÉzP—O~ñþÕZñ#ÞÎâ\O<½ Æ5ÔCšº=ºhYVÖUÂÕUº{'‹10»¢jOUÄA­9!Z¸L"iìê›m<(ü9—b¯«ðëMvÄm+1jÏ2’çÛq°Žô×â>aP*ؤ¬ø­Ì?wWÝ@’Ÿ™©8Â0½®¼{ä¬{ì¼+aÛ€œšÂ½˜|M ‚ö„ÚÂEü7êÔî$ÓÅ®]OD-!yPl¸ý|Øß‚:Æy=ꢑ"\z¥`ËùeD( ¹×ª= VSG1o_le”TEÀôJùíZ}aË5øšž´då•PÒF"˜,šù_uñd³pÑ=Å[ɖÆ\h°ûê é†9óUö$!`i|…ʤ‘Ǹ9³> endobj 380 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 2121 0 R /BaseFont 2127 0 R /FontDescriptor 2128 0 R >> endobj 2121 0 obj [ 676 937 875 787 750 880 812 875 812 875 812 656 625 625 937 937 312 344 562 562 562 562 562 850 500 574 812 875 562 1019 1144 875 312 343 581 937 562 937 875 312 437 437 562 875 312 375 312 562 562 562 562 562 562 562 562 562 562 562 312 312 343 875 531 531 875 850 800 812 862 738 707 884 880 419 581 881 676 1067 880 845 769 845 839 625 782 865 850 1162 850 850 687 312 581 312 562 312 312 547 625 500 625 513 344 562 625 312 344 594 312 937 625 562 625 594 459 444 437 625 594 812 594 594 500 562 1125 562 562 562 ] endobj 2122 0 obj << /Length 2123 0 R /Length1 2124 0 R /Length2 2125 0 R /Length3 2126 0 R >> stream %!PS-AdobeFont-1.1: CMBX12 1.0 %%CreationDate: 1991 Aug 20 16:34:54 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /JKBRSN+CMBX12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 13 /fl put dup 40 /parenleft put dup 41 /parenright put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 63 /question put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def /FontBBox{-53 -251 1139 750}readonly def /UniqueID 5000769 def currentdict end currentfile eexec ÙÖoc;„j—¶†©~E£Ðª*Bg·N³ÀÓ½ ƒØ‘l¦ÊKq*Þ²Xú«šææwüsм|QÍFïq˜Õþæv`æšz¹XòšMyåp"÷ƒë»¶Ôôì5OÒÞË©”Y¤ÅðÆë¡P(DTçÜ!Á[v´Á›„67XFšlU‡…²&3!R˜q©ˆ4‡Ýw”’Ýσ~j‡¸+Ûño¼uú£ “þ_dÍV`÷Kî–y ãZúÌ÷±€]¨Šãu M™YŽ­üb[Üœ1[lòŒ›Ô'ó,t\™®¾pÚ®Ôž¤ZùO4ªG‰J7 iŠº½¤!U±¯&Ï·Ý¢¼h`ZNöÌ£ÖhKGÿµˆz;íà´ÓŽº¿ ˜ #1&ë¯(›)$ÿJ3K…ÙÖ…Eý­´™s±èjF¥¯ˆfÀ"P$Õå†-IÞµØìË•ÙBƒÅ 6=h¤qDVð<ã` EŠkÀ³ªE“NrraÆŒJGø ×~Lò{6ö¶ó¬IŽE6ùà¯U'õãÌy 0„gK>&)o>2\U]$XWЉç-1f£Å×@³«±'ÏB 1mùW‡= LðÛ%§5t¤Þ.O-]NŽ CTÏ4Û>&wÁ”vN­XÅ…ôžñCþŸßÙf å ›×¢¨r™¼1žf×¹VãC¡›“È–~äqŸ0 þXfðÖÚ^Å^$Ó·ï£%ÔG7dé›È±\ò¬­úlFcè0…]g<銷_‚Ÿ¢&«Wð{>}N|ãÓ·ë 05ŨÙú4H4ý¨ãÜžlGž>îš TÉ_¤cÑœé6àYŽ1— §»nUÏÕïr®Á-š–u$y£f³ÍÒOσ¹»4nŽAy’غINz+:Ó΃«µÎƒÐþê}=Ì|z`ÇvÙ+™D{.ô;FW‘LEc6ÎÅåoè,Ïý e&ØöŽÛºHêà–ÐíÎת¥¾%&e‡µ+Ú o=—çͺ'¨aç9°Ü®;-Ïsg}¶l3´K?ËS€ŽEhAr;²û¡}5Ù ¼Øõë•·Ž7_Kß”Z´Á‰n+€½µŸç KÎw©$ZˆdëòvÔ¬|ÍdÉ-ª‡½@IV¦¥ñ ó‹!š›xƒe\9ÕÁlCó,—±µJ$5ŸUØ/ÃR‚ݺöǸ–S-ׄ69è0°ø¬SEŠóÚ=ˆ_öF®²ÇìwœˆÖtÃî-3 Xçkg„r˜aÍÀà.»ó)ió„•GÖZñæÄ*rA­ó›dï‹X¯˜¶Þp"÷ÅòzXœß¯‘µƒ´c¼Û!ëÆq,æ ø !°$à‡H5}Ô´ÄΠ‚Ó!†í0‹&v©ü´Pi`ЬΚÃòRÜY¼P†‹7Ù—Ë økÁëmñ…ˆ_¿`Ž3cç&è W.8X¡ÐÙÄȇ;2F7Ä;­rzæÊIž-?¸`Íam¤ÃoóAyk®˜Dz©XmÔf›80¥’štʪM£b&†Cg¶Ê͉R—ÉÙóÕz§ÑžŠ­q §¡ov.Ô‘n€gbF÷¡çæÐE¨•†Y¼ø¥¾ÓÓ UªW¾ZøË[»Mé’ÍqUØ8±BÄ3;¶¨.½KFX1ó]xØõ|3¥Ó½ˆòÙª,“ûØp™`¯†uvÑ/tÍFhµhOv)}%¶ÄœÄ‘…ÜÀ)m  £;\\;ýl]¼Tc`:h-%Œðºqg ê0NöGb«º¨Lð­ƒÆšÐÇNœ8sfàiãE{}‹]TD^ÑÒõ Û^\€W3&ÿBGˆÑjOŠÎzRá‡i7ðM»4Aë]4E(•ãÒeììÇœ &Ükùñ¯ü/iê¨>¬S €•,Åé’íM "“óc€\)`Ôd$‰ûÅÀ«^”òÏ\ƒK–‰TÓS~.ófÑx@×NŒþ2íØ(Ëjs i¤…& ó„¼eô_ðâð…ÔØ¡nõ`À’ÿ7CMúÌQˆÛƒZ¿k¬=ÔmïÏâÃè ‹ia%‡3ÅJ?3°^!ôuŸ§øáx;'UˆiíÓâ _2=Gùf™R¼*SyMm°)³UU²Óš¬5Œo6[ „[Lý.L–VQ>†3H(ËïîšT(aÅç×ÿœ9RžÏ–©í…­VÙ¥”%yê’÷WrÞÓÛoc=WÀ׃šqóÄ´þž.]h.“šmùY¡É%U³Ôötî­8pH’6ú?,{ÚŠáøZ¥‘eɯ®Kù#ÏïÝnú>5`o•™Í›ÂÏØ–½cFДè¾ õ]&f$5áðrŒqæ8Ÿ”óËùª ¹\EõÖ,<ª"×± O顜믌'´ÞXp¢H'« °áA”ìWUT\æN>ˆ¼Ì¾CЊÂð퀠#†Ì5—rC¶ÁŸbR2÷  •î7 YF¼N–FÄOÄÅ~%J5RZŸÕ†_ÅW‰]ÈkØáe¨Î¥–6àV¸T¬‡=U±ªêm0:•rƒP¨¯×}Ë8)-#"k~s\¯›ù‰××j9ÍÛÙ–!nì¥÷ÀèÜbÔ#¢RlR·Ú’|eŒ^lÐñ÷¨òâ_eµÑùG™ÓþÐë~°VÎ YôþòŽïÆ;dp¤µÊ( ©Ô§¡·7qWlS’Ë0$PØACGéMÆz¿ÁÜ€Oò8ÒëÙ1‚Aà^ªŽ 7 & çù™E{Fµ¨}úïq:‘O)x¤µòz:òÑ(@ß͸d>æÂÁªPÄЪ¸Ël›lÝÃm§ˆÀ´2è\@¼¹!z–¸¶BØ*Pâ†,-¢óØËS³B‹Òç•Qºk»huAVl]Ÿ® ý=Ýn—™;Ü%šƒY,ô$3P­ú#ôu¼º§G¸ˆeV fÉQI–5†–ø¡ÕŠ“ž:#ùÊû=ä0 È±åE:î™V±@Hly¾© ªØyzNYžŽ”Ÿ¢aw*—)ïkõ/nØÔaH8ñDåÔYZ”*ÎøMR,>+ö6–¶÷^e{7¥Üm5*‡ °>££ªšæ”Õ+³«ã’Ó6Äh»½1 *[¤—ÖÇ„ÉkŽüjéGŒkÙíDt‹PÇê{£¦&£[¢Næ³¼—OΧÑ_ Ù(_ÕîyŒ°C©€$[B_6úö‘h@‚KÙiyÀ«vTgF.ØÎ1F¼UUÝÖ’ÊHðÁ‡ÇGÂ…#Öý¤ui3EI¸}ž£¨y ‹¿ç“õÈ>p+rhn*…:¦a˜]‘€{å ÁCW}ðJJ È9(ÜÁ@pɼs\fÓ¤[«Z(b²“÷9ž@é°À³\àì…¬x©oúŠ5”H²ÈY’;=/NÒm” 4ùúG­èµ`{d…¤þV£R0Êdn5à.o¯›‰d÷Áv2ä å%;Kû ›:Ä7êÜe¢’õÙt%Zje&‡{hG¥œýøÊÅ0çè ±¯"½BõËñ“ÇE°Ò­r©±CÁˆdk?“.øi{(W¶y£*5Þ›@¥8¢#ÁªŒ-œ?/’™Aù¾HѪÍkæ-kjx »Hÿj —ÛëբŽ÷ñÕ¨ï3Þý±dÛVvçÆ^ï„¶œfaì¾¢€h¸D´í%<‰dúü¼Ãþ \Ýû)Å<ÓP'˱.=v>³Ì«ñ“èåXßuÐÚõÄ4Ü6’œk_,ÈÙó‰…C6l2{ïì”ÈâáÄ÷ÌñÔ+xG´ HsªµŽØBÓE€pؘy&mLt~qMv5~¿'ö¯æÔ6¤ ’•Úb€‹ŽÓÎ tÈ!ТP8duÐn¥pê儉u aÞÌ›:óÞ…•r~È¢ÝPƒ.l7p7߇ÿ{ŸšÂf›dÑ–3#Õƒ5çI…Y2¿Ó×kQpõYùC0s½ÆLZ J²²I6M©ØIì‰nÿ]MÔî&È»¢CÔÀ<`§µãCá‡í?°ƒ˜ºpÞà½f´Y¿QÜ|ô ²¿ÁOÐý°Z´Ô׸A!êõA’iý{÷O~ÒlmS±"Ïß4³9‘^‡‡6$uùû I]¤Þž¼ã&ºìûýªû )ì‘£‰T)¡øg: tÄäg©Ð}|¤º LœHT=ãÙÕ„-EI»u“•ÚÙP·;îì­Ø#_ÚßMÅYšݵвt±„Ô6+ÀSÕ Ý‘1wq– zÇjÄg+Ó¤ ‚sgûŽ|¶C4¾åo„pošÁ ½ r ôßoÛz·ëσG¨ó—C¤ÂËóë@Lsu/U ‘„[Êël¿<µ#Ô¯56‘PSU…Óèß,—zÉ\|p%B®ÛPd…Ù‹‰l `:Æa ëЊ/´XÀŒž^v×ëg¼²ãÓ(:X½&Qíl¹ÑŽNÜÒÁ߆ËÁ2ÏÃ4 ¼A¥СiÜ_|AE~ÔËKˆÔâ#:¸å15vr Ñ^VÎ÷@®aüݺz¶ÿ«ìÎãò²ô8nXÁQæ>„}H×’7nÂm§)ð@Iдå§.hàJK¨6ê9\¡Ë¦„õßgLТ´o]Eäá"´NçdàO6˜)_U¢ÄvÓùôyðr›]œ¹KHÕ²¬‡iÿ٧ȾÚNY´3 ™»ÆÑÍ^NWÛµ_¢ŸzŸStõ™• S#¥u£!ØÅvEÇWœ55ÕEÑA @Ì™ÁØäàUÑ6Ò0ø¶à´ñ’²ã¾LS ÎAg {kË‚<+”ª(¯CLó79}y ¨Ä™µ&â㣠0 EÀikÆ^ÞáÞFõ*× ëÚÙú÷•35}nÑÇåæN¥ ‰nÃ.%§4f… θZY2"œ×&¥ ˆÇÅÛ.袵pÅ5î×8¿¹ÞµªKòU®“¡k¾c,kÙ]a‹E Þ:SÖ3äûùPhØPÙË{ ßmùI»‹óÆ= ó^"Þˆ¯­é²û‚{»Q¯¬º–2°·­¸ö¤ÏrÓ.ð9B:èg÷h4祋†˜ÅÇmz j¡tÍ ›éY¤¨ º®Xë<„té_Ûàf´x »&6 ³?™ªÁa^!*‹ÕÓ×|zxÁ‡‰ñáÔ,50™ÏÔO(xºñË…™‘»C6Þº° 56æÔslІ0#õkôØŸI´¹g]ós¾˜/&.¹©ÿ“•ýò(öÓRøûáYtÍ›½¦µNá+ù¯eFäuºf·vÿRE5¾3>Vó|ñ›h&Ò#ž£7ÚIÁ ‘"êun™ÏúÓë,Ÿ-éÃ(¾IºÀÔ^èñ¦tØp$¾;㿨`ùeÖ}PÛ Ã•;<¢(P„$âܲ¾åüKwÑ€ª&HïGRBOˆÄV.<Ÿ]8µ•XÅ=ï¤A¯îºÏœÙmÕ½¤–÷ãÓŽ±Í¿šPËч°µkÑ –*Ä¡ñè›'»÷¿ Œs²º}ZPÍ€¹ Òö–¦Ò²á`H&þØf£¥Å›í3g‰C DL5®iÌÇb'|øo'¶™”Gùë†ç>_ìýïÔ§Åö¹Áb‘1†¢@ jÜCQõ’ÔÑ´ÿR/Úº_æQ+úªP.„I/VŸqk*ÛTó#ÎÆød_–<é– (ócSdzŒmq©hJM|¢Ÿ”•Öj ®)˦ 0Vmn÷*0í‡ü™@pºŽf³ï3Áéžü÷IèY¨-;&œòËó qÀõä Áá«c^ww.ÜA:ÈVB¶€ö/lfŸYÅžp$"è3—™—,=Yyð·Ôµí7ƒK¢s=InÊg~Í5¸° þ Hûøþ±-&ðôhÒ Ññ è ºƒó¿© {¸3ä­"ÙØP]¸“’Uì¿Z®’³/+³Ä¡>d<#Óg"ê9n­ÓW#íüÁ$òÒÂQâ¡%«Ž°0ÁU•Åú4â«]ߟhcò}Xhø™&dI,~º«þ{%lºy;—¦”?±RÃÈ¡ñóÂ=Kl©0küT æÏˆ°¢èI|Ã_tR6FÖS ˜r¸CWɤ‘ o´Ã¦A'Ѧ ññô¿@)i€ÈžÒ†ê3àŽY ñ\À¿fךæÏæ48c~'g9o‰=H;n Ý˜^«ÅTù6ö'ÇØp³`ïá·¢PñaкHœU¯Q./nÒ·EØd÷$Ãy…D‰3ÔºžÂ²ÑôÓE¶_ êMŠàÚ½«ºaÐai3]g5ž¹A“$êI:…ܤá…÷Œgãg/»Ém]ŽMŽèèoàû­òŸ~H“ ïÀ‹â™³^o.nQƒ˜nb—-"6HXÇ{áS•tÝ›i4ì£þZpå[ÔRu½Kǧr]2&4°?‹Y?gÆ'Û¶¦(`OTŒMщJ›’‹t#£ ZêÁîà?Ù&ûåïF…ŸïðÄ´}Ûrî/gª©1OÐ6êª32.šÑ¿0"ú…´#’–s‘þedIõókæ$P;ƒ0)îåt÷Gœ51AßPÊ£¨ÚpSÙöu¶ÅzÆý=ì~Ó0>ŠƒYËÿ?ó¥ŽNiuÐоÔ\¾,G͈â?黽Þ¼œv¡ò‹m,øX ï\¾@Ú¶å–Ì}S+ð>ûÍÔœõPvL×Y޹çž,"PK¡¡Tb=NÆãc—bÀ°ê'ÖIOt}x„z}‹pL¸€˜%¾üÃi-ªUÄ&UMj¢•³õ•§”±ìå+Ô« 1OïëTH¹á[˜¢—zt¡A‰{èAƒ"LfÖ°DŠêþãCÈUö½iË{š„fn§ÅãÃRõΫõ/Œú?²P« à îX=ÞSÏóÄsè LS(µ¡µQh &Þ”æñÙ˜)Áô=]\§FBÚy¿¡vò;ý_î´EVKMÛ)ŒuVV;rù jþþò­Õs8ûÉxcÒràƒ!Ÿ4-$õŠ/òyÏ¢uvêrjÔ¡Ó<³Í­ÌÅ¢§ˆ,6BNœÃ@D »H)ª’3É<èÞ‡†É~‘U#KNø1ò.¥Ãò:årÇa2ž‚\ÄçN†×£ˆ6fÊM T½¬¢ÉƒÏãÙì©4á€ðA½ªo+ý°áÌ“Ù^0+\·ä+‰ 9¿Õ^˜7? Îâ'Iu¬C•,à`"cÓ®Ã`Þý(ã§H/®T£¼zyÞ¢MgÒ`‰¶ÕL™oKùþ˨X>”ŠÏÖ%¹|V×u dê7‹:[„¡{Q^Z¡jW ByWcxîàÕ±|èÙ@RÓÒÚôøK-h—e”ªyg‹û‡€I4™Ð7 Â4®p*³È8“УèWþ_Ûî˜H¸…Âáѳz‘HCÞËh:Äï¡Ñ±€)n‘®:Çyïߌ:NZµÁ‚ì{ó0Xªƒ;\!(NÝ”d1ËþÞàoÆ1Ú³{Ǩ/èäxGF>÷ÇXÉcu½V·6˜¤q›´ãZ¬¸ÌÂòÊM7íâ׿ª[á5%ð)˜RaæŒ*²Ä/NÄÓ@eì£Ïõ°´3¾¾1 ÍQŠ ¿à–âŠÊ÷U'µ¬£q|-Àæ%> åÖ…|ÿ}ÕÆT›ø—øWÅCÁŠÔ~íÄü*~M£ ܘ(ÅücZ)_ðOŒ§~Ë›lW^нW‘i[2³M8ó9Xéø¬£3¯s@i½§çW÷J®øÿlØ;‘ œ¥Ifz™|X.JÅæáÄ7¶îK%Ô‘Z]BHmÙp|ÜÏð¾!UçÓ&Šs€ZMŒ©„lìŠ#ë1uy­—¬¡4Ù_¶ìÞ@4·å²†çÂcßmMØfw²{-Sà–Ó´î?³½uè[t‡d‡¥\Œ¶Óÿeu¹¾¾.!烶†ú(Jà>Ô$½…&í°ûMµk¨…måðy×Cúž[Ê ØhNöˆ¤ •hi‡ñJ‰ò¡ü㦽š6nÞ~„“0ÌÛ*o›ã°c|LXšê½ã‘%vÿ¹¢* LgˆK¦ âb£‡lÓ¿6Ñ­üòÑà¯Ã§‚$T„:4ìÇ—ˆ3l¿©;plå8³öFpÖõ·FÁv³ôèrPÔ“½WÒ©n5‡—Úè ËÜ ¢‰8s*RSpU»ø:€¢$ÞÅ/®–0XåIäó83WhÝý“êE—æBÈ“U‚%HA2VPòølÔâ³}ÈÑuuf‘aî²ý(ÓÛyøðõ‰E:Ì#ÔÀÈÒÕÓiúÛÉì+a%uu'¢Âôçb 7dçÖ"¬h~Á0”*¼Á¨ïÚòd«ÒrL»"®º·WbUÊ•‚AÎyK|H³¤sjHÛþ9±[ówèÓšïÎí \lì>Ä!1‹ÿzÉM7âÿ¢$fp:nW4Ì Ä7e/—š<ôºá÷!¤C1¥ÖEí6™Ãóà yƒì„Ú?l›ûÊü[¼/0’fÀ[øÍÌ•§oKäd)×oÜÕÚ<¿+‘‘^€É1b;¶R ¶k»z>Wå»å½”T“˜*° ³,ÙqÃ¥KŠèöh±Þdü2]AžV7þ²‘ÐrXÒª«Ùã6§Ü#Áƒ Lïµr ¡È»o¡ÉE«‰`Ä“Ãv}—TWsÊž™ÿƒ"¿’"ÜæÒË.í›í,(£[„°úÀÙdo” ¯Ò+]ɇâÝŸÀÞ$й–ŒYœ|!8ÊVì¬ÑÙ°÷&ßË^El„¤`}Pr±üQU/o@O-½´é}§s¸+xÆ;)'<‹]Ü Ys_ŸžÀ£Ôê…”Pu]]¬SYçø^:²â4š†ÂTPœp=ø`d{JF˜ÏìÑËh•Ü®B>½æ–ù¬‚û•äMîf>GÏAjøJiaG‰‘%5XéÄ=;™Ñà…L¦·ig£Gj´MdnÅ–‚Jm›p¶A¢º#j%·£Ëþ³jwÇöêƨn‰KÄ:®N&5'ÐôöÛ@‚±‚ÃR¥jQùä3HN@†šÍ&ì,.ãUïÏ]WÙ!E YྣhŽ 'µYfÉJsÞyè.cæ‚=´ekP¬e…²ˆ˜*ËìM`•Éúù`.¿6Ä¥f ±>ùRêij%ÝAÐpy[^à¢eU§ÒCR¢Œ-"bƒ ÷0 ILž|úÔ…5ªø'V2Öl$Uhµ¿2N›*´£ñÊZèȱ¡Éï¸Ú“løÌíÄpiW¬SÎvXú` „‚}çèOÀ™ÈIõ¨žÙÚÈÊ–šë£î¦$GmÅXêe=—jIwH^º‚λãôf5·rºYt:)Î Z3aû0ë¿/k,©&áNo,6¥óK?->‘'1i‰sT%ÎØŽBñÈñgZåïžÇUá ¿‹Á¤Ô)ÜIÏïÉ¥ì'Á÷E¬©ýÐÿ©öÁr*e¯þõ]zÒ'âø¨ONˆúHuôÕÀE´ÓlŒ.² b|ƒ&8µ´ÐÉÿÏ~GΞ8\–bcû–áX’¡‹ à/››âD—ÝPn7¶Vý^s/ FØûqa –”×Q÷äIùÐÙ‚ÉkòwÍrÎÉ­‹·¥6ÁulèÆ+ –tX­[õåµxÅ© m=+g¡]ÍøÍù ²}‰ˆœ'¬¯Žj“H‘86©J•ÆvwB9‹ÀÃJ*Šmc»É,{—ËîãdÉ? ÆÓË¢ØÌF]5Uñëa¶»t«wÓ¹žÑ•a±|»ˆaçŸ<€K[& ãT?Þ}A!ÜfF[ò}QˆÁ²îUz}!NÝ#/j¦VçôÞF–'û2 oÿŸ‚îWe¥õBd²A! Â{Üf#t_ œ³™€±c„/>:m¬ŠbÕÁ‘Ûª&nÖÝ:Ài–ÞYjâþ[Ì ²í|ÅH§’ #5Wæþ V)x‘oLî1X\Ѳj"82"{`Q\w¤ v2 Sú ‰¼\ ÿ[ ²¡…˜¿`#>/—ͰOÎb8m„¬¶ «g™åÈñ=êe%A.«àðD4Äcp¶},ˆZ¡O÷Xt% `'/ƒ‹£S¡à{È㌜ʷtEkÍŠ›ž û>1hK™®‹ b’¯V@õÇ5jí+Ý;â[W'ªÓG›Yå·Æ(húô©AQ3$iP? ÇAæ;̺¤X]à v(¯pRK×Éë•Õ¥3ÝÞj®Ûå6>å‡FrkÀ˕ü§x+¥·Hœ¼\[ Æx1 “nJñ#‘Hôó'äŽwP/myµüâ„wˆŽê*ľ#vgÙ¿&î†M?bTQh>€À›‡ÊŽŒ|Á‚xkš ½ÕÔ”ì7KÍ’Œ1-±þÙ¦éÛÄø5ãÜó°ÐÛ¹—Îʺx ÍI¾œ^€ R=åëC€4nIä°‹‰à.*r®¤ Xº™d;?ÛªÏÁ“-*ói E´ô¢ý´t6`,Çl›ƒ*esR„Rj\T„†ç "T\þÙ*+%ÞHoEºO\4Bä]­ÊçO\EFÁ°b2ì4´³T˜¡–"ÏmÖ³¤näeGçU ¼ t¡pä•õjµëiHeÜEމ„p¡†^4îM®‰H³ÿý¡ ”RqpçÓ{ éV a,ïãŠ#øf 1ïÜeò©ÖE†}5*ïçÇñ’3óÁ?†o¥t‡–M4$ï|B¾ºµý©Œ©æIó¾«ñ[n&8(GúNÓn.»m¥ôy¹×?éió¯}]‹ã#›•ú›2mDÊv—5\¦_’ý_”_Êù„ž„ßíqÓÄSÉû×7rÝ"N2S®0 ¼)$³º](Ö6Ñe!Ô¬¥ÏH»¤T$¼®Pru¾%LoWö’új t9íëõ©MÈd5'¢·/>=«ñ“Ñ YJU‹Ãq‡ÀïþùÁ¤ÆÍÝ÷ XÈÖ²ÏÛjPöLÕ[Ì9:p¡à¢ÍDÔ|‡ÙM-¿SQT —HfäErŽœ{Ÿv÷%©&0ë-%…%ü0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 2123 0 obj 13219 endobj 2124 0 obj 1768 endobj 2125 0 obj 10919 endobj 2126 0 obj 532 endobj 2127 0 obj /JKBRSN+CMBX12 endobj 2128 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName 2127 0 R /ItalicAngle 0 /StemV 109 /XHeight 444 /FontBBox [ -53 -251 1139 750 ] /Flags 4 /CharSet (/fi/fl/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/question/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/V/W/X/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 2122 0 R >> endobj 383 0 obj << /Type /Pages /Count 6 /Parent 2129 0 R /Kids [373 0 R 387 0 R 440 0 R 492 0 R 500 0 R 507 0 R] >> endobj 524 0 obj << /Type /Pages /Count 6 /Parent 2129 0 R /Kids [519 0 R 527 0 R 539 0 R 552 0 R 557 0 R 564 0 R] >> endobj 572 0 obj << /Type /Pages /Count 6 /Parent 2129 0 R /Kids [569 0 R 575 0 R 580 0 R 588 0 R 593 0 R 598 0 R] >> endobj 611 0 obj << /Type /Pages /Count 6 /Parent 2129 0 R /Kids [607 0 R 614 0 R 621 0 R 630 0 R 636 0 R 643 0 R] >> endobj 653 0 obj << /Type /Pages /Count 6 /Parent 2129 0 R /Kids [648 0 R 660 0 R 673 0 R 681 0 R 687 0 R 696 0 R] >> endobj 707 0 obj << /Type /Pages /Count 6 /Parent 2129 0 R /Kids [701 0 R 710 0 R 716 0 R 722 0 R 731 0 R 739 0 R] >> endobj 752 0 obj << /Type /Pages /Count 6 /Parent 2130 0 R /Kids [749 0 R 755 0 R 765 0 R 773 0 R 782 0 R 791 0 R] >> endobj 806 0 obj << /Type /Pages /Count 6 /Parent 2130 0 R /Kids [800 0 R 813 0 R 819 0 R 825 0 R 831 0 R 838 0 R] >> endobj 848 0 obj << /Type /Pages /Count 6 /Parent 2130 0 R /Kids [844 0 R 851 0 R 858 0 R 864 0 R 878 0 R 886 0 R] >> endobj 934 0 obj << /Type /Pages /Count 6 /Parent 2130 0 R /Kids [931 0 R 937 0 R 944 0 R 951 0 R 957 0 R 964 0 R] >> endobj 976 0 obj << /Type /Pages /Count 6 /Parent 2130 0 R /Kids [972 0 R 989 0 R 999 0 R 1055 0 R 1062 0 R 1067 0 R] >> endobj 1083 0 obj << /Type /Pages /Count 6 /Parent 2130 0 R /Kids [1076 0 R 1098 0 R 1103 0 R 1143 0 R 1153 0 R 1165 0 R] >> endobj 1177 0 obj << /Type /Pages /Count 6 /Parent 2131 0 R /Kids [1174 0 R 1180 0 R 1185 0 R 1190 0 R 1195 0 R 1200 0 R] >> endobj 1211 0 obj << /Type /Pages /Count 6 /Parent 2131 0 R /Kids [1208 0 R 1214 0 R 1219 0 R 1225 0 R 1230 0 R 1236 0 R] >> endobj 1245 0 obj << /Type /Pages /Count 6 /Parent 2131 0 R /Kids [1241 0 R 1251 0 R 1257 0 R 1262 0 R 1269 0 R 1279 0 R] >> endobj 1664 0 obj << /Type /Pages /Count 6 /Parent 2131 0 R /Kids [1660 0 R 1667 0 R 1676 0 R 1684 0 R 1701 0 R 1718 0 R] >> endobj 1748 0 obj << /Type /Pages /Count 6 /Parent 2131 0 R /Kids [1742 0 R 1757 0 R 1780 0 R 1789 0 R 1798 0 R 1804 0 R] >> endobj 1952 0 obj << /Type /Pages /Count 1 /Parent 2131 0 R /Kids [1904 0 R] >> endobj 2129 0 obj << /Type /Pages /Count 36 /Parent 2132 0 R /Kids [383 0 R 524 0 R 572 0 R 611 0 R 653 0 R 707 0 R] >> endobj 2130 0 obj << /Type /Pages /Count 36 /Parent 2132 0 R /Kids [752 0 R 806 0 R 848 0 R 934 0 R 976 0 R 1083 0 R] >> endobj 2131 0 obj << /Type /Pages /Count 31 /Parent 2132 0 R /Kids [1177 0 R 1211 0 R 1245 0 R 1664 0 R 1748 0 R 1952 0 R] >> endobj 2132 0 obj << /Type /Pages /Count 103 /Kids [2129 0 R 2130 0 R 2131 0 R] >> endobj 2133 0 obj << /Type /Outlines /First 7 0 R /Last 371 0 R /Count 9 >> endobj 371 0 obj << /Title 372 0 R /A 370 0 R /Parent 2133 0 R /Prev 355 0 R >> endobj 367 0 obj << /Title 368 0 R /A 366 0 R /Parent 355 0 R /Prev 363 0 R >> endobj 363 0 obj << /Title 364 0 R /A 362 0 R /Parent 355 0 R /Prev 359 0 R /Next 367 0 R >> endobj 359 0 obj << /Title 360 0 R /A 358 0 R /Parent 355 0 R /Next 363 0 R >> endobj 355 0 obj << /Title 356 0 R /A 354 0 R /Parent 2133 0 R /Prev 339 0 R /Next 371 0 R /First 359 0 R /Last 367 0 R /Count -3 >> endobj 351 0 obj << /Title 352 0 R /A 350 0 R /Parent 339 0 R /Prev 347 0 R >> endobj 347 0 obj << /Title 348 0 R /A 346 0 R /Parent 339 0 R /Prev 343 0 R /Next 351 0 R >> endobj 343 0 obj << /Title 344 0 R /A 342 0 R /Parent 339 0 R /Next 347 0 R >> endobj 339 0 obj << /Title 340 0 R /A 338 0 R /Parent 2133 0 R /Prev 315 0 R /Next 355 0 R /First 343 0 R /Last 351 0 R /Count -3 >> endobj 335 0 obj << /Title 336 0 R /A 334 0 R /Parent 315 0 R /Prev 331 0 R >> endobj 331 0 obj << /Title 332 0 R /A 330 0 R /Parent 315 0 R /Prev 327 0 R /Next 335 0 R >> endobj 327 0 obj << /Title 328 0 R /A 326 0 R /Parent 315 0 R /Prev 323 0 R /Next 331 0 R >> endobj 323 0 obj << /Title 324 0 R /A 322 0 R /Parent 315 0 R /Prev 319 0 R /Next 327 0 R >> endobj 319 0 obj << /Title 320 0 R /A 318 0 R /Parent 315 0 R /Next 323 0 R >> endobj 315 0 obj << /Title 316 0 R /A 314 0 R /Parent 2133 0 R /Prev 103 0 R /Next 339 0 R /First 319 0 R /Last 335 0 R /Count -5 >> endobj 311 0 obj << /Title 312 0 R /A 310 0 R /Parent 103 0 R /Prev 295 0 R >> endobj 307 0 obj << /Title 308 0 R /A 306 0 R /Parent 295 0 R /Prev 303 0 R >> endobj 303 0 obj << /Title 304 0 R /A 302 0 R /Parent 295 0 R /Prev 299 0 R /Next 307 0 R >> endobj 299 0 obj << /Title 300 0 R /A 298 0 R /Parent 295 0 R /Next 303 0 R >> endobj 295 0 obj << /Title 296 0 R /A 294 0 R /Parent 103 0 R /Prev 275 0 R /Next 311 0 R /First 299 0 R /Last 307 0 R /Count -3 >> endobj 291 0 obj << /Title 292 0 R /A 290 0 R /Parent 275 0 R /Prev 287 0 R >> endobj 287 0 obj << /Title 288 0 R /A 286 0 R /Parent 275 0 R /Prev 283 0 R /Next 291 0 R >> endobj 283 0 obj << /Title 284 0 R /A 282 0 R /Parent 275 0 R /Prev 279 0 R /Next 287 0 R >> endobj 279 0 obj << /Title 280 0 R /A 278 0 R /Parent 275 0 R /Next 283 0 R >> endobj 275 0 obj << /Title 276 0 R /A 274 0 R /Parent 103 0 R /Prev 259 0 R /Next 295 0 R /First 279 0 R /Last 291 0 R /Count -4 >> endobj 271 0 obj << /Title 272 0 R /A 270 0 R /Parent 259 0 R /Prev 267 0 R >> endobj 267 0 obj << /Title 268 0 R /A 266 0 R /Parent 259 0 R /Prev 263 0 R /Next 271 0 R >> endobj 263 0 obj << /Title 264 0 R /A 262 0 R /Parent 259 0 R /Next 267 0 R >> endobj 259 0 obj << /Title 260 0 R /A 258 0 R /Parent 103 0 R /Prev 243 0 R /Next 275 0 R /First 263 0 R /Last 271 0 R /Count -3 >> endobj 255 0 obj << /Title 256 0 R /A 254 0 R /Parent 243 0 R /Prev 251 0 R >> endobj 251 0 obj << /Title 252 0 R /A 250 0 R /Parent 243 0 R /Prev 247 0 R /Next 255 0 R >> endobj 247 0 obj << /Title 248 0 R /A 246 0 R /Parent 243 0 R /Next 251 0 R >> endobj 243 0 obj << /Title 244 0 R /A 242 0 R /Parent 103 0 R /Prev 239 0 R /Next 259 0 R /First 247 0 R /Last 255 0 R /Count -3 >> endobj 239 0 obj << /Title 240 0 R /A 238 0 R /Parent 103 0 R /Prev 223 0 R /Next 243 0 R >> endobj 235 0 obj << /Title 236 0 R /A 234 0 R /Parent 223 0 R /Prev 231 0 R >> endobj 231 0 obj << /Title 232 0 R /A 230 0 R /Parent 223 0 R /Prev 227 0 R /Next 235 0 R >> endobj 227 0 obj << /Title 228 0 R /A 226 0 R /Parent 223 0 R /Next 231 0 R >> endobj 223 0 obj << /Title 224 0 R /A 222 0 R /Parent 103 0 R /Prev 203 0 R /Next 239 0 R /First 227 0 R /Last 235 0 R /Count -3 >> endobj 219 0 obj << /Title 220 0 R /A 218 0 R /Parent 203 0 R /Prev 215 0 R >> endobj 215 0 obj << /Title 216 0 R /A 214 0 R /Parent 203 0 R /Prev 211 0 R /Next 219 0 R >> endobj 211 0 obj << /Title 212 0 R /A 210 0 R /Parent 203 0 R /Prev 207 0 R /Next 215 0 R >> endobj 207 0 obj << /Title 208 0 R /A 206 0 R /Parent 203 0 R /Next 211 0 R >> endobj 203 0 obj << /Title 204 0 R /A 202 0 R /Parent 103 0 R /Prev 199 0 R /Next 223 0 R /First 207 0 R /Last 219 0 R /Count -4 >> endobj 199 0 obj << /Title 200 0 R /A 198 0 R /Parent 103 0 R /Prev 183 0 R /Next 203 0 R >> endobj 195 0 obj << /Title 196 0 R /A 194 0 R /Parent 183 0 R /Prev 191 0 R >> endobj 191 0 obj << /Title 192 0 R /A 190 0 R /Parent 183 0 R /Prev 187 0 R /Next 195 0 R >> endobj 187 0 obj << /Title 188 0 R /A 186 0 R /Parent 183 0 R /Next 191 0 R >> endobj 183 0 obj << /Title 184 0 R /A 182 0 R /Parent 103 0 R /Prev 163 0 R /Next 199 0 R /First 187 0 R /Last 195 0 R /Count -3 >> endobj 179 0 obj << /Title 180 0 R /A 178 0 R /Parent 163 0 R /Prev 175 0 R >> endobj 175 0 obj << /Title 176 0 R /A 174 0 R /Parent 163 0 R /Prev 171 0 R /Next 179 0 R >> endobj 171 0 obj << /Title 172 0 R /A 170 0 R /Parent 163 0 R /Prev 167 0 R /Next 175 0 R >> endobj 167 0 obj << /Title 168 0 R /A 166 0 R /Parent 163 0 R /Next 171 0 R >> endobj 163 0 obj << /Title 164 0 R /A 162 0 R /Parent 103 0 R /Prev 159 0 R /Next 183 0 R /First 167 0 R /Last 179 0 R /Count -4 >> endobj 159 0 obj << /Title 160 0 R /A 158 0 R /Parent 103 0 R /Prev 155 0 R /Next 163 0 R >> endobj 155 0 obj << /Title 156 0 R /A 154 0 R /Parent 103 0 R /Prev 151 0 R /Next 159 0 R >> endobj 151 0 obj << /Title 152 0 R /A 150 0 R /Parent 103 0 R /Prev 147 0 R /Next 155 0 R >> endobj 147 0 obj << /Title 148 0 R /A 146 0 R /Parent 103 0 R /Prev 143 0 R /Next 151 0 R >> endobj 143 0 obj << /Title 144 0 R /A 142 0 R /Parent 103 0 R /Prev 139 0 R /Next 147 0 R >> endobj 139 0 obj << /Title 140 0 R /A 138 0 R /Parent 103 0 R /Prev 115 0 R /Next 143 0 R >> endobj 135 0 obj << /Title 136 0 R /A 134 0 R /Parent 115 0 R /Prev 131 0 R >> endobj 131 0 obj << /Title 132 0 R /A 130 0 R /Parent 115 0 R /Prev 127 0 R /Next 135 0 R >> endobj 127 0 obj << /Title 128 0 R /A 126 0 R /Parent 115 0 R /Prev 123 0 R /Next 131 0 R >> endobj 123 0 obj << /Title 124 0 R /A 122 0 R /Parent 115 0 R /Prev 119 0 R /Next 127 0 R >> endobj 119 0 obj << /Title 120 0 R /A 118 0 R /Parent 115 0 R /Next 123 0 R >> endobj 115 0 obj << /Title 116 0 R /A 114 0 R /Parent 103 0 R /Prev 111 0 R /Next 139 0 R /First 119 0 R /Last 135 0 R /Count -5 >> endobj 111 0 obj << /Title 112 0 R /A 110 0 R /Parent 103 0 R /Prev 107 0 R /Next 115 0 R >> endobj 107 0 obj << /Title 108 0 R /A 106 0 R /Parent 103 0 R /Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 102 0 R /Parent 2133 0 R /Prev 99 0 R /Next 315 0 R /First 107 0 R /Last 311 0 R /Count -20 >> endobj 99 0 obj << /Title 100 0 R /A 98 0 R /Parent 2133 0 R /Prev 63 0 R /Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 94 0 R /Parent 63 0 R /Prev 91 0 R >> endobj 91 0 obj << /Title 92 0 R /A 90 0 R /Parent 63 0 R /Prev 87 0 R /Next 95 0 R >> endobj 87 0 obj << /Title 88 0 R /A 86 0 R /Parent 63 0 R /Prev 83 0 R /Next 91 0 R >> endobj 83 0 obj << /Title 84 0 R /A 82 0 R /Parent 63 0 R /Prev 79 0 R /Next 87 0 R >> endobj 79 0 obj << /Title 80 0 R /A 78 0 R /Parent 63 0 R /Prev 75 0 R /Next 83 0 R >> endobj 75 0 obj << /Title 76 0 R /A 74 0 R /Parent 63 0 R /Prev 71 0 R /Next 79 0 R >> endobj 71 0 obj << /Title 72 0 R /A 70 0 R /Parent 63 0 R /Prev 67 0 R /Next 75 0 R >> endobj 67 0 obj << /Title 68 0 R /A 66 0 R /Parent 63 0 R /Next 71 0 R >> endobj 63 0 obj << /Title 64 0 R /A 62 0 R /Parent 2133 0 R /Prev 27 0 R /Next 99 0 R /First 67 0 R /Last 95 0 R /Count -8 >> endobj 59 0 obj << /Title 60 0 R /A 58 0 R /Parent 27 0 R /Prev 39 0 R >> endobj 55 0 obj << /Title 56 0 R /A 54 0 R /Parent 39 0 R /Prev 51 0 R >> endobj 51 0 obj << /Title 52 0 R /A 50 0 R /Parent 39 0 R /Prev 47 0 R /Next 55 0 R >> endobj 47 0 obj << /Title 48 0 R /A 46 0 R /Parent 39 0 R /Prev 43 0 R /Next 51 0 R >> endobj 43 0 obj << /Title 44 0 R /A 42 0 R /Parent 39 0 R /Next 47 0 R >> endobj 39 0 obj << /Title 40 0 R /A 38 0 R /Parent 27 0 R /Prev 35 0 R /Next 59 0 R /First 43 0 R /Last 55 0 R /Count -4 >> endobj 35 0 obj << /Title 36 0 R /A 34 0 R /Parent 27 0 R /Prev 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 30 0 R /Parent 27 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 26 0 R /Parent 2133 0 R /Prev 7 0 R /Next 63 0 R /First 31 0 R /Last 59 0 R /Count -4 >> endobj 23 0 obj << /Title 24 0 R /A 22 0 R /Parent 7 0 R /Prev 19 0 R >> endobj 19 0 obj << /Title 20 0 R /A 18 0 R /Parent 7 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 14 0 R /Parent 7 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 10 0 R /Parent 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 6 0 R /Parent 2133 0 R /Next 27 0 R /First 11 0 R /Last 23 0 R /Count -4 >> endobj 2134 0 obj << /Names [(Doc-Start) 375 0 R (Hfootnote.1) 532 0 R (Hfootnote.10) 788 0 R (Hfootnote.11) 969 0 R (Hfootnote.12) 984 0 R (Hfootnote.13) 996 0 R (Hfootnote.14) 1071 0 R (Hfootnote.15) 1147 0 R (Hfootnote.2) 535 0 R (Hfootnote.3) 536 0 R (Hfootnote.4) 604 0 R (Hfootnote.5) 728 0 R (Hfootnote.6) 736 0 R (Hfootnote.7) 768 0 R (Hfootnote.8) 778 0 R (Hfootnote.9) 779 0 R (Item.1) 513 0 R (Item.10) 627 0 R (Item.11) 654 0 R (Item.12) 655 0 R (Item.13) 656 0 R (Item.14) 657 0 R (Item.15) 668 0 R (Item.16) 669 0 R (Item.17) 670 0 R (Item.18) 684 0 R (Item.19) 690 0 R (Item.2) 514 0 R (Item.20) 691 0 R (Item.21) 692 0 R (Item.22) 693 0 R (Item.23) 744 0 R (Item.24) 745 0 R (Item.25) 746 0 R (Item.26) 769 0 R (Item.27) 770 0 R (Item.28) 807 0 R (Item.29) 808 0 R (Item.3) 515 0 R (Item.30) 809 0 R (Item.31) 810 0 R (Item.32) 1139 0 R (Item.33) 1140 0 R (Item.34) 1146 0 R (Item.35) 1148 0 R (Item.36) 1149 0 R (Item.37) 1150 0 R (Item.38) 1158 0 R (Item.39) 1159 0 R (Item.4) 516 0 R (Item.40) 1160 0 R (Item.41) 1161 0 R (Item.42) 1162 0 R (Item.43) 1168 0 R (Item.44) 1169 0 R (Item.45) 1170 0 R (Item.46) 1171 0 R (Item.47) 1204 0 R (Item.48) 1205 0 R (Item.49) 1246 0 R (Item.5) 530 0 R (Item.50) 1247 0 R (Item.51) 1248 0 R (Item.52) 1774 0 R (Item.53) 1775 0 R (Item.6) 531 0 R (Item.7) 533 0 R (Item.8) 534 0 R (Item.9) 626 0 R (equation.1) 1727 0 R (equation.10) 1736 0 R (equation.11) 1737 0 R (equation.12) 1738 0 R (equation.13) 1739 0 R (equation.14) 1749 0 R (equation.15) 1750 0 R (equation.16) 1751 0 R (equation.17) 1752 0 R (equation.18) 1753 0 R (equation.19) 1754 0 R (equation.2) 1728 0 R (equation.20) 369 0 R (equation.3) 1729 0 R (equation.4) 1730 0 R (equation.5) 1731 0 R (equation.6) 1732 0 R (equation.7) 1733 0 R (equation.8) 1734 0 R (equation.9) 1735 0 R (figure.1) 867 0 R (figure.10) 1714 0 R (figure.11) 1776 0 R (figure.2) 967 0 R (figure.3) 981 0 R (figure.4) 985 0 R (figure.5) 1072 0 R (figure.6) 1090 0 R (figure.7) 1265 0 R (figure.8) 1679 0 R (figure.9) 1696 0 R (page.1) 376 0 R (page.10) 550 0 R (page.100) 1787 0 R (page.101) 1796 0 R (page.102) 1802 0 R (page.103) 1902 0 R (page.11) 555 0 R (page.12) 562 0 R (page.13) 567 0 R (page.14) 573 0 R (page.15) 578 0 R (page.16) 586 0 R (page.17) 591 0 R (page.18) 596 0 R (page.19) 605 0 R (page.2) 385 0 R (page.20) 612 0 R (page.21) 619 0 R (page.22) 628 0 R (page.23) 634 0 R (page.24) 641 0 R (page.25) 646 0 R (page.26) 658 0 R (page.27) 671 0 R (page.28) 679 0 R (page.29) 685 0 R (page.3) 438 0 R (page.30) 694 0 R (page.31) 699 0 R (page.32) 708 0 R (page.33) 714 0 R (page.34) 720 0 R (page.35) 729 0 R (page.36) 737 0 R (page.37) 747 0 R (page.38) 753 0 R (page.39) 763 0 R (page.4) 490 0 R (page.40) 771 0 R (page.41) 780 0 R (page.42) 789 0 R (page.43) 798 0 R (page.44) 811 0 R (page.45) 817 0 R (page.46) 823 0 R (page.47) 829 0 R (page.48) 836 0 R (page.49) 842 0 R (page.5) 498 0 R (page.50) 849 0 R (page.51) 856 0 R (page.52) 862 0 R (page.53) 876 0 R (page.54) 884 0 R (page.55) 929 0 R (page.56) 935 0 R (page.57) 942 0 R (page.58) 949 0 R (page.59) 955 0 R (page.6) 505 0 R (page.60) 962 0 R (page.61) 970 0 R (page.62) 987 0 R (page.63) 997 0 R (page.64) 1053 0 R (page.65) 1060 0 R (page.66) 1065 0 R (page.67) 1074 0 R (page.68) 1096 0 R (page.69) 1101 0 R (page.7) 517 0 R (page.70) 1141 0 R (page.71) 1151 0 R (page.72) 1163 0 R (page.73) 1172 0 R (page.74) 1178 0 R (page.75) 1183 0 R (page.76) 1188 0 R (page.77) 1193 0 R (page.78) 1198 0 R (page.79) 1206 0 R (page.8) 525 0 R (page.80) 1212 0 R (page.81) 1217 0 R (page.82) 1223 0 R (page.83) 1228 0 R (page.84) 1234 0 R (page.85) 1239 0 R (page.86) 1249 0 R (page.87) 1255 0 R (page.88) 1260 0 R (page.89) 1267 0 R (page.9) 537 0 R (page.90) 1277 0 R (page.91) 1658 0 R (page.92) 1665 0 R (page.93) 1674 0 R (page.94) 1682 0 R (page.95) 1699 0 R (page.96) 1716 0 R (page.97) 1740 0 R (page.98) 1755 0 R (page.99) 1778 0 R (section*.1) 384 0 R (section*.2) 1801 0 R (section.1) 5 0 R (section.2) 25 0 R (section.3) 61 0 R (section.4) 97 0 R (section.5) 101 0 R (section.6) 313 0 R (section.7) 337 0 R (section.8) 353 0 R (subsection.1.1) 9 0 R (subsection.1.2) 13 0 R (subsection.1.3) 17 0 R (subsection.1.4) 21 0 R (subsection.2.1) 29 0 R (subsection.2.2) 33 0 R (subsection.2.3) 37 0 R (subsection.2.4) 57 0 R (subsection.3.1) 65 0 R (subsection.3.2) 69 0 R (subsection.3.3) 73 0 R (subsection.3.4) 77 0 R (subsection.3.5) 81 0 R (subsection.3.6) 85 0 R (subsection.3.7) 89 0 R (subsection.3.8) 93 0 R (subsection.5.1) 105 0 R (subsection.5.10) 161 0 R (subsection.5.11) 181 0 R (subsection.5.12) 197 0 R (subsection.5.13) 201 0 R (subsection.5.14) 221 0 R (subsection.5.15) 237 0 R (subsection.5.16) 241 0 R (subsection.5.17) 257 0 R (subsection.5.18) 273 0 R (subsection.5.19) 293 0 R (subsection.5.2) 109 0 R (subsection.5.20) 309 0 R (subsection.5.3) 113 0 R (subsection.5.4) 137 0 R (subsection.5.5) 141 0 R (subsection.5.6) 145 0 R (subsection.5.7) 149 0 R (subsection.5.8) 153 0 R (subsection.5.9) 157 0 R (subsection.6.1) 317 0 R (subsection.6.2) 321 0 R (subsection.6.3) 325 0 R (subsection.6.4) 329 0 R (subsection.6.5) 333 0 R (subsection.7.1) 341 0 R (subsection.7.2) 345 0 R (subsection.7.3) 349 0 R (subsection.8.1) 357 0 R (subsection.8.2) 361 0 R (subsection.8.3) 365 0 R (subsubsection.2.3.1) 41 0 R (subsubsection.2.3.2) 45 0 R (subsubsection.2.3.3) 49 0 R (subsubsection.2.3.4) 53 0 R (subsubsection.5.10.1) 165 0 R (subsubsection.5.10.2) 169 0 R (subsubsection.5.10.3) 173 0 R (subsubsection.5.10.4) 177 0 R (subsubsection.5.11.1) 185 0 R (subsubsection.5.11.2) 189 0 R (subsubsection.5.11.3) 193 0 R (subsubsection.5.13.1) 205 0 R (subsubsection.5.13.2) 209 0 R (subsubsection.5.13.3) 213 0 R (subsubsection.5.13.4) 217 0 R (subsubsection.5.14.1) 225 0 R (subsubsection.5.14.2) 229 0 R (subsubsection.5.14.3) 233 0 R (subsubsection.5.16.1) 245 0 R (subsubsection.5.16.2) 249 0 R (subsubsection.5.16.3) 253 0 R (subsubsection.5.17.1) 261 0 R (subsubsection.5.17.2) 265 0 R (subsubsection.5.17.3) 269 0 R (subsubsection.5.18.1) 277 0 R (subsubsection.5.18.2) 281 0 R (subsubsection.5.18.3) 285 0 R (subsubsection.5.18.4) 289 0 R (subsubsection.5.19.1) 297 0 R (subsubsection.5.19.2) 301 0 R (subsubsection.5.19.3) 305 0 R (subsubsection.5.3.1) 117 0 R (subsubsection.5.3.2) 121 0 R (subsubsection.5.3.3) 125 0 R (subsubsection.5.3.4) 129 0 R (subsubsection.5.3.5) 133 0 R] /Limits [(Doc-Start) (subsubsection.5.3.5)] >> endobj 2135 0 obj << /Kids [2134 0 R] >> endobj 2136 0 obj << /Dests 2135 0 R >> endobj 2137 0 obj << /Type /Catalog /Pages 2132 0 R /Outlines 2133 0 R /Names 2136 0 R /PageMode /UseOutlines /URI << /Base () >> /ViewerPreferences << >> /OpenAction 374 0 R >> endobj 2138 0 obj << /Author () /Title () /Subject () /Creator (LaTeX with hyperref package) /Producer (pdfTeX13.d) /Keywords () /Creator (TeX) /Producer (pdfTeX-0.13d) /CreationDate (D:20050518211800) >> endobj xref 0 2139 0000000000 65535 f 0000009833 00000 n 0000011151 00000 n 0000011238 00000 n 0000011338 00000 n 0000036423 00000 n 0000000009 00000 n 0000736800 00000 n 0000000054 00000 n 0000036478 00000 n 0000000084 00000 n 0000736727 00000 n 0000000135 00000 n 0000040411 00000 n 0000000173 00000 n 0000736641 00000 n 0000000224 00000 n 0000043624 00000 n 0000000265 00000 n 0000736555 00000 n 0000000316 00000 n 0000043679 00000 n 0000000345 00000 n 0000736482 00000 n 0000000396 00000 n 0000047583 00000 n 0000000455 00000 n 0000736357 00000 n 0000000501 00000 n 0000047639 00000 n 0000000535 00000 n 0000736283 00000 n 0000000586 00000 n 0000051770 00000 n 0000000656 00000 n 0000736196 00000 n 0000000707 00000 n 0000051826 00000 n 0000000752 00000 n 0000736072 00000 n 0000000803 00000 n 0000051882 00000 n 0000000835 00000 n 0000735998 00000 n 0000000891 00000 n 0000056928 00000 n 0000000942 00000 n 0000735911 00000 n 0000000998 00000 n 0000063827 00000 n 0000001045 00000 n 0000735824 00000 n 0000001101 00000 n 0000063883 00000 n 0000001142 00000 n 0000735750 00000 n 0000001198 00000 n 0000066022 00000 n 0000001243 00000 n 0000735676 00000 n 0000001294 00000 n 0000071895 00000 n 0000001346 00000 n 0000735550 00000 n 0000001392 00000 n 0000071951 00000 n 0000001429 00000 n 0000735476 00000 n 0000001480 00000 n 0000078788 00000 n 0000001542 00000 n 0000735389 00000 n 0000001593 00000 n 0000078844 00000 n 0000001662 00000 n 0000735302 00000 n 0000001713 00000 n 0000086492 00000 n 0000001761 00000 n 0000735215 00000 n 0000001812 00000 n 0000086548 00000 n 0000001849 00000 n 0000735128 00000 n 0000001900 00000 n 0000086604 00000 n 0000001936 00000 n 0000735041 00000 n 0000001987 00000 n 0000097785 00000 n 0000002035 00000 n 0000734954 00000 n 0000002086 00000 n 0000097955 00000 n 0000002140 00000 n 0000734880 00000 n 0000002191 00000 n 0000099973 00000 n 0000002240 00000 n 0000734789 00000 n 0000002286 00000 n 0000103484 00000 n 0000002326 00000 n 0000734656 00000 n 0000002373 00000 n 0000103541 00000 n 0000002404 00000 n 0000734577 00000 n 0000002456 00000 n 0000103598 00000 n 0000002512 00000 n 0000734484 00000 n 0000002564 00000 n 0000112807 00000 n 0000002650 00000 n 0000734352 00000 n 0000002702 00000 n 0000112864 00000 n 0000002764 00000 n 0000734273 00000 n 0000002821 00000 n 0000117428 00000 n 0000002864 00000 n 0000734180 00000 n 0000002921 00000 n 0000124348 00000 n 0000002995 00000 n 0000734087 00000 n 0000003052 00000 n 0000124404 00000 n 0000003100 00000 n 0000733994 00000 n 0000003157 00000 n 0000128309 00000 n 0000003208 00000 n 0000733915 00000 n 0000003265 00000 n 0000132526 00000 n 0000003326 00000 n 0000733822 00000 n 0000003378 00000 n 0000136185 00000 n 0000003415 00000 n 0000733729 00000 n 0000003467 00000 n 0000161569 00000 n 0000003505 00000 n 0000733636 00000 n 0000003557 00000 n 0000164471 00000 n 0000003601 00000 n 0000733543 00000 n 0000003653 00000 n 0000172965 00000 n 0000003704 00000 n 0000733450 00000 n 0000003756 00000 n 0000181813 00000 n 0000003789 00000 n 0000733357 00000 n 0000003841 00000 n 0000185085 00000 n 0000003901 00000 n 0000733225 00000 n 0000003954 00000 n 0000188026 00000 n 0000004016 00000 n 0000733146 00000 n 0000004074 00000 n 0000191168 00000 n 0000004130 00000 n 0000733053 00000 n 0000004188 00000 n 0000201455 00000 n 0000004236 00000 n 0000732960 00000 n 0000004294 00000 n 0000204786 00000 n 0000004341 00000 n 0000732881 00000 n 0000004399 00000 n 0000208415 00000 n 0000004445 00000 n 0000732749 00000 n 0000004498 00000 n 0000208472 00000 n 0000004541 00000 n 0000732670 00000 n 0000004599 00000 n 0000215510 00000 n 0000004644 00000 n 0000732577 00000 n 0000004702 00000 n 0000230135 00000 n 0000004754 00000 n 0000732498 00000 n 0000004812 00000 n 0000234368 00000 n 0000004886 00000 n 0000732405 00000 n 0000004939 00000 n 0000242120 00000 n 0000004989 00000 n 0000732273 00000 n 0000005042 00000 n 0000242177 00000 n 0000005074 00000 n 0000732194 00000 n 0000005132 00000 n 0000245899 00000 n 0000005171 00000 n 0000732101 00000 n 0000005229 00000 n 0000248903 00000 n 0000005277 00000 n 0000732008 00000 n 0000005335 00000 n 0000252772 00000 n 0000005373 00000 n 0000731929 00000 n 0000005431 00000 n 0000257985 00000 n 0000005490 00000 n 0000731797 00000 n 0000005543 00000 n 0000272724 00000 n 0000005584 00000 n 0000731718 00000 n 0000005642 00000 n 0000279466 00000 n 0000005676 00000 n 0000731625 00000 n 0000005734 00000 n 0000288949 00000 n 0000005768 00000 n 0000731546 00000 n 0000005826 00000 n 0000319015 00000 n 0000005870 00000 n 0000731453 00000 n 0000005923 00000 n 0000319073 00000 n 0000005956 00000 n 0000731321 00000 n 0000006009 00000 n 0000319130 00000 n 0000006057 00000 n 0000731242 00000 n 0000006115 00000 n 0000323310 00000 n 0000006155 00000 n 0000731149 00000 n 0000006213 00000 n 0000327097 00000 n 0000006262 00000 n 0000731070 00000 n 0000006320 00000 n 0000334168 00000 n 0000006357 00000 n 0000730938 00000 n 0000006410 00000 n 0000334225 00000 n 0000006445 00000 n 0000730859 00000 n 0000006503 00000 n 0000338536 00000 n 0000006560 00000 n 0000730766 00000 n 0000006618 00000 n 0000342141 00000 n 0000006662 00000 n 0000730687 00000 n 0000006720 00000 n 0000342199 00000 n 0000006772 00000 n 0000730555 00000 n 0000006825 00000 n 0000342256 00000 n 0000006865 00000 n 0000730476 00000 n 0000006923 00000 n 0000345488 00000 n 0000006958 00000 n 0000730383 00000 n 0000007016 00000 n 0000353414 00000 n 0000007070 00000 n 0000730290 00000 n 0000007128 00000 n 0000353590 00000 n 0000007212 00000 n 0000730211 00000 n 0000007270 00000 n 0000357372 00000 n 0000007297 00000 n 0000730079 00000 n 0000007350 00000 n 0000357430 00000 n 0000007384 00000 n 0000730000 00000 n 0000007442 00000 n 0000361287 00000 n 0000007490 00000 n 0000729907 00000 n 0000007548 00000 n 0000361345 00000 n 0000007590 00000 n 0000729828 00000 n 0000007648 00000 n 0000365078 00000 n 0000007680 00000 n 0000729749 00000 n 0000007733 00000 n 0000371671 00000 n 0000007775 00000 n 0000729616 00000 n 0000007822 00000 n 0000371729 00000 n 0000007859 00000 n 0000729537 00000 n 0000007911 00000 n 0000371787 00000 n 0000007959 00000 n 0000729444 00000 n 0000008011 00000 n 0000374795 00000 n 0000008066 00000 n 0000729351 00000 n 0000008118 00000 n 0000382102 00000 n 0000008157 00000 n 0000729258 00000 n 0000008209 00000 n 0000382160 00000 n 0000008265 00000 n 0000729179 00000 n 0000008317 00000 n 0000387081 00000 n 0000008364 00000 n 0000729046 00000 n 0000008411 00000 n 0000387139 00000 n 0000008455 00000 n 0000728967 00000 n 0000008507 00000 n 0000446351 00000 n 0000008547 00000 n 0000728874 00000 n 0000008599 00000 n 0000447550 00000 n 0000008654 00000 n 0000728795 00000 n 0000008706 00000 n 0000454852 00000 n 0000008759 00000 n 0000728662 00000 n 0000008806 00000 n 0000454910 00000 n 0000008844 00000 n 0000728583 00000 n 0000008896 00000 n 0000461920 00000 n 0000008924 00000 n 0000728490 00000 n 0000008976 00000 n 0000484253 00000 n 0000009025 00000 n 0000728411 00000 n 0000009077 00000 n 0000489454 00000 n 0000009141 00000 n 0000728331 00000 n 0000009190 00000 n 0000009713 00000 n 0000009224 00000 n 0000011520 00000 n 0000011463 00000 n 0000011577 00000 n 0000009276 00000 n 0000009692 00000 n 0000711134 00000 n 0000704732 00000 n 0000699716 00000 n 0000725674 00000 n 0000022085 00000 n 0000022028 00000 n 0000022141 00000 n 0000014267 00000 n 0000011688 00000 n 0000014245 00000 n 0000014759 00000 n 0000683608 00000 n 0000014910 00000 n 0000662456 00000 n 0000643670 00000 n 0000015071 00000 n 0000015232 00000 n 0000015393 00000 n 0000015553 00000 n 0000015705 00000 n 0000015865 00000 n 0000016024 00000 n 0000016185 00000 n 0000016352 00000 n 0000016518 00000 n 0000016685 00000 n 0000016852 00000 n 0000017013 00000 n 0000017165 00000 n 0000017326 00000 n 0000017487 00000 n 0000017648 00000 n 0000017809 00000 n 0000017969 00000 n 0000018130 00000 n 0000018290 00000 n 0000018451 00000 n 0000018603 00000 n 0000018755 00000 n 0000018916 00000 n 0000019077 00000 n 0000019237 00000 n 0000019404 00000 n 0000019571 00000 n 0000019737 00000 n 0000019903 00000 n 0000020070 00000 n 0000020231 00000 n 0000020392 00000 n 0000020553 00000 n 0000020714 00000 n 0000020875 00000 n 0000021036 00000 n 0000021198 00000 n 0000021366 00000 n 0000021534 00000 n 0000021701 00000 n 0000021868 00000 n 0000032772 00000 n 0000032829 00000 n 0000024583 00000 n 0000022252 00000 n 0000024561 00000 n 0000025091 00000 n 0000025259 00000 n 0000025427 00000 n 0000025594 00000 n 0000025756 00000 n 0000025918 00000 n 0000026085 00000 n 0000026253 00000 n 0000026421 00000 n 0000026589 00000 n 0000026749 00000 n 0000026917 00000 n 0000027084 00000 n 0000027252 00000 n 0000027413 00000 n 0000027573 00000 n 0000027741 00000 n 0000027908 00000 n 0000028076 00000 n 0000028238 00000 n 0000028406 00000 n 0000028574 00000 n 0000028741 00000 n 0000028902 00000 n 0000029070 00000 n 0000029238 00000 n 0000029405 00000 n 0000029573 00000 n 0000029735 00000 n 0000029903 00000 n 0000030071 00000 n 0000030239 00000 n 0000030401 00000 n 0000030553 00000 n 0000030714 00000 n 0000030875 00000 n 0000031035 00000 n 0000031195 00000 n 0000031355 00000 n 0000031503 00000 n 0000031664 00000 n 0000031825 00000 n 0000031986 00000 n 0000032138 00000 n 0000032299 00000 n 0000032460 00000 n 0000032620 00000 n 0000036366 00000 n 0000036532 00000 n 0000036246 00000 n 0000032927 00000 n 0000036224 00000 n 0000637756 00000 n 0000623630 00000 n 0000618021 00000 n 0000040354 00000 n 0000040466 00000 n 0000039881 00000 n 0000036682 00000 n 0000039859 00000 n 0000040029 00000 n 0000040192 00000 n 0000043567 00000 n 0000043734 00000 n 0000043271 00000 n 0000040590 00000 n 0000043249 00000 n 0000611430 00000 n 0000043411 00000 n 0000600817 00000 n 0000047694 00000 n 0000047751 00000 n 0000047806 00000 n 0000047863 00000 n 0000047526 00000 n 0000047920 00000 n 0000047225 00000 n 0000043884 00000 n 0000047203 00000 n 0000047365 00000 n 0000595339 00000 n 0000725792 00000 n 0000051713 00000 n 0000051938 00000 n 0000051593 00000 n 0000048096 00000 n 0000051571 00000 n 0000056701 00000 n 0000056757 00000 n 0000056984 00000 n 0000056814 00000 n 0000056871 00000 n 0000057045 00000 n 0000057106 00000 n 0000056644 00000 n 0000057165 00000 n 0000055672 00000 n 0000052114 00000 n 0000055650 00000 n 0000055844 00000 n 0000056006 00000 n 0000056168 00000 n 0000056326 00000 n 0000056485 00000 n 0000590045 00000 n 0000576233 00000 n 0000566627 00000 n 0000060137 00000 n 0000060194 00000 n 0000060017 00000 n 0000057328 00000 n 0000059995 00000 n 0000063770 00000 n 0000063939 00000 n 0000063304 00000 n 0000060318 00000 n 0000063282 00000 n 0000063452 00000 n 0000063609 00000 n 0000065965 00000 n 0000066078 00000 n 0000065845 00000 n 0000064076 00000 n 0000065823 00000 n 0000066930 00000 n 0000066987 00000 n 0000066810 00000 n 0000066176 00000 n 0000066789 00000 n 0000725910 00000 n 0000067842 00000 n 0000067899 00000 n 0000067722 00000 n 0000067072 00000 n 0000067701 00000 n 0000071838 00000 n 0000072007 00000 n 0000071366 00000 n 0000067984 00000 n 0000071344 00000 n 0000562762 00000 n 0000071514 00000 n 0000071676 00000 n 0000075422 00000 n 0000075479 00000 n 0000075302 00000 n 0000072183 00000 n 0000075280 00000 n 0000078731 00000 n 0000078900 00000 n 0000078611 00000 n 0000075590 00000 n 0000078589 00000 n 0000082560 00000 n 0000082617 00000 n 0000081928 00000 n 0000079037 00000 n 0000081906 00000 n 0000082084 00000 n 0000082246 00000 n 0000082403 00000 n 0000086660 00000 n 0000086435 00000 n 0000086720 00000 n 0000086136 00000 n 0000082728 00000 n 0000086114 00000 n 0000086276 00000 n 0000726028 00000 n 0000090052 00000 n 0000090109 00000 n 0000089580 00000 n 0000086883 00000 n 0000089558 00000 n 0000089728 00000 n 0000089890 00000 n 0000094227 00000 n 0000094284 00000 n 0000093753 00000 n 0000090207 00000 n 0000093731 00000 n 0000093901 00000 n 0000094064 00000 n 0000097841 00000 n 0000097898 00000 n 0000097728 00000 n 0000098011 00000 n 0000097420 00000 n 0000094421 00000 n 0000097398 00000 n 0000097560 00000 n 0000099916 00000 n 0000100029 00000 n 0000099443 00000 n 0000098135 00000 n 0000099421 00000 n 0000099591 00000 n 0000099754 00000 n 0000103427 00000 n 0000103655 00000 n 0000103307 00000 n 0000100140 00000 n 0000103285 00000 n 0000107907 00000 n 0000107964 00000 n 0000107440 00000 n 0000103818 00000 n 0000107418 00000 n 0000107588 00000 n 0000107748 00000 n 0000726146 00000 n 0000112921 00000 n 0000112978 00000 n 0000113035 00000 n 0000117201 00000 n 0000112750 00000 n 0000113091 00000 n 0000111762 00000 n 0000108075 00000 n 0000111740 00000 n 0000111934 00000 n 0000112090 00000 n 0000112252 00000 n 0000112414 00000 n 0000112582 00000 n 0000117258 00000 n 0000117314 00000 n 0000117371 00000 n 0000117144 00000 n 0000117485 00000 n 0000116508 00000 n 0000113228 00000 n 0000116486 00000 n 0000116664 00000 n 0000116825 00000 n 0000116988 00000 n 0000120940 00000 n 0000120997 00000 n 0000120820 00000 n 0000117609 00000 n 0000120798 00000 n 0000128025 00000 n 0000124291 00000 n 0000124461 00000 n 0000124171 00000 n 0000121095 00000 n 0000124149 00000 n 0000128082 00000 n 0000128139 00000 n 0000128196 00000 n 0000128252 00000 n 0000127968 00000 n 0000128366 00000 n 0000127848 00000 n 0000124585 00000 n 0000127826 00000 n 0000132469 00000 n 0000132583 00000 n 0000132000 00000 n 0000128490 00000 n 0000131978 00000 n 0000132148 00000 n 0000132308 00000 n 0000554555 00000 n 0000726264 00000 n 0000136128 00000 n 0000136241 00000 n 0000136008 00000 n 0000132720 00000 n 0000135986 00000 n 0000542247 00000 n 0000139592 00000 n 0000139649 00000 n 0000139295 00000 n 0000136365 00000 n 0000139273 00000 n 0000139435 00000 n 0000143990 00000 n 0000144047 00000 n 0000143347 00000 n 0000139760 00000 n 0000143325 00000 n 0000143503 00000 n 0000143665 00000 n 0000143827 00000 n 0000148570 00000 n 0000148513 00000 n 0000148631 00000 n 0000148047 00000 n 0000144158 00000 n 0000148025 00000 n 0000148195 00000 n 0000148354 00000 n 0000153387 00000 n 0000153330 00000 n 0000153448 00000 n 0000152863 00000 n 0000148794 00000 n 0000152841 00000 n 0000153011 00000 n 0000153173 00000 n 0000157722 00000 n 0000157779 00000 n 0000157836 00000 n 0000157665 00000 n 0000157893 00000 n 0000157545 00000 n 0000153637 00000 n 0000157523 00000 n 0000726382 00000 n 0000161512 00000 n 0000161626 00000 n 0000160534 00000 n 0000158017 00000 n 0000160512 00000 n 0000160706 00000 n 0000160869 00000 n 0000161030 00000 n 0000161192 00000 n 0000161355 00000 n 0000164414 00000 n 0000164528 00000 n 0000164294 00000 n 0000161737 00000 n 0000164272 00000 n 0000168739 00000 n 0000168626 00000 n 0000168682 00000 n 0000168569 00000 n 0000168799 00000 n 0000168100 00000 n 0000164652 00000 n 0000168078 00000 n 0000168248 00000 n 0000168410 00000 n 0000173022 00000 n 0000173083 00000 n 0000172908 00000 n 0000173143 00000 n 0000172278 00000 n 0000168936 00000 n 0000172256 00000 n 0000172434 00000 n 0000172592 00000 n 0000172751 00000 n 0000177474 00000 n 0000177417 00000 n 0000177534 00000 n 0000176621 00000 n 0000173319 00000 n 0000176599 00000 n 0000176785 00000 n 0000176942 00000 n 0000177099 00000 n 0000177258 00000 n 0000181756 00000 n 0000181870 00000 n 0000181101 00000 n 0000177697 00000 n 0000181079 00000 n 0000181257 00000 n 0000181420 00000 n 0000181588 00000 n 0000726500 00000 n 0000185142 00000 n 0000185199 00000 n 0000185255 00000 n 0000185312 00000 n 0000185028 00000 n 0000185369 00000 n 0000184726 00000 n 0000182007 00000 n 0000184704 00000 n 0000184866 00000 n 0000187969 00000 n 0000188083 00000 n 0000187666 00000 n 0000185493 00000 n 0000187644 00000 n 0000187806 00000 n 0000191111 00000 n 0000191225 00000 n 0000190809 00000 n 0000188194 00000 n 0000190787 00000 n 0000190949 00000 n 0000194599 00000 n 0000194656 00000 n 0000194126 00000 n 0000191349 00000 n 0000194104 00000 n 0000194274 00000 n 0000194437 00000 n 0000197891 00000 n 0000197948 00000 n 0000197589 00000 n 0000194754 00000 n 0000197567 00000 n 0000197729 00000 n 0000201398 00000 n 0000201512 00000 n 0000201097 00000 n 0000198072 00000 n 0000201075 00000 n 0000201237 00000 n 0000726618 00000 n 0000204729 00000 n 0000204843 00000 n 0000204252 00000 n 0000201649 00000 n 0000204230 00000 n 0000204400 00000 n 0000204562 00000 n 0000208358 00000 n 0000208529 00000 n 0000208055 00000 n 0000204954 00000 n 0000208033 00000 n 0000208195 00000 n 0000212157 00000 n 0000212214 00000 n 0000212037 00000 n 0000208679 00000 n 0000212015 00000 n 0000226934 00000 n 0000217046 00000 n 0000218258 00000 n 0000219470 00000 n 0000220696 00000 n 0000221923 00000 n 0000223153 00000 n 0000224388 00000 n 0000225620 00000 n 0000215453 00000 n 0000215567 00000 n 0000215158 00000 n 0000212338 00000 n 0000215136 00000 n 0000534846 00000 n 0000528442 00000 n 0000215298 00000 n 0000226877 00000 n 0000226996 00000 n 0000216926 00000 n 0000215755 00000 n 0000216904 00000 n 0000218189 00000 n 0000217265 00000 n 0000217285 00000 n 0000218105 00000 n 0000218084 00000 n 0000219401 00000 n 0000218477 00000 n 0000218497 00000 n 0000219317 00000 n 0000219296 00000 n 0000220627 00000 n 0000219689 00000 n 0000219709 00000 n 0000220543 00000 n 0000220522 00000 n 0000221854 00000 n 0000220915 00000 n 0000220935 00000 n 0000221770 00000 n 0000221749 00000 n 0000223084 00000 n 0000222142 00000 n 0000222162 00000 n 0000223000 00000 n 0000222979 00000 n 0000224319 00000 n 0000223372 00000 n 0000223392 00000 n 0000224235 00000 n 0000224214 00000 n 0000225551 00000 n 0000224607 00000 n 0000224627 00000 n 0000225467 00000 n 0000225446 00000 n 0000226808 00000 n 0000225839 00000 n 0000225859 00000 n 0000226724 00000 n 0000226703 00000 n 0000230078 00000 n 0000230192 00000 n 0000229958 00000 n 0000227239 00000 n 0000229936 00000 n 0000726736 00000 n 0000234311 00000 n 0000234425 00000 n 0000233850 00000 n 0000230354 00000 n 0000233828 00000 n 0000233998 00000 n 0000234155 00000 n 0000238244 00000 n 0000238301 00000 n 0000237770 00000 n 0000234600 00000 n 0000237748 00000 n 0000237918 00000 n 0000238081 00000 n 0000242063 00000 n 0000242234 00000 n 0000241761 00000 n 0000238412 00000 n 0000241739 00000 n 0000241901 00000 n 0000245842 00000 n 0000245956 00000 n 0000245371 00000 n 0000242384 00000 n 0000245349 00000 n 0000245519 00000 n 0000245680 00000 n 0000248846 00000 n 0000248960 00000 n 0000248726 00000 n 0000246067 00000 n 0000248704 00000 n 0000252710 00000 n 0000251722 00000 n 0000258042 00000 n 0000252653 00000 n 0000252829 00000 n 0000251582 00000 n 0000249084 00000 n 0000251560 00000 n 0000252498 00000 n 0000726854 00000 n 0000252429 00000 n 0000251931 00000 n 0000251951 00000 n 0000252408 00000 n 0000272600 00000 n 0000260326 00000 n 0000262125 00000 n 0000258103 00000 n 0000272662 00000 n 0000263918 00000 n 0000257928 00000 n 0000258164 00000 n 0000257127 00000 n 0000252981 00000 n 0000257105 00000 n 0000257291 00000 n 0000257451 00000 n 0000257612 00000 n 0000257768 00000 n 0000276756 00000 n 0000272543 00000 n 0000272781 00000 n 0000260184 00000 n 0000258353 00000 n 0000260161 00000 n 0000272386 00000 n 0000262053 00000 n 0000260548 00000 n 0000260569 00000 n 0000260874 00000 n 0000260853 00000 n 0000262031 00000 n 0000263846 00000 n 0000262347 00000 n 0000262368 00000 n 0000262673 00000 n 0000262652 00000 n 0000263824 00000 n 0000272314 00000 n 0000264140 00000 n 0000264161 00000 n 0000266962 00000 n 0000266939 00000 n 0000267401 00000 n 0000268886 00000 n 0000269148 00000 n 0000269429 00000 n 0000269713 00000 n 0000269953 00000 n 0000270236 00000 n 0000270503 00000 n 0000270742 00000 n 0000271018 00000 n 0000271283 00000 n 0000271499 00000 n 0000271734 00000 n 0000271850 00000 n 0000271966 00000 n 0000272082 00000 n 0000272198 00000 n 0000269126 00000 n 0000269407 00000 n 0000269691 00000 n 0000269931 00000 n 0000270214 00000 n 0000270481 00000 n 0000270720 00000 n 0000270996 00000 n 0000271261 00000 n 0000271477 00000 n 0000271712 00000 n 0000271829 00000 n 0000271945 00000 n 0000272061 00000 n 0000272177 00000 n 0000272293 00000 n 0000276697 00000 n 0000276818 00000 n 0000276229 00000 n 0000272988 00000 n 0000276206 00000 n 0000276382 00000 n 0000276541 00000 n 0000279407 00000 n 0000279524 00000 n 0000279284 00000 n 0000277021 00000 n 0000279261 00000 n 0000282256 00000 n 0000282315 00000 n 0000281957 00000 n 0000279636 00000 n 0000281934 00000 n 0000282101 00000 n 0000289007 00000 n 0000288885 00000 n 0000285459 00000 n 0000288826 00000 n 0000289070 00000 n 0000285287 00000 n 0000282427 00000 n 0000285264 00000 n 0000288180 00000 n 0000288348 00000 n 0000288508 00000 n 0000288665 00000 n 0000726975 00000 n 0000288108 00000 n 0000285682 00000 n 0000285703 00000 n 0000286017 00000 n 0000285996 00000 n 0000288085 00000 n 0000315181 00000 n 0000294912 00000 n 0000298401 00000 n 0000302160 00000 n 0000306392 00000 n 0000311246 00000 n 0000291842 00000 n 0000291901 00000 n 0000291718 00000 n 0000289290 00000 n 0000291695 00000 n 0000315122 00000 n 0000315245 00000 n 0000294749 00000 n 0000292013 00000 n 0000294726 00000 n 0000314653 00000 n 0000314810 00000 n 0000314966 00000 n 0000298329 00000 n 0000295130 00000 n 0000295151 00000 n 0000295457 00000 n 0000295436 00000 n 0000298306 00000 n 0000302088 00000 n 0000298619 00000 n 0000298640 00000 n 0000298945 00000 n 0000298924 00000 n 0000302065 00000 n 0000306320 00000 n 0000302378 00000 n 0000302399 00000 n 0000302705 00000 n 0000302684 00000 n 0000306297 00000 n 0000311174 00000 n 0000306610 00000 n 0000306631 00000 n 0000306937 00000 n 0000306916 00000 n 0000311151 00000 n 0000314581 00000 n 0000311464 00000 n 0000311485 00000 n 0000311791 00000 n 0000311770 00000 n 0000314558 00000 n 0000319188 00000 n 0000319247 00000 n 0000318956 00000 n 0000319306 00000 n 0000318832 00000 n 0000315460 00000 n 0000318809 00000 n 0000323075 00000 n 0000323368 00000 n 0000323134 00000 n 0000323193 00000 n 0000323252 00000 n 0000323016 00000 n 0000323430 00000 n 0000322533 00000 n 0000319457 00000 n 0000322510 00000 n 0000322687 00000 n 0000322848 00000 n 0000327155 00000 n 0000327214 00000 n 0000327272 00000 n 0000327331 00000 n 0000327390 00000 n 0000327038 00000 n 0000327449 00000 n 0000326914 00000 n 0000323594 00000 n 0000326891 00000 n 0000330655 00000 n 0000330714 00000 n 0000330773 00000 n 0000330832 00000 n 0000330596 00000 n 0000330891 00000 n 0000330472 00000 n 0000327574 00000 n 0000330449 00000 n 0000727100 00000 n 0000334109 00000 n 0000334283 00000 n 0000333985 00000 n 0000330990 00000 n 0000333962 00000 n 0000338477 00000 n 0000338594 00000 n 0000338353 00000 n 0000334408 00000 n 0000338330 00000 n 0000342082 00000 n 0000342314 00000 n 0000341958 00000 n 0000338706 00000 n 0000341935 00000 n 0000345429 00000 n 0000345546 00000 n 0000345305 00000 n 0000342439 00000 n 0000345282 00000 n 0000349639 00000 n 0000349698 00000 n 0000349331 00000 n 0000345658 00000 n 0000349308 00000 n 0000349476 00000 n 0000353472 00000 n 0000353531 00000 n 0000353355 00000 n 0000353648 00000 n 0000353231 00000 n 0000349810 00000 n 0000353208 00000 n 0000727225 00000 n 0000357313 00000 n 0000357488 00000 n 0000357189 00000 n 0000353747 00000 n 0000357166 00000 n 0000361228 00000 n 0000361403 00000 n 0000360914 00000 n 0000357613 00000 n 0000360891 00000 n 0000361059 00000 n 0000365019 00000 n 0000365136 00000 n 0000364895 00000 n 0000361528 00000 n 0000364872 00000 n 0000368258 00000 n 0000368317 00000 n 0000367950 00000 n 0000365261 00000 n 0000367927 00000 n 0000368095 00000 n 0000371612 00000 n 0000371845 00000 n 0000371488 00000 n 0000368429 00000 n 0000371465 00000 n 0000374736 00000 n 0000374853 00000 n 0000374427 00000 n 0000371983 00000 n 0000374404 00000 n 0000374572 00000 n 0000727350 00000 n 0000378950 00000 n 0000379009 00000 n 0000379068 00000 n 0000378891 00000 n 0000379127 00000 n 0000378583 00000 n 0000374965 00000 n 0000378560 00000 n 0000378728 00000 n 0000382043 00000 n 0000382218 00000 n 0000381919 00000 n 0000379265 00000 n 0000381896 00000 n 0000382840 00000 n 0000382899 00000 n 0000382716 00000 n 0000382343 00000 n 0000382694 00000 n 0000437596 00000 n 0000387955 00000 n 0000387022 00000 n 0000387197 00000 n 0000386382 00000 n 0000382985 00000 n 0000386359 00000 n 0000524347 00000 n 0000517328 00000 n 0000386545 00000 n 0000386702 00000 n 0000386859 00000 n 0000437537 00000 n 0000437660 00000 n 0000387831 00000 n 0000387350 00000 n 0000387809 00000 n 0000437465 00000 n 0000388178 00000 n 0000388199 00000 n 0000394514 00000 n 0000394491 00000 n 0000397790 00000 n 0000399275 00000 n 0000399510 00000 n 0000399713 00000 n 0000399916 00000 n 0000400143 00000 n 0000400379 00000 n 0000400590 00000 n 0000400848 00000 n 0000401065 00000 n 0000401317 00000 n 0000401579 00000 n 0000401849 00000 n 0000402112 00000 n 0000402316 00000 n 0000402573 00000 n 0000402824 00000 n 0000403049 00000 n 0000403272 00000 n 0000403493 00000 n 0000403784 00000 n 0000404071 00000 n 0000404374 00000 n 0000404584 00000 n 0000404894 00000 n 0000405159 00000 n 0000405442 00000 n 0000405674 00000 n 0000405962 00000 n 0000406251 00000 n 0000406575 00000 n 0000406866 00000 n 0000407168 00000 n 0000407443 00000 n 0000407726 00000 n 0000407944 00000 n 0000408171 00000 n 0000408457 00000 n 0000408734 00000 n 0000408976 00000 n 0000409180 00000 n 0000409387 00000 n 0000409627 00000 n 0000409842 00000 n 0000410180 00000 n 0000410397 00000 n 0000410620 00000 n 0000410822 00000 n 0000411091 00000 n 0000411375 00000 n 0000411587 00000 n 0000411849 00000 n 0000412093 00000 n 0000412314 00000 n 0000412555 00000 n 0000412780 00000 n 0000413028 00000 n 0000413271 00000 n 0000413506 00000 n 0000413709 00000 n 0000413950 00000 n 0000414181 00000 n 0000414406 00000 n 0000414615 00000 n 0000414826 00000 n 0000415067 00000 n 0000415325 00000 n 0000415585 00000 n 0000415798 00000 n 0000416061 00000 n 0000416327 00000 n 0000416557 00000 n 0000416791 00000 n 0000416995 00000 n 0000417199 00000 n 0000417446 00000 n 0000417695 00000 n 0000417915 00000 n 0000418166 00000 n 0000418425 00000 n 0000418658 00000 n 0000418861 00000 n 0000419075 00000 n 0000419283 00000 n 0000419504 00000 n 0000419726 00000 n 0000419974 00000 n 0000420258 00000 n 0000420468 00000 n 0000420709 00000 n 0000420955 00000 n 0000421206 00000 n 0000421449 00000 n 0000421672 00000 n 0000421889 00000 n 0000422109 00000 n 0000422360 00000 n 0000422576 00000 n 0000422782 00000 n 0000423020 00000 n 0000423249 00000 n 0000423479 00000 n 0000423699 00000 n 0000423957 00000 n 0000424172 00000 n 0000424380 00000 n 0000424641 00000 n 0000424891 00000 n 0000425139 00000 n 0000425348 00000 n 0000425570 00000 n 0000425812 00000 n 0000426066 00000 n 0000426316 00000 n 0000426539 00000 n 0000426809 00000 n 0000427053 00000 n 0000427268 00000 n 0000427517 00000 n 0000427721 00000 n 0000427920 00000 n 0000428156 00000 n 0000428403 00000 n 0000428634 00000 n 0000428899 00000 n 0000429107 00000 n 0000429347 00000 n 0000429592 00000 n 0000429834 00000 n 0000430036 00000 n 0000430295 00000 n 0000430517 00000 n 0000430736 00000 n 0000430985 00000 n 0000431201 00000 n 0000431448 00000 n 0000431669 00000 n 0000431785 00000 n 0000431901 00000 n 0000432017 00000 n 0000432133 00000 n 0000432249 00000 n 0000432365 00000 n 0000432480 00000 n 0000432596 00000 n 0000432712 00000 n 0000432828 00000 n 0000432944 00000 n 0000433060 00000 n 0000433176 00000 n 0000433292 00000 n 0000433408 00000 n 0000433524 00000 n 0000433640 00000 n 0000433756 00000 n 0000433872 00000 n 0000433988 00000 n 0000434104 00000 n 0000434220 00000 n 0000434336 00000 n 0000434452 00000 n 0000434567 00000 n 0000434683 00000 n 0000434799 00000 n 0000434915 00000 n 0000435031 00000 n 0000435147 00000 n 0000435263 00000 n 0000435379 00000 n 0000435494 00000 n 0000435610 00000 n 0000435726 00000 n 0000435842 00000 n 0000435958 00000 n 0000436074 00000 n 0000436190 00000 n 0000436306 00000 n 0000436422 00000 n 0000436538 00000 n 0000436654 00000 n 0000436770 00000 n 0000436886 00000 n 0000437002 00000 n 0000437117 00000 n 0000437233 00000 n 0000437349 00000 n 0000399488 00000 n 0000399691 00000 n 0000399894 00000 n 0000400121 00000 n 0000400357 00000 n 0000400568 00000 n 0000400826 00000 n 0000401043 00000 n 0000401295 00000 n 0000401557 00000 n 0000401827 00000 n 0000402090 00000 n 0000402294 00000 n 0000402551 00000 n 0000402802 00000 n 0000403027 00000 n 0000403250 00000 n 0000403471 00000 n 0000403762 00000 n 0000404049 00000 n 0000404352 00000 n 0000404562 00000 n 0000404872 00000 n 0000405137 00000 n 0000405420 00000 n 0000405652 00000 n 0000405940 00000 n 0000406229 00000 n 0000406553 00000 n 0000406844 00000 n 0000407146 00000 n 0000407421 00000 n 0000407704 00000 n 0000407922 00000 n 0000408149 00000 n 0000408435 00000 n 0000408712 00000 n 0000408954 00000 n 0000409158 00000 n 0000409365 00000 n 0000409605 00000 n 0000409820 00000 n 0000410158 00000 n 0000410375 00000 n 0000410598 00000 n 0000410800 00000 n 0000411069 00000 n 0000411353 00000 n 0000411565 00000 n 0000411827 00000 n 0000412071 00000 n 0000412292 00000 n 0000412533 00000 n 0000412758 00000 n 0000413006 00000 n 0000413249 00000 n 0000413484 00000 n 0000413687 00000 n 0000413928 00000 n 0000414159 00000 n 0000414384 00000 n 0000414593 00000 n 0000414804 00000 n 0000415045 00000 n 0000415303 00000 n 0000415563 00000 n 0000415776 00000 n 0000416039 00000 n 0000416305 00000 n 0000416535 00000 n 0000416769 00000 n 0000416973 00000 n 0000417177 00000 n 0000417424 00000 n 0000417673 00000 n 0000417893 00000 n 0000418144 00000 n 0000418403 00000 n 0000418636 00000 n 0000418839 00000 n 0000419053 00000 n 0000419261 00000 n 0000419482 00000 n 0000419704 00000 n 0000419952 00000 n 0000420236 00000 n 0000420446 00000 n 0000420687 00000 n 0000420933 00000 n 0000421184 00000 n 0000421427 00000 n 0000421650 00000 n 0000421867 00000 n 0000422087 00000 n 0000422338 00000 n 0000422554 00000 n 0000422760 00000 n 0000422998 00000 n 0000423227 00000 n 0000423457 00000 n 0000423677 00000 n 0000423935 00000 n 0000424150 00000 n 0000424358 00000 n 0000424619 00000 n 0000424869 00000 n 0000425117 00000 n 0000425326 00000 n 0000425548 00000 n 0000425790 00000 n 0000426044 00000 n 0000426294 00000 n 0000426517 00000 n 0000426787 00000 n 0000427031 00000 n 0000427246 00000 n 0000427495 00000 n 0000427699 00000 n 0000427899 00000 n 0000428134 00000 n 0000428381 00000 n 0000428612 00000 n 0000428877 00000 n 0000429085 00000 n 0000429325 00000 n 0000429570 00000 n 0000429812 00000 n 0000430014 00000 n 0000430273 00000 n 0000430495 00000 n 0000430714 00000 n 0000430963 00000 n 0000431179 00000 n 0000431426 00000 n 0000431647 00000 n 0000431764 00000 n 0000431880 00000 n 0000431996 00000 n 0000432112 00000 n 0000432228 00000 n 0000432344 00000 n 0000432459 00000 n 0000432575 00000 n 0000432691 00000 n 0000432807 00000 n 0000432923 00000 n 0000433039 00000 n 0000433155 00000 n 0000433271 00000 n 0000433387 00000 n 0000433503 00000 n 0000433619 00000 n 0000433735 00000 n 0000433851 00000 n 0000433967 00000 n 0000434083 00000 n 0000434199 00000 n 0000434315 00000 n 0000434431 00000 n 0000434546 00000 n 0000434662 00000 n 0000434778 00000 n 0000434894 00000 n 0000435010 00000 n 0000435126 00000 n 0000435242 00000 n 0000435358 00000 n 0000435473 00000 n 0000435589 00000 n 0000435705 00000 n 0000435821 00000 n 0000435937 00000 n 0000436053 00000 n 0000436169 00000 n 0000436285 00000 n 0000436401 00000 n 0000436517 00000 n 0000436633 00000 n 0000436749 00000 n 0000436865 00000 n 0000436981 00000 n 0000437096 00000 n 0000437212 00000 n 0000437328 00000 n 0000437444 00000 n 0000441681 00000 n 0000441740 00000 n 0000441373 00000 n 0000437776 00000 n 0000441350 00000 n 0000441518 00000 n 0000727475 00000 n 0000446292 00000 n 0000446409 00000 n 0000445475 00000 n 0000441852 00000 n 0000445452 00000 n 0000445647 00000 n 0000445811 00000 n 0000445972 00000 n 0000446129 00000 n 0000447491 00000 n 0000447608 00000 n 0000447367 00000 n 0000446521 00000 n 0000447345 00000 n 0000454788 00000 n 0000450639 00000 n 0000452327 00000 n 0000454729 00000 n 0000454968 00000 n 0000450494 00000 n 0000447720 00000 n 0000450471 00000 n 0000454573 00000 n 0000452255 00000 n 0000450862 00000 n 0000450883 00000 n 0000452232 00000 n 0000454501 00000 n 0000452550 00000 n 0000452571 00000 n 0000454478 00000 n 0000461856 00000 n 0000458113 00000 n 0000459805 00000 n 0000461797 00000 n 0000461978 00000 n 0000457959 00000 n 0000455138 00000 n 0000457936 00000 n 0000461484 00000 n 0000461640 00000 n 0000459733 00000 n 0000458336 00000 n 0000458357 00000 n 0000459710 00000 n 0000461412 00000 n 0000460028 00000 n 0000460049 00000 n 0000461389 00000 n 0000467120 00000 n 0000464431 00000 n 0000467061 00000 n 0000467184 00000 n 0000464286 00000 n 0000462135 00000 n 0000464263 00000 n 0000466903 00000 n 0000466831 00000 n 0000464654 00000 n 0000464675 00000 n 0000466748 00000 n 0000466725 00000 n 0000471561 00000 n 0000471625 00000 n 0000471689 00000 n 0000471753 00000 n 0000471817 00000 n 0000471881 00000 n 0000471945 00000 n 0000472009 00000 n 0000472073 00000 n 0000472136 00000 n 0000472200 00000 n 0000472263 00000 n 0000479351 00000 n 0000471502 00000 n 0000472327 00000 n 0000470863 00000 n 0000467339 00000 n 0000470840 00000 n 0000471026 00000 n 0000471184 00000 n 0000471343 00000 n 0000727600 00000 n 0000479415 00000 n 0000479479 00000 n 0000479543 00000 n 0000479607 00000 n 0000479671 00000 n 0000479735 00000 n 0000479292 00000 n 0000479799 00000 n 0000476807 00000 n 0000472490 00000 n 0000476784 00000 n 0000477069 00000 n 0000477227 00000 n 0000477386 00000 n 0000477545 00000 n 0000477705 00000 n 0000477864 00000 n 0000478022 00000 n 0000478182 00000 n 0000478341 00000 n 0000478500 00000 n 0000478659 00000 n 0000478817 00000 n 0000478976 00000 n 0000479134 00000 n 0000484311 00000 n 0000484370 00000 n 0000489390 00000 n 0000486979 00000 n 0000484194 00000 n 0000484429 00000 n 0000483387 00000 n 0000479949 00000 n 0000483364 00000 n 0000483559 00000 n 0000483719 00000 n 0000483877 00000 n 0000484036 00000 n 0000489331 00000 n 0000489517 00000 n 0000486855 00000 n 0000484580 00000 n 0000486832 00000 n 0000489259 00000 n 0000487202 00000 n 0000487223 00000 n 0000489236 00000 n 0000490483 00000 n 0000490542 00000 n 0000490359 00000 n 0000489658 00000 n 0000490337 00000 n 0000508315 00000 n 0000508256 00000 n 0000508374 00000 n 0000492490 00000 n 0000490641 00000 n 0000492467 00000 n 0000493481 00000 n 0000493637 00000 n 0000493793 00000 n 0000493948 00000 n 0000494104 00000 n 0000494260 00000 n 0000494416 00000 n 0000494572 00000 n 0000494727 00000 n 0000494883 00000 n 0000495039 00000 n 0000495194 00000 n 0000495350 00000 n 0000495506 00000 n 0000495662 00000 n 0000495818 00000 n 0000495973 00000 n 0000496128 00000 n 0000496284 00000 n 0000496440 00000 n 0000496595 00000 n 0000496750 00000 n 0000496906 00000 n 0000497062 00000 n 0000497217 00000 n 0000497373 00000 n 0000497529 00000 n 0000497684 00000 n 0000497838 00000 n 0000497994 00000 n 0000498150 00000 n 0000498305 00000 n 0000498459 00000 n 0000498614 00000 n 0000498770 00000 n 0000498926 00000 n 0000499082 00000 n 0000499238 00000 n 0000499394 00000 n 0000499549 00000 n 0000499704 00000 n 0000499860 00000 n 0000500016 00000 n 0000500171 00000 n 0000500325 00000 n 0000500481 00000 n 0000500636 00000 n 0000500790 00000 n 0000500946 00000 n 0000501102 00000 n 0000501258 00000 n 0000501414 00000 n 0000501569 00000 n 0000501725 00000 n 0000501880 00000 n 0000502035 00000 n 0000502191 00000 n 0000502347 00000 n 0000502503 00000 n 0000502659 00000 n 0000502814 00000 n 0000502970 00000 n 0000503126 00000 n 0000503281 00000 n 0000503435 00000 n 0000503589 00000 n 0000503745 00000 n 0000503901 00000 n 0000504056 00000 n 0000504212 00000 n 0000504368 00000 n 0000504524 00000 n 0000504679 00000 n 0000504835 00000 n 0000504991 00000 n 0000505147 00000 n 0000505302 00000 n 0000505458 00000 n 0000505614 00000 n 0000505770 00000 n 0000505924 00000 n 0000506080 00000 n 0000506236 00000 n 0000506391 00000 n 0000506547 00000 n 0000506703 00000 n 0000506858 00000 n 0000507014 00000 n 0000507169 00000 n 0000507325 00000 n 0000507481 00000 n 0000507636 00000 n 0000507790 00000 n 0000507946 00000 n 0000508102 00000 n 0000517183 00000 n 0000517242 00000 n 0000509647 00000 n 0000508473 00000 n 0000509624 00000 n 0000510188 00000 n 0000510343 00000 n 0000510499 00000 n 0000510653 00000 n 0000510809 00000 n 0000510965 00000 n 0000511121 00000 n 0000511276 00000 n 0000511432 00000 n 0000511588 00000 n 0000511743 00000 n 0000511897 00000 n 0000512053 00000 n 0000512209 00000 n 0000512364 00000 n 0000512518 00000 n 0000512674 00000 n 0000512830 00000 n 0000512985 00000 n 0000513141 00000 n 0000513297 00000 n 0000513453 00000 n 0000513607 00000 n 0000513762 00000 n 0000513917 00000 n 0000514073 00000 n 0000514226 00000 n 0000514382 00000 n 0000514538 00000 n 0000514693 00000 n 0000514849 00000 n 0000515005 00000 n 0000515161 00000 n 0000515317 00000 n 0000515472 00000 n 0000515628 00000 n 0000515784 00000 n 0000515940 00000 n 0000516094 00000 n 0000516250 00000 n 0000516406 00000 n 0000516561 00000 n 0000516717 00000 n 0000516872 00000 n 0000517028 00000 n 0000727725 00000 n 0000517468 00000 n 0000518002 00000 n 0000523960 00000 n 0000523983 00000 n 0000524006 00000 n 0000524029 00000 n 0000524051 00000 n 0000524084 00000 n 0000524487 00000 n 0000525025 00000 n 0000528107 00000 n 0000528130 00000 n 0000528152 00000 n 0000528175 00000 n 0000528197 00000 n 0000528232 00000 n 0000528581 00000 n 0000529146 00000 n 0000534272 00000 n 0000534295 00000 n 0000534318 00000 n 0000534341 00000 n 0000534363 00000 n 0000534396 00000 n 0000534985 00000 n 0000535527 00000 n 0000541891 00000 n 0000541914 00000 n 0000541937 00000 n 0000541960 00000 n 0000541982 00000 n 0000542014 00000 n 0000542386 00000 n 0000542920 00000 n 0000554048 00000 n 0000554072 00000 n 0000554095 00000 n 0000554118 00000 n 0000554140 00000 n 0000554172 00000 n 0000554694 00000 n 0000555231 00000 n 0000562374 00000 n 0000562397 00000 n 0000562420 00000 n 0000562443 00000 n 0000562465 00000 n 0000562498 00000 n 0000562901 00000 n 0000563447 00000 n 0000566289 00000 n 0000566312 00000 n 0000566334 00000 n 0000566357 00000 n 0000566379 00000 n 0000566411 00000 n 0000566766 00000 n 0000567300 00000 n 0000575768 00000 n 0000575791 00000 n 0000575814 00000 n 0000575837 00000 n 0000575859 00000 n 0000575891 00000 n 0000576372 00000 n 0000576909 00000 n 0000589514 00000 n 0000589538 00000 n 0000589561 00000 n 0000589585 00000 n 0000589607 00000 n 0000589638 00000 n 0000590184 00000 n 0000590729 00000 n 0000594974 00000 n 0000594997 00000 n 0000595019 00000 n 0000595042 00000 n 0000595064 00000 n 0000595095 00000 n 0000595478 00000 n 0000596015 00000 n 0000600450 00000 n 0000600473 00000 n 0000600495 00000 n 0000600518 00000 n 0000600540 00000 n 0000600571 00000 n 0000600956 00000 n 0000601496 00000 n 0000610998 00000 n 0000611021 00000 n 0000611044 00000 n 0000611067 00000 n 0000611089 00000 n 0000611122 00000 n 0000611569 00000 n 0000612104 00000 n 0000617662 00000 n 0000617685 00000 n 0000617708 00000 n 0000617731 00000 n 0000617753 00000 n 0000617785 00000 n 0000618160 00000 n 0000618705 00000 n 0000623202 00000 n 0000623225 00000 n 0000623248 00000 n 0000623271 00000 n 0000623293 00000 n 0000623326 00000 n 0000623769 00000 n 0000624304 00000 n 0000637322 00000 n 0000637346 00000 n 0000637369 00000 n 0000637393 00000 n 0000637415 00000 n 0000637448 00000 n 0000637895 00000 n 0000638429 00000 n 0000643323 00000 n 0000643346 00000 n 0000643368 00000 n 0000643391 00000 n 0000643413 00000 n 0000643446 00000 n 0000643809 00000 n 0000644343 00000 n 0000661749 00000 n 0000661773 00000 n 0000661796 00000 n 0000661820 00000 n 0000661842 00000 n 0000661875 00000 n 0000662595 00000 n 0000663132 00000 n 0000682890 00000 n 0000682914 00000 n 0000682937 00000 n 0000682961 00000 n 0000682983 00000 n 0000683015 00000 n 0000683747 00000 n 0000684286 00000 n 0000699173 00000 n 0000699197 00000 n 0000699220 00000 n 0000699244 00000 n 0000699266 00000 n 0000699299 00000 n 0000699855 00000 n 0000700392 00000 n 0000704397 00000 n 0000704420 00000 n 0000704442 00000 n 0000704465 00000 n 0000704487 00000 n 0000704521 00000 n 0000704871 00000 n 0000705406 00000 n 0000710753 00000 n 0000710776 00000 n 0000710799 00000 n 0000710822 00000 n 0000710844 00000 n 0000710877 00000 n 0000711273 00000 n 0000711812 00000 n 0000725143 00000 n 0000725167 00000 n 0000725190 00000 n 0000725214 00000 n 0000725236 00000 n 0000725269 00000 n 0000727805 00000 n 0000727925 00000 n 0000728046 00000 n 0000728172 00000 n 0000728255 00000 n 0000736910 00000 n 0000743339 00000 n 0000743380 00000 n 0000743420 00000 n 0000743601 00000 n trailer << /Size 2139 /Root 2137 0 R /Info 2138 0 R >> startxref 743808 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/getstart.tex0000664000175000017500000005631711742726711022653 0ustar uwabamiuwabami%---------------------------------------------------------------------------- % ----- File: getstart.tex % ----- Author: Rainer Menzner (Rainer.Menzner@web.de) % ----- Date: 2005-05-18 % ----- Description: This file is part of the t1lib-documentation. % ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. % As of version 0.5, t1lib is distributed under the % GNU General Public Library License. The % conditions can be found in the files LICENSE and % LGPL, which should reside in the toplevel % directory of the distribution. Please note that % there are parts of t1lib that are subject to % other licenses: % The parseAFM-package is copyrighted by Adobe Systems % Inc. % The type1 rasterizer is copyrighted by IBM and the % X11-consortium. % ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) % ----- Credits: I want to thank IBM and the X11-consortium for making % their rasterizer freely available. % Also thanks to Piet Tutelaers for his ps2pk, from % which I took the rasterizer sources in a format % independent from X11. % Thanks to all people who make free software living! %---------------------------------------------------------------------------- \newpage \section{Getting Started} \subsection{Building, Installing and Removing the \tonelib-Package} \label{compiling}% As of version 0.2-beta, the \verb+autoconf+-package is used to configure and build the library. \verb+imake+ is no longer supported. Furthermore, starting with version 0.8-beta GNU \verb+libtool+ is used for managing library-specific stuff. Here is how to build and install \tonelib: \begin{enumerate} \item Change to \verb+T1+-directory. \item Run \verb+./configure+. This will check your system's setup and generate the \verb+Makefile+s. By default, shared and static versions of the libraries are built. Specifying \verb+--disable-shared+ or \verb+--disable-static+ as a commandline option to \verb+configure+ will suppress the generation of the respective library type. Of course, these rules are superseded by the capability of the system to manage those library types. If you know shared libraries are supported on your system but \verb+configure+ says that no dll can be built, some compiler option may be setup incorrect. Please refer to (\ref{libtoolproblems}). If the X11 window system is installed on the target system \tonelib\ is automatically build with special X11 support. In cases where this is explicitly not desired the commandline option \verb+--without-x+ may be used to configure a library without extended X11 support. In this case the test program \verb+xglyph+ is also not build since it needs X11. \item Run \verb+make+. This will build all the stuff including the documentation. If you do not have \LaTeXe\, run \verb+make without_doc+. This will skip generating the documentation. \item Type \verb+make install+ to install the package. You'll probably need to be superuser for installing the package at the standard locations. However, the files may be located wherever the user wants, as long as the compiler finds them at compile time. So, place them where you want. The following files are installed when doing a \verb+make install+: \begin{itemize} \item \verb+lib/libt1.a+ and/or \verb+lib/libt1.so.+{\em v}\verb+.+{\em r}\verb+.+{\em p} if the system supports shared libraries. In the latter case, also two symbolic links to the shared library, \verb+libt1.so.+{\em v} and \verb+libt1.so+, are generated. Here, {\em v} and {\em r} mean version and revision of the shared library. {\em p} is the patch level. Library and links are installed in the directory specified by the \verb+autoconf+-variable \verb+libdir+ which is by default \verb+/usr/local/lib+. \item The same as above holds for \verb+lib/libt1x.a+ or \verb+lib/libt1x.so.+{\em v}\verb+.+{\em r}\verb+.+{\em p} respectively, which contain the X11 interface functions. This library is only installed if X11 support was possible and not suppressed. \item \verb+lib/t1lib.h+ and optionally \verb+lib/t1libx.h+. They are installed in the directory pointed to by the \verb+autoconf+-variable \verb+includedir+ which is by default\\ \verb+/usr/local/include+. \item The test program \verb+xglyph/xglyph+. If shared libraries are supported (and not suppressed by \verb+--with-static-lib+) this executable is dynamically linked to \verb+libt1.so+ and \verb+libt1x.so+. It is installed in the directory pointed to by the \verb+autoconf+-variable \verb+bindir+ (by default \verb+/usr/local/bin+). \item The converter \verb+type1afm+. The same applies as above for \verb+xglyph+. \item A subdirectory named \verb+t1lib-+{\em v}\verb+.+{\em r} is created in the directory pointed to by the \verb+autoconf+-variable \verb+datadir+ (default \verb+/usr/local/share+) and a default global configuration file \verb+t1lib.config+ is installed there. Note that this configuration is not of any use. It has to be setup by the administrator to specify the paths to the system's Type 1 fonts and AFM files as well as any \tonelib\ encoding files. Notice also that the global configuration file is not installed if it already exists. This is to prevent from deletion of an existent setup. \item A subdirectory \verb+doc+ is created in the directory where the global configuration file resides (see above). The \LaTeXe-documentation \verb+t1lib_doc.dvi+ as well as all needed graphics files is installed there. The \LaTeXe-sources are not installed! \item If you ever want to remove \tonelib\ from your system this can be achieved by calling \verb+make uninstall+. This reverts all steps described above. Of course, this works only if \tonelib\ has not been reconfigured using different parameters since the time of install. \end{itemize} \end{enumerate} The top level \verb+Makefile+ further supports the targets \verb+clean+ and \verb+distclean+. The latter is an extension of \verb+clean+ which also removes the makefiles as well as the log and cache files of the configuration process. It forces thus a new call to \verb+configure+. A \verb+make clean+ is needed, for example, if someone experiments with static and shared libraries since the object files for shared libraries require the additional position independent code options. The directory \verb+T1/parse_afm+ is not needed at all, it is included only for completeness. The parts needed from this have been copied to the \verb+lib/t1lib+-subdirectory. \subsection{Notes on Using GNU {\tt libtool}} \label{libtoolproblems}% \verb+libtool+ might get confused by heterogenous compiler setups. This is the case, for example, on our Solaris system where by default \verb+gcc+ is used in combination with the system specific linker. This configuration leads to \verb+libtool+ reporting that no shared library can be built which definitely is wrong. In most cases such problems can be solved by fiddling with the environment entries \verb+CC+, \verb+CFLAGS+, \verb+LD+ and \verb+LDFLAGS+. \verb+libtool+ hides the real objects in subdirectories named \verb+.libs+. This means, after a successful build, \verb+libt1.so+ is located in \verb+T1/lib/.libs+. Similarly, if shared libraries are built the executable \verb+T1/xglyph/xglyph+ is a simple wrapper to \verb+T1/xglyph/.libs/xglyph+. \subsection{Runtime-Setup} \label{runtimesetup}% \subsubsection{Searchpath and Environment Setup} \verb+t1lib+ basically needs four types of files: \begin{itemize} \item \verb+.afm+-files: These contain font metric descriptions as well as kerning and ligature information for a particular font. \item \verb+.pfa+-/\verb+.pfb+-files: These contain the character outline descriptions. Type 1 font files may also lack any extension in their filename. This is the habit on NeXTStep, for example. \item \verb+.enc+-files: These contain encoding arrays in a special but simple form. They are only needed if someone wants to load a special encoding to reencode a font. \item A font database file. The library needs at least one font database file specification. See below for a description of this font database file. Optionally, multiple font database files can be specified. \end{itemize} In order to tell \tonelib\ where these files are located in the filesystem, a configuration file usually has to be set up by the user. At time of initialization (see \ref{initialization} on page \pageref{initialization}) the library tries to locate all data it needs immediately or possibly later. The following actions take place in order: \begin{enumerate} \item The library tries to read the variable \verb+T1LIB_CONFIG+ from the program's environment. The value of this variable is expected to be the pathname of a configuration file for \verb+t1lib+. \item If the variable \verb+T1LIB_CONFIG+ exists, the file pointed to by this variable will be tried to be opened. In case no environment variable exists, the library will attempt to open a file called \verb+.t1librc+ in the user's home directory. If this file as well does not exist, the global configuration file \verb+t1lib.config+ is tried to be opened.\footnote{The filenames for the user's and the global configuration file as well as the name of the environment entry are default names defined in {\ttfamily lib/t1lib/t1misc.h}. They may be redefined by the user at compile time if necessary.} If all these attempts to open a configuration file did not succeed, all searchpaths are left at defaults (\verb+.+) and the font database file is setup to be \verb+./FontDataBase+. If this file cannot be opened, the call to \verb+T1_InitLib()+ returns a NULL-pointer thus indicating an error condition. The program should then exit because \tonelib\ would not be able to do anything without an association of font IDs to font files. \item Assuming a configuration file has been found and opened at any of the above three locations, this file is parsed and all relevant information in this file is recorded. \item Using the paths specified in the configuration file, the font database is opened and processed. The existence of every Type 1 file that might later be needed is ensured. The existence of the corresponding AFM file is not verified during initialization, because this information is not ultimatively critical when generating a character bitmap.\footnote{For example, a program may generate a character table of a Type 1 font without having AFM information.} Aside from this, \tonelib\ can generate the required part of the AFM information on the fly. \end{enumerate} \subsubsection{The {\ttfamily t1lib} Configuration File} \label{subsubsec:configfile} It is the purpose of the configuration file to setup search paths and font databases. The format of this file is quite simple and straightforward: \begin{itemize} \item Each line starting exactly with \verb+ENCODING=+ is read in. The remainder of the line is expected to be a list of searchpath specifications for encoding files. No white space may appear between \verb+=+ and the path specification(s). Multiple paths may be specified by separating the single paths with colons.\footnote{A colon is the default path separator on UNIX systems. For certain other Operating Systems the path separator may be a semicolon.} The path specification(s) may be followed by any white space characters. \item Each line starting exactly with \verb+AFM=+ is read in. The remainder of the line is expected to be a list of searchpath specifications for Adobe Font Metric files. No white space may appear between \verb+=+ and the path specification(s). Multiple paths may be specified by separating the single paths with colons. The path specification(s) may be followed by any white space characters. \item Each line starting exactly with \verb+TYPE1=+ is read in. The remainder of the line is expected to be a list of searchpath specifications for Type 1 font files. No white space may space between \verb+=+ and the path specification(s). Multiple paths may be specified by separating the single paths with colons. The path specification(s) may be followed by any white space characters. \item Each line starting exactly with \verb+FONTDATABASE=+ must specify a colon-separated list of font database filenames on the remainder of the line. No white space is allowed between \verb+=+ and the path specification, but trailing white space is allowed. \item Each line starting exactly with \verb+FONTDATABASEXLFD=+ must specify a colon-separated list of font database filenames that adhere to the XLFD (X11 Logical Font Definition) on the remainder of the line. No white space is allowed between \verb+=+ and the path specification, but trailing white space is allowed. This keyword is not an independent key word, rather, it allows to specify a special alternative type of font database---a type that usually exists as part of every X11 system. Standard and XLFD font database files may be specified both in one configuration file. They interact in a way, that if an XLFD font database file is specified, this overwrites the default standard font database setup before the configuration is read. \item All other lines are ignored by the library. \end{itemize} A configuration file may contain multiple path declarations of one type. In this case, a list of path elements is built internally in the same order that the specifications appear in the configuration file. For example, the statement \begin{verbatim} TYPE1=/usr/X11/fonts/Type1:/home/user/fonts/Type1 \end{verbatim} is equivalent to the two statements \begin{verbatim} TYPE1=/usr/X11/fonts/Type1 TYPE1=/home/user/fonts/Type1 \end{verbatim} In order to specify paths that incorporate {\em unusual} characters like white space or the path separator, it is possible to quote the path string element using double quotes ``\verb+"+''. All characters after the leading quotation mark are verbatim read to the path until the closing quotation mark appears. The double quotes may also become part of a path specification by using the escape sequence ``\verb+\"+''. Hence, the following statement specifies a correct albeit somewhat unusual search path: \begin{verbatim} TYPE1=/usr/X11/fonts/Type1:"/home/user/My \"Best\" Fonts/Type1" \end{verbatim} Here is an example of how a user could do the runtime setup: \\[2mm] {\bfseries Example}: \\ Create a file, say, named \verb+t1.config+ with the following contents in your HOME-directory: \begin{verbatim} # This is a configuration file for t1lib These two lines are considered to be comments FONTDATABASE=/home/user/test/myprog/FontDataBase ENCODING=/usr/local/lib/fonts/type1/enc:. AFM=/usr/local/lib/fonts/type1/afm:. TYPE1=/usr/local/lib/fonts/type1/outlines:. \end{verbatim} After this, make the environment variable \verb+T1LIB_CONFIG+ point to this file, i.e., \\ \verb+setenv T1LIB_CONFIG ~/t1.config+\\ for \verb+tcsh+, or\\ \verb+export T1LIB_CONFIG=~/t1.config+\\ for \verb+bash+. Provided that the path specifications in the configuration file are correct, the setup is done. When setting \verb+T1LIB_CONFIG+ in an interactive shell as described above, the shell does the tilde expansion. Notice that \tonelib\ never does tilde expansion. \subsubsection{The Font Database File} \label{fontdatabase}% This is one more file important at startup time. I call it ``font database file'' because it makes fonts declared in this file known to the library. Moreover, the association {\em declared font $\Longleftrightarrow$ FontID} is done using information from this file. The format specification of this file is relatively free. Here are the exact rules: \begin{itemize} \item Line 1 contains a positive integer specifying the number of fonts declared in that file. This is as in the \verb+fonts.dir+ files of the X11-system. \item All remaining lines contain declarations of one font each. The only thing taken from such a line is the last string (delimited by white space) in it. It is assumed to be a filename of the format {\em basename}\verb+.+{\em someextension}. Furthermore, the {\em basename}-part is assumed to be the basename of a fontfile name. After such a string has been parsed, the {\em extension} is cut off and replaced in turn with \verb+.pfa+ and \verb+.pfb+. The initialization routine tries to open a font file with one of the resulting filenames. Since V.~0.9 the ``\verb+.+'' as well as the ``{\em someextension}'' may be missing completely. Moreover, \tonelib\ looks for Type 1 Font files whose name do not have any extension at all. This is due to conventions of some UNIX-systems. \item The remaining of the line, i.e., from beginning to the start of the filename string is completely ignored and may contain some information for other programs or be empty. \end{itemize} The format described above may seem to be underspecified, but it has been chosen to be compatible with the \verb+SciFonts+-fileformat, which is used during the initialization of the SciTeXt word processor. \\[2mm] {\bfseries Example 1}: A minimal font database file for 4 fonts: {\footnotesize \begin{verbatim} 4 isvl.afm isvli.afm isvd.afm isvdi.afm \end{verbatim} }% This file is {\em minimal}, because it contains just the information needed, and nothing not needed by \tonelib. {\bfseries Example 2}: A more realistic example, which allows an application to match a fully qualified X11 fontname to a FontID in \tonelib. This is also a valid font database file: {\footnotesize\hfuzz=30pt\relax \begin{verbatim} 4 Souvenir Souvenir-Light --- -itc-souvenir-light-r-normal--#-0-0-0-p-0-iso8859-1 isvl.afm " Souvenir-LightItalic -*- -itc-souvenir-light-i-normal--#-0-0-0-p-0-iso8859-1 isvli.afm " Souvenir-Demi *-- -itc-souvenir-demi-r-normal--#-0-0-0-p-0-iso8859-1 isvd.afm " Souvenir-DemiItalic **- -itc-souvenir-demi-i-normal--#-0-0-0-p-0-iso8859-1 isvdi.afm \end{verbatim} }% \subsubsection{Alternative Runtime Setups} The runtime setup described above is the most simple principle of getting started. However, there might be applications that deal with only one font file. A good example is the \verb+type1afm+-utility which is described in section \ref{type1afm}. In such situations it seems to be overkill to read a font database file and several load paths. For this reason there are alternative ways to specify what should be read from where. Their description is deferred to section \ref{initialization}. \subsection{A Very Simple Programming Example} \label{programmingexample} The following code is a very simple programming example of how to use \tonelib. It even runs on an ASCII-terminal. It is provided in the \verb+examples+-subdirectory of the distribution as \verb+t1example1.c+. This program must be compiled to object format and then linked with the library \verb+libt1.a+ or \verb+libt1.so+, respectively. On most systems the commandline \begin{verbatim} cc -o t1example1 -I ../lib t1example1.c -L../lib -lt1 -lm \end{verbatim} should do it. For convenience reasons a \verb+Makefile.in+ is included in the examples directory and the stuff is built automatically. At runtime, a well defined setup must be found, i.e., a configuration file with path definitions and a font database file. These also are located in the \verb+examples+ subdirectory. \begin{verbatim} #include #include #include /* All needed declarations */ int main( void) { GLYPH *glyph; int i; /* Set our environment to an existent config file directory */ putenv( "T1LIB_CONFIG=./t1lib.config"); /* Pad bitmaps to 16 bits, the default being 8 bits */ T1_SetBitmapPad( 16); /* Initialize t1lib and return if error occurs. No logfile will be generated */ if ((T1_InitLib(NO_LOGFILE)==NULL)){ fprintf(stderr, "Initialization of t1lib failed\n"); return(-1); } /* For every font in the database, generate a glyph for the string "Test" at 25 bp. Use Kerning. Then dump an ASCII representation of the glyph to stdout */ for( i=0; idata=NULL; XDestroyImage( ximage); . . . \end{verbatim} As already shown in this example code, the user has to take care for that \verb+XDestroyImage()+ does not free the glyph's bitmap. This achieved by setting \verb+ximage->data+ to \verb+NULL+. Having an XPM file from a \tonelib-glyph it should easily be possible to create graphic files of arbitrary formats, e.g., by using \verb+xv+. \subsection{Limits of the X11 Interface} A few words about what the X11 interface can do and cannot do are appropriate, I think. Except for that a few global variables of \tonelib\ are accessible, the whole code of the X11 interface could as well be part of an application instead of being part of \tonelib. In other words, \tonelib\ is not able to do anything an application program could not do. This applies especially to performance improvements. Unfortunately---but consequently, the X11 rastering functions are not faster than the standard rastering functions. To come to a conclusion, this is what the X rastering functions offer to the user: \begin{itemize} \item Save the user entirely from thinking about color. \item Offers a set functions comparable to \verb+XDrawText()+. \item Frees the user from having to think about transparency and opacity. \item Implements antialiasing between any given pair of foreground/background colours. \end{itemize} And here is what they not provide: \begin{itemize} \item Functions that perform as if the rasterizer would be part of the X server. \end{itemize} That's life, folks. %%% Local Variables: %%% mode: latex %%% TeX-master: "t1lib_doc" %%% End: xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/Tee.pdf0000664000175000017500000000160211742726711021467 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœí“Á ‚0†9÷Äo)r# QnU^M<›èÁ¡#8èOŸi‰ ‹&üMèëëë×öõ…mûô—«¸£Å‰uRdûE„­¢eÜd…ù‘äa›ÉʼnÜ!Nf*§•(ÖôšõçºYi­ÏVl”e9›¦)Ú F]×lL‘1¦‡mšæiõ°ÂÐWU…ì;œï°¼n üìtÉQJ?Û]¾±r|œ#°žçéŽ|ÁwžáoÚÃvSʳ(˜¨oX®47Å/èû¾Û Ã!L\Šˆ=~e,Ç•]=31œøQ!#N>ë§$6…Ø£½{)Äendstream endobj 5 0 obj 258 endobj 3 0 obj << /Type /Page /MediaBox [0 0 29 19] /Parent 2 0 R /Resources << /ProcSet [/PDF /ImageC] >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 6 0 obj << /CreationDate (D:20010110083014) /Producer (GNU Ghostscript 5.10) >> endobj xref 0 7 0000000000 65535 f 0000000547 00000 n 0000000488 00000 n 0000000362 00000 n 0000000015 00000 n 0000000343 00000 n 0000000596 00000 n trailer << /Size 7 /Root 1 0 R /Info 6 0 R >> startxref 683 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/mirrorh.pdf0000664000175000017500000000246111742726711022440 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ}T9’T1 Í} ‡ðÑbyI©âÃtF5ÅVü`"®žäßÅ$ôtÛO²öeèàJøÛ÷ý,/…ëÏÂTÿøATã8Ë¿_1ã’ä?—g‡•}ÝÏúáVÞê•êí[y—Nêñ»o¾¿½ý*oõ©|®Jø~q‹õë+?òÀÿóσÌ]MÁKàÞ6×ñeŠM Maæ¯÷Âm4§úpÊ•šj(MÁ¥K/C­%r á2à3…<‚¹pkÛò¦Õ<naP–›‘¦8ZJ‰¸ªHˆ 1—á1Á๥\F`‰"-ÿ<0MNIµé/âÝ å4²PHNK^鎚ԉôðÜN …;CQúðh5´Q±ð| Cƒ\º‡Èè "½«D™—[î=ë%Lœ>Ã’E7Fß瀘r¨Òêhލ%…àÖ.Cè\”n󞥹‚0ŽœQN륟°­ |A¿z†8–IË86Åmöl ô ¡‹÷ÿŽ„¾`TPs£f=²œ±e½\½a|蚢{ù™½ÖÀ„Ë€àš='’êJë¨}aûñÒ} מ~@(8Œž˜—qÖaˆ°c¾1‰*›ðIu’J¼‰>£®eÉ{Ä(Q”+ÜýÌ%;/¼¢o2Kè Åx¡ ÓrMß$7K$)vÀ® Û@ðpذ—Ͳ Àº¢¾‰y¯á:\^ºg 9YÀÈs^">µ™½¸%¼yÃÿ€žËSù 7·ÿxendstream endobj 5 0 obj 573 endobj 3 0 obj << /Type /Page /MediaBox [0 0 200 200] /Parent 2 0 R /Resources << /ProcSet [/PDF /Text] /Font << /R6 6 0 R >> >> /Contents 4 0 R >> endobj 6 0 obj <> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 7 0 obj << /CreationDate (D:20010110083110) /Producer (GNU Ghostscript 5.10) >> endobj xref 0 8 0000000000 65535 f 0000000957 00000 n 0000000898 00000 n 0000000677 00000 n 0000000015 00000 n 0000000658 00000 n 0000000825 00000 n 0000001006 00000 n trailer << /Size 8 /Root 1 0 R /Info 7 0 R >> startxref 1093 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlineproblems3.eps0000664000175000017500000141267411742726711024316 0ustar uwabamiuwabami%!PS-Adobe-3.0 EPSF-3.0 %%Creator: tiff2ps %%Title: outlineproblems3.tif %%CreationDate: Wed May 5 18:52:27 1999 %%DocumentData: Clean7Bit %%Origin: 0 0 %%BoundingBox: 0 0 871 75 %%LanguageLevel: 1 %%Pages: (atend) %%EndComments %%BeginSetup %%EndSetup %%Page: 1 1 gsave 100 dict begin 871.000000 75.000000 scale /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def /colorimage where {pop} { /colorimage {pop pop /rgbproc exch def {bwproc} image} bind def } ifelse %ImageData: 871 75 8 3 0 1 2 "false 3 colorimage" /line 2613 string def 871 75 8 [871 0 0 -75 0 75] {currentfile line readhexstring pop} bind false 3 colorimage ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffff000000000000000000 000000000000ffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffff000000ffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000ffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000ffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000 000000ffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff 000000000000ffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffff000000000000000000ffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffff000000ffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffff000000000000000000ffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffff000000 000000ffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffff000000000000ffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffff000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff 000000ffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffff000000000000ffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000ffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000ffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffff000000000000000000000000 000000ffffffffffff000000ffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff end grestore showpage %%Trailer %%Pages: 1 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/concatoutlines.pdf0000664000175000017500000021772011742726711024016 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ3Ð3T0A(œËU„†ææ`QCcCÏ ,LA*ôƒÌ\ò¹ˆÆ iendstream endobj 5 0 obj 50 endobj 3 0 obj << /Type /Page /MediaBox [0 0 177 137] /Parent 2 0 R /Resources << /ProcSet [/PDF /ImageC] /XObject<> >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 8 0 obj << /CreationDate (D:20010110083044) /Producer (GNU Ghostscript 5.10) >> endobj 6 0 obj << /Type /XObject /Name /R6 /Subtype /Image /Length 7 0 R /ColorSpace /DeviceRGB/Width 177/Height 137/BitsPerComponent 8 >> stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ endstream endobj 7 0 obj 72748 endobj xref 0 9 0000000000 65535 f 0000000362 00000 n 0000000303 00000 n 0000000153 00000 n 0000000015 00000 n 0000000135 00000 n 0000000498 00000 n 0000073402 00000 n 0000000411 00000 n trailer << /Size 9 /Root 1 0 R /Info 8 0 R >> startxref 73423 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlineproblems5.pdf0000664000175000017500000064521511742726711024300 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ3Ð3T0A(œËU„æÆ`Q #©k g†ÆÆ úAf .ù\@ˆå iendstream endobj 5 0 obj 52 endobj 3 0 obj << /Type /Page /MediaBox [0 0 873 82] /Parent 2 0 R /Resources << /ProcSet [/PDF /ImageC] /XObject<> >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 8 0 obj << /CreationDate (D:20010110083147) /Producer (GNU Ghostscript 5.10) >> endobj 6 0 obj << /Type /XObject /Name /R6 /Subtype /Image /Length 7 0 R /ColorSpace /DeviceRGB/Width 873/Height 82/BitsPerComponent 8 >> stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ endstream endobj 7 0 obj 214759 endobj xref 0 9 0000000000 65535 f 0000000363 00000 n 0000000304 00000 n 0000000155 00000 n 0000000015 00000 n 0000000137 00000 n 0000000499 00000 n 0000215413 00000 n 0000000412 00000 n trailer << /Size 9 /Root 1 0 R /Info 8 0 R >> startxref 215435 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/t1_data.fig0000664000175000017500000003226311742726711022272 0ustar uwabamiuwabami#FIG 3.2 Portrait Center Metric A4 100.00 Single 0 1200 2 6 6750 675 7650 1125 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 6750 1125 7650 1125 7650 675 6750 675 6750 1125 4 1 0 0 0 20 8 0.0000 4 120 1065 7200 855 External Encoding\001 4 1 0 0 0 20 8 0.0000 4 120 555 7200 1005 (optional)\001 -6 6 7740 675 8640 1125 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 7740 1125 8640 1125 8640 675 7740 675 7740 1125 4 1 0 0 0 20 8 0.0000 4 120 810 8190 855 Internal Type 1\001 4 1 0 0 0 20 8 0.0000 4 105 855 8190 1005 Data Structures\001 -6 6 5310 1710 5940 1935 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 5310 1935 5940 1935 5940 1710 5310 1710 5310 1935 4 1 0 0 0 20 8 0.0000 4 105 510 5625 1845 KernMap\001 -6 6 6210 1710 6840 1935 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 6210 1935 6840 1935 6840 1710 6210 1710 6210 1935 4 1 0 0 0 20 8 0.0000 4 105 465 6525 1845 EncMap\001 -6 6 5940 3555 8550 4365 6 7650 3870 8550 4365 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 7650 4365 8550 4365 8550 3870 7650 3870 7650 4365 4 1 0 0 0 20 8 0.0000 4 120 660 8100 4140 glyphs[256]\001 -6 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 4 2 1 1.00 60.00 120.00 5940 3555 6750 3555 6750 3870 7650 3870 -6 6 5940 2295 8550 3105 6 7650 2610 8550 3105 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 7650 3105 8550 3105 8550 2610 7650 2610 7650 3105 4 1 0 0 0 20 8 0.0000 4 120 660 8100 2880 glyphs[256]\001 -6 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 4 2 1 1.00 60.00 120.00 5940 2295 6750 2295 6750 2610 7650 2610 -6 6 4950 5895 5940 6975 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 6075 5940 6075 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 6255 5940 6255 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 6435 5940 6435 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 6615 5940 6615 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 6795 5940 6795 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 4950 5895 5940 5895 5940 6975 4950 6975 4950 5895 4 1 0 0 0 20 8 0.0000 4 120 690 5445 6030 pFontCache\001 4 1 0 0 0 20 8 0.0000 4 120 1140 5445 6210 pNextFontSizeDeps\001 4 1 0 0 0 20 8 0.0000 4 120 1140 5445 6390 pPrevFontSizeDeps\001 4 1 0 0 0 20 8 0.0000 4 120 990 5445 6570 pCharSpaceLocal\001 4 1 0 0 0 20 8 0.0000 4 105 495 5445 6750 float size\001 4 1 0 0 0 20 8 0.0000 4 105 630 5445 6930 int antialias\001 -6 6 5940 5985 8550 6795 6 7650 6300 8550 6795 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 7650 6795 8550 6795 8550 6300 7650 6300 7650 6795 4 1 0 0 0 20 8 0.0000 4 120 660 8100 6570 glyphs[256]\001 -6 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 4 2 1 1.00 60.00 120.00 5940 5985 6750 5985 6750 6300 7650 6300 -6 6 4950 3465 5940 4545 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 3645 5940 3645 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 3825 5940 3825 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 4005 5940 4005 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 4185 5940 4185 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 4365 5940 4365 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 4950 3465 5940 3465 5940 4545 4950 4545 4950 3465 4 1 0 0 0 20 8 0.0000 4 120 690 5445 3600 pFontCache\001 4 1 0 0 0 20 8 0.0000 4 120 1140 5445 3780 pNextFontSizeDeps\001 4 1 0 0 0 20 8 0.0000 4 120 1140 5445 3960 pPrevFontSizeDeps\001 4 1 0 0 0 20 8 0.0000 4 120 990 5445 4140 pCharSpaceLocal\001 4 1 0 0 0 20 8 0.0000 4 105 495 5445 4320 float size\001 4 1 0 0 0 20 8 0.0000 4 105 630 5445 4500 int antialias\001 -6 6 4950 2205 5940 3285 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 2385 5940 2385 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 2565 5940 2565 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 2745 5940 2745 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 2925 5940 2925 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 4950 3105 5940 3105 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 4950 2205 5940 2205 5940 3285 4950 3285 4950 2205 4 1 0 0 0 20 8 0.0000 4 120 690 5445 2340 pFontCache\001 4 1 0 0 0 20 8 0.0000 4 120 1140 5445 2520 pNextFontSizeDeps\001 4 1 0 0 0 20 8 0.0000 4 120 1140 5445 2700 pPrevFontSizeDeps\001 4 1 0 0 0 20 8 0.0000 4 120 990 5445 2880 pCharSpaceLocal\001 4 1 0 0 0 20 8 0.0000 4 105 495 5445 3060 float size\001 4 1 0 0 0 20 8 0.0000 4 105 630 5445 3240 int antialias\001 -6 6 315 2475 2205 4455 2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 450 2655 2070 2655 2 2 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 5 450 2475 2070 2475 2070 4455 450 4455 450 2475 2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 450 2835 2070 2835 2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 450 3015 2070 3015 2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 450 3195 2070 3195 2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 450 3375 2070 3375 2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 450 3915 2070 3915 2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 450 4095 2070 4095 2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 450 4275 2070 4275 4 1 0 0 0 20 9 0.0000 4 120 1410 1260 2610 struct DeviceSpecifics\001 4 1 0 0 0 20 9 0.0000 4 120 615 1260 2790 int T1_Up\001 4 1 0 0 0 20 9 0.0000 4 120 810 1260 2970 int T1aa_bpp\001 4 1 0 0 0 20 9 0.0000 4 120 1395 1260 3150 int SetFuncRequestID\001 4 1 0 0 0 20 9 0.0000 4 90 570 1260 3510 Filename\001 4 1 0 0 0 20 9 0.0000 4 120 705 1260 3690 Searchpath\001 4 1 0 0 0 20 9 0.0000 4 90 300 1260 3870 Stuff\001 4 1 0 0 0 20 9 0.0000 4 120 1860 1260 4050 char err_warn_msg_buf[1024]\001 4 1 0 0 0 20 9 0.0000 4 120 1170 1260 4230 FILE *t1lib_log_file\001 4 1 0 0 0 20 9 0.0000 4 120 1065 1260 4410 int t1lib_log_level\001 4 1 0 0 0 20 9 0.0000 4 105 750 1260 3330 int T1_errno\001 -6 6 450 450 1530 1710 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 450 630 1530 630 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 450 810 1530 810 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 450 990 1530 990 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 450 1170 1530 1170 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 450 1350 1530 1350 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 450 450 1530 450 1530 1710 450 1710 450 450 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 450 1530 1530 1530 4 1 0 0 0 20 8 0.0000 4 120 915 990 585 int no_fonts_ini\001 4 1 0 0 0 20 8 0.0000 4 120 705 990 765 int no_fonts\001 4 1 0 0 0 20 8 0.0000 4 120 1005 990 945 int no_fonts_limit\001 4 1 0 0 0 20 8 0.0000 4 120 840 990 1125 int bitmap_pad\001 4 1 0 0 0 20 8 0.0000 4 105 555 990 1305 int endian\001 4 1 0 0 0 20 8 0.0000 4 120 645 990 1665 pFontArray\001 4 1 0 0 0 20 8 0.0000 4 120 1005 990 1485 char **default_enc\001 -6 6 2565 5400 4005 7380 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 6300 3870 6300 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 6480 3870 6480 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 6660 3870 6660 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 6840 3870 6840 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 7020 3870 7020 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 6120 3870 6120 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 5940 3870 5940 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 5760 3870 5760 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 5580 3870 5580 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 2700 5400 3870 5400 3870 7200 2700 7200 2700 5400 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 7200 2700 7380 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 3870 7200 3870 7380 4 1 0 0 0 20 8 0.0000 4 120 840 3285 5535 pFontFileName\001 4 1 0 0 0 20 8 0.0000 4 105 585 3285 6255 pKernMap\001 4 1 0 0 0 20 8 0.0000 4 105 540 3285 6075 pEncMap\001 4 1 0 0 0 20 8 0.0000 4 120 660 3285 5895 pType1Data\001 4 1 0 0 0 20 8 0.0000 4 120 600 3285 5715 pAFMData\001 4 1 0 0 0 20 8 0.0000 4 120 570 3285 6435 pFontEnc\001 4 1 0 0 0 20 8 0.0000 4 120 495 3285 6615 vm_base\001 4 1 0 0 0 20 8 0.0000 4 120 870 3285 6795 pFontSizeDeps\001 4 1 0 0 0 20 8 0.0000 4 120 1170 3285 6975 double FontMatrix[4]\001 4 1 0 0 0 20 8 0.0000 4 120 1365 3285 7155 double FontTransform[4]\001 4 1 0 0 0 20 8 0.0000 4 105 555 3285 7335 float slant\001 -6 6 2610 315 3960 4275 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 1215 3870 1215 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 1395 3870 1395 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 1575 3870 1575 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 1755 3870 1755 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 1935 3870 1935 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 2115 3870 2115 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 2295 3870 2295 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 2475 3870 2475 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 2655 3870 2655 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 2835 3870 2835 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 3015 3870 3015 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 3195 3870 3195 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 1035 3870 1035 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 855 3870 855 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 675 3870 675 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 495 3870 495 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 3555 3870 3555 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 3735 3870 3735 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 3915 3870 3915 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 4095 3870 4095 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 2 2700 3375 3870 3375 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 2700 315 3870 315 3870 4275 2700 4275 2700 315 4 1 0 0 0 20 8 0.0000 4 120 840 3285 450 pFontFileName\001 4 1 0 0 0 20 8 0.0000 4 105 585 3285 1170 pKernMap\001 4 1 0 0 0 20 8 0.0000 4 105 540 3285 990 pEncMap\001 4 1 0 0 0 20 8 0.0000 4 120 660 3285 810 pType1Data\001 4 1 0 0 0 20 8 0.0000 4 120 600 3285 630 pAFMData\001 4 1 0 0 0 20 8 0.0000 4 120 570 3285 1350 pFontEnc\001 4 1 0 0 0 20 8 0.0000 4 120 495 3285 1530 vm_base\001 4 1 0 0 0 20 8 0.0000 4 120 870 3285 1710 pFontSizeDeps\001 4 1 0 0 0 20 8 0.0000 4 120 1170 3285 1890 double FontMatrix[4]\001 4 1 0 0 0 20 8 0.0000 4 105 675 3285 2430 float extend\001 4 1 0 0 0 20 8 0.0000 4 105 945 3285 2610 float UndrLnPos\001 4 1 0 0 0 20 8 0.0000 4 105 1005 3285 2790 float UndrLnThick\001 4 1 0 0 0 20 8 0.0000 4 105 870 3285 2970 float OvrLnPos\001 4 1 0 0 0 20 8 0.0000 4 105 930 3285 3150 float OvrLnThick\001 4 1 0 0 0 20 8 0.0000 4 105 960 3285 3330 float OvrStrkPos\001 4 1 0 0 0 20 8 0.0000 4 105 1080 3285 3510 float OverStrkThick\001 4 1 0 0 0 20 8 0.0000 4 120 1320 3285 3690 unsigned short physical\001 4 1 0 0 0 20 8 0.0000 4 120 1335 3285 3870 unsigned short refcount\001 4 1 0 0 0 20 8 0.0000 4 120 1185 3285 4050 short space_position\001 4 1 0 0 0 20 8 0.0000 4 120 900 3285 4230 short info_flags\001 4 1 0 0 0 20 8 0.0000 4 105 555 3285 2250 float slant\001 -6 1 3 0 1 0 0 0 0 20 0.000 1 0.0000 5400 5310 45 45 5400 5310 5445 5310 1 3 0 1 0 0 0 0 20 0.000 1 0.0000 5400 5490 45 45 5400 5490 5445 5490 1 3 0 0 0 0 0 0 20 0.000 1 0.0000 3298 4577 45 45 3298 4577 3343 4577 1 3 0 0 0 0 0 0 20 0.000 1 0.0000 3298 4712 45 45 3298 4712 3343 4712 1 3 0 0 0 0 0 0 20 0.000 1 0.0000 3285 5310 45 45 3285 5310 3330 5310 1 3 0 0 0 0 0 0 20 0.000 1 0.0000 3285 5175 45 45 3285 5175 3330 5175 1 3 0 0 0 0 0 0 20 0.000 1 0.0000 3298 4410 45 45 3298 4410 3343 4410 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 4 2 1 1.00 60.00 120.00 1530 1440 2070 1440 2070 405 2700 405 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 5 2 1 1.00 60.00 120.00 3870 765 4950 765 4950 405 8190 405 8190 675 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 5 2 1 1.00 60.00 120.00 3870 585 4500 585 4500 315 9180 315 9180 675 2 1 1 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 4275 45 4275 7425 2 1 1 1 0 7 0 0 -1 4.000 0 0 -1 0 0 4 4275 1080 6525 1080 6525 1215 9900 1215 2 2 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 8730 1125 9630 1125 9630 675 8730 675 8730 1125 2 2 1 1 0 7 0 0 -1 4.000 0 0 -1 0 0 5 225 45 9900 45 9900 7425 225 7425 225 45 2 1 1 1 0 7 0 0 -1 4.000 0 0 -1 0 0 2 4275 2115 9900 2115 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 4 2 1 1.00 60.00 120.00 3870 1305 4050 1305 4050 900 6750 900 2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 1 0 5 2 1 1.00 60.00 120.00 3870 1125 4140 1125 4140 1260 5400 1260 5400 1710 2 1 0 1 0 7 0 0 -1 4.000 0 0 -1 1 0 5 2 1 1.00 60.00 120.00 3870 945 4185 945 4185 1215 6300 1215 6300 1710 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 6 2 1 1.00 60.00 120.00 5940 2475 6300 2475 6300 3420 4500 3420 4500 3555 4950 3555 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 6 2 1 1.00 60.00 120.00 5940 3915 6120 3915 6120 3330 4725 3330 4725 2475 4950 2295 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 3 2 1 1.00 60.00 120.00 4500 5535 4500 5985 4950 5985 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 3 5940 6345 6120 6345 6120 5580 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 6 2 1 1.00 60.00 120.00 6120 5085 6120 4680 6120 4590 4725 4590 4725 3735 4950 3555 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 0 0 5 5940 3735 6300 3735 6300 4680 4500 4680 4500 5085 2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 4 2 1 1.00 60.00 120.00 3870 1845 4050 1845 4050 2295 4950 2295 3 0 0 1 0 7 0 0 -1 0.000 0 0 0 5 4275 5445 4500 5535 5265 5715 6120 5535 6435 5580 0.000 1.000 1.000 1.000 0.000 3 0 0 1 0 7 0 0 -1 0.000 0 0 0 5 4275 5040 4500 5085 5310 5220 6120 5085 6390 5040 0.000 1.000 1.000 1.000 0.000 4 0 0 0 0 22 15 0.0000 4 210 3840 4500 225 Level 1: Size-Independent Font Data\001 4 0 0 0 0 22 15 0.0000 4 165 2655 450 225 Level 0: Global Data Area\001 4 0 0 0 0 22 15 0.0000 4 210 3675 4500 7290 Level 2: Size-Dependent Font Data\001 4 1 0 0 0 20 8 0.0000 4 105 825 9180 990 DataStructures\001 4 1 0 0 0 20 8 0.0000 4 105 1050 9180 855 Adobe Font Metric\001 4 0 0 0 0 22 15 0.0000 4 210 2670 6795 1440 Level 1b: Mapping Tables\001 4 1 0 0 0 22 15 0.0000 4 165 1725 1305 2340 Global Variables\001 4 1 0 0 0 20 10 0.0000 4 150 1320 3285 4905 Structure-Array of\001 4 1 0 0 0 20 10 0.0000 4 150 1305 3285 5085 size no_fonts_limit\001 4 1 0 0 0 20 8 0.0000 4 120 1365 3285 2070 double FontTransform[4]\001 xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlineproblems2.eps0000664000175000017500000142516511742726711024314 0ustar uwabamiuwabami%!PS-Adobe-3.0 EPSF-3.0 %%Creator: tiff2ps %%Title: outlineproblems2.tif %%CreationDate: Wed May 5 18:52:22 1999 %%DocumentData: Clean7Bit %%Origin: 0 0 %%BoundingBox: 0 0 871 76 %%LanguageLevel: 1 %%Pages: (atend) %%EndComments %%BeginSetup %%EndSetup %%Page: 1 1 gsave 100 dict begin 871.000000 76.000000 scale /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def /colorimage where {pop} { /colorimage {pop pop /rgbproc exch def {bwproc} image} bind def } ifelse %ImageData: 871 76 8 3 0 1 2 "false 3 colorimage" /line 2613 string def 871 76 8 [871 0 0 -76 0 76] {currentfile line readhexstring pop} bind false 3 colorimage ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffff000000000000 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000ffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000 ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000ffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 ffffff000000000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffff000000000000ffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000ffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffff000000ffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffff000000000000ffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffff000000ffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffff000000000000ffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffff000000000000ffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000ffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff 000000000000ffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffff000000ffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffff000000000000000000000000000000000000000000000000 000000000000ffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000ffffffffffff000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffff000000ffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000ffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff end grestore showpage %%Trailer %%Pages: 1 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/extenth.pdf0000664000175000017500000000250311742726711022432 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ]T¹r1 íù,“fC\_ÝÉ×* ßoî¸~/nøæÔDX~à—wòxqÊ/žx³J69ŠîJ°°¹Ž˜=™ ;– ÄÌOo…t¨³>œ¹‘Š„Ñd¼d‰ãåyˆi"·`ÒМZè#™«nÏ›‹yÞ`^î†UðÐÔbvSæPåFx¸ Í­E¡jQ–¸MÊxÉtú cBé$†Lé Ê+Ã5å:Q~š[ÁÉ„34¥ÏV‹8!·p4šk÷P}A¥wq‡hórϽg¿Ø÷ BrBL‡ʈaîs@M(LÛê‹%Crk·!lN&ÛýÉ32«0á‘ÂBé}¢õ¾E!gÌ«÷ˆ£a‰P4c3Rì7{Cêìó¿aaÏX´DÆÜH­GÕ3·ì—›+Ö§[t+¿°àk l8(®Ùs#[]#RÑŽÞ' ß“n÷öúBAÁaÌļ³C†ûˆMÞÄ7mÔÙøF›ô}u¸Z¶¼GŽM9ÓÝÙϼd÷¯˜†KèÁzaÓòšº\9os^¤¸vV¨É# â^ªe€eEÓ¾†ëp}î^äf£Î½8‰üÄfÎ6òæˆæu {üº”çò)%endstream endobj 5 0 obj 591 endobj 3 0 obj << /Type /Page /MediaBox [0 0 200 200] /Parent 2 0 R /Resources << /ProcSet [/PDF /Text] /Font << /R6 6 0 R >> >> /Contents 4 0 R >> endobj 6 0 obj <> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 7 0 obj << /CreationDate (D:20010110083053) /Producer (GNU Ghostscript 5.10) >> endobj xref 0 8 0000000000 65535 f 0000000975 00000 n 0000000916 00000 n 0000000695 00000 n 0000000015 00000 n 0000000676 00000 n 0000000843 00000 n 0000001024 00000 n trailer << /Size 8 /Root 1 0 R /Info 7 0 R >> startxref 1111 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlines.eps0000664000175000017500000001773711742726711022652 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-2.0 %%Title: outlines.eps %%Creator: fig2dev Version 3.2 Patchlevel 1 %%CreationDate: Fri Apr 23 17:07:56 1999 %%For: rainer@mman2 (Rainer Menzner) %%Orientation: Portrait %%BoundingBox: 0 0 252 156 %%Pages: 0 %%BeginSetup %%EndSetup %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save -22.0 156.0 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc closepath savematrix setmatrix } def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog $F2psBegin 10 setmiterlimit n -1000 3475 m -1000 -1000 l 5342 -1000 l 5342 3475 l cp clip 0.06299 0.06299 sc 7.500 slw % Ellipse n 450 2250 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 1350 2250 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 900 1800 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 900 900 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 1350 450 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 1620 180 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 2880 180 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3150 450 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3600 900 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3600 1800 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 3150 2250 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Ellipse n 4050 2250 45 45 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr % Polyline n 3150 2250 m 1350 2250 l gs col0 s gr % Polyline [60] 0 sd n 450 2250 m 1350 2250 l gs col0 s gr [] 0 sd % Polyline [60] 0 sd n 1350 2250 m 4050 2250 l gs col0 s gr [] 0 sd % Polyline [15 45] 45 sd n 1350 2250 m 900 1800 l gs col0 s gr [] 0 sd % Polyline [15 45] 45 sd n 1350 450 m 900 900 l gs col0 s gr [] 0 sd % Polyline [15 45] 45 sd n 1350 450 m 1620 180 l gs col0 s gr [] 0 sd % Polyline [15 45] 45 sd n 3150 450 m 2880 180 l gs col0 s gr [] 0 sd % Polyline [15 45] 45 sd n 3150 450 m 3600 900 l gs col0 s gr [] 0 sd % Polyline [15 45] 45 sd n 3150 2250 m 3600 1800 l gs col0 s gr [] 0 sd % Polyline n 1350 2250 m 1348 2248 l 1344 2243 l 1336 2235 l 1325 2222 l 1309 2205 l 1290 2184 l 1268 2159 l 1244 2132 l 1218 2102 l 1192 2072 l 1167 2041 l 1142 2011 l 1119 1981 l 1098 1953 l 1078 1925 l 1060 1899 l 1044 1873 l 1030 1849 l 1016 1824 l 1005 1800 l 994 1775 l 984 1750 l 975 1725 l 967 1701 l 960 1676 l 954 1650 l 948 1624 l 942 1596 l 937 1568 l 933 1539 l 929 1509 l 926 1478 l 924 1447 l 922 1415 l 921 1382 l 921 1350 l 921 1318 l 922 1285 l 924 1253 l 926 1222 l 929 1191 l 933 1161 l 937 1132 l 942 1104 l 948 1076 l 954 1050 l 960 1024 l 967 999 l 975 975 l 984 950 l 994 925 l 1005 900 l 1016 876 l 1030 851 l 1044 827 l 1060 801 l 1078 775 l 1098 747 l 1119 719 l 1142 689 l 1167 659 l 1192 628 l 1218 598 l 1244 568 l 1268 541 l 1290 516 l 1309 495 l 1325 478 l 1336 465 l 1344 457 l 1348 452 l 1350 450 l gs col0 s gr % Polyline n 1350 450 m 1352 449 l 1356 445 l 1363 439 l 1373 431 l 1387 419 l 1405 406 l 1425 390 l 1448 374 l 1471 357 l 1496 340 l 1521 324 l 1546 309 l 1571 295 l 1595 283 l 1620 272 l 1645 262 l 1671 253 l 1697 245 l 1725 237 l 1754 231 l 1785 225 l 1809 221 l 1834 217 l 1860 214 l 1887 211 l 1915 208 l 1945 205 l 1975 202 l 2007 200 l 2040 198 l 2073 196 l 2108 195 l 2143 194 l 2178 193 l 2214 193 l 2250 192 l 2286 193 l 2322 193 l 2357 194 l 2392 195 l 2427 196 l 2460 198 l 2493 200 l 2525 202 l 2555 205 l 2585 208 l 2613 211 l 2640 214 l 2666 217 l 2691 221 l 2715 225 l 2746 231 l 2775 237 l 2803 245 l 2829 253 l 2855 262 l 2880 272 l 2905 283 l 2929 295 l 2954 309 l 2979 324 l 3004 340 l 3029 357 l 3052 374 l 3075 390 l 3095 406 l 3113 419 l 3127 431 l 3137 439 l 3144 445 l 3148 449 l 3150 450 l gs col0 s gr % Polyline n 3150 450 m 3152 452 l 3156 457 l 3164 465 l 3175 478 l 3191 495 l 3210 516 l 3232 541 l 3256 568 l 3282 598 l 3308 628 l 3333 659 l 3358 689 l 3381 719 l 3402 747 l 3422 775 l 3440 801 l 3456 827 l 3470 851 l 3484 876 l 3495 900 l 3506 925 l 3516 950 l 3525 975 l 3533 999 l 3540 1024 l 3546 1050 l 3552 1076 l 3558 1104 l 3563 1132 l 3567 1161 l 3571 1191 l 3574 1222 l 3576 1253 l 3578 1285 l 3579 1318 l 3579 1350 l 3579 1382 l 3578 1415 l 3576 1447 l 3574 1478 l 3571 1509 l 3567 1539 l 3563 1568 l 3558 1596 l 3552 1624 l 3546 1650 l 3540 1676 l 3533 1701 l 3525 1725 l 3516 1750 l 3506 1775 l 3495 1800 l 3484 1824 l 3470 1849 l 3456 1873 l 3440 1899 l 3422 1925 l 3402 1953 l 3381 1981 l 3358 2011 l 3333 2041 l 3308 2072 l 3282 2102 l 3256 2132 l 3232 2159 l 3210 2184 l 3191 2205 l 3175 2222 l 3164 2235 l 3156 2243 l 3152 2248 l 3150 2250 l gs col0 s gr /Helvetica-Narrow ff 150.00 scf sf 360 2160 m gs 1 -1 sc (P1) col0 sh gr /Helvetica-Narrow ff 150.00 scf sf 1440 2430 m gs 1 -1 sc (P2) col0 sh gr /Helvetica-Narrow ff 150.00 scf sf 630 1800 m gs 1 -1 sc (P3) col0 sh gr /Helvetica-Narrow ff 150.00 scf sf 630 900 m gs 1 -1 sc (P4) col0 sh gr /Helvetica-Narrow ff 150.00 scf sf 1080 450 m gs 1 -1 sc (P5) col0 sh gr /Helvetica-Narrow ff 150.00 scf sf 1710 135 m gs 1 -1 sc (P6) col0 sh gr /Helvetica-Narrow ff 150.00 scf sf 2970 180 m gs 1 -1 sc (P7) col0 sh gr /Helvetica-Narrow ff 150.00 scf sf 3285 450 m gs 1 -1 sc (P8) col0 sh gr /Helvetica-Narrow ff 150.00 scf sf 3690 945 m gs 1 -1 sc (P9) col0 sh gr /Helvetica-Narrow ff 150.00 scf sf 3690 1890 m gs 1 -1 sc (P10) col0 sh gr /Helvetica-Narrow ff 150.00 scf sf 3060 2475 m gs 1 -1 sc (P11) col0 sh gr /Helvetica-Narrow ff 150.00 scf sf 4050 2475 m gs 1 -1 sc (P12) col0 sh gr $F2psEnd rs xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/concatoutlines.eps0000664000175000017500000044216111742726711024033 0ustar uwabamiuwabami%!PS-Adobe-3.0 EPSF-3.0 %%Creator: tiff2ps %%Title: concatoutlines.tif %%CreationDate: Wed May 5 18:26:33 1999 %%DocumentData: Clean7Bit %%Origin: 0 0 %%BoundingBox: 0 0 177 137 %%LanguageLevel: 1 %%Pages: (atend) %%EndComments %%BeginSetup %%EndSetup %%Page: 1 1 gsave 100 dict begin 177.000000 137.000000 scale /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def /colorimage where {pop} { /colorimage {pop pop /rgbproc exch def {bwproc} image} bind def } ifelse %ImageData: 177 137 8 3 0 1 2 "false 3 colorimage" /line 531 string def 177 137 8 [177 0 0 -137 0 137] {currentfile line readhexstring pop} bind false 3 colorimage ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000ffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff end grestore showpage %%Trailer %%Pages: 1 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlineproblems4.pdf0000664000175000017500000066350011742726711024274 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœ3Ð3T0A(œËU„æ†`Q S©k g†ffF úAf .ù\@ˆó jendstream endobj 5 0 obj 52 endobj 3 0 obj << /Type /Page /MediaBox [0 0 871 85] /Parent 2 0 R /Resources << /ProcSet [/PDF /ImageC] /XObject<> >> /Contents 4 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 8 0 obj << /CreationDate (D:20010110083141) /Producer (GNU Ghostscript 5.10) >> endobj 6 0 obj << /Type /XObject /Name /R6 /Subtype /Image /Length 7 0 R /ColorSpace /DeviceRGB/Width 871/Height 85/BitsPerComponent 8 >> stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ endstream endobj 7 0 obj 222106 endobj xref 0 9 0000000000 65535 f 0000000363 00000 n 0000000304 00000 n 0000000155 00000 n 0000000015 00000 n 0000000137 00000 n 0000000499 00000 n 0000222760 00000 n 0000000412 00000 n trailer << /Size 9 /Root 1 0 R /Info 8 0 R >> startxref 222782 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlines.pdf0000664000175000017500000001721711742726711022625 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœÝZÍŽv7 îWJKná,K¥9ÄùÏ$. bvmWSU*âC*³àöyìÄvδˆÒ]_ÍbÞøMÿ>¶3.:ÿ¬ß/ïï:¿;]=„tRŽW‹å|ï”Ø®ÐÎ6. #ŸDùJmœ5]¹änë—#·u`QRY'&[®^£”.ŒA#>`7ÌåËa"L‚ ¸Ž¿Uáåøöó#ãcÆâß©áëQñ]£M+%L™j®Wˆ›NáJµl:U|âíº!DÙ¿N¯•ݧ„%VusUG/__/Áôì]pñÖã(óz¤V®XÊ™c½¨C#P¸ 6¥¯Ró™¢"á7.dKDO"9`¨Ëc ëy(!Ó<° Èæyƒ.q`‰`TDep×A|ôz¹»ÆHW›Z£µ+'WkT„I6µtéjÙ†%µ1Ðõ¼ÁÕ¢=®…H—ß KWË6,Á]‡›»J¯× êUòŽ5\}TÄܯèÉ<—ëkʼnuÖ`Cx;PÄy÷:›B–ÝÊ{­)tƒJ6Oß¿ÁÞ/_™×£G:×(¬Ê8ÌG=;ãà5â$¶% qÔm2Øó:1)­Åubrðõ¼'Œ‚PâÆ¡e¹Óî˜ë—Ã¥X;LÊÉá­â¨ÇUîõ ã•릛S¦dTøZ3É©Œ|mºQi}žÐµÌ‹ƒ­õ^§LɜÔÜïPÝ\ŠµÃ¤\Þè!Ž{\åฆ\,iƒ§L  †Æ²gEj@r ÔðAö¯ïÑ·Êv=®kMs§ Øùv¡ˆI`;TÂÅà®ÂôÙ#êõzÄ€j6†d#¬zæ‚8¬ÞÆ€±a+Ð/8Š:ö4ä„qXk­—JЂª ´àê^’Uß1…t7-Äaª™»ÌZ^#¬ŽUyjG«·zÏ«rùŽ)·sXkíH°ZVe -­^áM¯ á;–Æá¦ÅÍe¦ÙŠ6Jn¹Èœeîš-·m˜´ì·“ÁZÚÌg”5ƒ92Ú :QšúýÐŽßU¸ƒâ#é… Kep2ºZF™REšÏú‘‡Š°«9`;Ðèò e°–v«Q–\Æ`Šm7¨Z&‚~¿´ãwf~=¢^œ]ËåþP£ƒÃ¢üãøÛñ%·«|~}†ó›Ã^»þ¿C÷-lÀ%ÿí‹Ø 9cRüÚ>ý }/˜pñÓH߬ñ3xË>û¸ÿÉÂ{eáÍãÏfaõ÷'êñC·Vï¦üož«‘Ÿ7™’®ÑÙsÇJgJ»@ÎB£Ä­q¼€3LAÜWâÖ—ù±ž½VIÁJaDáA“Q,wÚJC¸ø‚ø+Šòð n~ §@äžéŒ¨3=7¦ uxŠ“ÅÉcÀõŒ°Y”Ë3.í¥Ÿ‰ råË3«éLзfœ‘B!Å3áÆœùîÌvC”'HÕY©Œ°¯TÎÔLÌwgÒð)r!…™‚Â9ZGi…âbŠLð\nÿð!’”Æ™M‚À=FO\ЊPàÅJCFF–&uxÖʽs›Êô_!Ÿ¦Ž½ CÜXb¸j6èÉ(ƒÉCŽBIpQ= ì'†H-À `‚M$ÒTÖ»e ;èrf$TŒ“'ŸÜI(0möCS&~³èg•Â#—#ƒ_\BJUè’[ß( œ« 87;Å|ZÜ­øÍªòäÜéµ ˜ BeùÑŠ:Äá,®é‰ß…¹SÄæ*§à#ù [(ëP…ÀóÙ&\ÇCKú¨™Ù~#0xûS(ÄX#… §dô‰ù Òóž!é{ŠÄÅ`¨‰òGž6fôzÅ"l «‰ÔÝÖ«RoBmgÑC¬B÷„<¢P¤N²“I/[8§:áXÒd¾2"J„-qqé“"‡¨0â3¡_’ß„úyÕ#Z”+$¨ˆÂy1ʾ'¢\‹É‚Œ«m»)BíwaÎm˜k_¹)•€°)ïZ3BÞ ÃÀÆ™èÆËŒD7³7äeS€\‰3&–Ÿˆñ'ÑæJ´…vwS–SßB‚ c9maDm‡ZT•¶ð£RçsƒE¨¼ñ¥=Š­Q³H—W>‰tͪ‘Ñ}Kà\+[RQ-•Óßj óäDÿ1e¶ü¥0Ì{Ž£mªb0ÃâzXò† áep ì³!µR7HBoˆ„¦ ¶@‰â*ƒ¶·(Câ4¶­–5!-(¥Ék¨Á-Šor8–SnRÄ&®ÕÔ©îS§5öjm@! ×­~ Ÿl‚~VcPiþ‰Yëõ&EÍJõÁ¸* ö°JGˆÊ‰jÅ|Ê^/i iౚJÎg­îÒàÇå²Õf¤7JYÛê7 Xñ µdµ74œ°¥7 è˜áÈ­—ˆŒið‡µ |ËÖ‘Ä€^¨á] (hu·Æ&òs¢À›ŸÈÈãzƒJeÆÞD‚\Þ-y-‚e½%²ù¼a%1€zSJæèôÆÏ(Ö*ÅHåãM¦Þå¨ÊãͪÊì ­êåM¯êî±ÚÇzçeAï®ÕÈÞ«#¼KW_Y#¿¼é­¾:ÜÇ VØØP¡ås‡ŸÏ& >¿hÛˆ£qîSæ‚OJš.>L­tòyKÎg2MJŸÛ4qm´ÓÜöéOóß'DÛ" FlÒ4¨±itB‘«†U6ÒžÙØûvŽfüi+ÿ’µ~½¼?ÿò|üéÏ'ÏßúÿZOüŠ¢ŸÏï?ûàÃw|þûQ;޵p>óÙýŠ)OlžüÀ´Í4J„>a°û|Š0~Ã$>ñ÷ÏcŸ2‰ßbâ$|øÕ?™ÂßëuÿV8ñsPœ”ßÍË Œ ëw¿ÿê_"3Ouñ~÷‡)zÌgÐ}"ú_ŸÏ/Ž/Žÿ9x}endstream endobj 5 0 obj 2542 endobj 3 0 obj << /Type /Page /MediaBox [0 0 252 156] /Parent 2 0 R /Resources << /ProcSet [/PDF /ImageB /Text] /Font << /A 7 0 R >> >> /Contents 4 0 R >> endobj 7 0 obj <>/FontBBox[0 -3 46 68]/FontMatrix[1 0 0 1 0 0]/Widths[ 0 0 51 0 44 0 52 0 0 0 0 0 0 0 35 43]>> endobj endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 24 0 obj << /CreationDate (D:20010110083156) /Producer (GNU Ghostscript 5.10) >> endobj 6 0 obj <> endobj 8 0 obj <> stream 0 0 0 0 45 68 d1 45 0 0 68 0 0 cm BI /IM true/W 45/H 68/BPC 1/F/CCF/DP<> ID 0/ÿÿÿÿÿÿÿÿÿÿäƒÞ÷÷‘F>ß·ßþ÷ÿÿÿÿׯõéuáqZúÖ°P EI endstream endobj 9 0 obj <> stream 0 0 0 2 25 68 d1 25 0 0 66 0 2 cm BI /IM true/W 25/H 66/BPC 1/F/CCF/DP<> ID 5‹ÿÿÿÿÿÿÿÿÿÿÿçGÿ“†ûïïà EI endstream endobj 10 0 obj <> stream 51 0 0 0 0 0 d1 endstream endobj 11 0 obj <> stream 0 0 0 1 45 68 d1 45 0 0 67 0 1 cm BI /IM true/W 45/H 67/BPC 1/F/CCF/DP<> ID >ßûò0?Ûû¾íî݇»v»°íÃÜ7nÜ=»w·}ßÛ3ïßÿÿkÕý¯«kµ¶°a,v­XPÔ0¥A@@ EI endstream endobj 12 0 obj <> stream 44 0 0 0 0 0 d1 endstream endobj 13 0 obj <> stream 0 0 0 1 38 70 d1 38 0 0 69 0 1 cm BI /IM true/W 38/H 69/BPC 1/F/CCF/DP<> ID :ŽP„ éÓ§D?< z ½7Þ“êûþ“ÿþ?®—­*Á)Ð4k ZÞäHnÝïíÈãÿÿÿöÿõÝ]wí+alK«V¬(aN£€€ EI endstream endobj 14 0 obj <> stream 52 0 0 0 0 0 d1 endstream endobj 15 0 obj <> stream 0 0 0 2 46 68 d1 46 0 0 66 0 2 cm BI /IM true/W 46/H 66/BPC 1/F/CCF/DP<> ID #Cÿÿÿÿÿüøkÿü’r9ßoý¿öûûíÿ·þßoý¿öûûíÿ·ßßoý¾þ;ûßßÞþþ  EI endstream endobj 16 0 obj <> stream 0 0 0 3 45 70 d1 45 0 0 67 0 3 cm BI /IM true/W 45/H 67/BPC 1/F/CCF/DP<> ID Ç)Äè:tò4ÓtŸMë«êûÿÚ¸ÿÿë^h5½mv»K ,0¸­ZÉŽ¶\ì. ý÷ÿÿîù ØÿÿÞ  EI endstream endobj 17 0 obj <> stream 0 0 0 1 37 70 d1 37 0 0 69 0 1 cm BI /IM true/W 37/H 69/BPC 1/F/CCF/DP<> ID 5AÂtéÓÈ\t=&ôô›Óû¤ÿÿ´Ÿÿýÿ¿^·õÚ_Úá„°ÂäcŠízípÕØ[ þßüˆ¿û[Öý­ëka¥a‚â­Zµ C @ EI endstream endobj 18 0 obj <> stream 0 0 0 3 38 68 d1 38 0 0 65 0 3 cm BI /IM true/W 38/H 65/BPC 1/F/CCF/DP<> ID 3ßþÿßïßîÿ~ÿwöþïíÿoÛöý¿oÛöíû~Ý¿nÜš†®ÿü@ EI endstream endobj 19 0 obj <> stream 0 0 0 1 37 70 d1 37 0 0 69 0 1 cm BI /IM true/W 37/H 69/BPC 1/F/CCF/DP<> ID :Žƒ táN¹ŽtŸMéêÞ¿Õõÿÿÿö¯_ÚÛK}°–[jÔ0­Bœè ÞƒÒoúzÞŸÿÿÿÿÛ_[_ÛKalJÇ«V¡… (0P EI endstream endobj 20 0 obj <> stream 0 0 0 1 37 70 d1 37 0 0 69 0 1 cm BI /IM true/W 37/H 69/BPC 1/F/CCF/DP<> ID !Ž éÓ§Nˆ\x@Ý'Ózzß}}¿þ-ÿíù ^O„W§iòºè:OZ½{ú^ÿÿÿ×ÿý÷KûúÞ¶¶ÒÚÛK b­Zµ XS©@@ EI endstream endobj 21 0 obj <> stream 0 0 0 1 46 70 d1 46 0 0 69 0 1 cm BI /IM true/W 46/H 69/BPC 1/F/CCF/DP<> ID !téÓ§D.:>›¤ún¾›ý&ÿÿÒoÿÿÿI¿ÿÿÿÿÿÿÿÿöÒÿÿÿÛKÿ·ô¿m/Û]¥m,0¶*Õ«PÕ…*  EI endstream endobj 22 0 obj <> stream 35 0 0 0 0 0 d1 endstream endobj 23 0 obj <> stream 43 0 0 0 0 0 d1 endstream endobj xref 0 25 0000000000 65535 f 0000003227 00000 n 0000003168 00000 n 0000002647 00000 n 0000000015 00000 n 0000002627 00000 n 0000003364 00000 n 0000002802 00000 n 0000004601 00000 n 0000004797 00000 n 0000004972 00000 n 0000005036 00000 n 0000005249 00000 n 0000005313 00000 n 0000005537 00000 n 0000005601 00000 n 0000005801 00000 n 0000006016 00000 n 0000006246 00000 n 0000006436 00000 n 0000006669 00000 n 0000006898 00000 n 0000007116 00000 n 0000007180 00000 n 0000003276 00000 n trailer << /Size 25 /Root 1 0 R /Info 24 0 R >> startxref 7244 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/outlineproblems1.eps0000664000175000017500000152331411742726711024306 0ustar uwabamiuwabami%!PS-Adobe-3.0 EPSF-3.0 %%Creator: tiff2ps %%Title: outlineproblems1.tif %%CreationDate: Wed May 5 18:52:15 1999 %%DocumentData: Clean7Bit %%Origin: 0 0 %%BoundingBox: 0 0 871 82 %%LanguageLevel: 1 %%Pages: (atend) %%EndComments %%BeginSetup %%EndSetup %%Page: 1 1 gsave 100 dict begin 871.000000 82.000000 scale /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def /colorimage where {pop} { /colorimage {pop pop /rgbproc exch def {bwproc} image} bind def } ifelse %ImageData: 871 82 8 3 0 1 2 "false 3 colorimage" /line 2613 string def 871 82 8 [871 0 0 -82 0 82] {currentfile line readhexstring pop} bind false 3 colorimage ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffff000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff 000000000000000000000000000000000000000000ffffffffffffffffff000000 000000ffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffff000000000000 ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffff000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000ffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000ffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffff000000000000000000ffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000ffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000ffffff000000000000000000ffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000ffffffffffff ffffffffffff000000000000000000000000ffffffffffff000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffffffffff000000 000000ffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff 000000000000000000000000000000000000000000ffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffff000000000000000000 ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffff000000000000ffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffff000000000000ffffffffffff000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000ffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000ffffffffffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000ffffff000000000000 000000000000000000000000000000ffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000ffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000ffffffffffffffffffffffff000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000000000000000ffffffffffffffffffffffff000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffffff000000000000000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffff000000000000000000ffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffff000000000000000000000000000000000000000000 000000000000000000000000000000ffffffffffff000000000000000000000000 000000000000000000000000000000000000000000000000ffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffff000000 000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffff000000000000000000 000000000000000000000000ffffffffffff000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 000000000000000000ffffffffffff000000000000000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff end grestore showpage %%Trailer %%Pages: 1 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/rotate.pdf0000664000175000017500000000250511742726711022253 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœUT9’1 Ìù †và1‚Gê*?`-e.GrùªU°‘¿o4ÀQYZi¦›ÄE ¹tp%üí÷í^Þ ×ß…©þõQǽðìý ­lN_Ÿ¶°rn¿–Kyóˆ¶_·{ýt-¿ôʲŽE­^x:l µúጀñ»Þßý|ýS>_ëKùZ•ðýV…ê÷§ÌòÀÏÅKrýRx·)Ø ÜÃÃæ:þcö`l:€ì@YF f¾{+ÜFsÖ‡3wjªá4/]Þ ¾¼µ–È=„[Ø`)ìQ̉[Û‘7Wó¸E@YFšâÑÒJÄ]EÂTˆñp <·•{""QË?L“3_²6}G|:¤œAÉ Æ+ÓQ“:qü<·“¡HghJ^­†7 :ybÝ"Ð ·îa2ú‚IïêÑæå‘]J–pIÏ$ Lœ>bɦcîsÀL9\iu GÔ’¡¸µÛ>'Óþä™Yš;ã‘ åŒ>Ñú‰ØÚ°.˜Wï1GÃáÐ2ŽÍ¸Íž„¿¡tñùß @ø ¤‚–è˜5ëqêÀY[öËÝäC§Šnå4¾Ö€ÂeÀpÍžŠ¤ºF”Ò:zŸ$b?vº9ÜêtAÁÀaÌļ³C…ú„U6q¥:I%Þ¤Ïè«ÃEÙò5J4å,wW?ó’ÝO¼bn2—Ðò¦å5õõ&y³Dò"Űó„m x$l¸—Ͳ Àº¢¿‰y_Ãu¸½t?¦²€qÎ-ìD}j3guKdós {üº”—òtð}endstream endobj 5 0 obj 593 endobj 3 0 obj << /Type /Page /MediaBox [0 0 200 200] /Parent 2 0 R /Resources << /ProcSet [/PDF /Text] /Font << /R6 6 0 R >> >> /Contents 4 0 R >> endobj 6 0 obj <> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 7 0 obj << /CreationDate (D:20010110083239) /Producer (GNU Ghostscript 5.10) >> endobj xref 0 8 0000000000 65535 f 0000000977 00000 n 0000000918 00000 n 0000000697 00000 n 0000000015 00000 n 0000000678 00000 n 0000000845 00000 n 0000001026 00000 n trailer << /Size 8 /Root 1 0 R /Info 7 0 R >> startxref 1113 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/internals.tex0000664000175000017500000010377611742726711023017 0ustar uwabamiuwabami%---------------------------------------------------------------------------- % ----- File: internals.tex % ----- Author: Rainer Menzner (Rainer.Menzner@web.de) % ----- Date: 2003-03-01 % ----- Description: This file is part of the t1lib-documentation. % ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2003. % As of version 0.5, t1lib is distributed under the % GNU General Public Library License. The % conditions can be found in the files LICENSE and % LGPL, which should reside in the toplevel % directory of the distribution. Please note that % there are parts of t1lib that are subject to % other licenses: % The parseAFM-package is copyrighted by Adobe Systems % Inc. % The type1 rasterizer is copyrighted by IBM and the % X11-consortium. % ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) % ----- Credits: I want to thank IBM and the X11-consortium for making % their rasterizer freely available. % Also thanks to Piet Tutelaers for his ps2pk, from % which I took the rasterizer sources in a format % independent from X11. % Thanks to all people who make free software living! %---------------------------------------------------------------------------- \newpage \section{Internals (incomplete)} \label{internals}% \vskip1cm \hrule \vskip0.5cm \begin{center} \sffamily\large {\Huge\bfseries Note!}\\ This section is still very incomplete and some facts are not true anymore. This should be kept in mind. Currently I have no time to write this section. But I try to keep figure \ref{figure:t1data} consistent to the current releases. This may lead to inconsistencies between the text and the figure. \end{center} \hrule \vskip1cm In this section, some information on internals of \tonelib\ is given. There is no need for an average user to read this section although having understood what is going on internally might be helpful if problems occur. The basic idea of this section is to describe the data structures and to give information on when they are initialized, allocated and referenced. Figure \ref{figure:t1data} shows an image of the data-structures for the special case that the font with ID 0 has already been loaded and several size-instances have already been created. %-- Figure: The data structures of t1lib \begin{figure} \begin{center} \includegraphics*[angle=90]{t1_data} \end{center} \hrule\vskip3mm\small \caption{\label{figure:t1data}The internal data structures of \tonelib. The underlying substructures are shown only for the first font {\tt FontID=0}.} \end{figure} As the figure indicates, the complete area may be split into three different sub-areas, thereby pointing out their logical functions. \subsection{Level 0: Global Data} \label{globaldata}% This area contains information needed for the overall organization of the \tonelib. Its contents and its size are thus determined at the time \tonelib\ is initialized. This is done based on the contents of the configuration file and the fontdatabase file. The entries in detail are: \begin{itemize} \item {\tt Filename-Searchpaths}: This entry essentially does not depend on any other data. It consists of 4 \verb+\0+-terminated strings that are read from the configuration file. They are referenced internally by the global symbols \verb+PFAB_ptr+, \verb+AFM_ptr+, \verb+ENC_ptr+ and \verb+FDB_ptr+ respectively. All these are declared as \verb+unsigned char *+. These strings are used by \tonelib\ to locate the respective file types. If no configuration file exists or some path declaration is missing, the corresponding searchpath is set to ``\verb+.+'', causing \tonelib\ to only search the current working directory. \item \verb+no_fonts_ini+: This value is assigned after examining the fontdatabase file. It is meant to store the number of fonts initially declared in the fontdatabase file. In other words, it is assigned the integer number located on the first line of the fontdatabase file. \item \verb+no_fonts+: The number of actually allocated fonts. Initially, this quantity is identical to \verb+no_fonts_ini+. But if one creates a new logical font by calling \verb+T1_CopyFont()+ this counter is incremented to keep track of allocated fonts. \verb+no_fonts+ thus represents most large \verb+FontID+ minus 1 that makes sense to specify to any function of \tonelib. \item \verb+no_fonts_limit+: The number of fonts for which memory is currently allocated. This also is initially set to \verb+no_fonts_ini+ and is automatically enlarged to a multiple of the initial value if a call to \verb+T1_CopyFont()+ requires additional memory for logical fonts (see \ref{logicalfonts}). \item \verb+bitmap_pad+: This variable contains the number of bits to which scanlines of bitmaps and antialiased bitmaps are padded. It is set during initialization, either to a default value or to the value the application specified before starting initialization using \verb+T1_SetBimapPad()+. Allowed values are currently `8', `16' and `32'. \item \verb+endian+: During initialization the hardware is checked for representation of data in memory. If Big Endian is used, \verb+endian+ is set to \verb+1+ and otherwise it is set to \verb+0+. \verb+endian+ is needed at several times when an application or \tonelib\ itself must know the byte order of words and long words. \item \verb+pFontArray+: This a pointer to an array of structures whose type is referred to as \\ \verb+FONTPRIVATE+ in \tonelib. The contents of these structures will be described below. After \tonelib\ has been initialized, memory is allocated for exactly \verb+no_fonts_ini+ structures. This memory pool may be enlarged later if the one wants to make use of logical fonts, for example. The data in these structures initially is not specified. It is written with meaningful values when a font is loaded into memory. The index to access this array-elements is the well known font identification number (\verb+FontID+). \item \verb+pFontFileNameIDArray+: A pointer to a memory area where the font file names corresponding to the \verb+FontID+s are stored. During initialization, \tonelib\ looks for font files with extension \verb+.pfa+ and \verb+.pfb+. The basename of the file found is stored in this area and if the font is to be loaded later, its font file name is looked up here. \end{itemize} We should now discuss the entries of the structures of type \verb+FONTPRIVATE+. The term \verb+FONTPRIVATE+ indicates that every font needs its own structure area. As mentioned earlier, this area is initialized when the corresponding font is loaded. \begin{itemize} \item \verb+pAFMData+: A pointer to a memory area where Adobe Font Metric data of the font is stored. The memory area itself is build by the \verb+parse_afm+-package which is supplied by Adobe System and included in \tonelib. This happens while a font is loaded. In case there is no AFM file for the font in question, this pointer is given the value \verb+NULL+. \item \verb+pType1Data+: A pointer to the data area where the Type 1 information is stored. The known PostScript Type 1 objects Charstrings-dictionary, Subroutines, Othersubroutines and Fontinfo-dictionary are located here. The memory is filled with data during parsing the font file when the font is loaded. \item \verb+pFontEnc+: A pointer to an optional external encoding vector. During initialization, this pointer is set to \verb+NULL+, thus indicating that by default the font's internal encoding should be used. If a font is reencoded using a previously loaded encoding vector from an encoding file, this pointer simply is assigned the address of a valid encoding array somewhere in memory. \item \verb+vm_base+: The base address of the virtual memory required by the font. Unlike the original rasterizer, which allocated virtual memory in chunks of a fixed size, t1lib uses another principle. Since it is \`a priori not obvious how many virtual memory a font consumes, \tonelib\ tries to load a font repeatedly and increases the amount of virtual memory during every trial. In order not to waste memory, the memory is reallocated to the needed size when the font is completely loaded. Finally, the starting address of the virtual memory is needed when a font is to be unloaded and the memory it consumes is to be given back to system. \item \verb+pFontSizeDeps+: A pointer to the area where the size dependent data is to be stored. This data essentially consists of generated glyphs plus some administrative item (see \ref{sizedependentfontdata}). \item \verb+FontMatrix+: A matrix of four \verb+double+-values specifying the font matrix. If the FontInfo-dictionary of the font file defines a FontMatrix, it is copied to this location. If not, a default matrix is used which does no transformation and scales to $1/1000$~bp. \item \verb+FontTransform+: A matrix that will be concatenated with the FontMatrix to produce the final transformation of the characters. It is this matrix that is modified if a font is to be slanted or extended. \item \verb+slant+: A slant factor for the current font. Note that this value is initially 0, even for italic font. Only artificially slanting a font leads to values different from 0. \item \verb+extend+: The horizontal extension factor for the current font. Its default value is 1 and the font is thus rendered at its natural width. \item \verb+physical+: This is a switch that marks a font either being ``physical'' or ``logical''. A physical font by definition is a font for which a Type 1 font file is available and for which thus Level 1 (size-independent) data is present (see Fig.\ 5.1). In contrast, the term ``logical font'' refers to a structure of type \verb+FONTPRIVATE+ whose entry \verb+pType1Data+ points to Level 1 data of another (physical) font. This \verb+FONTPRIVATE+-structure is created by calling \verb+T1_CopyFont()+ with the identification number of an existing physical font as argument (see \ref{logicalfonts}). \item \verb+refcount+: This counter keeps track on how much logical fonts refer to the physical font that is represented by the current structure of type \verb+FONTPRIVATE+. In this since, \verb+refcount+ is only meaningful for physical fonts. It is necessary to keep track of the reference of logical fonts because if this font would be removed from memory by calling \verb+T1_DeleteFont()+, the Level 1 font data memory area would be given back to the system but the logical fonts referring to that font would still expect to find Type 1 or Font Metric data at this address. By checking \verb+refcount+, \verb+T1_DeleteFont()+ can check for logical fonts referring to the font in question and prevent from removing this font from memory. In structures describing logical fonts, \verb+refcount+ is used to store the information which physical font this logical font is referring to. This information is also needed by \verb+T1_DeleteFont()+ since when removing logical fonts, the reference counter of the corresponding physical font has to be decremented. \item \verb+space_position+: This variable stores the encoding index of the ``space''-character of the current font. If the space character does not appear in the current font's encoding, \verb+space_position+ is assigned -1. It follows that \verb+space_position+ is assigned when (1) a font loaded and (2) every time a font is reencoded. Why is it convenient to store the position of the space character in the encoding vector? The properties of the space character are set apart from the other characters' properties not only by the fact that it does not produce any colored pixels but also by that it may shrink and stretch in \tonelib. As a consequence a space character is treated by simply inserting a horizontal escapement of the width of the space character---corrected by the quantity \verb+space_off+ that a user may specify (see \ref{generatingbitmaps}). This involves always checking every character for being the space character and since the encoding principle is used in \tonelib, every check needs a call to \verb+strcmp()+. This overhead is avoided if the position of space is stored. \end{itemize} \subsection{Level 1: Size-Independent Font Data} \label{sizeindependentfontdata}% Size-independent data may be split into three categories as indicated in figure \ref{figure:t1data}. The external encoding is optional and is generated by loading an encoding file as described in \ref{encoding}. It is simply an array of 256 pointers to \verb+unsigned char+ and an ensemble of 256 \verb+\0+-terminated strings. Each pointer references one of the 256 strings in order. The strings are the characters' names to be defined in a \tonelib-encoding file. The internal Type 1 data structures hold all data specified in a type font file. I do not want to describe these data structures here, because this could fill a book. Adobe has made the description of the Type 1 font format available to the public. The Adobe Font Metrics area is entirely created by the \verb+parse_afm+-package. Adobe has made this available by means of the file \verb+parseAFM.shar+ which is a shell-archive and included in \tonelib\ in the subdirectory \verb+parse_afm+. \subsection{Level 2: Size-Dependent Font Data} \label{sizedependentfontdata}% $\ldots$ \newpage \section{Stroked Characters} \label{strokingimplementation}% This section is only meant for the reader interested in details about the algorithm used to create stroked versions from outlines intended to be filled. It can help to understand the code I added to \verb+type1.c+, which may seem a little bit strange. The basic idea to achieve stroked outlines was to map the stroking operation to a simple filling operation as already implemented by the rasterizer. Why did I choose this approach? Well, the actual reason for doing so was that I felt like doing so. One of the pivotal problems in this context turned out to be the computation of a third order Bezier curve, being located {\em in parallel} to a given third order Bezier curve---a problem set which everybody on the net said to be impossible to solve. After some experimenting I had to admit that these people actually were right: It is not possible to solve this problem in general, in particular because tracing a given cubic Bezier spline using a finite pen width might produce delimiting curves which aren't Bezier splines at all. In particular, the angular range and the pen width in relation to the original curve's bend are of importance. However, under some constraints, which usually are fulfilled by adhering to the Adobe design rules for Type 1 Fonts and by choosing reasonable stroke widths, it is possible to approximate these delimiting curves by cubic Bezier splines. \subsection{Approach} Type 1 character outline descriptions consist of mathematically thin defining curves and lines with an associated running direction. By convention, regions left of these defining curves are painted and regions right of these curves are left blank. For each properly defined character, this way, a finite area to be filled results by applying this rule, especially because for filled characters every subpath must be closed. Figure~\ref{figure:stroking1}~\fbox{A} shows the character ``8'' from the ComputerModern Roman font as an example. \begin{figure}[t] \hfill \fbox{A}\includegraphics[scale=0.5]{t1dump/t1dump_eight} \hfill \fbox{B}\includegraphics[scale=0.5]{t1dump/t1dump_o} \hfill\break \hrule\vskip3mm\small \caption{\label{figure:stroking1}\fbox{A} Character ``8'' from font ComputerModern Roman. The arrows indicate the direction of the paths. From the outer subpath it follows that the inner region will be filled (left of the path). From this massive black region, the holes are cut by means of the two inner subpaths (and their direction). \fbox{B} The principle of creating a stroked character by filling a newly created set of subpaths which surround the original path in an appropriate manor.} \end{figure} We find three subpaths which by means of their direction relations yield the filled character. When talking about {\em stroking}, we mean tracing a pen of finite width along these subpaths. When doing so, a new finite (more complex) region of ink is built. Actually we can consider this filled region being the result of filling a newly created path that consists of two subpaths surrounding the original path and having appropriate directions. These newly created subpaths are referred as the {\em right path} and the {\em left path}. Figure~\ref{figure:stroking1} \fbox{B} illustrates this idea for the character ``o''. The original path is represented by dashed curves whereas left paths and right paths are shown as solid curves. The respective directions are indicated by arrows. Now, what are the steps required to compute a right path or left path from a given path and given a certain strokewidth? Firstly, for each path segment two {\em parallel paths} the right and the left path, located half the strokewidth right and left of the original path have to be computed. This is shown for the character ``t'' in Figure~\ref{figure:stroking2}, \fbox{A}. \begin{figure}[t] \hfill \fbox{A}\includegraphics[scale=0.5]{t1dump/t1dump_t_1} \hfill \fbox{B}\includegraphics[scale=0.5]{t1dump/t1dump_t_2} \hfill\break \hrule\vskip3mm\small \caption{\label{figure:stroking2}\fbox{A} Character ``t'' from font ComputerModern Roman. The original path is shown in a thick dashed style. Each segment is surrounded by a parallel path to the right hand side and a parallel path to the left hand side. \fbox{B} Required additional connection segments in order to complete the outline path.} \end{figure} In particular, it turns out that in order to connect two parallel right or left paths of two neighboring original path segments, additional path segments are required. Therefore, in a second step, these parallel path segments---which in general may be disjoint---have to be connected appropriately. These additional path segments are shown in \fbox{B} of the figure. We term these path segments {\em Prolongation Segments}. They are always built as straight lines. It is also obvious, that for convex edges, prolongation actually is what it indicates, and for concave edges, some trick must be applied so that prolongation yields a path that actually {\em shortens} the respective parallel path segments. \subsection{Computation of Parallel Paths} \label{parallelpaths}% For straight lines, the notion of a parallel path in distance $w/2$ immediately becomes evident, but what about Bezier curves? Let us define the parallel of a curve as the infinite set of points, that results from tracing along the curve and for each point of the curve computing the point which in direction orthogonally to the curve's tangent at the respective location is just the distance $w/2$ apart. The {\em parallel curve} resulting from the principle above actually no longer is a third order Bezier curve. But if a few additional constraints hold, it can be approximated quite well by such a third order Bezier curve: \begin{itemize} \item The curvature should not exceed an angular range of 90 degrees. This condition automatically is fulfilled for Type 1 fonts which adhere to the Adobe recommendations. \item The strokewidth $w$ the curve should be drawn width is small compared to the extension and the curvature of the curve. This principle usually is fulfilled by nature because tracing a character outline path with a very thick pen won't lead to a good representation of the character. \end{itemize} In the following, we will describe how to compute a parallel Bezier curve defined by four points $\vec{A}'$, $\vec{B}'$, $\vec{C}'$ and $\vec{D}'$, given an original Bezier curve defined by four points $\vec{A}$, $\vec{B}$, $\vec{C}$ and $\vec{D}$ and a strokewidth $w$. The computation of parallel straight lines results as the special case of only respecting the points $\vec{A}$ and $\vec{D}$ from these considerations. Figure~\ref{figure:stroking3} represents the basis of our discussion. \begin{figure}[t] \centerline{\includegraphics[scale=0.7]{t1dump/parallelpath_sk}} \hrule\vskip3mm\small \caption{\label{figure:stroking3}Construction of parallel Bezier path segments. The original curve is shown in dashed style and the light gray area indicates the thick Bezier curve segment that later will result from filling between left and right parallel path. Furthermore, important intermediate points are shown. A detailed discussion is given in the text.} \end{figure} It shows the original mathematically thin Bezier segment defined by the points $\vec{A}$, $\vec{B}$, $\vec{C}$ and $\vec{D}$ in dashed style. The counterpart of $\vec{A}$ in the parallel path follows from simple geometric considerations, as illustrated for the point $\vec{A}'$. It lies half the strokewidth $w$ away from $\vec{A}$ and the direction is determined by the location of point $\vec{B}$. For the two coordinates of $\vec{A}'$ we find \begin{equation} \label{eq:eq1} A'_x = A_x + \frac{w}{2}\frac{B_y - A_y}{|\vec{B} - \vec{A}|} \end{equation} and \begin{equation} \label{eq:eq2} A'_y = A_x - \frac{w}{2}\frac{B_x - A_x}{|\vec{B} - \vec{A}|}. \end{equation} Corresponding equations can be derived for the point $\vec{D}'$, so that, up to now, we are able to compute parallel straight line segments. It remains to compute two control points, $\vec{B}'$ and $\vec{C}'$, in a way that the resulting Bezier curve appears as parallel to the original curve in the sense defined above. In order to make the path at point $\vec{A}'$ actually parallel to the orginal path at $\vec{A}$, we require $\vec{B}' - \vec{A}'$ to be parallel to $\vec{B} - \vec{A}$. From this we can derive an equation that expresses the fact that $\vec{B}'$ lies somewhere on the straight line that runs through point $\vec{A}'$ and has the direction $\vec{B} - \vec{A}$, i.e., \begin{equation} \label{eq:eq3} \vec{B}' = \vec{A}' + \mu_B (\vec{B} - \vec{A}), \end{equation} and correspondingly \begin{equation} \label{eq:eq4} \vec{C}' = \vec{D}' + \mu_C (\vec{C} - \vec{D})\phantom{,} \end{equation} for point $\vec{C}'$. Here, $\mu_B$ and $\mu_C$ are two positive quantities, whose exact values are still to be determined. In order to compute $\mu_B$ and $\mu_C$, we consider a third point on the curve. Using a well-known algorithm that iteratively approximates a Bezier curve via straight line segments, we can easily determine the coordinates of the point that---in the parameter equation $f(t)$ of a Bezier curve---corresponds to the parameter $t=1/2$. It can be considered as a {\em middle point} of the curve segment. In Figure~\ref{figure:stroking3}, this point is named $\vec{P}_6$. It can be computed by computing some intermediate points: \begin{equation} \label{eq:eq5} \vec{P}_1 = \frac{1}{2} ( \vec{A} + \vec{B} ) \end{equation} \begin{equation} \label{eq:eq6} \vec{P}_2 = \frac{1}{2} ( \vec{B} + \vec{C} ) \end{equation} \begin{equation} \label{eq:eq7} \vec{P}_3 = \frac{1}{2} ( \vec{C} + \vec{D} ) \end{equation} \begin{equation} \label{eq:eq8} \vec{P}_4 = \frac{1}{2} ( \vec{P}_1 + \vec{P}_2 ) \end{equation} \begin{equation} \label{eq:eq9} \vec{P}_5 = \frac{1}{2} ( \vec{P}_2 + \vec{P}_3 ) \end{equation} and finally \begin{equation} \label{eq:eq10} \vec{P}_6 = \frac{1}{2} ( \vec{P}_4 + \vec{P}_5 ) = \frac{1}{8} ( \vec{A} + 3 \vec{B} + 3 \vec{C} + \vec{D} ) \end{equation} Using the same geometrical considerations as in Eqs.~\ref{eq:eq1} and \ref{eq:eq2}, we can now compute a unit vector, $\vec{n}_6$, perpendicular to the curve at $\vec{P}_6$ and obtain \begin{equation} \label{eq:eq11} n_{6x} = \frac{ P_{5y} - P_{4y} }{\sqrt{(P_{5x}-P_{4x})^2 + (P_{5y}-P_{4y})^2}} \end{equation} \begin{equation} \label{eq:eq12} n_{6y} = - \frac{ P_{5x} - P_{4x} }{\sqrt{(P_{5x}-P_{4x})^2 + (P_{5y}-P_{4y})^2}} \end{equation} $\vec{P}'_6$ can now be computed as \begin{equation} \label{eq:eq13} \vec{P}'_6 = \vec{P}_6 + \vec{N}_6, \end{equation} where $\vec{N}_6 = \frac{w}{2} \vec{n}_6$, i.e., the vector orthogonal to the curve at $\vec{P}_6$ with a length of half the strokewidth $w$. As before, we have to require that the slope of the curve $\vec{P}_6$ equals the one at $\vec{P}'_6$, i.e., with respect to Figure~\ref{figure:stroking3} we find \begin{eqnarray*} \vec{P}'_5 - \vec{P}'_4 & = & \nu \left( \vec{P}_5 - \vec{P}_4 \right) \\ \frac{\vec{P}'_2 + \vec{P}'_3}{2} - \frac{\vec{P}'_1 + \vec{P}'_2}{2} & = & \nu \left( \frac{\vec{P}_2 + \vec{P}_3}{2} - \frac{\vec{P}_1 + \vec{P}_2}{2} \right) \\ \frac{\vec{C}' + \vec{D}'}{2} - \frac{\vec{A}' + \vec{B}'}{2} & = & \nu \left( \frac{\vec{C} + \vec{D}}{2} - \frac{\vec{A} + \vec{B}}{2} \right) \end{eqnarray*} and hence finally \begin{equation} \label{eq:eq14} \vec{C}' + \vec{D}' - \vec{A}' - \vec{B}' = \nu \left( \vec{C} + \vec{D} - \vec{A} - \vec{B} \right)\;. \end{equation} We have thus expressed the slope condition at $\vec{P}_6$ in terms of the characteristic points of a Bezier curve and a factor, $\nu$, still to be determined (cf.~Eqs.~\ref{eq:eq3} and \ref{eq:eq4}). On the way to Eq.~\ref{eq:eq14}, we made use of the well-known geometrical relations \hbox{Eqs.~\ref{eq:eq5} -- \ref{eq:eq9}}. Based on the same considerations that led to Eq.~\ref{eq:eq10}, we can write the corresponding equation for the point $\vec{P}'_6$: \begin{equation} \label{eq:eq15} \vec{P}'_6 = \frac{1}{2} ( \vec{P}'_4 + \vec{P}'_5 ) = \frac{1}{8} ( \vec{A}' + 3 \vec{B}' + 3 \vec{C}' + \vec{D}' ) \end{equation} Exploiting Eq.~\ref{eq:eq13} and solving for $\vec{C}'$, we can reorganize Eq.~\ref{eq:eq15}: \begin{equation} \label{eq:eq16} \vec{C}' = \frac{8 (\vec{N}_6 + \vec{P}_6) - \vec{A}' - \vec{D}'}{3} - \vec{B}' \end{equation} From this equation, we are able eliminate $\vec{B}'$ by substituting the transformed slope condition for point $\vec{P}'_6$ (Eq.~\ref{eq:eq14}). We obtain \begin{eqnarray} \nonumber \vec{C}' &=& \frac{8 (\vec{N}_6 + \vec{P}_6) - \vec{A}' - \vec{D}'}{3} + \left[ \nu \left( \vec{C} + \vec{D} - \vec{A} - \vec{B} \right) - \vec{C}' - \vec{D}' + \vec{A}' \right] \\ \nonumber 2\, \vec{C}' &=& \frac{8 (\vec{N}_6 + \vec{P}_6) - \vec{A}' - \vec{D}'}{3} + \vec{A}' - \vec{D}' + \nu \left( \vec{C} + \vec{D} - \vec{A} - \vec{B}\right) \\ \label{eq:eq17} \vec{C}' &=& \underbrace{\frac{4 (\vec{N}_6 + \vec{P}_6) + \vec{A}' - 2 \vec{D}'}{3}} _{\mbox{$\vec{l}_C$}} + \frac{\nu}{2} \underbrace{\left( \vec{C} + \vec{D} - \vec{A} - \vec{B}\right)} _{\mbox{$\vec{d}_C$}} \,. \end{eqnarray} Here, for the sake of brevity, we introduced a location vector, $\vec{l}_C$, and a direction vector, $\vec{d}_C$, which together with the parameter $\nu$ define the point $\vec{C}'$. Considering Eqs.~\ref{eq:eq4} and \ref{eq:eq17}, we finally found two independent relations for $\vec{C}'$, that linearly depend on two quantities, $\mu_C$ and $\frac{\nu}{2}$. Therefore, by substituting the right hand sides of (\ref{eq:eq4}) and (\ref{eq:eq17}), we obtain the following $2 \times 2$ system of linear equations: \begin{equation} \label{eq:eq18} \left[ \begin{array}{cc} (\vec{C}-\vec{D}) & \vec{d}_C \end{array} \right] \left( \begin{array}{cc} \mu_C \\ \nu/2 \end{array} \right) = \left( \vec{l}_C - \vec{D}' \right) \end{equation} Formally, all vectors appearing in this equation are column vectors. The solution of the system can be written as \begin{equation} \label{eq:eq19} \left( \begin{array}{cc} \mu_C \\ \nu/2 \end{array} \right) = \left[ \begin{array}{cc} (\vec{C}-\vec{D}) & \vec{d}_C \end{array} \right]^{-1} \left( \vec{l}_C - \vec{D}' \right)\, . \end{equation} Once $\vec{C}'$ has been computed, it is easy to compute $\vec{B}'$, by making use of Eq.~\ref{eq:eq16}. A few remarks about the approach described above are appropriate. \begin{itemize} \item It is also possible to first compute the point $\vec{B}'$ and then use Eq.~\ref{eq:eq16} to compute $\vec{C}'$. \item The numerical stability at the respective end of the curve determines the preference of which point to compute first. A criterion for the numerical stability is the absolute value of determinant of the $2 \times 2$ matrix in Eq.~\ref{eq:eq18}. \item This determinant may become zero in which case the curve transforms into a straight line. These cases must be treated extraordinarily. \item There are a number of further exceptional cases, e.g., if point $\vec{C}$ equals $\vec{D}$. Then the slope at this end of the curve is not enforced by point $\vec{C}$. \item A good solution, that is, a {\em parallel curve}, will only result, if the set of assumptions discussed previously holds. If the resulting curve does not appear {\em parallel} to the original curve, the parallel curve cannot be approximated by a third order Bezier spline. \end{itemize} \subsection{Connection of Path Segments and Prolongation} \label{connectingpaths} In order to actually obtain delimiting paths for character outlines, the parallel paths have to be connected to a continuous path. This raises the problem of line joining. When connecting two neighboring parallel path segments, we have to distinguish between two qualitatively different situations. \begin{enumerate} \item Convex Corner\\ When tracing along two neighboring parallel path segments, we turn to the left and a convex corner appears. In these cases, we prolongate the end of the first path and the beginning of the second path using straight lines and compute an intersection between these prolongation segments. The resulting lengths of both prolongation segments will be positive. \item Concave Corner\\ When tracing along two neighboring parallel path segments, we turn to the right and a concave corner results. In these cases, the two neighboring parallel path segments intersect by nature and actually would have to be trimmed to their intersection point. Trimming on the other hand would make it impossible to feed the resulting curve in the standard format into the rasterizer. We therefore use a trick that saves us computing an intersection and recomputing the Bezier control points. From the ideal end point of the first parallel path we insert a straight prolongation to the connection point of the original path segments and a second straight prolongation segment from there to the starting point of the second parallel path segment. Then, the area left of the path is ensured to be within the extents that finally are to be filled with ink. \end{enumerate} We will now explain this principle using the example shown in Figure~\ref{figure:stroking4}. \begin{figure}[t] \centerline{\includegraphics[scale=1.1]{t1dump/t1dump_B}} \vskip3mm\hrule\vskip3mm\small \caption{\label{figure:stroking4}A small excerpt at the middle right from the character ``B'' of ComputerModern Roman. The ideal mathematical outline of the filled character is shown in thick dashed style. Left and right path of the character's outline representation are shown in medium solid style. Prolongation is indicated by large dashes of medium thickness.} \end{figure} The interesting part is in the middle right. The original path---shown in bold dashed style---steps into the figure in the lower right as the end of a curve segment $p_1$. At the following connection point, the path strongly turns to the right so that a concave corner results and continues with a further curve segment $p_2$. This path is now to be surrounded in a symmetrical manner by one right and one left path. For $p_1$, we find the right path as a parallel curve segment above the original path. It has been computed as described in the previous section. For $p_2$, the right path is a parallel curve segment located in an appropriate distance below $p_2$. The two neighboring right path segments are disjoint because of the concavity of the resulting corner. Hence, rule 2 from above applies in order to connect them using straight prolongation lines, in the figure shown in wide dashes of a medium linewidth: From the end of right path 1, we prolongate to the point where the original segments $p_1$ and $p_2$ join, and from there, a second prolongation to the beginning of right path 2 is inserted. The direction is indicated by arrows. Obviously, even the right path alone produces a closed region in this case, but this does not cause problems here. The left path runs into the direction opposite to the original path. By nature, the curvature at the point under consideration now is convex. Hence, according to rule 1, the neighboring left paths' segments are prolongated to their common intersection point, respecting the ending direction of left path 1 and the starting direction of left path 2. The kind of corner at two neighboring parallel path segments $p_1$ and $p_2$ can be computed analytically. Let $\vec{T}_1$ be the tangent vector at the end point of $p_1$ and $\vec{T}_2$ be the tangent vector at the starting point of $p_2$. Assuming that both $\vec{T}_1$ and $\vec{T}_2$ are column vectors, we can use the determinant of the square matrix constructed by these vectors to determine the corner type: \begin{equation} \label{eq:eq20} d = \left| \begin{array}{cc} \vec{T}_1 & \vec{T}_2 \end{array} \right| \end{equation} If $d<0$, the corner type is concave whereas for $d>0$, the corner type is convex. For the special case $d=0$, the slope at the joining point is continuous, so that effectively $\vec{T}_1$ and $\vec{T}_2$ linearly depend on each other. For those cases, prolongation is not required at all, because if the neighboring segments in the original path join, neighboring segments in the left and right path will do so too. The kind of joining lines described above is known as {\em mitered line joining}. \tonelib\ does not impose a limit on the width of mitered corners, so that the operation \tonelib\ implements is identical to what PostScript does by default, i.e., using a line join type of 0 and an infinite miter limit. %%% Local Variables: %%% mode: latex %%% TeX-master: "t1lib_doc" %%% End: xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/mirrorv.pdf0000664000175000017500000000246111742726711022456 0ustar uwabamiuwabami%PDF-1.2 %Çì¢ 4 0 obj <> stream xœT¹’“1 îý.¡àG‡å£Ý`I:†* Ç)¶âõWŸä?ÙÄþ$ë>–®„¿}ßîåµpýU˜ê?ˆj÷"üû~\`^Ê«óÂʾn÷út-?÷ÊFõú½¤ Ýø]ïï~¼¿¾”O×ú\¾T%|¿V¡úíÿKò/…™»š‚—À½14l®ã/Ê› ;šÂÌ_o…ÛhNõá”+5ÕPš‚K—:^‡ZKäÂ-dÀg ysâÖ¶åM«yÜ ,7#Mq´”qU‘b.Ãc‚ÁsK¹&ŒÀEZþy`šœþ’jÓ_Ä»AÊid¡œ– ¼Ò5©é๜ w†¢ôáÑjh¢bá'ø†¹t‘ÑDzW7ˆ2/·Ü{ÖKÜqO' ˜8;$|(†%‹nŒ¾Ï1åP¥ÕÑQK Á­]†Ð9)ÝæO:=Ksa9!¢œÖ'J?a[ø‚~õ q4,’–qlŠÛìÙ@èBïÿ }Á¨ $:æFÍzd8cËz¹zÃøÐ9E·ò3z­ —Á5{N$Õ5"”ÖQû$Âöã¥û®=ý€>Pp=1/ã¬ÃaÇ|bU6á“6ê$9”x}F].Ê’÷ˆQ¢(g¸;ú™Kv?ñŠ¾É ,¡3ã„&LË5u~“Ü,‘\¤Ø;3lÁÃaÃ^6Ë2ëŠú&潆ëpyéžæd#Ï=x‰øÔfö6â–ðæy {üº”çò8+ÿxendstream endobj 5 0 obj 573 endobj 3 0 obj << /Type /Page /MediaBox [0 0 200 200] /Parent 2 0 R /Resources << /ProcSet [/PDF /Text] /Font << /R6 6 0 R >> >> /Contents 4 0 R >> endobj 6 0 obj <> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 7 0 obj << /CreationDate (D:20010110083114) /Producer (GNU Ghostscript 5.10) >> endobj xref 0 8 0000000000 65535 f 0000000957 00000 n 0000000898 00000 n 0000000677 00000 n 0000000015 00000 n 0000000658 00000 n 0000000825 00000 n 0000001006 00000 n trailer << /Size 8 /Root 1 0 R /Info 7 0 R >> startxref 1093 %%EOF xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/doc/mirrorv.eps0000664000175000017500000000054511742726711022475 0ustar uwabamiuwabami%!PS-Adobe-2.0 EPSF-1.2 %%BoundingBox: 0 0 200 200 %%EndComments /TimesRoman findfont 150 scalefont setfont 100 100 translate gsave [ 1 0 0 -1 0 0] concat 0 0 moveto 100 0 rlineto 0 0 moveto 0 100 rlineto stroke 0 0 moveto (g) show grestore [ 3 3 ] 2 setdash 0 0 moveto 100 0 rlineto 0 0 moveto 0 100 rlineto stroke 0 0 moveto (g) true charpath stroke xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/README.win320000664000175000017500000000044611742726711021340 0ustar uwabamiuwabamiThe directory win32 contains some files for compiling t1lib under MS Visual C++ 6.0. They are contributed by Nakano Hideo (hideo@mb.infoeddy.ne.jp). I can't tell anything about this and add it to the sources for convenience. (RMz, 2000-03-20) xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/README.t1lib-5.1.20000664000175000017500000001566211742726711022060 0ustar uwabamiuwabami -------------------------------------------------------------------------- --------------------------- t1lib-README --------------------------------- -------------------------------------------------------------------------- /*-------------------------------------------------------------------------- ----- File: REAMDE.t1lib-5.1.2 ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2007-12-23 ----- Description: This is file README.t1lib of the t1lib-package. It contains an overview and brief installation instructions for the t1-library. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2007. As of version 0.5, t1lib is distributed under the GNU General Public Library License. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ About t1lib: ------------ t1lib is a library distributed under the GNU General Public Library License for generating character- and string-glyphs from Adobe Type 1 fonts under UNIX. t1lib uses most of the code of the X11 rasterizer donated by IBM to the X11-project. But some disadvantages of the rasterizer being included in X11 have been eliminated. Here are some of the features: - t1lib is completely independent of X11 (although the program provided for testing the library needs X11) - fonts are made known to library by means of a font database file at runtime - searchpaths for all types of input files are configured by means of a configuration file at runtime - characters are rastered as they are needed - characters and complete strings may be rastered by a simple function call - when rastering strings, pairwise kerning information from .afm-files may optionally be taken into account - an interface to ligature-information of afm-files is provided - a program to generate afm-files from Type 1 font files is included - rotation and arbitrary transformations are supported - there's support for extending and slanting fonts - underlining, overlining and overstriking is supported - new encoding vectors may be loaded at runtime and fonts may be reencoded using these encoding vectors - antialiasing is implemented - Right-To-Left typesetting is supported - Font subsetting is easily possible - support of composite character information - stroking of character outlines with variable strokewidths - An interactive test program called "xglyph" is included in the distribution. This program allows to test all of the features of the library. It requires X11. Changes and New Features: ------------------------- - See the file Changes in the T1Lib top-directory for information on new features. Installation: ------------- ----------------------------------------------------------------------------- Note: VMS-users should examine configure.com in the toplevel directory, which is a configure-script for VMS, kindly contributed by John Hasstedt and now maintained by Martin Zinser. This file contains notes on how to compile t1lib on VMS. ----------------------------------------------------------------------------- After unpacking the archive (what you obviously did already), change to subdirectory t1lib-..../ and type: ./configure This will create the Makefiles. Then type make In order to use the testprogram xglyph, X11 needs to be installed on your system. If you have difficulties during configuring and building t1lib, cd to directory t1lib-.../doc and execute $ latex t1lib_doc.tex $ makeindex t1lib_doc $ latex t1lib_doc.tex $ latex t1lib_doc.tex This will generate the docs which contain a more detailed description of the build-process. LaTeX2e is required. Alternatively, you can scan the preformatted pdf-documentation. Before installing the libraries, you should test whether all things work correct: 1) Change to subdirectory xglyph 2) Start the program xglyph 3) Ensure that the output-window is not hidden behind another window. 4) Before doing anything other, click on button "String". The string "Test" should now be rastered and displayed in the output-window, using font BitstreamCharterBTRoman at 100bp without kerning. If that works, most probably all works for you. 5) Have a look at t1lib_doc.dvi in the doc-subdirectory of the package and read the chapter on xglyph. However, most of this program is self-explaining, so that you might want to omit this step. 6) Play with the program and enjoy. 7) If you do not have X11, you can still check whether t1lib works for you. Copy one of the pfb-files from t1lib-.../Fonts/type1, say, bchr.pfb, to the type1afm-subdirectory, and run type1afm bchr.pfb If the afm-file bchr.afm is generated, t1lib will most probably work on your system. Documentation: -------------- As mentioned above, documentation is provided in LaTeX2e-format subdirectory T1Lib/doc. It should have been built during the build. The section on runtime setup is really important, because programs may fail due to an invalid or incomplete runtime setup, although the programs itself may be correct! A preformatted Version is also available in pdf. How to get it: -------------- t1lib is available at ftp://sunsite.unc.edu/pub/Linux/libs/graphics/t1lib-x.y[.z].tar.gz where x.y[.z] is the version identification. Closing: -------- You are allowed to send the author lots of money and dozents of gifts, but you needn't :-) If you have any comments to this library, feedback is wanted. Send eMail to: Rainer.Menzner@web.de Future: ------- Within the past years, my time has constantly and increasingly become spare so that I hardly found time to further develop t1lib. And developing free software is undoubtedly related to a certain amount of fun, which in turn only can come up if you are relaxed with respect to time ... Since t1lib now has reached a reasonably stable state, I intend to more or less freeze the development of new features at this point. Of course, bug fixes etc. should be possible further. If there is somebody out there willing to further develop t1lib, he or she is welcome to contact me ... Have fun, -Rainer xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/configure.com0000775000175000017500000005706011742726711022207 0ustar uwabamiuwabami$ goto start This command file writes the command files make.com in this directory, make.com and sysconf.h in [.lib.t1lib], make.com in [.lib.type1], and make.com in [.xglyph]. Executing the make.com in this directory will use the other make.com files to compile the C files and put them in the T1 object library in this directory, and compile and link xglyph. Xglyph requires the xaw and xmu libraries; I used the libraries that came with ghostview. This command file looks for a required header file in X11_ROOT:[XAW]. If it does not find it looks for an X11 directory tree parallel to this tree. If it does not find it there, it creates the command file, but you have to edit it to tell it where the files and libraries are before you can execute it. I linked ghostview using the static version of xmu and xaw, so I link to object libraries instead of sharable images. I renamed the xaw3d directory to xaw in the x11 tree of ghostview so I did not have to change xglyph.c. To run xglyph on V6.* of VMS, you need to define T1LIB_CONFIG to be the T1LIB.CONFIG file in the xglyph directory; it will also not show the timing information on V6.*. I have compiled the library and run xglyph on VMS V6.2, both VAX and Alpha; I used DECC V5.6. I use IEEE floating on Alpha and G floating on VAX. John Hasstedt Physics Department State University of New York at Stony Brook John.Hasstedt@sunysb.edu Nov-1999 - Extended the functionality to check for xaw/xmu also in the X11 path (which is the most Unix compatible way to store them ;-). - Added tests for shareable version of the Xaw/Xmu libraries, using the shareable images if the appropriate logicals are defined. If not the object libraries are used as before. - Added support for type1afm build - Adapted to t1lib 0.9.2 Dec-1999 - Added support for absolute pathnames for font files under OpenVMS Aug-2000 - First cut of an incremental build Jul-2002 - Create a shareable image on OpenVMS Alpha Feb-2003 - Add missing initialization for xaw_root - Clarify description of Xglyph as >>test<< application - Improved method to build options file for shareable image (Thanks to Hartmut Becker Hartmut.Becker@compaq.com) Feb-2004 - Add DECC$NO_ROOTED_SEARCH_LISTS definition to get Xglyph compile ok on later versions of Compaq C Nov-2004 - Save and restore user environment instead of just overwriting - Build example applications - Add options processing - Polish shareable image creation - Start work on version perserving case Dec-2004 - Moving defines into sysconf.h, avoiding quote madness Martin Zinser zinser@zinser.no-ip.info $start: $ ! If a user has a symbol cc or something else, don't use it. $ set symbol/scope=(nolocal,noglobal) $ say = "write sys$output" $ ! $ say "Getting the version number" $ t1lib_identifier = "?.?" $ open/read in configure. $loop: $ read/end=done in rec $ if (f$element(0,"=",rec) .nes. "T1LIB_IDENTIFIER") then goto loop $ t1lib_identifier = f$element(1,"=",rec) $done: $ close in $ ! $ say "Creating make.com" $ create make.com $ open/append out make.com $ copy sys$input: out $ deck $ true = 1 $ false = 0 $ tmpnam = "temp_" + f$getjpi("","pid") $ tt = tmpnam + ".txt" $ tc = tmpnam + ".c" $ th = tmpnam + ".h" $ its_decc = false $ its_vaxc = false $ its_gnuc = false $ s_case = False $! $! Setup variables holding "config" information $! $ ccopt = "" $ lopts = "" $! $! Which command parameters were given $! $ gosub check_opts $! $eod $ if (f$getsyi("ARCH_NAME") .eqs. "VAX") $ then $ float = "g_float" $ else $ float = "ieee_float" $ endif $ write out "$ cflags = ""/prefix=all/float=''float'"" + ccopt" $ copy sys$input: out $ deck $! $! Marker for futher work with name=as_is compilation to work around $! fact that DECW shareable does not contain mixed case entry points $! TBD: Compile t1x11 and xglyph along the lines of [--]motif_name.h+'source' $! Make sure to get the include path to the "jackets" right $! $ if s_case $ then $ create motif_name.h $ open/append outh motif_name.h $ copy sys$input: outh $ deck/dollar="$ eoh" #ifdef __cplusplus #define VMS_BEGIN_C_PLUS_PLUS extern "C" { #define VMS_END_C_PLUS_PLUS } #else #define VMS_BEGIN_C_PLUS_PLUS #define VMS_END_C_PLUS_PLUS #endif #include "motif_redefines.h" $ eoh $ close outh $ endif $ set default [.lib.t1lib] $ @make.com $ write sys$output "Compiling in [.lib.type1]" $ set default [-.type1] $ @make.com $ set default [--] $ write sys$output "Creating t1.olb" $ library/create t1.olb [.lib.t1lib]*.obj,[.lib.type1]*.obj $ write sys$output "Creating xglyph.exe" $ set default [.xglyph] $ @make.com $ set default [-] $ write sys$output "Creating type1afm.exe" $ set default [.type1afm] $ @make.com $ set default [-] $ write sys$output "Creating example applications" $ set default [.examples] $ @make.com $ set default [-] $! $! Establish the Compiling Environment $! $ Cpu_Model = F$GetSYI("HW_MODEL") $ open/write optf t1.opt $T1_L: $ file = f$search("[.lib.t1lib]*.obj") $ if file .eqs. "" then goto TY_L $ write optf file $ goto t1_l $TY_L: $ file = f$search("[.lib.type1]*.obj") $ if file .eqs. "" then goto end_opt $ write optf file $ goto ty_l $END_OPT: $ close/nolog optf $! $! Alpha gets a shareable image $! $ If Cpu_Model .gt. 1024 $ Then $ write sys$output "Creating t1shr.exe" $ call anal_obj_axp t1.opt _link.opt $ open/append optf t1.opt $ if s_case then write optf "case_sensitive=YES" $ write optf "sys$share:decw$xlibshr.exe/share" $ close optf $ LINK_/NODEB/SHARE=t1shr.exe t1.opt/opt,_link.opt/opt $ endif $! $ dele/noconf *.opt;* $ write sys$output "Done" $ exit $! $!------------------------------------------------------------------------------ $! $! Analyze Object files for OpenVMS AXP to extract Procedure and Data $! information to build a symbol vector for a shareable image $! All the "brains" of this logic was suggested by Hartmut Becker $! (Hartmut.Becker@compaq.com). All the bugs were introduced by me $! (zinser@zinser.no-ip.info), so if you do have problem reports please do not $! bother Hartmut/HP, but get in touch with me $! $! Version history $! 0.01 20040406 Skip over shareable images in option file $! 0.02 20041109 Fix option file for shareable images with case_sensitive=YES $! $ ANAL_OBJ_AXP: Subroutine $ V = 'F$Verify(0) $ SAY := "WRITE_ SYS$OUTPUT" $ $ IF F$SEARCH("''P1'") .EQS. "" $ THEN $ SAY "ANAL_OBJ_AXP-E-NOSUCHFILE: Error, inputfile ''p1' not available" $ goto exit_aa $ ENDIF $ IF "''P2'" .EQS. "" $ THEN $ SAY "ANAL_OBJ_AXP: Error, no output file provided" $ goto exit_aa $ ENDIF $ $ open/read in 'p1 $ create a.tmp $ open/append atmp a.tmp $ loop: $ read/end=end_loop in line $ if f$locate("/SHARE",f$edit(line,"upcase")) .lt. f$length(line) $ then $ write sys$output "ANAL_SKP_SHR-i-skipshare, ''line'" $ goto loop $ endif $ f= f$search(line) $ if f .eqs. "" $ then $ write sys$output "ANAL_OBJ_AXP-w-nosuchfile, ''line'" $ goto loop $ endif $ define/user sys$output nl: $ define/user sys$error nl: $ anal/obj/gsd 'f /out=x.tmp $ open/read xtmp x.tmp $ XLOOP: $ read/end=end_xloop xtmp xline $ xline = f$edit(xline,"compress") $ write atmp xline $ goto xloop $ END_XLOOP: $ close xtmp $ goto loop $ end_loop: $ close in $ close atmp $ if f$search("a.tmp") .eqs. "" - then $ exit $ ! all global definitions $ search a.tmp "symbol:","EGSY$V_DEF 1","EGSY$V_NORM 1"/out=b.tmp $ ! all procedures $ search b.tmp "EGSY$V_NORM 1"/wind=(0,1) /out=c.tmp $ search c.tmp "symbol:"/out=d.tmp $ define/user sys$output nl: $ edito/edt/command=sys$input d.tmp sub/symbol: "/symbol_vector=(/whole sub/"/=PROCEDURE)/whole exit $ ! all data $ search b.tmp "EGSY$V_DEF 1"/wind=(0,1) /out=e.tmp $ search e.tmp "symbol:"/out=f.tmp $ define/user sys$output nl: $ edito/edt/command=sys$input f.tmp sub/symbol: "/symbol_vector=(/whole sub/"/=DATA)/whole exit $ sort/nodupl d.tmp,f.tmp 'p2' $ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;* $ if f$search("x.tmp") .nes. "" - then $ delete x.tmp;* $! $ EXIT_AA: $ if V then set verify $ endsubroutine $!------------------------------------------------------------------------------ $! $! Check command line options and set symbols accordingly $! $ CHECK_OPTS: $ i = 1 $ OPT_LOOP: $ if i .lt. 9 $ then $ cparm = f$edit(p'i',"upcase") $ if cparm .eqs. "DEBUG" $ then $ ccopt = ccopt + "/noopt/deb" $ lopts = lopts + "/deb" $ endif $ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) $ then $ start = f$locate("=",cparm) + 1 $ len = f$length(cparm) - start $ ccopt = ccopt + f$extract(start,len,cparm) $ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - then s_case = true $ endif $ if cparm .eqs. "LINK" then linkonly = true $ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) $ then $ start = f$locate("=",cparm) + 1 $ len = f$length(cparm) - start $ lopts = lopts + f$extract(start,len,cparm) $ endif $ if f$locate("CC=",cparm) .lt. f$length(cparm) $ then $ start = f$locate("=",cparm) + 1 $ len = f$length(cparm) - start $ cc_com = f$extract(start,len,cparm) if (cc_com .nes. "DECC") .and. - (cc_com .nes. "VAXC") .and. - (cc_com .nes. "GNUC") $ then $ write sys$output "Unsupported compiler choice ''cc_com' ignored" $ write sys$output "Use DECC, VAXC, or GNUC instead" $ else $ if cc_com .eqs. "DECC" then its_decc = true $ if cc_com .eqs. "VAXC" then its_vaxc = true $ if cc_com .eqs. "GNUC" then its_gnuc = true $ endif $ endif $ i = i + 1 $ goto opt_loop $ endif $ return $!------------------------------------------------------------------------------ $ eod $ close out $ ! $ say "Creating [.lib.t1lib]sysconf.h" $ cc sys$input:'ccopt'/float='float'/object=test.obj #include #include main() { FILE *f=fopen("[.lib.t1lib]sysconf.h", "w"); if (!f) exit(EXIT_FAILURE); fprintf(f, "#define SIZEOF_CHAR %d\n", sizeof(char)); fprintf(f, "#define SIZEOF_SHORT %d\n", sizeof(short)); fprintf(f, "#define SIZEOF_INT %d\n", sizeof(int)); fprintf(f, "#define SIZEOF_LONG %d\n", sizeof(long)); #ifdef __VAX fprintf(f, "#define SIZEOF_LONG_LONG %d\n", sizeof(long)); #else fprintf(f, "#define SIZEOF_LONG_LONG %d\n", sizeof(long long)); #endif fprintf(f, "#define SIZEOF_FLOAT %d\n", sizeof(float)); fprintf(f, "#define SIZEOF_DOUBLE %d\n", sizeof(double)); #ifdef __VAX fprintf(f, "#define SIZEOF_LONG_DOUBLE %d\n", sizeof(double)); #else fprintf(f, "#define SIZEOF_LONG_DOUBLE %d\n", sizeof(long double)); #endif fprintf(f, "#define SIZEOF_VOID_P %d\n", sizeof(void *)); exit(EXIT_SUCCESS); } $ link test $ run test $ open/append sysconf [.lib.t1lib]sysconf.h $ write sysconf "" $ write sysconf "#define T1_AA_TYPE16 short" $ write sysconf "#define T1_AA_TYPE32 int" $ write sysconf "#define T1_INT16 short" $ write sysconf "#define T1_INT32 int" $ write sysconf "" $ write sysconf "#define T1LIB_IDENT ", t1lib_identifier $ write sysconf "" $ write sysconf "#define GLOBAL_CONFIG_DIR ""T1_FONT_DIR""" $ close sysconf $ delete test.obj;*,test.exe;* $ ! $ say "Creating [.lib.t1lib]make.com" $ copy sys$input: [.lib.t1lib]make.com $ deck $ call make parseafm.obj "cc ''cflags' parseafm" - parseafm.c $ call make t1aaset.obj "cc ''cflags' t1aaset" - t1aaset.c $ call make t1afmtool.obj "cc ''cflags' t1afmtool" - t1afmtool.c $ call make t1base.obj "cc ''cflags' t1base" - t1base.c $ call make t1delete.obj "cc ''cflags' t1delete" - t1delete.c $ call make t1enc.obj "cc ''cflags' t1enc" - t1enc.c $ call make t1env.obj "cc ''cflags' t1env" - t1env.c $ call make t1finfo.obj "cc ''cflags' t1finfo" - t1finfo.c $ call make t1load.obj "cc ''cflags' t1load" - t1load.c $ call make t1outline.obj "cc ''cflags' t1outline" - t1outline.c $ call make t1set.obj "cc ''cflags' t1set" - t1set.c $ call make t1subset.obj "cc ''cflags' t1subset" - t1subset.c $ call make t1trans.obj "cc ''cflags' t1trans" - t1trans.c $ call make t1x11.obj "cc ''cflags' t1x11" - t1x11.c $ exit $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 - P8 What it depends on $ $ If F$Search(P1) .Eqs. "" Then Goto Makeit $ Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(0) $ write sys$output P2 $ 'P2 $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE $eod $ ! $ say "Creating [.lib.type1]make.com" $ create [.lib.type1]make.com $ deck $! $! Just some general variables $! $ true = 1 $ false = 0 $ tmpnam = "temp_" + f$getjpi("","pid") $ tc = tmpnam + ".c" $! $ gosub check_function $! $ call make arith.obj "cc ''cflags' arith" - arith.c $ call make curves.obj "cc ''cflags' curves" - curves.c $ call make fontfcn.obj "cc ''cflags' fontfcn" - fontfcn.c $ call make hints.obj "cc ''cflags' hints" - hints.c $ call make lines.obj "cc ''cflags' lines" - lines.c $ call make objects.obj "cc ''cflags' objects" - objects.c $ call make paths.obj "cc ''cflags' paths" - paths.c $ call make regions.obj "cc ''cflags' regions" - regions.c $ call make scanfont.obj "cc ''cflags' scanfont" - scanfont.c $ call make spaces.obj "cc ''cflags' spaces" - spaces.c $ call make t1io.obj "cc ''cflags' t1io" - t1io.c $ call make t1snap.obj "cc ''cflags' t1snap" - t1snap.c $ call make t1stub.obj "cc ''cflags' t1stub" - t1stub.c $ call make token.obj "cc ''cflags' token" - token.c $ call make type1.obj "cc ''cflags' type1" - type1.c $ call make util.obj "cc ''cflags' util" - util.c $ exit $! $!------------------------------------------------------------------------------ $! $! Check if a specific function needs to be implemented $! $CHECK_FUNCTION: $! $! bstring --> memset ... $! $ func = "bstring" $ hfile = "" $ open/write tmpc 'tc $ write tmpc "#include " $ write tmpc "#include " $ write tmpc "int main(){" $ write tmpc " memset(NULL,1,1);" $ write tmpc "}" $ close tmpc $ gosub cc_prop_check $! $ return $! $!------------------------------------------------------------------------------ $! $! Check for properties of C/C++ compiler $! $CC_PROP_CHECK: $ cc_prop = false $ set message/nofac/noident/nosever/notext $ on error then continue $ cc 'all_cflags' 'tmpnam' $ if $status then cc_prop = true $ set message/fac/ident/sever/text $ delete/nolog 'tmpnam'.*;* $ if cc_prop $ then $ if (func .nes. "") $ then $ write sys$output "Function ''func' implemented in C RTL" $ else $ write sys$output "h-file ''hfile' part of C RTL" $ endif $ else $ if (func .nes. "") $ then $ CALL MAKE 'func'.OBJ "CC ''cflags' ''func'.C" 'func'.C $ endif $ if (hfile .nes. "") then copy 'hfile'.h_in 'hfile'.h $ endif $ return $! $!------------------------------------------------------------------------------ $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 - P8 What it depends on $ $ If F$Search(P1) .Eqs. "" Then Goto Makeit $ Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(0) $ write sys$output P2 $ 'P2 $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE $eod $ ! $ say "Creating [.xglyph]make.com" $ xaw_root = "" $ check_xaw = "X11_ROOT,X11" $ check_rel = f$parse("[-.x11]") - "].;" $ if (check_rel .nes. "") $ then $ define rel_loc "''check_rel'.]" $ check_xaw = check_xaw + ",rel_loc" $ endif $ i = 0 $SEARCH_XAW: $ dir = f$element(i,",",check_xaw) $ if (dir.nes.",") $ then $ if ( f$search("''dir':[xaw]label.h") .nes. "" ) then xaw_root = dir $ i = i + 1 $ goto search_xaw $ endif $ create [.xglyph]make.com $ open/append out [.xglyph]make.com $ if (xaw_root .eqs. "") $ then $ say "I could not locate the xaw and xmu files. In case you want" $ say "to build the Xglyph test application you need to edit" $ say "[.xglyph]make.com to add appropriate paths." $ write out "$ type/nopage sys$input" $ write out "In case you want to build the Xglyph test application you" $ write out "need to edit this file to delete the exit command and define" $ write out "the dir symbol for the location of the xmu and xaw libraries." $ write out "$ exit" $ write out "$ xaw_root = "":[dir.X11""" $ else $ write out "$ xaw_root = ""''xaw_root'""" $ endif $ copy sys$input: out $ deck $ if (f$getsyi("ARCH_NAME") .eqs. "VAX") $ then $ olb_dir = "exe" $ else $ olb_dir = "exe_alpha" $ endif $ save_x11_dir = f$trnlnm("x11_directory") $ save_xmu_dir = f$trnlnm("xmu_directory") $ save_xaw_dir = f$trnlnm("xaw_directory") $ save_olb_dir = f$trnlnm("olb_directory") $ save_dnrsl = f$trnlnm("decc$no_rooted_search_lists") $ if (xaw_root.nes."X11") then define x11 'xaw_root',decw$include: $ define x11_directory decw$include: $ define xmu_directory 'xaw_root':[xmu] $ define xaw_directory 'xaw_root':[xaw] $ define olb_directory 'xaw_root':['olb_dir'] $ define DECC$NO_ROOTED_SEARCH_LISTS 1 $ open/write optf xglyph.opt $ write optf "xglyph.obj" $ write optf "[-]t1.olb/library" $ write optf "sys$share:decc$shr.exe/share" $ write optf "sys$share:decw$xextlibshr/share" $ write optf "sys$share:decw$xlibshr/share" $ write optf "sys$share:decw$xtlibshrr5/share" $ if (f$trnlnm("xaw3dlibshr").nes."") $ then $ write optf "xaw3dlibshr/share" $ else $ write optf "olb_directory:xaw3dlib/library" $ endif $ if (f$trnlnm("xmulibshr").nes."") $ then $ write optf "xmulibshr/share" $ else $ write optf "olb_directory:xmulib/library" $ endif $ close optf $ call make xglyph.obj "cc ''cflags' xglyph.c" - xglyph.c $ call make xglyph.obj "link xglyph.opt/option" - xglyph.obj [-]t1.olb $ if (save_x11_dir .nes. "") $ then $ define x11_directory 'save_x11_dir' $ else $ deassign x11_directory $ endif $ if (save_xmu_dir .nes. "") $ then $ define xmu_directory 'save_xmu_dir' $ else $ deassign xmu_directory $ endif $ if (save_xaw_dir .nes. "") $ then $ define xaw_directory 'save_xaw_dir' $ else $ deassign xaw_directory $ endif $ if (save_olb_dir .nes. "") $ then $ define olb_directory 'save_olb_dir' $ else $ deassign olb_directory $ endif $ if (save_dnrsl .nes. "") $ then $ define DECC$NO_ROOTED_SEARCH_LISTS 'save_dnrsl' $ else $ deassign DECC$NO_ROOTED_SEARCH_LISTS $ endif $ exit $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 - P8 What it depends on $ $ If F$Search(P1) .Eqs. "" Then Goto Makeit $ Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(0) $ write sys$output P2 $ 'P2 $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE $eod $ close out $ say "Creating [.type1afm]make.com" $ create [.type1afm]make.com $ open/append out [.type1afm]make.com $ copy sys$input: out $ deck $ call make type1afm.obj "cc ''cflags' type1afm.c" - type1afm.c $ call make type1afm.exe "link type1afm,[-]t1/library" - type1afm.obj [-]t1.olb $ exit $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 - P8 What it depends on $ $ If F$Search(P1) .Eqs. "" Then Goto Makeit $ Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(0) $ write sys$output P2 $ 'P2 $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE $eod $ close out $ say "Creating [.examples]make.com" $ create [.examples]make.com $ open/append out [.examples]make.com $ copy sys$input: out $ deck $ call make subset.obj "cc ''cflags' subset.c" - subset.c $ call make subset.exe "link subset,[-]t1/library" - subset.obj [-]t1.olb $ call make t1example1.obj "cc ''cflags' /include=[-.lib.t1lib] t1example1.c" - t1example1.c $ call make t1example1.exe "link t1example1,[-]t1/library" - t1example1.obj [-]t1.olb $ exit $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 - P8 What it depends on $ $ If F$Search(P1) .Eqs. "" Then Goto Makeit $ Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(0) $ write sys$output P2 $ 'P2 $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE $eod $ close out $ say "Creating [.examples]t1libvms.config" $ create [.examples]t1libconf.fdl $ open/append out [.examples]t1libconf.fdl $ copy sys$input: out $ deck IDENT "T1lib config file" FILE ORGANIZATION sequential RECORD BLOCK_SPAN yes CARRIAGE_CONTROL carriage_return FORMAT stream_lf $eod $ close out $ create/fdl=[.examples]t1libconf.fdl [.examples]t1libvms.config $ open/append out [.examples]t1libvms.config $ copy sys$input: out $ deck This is a configuration file for t1lib FONTDATABASE=FontDataBase ENCODING=[-.fonts.enc];sys$disk:[] AFM=[-.fonts.afm];sys$disk:[] TYPE1=[-.fonts.type1];sys$disk:[] $eod $ close out $ exit xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/win32/0000775000175000017500000000000011742726711020455 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/win32/T1_Static.dsw0000664000175000017500000000105211742726711022765 0ustar uwabamiuwabamiMicrosoft Developer Studio Workspace File, Format Version 6.00 # $B7Y9p(B: $B$3$N%o!<%/%9%Z!<%9(B $B%U%!%$%k(B $B$rJT=8$^$?$O:o=|$7$J$$$G$/$@$5$$(B! ############################################################################### Project: "T1_Static"=".\T1_Static.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/win32/T1_Static.dsp0000664000175000017500000002376511742726711022775 0ustar uwabamiuwabami# Microsoft Developer Studio Project File - Name="T1_Static" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** $BJT=8$7$J$$$G$/$@$5$$(B ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=T1_Static - Win32 Debug MD !MESSAGE $B$3$l$OM-8z$J%a%$%/%U%!%$%k$G$O$"$j$^$;$s!#(B $B$3$N%W%m%8%'%/%H$r%S%k%I$9$k$?$a$K$O(B NMAKE $B$r;HMQ$7$F$/$@$5$$!#(B !MESSAGE [$B%a%$%/%U%!%$%k$N%(%/%9%]!<%H(B] $B%3%^%s%I$r;HMQ$7$Fe$G%^%/%m$N@_Dj$rDj5A$7$^$9!#Nc(B: !MESSAGE !MESSAGE NMAKE /f "T1_Static.mak" CFG="T1_Static - Win32 Debug MD" !MESSAGE !MESSAGE $BA*Br2DG=$J%S%k%I(B $B%b!<%I(B: !MESSAGE !MESSAGE "T1_Static - Win32 Release" ("Win32 (x86) Static Library" $BMQ(B) !MESSAGE "T1_Static - Win32 Debug" ("Win32 (x86) Static Library" $BMQ(B) !MESSAGE "T1_Static - Win32 Release MD" ("Win32 (x86) Static Library" $BMQ(B) !MESSAGE "T1_Static - Win32 Debug MD" ("Win32 (x86) Static Library" $BMQ(B) !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "T1_Static - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Lib" # PROP Intermediate_Dir "Static_Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c # ADD CPP /nologo /W3 /O2 /I "." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /Fd"Lib\T1_Static.pdb" /FD /c # ADD BASE RSC /l 0x411 /d "NDEBUG" # ADD RSC /l 0x411 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ELSEIF "$(CFG)" == "T1_Static - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Lib" # PROP Intermediate_Dir "Static_Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c # ADD CPP /nologo /W3 /Gm /Zi /Od /I "." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /Fd"Lib/T1_Staticd.pdb" /FD /GZ /c # ADD BASE RSC /l 0x411 /d "_DEBUG" # ADD RSC /l 0x411 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"Lib\T1_Staticd.lib" !ELSEIF "$(CFG)" == "T1_Static - Win32 Release MD" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "T1_Static___Win32_Release_MD" # PROP BASE Intermediate_Dir "T1_Static___Win32_Release_MD" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Lib" # PROP Intermediate_Dir "StaticMD_Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c # ADD CPP /nologo /MD /W3 /Zi /O2 /I "." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /Fd"Lib\T1_StaticMD.pdb" /FD /c # ADD BASE RSC /l 0x411 /d "NDEBUG" # ADD RSC /l 0x411 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"Lib\T1_StaticMD.lib" !ELSEIF "$(CFG)" == "T1_Static - Win32 Debug MD" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "T1_Static___Win32_Debug_MD" # PROP BASE Intermediate_Dir "T1_Static___Win32_Debug_MD" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Lib" # PROP Intermediate_Dir "StaticMD_Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /Zi /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /Fd"Lib/T1_Staticd.pdb" /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /Zi /Od /I "." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /Fd"Lib/T1_StaticMDd.pdb" /FD /GZ /c # ADD BASE RSC /l 0x411 /d "_DEBUG" # ADD RSC /l 0x411 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"Lib\T1_Staticd.lib" # ADD LIB32 /nologo /out:"Lib\T1_StaticMDd.lib" !ENDIF # Begin Target # Name "T1_Static - Win32 Release" # Name "T1_Static - Win32 Debug" # Name "T1_Static - Win32 Release MD" # Name "T1_Static - Win32 Debug MD" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\lib\type1\arith.c # End Source File # Begin Source File SOURCE=..\lib\type1\curves.c # End Source File # Begin Source File SOURCE=..\lib\type1\fontfcn.c # End Source File # Begin Source File SOURCE=..\lib\type1\hints.c # End Source File # Begin Source File SOURCE=..\lib\type1\lines.c # End Source File # Begin Source File SOURCE=..\lib\type1\objects.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\parseAFM.c # End Source File # Begin Source File SOURCE=..\lib\type1\paths.c # End Source File # Begin Source File SOURCE=..\lib\type1\regions.c # End Source File # Begin Source File SOURCE=..\lib\type1\scanfont.c # End Source File # Begin Source File SOURCE=..\lib\type1\spaces.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1aaset.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1afmtool.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1base.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1delete.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1enc.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1env.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1finfo.c # End Source File # Begin Source File SOURCE=..\lib\type1\t1io.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1load.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1outline.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1set.c # End Source File # Begin Source File SOURCE=..\lib\type1\t1snap.c # End Source File # Begin Source File SOURCE=..\lib\type1\t1stub.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1trans.c # End Source File # Begin Source File SOURCE=..\lib\type1\token.c # End Source File # Begin Source File SOURCE=..\lib\type1\type1.c # End Source File # Begin Source File SOURCE=..\lib\type1\util.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\lib\type1\arith.h # End Source File # Begin Source File SOURCE=..\lib\type1\blues.h # End Source File # Begin Source File SOURCE=..\lib\type1\cluts.h # End Source File # Begin Source File SOURCE=..\lib\type1\curves.h # End Source File # Begin Source File SOURCE=..\lib\type1\digit.h # End Source File # Begin Source File SOURCE=..\lib\type1\ffilest.h # End Source File # Begin Source File SOURCE=..\lib\type1\font.h # End Source File # Begin Source File SOURCE=..\lib\type1\fontfcn.h # End Source File # Begin Source File SOURCE=..\lib\type1\fontfile.h # End Source File # Begin Source File SOURCE=..\lib\type1\fontmisc.h # End Source File # Begin Source File SOURCE=..\lib\type1\fonts.h # End Source File # Begin Source File SOURCE=..\lib\type1\fontstruct.h # End Source File # Begin Source File SOURCE=..\lib\type1\fontxlfd.h # End Source File # Begin Source File SOURCE=..\lib\type1\fsmasks.h # End Source File # Begin Source File SOURCE=..\lib\type1\hdigit.h # End Source File # Begin Source File SOURCE=..\lib\type1\hints.h # End Source File # Begin Source File SOURCE=..\lib\type1\lines.h # End Source File # Begin Source File SOURCE=..\lib\type1\objects.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\parseAFM.h # End Source File # Begin Source File SOURCE=..\lib\type1\paths.h # End Source File # Begin Source File SOURCE=..\lib\type1\paths_rmz.h # End Source File # Begin Source File SOURCE=..\lib\type1\pictures.h # End Source File # Begin Source File SOURCE=..\lib\type1\regions.h # End Source File # Begin Source File SOURCE=..\lib\type1\spaces.h # End Source File # Begin Source File SOURCE=..\lib\type1\spaces_rmz.h # End Source File # Begin Source File SOURCE=..\lib\type1\strokes.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\sysconf.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1aaset.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1afmtool.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1base.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1delete.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1enc.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1env.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1extern.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1finfo.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1global.h # End Source File # Begin Source File SOURCE=..\lib\type1\t1hdigit.h # End Source File # Begin Source File SOURCE=..\lib\type1\t1imager.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1load.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1misc.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1outline.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1set.h # End Source File # Begin Source File SOURCE=..\lib\type1\t1stdio.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1trans.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1types.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1x11.h # End Source File # Begin Source File SOURCE=..\lib\type1\token.h # End Source File # Begin Source File SOURCE=..\lib\type1\tokst.h # End Source File # Begin Source File SOURCE=..\lib\type1\trig.h # End Source File # Begin Source File SOURCE=..\lib\type1\util.h # End Source File # Begin Source File SOURCE=..\lib\type1\Xstuff.h # End Source File # End Group # End Target # End Project xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/win32/sysconf.h0000664000175000017500000000401511742726711022312 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: sysconf.h.in ----- Author: Rainer Menzner (rmz@neuroinformatik.ruhr-uni-bochum.de) ----- Date: 02/24/1998 ----- Description: This file is part of the t1-library. Some system dependent definitions are stored here. sysconf.h is generated from this file automatically by the configure-script. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-1998. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #undef __CHAR_UNSIGNED__ #define SIZEOF_CHAR 1 #define SIZEOF_SHORT 2 #define SIZEOF_INT 4 #define SIZEOF_LONG 4 #define SIZEOF_LONG_LONG 8 #define SIZEOF_FLOAT 4 #define SIZEOF_DOUBLE 8 #define SIZEOF_LONG_DOUBLE 12 #define SIZEOF_VOID_P 4 #if defined(_MSC_VER) # define T1LIB_IDENT "1.0" # define GLOBAL_CONFIG_DIR "/usr/local/share/t1lib-1.0" # define T1_AA_TYPE16 short # define T1_AA_TYPE32 int #endif #if defined(_MSC_VER) && !defined(_WIN32) # define _WIN32 1 #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/win32/T1_DLL.dsw0000664000175000017500000000104211742726711022150 0ustar uwabamiuwabamiMicrosoft Developer Studio Workspace File, Format Version 6.00 # $B7Y9p(B: $B$3$N%o!<%/%9%Z!<%9(B $B%U%!%$%k(B $B$rJT=8$^$?$O:o=|$7$J$$$G$/$@$5$$(B! ############################################################################### Project: "T1_DLL"=.\T1_DLL.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/win32/T1_DLL.dsp0000664000175000017500000003052111742726711022145 0ustar uwabamiuwabami# Microsoft Developer Studio Project File - Name="T1_DLL" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** $BJT=8$7$J$$$G$/$@$5$$(B ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=T1_DLL - Win32 Debug MD !MESSAGE $B$3$l$OM-8z$J%a%$%/%U%!%$%k$G$O$"$j$^$;$s!#(B $B$3$N%W%m%8%'%/%H$r%S%k%I$9$k$?$a$K$O(B NMAKE $B$r;HMQ$7$F$/$@$5$$!#(B !MESSAGE [$B%a%$%/%U%!%$%k$N%(%/%9%]!<%H(B] $B%3%^%s%I$r;HMQ$7$Fe$G%^%/%m$N@_Dj$rDj5A$7$^$9!#Nc(B: !MESSAGE !MESSAGE NMAKE /f "T1_DLL.mak" CFG="T1_DLL - Win32 Debug MD" !MESSAGE !MESSAGE $BA*Br2DG=$J%S%k%I(B $B%b!<%I(B: !MESSAGE !MESSAGE "T1_DLL - Win32 Release" ("Win32 (x86) Dynamic-Link Library" $BMQ(B) !MESSAGE "T1_DLL - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" $BMQ(B) !MESSAGE "T1_DLL - Win32 Release MD" ("Win32 (x86) Dynamic-Link Library" $BMQ(B) !MESSAGE "T1_DLL - Win32 Debug MD" ("Win32 (x86) Dynamic-Link Library" $BMQ(B) !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "T1_DLL - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Lib" # PROP Intermediate_Dir "DLL_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "T1_DLL_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /O2 /I "." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "T1_DLL_EXPORTS" /YX /Fd"Lib/T1.pdb" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x411 /d "NDEBUG" # ADD RSC /l 0x411 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"Lib/T1.dll" !ELSEIF "$(CFG)" == "T1_DLL - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Lib" # PROP Intermediate_Dir "DLL_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "T1_DLL_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /Zi /Od /I "." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "T1_DLL_EXPORTS" /YX /Fd"Lib/T1d.pdb" /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x411 /d "_DEBUG" # ADD RSC /l 0x411 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"Lib/T1d.dll" /pdbtype:sept !ELSEIF "$(CFG)" == "T1_DLL - Win32 Release MD" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "T1_DLL___Win32_Release_MD" # PROP BASE Intermediate_Dir "T1_DLL___Win32_Release_MD" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Lib" # PROP Intermediate_Dir "DLLMD_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "T1_DLL_EXPORTS" /YX /Fd"Lib/T1.pdb" /FD /c # ADD CPP /nologo /MD /W3 /O2 /I "." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "T1_DLL_EXPORTS" /YX /Fd"Lib/T1MD.pdb" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x411 /d "NDEBUG" # ADD RSC /l 0x411 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"Lib/T1.dll" # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"Lib/T1MD.dll" !ELSEIF "$(CFG)" == "T1_DLL - Win32 Debug MD" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "T1_DLL___Win32_Debug_MD" # PROP BASE Intermediate_Dir "T1_DLL___Win32_Debug_MD" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Lib" # PROP Intermediate_Dir "DLLMD_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "T1_DLL_EXPORTS" /YX /Fd"Lib/T1d.pdb" /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /Zi /Od /I "." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "T1_DLL_EXPORTS" /YX /Fd"Lib/T1MDd.pdb" /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x411 /d "_DEBUG" # ADD RSC /l 0x411 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"Lib/T1d.dll" /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"Lib/T1MDd.dll" /pdbtype:sept !ENDIF # Begin Target # Name "T1_DLL - Win32 Release" # Name "T1_DLL - Win32 Debug" # Name "T1_DLL - Win32 Release MD" # Name "T1_DLL - Win32 Debug MD" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\lib\type1\arith.c # End Source File # Begin Source File SOURCE=..\lib\type1\curves.c # End Source File # Begin Source File SOURCE=..\lib\type1\fontfcn.c # End Source File # Begin Source File SOURCE=..\lib\type1\hints.c # End Source File # Begin Source File SOURCE=..\lib\type1\lines.c # End Source File # Begin Source File SOURCE=..\lib\type1\objects.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\parseAFM.c # End Source File # Begin Source File SOURCE=..\lib\type1\paths.c # End Source File # Begin Source File SOURCE=..\lib\type1\regions.c # End Source File # Begin Source File SOURCE=..\lib\type1\scanfont.c # End Source File # Begin Source File SOURCE=..\lib\type1\spaces.c # End Source File # Begin Source File SOURCE=.\t1.def # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1aaset.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1afmtool.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1base.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1delete.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1enc.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1env.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1finfo.c # End Source File # Begin Source File SOURCE=..\lib\type1\t1io.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1load.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1outline.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1set.c # End Source File # Begin Source File SOURCE=..\lib\type1\t1snap.c # End Source File # Begin Source File SOURCE=..\lib\type1\t1stub.c # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1trans.c # End Source File # Begin Source File SOURCE=..\lib\type1\token.c # End Source File # Begin Source File SOURCE=..\lib\type1\type1.c # End Source File # Begin Source File SOURCE=..\lib\type1\util.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\lib\type1\arith.h # End Source File # Begin Source File SOURCE=..\lib\type1\blues.h # End Source File # Begin Source File SOURCE=..\lib\type1\cluts.h # End Source File # Begin Source File SOURCE=..\lib\type1\curves.h # End Source File # Begin Source File SOURCE=..\lib\type1\digit.h # End Source File # Begin Source File SOURCE=..\lib\type1\ffilest.h # End Source File # Begin Source File SOURCE=..\lib\type1\font.h # End Source File # Begin Source File SOURCE=..\lib\type1\fontfcn.h # End Source File # Begin Source File SOURCE=..\lib\type1\fontfile.h # End Source File # Begin Source File SOURCE=..\lib\type1\fontmisc.h # End Source File # Begin Source File SOURCE=..\lib\type1\fonts.h # End Source File # Begin Source File SOURCE=..\lib\type1\fontstruct.h # End Source File # Begin Source File SOURCE=..\lib\type1\fontxlfd.h # End Source File # Begin Source File SOURCE=..\lib\type1\fsmasks.h # End Source File # Begin Source File SOURCE=..\lib\type1\hdigit.h # End Source File # Begin Source File SOURCE=..\lib\type1\hints.h # End Source File # Begin Source File SOURCE=..\lib\type1\lines.h # End Source File # Begin Source File SOURCE=..\lib\type1\objects.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\parseAFM.h # End Source File # Begin Source File SOURCE=..\lib\type1\paths.h # End Source File # Begin Source File SOURCE=..\lib\type1\paths_rmz.h # End Source File # Begin Source File SOURCE=..\lib\type1\pictures.h # End Source File # Begin Source File SOURCE=..\lib\type1\regions.h # End Source File # Begin Source File SOURCE=..\lib\type1\spaces.h # End Source File # Begin Source File SOURCE=..\lib\type1\spaces_rmz.h # End Source File # Begin Source File SOURCE=..\lib\type1\strokes.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\sysconf.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1aaset.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1afmtool.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1base.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1delete.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1enc.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1env.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1extern.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1finfo.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1global.h # End Source File # Begin Source File SOURCE=..\lib\type1\t1hdigit.h # End Source File # Begin Source File SOURCE=..\lib\type1\t1imager.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1load.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1misc.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1outline.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1set.h # End Source File # Begin Source File SOURCE=..\lib\type1\t1stdio.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1trans.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1types.h # End Source File # Begin Source File SOURCE=..\lib\t1lib\t1x11.h # End Source File # Begin Source File SOURCE=..\lib\type1\token.h # End Source File # Begin Source File SOURCE=..\lib\type1\tokst.h # End Source File # Begin Source File SOURCE=..\lib\type1\trig.h # End Source File # Begin Source File SOURCE=..\lib\type1\util.h # End Source File # Begin Source File SOURCE=..\lib\type1\Xstuff.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/win32/t1.def0000664000175000017500000000352311742726711021464 0ustar uwabamiuwabamiEXPORTS T1_AAFillOutline T1_AAGetLevel T1_AAHSetGrayValues T1_AANSetGrayValues T1_AASetBitsPerPixel T1_AASetChar T1_AASetGrayValues T1_AASetLevel T1_AASetSmartLimits T1_AASetSmartMode T1_AASetString T1_AbsolutePath T1_AddFont T1_AddToFileSearchPath T1_CheckEndian T1_CloseLib T1_ComputeLineParameters T1_ConcatGlyphs T1_ConcatOutlines T1_CopyFont T1_CopyGlyph T1_DeleteAllSizes T1_DeleteEncoding T1_DeleteFont T1_DeleteSize T1_DumpGlyph T1_DumpPath ;T1_DumpPixmap T1_ExtendFont T1_ExtendHMatrix T1_ExtendVMatrix T1_FillOutline T1_FreeGlyph T1_GenerateAFMFallbackInfo T1_Get_no_fonts T1_GetAfmFileName T1_GetAllCharNames T1_GetBitmapPad T1_GetCharBBox T1_GetCharName T1_GetCharOutline T1_GetCharWidth T1_GetEncodingIndex T1_GetEncodingScheme T1_GetFamilyName T1_GetFileSearchPath T1_GetFontBBox T1_GetFontFileName T1_GetFontName T1_GetFullName T1_GetIsFixedPitch T1_GetItalicAngle T1_GetKerning T1_GetLibIdent T1_GetLinePosition T1_GetLineThickness T1_GetMetricsInfo T1_GetMoveOutline T1_GetNotice T1_GetStringBBox T1_GetStringOutline T1_GetStringWidth T1_GetUnderlinePosition T1_GetUnderlineThickness T1_GetVersion T1_GetWeight T1_InitLib T1_LoadEncoding T1_LoadFont T1_ManipulatePath T1_MirrorHMatrix T1_MirrorVMatrix T1_PrintLog T1_QueryLigs T1_QueryX11Support T1_ReencodeFont T1_RelativePath T1_RotateMatrix T1_ScaleOutline T1_SetAfmFileName T1_SetBitmapPad T1_SetChar T1_SetDefaultEncoding T1_SetDeviceResolutions T1_SetFileSearchPath T1_SetFontDataBase T1_SetLinePosition T1_SetLineThickness T1_SetLogLevel T1_SetRasterFlags T1_SetString T1_ShearHMatrix T1_ShearVMatrix T1_SlantFont T1_TransformMatrix T1_WriteAFMFallbackFile ; T1_AADoLine ; T1_AAInit ; T1_DoLine ; T1Close ; T1Decrypt ; T1eexec ; T1Fill ; T1Getc ; T1io_reset ; T1lib_parseFile ; T1Open ; T1Read ; T1Ungetc xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/LGPL0000664000175000017500000006127311742726711020205 0ustar uwabamiuwabami GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/0000775000175000017500000000000011742726711020604 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/type1/0000775000175000017500000000000011742726711021646 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/type1/bchbi.pfb0000664000175000017500000010463511742726711023417 0ustar uwabamiuwabami€ê%!PS-AdobeFont-1.0 %%CreationDate: Sat Nov 3 22:38:14 1990 % Bitstream Type 1 Font Program % Copyright 1990 as an unpublished work by Bitstream Inc., Cambridge, MA. % All rights reserved. % Confidential and proprietary to Bitstream Inc. % U.S. GOVERNMENT RESTRICTED RIGHTS % This software typeface product is provided with RESTRICTED RIGHTS. Use, % duplication or disclosure by the Government is subject to restrictions % as set forth in the license agreement and in FAR 52.227-19 (c) (2) (May, 1987), % when applicable, or the applicable provisions of the DOD FAR supplement % 252.227-7013 subdivision (a) (15) (April, 1988) or subdivision (a) (17) % (April, 1988). Contractor/manufacturer is Bitstream Inc., % 215 First Street, Cambridge, MA 02142. % Bitstream is a registered trademark of Bitstream Inc. 11 dict begin /FontInfo 9 dict dup begin /version (2.0-1.0) readonly def /Notice (Copyright 1990 as an unpublished work by Bitstream Inc. All rights reserved. Confidential.) readonly def /FullName (Bitstream Charter Bold Italic) readonly def /FamilyName (Bitstream Charter) readonly def /Weight (Bold) readonly def /ItalicAngle 11.0000 def /isFixedPitch false def /UnderlinePosition -109 def /UnderlineThickness 90 def end readonly def /FontName /CharterBT-BoldItalic def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding StandardEncoding def /FontBBox {-190 -236 1243 971} readonly def /UniqueID 15530633 def currentdict end currentfile eexec €‹¢•@ƒŠA3ƒœ©Ò.+™ò¶v|Öu ¬ü²NÍ6s›¶I”Åg7 Lì’É”_ðt^÷ÿư©£¸Içé‡@ål Z÷‡UœÆ•j³3Ï…SÕ\ ŽõìkôbêÄ.s€Ê’®‚³Ö¼ò»]Vp”Ïâ}N¬–“èƒrÒX´~ 8vUŽ¿uz¼\Ýö+ÏÍ‚qòYƒ;¬yprìš0c¿s…à-ŒX¬ß³;Œ‡h²x±KÖš¤C#%Ý——ä½a¹ãÚÄBóI„MzN¯îý˜ éÅ&Íà“ÃÝåqh2ÔAþCb‹Q¬¤¨ð˜»û\ïȱúô”€RØí@C“ÿØ7Í4ûE†¿ÔúwÙXK¶­BpÃLDœ•Õ¬»MãyZ·€²<"faŠ1upÃJ;·ƒr•šý?cºjº*rô ûsÑdtwA–Åà&gøÃw’üä² :·ã+¹ê›­Ú^l4v{œnyèÙWâP†rÂ{JE±a1 ÎÎÇ6M°•>w@©•îtBñ•-׊¹Rºâœ8w—\ÚåøI­ÖxgHJÒØŸ{]ö7‰—ЬE¡R« ¶Õ ‡#Í"Ì%%”®À¶ÿ!<—êåäíC®Ž(k `Ÿe(ä×±Ýòô¬ÃQƒMÜ]›ƒžØ‚!¤s…/j…ñ0}@V3´à.[’(0½Ö¬Üv\-¹v®ŒFæ Ķ^ØÏ"Ó¯L5çOÀ]Ø¢ ­¦–⻇=4iaÄÖù7ú·ši^‰¶o³…¢""HùÅÁE¢ÑÖàYóàq¡âéID5Œ/¥T9E›Ø×íÓ_êzᎎ Ó4;5b—I¦‚yÌ¢O„L™¤O'cä#¸ÎЙC9Ç¢lsŽ×ù Pº¡ ŒÑÔKÙô»Z,ÜxD¯n óóÏŽ‘Öi HŒ¿¡)³šUˆß* ½þLÍ&ÓÇë¶òm'·/8&c(>ë^%WÏ¥à Ÿ>ß>ùZ1#c†+XEö¡\{ŽYÌ´[¨›O&Ǻ‚{œŒÃ*pYèßÙ2c.ÞL×E¢a› Ug›ÒQ ŠY§ÆH>Cß:b{|YLS" ê‚²ÃL ¢<Ãr0$â1ym¥Ïëž3—P—I‹»3 Uc)ï ±?­ûZ…+k€—t*d(KIºº"JðŠ%¶Ê²[àGÉ=aánsøýˆ@æFKŠHI¯© ÁÄSœ ÜRâ&‰¢Q2âˆfâÞ©Ä`—éì)/ê“òˆÝ[Ý.!X"8ý½mzËŠÙµ?hâçùÈ/å+&®·æ»rT²JÁ2Ìâ,Ò®h’æÃ¤— ­Û€¢%·Ä©Ô³m[ò˜ÁfozÞH3`%a•O‚IûQÏ@£! ¬à'KiâM¯Xçžà,#‚Ý´rƶ ozu7¸•ûÊÝ&GŸŽƒŽ<%Ë®ëy£S[`Ïx>å%Ø÷»DÃbþ€¿.T…¸‡¦sœÜ¼‹ê^vQrÕÈ7U1ÞÈ|Þ([¦Dïy­y2ȰNƒXàéz’œØgæ(#î«ß‹tmM΢c(RJŸ³¡ç5t>)_c‡þðÿ­qªCâ7ZrÉä!˜a;5×Î&OB}VÊ«™C »#\ ?¡ƒšÛO³Øät7Ì^Ñôÿ_-Ê›Á\9jÂÔð‘Ë ô#lAS8«»)¿ÖmH16­z²† Ýd‹‡ß%£>Á(þl·íöW®iŠøý>;BinÅàžR%;Ýçª"ÞÂkö¢—*9…S²ÔBŠ^‹nì!ëºV Ù+Â9!¾Ð~Ÿf4õÒ±„Ù&´w+=©xƒJ½5J|ãFÉÆíºz‡¥^À9·S°!rŒ¡âÓ f ØPHG‘";sä÷–§ÕÝ9‡®Äàä^ &£NÛd]4Ù´Š#¨9žéõwPÞMVj˜=IP”t‰OÁZÊ]ítIÿ™‰b]¹äBT‘zuãCÊÇÉ ùf0ËúÌå5*ï—à‰ìÈzxx}þú·hàÐnË Õ€ýWp°€Ö–I¦¯eBYVº —$¼pÓ§m` ?.ŸRûÍͱ¸J¾BÑ.Šº¦oÅž`ÊZM(Æ'09KøSIQC¶;Í8+¢)Y†Ü>p´ v»¹¥·ôŒKt1“Ö| =K‘*Ì®¬Àr˜1=üóÙsçωW¾+X«ÈJ7jòê×IòœÖ¦še¤ß;ÇÐÑ#{?Óž êTî¥.ÔLM뎔bRÿĘF¸«¹`÷b 3ZtNü®âÚ3ç™wV'­>P“…¬­ø«h5ßñ"õÍR9Š*YÆZÊZHÙ;€žàü'÷Ô,£a =#9ð7åR2¶tßÁ hP¯Ka®¢tOò¾¦åz¡èµ sƒqmÃ!Wû ¯/1Š bA¨1ÜŒìIŸ›ÏN÷Hå&êU®÷U'úp‹Š?Ëý‚=ÓÀOVnˆ€ÕÙ/ ¨âvµÿo Ž ÿ’\Br»h,P KÁ°ùÊÛÕoa"5>2€Æ_²¤Z?[Ùî—s€ðÆÃeè~L1vˆø£Xš—ƒk3Ï2Ð$iUpSöeÎJ÷÷#&¶Ô”/TS¢€ÜH!ð± l<×Ô“°’[æ²QÆBhÜxCzxLUá$cÄ63ŒÛÔàåL™Œü·Z AP×ä„~EÑä!”¤‘aÎ’Œàµû“Ó5©ø ø=‹lÅSxõލÕ$9AÙY4Iãb˜cx„¬©üºƒjsPQ@!í£+(€zߦ0)hÞíæü©J/>+€¸0çÖ÷æ,Ö´“‚à´Š".½µ–§JíÒGSµÅD÷ÇO¤¦íMÜüσ¹ ¤Õ! ´Ð0(×`v*Ñ*ˆÅ ;–×ZûÖd3Kð´Í†4ˆdÉoR–·å‰o²œêbY5F&‘¨} •™’«øæýßßSz¢£Óª6…ËT*¯*u¡œÿ½%ÌÆÆtøÃ?ì!;B[Ø*BÞgþâ•Qˆ_bÈÖŠÌ%¦ÿ|¦çj«¼‰Õ.aÕ½ò&¶0T±Pº7B2BËKÙÕTñèŒþŒxý®ö˃¼oxN½?½àÉV!Ϙa‡È# ¢˜Ú´áô $ù/· ® ’oÃk=(CG‡ÌÔƒÏhMVÕØ¬¢çÓJ}sî(|äÖ÷YÖ¢  °¤æ@Aq˜VB*Ébúýóy–`½ˆt!îȾË(²Ÿí's5iâø Ô³ÜÇŒ¥÷ñ©×R¦h óC……|vØì=òREÉ¥Gó{+G´éH“к ˆ¬‘ø­ 9H¤ßUílÖBÆÛÀO'©ú’BöËÄYxe®œŸ¦ZÈ ˆÎè= W¹$¢™Eýòª/G»µ»–Õbñçcaªœ‰•£vªä¤u;ÌwØHæÐ”øwÿÊ=Gý#Ê™éðN¸•L?Qw ÑHh)²#’ 1íuøþ06y¢!}}¤Ùt1`Bªš8bÇ7R)NÌÔ³ÂUÁ)¹nå^ew =¡³¦TÇÄ9a+è€&Äʬû'¸9z@êâÚ£kwߣ‘gàÎ@ùvR’lîw…xaô&¿rì𚩬/“ªJ$ ›+ ­îÌ`ÿèj·loùÒä lWkû•'³Á¡°^þKæUÖÝMü=sQ‹'‡3ÃzéáIZ }ŽåË‘zál·°^Ú¦9 =m>ø­ 3ô‰ð ÄúAÓ²$ùv#7n6H6¼û¶>í=yæXƒ2Ô¼,!Í?TÝA[ÞʾX~®Å¢‚sÕ¨$ªÉœzØdzÓ®ïÀ§ø!–:âco$ªÊ•΋ؔ}΄'ïÚj">‘ÁÄå ÇNC´ôp¬e´Ÿ¯þå_YÞi.üÑ™bÛ8µ.Î'ƒÔŸp$lMñ¤£€@ùÑ–ï‘Z‚ÂÄβÒïO§!ý¸U¹A“÷ä;ƒ£‹"Ú ׽Ƈµí×Qõ+èŸ}ÄK$‹#['È€ŒXz»^‹D8“ààEwe;TÊ'@þçXú6ÝLFÏ&¨Šï- ilt’ÆNÁ‹€·âže3ö»X]œsi l¯åõLW‚e,i¿sülRÑ8x{!Î;-Ð,‡Û›‘/ëâÈ$©Ø|e¾ªÒjÛ¥Âõi\ªLÆ'¿I"šõEi“ ^~wdíc¹3>oúg•’; Έ'˜ ë•±:{™wÕ]¸£Ò‚Y?šçb¨¹³™v »)»Ò¬4äu›L³oÚ’…¬‘€]Mج ®M)ìß”m]eÿuNØö‚»JüŠàØDìÃm[½/t1Ãa—:²ÝÂdàl¨$Hjï¬ÙyœŽÓ‹v;ÞV•Lbq‰ùMNÞí+C[÷¤YŠÆ7ºJÌ aWü€ÿ+¤ÈüìÇá¡o6öu9ß~pÈ;Ú½z«™J`üKŸ¸bؾq^ÎH2&1Dn6éh¤â–ÓGz[†¿àJÙ®ëòRñS©/çÙz¤ÛEKÉ á×ÚÕg‚£~ýä ™wÝJØËèýN )ˆ%ŒD× ¼ƒÌ=FŒAæ=hÎÉ2û pÜ¥àÁ)>€ºaŸñ*e’ç¬ÒDÜ«¾;„VNSiÛ³ŽBiÉ[r«>f™j¡ÒÄSÿ‘÷lö¨²Ï +ÒsÓSÔÎŽ5¹šÔnÁ®¤I%1å¾4ÐŠŠ¤eŸ/|í$âVw!àê\mdK¸èbÂ^¶‰-¨?TürÍûlQOðsìà¯39ðC°ü¶3ó þ-­Çf?ó{6÷ŸZ=MLÎl”–‹3w £JÍTbë%LÊ…ËûÂy[#¯V©µs{Ör0ìóž*¦“»…çC§ó–cKP½¹U¾ûmáâ¾,™šV_ªÞ&à7yh6(ÑÜíõrÊsø{ZnšS½yb›(nÁ,‚;Èp Bñ&ßM©è¢Ñ' T Òæ·¼s¼!@Z¨›‹O•lSÌÓr½Ž0ãë$Ž*víϘ»N˜Ÿ¡Ê‰zÅJ0ú•«=òxÄ!õSGØ¥¾cÇ/°í(l)ЄÛãïe(s•ž¾ãÉ©ƒ»¿Üj° x=Vä<¥ÅT…V¦nF¦Ÿn‘+èJä%Ei¡êŸ\V q;WÁ÷!¡ÝziU³°5YÎ…œË} Þ£!²ø[1Î \ì"g D¬‘%Ø’éhälÁåNlDffÓ?Äë£Ï.ðÒÕ§×ÉÆožn¤Ú®®Â¢Ù ÷;k¤ÍÖ¢¹èäEݽûÒ:§6V<¦"‚}Y …í¡­À¼N•îΛ& ®êµÀ0§ÒüñS÷RÞäšqÑŸRZ2€!!"ûë¸AO¬é šž"Å‚›õ MD¬™yë½LóŒ4P- ½Vbý$E úÔÙ·£ËÊëÖ¸Á]ÆøQ\ÙÜÀws²´ˆ€•ç-1óÍ•”4K¹ÜþMÃÖRtAïOÀÖš¯œ&°Ø&Lü¯ `©‚Òý{/HfPL(É‹f¨Ç«õ[‹ ÿßûßÞ¾:n‰ŽRáë®cÔ¤¬©w¸30n8.É*l[–N>ŸE€Û…\MþQAÙ¢)ÒuáY¤Åɉæ²É«˜[sÕêÚ‚e`ÏžÝUPaíùå@µ^ìykjŸ;d·G¢aëÜ8@Ÿž['ú8ØG)Ë,ŸyçIM±ã¼ŸX‘·aŽÀe +œó/,‘y«B±p­F’K}):{`­@¶€eñHY@ÊškXRÈ8‡Öìß)±h4RË>A£€ÔŒ .ºC hóÂóGâoG êXn'’LÔø`§´(´¨7¹ÿgO $§áiƒ¤êà#hZ,ÞÅ ¡ß΢‚ßb(r`àµf”Q%‹†ûa¼j¶rÑÌ…q7.ÁÔý8ÛzíÂ5b¥ADÃIêXtûœ #7ú:øQש'±Q¢¹Òôl/æ5Ǩ–¡',|—¸¢õr*U¡\‚˜YÜCJH°=vÍÞÈO2Ôab’¿ïñ ¢æDÍΨÔaÎÂ/>ì}4£w´ær=(Hº4†ÁmþŽDqÂÕn0g¨ ÄLTð|ý,•ÃësŒÅcÃwRÙ+ý¼0ȧC‡*cv‰S >:­—xš›_ÌÚJÐ`ô[µ©f ‘\É×¾"ö7ŽWe¥‰k”اGÙ+Á?³ì_TÕ¼U–BI =". ![ÙFIWC¦Ü/úÏÎ/ÿH/C¼ ‰½&Ó‹ÿ\¹”­ÀÔ̯*ù àãØš±sѤld̯{R6M6ò¯²î€C!&ëÐòSª‰+àAôòß1¤šŠü"{êd91î¸ùÚ‘LBþÊÿÙçÔg Çå"F]¼—T{9‡ƒ7Š8­™Ë@!ÆÀðý}ã=œ 6º(€ÀÅZã‡J¯·úýoèD §?3p±b#:†™¹Ýâ1—ê³ý*¡_[Õ 4Aš×ÔAe,îw^–0?=AR#&d±Êý…ÿu°¦Ò;‚Í.`7ªÎËŸ™ÍAîÜnm1qò£—‚©Ìj#óÊϹµBC¯ Z›å†68ù]Ç´¹f”ÁûÌ6Ë8ñD¶Œý°ØÏÛ‚~L½ª|ÃÈQ¥[S;™•ìðÆÁ/o@ýØ þUu4åxã呃GÉ¡s £•7[ŒªŸ>ñHâW"§¯‡ÔÐ˘ü 0_oQ(7¦&ü†P1¶}j…‹ÎmY¯äÂ4v]9#ƒ5*’Ö g”‡ÌƒÔrÊ·ÃZ¦¨ :5@„)å6Vë}‡WÞ/ìØŽè%ýçt¸¨x¢oƒJ–c‹bI¡%·qÝ« Oy MlÃçÍœ|uH25Ë{„Æùpªƒv ­¯³Ø[Ór ¯|+#aAÀ/Ñôñ³/²Ñ†fªðE,¼i)êQÓì}‡" .lï¤Ñ‰¯GCT1ÝÿÇvÝN*ÐÄ+R $VÕÓL9±kÇ#ý7°Ť$i€2Üw·ï Ìæ`ó°ÓÉy4Dh¶7<ƒ™L‡¿t]¡þ$ZÁÁaä+WMÖ˜î·g±]*ÿ fF~±Š‹êKT9l_žvT<$h4[ üZï=Ö‹ø [H+û³Á8Ù±gaAÞaù©uø¹Ñì@úG9ì¬Ömñ&ô*ß­à°óÅÙ·¬À¶ú6)3”BnT·á¬gÿÔÖž%rµÀaÅE(*“î,$NùÌê/˜ÝÒMgÞÈfψ„«Ð‰÷Ըϱw¾ð9óV|1±£˜†4_­ò)×crKÉ©üöÊHŽË^W´–Ó2_‡XÿŠÂ ‡ºç´Ï —+êÏÇîúësî ­O«MmØD™êl>øp â2¥êÀº*ìÅŠ¡ÁóI!U‚¯Ó¡2f‡ä¢õOÆìüè+¶-®;®Ÿè¶ay3ƒúãƒìeX£¥¥Çy-ŒIú ¬ .M¥+2ÜçpάrÖÆóá k*PeÃóþSUÒ½²§‘’ì Êè3­‡‚RªE¬© "foóx‘ ŸÒäÚâÆš&‚·öBQGé`¤„Hô„ÓH7, %0é¡'ÉÝXˆIctëFsW[ wÖ¹+ЕŒµÀUÜ¿Cqä+÷¤Øõò'T»ŸýÚ6J³à‡[g³Wñ%žóó—Ö"¢Ÿ~2ÌÜ™%¤R‰íR9úì—ç pâýJ1"ŒeSóŒFDÄáf“1eâ'S°–Íxü°Ãpd2ŠDñ«ë™è"¶‰«–b˜ap£T¡ñ¿ïóÚÌÙY7»„æñ³#Zêcx|Ì4AvgB£%Þ1–r:p3-¯–­–±Õñ1Q>º4ë!Ô1{µüÑrè& (}S‡Ìvý«Ü…%w¿oßCEêºëûÒð »C{6_Ë:†‹ŠÑCXr‰…béØÔ›P0×È¡pÞNÞg´jžæwoÓsàè5†TvzŠʩۤ6aLíâå`WØÁAkˆ÷~?¨5æHŒÙ ¢: örÉéÅ+Âæ•ÝpÒˆ@ÌÓ¾àÒÜ©0qá°ÄæüLûx²‰ÂúbĮȄ¸I»äOÊCÀÍ þ¾Ö85¤ñæïà¹ZmàåUí ´Ta‰0G XGéQ.õw¹Þ@µb¬óR·3õ‡S.=lîó:Ó ü~#Rªc†ˆ´ž§zÿд>ïpe´= ‘^µìðM‘ݨŒ›CµÙ:ÿùÛ¨ÖЦɕNŒ¯Å+ºœPŠWþDXH;È( ¹eñŽ~þC—ê3ÙnØš[:S:e1¢—±úùaóæ >Hp‘Üéy’vYoéO¸»³·Tlº(ã$N÷2T”c÷…JL g3Sôb Ìg“©0(ÐÜa?7ŠQ±N«Ÿ¦?›`˜Ôáñ{FÏÍ£{¡-=E ´±æíã¼Âèé:?u_Ûà§MiÑúÇx¬šˆ)FŒ^U·eáé{ý“E5åQÎÞ ÀµÒª.nccÜï¿ñˆµ|ƒD¤³4Ìà ¤å±Xç™Ä(Ì Æy—¯“ký?¯ÔLÔõÇä/ȦBʹ¶"u â&Es ë‡gxÝÖ–oÆ7¬`å3Ì,øƒ ”ì•&Ê€ˆ_fe˜B§âЗáSGæºEx9VæïóN„&>o¿Jêžœ%`0y É-(†5ÕP ‹X“?˜ñj€g°õ5óÈD‹£ ˆ×-? üZ—Ä—z«¼GrŒ³'¤'¹¸á-%킆´¯®§d¿Ž$ÜLIÛºRn7·è*ø¼êc%(ilŒûÑÐW4óy¯ÖîÎOã+âWæü‹‘Û$ÂflÜl ’çT`y^oæMi/ìöa¹òys<1Nkqf²tš¼ð¢7°FÕ´‘©•ß[s2EþÏžôˆŸjý¢õ†£´.%²ŠÙuýÐâƒáê:MÝb…Kµ ܇OUnÐC¼fÖ3¬ÌõQ‡ÀpXºÏ¼îBíÚ~3ѳ½\2œ5#–JDÿ3¢%|cõª7IEµHwÝr¬¹ ” OzË2ÊnOJÛ h.Ú•çL»g P¶>óÝ0sôD»w¿U}~>;îA抱ÅðÐÇ#„þÂÏ~ͺï[ƒ p€Í†ÞF¯JÒñ`íŒs Î>BÃ,é¹Îfuö¯_áéâxøCfß !˾7`˜R›æž•Â÷pQÛ¯77 õuÓöÜ>æXJýP§®Ý€Y¡“G *Ú'Ÿ`5z@ᓚ&n\ƒ ç‰…[è'™øË‹3ØÖ_ÓĨí0,I…U{:Çi¸{GO#­¸ÓlÛQ&/* NÑ ;ФñŠn喝ÎãšÃŽm¦ðb41Õ‘Áø‚”ûÅŒšQÒzÌêɴȵIz’)å2Sd:cG\(ÏÌø‹–2 ¼ÁX 7ÜZ–4š¥ú©ið/unG†šdæ:açvRäaÑ[¹zjî%膎Û4m²1þm²·¼—ðrp(;ˆË$Öu¢³@õ»kýçà`Í'Ÿ¯‡ÿG¥ÃÚ•£ç ]žœNÝ~fb†^ ¥–ŠàbÙ¬Ð;CÔT$;-*>ÙìA®{ukÍj¢3ÿ¢sòfØìÉãÝôžßÓŸ~æ·l‚µÿ¢v”¯!¯Xç5µî¸Q˜ {õU‰iý, †ÏøP’UyYÍ=Œày‹Ã\Z/M}c«»’njzò¿ªÚî Rˈª KÓ¤ð·ÑGÕþ[Ìé Oßâä!ÌÌ‚iÊy:QÌ">ý\˜|)¶6ÂÝkV¹OIá^ *Ÿ.-;‘p„“,™J›1½ëÿ¥›,Ýw‹DEmc@rÓMAÐ DîyUr¨‰ª>F^èl){ÙD5'éhè–?MÑÊÆu®~êy)k¿šnÚñ¬ng™^m[!Ÿ‡ž…+®Vnòi“P„užÛÍ"uÍ+ê&îŽÁÒÚÌ”ù! °b<•É]9 ΀üœOfô°Uù‡ïÊ©u—vgx´(Ø7ë1 Áx@ë×pm5„ˆ‘ä3½¬ùk¼’߯„{ip‚R–41tZòáFñN¼_ž—Å™y*Öié)jÕF^¨3L—OÃ|·hÔ}@èÂ:ü€ÃðØÿ2îi‡GO{¯©&áfªÕßî³ZÐUù_-¼H/Zš8¡Äu°#yrbŽ5*ùY «‚†(¥BÉ&&_™–Ê™Ý?‰r©a¨ïJþ ½M«©¼Þij{°{\ ‰nO™Þ`இ“ ¦BN8´G¹)œZ¿H^—;®ƒ›açÂ4’w[r ¤^ÍÃã\!ÅžšÕ ;Å®RóR¶Õ\ç2f¿¼êgY¡@¡ÒeªvF¾|•4 noF»å醋ò¡•EÇäSÁdóûJÖñƹ\Ï_Ì*²I·¸‹ŸÚš‹ÅHV1¬-^­œð•ÒÔ‚Ìÿû_ÊOñK¿·ûiS!8+t9w6Gv‹{˜ÿ°Ã˜+C¿¢ZÖ\^2ÿ†§#f1¥SÚ2Å(ö‹Ö@;ú£ó˜ÆUln‘gå{¹âö´]ÒWðQ<ý¿ „¥÷á-û=ùqÝ­ÁS rf8 –>äŸÙ›úïÝáÝ®arž&¥‰#¸’b"6~x¹¦ñ‘ źqw~:ÿŠ·VO.¦ÝÅ•ïìuä­¶Úx¬l=ïþ€,Õ È¾Š¹ ÓîâƒTÛþ91§^Z>:®æ; ` láÐðpw¨Æâ*«Â#ç¸`݇D̯J]úØžæ43~vIaœP‚÷ÌÎã)è4ÍÞöÈQ¶G áX@v³‚ÞR׬üjôÏ—ã‘^uá™àؘ®8Î_ ¬Îc6Ñ&7{6{"bTùô!Ðâ8Þ´¬ö›v‚-n‚R0T„ú½ýŽ-¡ÙåÝSšV† ¡9YÛVëÔ˜]á<ëja:ÞùÿÂ'MÑV‰˜S-p ‚–$8S0-µ€Ü$#¦äGåêå`­˜9Áþe‡dy¿¡C’i”©²ê-[¯0ã· 2eá‡C@{ƒQHÜ€Ãûƒï–c©9íqqóâˆþ‹6´Eû¸» £¿[*Öf‘.Zpk‰·ÛdéÂZß5ì\?³Úv/Ô^|)âs ùs…ƒF‹3Ó·RŽf„…½Óg?yÌœëŽQ2TŽP3­çœ×¬µ~®lbbôAæñ»³Ú#2Žbâ5=)ª œÉ<¿HÒ&¿(zD–r~¬Ü …òXƒÕq!¦ƒ¥äëLt^àˆ…ú³¶Cèoˆæ1uì$sÚà¼hXW–Á[×nUg#ÁÙQ–ü–”J߈ú—)«ÅÝ þG–`ÕOþz\êµ­ ßÎh@’ó}O•¹\ž]'¦Usä¢Äš„Ý\rôŸQ,çó'Rä”}™™æëò¥$×OÂ}Œj‡&w.®åæÅt5RDtÁ‹2+Ëÿî'¼šY‘“‚…4P-y÷®»ŒÒ)¯ç!t™™¦´íoÄÙ`ïz‡õ­= ;Ii¨x,lÊ*R÷ Uyþw¨ åc3ûæ§>þ4åb)å¢>ª³AÎ:®P™ áI?²XnpgAÔ|ëC™¬Ø¼-,U}‘TÔ‹ñfKèø“#Óµ ©TZÏ.ç)¢¶ŽJjE5vr\º¡Í3ÉcŽŠ©½ÎxqÚõF6,דšÌ0„ûÕ|ÕžkÔ4Žl‹%y׬”,1Í.ÉÁö4›)¬JÚÐ1@ÿà$RáÕ—£Pç–”‡°€XzÚè#~G¿L0ֱǀ4?}Õ¬” ˜¼ï£ >”®»ù7ù“¾uÿ£šŸœ$á#Óu$슶gRÎZGrÜŒ7O!p}údö'Pƺô–»ÇÚ_Z EE‡ð)Ø¥)"+² (cµÿÙ$o¥»‚Õ¤W á,+1—sðopJ¨¾5ÿ[lHÿN+¬òåÞËÆ:ý“F¨Fl¥"™£.ÙˆpJ?î `¿>™qôJ*™¥iºÂ•ƒ/—&áHËJ¬c, àÉø—¸›Ð¯<0D@ºuø8WùX@ÿøbrwü¨‚ký,†c87E?íž) ,Õb ¿xßTöàCà3òM·%í8j•çh™UÓa<§4ŠQN\ˆˆ=O¯Sr%DÏÄðFHèH­ôÀ„ôÇ´"9©Ì²·!Cû_dGbŒ np¿Z6™m¨Þ”YdÐp—Ѩd7}nÃo[p°~Ìa®sÒÄrï¬õ“6{¦ÂT$ël^ÖyMXËi'9¾ƒµ)„Þ¹c?QêÔ RÎÌ×<Ç(Ö¦+”•Š*Å®]4ýêÔ?Lß¾S¹1žÃÔ,Ø ‘“6NúTEÉ ^¤>(ÆoX{ñ€"÷ð5Š zX§Sú¦A™op"ìÒMíŠÃ ~6àñ‰Ïy—–gÕ3ü60PùŽÉ烵‰>+·WãÆÏ__úK[ÀE¡½Êòi™‹‹Tºu0î|rOWÚ®4›bî,ªÄTÙ `dÃLëY)öSÊMèà¤xý¡ZáG¨½É—ŒY¹ÎyÓ¬€£¬´‡„­î1bšÄÓb„TO8¿ÔCd®ÜÐϤ¯Ækf7’qfû#DÖÔâ+没ÿУ0æÀ ½ÊâVizg ç…Éég·úESVô!¶ÎS€l˜b”!•+uujŠ&Zeoö«C®PxZc“‘$vOjéG•Âäܨ™Ó/ñ×A‡y™;ŸÖtÝŽ´«OØ0Ôkß ýîÖQ£ÆÊæåõ×<1ÓhsÕÎ âÚ„¼Ú€²¾&`{ 5»y{jº¿ —!Ëjg%)ääëÞè|4å}ùDœæÖ¡pZv«l©ƒ©VæôÓ¿eÞºÆÂ–e·¯ò<Úâ8!ù²(å}µ˜IVômÿuqüÏT¥µšb«'täÇù˜¿äwüW°KD£// Hi!qÕ#žÚ6)¹«Z[p¹kTpû™ÁË%ßð‹¤é$„Äñã<ö Šüf8/+$’9ü§‘ŠìeœR»K“U\‹&þøLËwg­ß1 PiÙL—7V/’—pÞïØÿ6BTF$°²Í›)gd@ëüí,‹íxh¤w Ȩ‡£)Q çÜAnÙÊ`ûHÊ_ @8ĬšX†…¯"cß”, åâ•?YÕ) Ûì9ù9XÔÞŸîiØÚw‘8Šï|?†I„à°XÃŽF' =+æh¯¬¢¬¨Gvš;ôŽq=Üeä åˆGñ›³µœ÷•lÛûÒ6ã¡Åºê—ÃÛðú'¹ÞqÊctM‚*ËZyI¸Áf* OÛ(ÿÂ.oºî¥¯-×à'‚_O†×ƒý\l‚ <:bÑÒ”ZeòÌ™À†R0áAAÌnG¦+¬øj+P”ô)‰–h+Ãyê3¡À°qÉ€wˆm÷ÖíìkÎzé„X’Ð#ïK`›DÌ@ýMñÜõ{“nš2!ÚŠ]\ÝÐÔ0ÕšÈ˶\¼¶Íê×hÀÔ•£Ûä@w1¨®e.Šñº.÷(([b<Š/ÒŽ\väíÄ9ä! ÞÃ|SÀÄžé,M(¥gäñêùVÒbÍн×â¬5Å;søQ‡Ž­žlû€ÐpÎAŠÛ©ù7DN‘S j´^¦õ=æå*LJ‡ìgjN[JÃûo¹µ”G·Lyƒ°nuKùqÄÍÍi A4&zîCªxË “žÒ´“åŠ41Hö¦/étl‰ÔWŒW%µg›yM°éð$U‹©@£þ?·ôIS…,z SI8¢ù\3?L<ܾ¥"å7ލåRm¤L ¯tønU)Kç3Ÿv ‹Ø ƒéf—#ïšU_êØbh^wžšJ+? Å¿Z{¸bÄP†$ BAÔúŸ‘˜Ùnò²úOb¿—*j¾s/—üħÅÕƒ,úŸð±èø];êxk(s;9xLä/sŒ5&<@õAày³T²¯&¢Œ-!žË­æ7aékÀn¬C¦-çþÌ 4ƒGkÿµ¾Øc¼ÅO–:þCJlî¾*áâÚ …º!-›ÌKTÙB=ßí’Åd{•×wA©*æÞËnX’ú+K4dYºôŒq»–À‘!$â“ô)œü‡Vw|¾éƒ%bkO‰N€×V€¯W@Æ<1;ZÆ@æÓàôÚn䞎ù‹'×0Y5g;ÞÉÂ?Vƒ^‚ð·Ï®J1ú¡|"Þ®ššsTÿýÜÿ§ý ¿BÁe³únÿô[÷ bƒªlûÏšÿØÇ½E·äôDsÕ7ÀßêkyzçÈ?Pq˜| Ñ3šýÓà¥ÌןäwöK98Þ‰í²«åöuóå>4‚ä6°¼gäÙ‚ ê³znc®T¡…øæJnL tîI[Áš·X{/”WR`vƆèòæq(ßïò–/µ–;hcüD8Lü3ÇmÔ…˜Þ(pɘLþÈ(e)u —Nd-9L3ÜÞƒhXóbuÿ§_‰A=¯Ûü'²€ç»°ï-žä윬…ÎÏÖµNʾøiÔ.¿ í<øTª¾3kÍ=ÞI³¥PΟñúæ$1xR«Ð°FAïÔ…œnÁírE¼õE`íòÆ(S[à~ Ä@5R¾¬jXX¹Ø[¸ý óz(b&<0?8¨¹²(¶Ÿ¢mk§U*äè°OáôFãF`ýY´èþeªË–…‰GCáÉÔcß/9ý­üî›Å\[hc1©{.F4ŸðFÚŽ=xb±R|«¢|iz»í1„³Óì-NιÏSüµ“ R H«ú쮸n9dP^ÒJÀ·ûwÌ_õ3½1Å86Œ\\+|?"·¯¶øm7q¢§Á-±”‚LÖ/L×1lǶ•>ÐbŒM¦ý»~)/K:~zøšª¨±¸ÂèÂ[÷ÂM]?Ïó`ìk£jVz…qÚvöä>’'núNH•¹óÔ ÝŠ;C½ß8)Ή-4]Ñûä„´Ëkëðà–Ðææžp çIR”6P!4£±´z” ¤Ñí:F"zòóó+Òþ­÷g‰ˆvJ2DÝU×[C†LWWã¸D_¦?õawΧ´KÇl¤žõ9¿öˆY(“µíš[çS‚…Åaã…sݰPBŽóæ;>]>›±­)åñüYi2K¨„Ê öâ´ˆË3FåSð£}}>Ò8TŒŠ!q"Úy msùCin0:ppDÞ €¸Ùz0•›¥-:@sÈåÁ¡¹¤bHŠÂapB?0mïmI|»Êjr2gÃ3ŒFȆa1`‡ƒÉ6yh 7oæ­šþ8z¤ê¦;šJý—<[KÜ›^£Åéq3.¿ABÂß}°ÊÆ`ýí˜ÁÕ蹕ÚÊrüØÚ•’D‡¶I@✓ü·€ßhJ¼*ÒRQmôŸ$Wxz1¿ìùïEY¨»òaËñµðŸ'_ß”kÒ ø€Ë­î¬L¿e´šûù°iqn±Ý{Ѐýg÷×FÉÁmsgÞ¦¸ðA”¼ùEOû]› ßZQîͱK?pô…¬{mL\³­ds„F‘•ô/Ý^“Àç3Â4{SŽàhòôb‘S6Ù-‹ú‚?ñØu½F ·©6ml}Þ"!|dßù†Ö‹…ö)øË&23ÒÚÖÑ{"·¨w¬G,õ¿#r%`ÜŠ… ”€fNEœ!ƒ>3½‹ùꓺt OÇ"9j—7fF¦ÛæìÂ2 Z­'s ­R ƒÌ#U"üÎ%g¬~7>Ñ"ÖPž=á®è ç¬ËáN+á”ûcÐŒ¡ß 6nNç¯ÏŸŒ~`EÖ@+/~ànŸMIñ„„’¬!ýâšiƒ†qÄ k·Aì÷Þ½¬±Œ¼µ”þ>ÁœYÂñ¡CA8x=†£äæšG¥=:¡=­ü–•%¯ ˜ä}Ÿ–é‹5 €;¿#b4žÉ« ÷´ôæctÎ–Ë ]Ø5ÑCƒ(ÍKyžh}Á˜ôôÌNõ|rPÄáÄ›êe—¤xŒ>üòþoYãëŒmªØD BS<|Ç[4“–ˆÏƒÄ2bE×ÿ‹H˜(…¡œ5šäÙ©uJ`<‚N ë&ÃÕ%m[¥/èÇLy{å)Õ½€7Àí³÷ô-­â¡«ZÕ‰ƒ1¢ÐòÊ[N|ghÿž½ we«¾éºÅ#IZª÷£iP4#¹1øœi•œ¬S£4„¹â7é¨ „ÿ™-½p\eêÿôãžZ©Üáß8ÙîÛR±¯â4å«l®O=è±5iKÛ8,±HÔ»Idá÷£ ’S™€W/ó°ëC,Ã\Eö˜~÷³'âòº4ñ5dq†FyhûJá†ïz+{Žt—‹—¦Ž{èßöOÉ@Á©¼ÿ­©šq#K3¯Å}Õ)⎷úωîUt0!Y7ƒü®ùÃŒþ eç1sn ”¼CŸ¤#]ªIï?}X',†èØÀ¢Ô'^ iêôµñÐI#;xÐÚÀùÕ#c'±âEɶW¬Ë”ª.œoOÛ‹$›u\¡¾q/ ãf°:N3lE£¿±Œü½Ü@§ªÜmÙFŒ^]«RžÐ|…0lJ¡~ŒùÉW}‚È‚.å¤Z‘ óäÝžn\ž¨¦p¬]lõ¬ïºR±ð3ß,o9úwøJ“ŠRâ^ñµ ƒ/OËdZŸ1Vk÷H_‚[´Ä_™È¾ÌÒ£<ùE•š²1¥qÛçÖª¢FB.xÅÁ×#;=¥ƒIz1Ç#+‘sÅÿå«íÂÈÏ£OÁõ¾äRðaùÞeºYd$YšË¯C¤°pz|ŒbA¹4´ªòk-›É¶ÛR7Þâ•:Å;¹ªÇÚšHߥ¹gHRëÒV.ñ`nÁøàœ|}á¹ØÆD0‚E àgòžz×·’."Ry¨–a’®ØÐð Ù8Kv~.ÙMÄú™è2w¥Ì'ô¡”H'fvoù¿-Þ›c—4ë9‰yzUŸ@ã"R‡æBYhCZqB [™‰ H‘);^- H…q> ¶0 ãQð{a˜5ìGޤ¾JÝØ\ÃÉÊÝ2=êîÁì@”p[ä$N\È’ÔÂ÷áhqõL¡g{°Té»ï}žöàÁŠm >!ò+z"‚•³;Ú85¯Òú-NXJÜž¸ð¢YÄ?ß15üêÝO‡—ƒßXEeÓ€9~›ÔÝo65¤æ/­éÊàÅx5î1á¯#Pà9Ó Í]lšîˆ—žT0º /%¢£?T¼q¤åÔÌêÇ‚7œWS²ÝvJç¢13]ìqlo7%Õ %MìE÷+ƦŒ¾võYwþØE“‡ML T꜈R32n‡>ÿ˜ä müZTš¬ýŸ/1„´W ‹unÐ:T·& ç!=š"ë«;Hjáñ$“tXM²¹2`¥¼mì…qãðcg{ð>Pë!o˜¾=²Nì ˆ’¹"Ú’wéDí¦Ó÷4F)íC©E#¢=ÀNM8¶4³„>Õ?™‰Š·‹}’h·¦6VA(¯¼ IñºœmÆ/íCë_.´FélU44œºà/úTxì­ûøÑï.uÏLSüP´Åä õÏF ãÖzf¿­ø$Üâ+t:lÜD}³0q>›‡‘êbDdðITé¸×¹ìu˜Š4í¥7yØdô9Y0ïÄ8yï[T7§ŸÛg†]‡UiÖng¾8‹ ¸ ´N†3O”½»)JëÅZ;¦c÷œTN ÒF‰é¼–:ÎvÃû<¨§ƒÞ\Õ~…»‰1]aýýÜbÐ9Bv5¬;« `¼Œž\ÚÕ×EãØ/{½<½+ªÜ¼s‘’¸phš;_ýãÔ»ÍÛ%’Í; ÁtÛÑMØñ^¦'ÙÉç}µ³ïg•z¸þjï¨æ¹¸ìÀ•x‚qœ¤Ö©⇦¸»j)ÍaÀ¡Õ>å»Ç½2úÁ¢­ͺê¤Ó«HwR<@š›;¥mKÕ3#P(SÅV|WáÚÞ{´¼%;=©^b–zpX‰äñz.sô[A€u‘n@ößušh„t[ý®_Äu Ýë£P«v$8ÓÂÀè‡(i)‡§£Óæ*”)бðºVÄ„¯‰mŸ°ÔuÎÚ˯ÏÓÆÕŸ¶î^7}ÚN˜ÚƒoßIPi›¥ W% . Hù '{„k^™86‰/;Ð( Ü€…ŽÁÈx½ <‹áºNÆ?f‹SÑ|Ìí¼7Îyã/‡JY`‹ND±?›y”^nçúoÞ³åEË-Ú©p…‘ëÖ7³’‚ÌQ*bp¯À²H˜sº`ËËS”"<Â\"L‘èæz1pð\Ûè\ÔÒ4´‹E8n¦j.Ö©˜<¹íÌ ®Ú­I;_™–i_° ª7³Žmýf\_Á°®à©=þ2\ÊXŠW¹¤[¤FíÅâPÞ­•9lÝ¥c}K¸ÅÉåµä¯…yäß×k«6:Øùµk*‘‘¥{^æjÛfÅYïAèo Ž*²,hè§0d©šÛ¿,ÒÈ /.ˆwlÄÜótA•,¤ÌéV‘ò…ÎQ—x$žBGÏÒXœ_g¶îÖ— „Ý볇‰¦]6w¸.‚7ò%»™«•$Ôˆ´@ΪVÙÏÄŒ™…lJgLµä¯€¼†ùCö]™8B20 ÆX{™M‡FFOž2Ó)²•O‡Â+¥<9œ2 Þd ’ÃÄJ©uû”ªÉÏ…’" 6õŒ_cšsºã µ ©z*"ƒj1ó£.e#-ÖcÏhm"< —±ˆôK(Éáóz]oÍ: DE'yÖ¨9xú·8TæÊ£î^i‚·w¼“ŠÆiGF®JCÚIÿ‰ýC:äSï ±¶öÃR'8¸ó>NG^œ#4FKq<¾]úíÝÂJL*Y‘0Ò‹9yæDkãùExZÚÿiê •“‰1ˆ:—|¥N ë"( "5·Ú:Ÿ$îÆ™°ÓÎlî=&Ùc$,TÊβ·þ²6Øe×¶Ò=¡ Ô¨…ÙèÔÓ:èÍjëO{ùÔš³ÊëÌoPV ýØà+ £–ñ+ñvTÂÀfATŠ7A}ýè·û²ì¹`Hör¥:¸0”穼ˆ9ÁüË­[Ž oÆŸÒs:[ÔAš)ñŒ³ë„î51K²þú[j¦„wÐóX™ç“"ByÑxA©†Qæs ’n¾ë»Éf`Cc'­挰kT_¬Iêèw7zܵð÷¾çûqœ¦RàâÚuè…v€ØæåRÙp7€À¯™Û½Fz@TfÜdrQœ°ÔÖPWïäуçFÖƒç͸.Ûm¶:Æ0Úµô ¦@BÏ¢Ž <‰Ñ5&}¡y‚±˜ÑŸ‡øàÖ©§ÐLyî$³+_KbKý[ÙþÔ9ƒšT _ns`ðX¥\­ÍÕyf3Kjª|þM;5Sö0í÷<ìê×Sm’;è‡û‘ÄPÔÙôŸÖ>)`èÐ*¾³o•5L ðT”v³4tˆrCË%À®dÔj߆fJ`Ÿ^Þ%ÑDø¶^/%O%W·ž@¡Ÿà¡ŸwOœt‰Â }Óä6=0ÇOÌ]kC•%M*¹m²)× ´†LÆ×ôih!¯®Ü-JGæ”Àït›â”ÆbèúÃ*¥¿ l!gVÆæ _éÅ!A+ø‡ÌÃá¿Qgû}Ë[ (à?Œ¹`Sà ÐoÚuºÈ°þç¿%¤¬†Úá)”ƒŒScg.¥ÅM.bBu&˜=Þ?G¯áÁŸ1ï5Æ™+Ë•ú(ò±ÛcèRÝafo×wäJ+ó Rïg½åà¨Ë‹:Ùø‡flȈƒã*u@¶xýU%> ô‰QGÍd ².Ê„’rË"îîêlAvÁ9qûŽ:ÝÜ ˆSS¿I"¹#Ànk%ãÎJþá/È£#ezñ²IÜ— Tó¬˜Ù¥BîP}ð×Cv‹õõŽ¡Ùª7*ÎB|Iœÿâ;’³ƒ,ùG´F¾+ÈÚ‚LK@‰4#(hQׯBLõ>XšÀ‰½ßA3û/wÕsa„¦¨õï@šöªgf&ª”O1-yzQxÄ •=Q&zyÎF?#fí-=ƒÍ'`Òfä9õ—š#a¤Ž?µ&€ÍöI™Tb?} 3_‚ ²Ëåï;ä‚p.hæ²z{þ- ¯ªHðhæÂ µa–ÕQv@î²Âð½=SŸ±ºWmZË*ýN^—ËvÝœTs¼§›îÛ2‹’~é€Lk27+ [ºC¾eo*Ó=U¯LަêüøyJêdçïolMÓAy¬À`•çiRÜÃ÷ÐÚ_(-y^'éÀ¾ÅÑóŠcæ2äÄÝm…Ô´LÓf¿å¨Œƒ€ÛÒÒ«\µlt¡¹47ËWðkÛõyÎò½3&hÓ»,í8 j€ÜB€sÉ%Va°Cå\ ÙþaÇÃ;è™z­vè²»R•ëÞÈÚ ¬Lå«`ÅÏ)Я’¤?»:>)îmC—JC¤˜ÿ ÌDê·Æöî"Ùë­|'eXRÿÎÓ³ˆ|d6ˆæÏç_°$Wh‹Õ×8µÎ,Áùž»\4·4èé´ ­.(UÑÍ;VõÝå÷,FßeZd‡øü¨ 2óÏHQg ÉTùHϾ8dùæn°’mí&jx¾cÕÛ4 1ƒ-HŒ{ú ¢S–ÔAY¼0^N(¿9¡øÆpçš“”Ãi-'ºà诶ɂ"½†}@#yÔé´±wäüíjã5ï”´b‡wÿVs_س䥼Ӥ˜ÑùEuo¦D÷Û§ÝÆ.ö¹î8k¢¨[ê4TLz\Ž4¬{ï8~nƒƒgœŠ‹LeÂcèKœ˜:‘÷àcýrJ½Ÿ/D>¬[ET ÝsP·Ç¨C´í°UŽògè3ôY)Ê—›â—Îþq°F>K¥oîÏÛ‹ £L™úÛ²ñƒì¬©ÈƸ¬îv¦þÖ‡cÀJÄŠ4ÄÒ@æ‘@³L4¤ü¡#ZÑwQ>…C%J·GÝì6š¨òî ]Y†DU;Y@ Úm‚™6{£ÒB›b…ºìo?¥‚yY½“ßÕý˜Mª É!³Zäšê;?mûAŸje%½ÈÑ2 Äò@v@i.€Å õìã›øtlx%-[dB®ÀR¤ìø_ŽÎP‚ <º§Ú ›;ÏásÑ6¸dJuå#Ê^°p¤Êl—Œo®*ßx[)&°ŒÙï6\²$çÊfbÞß{Î:µ7½‹œ©Zy;Î| é2à(š¼µ{HQòšì;IHW8ÒÖY´ïg3§Z¤Ti\²VË ³.n†‰’„ÎpÄõ³„ã!$Fçc§5æ!(³¸ÉAT{û e*Îmvœ§Áp i÷V¸&ÄÖ8žÞ]g­HT|ºÏs×ÞŠ#‡¾…ò¾Ãø Æÿ|…:Èò´ö÷_€·@éOž(ˆö–ÅSZÖ^2‹òÉù€+å Š… Pµ¼èe«g`ôJuR›6QQcÔÝÑÅ .«žFÀ¬*[}E•R Uȃ¨ø™BÿÄó73ÍÔókc`z“S…†ëö]û•sÙϤ -Ú<.LYEE¨ròH#³HiNÂÑB«ü¶µG.[Cf)ûˆê즎T²¯º×ïð¿¶Ÿ]bO‡©K ÄÊ4édŽÔ éÊûjó¿D~Núñ¬TÌhȸi<ˆÐÊ%û* ×hƒ0…¯£oh¥+ÏÈ.Í€],ÉÕoïóm|öY~Ô`1us¿jÓ!+2»48ü)Šmõo€œÃ×$k\ ?âs¦€êyF¨n!%}FÞåUAAÏç€ë×£<Θ ø~ÿ–Œó-¤©Æv2p’­oÖckc ”³OœN4ù(ŠfÍ•˜šÀ«LžË–²€Fþ ¥1jÆ8çqÁ÷z" ~¼"ôGmÏ« #TvåÐÜ«é Øß*©Óµ†Ö6*}>-±¶–ûg{agk«uyÔÎa_=S ˆúwVp4%©g/½ªúûƒØå\U&=X¥P« vwÊ¿ÿH^ûxdÁnX-¨7•U¯Ïo¶ÎÈè 3µB (sßF¦«ïBá.)O H\ê}4Ø¿ŠÖÆ ´•>cdþ’£{Y˜¿Ûãd»ªË”@HÚýžu–­Ã>11d£}µ ¨‰®bø[þ 2ˆRo9,¥£4×Vsù¶Ö¯Â·Wi”’¦â»‚£>#OGX©ÉjÇEB¡òýÈã½n†Ò{€–(¸$'©•¸¡)è:[¤¬…±s–Æ¥Ó*åÌ9¦Î÷º­Éã„@Ù2Wv¸.~|’Ú—.sFVŒÙLaBñþæ,hmÖ»•‘Wˆ¾ ŠRØ'÷µ·Ó›q^4t³Æòp¨¿'|BLŒºE÷ˆÏ¬¯À]¾ ÑÐP5'ºE® Ú0¡IŸ—J›Û|G6`åXºä ¹–g~ ­«Ú—âQnd˸6#瀒y¿çé ·Õæ•%Cœ„EÀ;h®âŸnl.yÞþƒe%¬ª7ò/ø,-A×J`¹xQç­Ou^£çùêuO‰¹Ê\÷œ$Â8ݼÖà+~äör˜R>íÖÿ<ó†ýCGž(Os :a»ÅRxü~ C¨3Î0"qlÏ&”Û·¨¥ÅÜZGç ©@Õ#$[v•¦‹ÉŸ!‰ñj[´¼£MV<¦„}z‹ÒÝk:Ô/É%Ì_¦®}ÊHaX¾ÝØ3s¼¹úôe¥\¢î'£?殎ñ»ŠðÏúø*0—ùÑ+qö$w‚n£ÑÿC‰#±ÞÕŸÌ’`~`ã³6QëpsVch¾îòßµ‹€ÁÌ30Ú€M²õŒúýýÃXc@£^ÛÔ;7AËKÝO5R*µ ”äTòªÐjÂl)¥üH@þ-¡4Ù¹R8'ÜþurÝïuú‘ÿh@i?–/m$ííŠáÈqCh/ôäѪ¬j®Û-j.·—'€dýÎ#ì:ÜÕxlœ«9öNk ¼›KYUCgo¿ÛoÎò¤¥ZûuÓü)Í” éí?~™õ½|“:$Ã#YІ-®3Ó¶¶5¤ _~ŸŸü±•Bîå²ÑGÆeû =¸ô—–žd«Yø@íqdÄÜq‡8Shð§20²m!ØáŠ)×Qí*í.{t*M¬j£¡ xxç*6ר’>â‹%ý[ä€c[¼¬­½XJy×”‚À!q¸{™²$j@1á)„h”Ò«]ªÐ8ßAGý<û$Ê!\Êñåk„idŒÍ9> ±ùWŸª¹g~rEN p­–•±d»“ éLÂ[Ï26a* °NFr”mjõ²káO²Â'!ËÂ0ðåóêêd:FÀÆ,Ð}<Ȳ ½]1½CVÊ­æï+~—|) 6žKaÚD-¬D›ìªÚ6¿eóÆ»kĨÉ3zôi ¶®Ôðc+ Ì\ϰt@Nñ@ê+ O´êy‹³O‚#šBÿYCJó«QY\Æ‹ uñˆà­bËó4yGIæ‹^ÉŠV±Ädj¾sÍ@ý«ú8ê™¶žƒç1G‚:0ûc›£:é• ¦RN½ÆþïˆÊl©ba×Ôèæï"‘y–E*‚, £Þ¼Þ¯ˆ`¨Ja#Vúé/ ÐÞ|„Âñ.ZCl°ŒÆ16c€à<Öx’ÔõmŽí¸wi ÀïÛUN2æk?ãàƒ>"®‹ÑÇs½Š%š„ä,&@ š¥p¾¼0ç4²IG¥'ëDÉa ž²„Xüê¶²:,†:¿–­ìõýrs"ÏT\kôÈäb–ʹù‹^ÀŠóŒ,é!$ãÖ3c<¿Ï²„ #IbÛ‡fáPë9]棿Uùûþúg)£u§ëŸ<¥{ŽÀçb–Wôf/Z€.jÔcŸ:m ¬VJ^èf¡$sˆ&!"Hƒïaõ¡¬\â¹Gȱq'x«00ˆ EËQè,Í>YÝ©¼ãZûžJ5ÃÆ… óp,”ËãÉRŠùÒÌ? ¨N9Aò'Z“hy>ã·mFÍ(JÆX3ÜÙ(Z‡Mا¬—*ki6ƘásÌa@ûºQ·ó¨éD _ à\à‚Ãì°°ŸL1jÅ©¶|òÆŠï˜Qï ÿxM”;àn}j®‡€Ú&O5´x7>€g0æ3úC¢‡!_'…Ó½ä²öˆ^SI®ñ©y*€‹1Qy’kUlŠ£ãœÍ0²×ez¬`œ¡är¼N”î‘8ÉYê™/!´DÁasó- Ž þÉ \tØ|æã‚Ä›¯ãüó.K š­U¼äªAä{TTs³ Z•µBWvÖYP–Žù™ÖîS80f:úK½¢¤fKQ%>ÞýëyºðüW#Q^`Âi-÷ÏÂ÷"C=´M°QJ§z2¶htˆ“ÄI‡æ¬ßäÄ´4ɇÇìv0‚‚Þ‚,x:úôçD¥qú×|Jo Q.NÒ¼!&Å3£”&ó-ß/lÛ5 ¯.Ï®yåñG*~dú+kwû®1ÔïÊ#t˵zçœ 6ÚåÐð·T…þ—F:8³~á²Ï˜3WפÁIí§Ö¨ .M¥&ª ’û„[à@ÄJA—÷gáý3{þÕúÓ>¼0v¬|²ˆÚü(Fæ˜o =Jí‹é  dBS=š’WyÖd]k°@Ð,Ú¾šû(½…q˱Ë愞å íªÚ`©çgfV}ªX+\¸»­Âg¶mð 5¼ÅÈàÝŒ0õŸå8çéXùÚNI Pƒ§42ë—óŒÒ›ß^ã 4 ß‹ˆYvq÷«îã8ûQ¬ KÀ +˜ðr7ÑhŸ+1›9ô˜¥Q¹¾à²3jÈÒP9÷ Z‹DVËxYé‡]±†àާÜÁ5ÆårZ “|åùÞ³®ýD¶Ëî2]&gÈSùrãµÜ8¯Fá”æõ²Ù~½Ú$Öƒ±¡í»¥Ä9pz7oñ!%Ýí/&;Ä3ýhÂijæh†®ß\á H>ŽÅÌ s:UŸK‹€.„‘^Š&€(¸%DðTŒ»¾ñtgzP\8{1ßðRÜ?@Ï_ Ð#”EéôÃM¥º­T 7fVÇ*–ÀS0 ñö/Ó#AØ‹ 2NK33ó˜êŸ‚tZQ ».i‰M‰äÒT¬_â¢Ý &Ús*FãÚ@Ž`!…ŸÁ ùó! rƒºf]]ûÔn°ˆ¸§ŠÈLÚÕB¢œý³==íirŠçdkG§V4 ô¹*ÌûŒW‰ÿävÞ¬ùQ9˜‰‚Òž¿VÍeÊÐìÌEœÄv¼ýFªbd‡Õæ'@Ó£.°ó~û|=0°îÛæA»œ¤( „.Êd¾67-p×Ùpã?A@L×BTVóñA êæÔ–°e7½Se@¯%,"S@¸~L 2#'¤Å0_´ÂÈB¿¢ÆH…_È ?/ºw½¥5á'JOÒ°4² hhËxG°9‰ÀÍ ”Zתe[ƒ˜JÐfWq™t+îD-dÕÈdyŒL™º8¹FX›O@-màgú…eµÓ«Z3΀äɨ¯Ž‚b³3ewi¦¾¾Ò"C«å4eò]I]“Ü&õ,¬•Êõæý´ C©µ3ÛÄÁfPvÅw è…}GìÖéúêÓŠQ 5<ú±\r¹t6ŸIŽCM˜¸sn§¡ iˆ4¾4ƒuäÀD(:÷9{j7¯œ¼±ñž¡6ŒgjjíÒm1¨o¿©)u´þLŸ¼?ë(µ½ßS»CH‰g¤Wž¦ˆä2RkØó#pÃî-48x9‰8#6N~G~²Ìg†™3nƼ»K?£›ýWyÛG ‚—Y[‡)€¾Vñq„X{ó[­:ˆF ¿Ýðy‡ú…‰R•ø‘å¦J° fq&Zk&Ðn]z¦¡-ç`»2 7µàé”w~#Õq…ãø&:æ$–éÞR›êeÕëÆé,‘Â\Uýq`õέç›s×RJü¹vØÅÆoR™m{ª~4¤þfåÔ§âŽX-‹¢õPØØ#ÅÛ%qþÆòÐŽ5Tv|Ò¦åЄ§9'fn±l›–lêLi§}ùãЬy‡"¬¢'\¶íØ&Áâ5zé.ÁæTuQä6Lâü‚øw€HE€üì·|C'1fœuKG‹ð!SÀÆ]|ct³1pèÄ ëR’ž7p»C(Eëzó¹·Óg~nqè³¹&eš#?ï¡"·.¨ç6´Q™yå¼$UƒÑrøû¯¼d»“ {I Ìž!uÃ-}Œ$ûÔ3``ô§#³ÍO@½ÁøžÂ4#¬lpeæ=oxÕ…0ÞÐÁNÅꘗ‘,Y¶F K¦X¬àÄ‘žyn×ÉHI2ÑÐ¥¢¼¬sºhú;6W%WŸÆÉ:,H*@NmT°aqÏ&Ý»ßÙQã+×·¿&Fu‰gü²\ÐÆýK|–š´š¸Àyƒ¯ªL ^E4þº‘ü9f| ®Ä<Í«'VÜãˆcŽK\º}/Ö*¿ovŸàQŽPoC–ÜIým¨Dò¾VÍà3ñÍͶê9ðw<‹Š?é!¯WßšÐaÚ8»›ûF¤ÂÌY»Ì«1¨þ¨!ÌúD8Ó)‹ÒI4x8¤±„õFæt"}¢ýŽæÄÛ\ë«–CBm\_H2`ä‹eÙ§%MKx—˜! ¹•€³\ g"\Ž,–Øîöâ=Χ„'¢BýZ•0^€•ñQo™S+°i/]ï}ö±È#ÏMÎvTáWáw±×ù/=ïS¦ Ë£ú0è­xÄà2 Ú/›óÄéZ>S|:‚œ¶üÜëöõûW=¼¨¡y—(†î®-{Y79âêšdKÏà&CÎÿ`E0)­àûkˆUé¬'‡7/·0iðÄBoöiÐɾTLÀÑ'¨¹Ý±ÂZ^SEÛ(çýÕhKîêâm1&“K "O½y`^DÉÑð¶¹ ÐÞ_E€Õ_L²r·í6Ìh”1fæ7]‚ÿz TJŸ2º™÷¾-2bºà_ß_T9è úr¾¥Ö_×áA˜ŠêÖ(´‡¹/½ÇƒŠ‹~{¡¢†G& …lªº2ʨ_ÔAÂ/”WSfÖApÕþãi:ë+E€-×U‚*OYxOD0ñƒ”ß僘ž†X; R_øvº—¨èÓå®s(÷¼ Þþjàh–bìw w‹Ë8¿Ü’ü%+±»žïyù>Í AÔdSò2B2‹…Û¦A‘óaƒàŽÀc˜G3Wö˜^Œ¬t}M o#½ñ¤[רŸt)ýýÊrv,µtbM|”=2aG-÷è2º]¿×ƒ>—~%ˬm—-\›TñƉÖÅåŒÃ£ë“uXNiÀÀú•c'(‹–2>Âk>øe!kˆ®\¯B7DŽ÷£8;nºœ‡þÑ‹ïy’O•çJ¦Œ„ŸªgíeS†³eo¬:î“&À:Dân¡R(Q‹®a»wOÙâî9T‰L/̹®0”UË  æv*ÖštX…tsM*ö³8íÝ‚=¯øùYÞÙjAÕË€ª®Ü{Œ%—ä9n9Ì”¥50cö§é7ÖÆ—qn\ Р‚ÕªO ÍM«2À³ðmšó*Dé ºÍ{„<¹ª‡Ÿð~3L$MΘ^YpîË¥éˆâ#næê‘‚5böƒ„0B Ú/HuÐV)‹ŽJNÑpŽf±[ëk¬¤·uÊ~º1 Öp¸p†@µ0“¯ì}ƒL:QåäɈ1†xW¸DT}÷þþ€ÍtVyӵ“2¡Ôò'AÀáRpL ÛÈ{ti%à Ì#-¦„Ä…Ìà¦F…ìµ·"“QÏ…âÌÁ ßnÔäið_}B±Ù+‹,³¶± x#8Béuîçð”°Wïmóp˜¬üm/þ£úÉÒÊ.*R&•@V|Ê™êLÏ›7½LXƒ¶æ{η A¯´ø Û*Àâ`•éÕÿ‘I$õn¯ÕÌF/‡×V³‡“ûšQeàZIS¦äüØS‘wñ²nû‡æÒÄùæ¢-òÝìpÒfLéV}xw=HÇR@‹?£zJhã‡&F3è;ý€.2±žöKàËÌ’PZ\~¿õY(q±Ië/ÎAD’òÒ R”Ïò`'¸B…01È¢]œx–’ˆu×Ê{§5¶Ç‚¿àÿ“!štˆL¶f¸¼Ìo’È Ù¶á wS{@õW!lµ­-7 öí=r,ŸÙ‡Ê³!JGi)f ±Ó¡™© /"Ë^­ÀJÅÿ›»½–Ï[’c±Í’ÀÁÒ®²BÌ ´ó0–ëÅýk—ór¤7 Kýô'Ó’§BD¿ýuVßÍÔa¯m+¨’D:¿ÎW3BkKUÏÞ:ȳ(­Pv#æ1&ÁqU=›¯L&^ù…™¬æœ8þõÍAÑWä{R ÖÃAæbÂFkóÜRýØã®…òž—À)9`áD1™ÃõSÒq”ÿV¨Ì3È9Ï,[kÆMñŒGAe&óJ?F‡à«FTù¨øŠjøµfy榇Û¸Ö‹µ„›Œ©Œ}ó‹Þ\ÞªGá,¢¨g„p† O£Õc5*üó¢® =æ>T5¹²”Ý`#ov¢Ì*8Þ(aØ«®G*["¥”÷5ʦR±mõÃEz…±²ÕÚÉø$j`—¬Z˜^¿í]æ°l@*vweh+ê´!WÝ0Ièý/Ù¶~{ÜjZWÍLO¸F{@ÕêÜWb‘Ô‘ÛŸGÏ%¤ªqÕR04b·°_uÔƒbî¹|•$D5+†«è¶±#fšcH#/S´GrU <.*ª•šk Lk7þŽbÃÿTÌ1'™¤ñiu*ôÜÏe;°¸¨Kõ^ÏXŠìŠ VrÁãÞ^§Ç 6ñäÆ;ÞÍÕ’½\ŽN8ÔϦ=Æ@´¦c¶Š@å×Þ‘ŽÌ¡ñŒ?‡x»€e‹sÐÀ2È`݈ «Üõ<½ôùšéHiµ¥±GÝ[~Z±r3 JrmŒmÂ2âq< é*ŠØÁÿ„Û–Iëİjä¶[$Sžš“æT´3³© #Ó‡¸Ð\¡Ù4w'¨ƒw¯²¨ÿˆ^ƺj#«rj‚Î/)æÊç–ã¼6ßMÍ.’V©hPTìðn‹÷vCXw:d8óùáûGR€:·Y4@ hš•iÎJúTä&†9FÉ+ñ–½ÿ2ãóá»Ì_ì­1-¿"¡g"¾›¿Ä¡¯¨1 l|ï1úIBE„‡ Doˆôœ³È×N̉»Ê@,J§ÿâšü]Ù.¿Ü ZVJ-÷o9ýRKLô´T ˜66¡ˆÄÒ¿Y¢.«:‚x§Á+Z+÷™yT*ë¾dé>6Þmena[ó‚ÌCÜòÕ½Ô«Qšû Ê2¸+¥ÛE®Ú߉”º´*åÄhpX —AbE`%Íìåwç$Å?£wŒc•áU@FW3òodË(º¥+(b†àJo|yYCçD¯ª }zŽVåüÝÖ&ðøþ'!¤–Ы:oYÖöWóÐ} i"&K•߃rj‚Î/%*Îþ© Óm&‹LVu© ¶áðÖ²ÆyW„U+~¨“â:.P3<®äºÐí'ÁX¹ƒ÷{?óä2†×MõGæl/ÊÚÇ}¥ûµzïgßRmÏ\ ó^ºÊ׎µ¯€|áÈ\š<ñ£Bº…õ•æN9Éd$Í7P]·ßGT ÐåWÒËKfÓIÁ=կȴ$ fE²VÎtdƒK š«9éTb¼ç£r™Éþ VkÙw‰å®mK7”~"<áâ[´aQ‘¶5À2›M„5†þÿ^€¥Å8³š±¨Ýh&ZúØkäç°­¬@w˜ò;«"å™Þ¿(¦= ¡f©Ÿº°þíÌP· ûÀ$îŠ\™ðúÜYÒJÂÞ¸;ú$UÒ¤rHü5zBÈšók†'`myS¿èlvcf4àcúsV&ÒDYüºAR®xxC7 ¥bG6Ž)A¾UxU¬™n.û…1¾™S}Q~Õƒä•ÄtÅàé©âøKœåR—`%ACáOßÈœ0Š!Ê“‹ve,+Bl+‡JDˆÒÈÝå×è}ª¨"5á¤ÊÈë_êýÞúð\·WÚmSD0ÅÓTšz-ÉÓ_H뤶Ãê›Mèqý؆Œ?PšP±S}xïûö šFß¶¹‰æÊݯ2MhʳU¥è¹=£\œÛ]ñŽÁCû«,JG«ªÃ"€Wð€Ö°Ý\PPÔêâ*þÜÓèàÜ—¡ ¹¯\êtbFmïΚòêÇAÂk]õxÍó-Hqè?ë}Šz¤¼¾’;ZÑ#{)ý‰*Xéï\Œ}ü÷j?”×±œxF¿äf0!ú¹t̆8³óR”Ù¡/Naš é’‰ÐtÔ:ób1ꡌv©€ š"3š6úüOßz>œ¤Eq.²|Šerá‰5Ä#e!QLÁÅåoXÂD¦]Dc § !Ѭ¾”C ÁLNõ„áD0ÛÅ¥ºóqjªÒ_‰U1ç$BÈÝu)콂ѕýg¯i¡flœêI<3™J]ÿ§?z#$µÂ 0¦REA‰Æ¶6i,!Œ·üÌ„––Y1ÍŽ][þ[¸´WØ*†Þ+„¨•{ñÿ'Z m°ÚØáÕg½¯c4üøzÚâÛn½A³^_‘^g<39Ù 0=ŸCS ›Ë‘èµ’$~¡ßų=m¼RTÈ$ :KtB,þq¢/b5Q‡»NØg}¯ðüÛš2p)ãÔvR]{‘‰®Øè"ì';.}0`¨Ì¸Ø{üŽ 9Œj+Kk­¾=ž<œ¾H¤XíÏW÷JæhnÑ¡ü°G ò@xÑœ¡¸Mä]a;秥ǹ¤”@H:û¨® ÉNíW÷@\Çßó®x¬»¿­'µ‚J?u2´Ù‹¬V3‚i[¯øiåà½c~P¦%&ê¶Œ§Ýõà){ÔÝ•˜ì˜ƒÃ-UeL–¶baߨ³ »38÷u³¾WÎk¹×vK'£ȉ™MOLÉ“ý/ßÜšáúê{õù€R(3u¨Ó Ž„šæ¬Ú8®c“Z­#“Å,_*hÁ¹ª)yÌN %ÝÓ`W¯,*ý^„$ç&³™PÔI"EZÛ·øT쀭éÉ0ƒb,S#uYî%]b·"ívK4ÊPY²g¾×GX¯&{OÏÉ,=’ÇI‰/+s¬{Â7ökK°En¦h]e jtkî-PR¦  `Àûq¨?ÿiûôÍ8!·?Ö6=#¦QkZiW@È ‡ pä-<Å÷K]¹•íóW˜t=†ØL/ÅçY-8`?üÖ|U-élJ %ë—_ŒùûáÕ¢¾Í·“³†ÃKÿ#Zg´¶ƒ¯E_= §QO/ðÁV±{ð6æ'Âo AUâ8{c°étÁr(:yµÞî¸ÞñÞ…U[ÀÂK‡ÄrN×aWí@ø%¡G¼œîÌ‹~â#ø ËJ<·gmíŸÄšÔd-HÄÛ±Ž­Q ` c1’e-¬B„ÎHHáñìzêrYkÀ¡Æ¡º‹;¨Oêk¥ÇšnS,È*".£‹Ï¶1äÙOsZê0ÖaºÔß?XÎAˆt îü N9ÍV«lvbyߺкÒ[²otÀ¦n¿kÀ îì7YB¸7¬ÕäE šQXÁ­q]ß;6yü8ÁºÂžKz3²[·þí_îõiþL\ìlqÚÈ·k¹•ßk…Ú-U(ã¡’rÅtºÌèOW±íý¿¥å8ßh艨å÷@}N~†}ó凬ò{}ÑH(]𨠠ekk}[ɟξLN[Z®žÞ±½LEç .mË3«œøä›ÛC7¡ãxS:ŸøR|$ý”Nyg•Á§M¥VÆÆSJï¿Üf›42ÀBúPGy’äƒ+qz£^PCͱ¤¯¬X¿77m`º ³=œî–à reü‰ôíL[AÌÊ|1 ø› ²Zµ¥ü~æCEàGN\TÝla:0‘-ØêcSÞŒtÆš‡A™â³/#7æÂ ËY6üÊ48­ZÇW%[ UÎ&ûÚ7MÌgÈÃå®ë¢šº5§Ú×T‰ŒliâóÍdzýª ›‹›šw—©#Ö8”æßõ™‚$Az¼î¡{ŸêõL…òŠ€t¨¸zs¶Ý(ó3bÜ{þFE¡} uW!k„òÄ3­…®× Ú2,oƒ73Lª_ ´î_µ‹êì}Pè|&*_*ј‡_¦ctºÞ¥<äñ )²÷ˆáô£ú%’¥gè“2ü4)Fr¿z¢7£¦1í2¡ Ý“‘+Q˜,ÂX1Ó€®zROTwÄ*‚ß]?—h«Î_,>ô7®ô0Úø\ÃìærL¢A¸»ºsÂô#Ô câˆ{]ïoúÐgîÔUÓV9””÷m[°'ÃÑ( áŸòÝõ5åpG2²mÇèoУAíFóuŽùiEPíð€ÝÅ™ðÀu!¦D[£–~VØP Íu‚­Ñœ>×aõ;ü³d‚áµZj"”0_âðÝŽžõSTƒUÎ6y¼CëI."ÿ¼$_ž¶Y—ë†0K, dÂZÍQl1·ÙAz4ŽÜþ5Äd­zÎÃȆLôÝÑê‡üRr˜Lï?]8 –ø¯œÛR¥í䬊G$Ž™?F>‚¹¨§ÒCÒ# $Î ¥CA /µPŸ#À|{r"I†Ëš ÌÊQ¨”´—j¡Œ¼“îjY1bMŠžv·DŸ~Ð*ÐåÔ@,]e[³éz‚âKÍϹ’:uÄ7Ž;V‰.W.z;3zÿW²pßkxÜöœà8y¾1€=<íQ³O†Kre¦õæ!=ðtf‘7¡¶Õ"Û½4ó±pm¿æÛ]çešTŸÏV‰Ãî‹»\[u03 æþ`JmÃ]+Òegc5¾.¿3X U½eÞb°¿öøZ”EÞŠ4¤õün¡N"£sKÿ‰ CClÚöyËá6j1«}™Úè>KÔtÔ0‡{úz‡!SÅ\5&y’_¤Üã¼öMš‹|??®UUYø-l²àSΉy4îÖPÎ%ÒaŠÄÚ=gà÷[ì ®|9híúvk¯3ÛíÈ…•òÁ³ªryqýü¼<—Gè3 °QvÒ9 ¡Ëvˆ†Ïèwþ‰r¾ŽãÞG,Ÿ‘“åôÉS\Âþ:9Uî?ôì̉ÕùU¥§­n ´DC(ôô}o ü*ŒõÏaø¯SS2«ÙŽŽØk¬¨eÙk}2ÞÏþ…žÞ¿ãÊé[(TƒJ©ÛPG¤X—mC’=|ÞHÏj>|7ÁìÒ]=$„’òMLè콉„F(Èé|«ij9%B­ú™ —ªr60©—ÐGmí7>Mrn{pÁDFÜdÀ=fÜ å¢çD¤ ®÷ùeð°{›YTÜj\²/i–ã5ž¡(#œ XØ|E\o·ñJÓž íüë±²¬ò |K¬TÅg•eí˜ìB’G/åyý’ÆOÙ<¡¦Ýôñ›çyV˜:úÙ}$Ã"g?CÍ”W¸ù,YÓÌbu ö’’Ÿêd"¡±ÝlåŒé©\£‘mqNƒ•¼›f« ½}âù&wKeŒößë“«5¥QjGZúHt¥sëõ¶úO¥6 ;÷>ù˜éÿØî NU1Ë»q¤'ìœÂÜ«8}¸¬§x>°£±—x\È·QsáEñŠâ^ê®Ï.:÷˜à Ä$KïÅ¿º8µE™93¶ËñZ‰.ý¾î4Ä«ÒÜÐL·,6f*ÄÝÆ*ixå§$…5f•ü†ÌM¦Bμ&n·ò ÆyŽ™¿Š@1ÙMr¡ ¹øå¨^€Ê‡’ùÚu[¹ó±ò.«q«ç<>—T%öŒÉp¼`óãyb'öQç;àFºëñò µÂàæ4.êJDެ$‹FÁ¢Õ’êbõ“&îJÈ¿"à€è%x¿ïÛW?ð™ˆåXMŠò< ×µN§Má_~1`¡Ó ¯uç+FèWÙVìY&‚øMy»ÝÈÅì â¥ØÔÚÇàˆPcÏØP>Rå!)4:b§SýÓ.7h3ÝaQù½7†ENãÇÓÕd¦\Ôfd‘í•€"O<å‡'8—ÃT3R‘ŒW÷Hå}FÿÃ>´PV¦kßáJEi`$tÄ"%«ˆî|t-3¤´‚Ã5‰úÏÊk’˜åÓ¥œ2a ?Ú¸û³lòJòÉ}7sô 5êªÁ‰ÉoǪëË ç¬k@ä8>æ÷ %ï`tEOßDÔ`ð JŸì‡%s¹ø !7(GàÛQÎù¢œeÌξ»„;ª’]8]û©ÒéQ·iøgy-üsQ6©ƒ€XïÆÂô’‡RP:¥d~›,+€üéwûX_Ççj™Å‰»¦S£®×£¦Ü·æ÷$V¸kóàÙ­“zQaã£;”©ÊÈ ¨Ø Ã0òM5بié›l·Lê†Þ‡Ô‘"ðz´Èð÷ÿ‡±zñ›u5ͧ†b/ü(ÀXĤu¬UjÀoj;dNØU [^è&¢e.³²«ÛžåLvÎq Ôæ8@ïI‘ýÒm>3Ó³ÔFéÕnšÔÌÓv¬þ¸ÁzM©þ½ŸÏY‘¾\D(ü’ºB®°Àãï€Øí©¹Tj­{‰¸ Ï:l²Á]83ÏF,€0TBrSüÕX‹l¶˜Z¨´’C˜tZ±¸,cè‘>ø)6ÓÁH`Ȇˆ'V%ñ—ï±èö1*r¬¥ôeª#…|Ïu‘*'–K‰q=IIÈg¿½À*¡Ì»ø ú'¬OsqΆË"µ—ºÕpªßÖÍδÁžÅùH Bäam ̧ú9½D …òlcÙý Cy‡àOøÞ=PA/WƒQØuÈS²±s"´³ny!Ç'{4h‹mSÁ1Ƚâö²±ïUËÉP¬jÃÞÿÝŸžÜq~Ý÷¸P*€¥nHÖŸBNä)*Œ³Â ÍÁ S%óYI|åi–|¨tåᔽœëEñîŒ ÒŠë>Þ]"±+“ù˜sPʆVÉ×ömäÙê/5³ŽÃåO÷ ‡¸ï—E¢Y¬Óɬƒa\At À4¥û½G¤EÅÉCæßýn™(yz["i°÷Ö jÔ„iç=Ä?˜è¹A7ŒÃkâÍ® ñ¼ÆØÏ\yJ÷÷€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/type1/dcbxti10.pfb0000664000175000017500000014071511742726711023765 0ustar uwabamiuwabami€%!FontType1-1.0: dcbxti10 1.0(Level-B) % T1FMT, Copyright (c) 1993 Basil K. Malyshev. All rights reserved. 12 dict begin /FontInfo 13 dict dup begin /version (1.0\(Level-B\)) readonly def /Notice (Copyright \(C\) 1994, Basil K. Malyshev. All Rights Reserved.\012BaKoMa Fonts Collection, Level-B.) readonly def /FullName (dcbxti10) readonly def /FamilyName (dcbxti10) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def /CapHeight 686 def /XHeight 444 def /Ascender 694 def /Descender -194 def end readonly def /FontName /dcbxti10 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /grave put dup 1 /acute put dup 2 /circumflex put dup 3 /tilde put dup 4 /dieresis put dup 5 /hungarumlaut put dup 6 /ring put dup 7 /caron put dup 8 /breve put dup 9 /macron put dup 10 /dotaccent put dup 11 /cedilla put dup 12 /ogonek put dup 13 /quotesinglbase put dup 14 /guilsinglleft put dup 15 /guilsinglright put dup 16 /quotedblleft put dup 17 /quotedblright put dup 18 /quotedblbase put dup 19 /guillemotleft put dup 20 /guillemotright put dup 21 /endash put dup 22 /emdash put dup 23 /compoundwordmark put dup 24 /perthousand put dup 25 /dotlessi put dup 26 /dotlessj put dup 27 /ff put dup 28 /fi put dup 29 /fl put dup 30 /ffi put dup 31 /ffl put dup 32 /visiblespace put dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put dup 127 /hyphen put dup 128 /Abreve put dup 129 /Aogonek put dup 130 /Cacute put dup 131 /Ccaron put dup 132 /Dcaron put dup 133 /Ecaron put dup 134 /Eogonek put dup 135 /Gbreve put dup 136 /Lacute put dup 137 /Lquoteright put dup 138 /Lslash put dup 139 /Nacute put dup 140 /Ncaron put dup 141 /Eng put dup 142 /Ohungarumlaut put dup 143 /Racute put dup 144 /Rcaron put dup 145 /Sacute put dup 146 /Scaron put dup 147 /Scedilla put dup 148 /Tcaron put dup 149 /Tcedilla put dup 150 /Uhungarumlaut put dup 151 /Uring put dup 152 /Ydieresis put dup 153 /Zacute put dup 154 /Zcaron put dup 155 /Zdotaccent put dup 156 /IJ put dup 157 /Idotaccent put dup 158 /dbar put dup 159 /section put dup 160 /abreve put dup 161 /aogonek put dup 162 /cacute put dup 163 /ccaron put dup 164 /dquoteright put dup 165 /ecaron put dup 166 /eogonek put dup 167 /gbreve put dup 168 /lacute put dup 169 /lquoteright put dup 170 /lslash put dup 171 /nacute put dup 172 /ncaron put dup 173 /eng put dup 174 /ohungarumlaut put dup 175 /racute put dup 176 /rcaron put dup 177 /sacute put dup 178 /scaron put dup 179 /scedilla put dup 180 /tquoteright put dup 181 /tcedilla put dup 182 /uhungarumlaut put dup 183 /uring put dup 184 /ydieresis put dup 185 /zacute put dup 186 /zcaron put dup 187 /zdotaccent put dup 188 /ij put dup 189 /exclamdown put dup 190 /questiondown put dup 191 /sterling put dup 192 /Agrave put dup 193 /Aacute put dup 194 /Acircumflex put dup 195 /Atilde put dup 196 /Adieresis put dup 197 /Aring put dup 198 /AE put dup 199 /Ccedilla put dup 200 /Egrave put dup 201 /Eacute put dup 202 /Ecircumflex put dup 203 /Edieresis put dup 204 /Igrave put dup 205 /Iacute put dup 206 /Icircumflex put dup 207 /Idieresis put dup 208 /Eth put dup 209 /Ntilde put dup 210 /Ograve put dup 211 /Oacute put dup 212 /Ocircumflex put dup 213 /Otilde put dup 214 /Odieresis put dup 215 /OE put dup 216 /Oslash put dup 217 /Ugrave put dup 218 /Uacute put dup 219 /Ucircumflex put dup 220 /Udieresis put dup 221 /Yacute put dup 222 /Thorn put dup 223 /Germandbls put dup 224 /agrave put dup 225 /aacute put dup 226 /acircumflex put dup 227 /atilde put dup 228 /adieresis put dup 229 /aring put dup 230 /ae put dup 231 /ccedilla put dup 232 /egrave put dup 233 /eacute put dup 234 /ecircumflex put dup 235 /edieresis put dup 236 /igrave put dup 237 /iacute put dup 238 /icircumflex put dup 239 /idieresis put dup 240 /eth put dup 241 /ntilde put dup 242 /ograve put dup 243 /oacute put dup 244 /ocircumflex put dup 245 /otilde put dup 246 /odieresis put dup 247 /oe put dup 248 /oslash put dup 249 /ugrave put dup 250 /uacute put dup 251 /ucircumflex put dup 252 /udieresis put dup 253 /yacute put dup 254 /thorn put dup 255 /germandbls put readonly def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-29 -308 1292 911] readonly def /UniqueID 4700726 def /StrokeWidth 0 def currentdict end currentfile eexec €‹¨±Ôc, öøÔâþ³×Âû-iìœ ï÷Ju¤¤öï§S©°E²!¶Æ¹'hŒÉúõ¹Û`+#),ËÈÖ«JÈ&ãÌÏ•—mYÕ¯ ÿÈþkÂôÒ·¿'\›Ö)I²´^Í  4"L±°«~D`”¨X_˜O>IÀtcÿî#4¡FpOµA Z®ÅJ\.±{—T˜/NÊÀ ëû’ÑìmËYHƒŠ,ó͸;£Áo0 ¾àWõb,K,MA¼‘FàWÉŽ«ez£‹«Ðˆºl¯íoàjÕpýs˜lW¹ÔÎä3ÿÉï'X»3縔ºSm´8"Ѐ+Ê©Ö`°›ºF¶LN…Î¿Žª^P–`L¡´Bz‘n­ÑHËöÖ0w†Š¡Ü]Àr»ŒI!ò|±#„š#D ómQxy,ÚË5áâêCÏA‰HïFØáKhusëK²5^ãÜ[¡\©Õ¼9Wl”st‡€èèC§HéãbEÂ#Γ––&ÁpÖ•Ií? CbÆ1Eobç[%Uñ»qšáÐ}:7º} F+(='ŠŠF­æÄ‡jÅxÈð¥<#=Ø)í#y‰:±bž¡‡eËØÙ 5ï%Ý}ƒ_óžÐ7+;Õ—¶ž³åt´»ËPÔq‰oÛj"êGM)ëcÿɼ:2YtjÉü+Íõ¥´º«¬MÓÚò‘ÖR(¶Wàxý©ÊF2ô×ùÞ¤ÒÕ$·A±ž‚ ó›_%KÊÌ¢¤n—éçˆÓñ¶äÓQÚÑFÇ~nÕªø f{¼ ;L¯¦µV\-/·Ÿ¶T Õ{=U$öÆd½¿àÄ °'WÍgî+²ÇÃ4ýûimcÝ0"j·ˆö;ÏÁ¿-Ùl>ÔÙx\38±ÛG9˜zóºë3¸¼¤æH:G\c‘Mjј§Ö “óuØ$Dw5!×S»¸‚²ÃÇiDÙŠ­0¿àŽŒÚßD!h£Ý—\²ëöº] ûU>îH¿•+ÏÿòZ®¶œD !*1–„3hE%odýÓ‘"ê{§&¿8e›:šE³|²ºè‡ï1þwMš§§Äƒá ŽSÂ{ÆòÊRáÌìÝ­«»¦ÉÏý~BF|°t0¡Bgy”`cGWçõ×,§­.TøZcä­‚“^¤û³Ó „ю啉þö¾âÙÂcêã9DëåÝ@å3€}Ú¶¢ƒtcöžÅ™/%ÈeÏÖ([åI,ròÖgŸYò—­ $ËX¿3B™iZZŽ©Nåë IÒKÚ´)ç­Zr@F•yÐNâQ¹ÖûH” dí ¸Þ‡KZ\t¸MŠÑ"£ºÎæK:÷0qãC6‹Nsy«ä ŒµÌOÁEñ#w8• |öÑGFÞïYelØ[-•ð+·(˜P"GñFYЬ:scÜ`+YÊ,ÃÀ~È`J¤ž~ HÓ]`¹‘·fŠ®Ù;Ü‘S×ÄE©:-Å(Ôîùn*iÞ1óXVøƒùþ@3Ï‹6\÷?âd~e„ÃïugÉ–ùp¥ŸUK»itJ»É®£™šƒ‰«M‡Ù þ†wß1Vî9ÝùµÀ>%ÖçÈgÄCÎÛÅ¡ ü¬Áað„÷õ”G[õ¶ßùÕ&„ßY™ÈHAU PVÌh f»BèRÑ.´/N``ÿ{™"å‘Ld›=S™4Uò\ôZ9ñHÖ)qI$ iÒ¦Q:¡‘Y¡Øf8©ÎÁ=†h|U—- £˜ ·æ½š §²©zÁ:òe¨y]‰ñ~…<ÂNÚ¨óQu{[‡+‚m¥–^!Ü•µ ëƺº}Ù”Ó—†ÛÔ:ÕVZãP9Z*ÏHî¤4Ø¥ÿÖÙÙÅßì/˜xG+ŸƒóæÃ·E.5K|\ µÆK”a×K\¤p?j+âS"õ€äôË,ÄäMÑ£†»˜$Œ(>,‰à@*äé7†ÚÄAYÄ'%¥Ù}[Äm¬ÌîÖB–;ƒt—ÖZý‡ NcTÑSUV o/ çÀˆ’3(Ê ?âåjåoÅÜš³ŠöèN¦Ô·’ÝlHÜríª ,ÿ ÓaĤx(PUC߯b%§ÕLòã¸Æ€p?|3F:ÿо²Ý ÛÓiøµQÿ83= ñí¬ :‰¥ ­p£…îÆ ñÏÓ™CRÓtÓØãJŒ!w¤A ®³æaœ HÙüS4ø™ç:,Y_l"a×gµÕŸõK*’³¬ ÊåMë8k•ãüødÒ®€ÍùÉÇeè:Ûô”ל™e&žÕÙ5/6¢œ%:†T3ý)WocŸ­MÅò;ýš;„qâ)­’À®“ð·‰×˜ÿ;¬Ž_qý>5ÈŽ ÇyAõ”åÑ“‘æeµîjëee¿4ˆ¦§®’paÖ“´0H“™öAàüÖ8ô®'Âûõú€Ò‡‡",0>CÂ]}uŒòP¡®às4J¹ç“GÛàŸ«âš^6Üä„jŒî¦Wñ؆Èi~èO+0Ï„>è…ZºB¨´î•®÷Ü)NWUweEàÉ"y™) q½ Ÿ[îí"€8œhÔêêDÈø.©‰¯¤–*Æ6Úù„˜fk bzçŠæ¨~Œ^ÆüqM=õñk}ïõµKN2óxiΕí0ãFŒ`x5ǧjÙršp Ë«T©ô¤Z*!ôa+«¥Õ“|®€ø® ÊC[Qvø»Žãmq,ÎoE`·‹d]U7—é:˜5’P ¼;±fÙ³›.Ž ¡3öv[í£Vt¢ÞZàÿÁ2ɾË}«+A‡kI,SÆ%÷8Vs†Á)cÎg‘ŽªusÌ÷Ü\B»ºÞ—õÁמNj"›¾o’ãùDütJYóâ·kÂ\ØZa f¹ËÙ’ßrÉe·='{ˆ5•”‡JóY*–r wkºN³Zk:›¨ìU3ÒA›N]ü? ’ eSð7˜£HœÁï“›;Ø]bÝA‰…öT•÷àiñ’¢ˆØ”å' Å’1[mÂÄ®P?IÆLAmŒ³U‰ ͈ÐÏ]²o$Æ:ÅCééfóÑ>^IR^Võz‘°mrÊ‚ÕO™½)Il¾ïœ0Ry†ÇÝp“Z ƒQö%ì J©‡ï¾|ÜÓk:Pù¢h™,Žû™: õì87zóÝx>äKSÎ7’–ð¹Ø²qQ<:#ìiìýÀÝ×üLó¨T™ÒwmM÷rà|Оe~ùÊ]˜¯sQl%U^§½ ð5´¼SŒm7iS£Xxå“[å=«L`€‰±Hç¸iÙˆ¶(J昂z0ÆÆv£W¨!º¸ /x{9hÂa#*Mƒ¡jÝT Û"T„mâÕ„¯óEÓ¶cà0QlÊ"Ÿ`ïOæRÛcs½ |«†›nR¯ŽkM‹³èc‰î6•¯þ(D2ÓKØ`­ñEàÊÃ^'ÝíN¯hï¨Ý«ïÓß×»’¨`N„«äsîUe¤ k¥P¡Í¤m³‚#»¦‚•ý#¿þâàé™×ׇ¿ÛÆÂEýÇG}Љ#€bƒ¹ÌÜÛÚDJ%¹9å¨AF¼êS3rû„Ùqc  ¯Š®Å‹ ¼·ú4ôGUﲫ'„Ñ&ª?„Ýßéü§RmÓàxŸ“Â Ô #å{úDk°%ã¾@!öŽ7k¢¬ÜPQã`O·VSÝÎ?nÒeÎ µt @.Ú@ñ(o}¡ä‰ Ú‡lhÖN&à6 .Fl/†Á╤RìÒß_)ï{ÍÌà,ÐC€XIWÁ­E álxpl!ûêŸrs'J²T$µê‚wÇ.øï¢)ÿAp);M~yfðé;K=!¾ª ÃÚ3mÈà¶pšR»ü[:ÉwŠŠCJÜ ŸúÐBÜ ]•lþWÄ9ÛwˆVçÖYE»ˆê’¸Â†“ý£Ï7É·n–Ñ•­ë•|OÉ+¬ÁŽöCƨÍôÀ¡è ½ð”æÕ?0Th¡m¹hÝhdY d"¢:ûÈÜLËûSिTòhÞ žÿǨ ݇ìe{ÿ£ïJ„#óu výQC¸³¿¬Æ¥ÜO72lT{Ôð  Î¨ÛdBTÀq»ØU#÷ãfoqJ§ÛGÒ—æú‹ï6§IU$a{¥aøê_7Ýçñ²¸‡*{q²†ßnÕQ ÍzÙv.9ÿuÒÒ6—CÄi’úŒ4~Gã:øø¥èÀO÷ÐIEH¯}W¤±Ú+`\´"ìZ@’üZÕÿ)“ï+M’¼èŸDºœ˜T’Áqðøµ_!Œlh`.å‘+!KV<ö¢‹;Ô¤µ©fÑ7Px·…og1Ý\.iO-—åÉ»›A×w+àãÇGP‚¬°8^aÄõä@‰¼¤äCÎ8ßã­†LVÝNtgÿ6l›?È)ïêsx.иÅöÎaMh|‰ò÷ {"c¹¡ˆ@§VuØ¡||ÀÕ1ž8ÿΓœ·l¤Ñë¬*§¾ß~çX5áÚõÒ ÛÄb.MPГä`5$úeÖÑJ$àNmšì¤„JÞ\6(ÄŠ)}øÄf…ÛOyY[;·ª5Äã*óª9¥PÁˆ{æqhõö fråaqÆ;ä-…-žõ1l™¾ 94±ŠË½5ía÷°Y—b¡é™úSÊêh&ôÞå·/RËfýêóÙ!†BéJ.ž'h``s\°‚I4ô¥6+·õ$·S_'hx†UöÛ¶¿ø¼ =rqu•\žª4ÝÀ ·„ÖŠ"oBªàþ?]Ùg†hìk[-Í“®bQ ݽ‚0Gîgã†Ý.kAY®ü|YMëéKkÙF®k×ɧ”ÎB…²{Üp=Œ„x?Ö=ïGö±qêD¼„ú¿¦èp|aTÈyø¶¦yóFjn»¢v!¦¡-þ³SNÌDžñ֦\0mÄ“\M¿Gn`x}Öì¾+ ºìA9Ѷ甓ø2¬ÚLÄØ’¤‘Ž„Dl$c;ùVð@ƒ.3IŠGK—UŠ×WÏN~‹Ç4¿YWnÎ{/¹K/`Ĭ'ib¯ë™Ù [éfUBöw“’¤h%í¨ôŠˆZÇn(–Ð)•O´goŒ‰Ógø‘J ª³³•æÁˆØL·W.ÊoǽÛ.dÛ){Ï­$8ÏÚ6lÓ.Ù’™ù‹ ƒÞHI&AŒÑÿªu„“ /ý"Rg.ŸÚÌã¾’¤yg< Œï³%¼Ü_ö–(•á™Ü”q@kAöëÂ&)Qöü×~›:ÅÁ?L©ÛO€âŠ/ßTvúƒ¸s"~€¶Ï„›ÒsjŽt¾»,¨prT¯I¦ÅÂø:}ò ¸*fϺfb#µ~ä1j~Ѻœ¤éÔÆ®‚CÐä¡»˜ðuu²x±£ e7ÄN›Z‘¶o;ÿ檜tš-½ÚŽ‹Õ ô›“ù.&¨k¯Ó' EfÞÙ$lË[w™¯A uMhÉ5¶ï%ËŒŸÊLŽØo›AãѧNµ’õœdž1‰ -©²P¥•ði+Œ£¥Y~ßß2®V3•€ 4Â4oÐ\Ç’QZ.ìe7Ök_•héÛ+V©X(®Ñ69·7õŠòû¬…AÈÛï€çuqÄKmì³%º2ÏÔ6È Æš#ù´ì@Ójáò.tëYU- ,(©Oß6*CõÈÞº‡&L°!¤Í'¸ú°£¢Zj\ª²Xî£jÅÏÑ›<æ .òƒcÖÖ´D¹?~¿@+ VDS§ç˜ÀJÎtÒ•™=§&avGªÚM]Ýæ|Ôëù\/¸i;pŒ}Û0ì–(7+c’8NÑù.“½uº\5>ËÀÛLõ°\¬l¢ôºN¯X1r|qž÷½ÿL®Z”ˆú%æñÌn˜{B/îÖknæLc¹Õdç°™ !òçÐcIÓC;Áæ©k¿¾6ÂVÞïDúËf‹?Þfðež ²v–`ß׸JÎôo¤Ô§ÿlÎ{ý¬7 WÂB„ï‹&tP‘Àå·h:Ÿ/Q\\°‚Ü‹„Y¹NµõDYê]©Z¶À숵s»L¨¨»@½ïÓU5è·žígDZfG©c£˜½,;PkÜ}À~Âé‡ù“høø¯Ë# Ã0íζ}çÎu[¹Þr¾Íyº\Œ[Qv•­u'~Òúè_¬î¿pê­ ò~_xöê•¡…»°YMgï‡û9d·ž’Èöàô¦ïÙ³yäÐ_;5LŸû8½%Ø¿.~ï¹~hŠy†+ó?õU€åmSŽ[y=¬Åâ<ïŒÒlî‚üºJ؉g ¹­ˆ=ôÕ™`C]ó)$ßÒ‹pÆÍdÆEŲê5öüŒ³nÅ 2„² sFQ‡Høg‹AÃîN1£Õ*é wZ âÍ9.ç?sz z+È«Ã5iðhè;Æ–tú¨ý[†&\ÄG¶üÔE©}9“U†i!0Œ–+“—ôÐ>E.“p+O %L¬ž%dLa•mzÐO0'#9"²õo”äÃ7¦Ãb‚ýT¤óc8rƒÚiæÚcˆ ÷oõåGÜQñ@{\Á3¡Ì#”§à±HvB±N'¥ñßZŠØr"×˵ÀÛ%£¦{VS· Ë= ÞÛ?å¹ÀÝis>z_Ö³öùh¡ô^t(jñÉ?Ž1ˆ ŽÂÙÀ£–¹˜´©¨Ò¤«ƒë_i:Œ(ì~#;£n÷•7Á±œ$äúxÁžÅÄU*–¸ƒ,ÊA1•uš7ÜÔs4+…K$ÖPõåÂEü9Dè×ýWHjÞ¥ž0,8}Ô¨=&è[¾´t‘Q[ ³Oq††p©%ȼú`Ÿ¯íøA@ð@-¬ÙiLYº”³U×\‡ÁªéKcìü1P[¹´ad‚tš)(­CéAoÍÁàÂxÖ/DÀ†œh/7ó”ÕÐä–T\ ¯ª8[.fôÖÚ‡@•±<7FBS‚jê:£ê?/²aš¨åIRsùuU' 5×:<Þ®Ð2žü§Å—´Ó$[ ~Sl„âŸo{ÊÌÑ>bLâAwÏf™™ø› 5š[uÿ/’}“`…Þ6)°+ç»Ï,‘™êÅ~ ¼âTg0³í[ÅÙÚ¾amËsÔnÎÍb¬¸÷¿¦*„µ–ÁÁ[’µE¾ô%!pJö³rw÷ 4m<ë£'”à&$a ¦Öo¯í¬¦~'ÀG˜'ÄngîEU>¨Ã±1AVÚr\:à!õñTìÉê ÓŽ'÷§bª*4‘ñe7HqLÌÔ›½²‹Û½’(2"3Œ+#àU„Šæ kV.V{vÀXH‡ 8ëlèR˜Kä,‡£Èï÷Êg<(H™w™OËhŠÊÛ#Qg_ðGΑ?²~5ߟ-¬ñˆ½q*V*ñ¿¥7Éw²À‘«r K•ahMq’&#¾¥÷?[pZmÓiþu-ýw5À[CÁwè±®ôˆ·xßNÝèô­Œv<ÖÒU4€¥`;c“ÔÒ‘>!áa!ᘈÀªÚ=k­O—1§’zÈ êt(sxZço3YÑùeÚÚHÔ‘E8}RÃËgκiBd0¯Ä9Ü­ à: )3¶wÎ,Cœ2|bÓOgV‰C!wüïr·¬ —IéN³žnîÄë¸8£tàëaZãÌéúò NíƒH!˜Àû8WÁ«ç·œ4<à·ñ{»DAz{§@\~‚ %GKx½ÅDÈÚi8û±×°™ˆ•GÄLØ8¼ì⇙ù¬FJ8B?`©¼ ‘··êèË®XÉvŸS~åƒY®»²Û)Ÿñãú2hëA(sBóÙUú›Ãˆçcl|\ø5ã Û7WЗü“Š)øµôï˜Lñ Ùì|ÊÁ™ ß`zœÁZ©GУ%•øk™ ¼÷C»‡ò¥HýÒûÝ,‹¬½. }óvôFDf·ɪ쌄Øex-ïʇ‡×4²WösiLq‚ÖI-&2åÈO#îkŸxM"În63nËíÇôÔAí0Û²$Š0ˆ—–MŒ@½óz«ÖÑü±4ð³‚PCÌ¡|^Å8Ï%9ÍÅÆò ÖáøÄ\BŠÂ-CšL\¹,.HèCÿ£šé›Å$F¹ÿ×;æ¤Å}Š5¿Ç¾Fçè]Ní×”:-lOçN§[‰ì¬ì•äHj—rØ+õJØ'bÅu=Í-íLá2¡ÜôŽ%ëôjÿöÑg·|¨ÉfËcAC—“`'€—lЍóÝ8µ¦òÑ@ÉÜ› ~/£¨Å§Í ÀeôpØ`c!P^‚µ[&ݱgp*È&9uu%‹¼«¸/‘5ӧ赜;½Q·Mšn`fÄŠ²Jb}œçÄgô›HìŠy@¢ñ‰@ ñ/JÛR Ѐ‚þ™ºwâO±ÉЬHOƒ¬­Ð¯MV…¤¡·|űѺQ“ñEü”‘ìÌY¨]tÚJ?ÒÃ’ý•اâV1…>HäŽé5£o["©rû׬ éeª eR•@œ C=ƒÇ€ï»fjD°÷u;ýs‰‘Ðî×µ=À¿DòŽÓùï—|K¡Ú_ÿÓ'¬¬ÇYâ²Ýi±—‘V KŠï[= w_8wÕ‰OQÂ/m®–ïÍ%ààÌ&„÷·À’-Ë_ÛÛl§N¬J>lÍ]‚*ä©Ú9À¯uUbïÚá¼í3zˆ™Nˆ¸ÞÆ•è«Ø3Žè¦&{¯UäïàïÑjPü1‘NöîÕüî:jȪLÛY³†”› hŸ3d)ïW?+í×s;؈ö#«²¾³‡I{(Â}3YZN1 …(ŽùVñúIºnâeNõ§þ2Fü:7'Ä×(<Ÿ  Á•w? º×içtW.ËTXië$‰‡ÓÑ`ëÐÉj*ä„WP~œâ÷Šf¡Uª‰xQ’´ ËR™Š™øyÝå­>b0§$ ¡o"Žb sL_í÷ µB 9²Bt©âõŽ’(Y„žáœ¹wìC«2…ºâþþf|r$³ôâW#'5~9ǽæ†tˆž„ÏêpÕw2–ó‡Þ>56Œäðà–Ȥ]oèBÜgF•V¬„ìD5 ]è˜;@¥I?GÝáN´V§¼{ Ï{Ÿú…US¤èÎYr®lëY™¬ Ùbs²•ÉIš©/2}:ÌŠµØøÉ(§Ô«°`.TÛ»”Ù&#dL#­ôÆ|Ì’Î}UµéÁÒI¨g@'EB²råÄêÇÜg(P2·”íC)ƒ0N®kÊÀθE=b³œ_+SÏOê:©9ºÛ‰cÖs5 3Ýs_¢A£ ƒ™æMcËÇã÷ˆv;>÷îœÉY)ý ~íöO2Òºè'ӌᙠî³%DÖÞÓ™6ufkÈu¹G\ žáÈ$ɹÃä[¥¼eÜ_#ot~ÿâþ ~ª·í—ÎhnÁiñàeÖ¨vø•ÚÈ(žDO„§æe,µà‰È½÷ÛÙËæAõ÷vÇÛ¯ ½rGE|W»±ÐéçRT®õ«ï2È#Xqe¥®ä2¿Ê ÜCmbŸ_!6á›CñÀIt Š;g± C -àY•º‡Õ—‘÷Þ_¦8ƒ:õýè ñå< ŠõµÔ˜ý9èQŠ´€>V*nbÏfü³ÉÜ^ô1ÁŸ?`a¾œ¨VGÛòÖf‘c­¤Ã€}¿ò®ø3e½g€D•]I¥»CiS*[{ƨ7Õ„9c´R \<‡LðÖ}«,ÿp–rk~*@¤ã }ËrA¸$ ©äÚ\pµèŸWf@^eeÔÄv9˜•“@ïŸms”#–g›DEh]žß.<-GTŒ§ëÁ„S´%>Ѹn(Å–ÆômÂ\Œ;ÃãfÀŒïû’k4Ë«Ài}ͬÐA¨³û²®ô¹Ò›HüÚ+GÃæ¸D­¬ ý¦uNÑ"½­žý9‹5“­: ËáéJ;ÉlÂ%q³5\©Ø–Ó;rϼÁ*jôlè  Ôë?ôV²ª%íK!}²a¥cŠðIä…õŠÌ¬wlIýŒM‚4«pI`·å…Ä$yAG,3MrãÔnñwJXÉ0Š2¿¿-ª„êmGˆ0à”R‘wú¡÷eʸœú­Ê(%ÎmÏôoòâ‘ šK+¹¨› °sÍß…ÃM[ÏÿLÜ¢ñêkGɉpAÚ¢ÆU8;[ÆõEšhWéTA&­\ZÊãð9û^OÙðÉL Úoò—©A=mò[Ô-™ ¸–ñ]¢#×âfyrâûÿzÙ7S8d¬™xçx̨œRÕ@Ï U% œK zô#RónôeäÏóð-ø´ŒÓžäîíxbô?ŒU6‘g?¼<¾”†–#Î4xØÖé=jÕþd8¡J¹RlæO‹ êzßY˜ñ} аnÆr®±ý÷üüŽ’Î“’¿“-™H{‚Y"é{D0P›gs ©×hã;§ÖAp¥°[ÊR2 ÖâI×ôMó@·çqÜL¼ŠvŸºyTye•­L½ÁºrrJž=ÖÁËB/ÀŒ¡íX©ÑeÈx_űh@^®$q _¢T“ÑÔ(.&ÎÎã3»˜7+¤”€T»©úôÚ›\‚ßνvý§?ër‰-ºÖõêÍ»£¶NªM¨¼¿4Ô‹'*E2n¶Wn ê‡V¬›Fåÿí"ô'AcÙRˆÛÔùm2° ûV©gÛÅP’Áɯ—•ÁÎjñ§ÜG7nåŠ2AJéÞÄ+ûAZM\É§Ýæ!ÌÔ×µ8U^IŒ’M÷®?q²ˆ Š•Ïè6™b3ù¢såo¤LŽÁ…A*ðøñåu_(VÃIj‹mzz·~%ÌS¶ò ŽÉOìŠØh­¯43±ìm/[î’ˆpˆ±„cH™ÉÏÂåô˜_çþb$‚MÉ"ÜÈL0ÁRzɵ‘=FyQ¹Ã;fîcûÙÆk~Œ´KMÑî6¿}zÕʾ:x4\îÆKûmN²² ž{®Ç³O©æcE¿“µP¡š1âœx]5˜Q$é·:¬0aLgw ®Ñ QR‘kRö^1poúF”²ï]´ØÉ—Ô÷ý ìªå÷S¡m™§»jS’ÌÁ'ˆJxžxÐÔNNRQ:öŽ£òFàøIG|ýí÷ÇÀû{?èþ¼$2œITY–pà…ØYÛEÉUæEÔ7LÐmïÔÉ÷z©qÙêËê!ç‹ð4À W„Ç[O_¨Ryx ðÀð=Š¿A(‚ÿOn×7|8¬¤oús‘‚Á ØÔA 1aŽ9H®Ë…·.@R¯Ö]ˆÀ#³ÏÛÝHRS*ˆV0z!eød)5>g§Œ£¢EMŽ«©"ãWR0 )è!o¹âaùkòùAíQiZíç$Š¡78KÑêÞ| tæþ+h éªAùmbF°ÜÀ7xpj[L¨ó1ºµ’ñ&MòLq'š¼<ôlTÊŽ1à`ÿ4Q!<ÑÅ]1äŒû—ñ~ÎÆ#Ñφ@Ø‚™Ï ºœF'ñXlUžp=ÄÉí³°|´‘Á $[Ì %z¯Ô,Ä—õ)Äú—aSÌà|ÐoÆóºÞ¯P>Ú¤JìlHñ^‡5)õF„™õµ$hàÆB¬õÍ>ƘþÔ,ëuèKœd[ÒêËðfOòߨó¯ð_-–1á9`¯šJÙþÌÚ„QM:¬–DB7Úž¥|48É¡þ}¤6¶$¹C©v™|Ó&°­Úï éN^z…ò[ï9ÒÂÍÊØŒPë’ˆ5†Ys:1À)ßE‘“»V;†%÷æ{«°#Pð€9@˜Ç¯’®i©6¦¶(²R÷C˜“ïV›Á{ÌGbo´èqŠ@Ó€†,Õ< ®ðþjm²õ·OÇœñˆP¿`® õRoì„8âìi8NbèI%ÜoI“éOçD$J0f7úê‰Ú-ã;µC¨ý›|Æ= ¢öi¹Eá¬CîÊVW¦ú¸Øð)1Pã¥íZ VAÈ=ƒ3iaéŒ9E@“RÃR• LÌô´÷ÚÔWå);zZ€ÆêÝ›t(H¶ŒËÔ¢…w8ÊœÆ7üÐ \zX Æïc~[ú¥§oÞ¸äñŽï¨Þgjר‡×oxÒ4*c ©<¡•†# ,^.dí}‘ ÁåùòXæcâVM–GÇ𠘲Ô@8¤QDLŸ¿z2±]Í1(\mt)H”üèu‚Ëö=ÅÕìÚÑ2\¯Â2%ògr¶k1$_]JB-økeÎ!`v”ë(-ÂH"ÄSÚ}ц¤ê±S½9S8)“N¸+Í–Èm¶Ûp¥© I*â¼rTH8µË°c] ÜÄ ö³«ªØ9BS8/T[«K5Ñî•LCöGSÝײÃJ…NwÆg’…G,ëÈ“Á ý ó[,æ8ÙŸU|Os¨\Nž6Ý÷b×Ü4©Õǹ҄È[>r#Õ£|ù06À8³ñÇøjŽÿè61È1{ÅðÒóßÅé=§ú¯9J9c$ÏÇ¢·¼¡- ‰MT]îCb=naí»Èñd´’þ}àÈD#k¥E~‹øè*ÚÅJ<¬£ƒñ%ÿÏ´49Cüm³n¢¯˜†lG o¿Ëo—ÂÛ‡5“2=ösI \ÿçÂYèï°ñ²Ÿƒùö1 Ú—ë}ZÖ ’À8nXàË…Á¨u”(Ö2é@A´£gSâV›Å“3rÓ‡â3ù§¢bWI^ÉÒèI¹Û”j¥ â²(Úp­àwmËâá®ÿÜ—ˆ$v2þ«¯å:0—Í7hë¼”v£rªïÎcŒJ¥Þ¨sÃøÊf&B3!Ø7ÐzÜ%¹^³iUmÜiöÄÜ­Ê—ï7ÿ…’.Ÿ˜Ó¶A*d%¹KÊMwÃ3 y.a×”Æ5ñrºÊÕ¥aóÆË$Ù="­ü6v§É(Ûd¦˜¡|´lG‡¶¤”1+TœÓtbÞXQG¬óñÑï]Ü÷W™èæíÇ*ÔÚËo¡Sç…(Ûvs©õô/i£µÄ |x…Eø]73_öÓU"ªuÂzZâÄC?cOSpüß6Ÿç'¬(z$Ûu#º®+Óšo .ÛA)%èlÀ;½¼U$¿L'y´æŽ-ÏþõÑ}9§¿3y<¾$«_»Ölôz ?ÏŽ¡5À^àºõçNïÌ~iÅ<­:iRhG0WËxûM‘æNŒ=ó"=ÓJ›[jMÀÇt×Çk£’°!’oP¯å#‡më%qOr ÿ#–S¸ ^~@螉I {uÃ×’rÆ ]² ÏC±^£:Ÿañ#~Ë‹Æhû`{>-zP‹ X8‘M¿X×^m—…ðˈøø+Ç.;¬€³--øŽx ‚3­äb[óâ _V‘Ošf´k/G fÃ/ƬB©—áøEu=$²°ÆtÞg4f»—B–‘û.¦¿ü2läÎ8/PwYõâi)­iØ:¤)l1ùwm¹K`ž§ê/ú‡¾‡{ϯ©qíF'6_¸X¹3¿ÛÌʾ;œ|]j]ºy¼)œÛeC»—c"RسP[}¨¹Úv Ho„S±Êи0Á¢ã&Ê#-n–YóÉ*â¼ k´¥ Œ¾˜$ÏÝl¹—ê#i)zÛ†§»ßÖÂèsÇ4aT‰»¢õ¿üxgõn?]EÚnÍòaà5–ž¸&$Åx­9Ý ÷nМIT–á+Ûãµ~ÙòâÅ‘­¼ VÛѽ«ÌyŠÑýèòð[2tåù|qv¬©{[i<àù}(?3Ep Vãu³NÒîæùLá'aä7Ÿ\Ú/óŽM ǧÕXŽ@áŠÜn%TÅ~[ ‡£ü—;ÀQà +šˆ¢P…ar¿µ}©ëw)×:I€8MäÈT4ï.#ü \k7^“t?Å\/ù:‰P{+˜§ýÆu*¡IT¬ƒJ:™ªF—{ŒíBÄûN¼3dMÅãw|„šzÛC4Üý}­¶ÇÜë‘,¥Í¥Ú5ˆî!ýtKëªì'žjÈEî+ÀܳK 8¼·#Œ…µ^S[#–Ùç¶;mW†oQÍWŠ9õ¹Nýßëx[lÊ5TÅzðí8²WM (ĺy âéÇòüùʹóKž8ûáâ[ë´û+[ò^1øÄŠ)™± W6pÍt¡¦f¾Ì«Ù@B„øðâ€ã9žùnÐüŸX»¶,;f9Ð’;Ì»ZÖÁ$Üßfáútku}†.WwL49;ã¥@({ð:mXkÅߎž<lÁ)“tY4+DèDKmEX|/ïƒîÔó\\àD§&nb‘èÐÚ;dÁ<´ù×X”ã4ðçC³ƒ®õx‹pβB`NJý ¹ÄTK“•Bb'oRØàpM¡[Ù¤?Î…‚>jºç‚Ów»:fv|]ù°|Rb@.[Ë[4‚芫°YšVŒØë]˜`nhe ñ f¿eG’›¦„D˜í7‘ (±a²áþµl,ô [Qfß"°e4Ú~\,’‚ˆÎˆ§RÊÀòõJu«.{ c«ªv( NA`noÚ8ô4t ô¤­W¿ì&é‰![õŒw%bËÝ:lþQv;x!¼ýqr’œ•6†¶È¥c(7[„ ‰|„Ã= È\ÒË8¦ñ|¯¹I`U÷©´ô»÷•ÔßèïTtßãÎÊù͆Þþ±Ø%梷à‹ÚŸ¤=äõ Šhúþ7êžîÚœ¡Ç ¡ ä"›µÑE;]-…÷µ\±ýu>ư=Ãís‰Ô¾d˜ô™jb ƧžŸÈÂË ƒ‘œ è÷¨z|Ôƒ½Ü¶Q=N\1cíʉäuMŠ¢9 |‡ ­¸èëœN©rdà13êû, Õ‰~•*?èOz„ÄAP­ – B 7hãÌå—h¡òÍîtk~]8œá_ßcã¶ë[uçÎ ¥><[99ëÊ>‰±40h¨ ä”ZM³%yǶ‰|3¸w¯%(e:¢_@%A Z²½G™F0äÁ‹ÈŸðùÜa/LèLv(nfÒ ‹sï¾Ê†¸‡WÊÔRnÔV= ¹È3›<ÄÖ.…j+cÊãu»±nÁ4ä;GEÔBI&4ÐZæ•T•S©CÒ[„þb*`h NHáñ*r1î«”Ó¼|ÍÜ‚²I!kK5$Q CÉ96Š^=•02ÕäB¼¤¿aÿ‰ÆâQBm3ÖN)²ÿ`+Ë6anˆf™;Q.î'‘œmÔD~Å™&æ(ü`lF"ÃÓ –FU"î 9 »®}%ºýÕû£y3„²ô¬Š Œa²KöÃF‡±eßOˆœ“ ®xµ¢SP˜ú&‹Æ}øçPRV=» n^ÔžMÚ>\CµŽH! ͪ(èVUV”ñ£`i¡§z$5 >å^¯[}dÿˆ)(°ªtõáÓd#Åv¬±A§‘dòyOɈŸÚG° x5f÷Ÿ¼ÑtŸU qìˆj*—ZÝ 40×Õxù äÐiíLTÄéQí·žÃ¯³aeç&r@þ^Oq¶Oª¦ôÁãŽý’¥ë©·ì‚M¸…²MBø apZI¥Ž¤fÒ<· úÝuîÚç¸XáŒ-çj+´kÈœ½h£i¿˜Ÿæ~þ%\ä„,ôÏnÊX[¾‚’˜¸£€G¹îÎß&w‹ ¿æIçRÖΊg?oÀ¼v ÇéufJŒÂ|·ŸÖ^Œ`Ûˆü†žGȦpw¬œÏ”C ?tP–”‹]\v)õéÔT°9a+»äÒY}eÚW_vÕä€ðØÀJÃŽëwr%½¤I OÁuØì¦9éi3 Ê†ï*@¥©ø\fžÖƒC&ñÄ•UP¢3q߉,É=r;T›YùNâL#@;âeYk`\¥—7ƒÊ› ·2®ñ>„èÙœbìäÖ§ÔˆK e•ÉǃrÆsšÐäL² ú±Æ§€küÙãsºUs5¡ÿŒô“˜%BuËT}é¢6Ks¨éXE’Cdz¬òް‰œC¯Rö0È7“5XUó‘’rÄÉÏÕÆ§ÓÐ%Á€d%Kž~û¯Ôm°Áù–•.%…Iìñœ;Òöç‰Ò·Ü9À”=¥;è.bN”BÉ”¥?¼û“/à’€ÊðU¸ª x†Êܵ®Þ Ë(¬}Ï)xWdÀd„&:{A¨t9™ðñÒ7‹i–ÿ¸§þ¦ˆ)ŸØ x¤E›mMÙ+¿„Æxb7_]š<§PÜ2žl7‡(Þ(ÎÂUÀ;,sÈu]² VJ÷X ÿêDF\µ8x¬æÛL(××Qlxh½Ž3ÝO2x§ŒŒi³o‹i_ £Ä›JH?{3ŽÏÞ½è/ÝKø\YžEï[Ö¿Õ0Œ]ô&ë,2øm¨ÞÉ8›÷)¿'ÛWÁ¥š´:ËKÿ¤‡üÿ­5¿Ðf“]ŠÕø^1'‡¹ô13îà0ŵ<#Àê’þ£p=ÝG3Ð ÙJ µV•O¤á ‘K¤©Eª^w!É¿®Á)ì?s´nYd«ç=š˜³¡ó4|?QVÞßÉÕ M³žÀþ8Á+.ˆêCŒÇ΋±)Ї$~hS’€*>P@€Û¸yçš69¹2‡ÿ†tjÚdcúîÄ¥cÈЄˆí2—\-‚Í™ƒ4çwÞ0Ü5ì}ô.á ­l¸!“·Åúh ½šdIšw:Is`¢5ó:ptMa»7¢¦?¼+4ɺ *‡·2°4'PoºES½&ƒ¶÷ 2*#ÒI`Ç÷ô¬IÚ˜÷«À‰w’ˆÀ4›µÿ\S†<2N{öÅAŠn­ªz+{\ïÌÏœå< '‚ðáVjqø$\ÕÈzìDøó,£Œ'S+èî§z“£t]¹Ÿx…™™Â=þkb¿R€€Â{dï ÐZ¹wÉ\(§ yżQ1­õ·#0nÜO³ÎÞ¥+2µÚR…'E'D» Uè½ëæœ5̘&¡ì•$õjI\¢;Rðëß‚FÖ34b›Dì¹®>¤?ÈM€b"aJŹÇx&‹Öf¾qBN ÷ýø†D;³£ïUNØNèö;”ôÔE“]ÄQ"mñµ­æq›vÀ «vs"èNæaz=}‹ÕŸ]×bæ¡@âÙAÞM§(¼ó¸´Ö€¤–˜kYŸ¨*èð­=Òb«Fm¢yû`GÈÖéCÂñfÏŒy€ŽFð ªËÜ%¶ŒÇWgÏò _˜´1#bÞãúó.D.ÒÿÀñ+ªö?n&ÊAI®ÍZ½Ú56¶(Ó«¿ž¸ó¹µŠ­cHN/ ŽS‘Ñ HJ˜¥¤vîX ƒ£-Ï‘«»€g#à' ×Û®;…ÛÈW]óô_At†-;H®ˆ5YVÓÑØn¾Ò Y"ûe?x°¡³³íõBzÀq o´³Ø?] ƒr)A€êsv€ÍŽ‚ gãN&#t[Ø"Ž"Š5€ëÞ-HZãôžëDEíøÇz½Šó:c½3ß…L7KREQ2èEKÇ ÕÝådwW¤;‹HÂ4Û)Œ¾ñ¶tzQ¼è–úÄ÷Ÿ †uM 6×׿8vŠ?_| ¼—òÊÀÔƒï‘ð4ÐZöSa¨µð×1îëîV ¨þCæ6 ¢Ü-¥»ÙÎF”œ³x$”æ¥ÿúé8Aÿ±D-ÆÞÞ+¿Aõq¿>|h@¬Â–dÔsÔ,¥1£Uaz0 +v榥ä~vÎõõ¤Œ›×–¹Ñqù«´‚ª8&¨\Ï3 ÌîÚjcñ’ÓÉ”éó{ ;ìk¸OÙð‚"ÅŠ÷T«~;±sãT2èe¹ü—#z£Öƒ§dq8ö„Pn˜hŽÐÐ6êÿˆÅ¾G–¢ÅëÊ%G€Y3«™I<œ"/‰Š4×üú–H‘ °>9&7b´ˆå†q`DØi:2zjeFÕe@.äþÊàÆQqZ¤ù¶jø€aÇ¢ý#¥™Ñë"°h˜½‘Œ 炽‡¸O…jC}|׉±fß ýüQÆð}G ,ÇÄi×B/5¤°Lô€5×ç»å<¿`ü=¢ ÝÒÌ®¬0”Úò„¤'¥ËDæÒIE˜V ÎÜÃà-ˆz·µWù½!—ºÕ¬êœÉ­âÎׯ`-<‚¾](m;ÅÖtèÔÍ 6Û›ûDùì¿îÓÞùøâžq{°öx×åý}D'*§ ó î k¬ÞW¾hT~aZùæ$ÛèCH/S=OwçzIÉ_‡A÷8ë9%„ó-Åûy£Ä;«\΃Vé¢Ó0¿g@æ„¿-’äÀ«Öÿ}\²…òÔ_$醅ékl3Õ—•6›ÒZ´ÿy³Ã¢N„~âkwG Á•Gá“æúwöËfáÓŽ²èHJÛb6’ðe úæŒM<Ù0„¼þ—ß} C%€>ÿ1:‘‘féJ"ˆX¢l:ÜHÍlï“ûÙʾõ•VS%`$d»¿¹#«…¢Yi­Ô•É|×+?]‰J÷ÉEëL8‚ÒDëË3 °Wgè¤Äò&g„‹»Á`Goà‚9¶J1p±&3ÍqဉSoJimúbwkÕL [èn/­†ŽSGHP˜Ã[o‘Fêõce4éÕðøí›HS7çFžˆ×'&¦S»0×â6È*ƒ”:ê!Çé°bôr…êµv1ãm’Ò4—/L:9Ãì¦Ñ b_rêf¿Y ;~¤³+D'™L·e¾RLYަ`+ìñ-€Â޹‰I€4Øá„(wõR0N<ã†Ç,l5 ‘’ènôZE'H/õJ"$0l“ÇE yÃä:€œŽÉ}î#f˜£Q¿j)Im!½æŽî¥*:Y 5n7MÓdo{°´ìzÏI¸'÷Rœp)l1ÓÔN”Åo­AåäÓl"þÝæfÇ ¿Éª3™¢ZÕš ã}JwS"þ°…oý[ß4Á6ÒÎù›ìI^9ý–4õ˜ÔGi˜HäøìÞF0K»|ƒ;LµDº¦’Gim¹öcv›4³ëó-Chù9up–Yä†Âm¥ßÅüp%ˆV/“®Á-õ£'0¹u ‡rÉL¥Eø4øÞ‰n*¸øÏ#½·ø×‚Ã~•6½ó¶Q&„|ªQÏÍ œ½0û‚k æZSè_'J,þ½Ç(ÀTHù”t‚íÃ=k&9룬Žb€M`Jóc…'HUòß=hÞ#»g'?IÙ—Ám), Êj9»‡o¹÷Ò7§ ¸´k›…çyKYÙp™è¯;¦šÑçEh“#Ü׊=ærVï°Žn袋•3à‰‚ášÔü?ôàô#F),‡ûÖÀ¿¾%v„y”cIXÔ—{_„²a½öÎᑳï½PÊ/uÅTnp¾=Îáa<”—AŒçÚM˜¹X/_D ºTø©V¤ó«Oí¿ðC¹)m<-5…×rq»ƒÔäí·\k=k¨:Ôø/t˜ŽrvN^-F…Jï$"‡‚`«.ÐØ ¬ñMØ*Õ¯›L';¾™±Èº^“¢ˆî&ͧA8…ó ·Ç«T{Õ­KV{ç ׫Qö©µø£´—sÖåïnð_ÉåžìÕ‘l•Ëô)A@ÝlD²ªd §œ “NTò¹.O—ÎD%ù‹KÐâ/Ù¸”)ÒèMÝê]Êá z«KH­K6=káœoØØ¿ñ%îî ´8 – ž;÷yøóoÇmáF’À¤ƒ>xÙ3Z!qh÷€5Û,ÑÅk’]²½‘c«~´Wº³Ÿ|ëT-¤àM£zŸ¨ªf)êÈj°÷Zq¥ªÀ}PÄhFOã!71æÞ)¬s ˈx«Âl³ËHBÏÂBìƒå xÞ9Ì<Fµ[)·{H†z®™£ÉîÕĉƒÿ¥ë;–y1A5ݰ¡Ž´±œ®×ÛÜÐv(xËÉáÉl•Ö+”d¿Vp,!Íh­¯^¯ÜΡڴ´mï`«”¦;Þ\¢ |aRyü îø4¬±l¾œ QÍŒÍ$•îWTVmU{¥¡µÈ豼 ïFw­ªâ  å(Á0`h)Ù}°OïRI¦ùWËŸñCØîP˰ç{°¨ ÿsUd1?#&˜¥‡RÙY`qÍñkþ:݇.$0&JBŠÎNéºþ1J ¦¾à‘ã9M´^¸ê­¤æuϲÑÀ !`(ô´1Ûä?"'«|%a[»¶…Çj(>7—kÃx 1½¶ÝàÐkEóe޾ƒÞOA@̰#Ð"Ô\ ˜¿ÞDË$Ȉ[ׯ«çäsP¡ ìí‰à0,¢ÝœççŒÌÄXy@¹ÒÓ¡4²×¶cfÿ‰ƒ7z%dqØ7Ì]¹oî‘É󆆇µx¨ºžY^ÜïN˜US'4ICIu³mÅ­6¥¨Àž“ïÀVm¶M™n§WQO[Íse}ZQHà9«Ë?!`~FF¢™t $³Û³ûî²ËDޏ¯†–P^\ÛÐ×øäFgh’?ÞNwa‹ž‹>__èÔ‘;j‘§âJòg µ’K èwã7Ÿù­ŒriâͲ}+ë„ÛïäïP2¶ÀÄ™°Qr=°ˆïmÙWãùLˆrø¨-pnFãm’ ¯ÌŸïæy™›Ô¿Ð%ú|í"÷ƒT_@äÞ "€íåx ©pY´:ÌÀôoߎepR9³‰U:µ6É™™MÖª·ålÞV± ±“nJsp¤jtœýqóþïqLíÞè¨xÍ–‰½ ãQ™fFÏââ¾ùŽI§·ó@ ÖJÚ¾bçAµ¸Ut°†S²`·È¹Ž7Zfææ-§ÀöžW]^ù qÐ*WéÂös7»p|Í™Öç}Xôú¡Ú\G"ÒéŠáY[‘Ó;C!Ž}Š–ã¿D”‰ß0/¦Ã€ïÂ&cïØʆ‹/P(ÏÝ/c ÁÕì8Ç#váh[ NXˆ¯¢,r»È®˜™ÎÐxæšó,êÑ@:!¶‡f©“ šu@Ë÷+š€jX^àˆyxר¢v;(¡Q¾i! ñ3×7Óg&}RN]P˜§|«Ü%½rù†‹=C…Ì? ’SèãÍ#ÙG”¶v i×óƒ®ôŽVXqj´¼T,W—TÃ>ÏHÔä{:‰¶RL”n%A…0g8æô;Q”¯¡ÌÁ|­Í÷G¢¤…Ûd¾f"‹ÞÞaa·_ŠÉ°Ÿ;à v} o–äF¿VñõS3H#)¶žý¬AHê[sŒ»²ˆ)жl²{0×Ì…´B<¦7‡ËÆ@Sž½ÏïJ"9寿ÁMÒÊt Î::KP@ –„çÌØ)–gOî²_í íó<[ì%XzÐÑB‹²Qbº}&Ë«xíF÷dPz8:eÔË-v¢Y‡po4ŽŽ¿„0»ŸëL‘LÈV§•íûÍüâÔJ¿%¤ÆÂÏÜü“¾nØ<öe(’?Ù:’¾îâD†vFñÐé+ªº´ÂCl¤­f…OÂBA1$kk³¡ÂÜiUm›Ý»Èn†aàƒž˜c,79H¥_hHešEi´:xQÚ{à ٮEOÃ'`cR>øaFbÝ‘- 0vË«ò“ paÑ–{`B+Û~¡ªdÐàìÎZßM"„ÆêÑ ñ±Ø.Þ]•LÛž‡&¬š5±Uðýd°ÄBÞßv–C f¨,¬ìÏɉE¶³R75˜3ç <´¿ÄŽa–.¢¾›JØööZˆVOÛ«œ¶çJ}í&Á£^çÏ,J‚²c+»ÏŒ8þµlÃéêÒÌ»SþBKè¾+î½Å'ÄOê€8g,•jŒñ[F ¨¨¥JÄ?·®–D|YNUVe]ß¾º¦# ­i‚-´K>­Ã¯·©e_Ÿ6îqÑ«öÍ2¥Ò0s0ÁÀdõF|†ˆ/48#B±:N!±úá€U—¼^0Üëî‹ljœ Ö ûr³]=“”‰EÙ 4][ÚRµf¾CóæÐ“ ìG"_تSà’¡£C¬æIÀï¡mÞÆ[ël,þ٠։ܫ‘0Y¯X˜ž$Ô/O9EQSU–¼¼TDÄ¢§æè¿:´òŽžø‹¾)jVuìçÔ{|LÌŸg$¼Í q2˜ù¶¦äÄòÆn¡êƒyþÓؤv¦øÁpÞ§˜(!F¡Æ‹–k"ö ¬„¸EqöØ¿¹§ÌÕù¤,–Z1éy7 ¯RøHq cAUeîAÒ®”Ò›òcôEÒµL ¾L¶˜±Dc™¶c¿1<žHª»Ô°Ž—â{êðAÉS‰þé ø¸‡ð†¸Û|•4 Šªý¡¸ù$?ôµ¡´¢@¸K„ásYI샜DsôE|ÇnO8x±? mx4Štü!v@`::Û+DOÖ AD—e›½‚í呺ì»8$Úä®ï˜:¢ìŸU¿?“M˜:Ôv;vgêPxœñ²}Ù-ìc±ãæÇô4 7¡«KZ E9Â(Ý‚\qxú>‹BÚ’€&b@g×a _tÔ2ödÏÃn.„® DÚŠùnS2Z±`c )J&£X–´%ÿÂÉfì´wÙž¶ˆl…H3Œ’kzC!ú+kQ®Ÿ½2™¾èÍßß7 拉*f1ŽkaŸ 1^S §Í¶øŠkÿˆOªaÎg•ú‚x¢K ¸ÝÑX}x½ÀOë3½1mÓ6[þ¸¡-d? ëc±?éò÷/“ë‹ðËFæµ”=+ëBæó­üÏ|©9»QêQ²»àEાBü†iض‡¢õŒÊ™žœ¼2DÒV/`›dé$Õ·ƒŠ<,ÙÐ/…Vb3ô4vÐÌ%‚®îè)ª:#>×Ï8̉³1ÿ©‰‘çÖGÀ¶{=½ÌÃ¥A–¹AéðØ‹“%|Á¾öU,8xK€’Y?\5ùdª•¬¸bb‡×ÌçÞ¤YÌWL`®‹åËôàõ2òù!m¢"ÀÑÀγ,­— s¼4Íï¥NpŸQû³ÛMЈf݇òLû­9˜;8Ô¥#?*ÌP/)ï†tø_ÉLI– iêq4’$:¨Q6tÐɤóÛÉëð}ÿÛ4^ ’ÜxÁå²iMŽ‹á“aÑjumêÔÂvž¶ø®ï-m>¹½/q©½v\KÀQ…8oü½»wàiŠ—¾ÑÍèî¡`¹ôF¡›¼£ê§x›Ü%æìF úž+‚óíM'OÉ÷–˜ñ‡@PáQVd›AwÓæ#=yò|¸yŒ04#W6rû/Rb½Àíùö?éϬ‹ðT©¼[ì:V·<2ç/FÖ©¬ÅŠ#ÿj°Z0´‹C‚3ìˆ~ÁJ¹Ó™„ ÚjèIÿ‚ Ãäl¨ñ{ñ¬«È;È€‚#¦@5Ð…EÀùdJSðö~âxK¸¶c¤?EW²ho(B:Ê8Ý!r¾½þÞEçß`¥9&!Æ_ÖÔÝο H i} e.‹ ,CŒKM@îóè{ÝÞ=€ÿR†ãÕªþD›)v´u€Qnà©Ô oÊ”ÀŠõ'Åä»´{ñÌ*XúJô÷6ëÌÁ¡CHeºHO¾}#PIåÐqPdÿÖº[ì¦ Æ´…@³™9.{x¾.txÜ“f“ñ´šì.ž"é‹kdœ0jà;<¦ Ñžþøç×®T=‰dMäSökÇÕîkÛá$ÃÝÁê0o¹N´Öâ‹z×^' I=i–³¬a•š ëϼAmZ/þ¸™I¾©à[¸sd!ä€ f[]IQã ûé±ãŽð ¬ôÀÐÕ ”¬ ÛƒKÓ(VwÄ#ž…åReO_8/iµ» 3lk$ׯâö’–þy3H’hUåšBG©gòÅáqS_jDˆõÄ[äq_„ºú¸¯bÞFCwÐßnz·;Ä›…’µƒÿ¯ì˜Þz“~‚|¶ó3Õ…Eÿ£‘HÙé½.6䆙ØPzÕç¹æ0ÊEä J6i¶µ‰7ð`05ùÅ{œ@$€ã FN¦¿wY}NÊŸÏd-i/, ÇIK¾pžôPVðù¦ƒYp‚Ù£¨$è½—¶¯„Ãub³±ò.Þ³l©ÊA׬Ñ)ººy,Ù*6{9³ú•ë…5âf˜ç°?“ƒ«°PHùþhR——]²_é2¹nd¶×5p0<ý ms÷ã6üå×íü’X™q£ÈF—Ä«±qÌÔ* 0Eù?*°ë­»ÞÞ”g}T=»ÜçÃùÑ¿@“‡ÀÓÓoÒniO v ’¼à†h«û )0¯mŽÑ¹2%€c¢›OðÆ¹ +ѵG‹W2Ôw”…9¤×3`+´ðϰúï ûÕ'ëÁ½Ç<ž™xp°#µ„þ.±çVpÛõä\jZ‡1Ã,C'b¤ýªn­*oÄpn::óy|[µ›PóÊÝAuº™ ¯5­5ûfýƒ ä”_!ÏXaÈâ~€ÜR™—n_OÛ¶Ë¥]ì‡3?¦Æï([¶Ë° €u¹,‚[UhXÖûœÑ`·ú1Fkßü¯#É?ïmzÂÛ£¤€ÈÇÍäò÷’¡æèº´¢G°—Ñ=€9ÚØlmÈÔ)I•¡Qh¯­âfì䮲¡ôžÏa"pøeXk( ®PÚeþ¸™õ›A­øÇMªçF5JhÍ}Q—~™&|\Z¦öž£ó/x§i=Ž~`'ÈÝËUd½Æˆä²•­@ƒkž4¾›pwŽ‚!½žg`ok˜ÁF§wþH&w½8Š ^Ð6UŒ´éËy¿P Iá)Ã8´Ñ*![­J„áÝ=Üe¶ÙéµÎ<°“_Z™/a¬™€¸B)Ê`\õ “ m[÷º¦æšÏÏÅi ²ôIÜBø\ßU· 4–}ƒG®ü• ×NAöØhÀ³Ž9Â,–.sÔ%õ†+{M]XûT7€)iûî-ª«6(êÂø± ±kDf¬ƒŒsćžO(°·ã¨,Ùâ¥`yî b&##ôœ„KÄÛê'T¿N‰÷‰••­~ˆöRá`ÌÑÃjY-’¶¸¾£ÊÓÌ£×u‡5‚bÀ¦8X=cPõµÄAWNvOå{f¼Šnï¡áª3[¥ìò>Ʀ۠S(<åvÜÏñ×ý9ŒÍ•ÜQcÞýÅðê)}Z|Jsgýÿ93h>êù¯°æ•:«ØSÁMao‹ñÉÅüPDõñ# Ñ3™àgzöÏAß È Ôd©bŠ5 \Xô"†1ú¨ÆËq̪ðcÏãûk¼69PZ™¬&wºìäáÎùÀÙâÚ¥$>4¥¥ŒqóŸ: IŸg@µ ºªüôðù««A;4'e]¤–Â~:?dgy t) æË–çg”K66b­ù$Ž>á—îV>ií»÷Ÿh2¿€ô‚øÞ™S° ‘^•>E9®2e8‹(p]¿ü} ’Nw™ÒǤµœòJ{fùžä8|½3åÃþÒ÷Ùbà}œŽ*Ë7Í#[¿OiµM•ìÊU¯ÿRÏÿ? 7·:‰Nfa‘'‘€Ôöו¦S/˜Jü—/z唄MeªãŸn{VæQP$y8¥¬TPâ@TøÐ5ˆ~›Ã’\Džï–ò&#Õ›'¾¯+%l¨Ö!Ž PlÜ2ÝçÎ |ˆül||"¬‡Éƒ«Ø q™þ"@™†²GŸÖ‚ÿèįØë½ñôš^ô†6¸ü…GƉQzøÓ“Óç3éXkYµE-%¶l%¼š£U¿§‹Û¦,±+þþK˜¯¡ëåx%@D‘ íûâ©Íƒp/YY·U2 -QþâÜßLßÁrŒ}ôªtY6vÓ2ÿ _ß©©â^%΢ª)XK S%•n^ ÄE;Ó“Ô·êE¬uÑ`Þ¹ì®íÍf–;Bjd±8+ZÁ!SB†r·š AŠ‘g¿.L¹õÍŸ}ðaMÌïÇÏÁŽS®ÙÓ9ÅãÒú©–¿Iî]÷J§å7œ^6FÐØdŽ,¡¨ãïk±çÅÞvšÖæç†59Tƒ A袨ÄZ–cüåòäâ„ö¢óâ’ÂÆ×¡Œ"%jÁX÷Å^·!äÃ6 øCc‰¯º–Ú,tÛ* •F9hÎßgß_2{ô™Ð´ƒV\{̬L<`Œãl’ —-äðBnÈ?gEÜ3š¶°^š-XfvG¥tòB/¢§[ÁîŠÝòó }7ϨÓjiHȵºN Æ%¯—Õøcׇij‹Å›©»Ç¡•H°¸?CHz”¡äFª–»!‚ççÂÐøÈpü;g7;ë3¦[œäšôÁb^¡±brÑ~c]Õò»o"x*xŒN™.`Bh'œ“IûKM2+†WLºFºéÝ+`hóý#]'vdÕ^ªu8­‰/ E¦ &4úÝ#‰xc"¯f5 b²æš˜\ yJÜ´qìÇ”ÍwÔ‰)†<7±m«åâÓä ´ÛHL.ðz éN)¹EfszAüî³4³ÞF,Ó·¶¡vçtä­1:}A]ðÖöÔ[³9‹H  V±µ•7êÈ,‘0é;â>‡çqï,qB@Ö–gÝó}(Yú̱E)h a>f¡ ¢—N ØÉ6e¯¹ÖÜ_ùCœò«ë/Ô~Ý”ƒâ®Ï®‰“Ïfãå¬ŒŠ¯Ëq“ØÇžFš+@Žõ¢ÊN¬£Ù¼ÑCüÌúÛßQ²¸át€8Ë^£Ìõèþ^ÒŸ]»}†õ®pÁ\Þ®aÈ9’H­Å]… (Ó6ÝCæ·³\ŒZ±Ó Ñçú{ÇHO*-$KÚ›F{œYûòµòRe¡¼Û´ s½ÓŸRp#® Y9˜®eyßOӘܢ¶ýñô{íÁE´ZÑ: , ÑwÏÎôÈëð*³ÈÛ*Q“*þòëw0 p©×XZ!gZü­×&;’Ù‚r¢~=š4M 0ŠIôð]£‡WPAæòläfSNȵkÿFs¾î^âÇvDÞ€—¡wVPì(Zæ†ö¡,«žòÛcz¥ïôŸ\`çˆÔwIË@{(_uwRE2•¥~÷HÙuì²´÷õMŠM¼\ž²ZõÞCýxŠw/ÞËï3E–v²f5°ÕâDXUZ3?I+Øî¿ ¾Ë°”@4o·ÁYÜÏuÊðâUÁÝ<à㮈·¼t;¬>î‡b ȹy=¸–þܸt:FèÃA¾Mÿ?Xr\öÙöa¼þXÐùR„hFul ~]:”µsWQzŠ]1ïÀzXréÔ(FªÀßžá÷t«º´ëLö–‚F’,daÏN츔9zèÔK™ð|¦åºþœ€dlžo]äzº’’6´òP‹2ç‡ÄÎXÍ3\”¯sÞC»cíYP’ÄZ,¢ïǵ_—Ò6 ÀÊ8·/ŒXhôåºÞ=оß©næK·ËnK1=ìœб|lSJùkT>Œ™¬úQÓ×ÒÌW \[Ë<‘hÁ¼žTÝÙi£Y|·Šábª?¹PÙõÀØr†Â¶Vûwµý';i‚zžN&U*Qkƒâë„´Oó¤oDEv+ÖZ +¶[³ˆ{æ^ÁšÔÖÝGùi’½œÙçŠaaIÀ¸¿üê$5dâ¦' ƒÑ •à ™qHÜ«0]Þiî#ÚÐ~ï]%‰âCÛ”§fÅɦ{Ú·ñH@ÍÝ;hüo½xùoÛɼ `SÓëÅQt-.³ÆH¹sb2<ß¼ßúŒ°Ö@¶O~¥¤˱ Õ¬o,…Y\râjv>é°xQtgé~>êJÊeõ‰š™ë}$ S$©‰e“M›1éà3Üæ÷¹‹§v#Ž…¸oΣŒ>"ÂÄÔ™^B;o¢™.ÛyÈô ·æ½ÈùïCB³í`i»meßSÿ1ºãëmmŽì¤p._m÷`K‚oYÃ5eõˆç¯§µB1¬ÃPØê)¸ÞÍâÑã\_S¨b ¶QpE”z½b+¼M\ÚNÁ‹wi÷‚e1žRø;rŒ°=5ïÏ€äWX ÈcÈznÔ€¿;%Fw´}—%êbN”1ý½Í3þÍÓ‘'œ»íoª/Õâܲ9_R…‘S£_åŠfßMWŠ0¶-ˆòj1à7oqž;òò»£ÑÌßšx`ç…ÿþóèŒ[œyÏ:+‚eÆÐRŸ2çÏ!]U÷‘ÊÜsgý¿.&$È|êZCÀ4H¿Ø_Â#W÷ÄécoV¦AÂåv‹€kp¾¨t+ésͦÁn¶ô^9¸ƒ é†9ýž­TÁ©6Q§°óÁCarP  öÀñœbo1z®òò`\´3ÄlbBºZhcÑK@0ÌA¯‚&•Ðÿvñ‹Dàq»¤QÂ"<·ä<’H15F;”LkpµÓ‘D]æ_¦vüï‚…g4w>Ñà%–| ð('¦Øû&¯‚O™d‚áØ@’›CK§Oö]þï{ò„0J{†ìØÚŒÔˆÒ8¼€ò9¿ã4•û'”Ð/°µvPëÿ'iï*jQæ&Ü×ðé°—šÐD3Üœ çö2”BªupÉê÷È,ymë´5Ðön®ÆICƃ²?ày˜ˆkò[W1 Ǫ!>ª¼¹S‚ÝæÊæó7–cSL36l$.0]%ä !å}LÍ,° ÐnS· 3¶)»c÷/r•'e£Ï¢l·ÓјfÚ¦r}ù¸³±0Õ=#nql®m@´qmÑxã  $gžøú`èÖæRÌ=úœ^¼V’K)L°!Ix´xý;í_KÙ@‡Ü±”¹žñRMÎB`º4î]òïEµÝ?M?©ºÕ;ŠOƒ74ügoå5NMP²†H¸¶0¶s/µ&œK4Ý¿MÄÇâTmIÈë~ÄB§!ýx –ñ:µ*\Ážk~PÒ$–•€Òå+œ÷;ù±m¥dñ÷µcñ (¨!²í¸³¹ƒâÁQ8gjñve)íðMÉA$-׈‹^…nA„/'±L³ÏGGàHŒë—d¡õ*“%§Ñ\œÙ‘¥¬W³òk‡Sù¤> ÆS€ *Ö¶‰Z …J/Øž"ru+@]ñ²·Å/>÷èºÚúôN”Ôå®RœÚíþ‡¦Ÿ¾qiíÎ"±*j/i^*,›¸gìDx³ó‰ßy»[A–=ïž/Kv¶œ(ƒÏ³Kà.0ürÞüß“ù<)6ýp”œ^©Y+Ýô½æ …pür™J¤xJßç˜Ñ`ýçp•h—Í%88žÈ#A‚9ļ؇þnŠE}†;±öÔh@[ê–•ÚŽh³Ï%xï–OU¸â,Ë‘ÞocÃæaoq77•qW;:¥[q&ÞÍn×և鲸ið]5d_1(À/u¡8º) ¥‰3ÂãÊpœc,Ü, ·´Ð8g¥ù– |}Âl.oÍCäÛE(TLUW§›Á0Ú–´eKý+ïæKø›†ÚÌ^«)¯‚$™ [Éç‚>õ»1U,ûzqXH—}ЦÁ8Ïáêò«6ÝÝ#­¡ ö"8}V»w¾T´£…ñ`—•Ëízg ‡ƒ¿çpJût9‹Ê×(ðô8³·jÑU–ï··Âg¸u$`Ñe&¼÷_U5Å‹ÖóÄÏÑ|Å,’~ýèh²è¶< ²/QA/+±+Z„£,‚õ¶ÔGý<š²›%Ô;‡Úê.I²4½>Ë%W"ݪcû}— aú°ÌJlô–…NWDO¾rï#ënü—XÊíÌF_oî?…‘Öɱ»E̱|Öù*ÀþD­Dý™¼rø3fêQ3B™¼¯Ä{Žr9^ÈÏtÊš/¡ÏXÂyЬ_\²œw*°Z‹,Mû… p퀜éa+³… W²Ño(êñ>àXÿâ þ²«c/Pa|õrxç¦ïÝ)^›JÔõ Ðâz/O*G5²€ƒRB™íñi)aPX}—Õ«/<0¹Ú‡ëÐw`Ù&‚±lÆLU &.·èÑõßö|‡ž(ÛÒ‰{A¤–‡”µ0–«8ˆëQ¨SÆ‚4ü ¾xÍ™.l£ìDJZ¢éÊWÊŽ€zûçÅWvΔB æu.ÓœLßÓ74;l8îÐ¥j’\4Ïzf ÚbrŠ Ùj‡H¿d®Gú–…Tv<éEÞùÚUQÍ ÚŒ%+f§ŽAl)éAIõ£uâ­¼šž È^¨ÔÉu¦„ÌÑVT†ªF!9Â~ÊC¹Û>¤äz·vï“MkB¶È\KÛjjwëC…ôN6„d„a– {œ^wXVíüÀ{Ã59îCVC¨Ü®R2ä©c¨»«]¨•åxz„¦Igðƒ¦z†-¿ÂBÿË«Æï‚g×6´!)û’=IzsôƒÃñ]Ñ˧GhEjûAÄ)b¥V9ËË£(óŠ´r ;ê×QgE&¡oƒzfämHÿóEÛœØ4Ë cý$›Óo“}š¸EÉðY–t.4ó²©fLjÁ2Î]ôeAhw YŒ¥àÌÖóú«]‹Ù )h¾12(ü_YqEUÃ3åÿpwm® ô3Çäž RICÌwÂn·^D3âE¸O¥j‰Æ¤Z†i©aNîóoÜÝc™×'n¢_7í_Õ;ˆÇ;&Y’¶™"Qˆ_³ïåôÕ¡m— $úlõ(í}žp0qxý5#ÂÞ½÷¦Žr8á@ïL¸D H´wsDƒÖsÈ¢W×jƒÐ¯/‹ƒì ·÷#œÈœƒC=¸Q1^­Ð©ëbõÁc®Å;&ë“êò%,EMŽà(—ª÷ « !è+/±³Ó0ø¿ôØšÝ&ÑýÅÎáô"²Â¾}®Ü4KÔmæ¹ìDžÿj…P½Dµ‹¨´í¼ðxIÿÙF(R[?¨Õ~ •°üû˜¬Š:¡ù«&k5$ò˜¼á‹¿×¶i ¯É„A$FN;‰FŽgÀçúÎèᔉcC½îiøSW\Ì&¥ß ΢þ cÿ½½)…³Àè¤:~{ñ‰nzuNŠø’‘'=2½?k“ÀØýg'KqžðŸÖ!dK{6»5èW}-pôƒÅàQ !=NÝí32uÅx®`eÀÄÚÛÖŒ.ß;Œ‹©°¬+3^ºj.%‡7‚ té,´ò›ûn=A…ÜOoqòïÆ×=ôúèQ’`FÊó:¸¡®øa¨£Ãž›¯0Í7¼¤VlýØ×,2'Ô@ aîSµÝ†¡Ý@¼S­u£Vt Ú(”M2’ƒ<0I;%ÿ$Þ&âîwŸ"l.PKò,Ÿvrw «k:ñS0ñ{õÌ Dìïîi¥Æ–sµ¹*7ò#­ôL<øvëêö†FTö´L'*‡l_S ôçG„Š‹÷0žó~íÇ–á7 š_‡Cy[ױѩéS­u° ^i$‡õ€Ý]'R¹²®"‚0à²D5qÝ@?ÿ.Üõw,õ‹ò™´Û±¼Çi ¥=Ešd{Þ2%¤b® ¿f…š_aE†ÎIu<l8ÀÙ-#¾ 2­_ç…¾¸I3qm‹¤È$gÁ¼ÀëW­Œm*˜õ>ºÖË'à+ú™+AŸ†RS9¸zâFŠ-nË£ Žš¿Ž;ctп]ýzAÎŽ þÌ/ LHL%ˆ€zÎר0ž×õ\YkhÃhëTŸ¢¬ ŽX{BÒû!pDN±WBNmkŸÆû1Ÿ½ãÉvßqë³Q¼ë%(d÷¶£njÀ1©1»k–j%Ôí‡cLÔ©]½Î»Áÿ¨T9xuOéÂ?–êvPªH1Æ8ø®@lGÛwT)êÈûsÑSús£Å™¿ÐˆSØÛË"÷K™ã3÷vÁÙSƒ¦}·Ž%›U]ä}'uUíeUo?aÜk–—²m¸8­ÔnP!¼U©íÙŒ;2¯ÌøSÞô ýgk£òµû Éª}"Þ´ìë?;Ì÷s0 }‘Ü¢â2íZ—šGâ~é­ÆJêTX⤱ގ¾c¹‘ÄP‘|ˆZöê¦§ß ØtÌNôcøf/BY¯2H9×Ñ9-zíßZ#Fßã±a\»K,@í'ZÂø§à´A{¨:ò¶›‡Ýê]Êá1¸S; Nºå8òB’IüÖ`Uì”iªt’Á±A•- è?E¼ ú”eJ´Œs·J£²AÈ „À«Ö™Dñ®¾¡µ€ôƒ_—Ö,d6—ÝàžÑ·KqŽ’OŽ0µŒúˆZ½p<´g›¨ºHºµûB{,b aèÛ®æ¤fO¦dV¾Û/ÐËG4þEöÌgšÕ1Y‘@êah¬=»Ô!ugI`D´3cEŒIúO¨3Û•ÇET!u¹AÀ÷bmþ»0:sέ„:ÀyqZØüRúb”{vu_QàÍî-¢@ào\†7ü8-¹W2½3Ï,à?E6I>[åœ4ȵCë}ê[½!;s”©ºÿ‡†Öaø7]à,°%³b‡_‚∰)HR?áìo\ra;1Ã|e4éÉÜs#mι µ»Ù9ÅYׯÚ/{eŸÈ·UƒÏ±«Hb8ˆd´èÊ÷ÓEȧQ€”¯”Ò áé ›5ÅÄ&ò’Òm3.µ ]k4àQo@”Ù LfYó§è+K—7Ô$’˜òÚ”¨ÙR?åWèy«AÒ iZî-˜Ä¿û÷ðÆFçèÙö¡ïaÎQ…QãÁû2r7ÚÉ?•ž{’™÷ªˆÓïÇ'ú Fî%ëÙdŽâx;Éá[-VOè=xþO&Ôjk‰'ð~êp%rP|&é M,/mìqÉ€#INûï®ÃÇ rÆjÿðšt€ô¦$å¡/´ßz»í3yŸ8˜ÞDß±÷ƒº— ÏjùËNB$xàëb¤¼tˆ5NÜðÑl4Ì k@·~äY@è†0è¥üš§yŠS¥FuFÒÎWyë_;YàÁ²µº3¦ü«ºûש¨F³µê€kË U8tXf£zìÕÙ4/É4ÊM¢uzÐ=lJ`¢q-Ž|夡ÃÈòI í>š«òEyeÛfô\Nù¥kßSÊŠ«B' ÃäÈ41P~Ñ×`8¾TX¢ƒ&o4Iû!–fºÈ¨ò¦ Ì¿—X paLž+•nái`y/ ׿@й}RmCžÏÂ0Zeî/ÌS úÖDü¼Ë Ù 4oÓj³ûÈ™iÈS'>»ßp.!'ƒlŠ,2 Ì&ñ„(ÞÇ º›îÁ{“˜+nt½cy, p\mIS¹rGì¿§4\í>ïØcRJЭ~]q“!Åõ Ç–<)Õ‘þ'…±L¥¶ýŽdÊrþ.hkîz4Ódvu¥l¡û—0xœoäÇTVnïG)±¿¤2ÀõÖlO©õDlUOá×ì´ÔúMYI=ºq™Vf$ŽÚÜbÓ"›u²á}¤µGš‡|lnY†8à=(TÎséz|;ôn*5Kýþ~É>iD–UNÆ¥y>|odK)ÁoÙ¿GiŠ›ÛnÐcZuš¢þ¯Ýh³O¥×!B†ZdËžv$Õi㕜à>ÐÑ*šEŠšVçso§È`é²lj‘äìÖ9ô—±¼-¿ƒþqÅS6ù™£©hfû×þÚkÎ[P!{+a0ÄÞgO}Ò&g‡ú¹;Öµ£$©pÝ`”æµ(U®›"NcÕ*$Fsv4½ÖE1CÝY){ßÇ( Aú.Î¥\Rïˆ÷\ž+³ggÃ,¾KÍR8v¯­‚3Yùo3_ p8ÇçÄVj;¥þ·ßoìX#†s’®¯¶ª Ão'äüRx5¬q„EöÈgšž66$j´÷Sèk3‹4m«þ<ˆó:ÀÅ­Ø`)å 0²d¶è¬¾ yõH4M«fÏhÓ¡ñì-\Ð;[ÏȤ ^÷_®7²îçÞœFcÓ-çAùaßOÍÿ 0?É)+HÄ^SìFŸ¬´*`)ÚC€B‡øFUJ\ r'U?ÕI“Ü^~P_H=9VTêCl瀱§D”Ÿ\ØÂ²BëÌžÞôMÏ)±'gh“rÅ”¡‹ Ñçˆvæh·ª@-%ä)ÀL3_ñŸîÓõRôWB »c'Qȶ"ÿÝ"wçÝcƒ8{Ù©½Ñv÷ƃ½j³ktAÚW %ëHž¡BñRA¨ì©VÒlü¦²¸§¡ˆkyš^Ý*콈ñd‘X¾È$€Ë›Ý) Â7ä¹6&À÷¤mLXíì¤cÍêÙÐÎÜ"ó{eú?É^Û¬-´†?iˆß®ª®ø$ „ÒvD6.Ekli*ì«¡Áwƒ$Є¹üÑàΧޫ£ž{‘Q–v¡Îd íyªÜz¨¿ÓüÇÔ}y<é.[Ðo³ÕŸÄÚÆˆÚçFÙXëÞPÈZ‘Æý{;Cv[kO>ÕyÑr×õc[xñ¨¯ð˜äàe±j’h´G’¬éת¥[M+PWûȶùBÀ®–§€kòœ¶¤ØÏ?ŸÍÏe-QóÞ—‚àZ\°lÊjz6 ËgJïG8£þÈàMC^Ý4¡¤¯?‰ð|h.¡£ì_ß§ó»÷DâÖpsÎNtá -¯%^:{þ]ËÛu-É ÒȦ5’""²'jÚã½4“ð©O¨V2žÁÍ1jEÈ ETfÇÀËøSZÅ QRɼoaL7El–F÷IT‘4…Âòów]‹Ïïí:‰÷swK7­†;ŽÝJs´™Iñî‹Ícœ³Yƒé:]h?üYèÿ£‡Dõ÷pŒ’a/Jï§¹ð¬ùOÛü3w;5FA€çHúÆrdk+æ± ¦Ëe'ÅÉ×2¯ãÊ|C®:¬ƒa€‘0ÇàðïE굓û•MIK‚oª[i7›1õWf’Í­Nþi¤GŒÏ€‡_ÜõuT¼¥Ã@ßð‘qICöI¯dd¡Œ_/­Éb¯2(Çô"Q²²çò„Pùö€…,‡1jjw’bQÎ#7¤ÿiÀg»X´€UYÍT°&½~ÃT¤ìêM*{Ö}Ô >Èà–ŒE ‘ÎêD»µã<ÕÐC¬ô' x€m6’Èhtuo‚~¬Xu;V×:èL<9üGrR ´ÒC,Pðó{~X9~4C”7xðÑ–sßm ÙlqBTám8ïdÖ‡+©émM£#¶ÞðµØè²s¶Ç? ºÒæ¡)=?«}¿3¯m=\fc µJððžÒõ3­¦3!¹s´Ôμ'Û"ÝCб֩n’üÃÅ;t ±¤@Ÿvè>oBèH “øN¡F{ZÉྠ)i²âzÐe©Çæ6çOw ÁY‘èyËBiRø¢ÞϧBج7´.([ê œtóc ÊvÂG‚ò·«W_ÇÜfT-†éhX½ª“»Qo`Ô˸ C¬ÉÉAW«ña»t‚¡ 5¬¬aÿhmÀ¬¯j©<œ«9GX£Ôðuø2ïÍ! a‚æ¤G ÿL>7õYJ8³ôª_0ÊF¤óšðLŸøI&ˆîÚ! Mƒ›©¿IKˆY꺬Âb' éªÔ-Õ{¯ª’Ü#á…¿kuxªÖ'Ïæ0.ǵ|c®—êé*Ãñ« KÇÀ7Š‹«Ãm4W•Íô ´³ªø$3‡ˆ J³Ö»¢ÀáRäˆD.²½½”­81ƒ‰ÄôÖ Ge¡7v)åÁë–ï £çë~CC=5‘Œ„ñÅg+H@†DžŽ®ŽiA¹s%‘F{ó­Ãò¦‰‡¨I”ˆpuóÜÅ9;Sù‚Wá¨8¥v0Ô»‹ ò¸l& ‹gB>,ûÖØ:…Ç×gˆ 7z ×$7kø+Ý$ÚRmL ç¯ìCì~¢ˆ`¥‹±w&ÒýXöd Æ¬æ˜¬ƒ´øH"š¯"ñåÅ]÷¬Æ\ž.àôJÀ®iMá3KR5ÄXdÿôüïÑ*w€ìkVØ«,_¾âeÔ®J×åM¬¼!ø1xˆ@Cl)fýÄÌ= iïL•k,Îΰ؀vªs‡…R*ÿ~ùäþÁ¨T°¹‹›r/÷ÔeœS”ž£Åßla•®”Y­Nf¿ÞÀÍóøªóAﵬ”‘Ä(q² C[¡(‡ uVt:„H ü1Zâf?I8psŽ ¶ã5³w„ˆŠkà_üÂäŸÚçMW”6X÷²&2gïìž`„ÍW(Âm&9Ý©§¨M«œ,í6Ùzå¾r¦Hìã›ýýL?Ö~2Q5›5'°vaPQ¡ƒƒ_t-èSÒâm³ŸåoŒv£ÉŒ–ò>€Ý'í `¡O´Ñ¨ÐÒTTw^jnå÷Ÿd¸}&«É(çä×­MØaùBX9µ)¬º8¿L HÖ„PUHÙÂJ’ÅNCÂÔxb`Ïì(YÓÊ«€HÈ)_àt4¿´£6&k6ø¯G{)®þ\x–Ç’NÝ*‡ì%¾š1§õê`E²1e×…! ŸÅ±†œÎõ õ+öÑêQ29Þ¤Ï]|çd7ìÐâ¦Ë²ŠN©ÙÑœ¡W‰S5‹Þ;ë¸û%âmª°s1}=õ)‰O±g [px` 4šðý¦Íüõ–ž6¹>öú>Zì„èÛœˆE\eZÎæ1ÞcŸ²ôB³©ø‡H¢ ­ä7Ôuª0³­R‹ 9g)ŸTû[1RiqŸ©‰‚”0;p€2¡šø”6Î2³pzaUQj,@/hKÔ†Ë5í÷×2Áƒ¯SCúŠá“‡ª)úª%ïµRu\)“béP0S2 *¤JŒ4ØzYì¿íDØ{`? v1=${wzgŒZË]ÆÉë"7"ÜÞå7zà ó;"…z@¡eÀ5ªBíI \õ|Gȳ%hþCMÈ€EpÆ`5±ÈãM·Lù{‚oÃ+«~;è©=¡mL8›¬ ƒÿø¬~îâ8H½œò^üøDY ñ‘µ˜0°6˜\À9Ú …ñ_«´üž™«N£È&fV‘ñx39^òmñ6ˆN°}š„ŸqÈZgR!ƒ®‰ÝÆ8ˆš&ûƵÜq³ž¼¤:la¸%Šiàs­âi»†ÐËêŠ~±ïŒ^Ý Z³ê S @ÄŒV핎X7§.e¹Òò¢ïŠà#[^@£Op‡)… ùϸ ¸óÞ"ʃ¤aôG¤F‚„,bUozjM‚©ÅþÞï"¸*-mAÖ“ÜÖ²ŸíH@É…ý(—+ó+×qC£g•‰´³øè_¯æÏwÁïvP`u⤘˜Iän–1Ù.B?^Ýc‡ì­%írìîïaeÆ€>î´… mÊ ø¬N’?Æ53Š\ÊçÓU|5ž™ø“Z8èÙv4^¾1dëêÓÐf¶ËÌ‚Þç›HöŠÆ}áŸz°ìŽ'YÛy  Eˆ¼ÉºäZa¸E‹$¸<½ºªÝp/óð j¢ºp>žO•ÀÔæ¦V'ò]£¾úÝd­å 9´S˳9[Ë—6šfÅ¢¨›ì>”=9kêG•wñxé'rQÞªÈú:Üw®é“¯\u¹VLîvÝãìö¼[7½‘"—¼)ðÉSÀϱŒór*F¬ oðf»ç_+rsׅ츫|mõàÝ l°Pý_.2ÕYP¸{«]¯q+ ,š #…ai8kC h#V1ÅêÿÁUŸyîêå2À߯·(¤ö7U‡Ýê ÄëŒ#Á[Èè 03cöð‹)”±}~®ÁãUDïF†[dr>Í‚I×ìHH³”Ë?M!!×î(™Ÿ‰oÐ>_â‰ÄÈÄc·UM=£Exü2îunOîŠЭ:‡Ö›Jvp¯Mþ[Ô7ÂMøUí?‹=õ~£>K=Õ3%|r^÷–¤ª±‰Y5„,]¯äý´…¹XOA6¬ilØ¿h†ªE²jÑ6ã( ƒ×°ßUgðƒ³$?U@gBšü#qZª„7Í‚ªß´¡‡6ÙJ“¬3|罄Ë&UN‹ ³”àv }Â!Œ6nêoë-ï`qää¨u/m¡Ôú|¶–§Y¾Rì©°õR(Ò±NûT¬ÛÇsXqìõð« Ü›·¬rÁî% ks¾ná“÷Ó»T—–-®í¨þ|™Í| ªm f-ê:™¼GðÀꆿ½ªqH«É¿8'DEâÿ[ß!ÈvÐ)eèÛn}›irv|)Añ×ßÇTùÎV¾žÒ&#‰/¥Ïbd][¦'ÐÎל÷S ]ó²·çóÊôi¡„·ìPO…Ümù÷ÚÎÊN­é {U^Œ üêHö’@AÈ$vÒw1óËÆ’$¬/h3"h¯%]H‚IÉ‚v>£D¢ÎÉ’À %Bžm93e«8kÓC‰°ë½÷­°|êv¶—~Ñ`w×)@sˆ¤»ÉrÐÿnj‘B>¸æ¥ÿvºbu×™¥jm®1wƯyx·Ó D‹A[*Jå«^ºæ"Ð;·¿'šmñ †`Ãqì f ÂÖÅ·‘~¸€ô00‰ƒóÊ?VúæÄfÚ©$ÁþžUÑh}G[ÀéR*­dYÉ€B¼Aóæufç Ý'ªžu°E%VãÞÊ(u†áMQz†Ã¥sFö2\š¤nÛ‘jù¸|rñÅqÇ›{iñŠ” ˜Î›Aÿ<„=1VR¶èšUE=ŒdIº,ï:iFÿïÚŠ—ßFV¯Æà,/BìsQËÄ"ňuðme“§ß'ìâ ‚Ÿ¯5ˆ}ÐQ „RA¡6– ä!€ÿ:EÒºþšË& WâuLF·ž6æzméΙù´ž+ˆîGÚ"ê"¾0`ÎúÃÒ¤Jï|jÒ¼j¸µõº?(D d§ÝbÀ8a;ß±¬y<ÆûOÑÁ=zqt ´w®wW=”Ü ÝÇðVºý9I¦£œÎö[ïoÓ_Z>n)±®%±Ð»–|T»7˜8&<ð&¼ùÝ馇|*f<:•ŽP®Á‡1v2& eÿiõ:"ÕDÀ6\•¥Êµög yÎrÂ’$‡'k¯è…Ò ÷Ô\øûêwÁ÷øy`Áˆ"»1ÀOØÑßœšñ4ªDXÇãîN1E…V›¢ÛÓ‹þ—I|&i¸ç‹Ã–ß«ïm‘‰%îÀýÑtöùÍH†Ôµ$/äƒt í-¯ìK÷"€Ñ©­Ù¸ !ÝZP'Œ)tð޼Š<ÿ¦.pG ß?¡ÌeýÅúy—ðâéOµdFæZ˜;ÞBë…` &‚¯¬ éRÖÉŽÕtçØF'Àiáª7˜¤£ ¡3¥3¥8hKh/Ë^o<;tXQ>üìKY|àíÓÔ=TÔâ0¸½¨”JUý“ÃFæYwOépÅ*)>^Â@†`êÁ¯¼R.e#KÇ©•]tÃi(í8ßa2+GEÿgw>Vž±¸­íŒaà‚舨÷ÄUõdÔV=ÈO=hñ.XÛ7z»ÿ  "›“ȾÒXNïÿìðvJÅÙò_kw37FùT+"ëªêí{aœûuÒ·ï$͵Oý¶°´F¾—½Å²y#~øú¿åÈg˜¾ã½îVÐA\4ï[ì ú6ÚËBì›Ë/ÂѾv@êòzI(‰Z™¼ µ#ó})P϶L19%O†;yD, ÌH)a ú;ßV­ûÄÞ"¸ì£ãÄŒ‘c«qö´pœYö¢ºði¦z*Ù•øsr}[IŽÓ¥Ä<@´cJ9 †êáþÕb¯ÉÆ#O_Õ}bv1ü6Äó¯¸Ý3—^àÑ.°¼Ò­iq¯u°ž–DAI¯|ЯcTú{'tÜ"úÿ9 bÞ¢ŽH¨¡ºK3жuš>Œð¯B+ÚP¥*a0sSFÎᨰïé]bè^µÝèEÑDÜOÙ6qðì—Ž¢ ™‘ã?%òY¯v„‚a•ùêšøÂN?Då± 4¢N쀠E‡ìMTþêt:ÀU»:=Ò+”g¨±P˜çk¹làœ~c’4£¥œ@Âä›G–Ü`&—¡GI7•[ò"ë¶šä›ârê&Ìn˜¶ßGñ ¥ƒŠwc;¼F®zâ^{¥®HËþ€›t tq‡µ—/¯?ñlØ­@C‡£]¿Þ_âSN´ «e…öÞüm]/§;p¯|³ê]þø†1 ¸Q†Û1‘%aE2Íô9bÔT¬×xÏœ•YoÏÇw"·÷2¹€Þ{–Ä`n*ÚÜË?Ƴ¸l<áåá'ÒÂµê ¶?~Ë;óù´NÍi¾RN1-ÞyA= Ì´ygÓwºãÔÐ÷GûüÒ„Ö VZ¤ªgèþ›%KïÇ ¼æÒ2röi–ì Yü¤Ìx] À‹û‰g¶G!ˆF"wD†Oˆ±EK®LCpTÝž•Kæàd¢KMýbäžNÚ«fׯ«Î¥ßKÌ'P–Aÿ©bG4­w÷Þ:¹‰à¹`©Žç‚™Ú¥‡ ¹£¦EÉÂý¹Dœg ÞÉc½7®³h[é`ÈIX9mæÄQSìW±Þð>Ö¦ÔMƒ~§–Z¿Mk4 ¥[÷¼%"<§õ§·Ð­Èj€°cO‡@á¸Cup}E¦/R—¨E(¹–3R]¸"$&ì8ßÙ!L’±`ÞÌ=«KºÑÊ×g~jhÀpUØ iüº ^*F9„:©ÄŽªzffnc592Q^$ÏÍ_ïç¿i?®æ³‰y£ˆ ®®çö—£IÉ"„§÷:Ë‚¦rgÅaÎýZp%~+GC>Ui<—÷‹3+U´e(>j• [[ÊM ëj?Þs8Š^\ªæÜ0r¿‘BFÓ7Àh v(ùºÇ­ E`j.ŸnZ¤Uâ½|_MŒå dÁÉ&2sùIYséªyf4—>A°Gpòˆü'«Uj]Æò½¤>ërƒÌíW\M]ˆn_›äºck7JóÞÛÓÛeI ñ¾;åäm#»„jÛŸ³NÚ7á\ÊÚAQàúhÝ¥u@Àžt]( 2›ËÍàLTÑ5¯ËÃ&ùÄ"üHJ3lGÊÙ?7TœýöFDÂ(0‘ä.ãè"åiK­Q<Ïl¡é…‡õà[ ,/’‚‡I|߯0©&*@Ç Ûf8'¥»8бÙÞw‹H}•äüd8ßÞÒ6P³¸¿‰ HUþº§éhÅxy|ˆ ‡g¼ÊF•ÿ$üÑ@c…tn^ÑÈdÓŽÍíão£Ã¹ƒ-Iü¶¤ÿ-ÞÑÈqµ ®' ¦Z…o¾Ux¼VÂO=W á‹kmÜÅØëS$îÆ5Ÿ5ƒJË(8Õ.g¾ÄwŸSJía÷=yz©ãdù‰±JøðÆV–DâFð·ãÖ¤/­Ã5â;ô}žÉ€?AMÑL´ùW:¡§«,ŸŽ‹Ùs´ƒo)Þ®ïÞjå¬_í=ZOžTÀKÏSnìõ—­ö¦%™×‘\^·„­m]îÓBr׳Ë^ÊaÍ/ºè\WῳF^#ÜIéë-lͦ–ñš¥ù8ÍÄ6€ŸÙn—ØÖ½™^eŸ2_غ>ò@Éé|±_öÖÞ%>'ÀÈÚš°M¦,ä(×úÍ›—±— !Éç߯VÒ{Òö>³Dv0‹&ekÿ0®o1ùCDrÏ7´Uu1›n,R0šÃ|HçMaÂÿk•噹J`‚†b£îÖ¿t·´'$kS;à3ä5Éš¤zà bfF­Ÿç)…3Îê{~ùëå`(FiѬƒ¥L°pgJ潆#Þ-+fT`× ƒ²ß.+³¿H ‚â¼½g-œ5Ÿk)©«ƒ!áD BÀ¯j²u*|¿AËŠ÷Ü},§»}8…^¾ªÂbð‡ï’Tõ:_øPˆFúö‰X±u“W|;ŸÁyMAs¼¡\dåãe§‚á—µš"©{:};J“lgb3æ"éKöõ(Ôbb¾|Ëê±íÁríp7«Ÿ ‚,¦0ZÕ]U³÷CÑÙ3ŒÛ5t™ ®s‚’*ºsr9g"É]íÈB´Â0‹Õ7}Í>Õ’øÚ»«'SK„ˆñ˜öTÝŸOýãcE©°ü âÙŽ™!”Ó–D`®ýáÞ ±oø#7lo^FòX« A lX×÷)¿n×ÏκsÙR¸J1!tnПԳû*.pæÆ‘UÿNáÄ~ná¼̧'H«æf»ŠôOȵ²±@nL5@$f†xQEµXpÁ»kÄ{ÿ·±~|û¹JªÉ÷)p‹•ܲƒ´h”rö³šM(Ïw%+ÐBc›\nHrûÿ¬ŸCtDë›ƒŽ’ý­½Ïƒ#‚R/:Vó«õE+æà»U_-OLTÕglÂï­•ÞíÆN3>á¨î”¶—™lýÿ îÉÓ0à¦í†Zô³ˆ»HK[ýû—ªBâšëÕ®m8íõ@«L‚é­Ò9©Ô²“y0¼t9žùß-ÖåUä7Ú¼¶P2åØ1Öå§"’GuXÔma+ZnàŠ+[29oã¶¼ŒÓúcÃüdžGÑËà´T™}ÇßÊîÛš8æl”0Áæ\:MU? YCK%o€pÓðçÀ8G8?èÌÉ£*º'fä:·ÛdòާÐã}4fê˜K²Þ%óÊXë0._-²ÍÿÕò?­’l-ùio;C\¼> §ÈÛçT­¬ØV9ZZfGM#‰eŽc §3¶‡«L*´/¾ëï%ß¡•ÃHgóü ´ÉßÇBVA@@SvD•B‚ÅˤSœõÏ]|L«0,gRWY-Æ'««_µƒiÐýÜv‡þ‡°=ß6GÎö+ñbzñ S|!üFÙx\«ºrÓ?µEðbÿ %ÓËb;ö TúÉþ]$xI©®‰*ƒŠö"‹“–§†U>®Zkvâ\6ºÆ ãC:}A'¤YköËÑþ*åÖŠá }°pcib dÊU5×yÁ·ÿ –é=îB_ÁúªnÄìö¬àBãPïúðù\Eß\¯•ÿŸ­¸¯û1ÅDn,&“[ºêygZ›ŸÌ˜ËZã_ðÅ'¾Ëí¼À ÿ3^J´æé3*»¢Ñ&2¶FøOµGGXÕ`u{ú¹9?HîD¨¼œ·øiœ4Ü*pý1¥mmiD *Dü…„×|¾ qûòäFû ß›R›’˜­:5rB™QÀóΣD( àýg"ï;q‘–2Œè4XçNG*“cC¥îGSy¢È@uO¬?:ÉÆRYš}À1HV£’´j—‘¶Gê ¼VÅ$“QZAS/wàTaÔ#¶Ïpx²É‘Í%§ÂºÂÕùåN¶î°éL 8­‘Ôù¿j{S‰þ (ã¡.Pþ"q-ÞfŒâpt×?"{무Á÷V6õ;U–βA©Þ68 óÕÌâ!¼¸9z~5FâB‡ôN„7ýWÈ=è=`{“(´µÄW ç©§å;À6íìî/ʾ¬S\'Üçé±ü‘ Ó¯¤ÍÚ=ì®ü@,ü¶us6#úr†÷û1Ûµtr¹þˆYLÊAjF,¦ Ã%üŽ;kã›Ñ>$C=2êz)œU¦J¿ÏT¼¬!žùXbøÁÙ;]™bø NØ@&Ÿm™lócgr3•øÄw€ï4˘c=*]7JÏ43-êN_’äï'¿è$¨kÓ8{ØFçOø\̃@7%S.—,½A*¿dþqmêRüÅn WQFÖžEt‹;‘±¼´Ì6Ë›³qb;Ä´ÐæÁ5&Ír.ÐR"‡ÓÄ+¼¥H`9 8¹º¸õ”XéÚÍua£ÊñVèk 2€ˆ$œÓn“ÿ–þ<-*¦‚<Æ5*NõjÛ <Á'«APe×bÒÈ +ÌX‚@fþ=,®ÿ³ç@؇´÷Áâï³ûêìD‘Þ€£C;X|Á:QøF"wšLd3tµ<ºÛ`(‚/ô² èѤ`p=Ÿ´ƒÐthÑQ¹ ž3kª€¿èËŽ¤ß#4ïŠ[¬¸cEló ³å‰ä¹³ÛòyX“ˆ𠪶ë#·ÜÉÚ&óÛ+~9팷­€ïÇk€‡ê!¾W7Ÿ´–²t*½ù¶×zžŠ"úŒP‰æ•d³%~õm5-LLZÎ?ûcÆ2•U‚‹_EŠëY¤y&„ci[“8Ãö©eÛ{X2š8üb«D‘úhBšJ·ðî›Ú¦‰r`wŠŒlS…Åøª³ßž ï_üÛ!oA—Ô¯¹)¤”ÎDš7  stÜ6®ÔòºŸ@+­¸ÂöU®z^˜îž/9Œ’hD==œ8Òä=ƒjŒ±So·é|,a7î‰Ì‹=o5²]žØ) ßÅ»öªO¡7þ²døMKã'%…,§FU—Çk™=ÏÎl>ám•jq 5^žµªqH¯ƒ Ï;ÎgÅÔ„X4÷ôZJ£ÂƒãíÇq3Ü/‘ˆDû4‡¹9—#´5ðt ¢AG5e ãR!C‡–îØ©b’~¤dF;ë–Í‚b˜#Îçt1Fùίa“œÂy¨í…N;¡)yã1ØKˆÊbŠf˜žøÈÃWF$Í ”dÖÝ8bÊ“¢ ¾ M4CÇn„j§÷G2ˆo ÄPÃ?Ýçž­·HäÕÒ—UÝ ÎuuÞ2ÌZ›ñèDŸ^'[eW_¸¬ÿÿTìD)­Xª2yœößnôNM÷Q–7Û:.^&{‚8–Û™;³—Á¬€“ vÙ÷bõ’Ý GEøú>º¾ÃÊÈâ°³(Â0OÍÉ=/lØs’O7"2q…&©íŠ[J{] çû›Ú\ï?™òËÃk88L6`-­nf³´¾,†^IP²’Q¨®*‡£Hya+ê·úF–*3–U!zIžbýîL;r€$]C$v®“žßëô&½„ÌëÊ(êURZµ[È|~…ÈO>#Û$\Á* ¦õ#Wsu«ˆ¦÷ÎËã~”´wx+Ñ „l}Q…e¿3¬Ê‘XÂϧ“úš{òz°ç¦1yàÄÓ¿åzb’×£¹ §¨‘‚Ý™@þhÐCó©w@ÂE ãYÄ^3VËë–ØàkÓf‹B¼ \ FW©óðcrT –ÆH7È—KÝ8ù¢-—{‘±oBAH£ž¢ Ê! 2ñHÏ’,?MšJt˜TçàÇ^Þ¢Œ‰ûaQ†b¤¾úg²ç ×ÉàRЩ‹T½ Ù¬XÀ\Ñs@O[ySÇhÚ¾jOèÍò1¬ya‰>Bk^A±×}ù4¸/¬Xùñ±ð¥Õê3+È16FiL^ËÏš‹: Àò™+nÁ‘¤^OŸ®ÿ!܉8§¸¾\ñë{ñZ÷BkäÀÑ•”ÑVO:jŒ‘«pÐsús›-².HŒ¾:Pî‹ÂeZ㈧ý[NZ?Îî;ŸdÊÁS«¾#»²ÓTŒ%·o@µÁ›°&8äʶ+–÷ÿ-† ÇN˜¢¢v[Ò?•·Oà,d=Ôâígtå18ø;Ž4§h%'5z W’v´ê@¸ úlsÝžZÏÏÖePújî'œ3!Žì§•7¥ÿi8IÜH¯P‘ÈY©ùH¨q´R‚Øœ5:Wqh<8\YÏÊâ½~(Sk|8³PŒ˜h˜UD°,Ä®ÈUN´´özǼñÌ)îWdîšDu§Ÿðãb‚+äÚÇ$L’ó0<ǹ4þvãí#™@ál ƌͶIy×yY!ö¨ÕÒnÅVéóu=VsѤ?òK¥$$Þ"¯Ä‰µù÷}+êá2!{çÎ$C ’‡¾;>Â-%±«Ê0žù ˆéN¨ð<†(ÒQ¦a¹šOOï,íkƒß…o½)ÓïiÜéw5yšó|‡ûõx¦Ç“›h’—<„w‰®Óµx†OPÎUúkVE:õyÚö„þ[2èÿ_U73.Xèf0|¹Â–†§a/ÐB1‰‚FG—À–¬íOØì“í^‘žÌú[š¸ŒˆLáâ&ï¤m—W'µÏþ:àÿÃwüÓw?pbÒÜ>$»@ÛÎw3_ÓüðÉ8ñëz0Ãù+.ñ…‡ÍJû*ŽVühÑ¿ÍïÅKª¤ÃxˆÛ|`’’­„ —Ì™ ›Jêý!£sÄ­ ‘¹Î‹³¨ð‘8Âc‚øÿa–@Ëa{Àwâ§ŒF–7„:1#hëî#NqâËf´XV¶T—žæ •ÏÌ1øÐ)¼ˆhóYÍ+Ý)lµî¥?˜¨ã\ÞÓ›SÄ>‘«¹s¤s[½]G¨Ded`?„(TyÁt<;]t+øëµ³rþ´zÎ~õ'–ý¹—rÃó»5W[~>¥×DÇå:G¾rMCÒ¤8Ú!ý¶R’ûÕgfF¤ÞÝ+D‹Þ‹&yã¡xwo} ·Ÿàí3^ü÷ÓPÖ)lrǘ:¡ý´Xä±céúþ÷2Œ$Ä4IS‘“À¼ý‰“i§Üÿ¡SÞ‡±‚gâTUÞ{S™b‚³}*ÑrNÀ™9£#tÏo|U´õ×8ã6è¬5¼=€I/NMžÏ’ÉŒô|eN‰IQͦ·ñÃJêOEhrÓÈXL 0F/ÖõêöžÐÌyËÖEøSNà°|l“EÛáöæAÛ8­4æÃÙý²§¿Œä#EÆwrñºòóU°«åûÓ*x~¿‚ÚÑÓ±ÂQ†Š§%]©[UàŠXP#w¢IØ|ÎŒ%ØDrºê<ë%Ke?ß–&9_ñ½üºê²ùšÚnÖ:³"iM1™_ò±RÕå}·¹•Tª#ŸXeeÙ|~ò›õw@šŸIú÷L¾•æ+E)ÂÑXáMw€0´If"7©×ð¢s°gŸt—òÂeMaµUomÍæljÚzÀjåB £ý/._'ŸÔñ$#u™@Ÿ{Dž ý´ý0šìM£b6‚3²S*´»â"DDArâ¢w'U}††(‘apdJ¶ÙùÑÇî¤Öú¿üѲvzföo“Ÿ¦PSHoqŠIo*Žž„—¶rMñçø5h#¯ÜeŠ®‡_‡ÿ±}öÕZõ¼«ÁP`¦(®Ûï´¥§ø©éQáãIµÆ4ø¹X=-sÊÞ ˆÛœïVœkGJi(à•Þ¿¸J‰A[Âfo+‘Ðü#s˜ñ[}öúò^‘:,¬¯æ^xãgõIFDyоz±‹Ü5=’²(ÈŸbÕ2·³vŠü{ÒWŽÛûÆì É:Qµ‡Îº%4¾®e'çxbu2¤«7¬YÀd×ym$¿ç$þûtâϧ¿Å¼Ïœ^«áV™Q–tH•šÉŒ½†Cë䨙æUQfðâ€3töJ$ïd¸]³B >¼{•7þVôZhì˜Êk|…vqôÊáYR<ÛYÔ›ë—kÛŸ[Ç úíxd%¢Ç¿[eUôd/ä‚•a̼,B:Ãü¡¾V ŒèùƒZ:GîØ2hWùò w†Åxw»>@O­ð?å¬:ü–ȉÉöüÆù¤àÇgXŸÏ(€"3G/žÜƒ–©D3ñQõ«B âW&DVê!ûÏnäùß:ÀðyÑBƽE·xÞ=l¤²ÁLn Ç[iaPK.„'¹Àζý²¢žq$CÙSŸ!& ð ™‹Êǹdz›ùæ bÌêó¾¹Tæö–v%—DZøó rdåŽ*$¨ïµpZõ‚Õ‘}%Öß߯lu瘾‘ÓO®‹´«¡éJBç÷D¬Ýî*È×Ú˳ Á¦ 9“àuã ÉÊ…"Ó‚ÖÌ4?bd.S%×H@×¹µ Óf–†Œ· ó;6Ó"þ¡q‚jVc®Ý'Ù™ZT¯5Ê7‹¸%Áîò¹[ zù‹EgªìgðušÒ™÷M¯Á"dŠJ¨_~b3iö5„ØDªE¨†7îFdç~n¤ßeõ£†ç~CÃ{Œ(*!@¿ã  h©ÑLuAR¯xðJs™Ó[SŸ3Ü4‚Dã)Vn½(ó¦ðëÁ%í>q3žx2zeùÕ5&«óé(_Yl9@¬=‘–˜«ËMÌšz|MÛ;Xd±mP*ÅWUŠŸI]‡ê¶•‹‚ç„ÖèÚZ²úÒr=«^×j:Ù5µ 7xܤ|‡ªôut.i—Ç]!3R‚'b/w.+Ä”¼—Úqr †ŒÆ§ª»“ùœÁÕµ1«´ÌÅ¢C2FÚq#D mèm5áF©ä×öEšô¡‹…zÊ^xÃ9,)Ñá²ëÑ$ßòôU%Œ,Ë` ÔÚñ5Ïç›ç£*{y_šíÖ³ÛŠ¥%­ƒaˆñA·ó=}¤iæh±^Y£l§®È8èŸnß;­.zÆýŸÁê#¡„%úhSíÿ±@fTiX¨eÆ$䦬‚[tt¢Ù§~ï÷?ÕWÍî§hüÀžåü~UîrÛõ¢4ƒ¨'Ó/]S§é¼Pµ™žù_¹×â³Öv/'Fö þøLüÎk÷n[ÃL€¡Ð» B Ê^ì'RL& ÏØÛä'›ej:¢‚c ‹ÔïASªKéGb‚¾¢.'èêñݨ‚± ÈB•ßJ,ðy¹DV/ÃÜõÎ’åå'êîÝ÷=\¬ä'^Y€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/type1/dcbx10.pfb0000664000175000017500000011543311742726711023427 0ustar uwabamiuwabami€%!FontType1-1.0: dcbx10 1.0(Level-B) % T1FMT, Copyright (c) 1993 Basil K. Malyshev. All rights reserved. 12 dict begin /FontInfo 13 dict dup begin /version (1.0\(Level-B\)) readonly def /Notice (Copyright \(C\) 1994, Basil K. Malyshev. All Rights Reserved.\012BaKoMa Fonts Collection, Level-B.) readonly def /FullName (dcbx10) readonly def /FamilyName (dcbx10) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def /XHeight 444 def /Ascender 694 def /Descender -194 def /CapHeight 686 def end readonly def /FontName /dcbx10 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /grave put dup 1 /acute put dup 2 /circumflex put dup 3 /tilde put dup 4 /dieresis put dup 5 /hungarumlaut put dup 6 /ring put dup 7 /caron put dup 8 /breve put dup 9 /macron put dup 10 /dotaccent put dup 11 /cedilla put dup 12 /ogonek put dup 13 /quotesinglbase put dup 14 /guilsinglleft put dup 15 /guilsinglright put dup 16 /quotedblleft put dup 17 /quotedblright put dup 18 /quotedblbase put dup 19 /guillemotleft put dup 20 /guillemotright put dup 21 /endash put dup 22 /emdash put dup 23 /compoundwordmark put dup 24 /perthousand put dup 25 /dotlessi put dup 26 /dotlessj put dup 27 /ff put dup 28 /fi put dup 29 /fl put dup 30 /ffi put dup 31 /ffl put dup 32 /visiblespace put dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put dup 127 /hyphen put dup 128 /Abreve put dup 129 /Aogonek put dup 130 /Cacute put dup 131 /Ccaron put dup 132 /Dcaron put dup 133 /Ecaron put dup 134 /Eogonek put dup 135 /Gbreve put dup 136 /Lacute put dup 137 /Lquoteright put dup 138 /Lslash put dup 139 /Nacute put dup 140 /Ncaron put dup 141 /Eng put dup 142 /Ohungarumlaut put dup 143 /Racute put dup 144 /Rcaron put dup 145 /Sacute put dup 146 /Scaron put dup 147 /Scedilla put dup 148 /Tcaron put dup 149 /Tcedilla put dup 150 /Uhungarumlaut put dup 151 /Uring put dup 152 /Ydieresis put dup 153 /Zacute put dup 154 /Zcaron put dup 155 /Zdotaccent put dup 156 /IJ put dup 157 /Idotaccent put dup 158 /dbar put dup 159 /section put dup 160 /abreve put dup 161 /aogonek put dup 162 /cacute put dup 163 /ccaron put dup 164 /dquoteright put dup 165 /ecaron put dup 166 /eogonek put dup 167 /gbreve put dup 168 /lacute put dup 169 /lquoteright put dup 170 /lslash put dup 171 /nacute put dup 172 /ncaron put dup 173 /eng put dup 174 /ohungarumlaut put dup 175 /racute put dup 176 /rcaron put dup 177 /sacute put dup 178 /scaron put dup 179 /scedilla put dup 180 /tquoteright put dup 181 /tcedilla put dup 182 /uhungarumlaut put dup 183 /uring put dup 184 /ydieresis put dup 185 /zacute put dup 186 /zcaron put dup 187 /zdotaccent put dup 188 /ij put dup 189 /exclamdown put dup 190 /questiondown put dup 191 /sterling put dup 192 /Agrave put dup 193 /Aacute put dup 194 /Acircumflex put dup 195 /Atilde put dup 196 /Adieresis put dup 197 /Aring put dup 198 /AE put dup 199 /Ccedilla put dup 200 /Egrave put dup 201 /Eacute put dup 202 /Ecircumflex put dup 203 /Edieresis put dup 204 /Igrave put dup 205 /Iacute put dup 206 /Icircumflex put dup 207 /Idieresis put dup 208 /Eth put dup 209 /Ntilde put dup 210 /Ograve put dup 211 /Oacute put dup 212 /Ocircumflex put dup 213 /Otilde put dup 214 /Odieresis put dup 215 /OE put dup 216 /Oslash put dup 217 /Ugrave put dup 218 /Uacute put dup 219 /Ucircumflex put dup 220 /Udieresis put dup 221 /Yacute put dup 222 /Thorn put dup 223 /Germandbls put dup 224 /agrave put dup 225 /aacute put dup 226 /acircumflex put dup 227 /atilde put dup 228 /adieresis put dup 229 /aring put dup 230 /ae put dup 231 /ccedilla put dup 232 /egrave put dup 233 /eacute put dup 234 /ecircumflex put dup 235 /edieresis put dup 236 /igrave put dup 237 /iacute put dup 238 /icircumflex put dup 239 /idieresis put dup 240 /eth put dup 241 /ntilde put dup 242 /ograve put dup 243 /oacute put dup 244 /ocircumflex put dup 245 /otilde put dup 246 /odieresis put dup 247 /oe put dup 248 /oslash put dup 249 /ugrave put dup 250 /uacute put dup 251 /ucircumflex put dup 252 /udieresis put dup 253 /yacute put dup 254 /thorn put dup 255 /germandbls put readonly def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-60 -308 1212 914] readonly def /UniqueID 4700707 def /StrokeWidth 0 def currentdict end currentfile eexec €á±Ôc, öøÔâþ³×Âû-iìœ ï÷Ju¤¤öï§S©°E²!¶Æ¹'hŒÉúõ¹Û`+#),ËÈÖ«JÈ&ãÌÏ•—mYÕ¯ ÿÈþkÂôÒ·¿'\›Ö)I²´^Í  4"L±°«~D`”¨X_˜O>IÀtcÿî#4¡FpOµA Z®ÅJ\.±{—T˜/NÊÀ ëû’ÑìmËYHƒŠ,ó͸;£Áo0 ¾àWõb,K›P`–¿DØAùNÐû„!$D‰•À.t£l]]/è¾ú-4Ìz¾‚PDªc0϶é±—Ë&kfˆ´þd×4C'ºïªît ø¥I!ë8©dÀ¶† sDSò²${åØNIuH%v˜{mCJËnàùcs†›¥£¹C–Ú®õAäøuÑP…ì5ç!æÞú°73nE1çë†s6›‰àMÖ­"ckœ(Ïwç/µU10`‚ê#ùþ48 ËYRMÑ3PM[˜gþ)ÐrÜ(èÐê´Z…¡oBLáÇ™ánª…¾Ñ·¸3ºCêøÚ,6aŸ¾ïŒò1{)qt¾žPûK®?aR…JìY% Xz^îñ˜½H;Ž>ã°“ÎðþŠvQZ–§£¡íNJõY€£ûlc&/pª¯Õe°„Âð!D$¬üÓþúè@PÌð¾a:tÄLTƒ¶czÿ&üØ>Q=]±±MhnOw™·Š~ÅY¤‰õ(+«Æòg™“Ö×o'¢S1äbšèCù¿j3<£ {å–ú3Ÿ±Š£%ìø¡Ú£¹j¯ö™ÙYvžþ6ój^JßnºÍèO™òXï!½Eyƒ^©Á/â®|:OJc¤ hÜu&üÐjÑ*Ë 8:æ5‰ìî8žªÇÒédPBb4ôóJy}áê;NqVþªÌK')ú»¨‰ËYYýùZÁÁ.Vœ:³1ᬀ‹ç<ï*Ó¡?–À"œÃ5’(ïoM3%ÜñY ÿ¤¹7½nêGöÂÿ-¬JÂÅ„æÐ÷“Ðv¥ËIYŽÖñ°)ŽM¾Î²z…øîÈäÍàúÿùÍrlÐH%6J C¢ªJ&1ާ„¥ÂÔTw–i²:^)»´€Ð«-{ðzŒÖL+QSL8Ð@&×E°¢ Ü›D2³ušo¹"†º¿åuª<´5|ÊMhÞ†SÖ:ê1å5ëË¡¯¥¹¢]ŸpÒã´‡xD¯lïÖQE€öBæSÆõ˜‹¡oÀ\®ªÛôøË÷ŠePR7’Å–ƈg¶>!üŸØÝ¾Õ¨…ÈOHž®è¾3°‘ºúÌu”Q@wÙЭœÆaˆ!I°àP¥"Ÿ•Ñ ¶o Ø[I+)žX^`M_ª5͘K§ª^ÐÅÂjÆM]á´VŸë„ÖMvÍ73ýHñD/—žáTC‚¸"«ˆÿ?ÁÕÿˆfsÆE©ƒs‘w*•¡Ù‘<Û,^ö´éÛ­—$Š((9ûïÕ©«àfkI†häô:¥¸HzKê°û¦ü¹v~ÿå H°o™”k#¿‡ø251à?ßax@•çu½ôUoö½´YŸ±\ˆj=‚ðv™1yAáÅÄ î‹{Ñw2[NãEýfL–T¼­iî%ŸÕ(0iÛ`$C«¸,¢í‘¸ÇÙIªìI%–*Å-µ+ ÒóÜž+5ä4  ¶¥Ng!˜ñB‰§W@B$¥N­hãæLGqÛ™éfíåÑI5íÁô¡˨CJ¤,EkŠt{j¯1-U ´äÛÞJ?™¶¾y­Ø?˜=¿Àí>4¢¡¨{Q×3òÊÒD£/EŸïôÛåÆkĆÊÝð¢âÞ‰@æyaIFÀ•nÃJìð.5Š’`·Ò ¾í?çÊïÂɘô­5Ÿïµé™%M~²)‰Ë1h§ÊêàÏ ‚§2‡>ઠ£MN“ûçý‡ e,UÔ™OŸ#+˜£o¤®¡“<æá/•+2ÞZ—=a DÞ€p ? Ÿ] ®ç°#¿8Å|%!ˆÂ}&]\Vsæ'ýáFøï°Å%QÆ¡¾>ÚÎR0x8ÃrT“»Ø‘cj•‡à6ñ(æFí?7"e ú,|Ís–F¼¼ÞD¾™ÆÏC"—Œyaë€Mv¦]j>%P„·v/¯+ì1¿bìëõ÷_vºBœi‰´K…¨ÍÿÈßD߉±ýN¸S¤L|ECÚç(¤M(Ùß/ò“éXË·!ó6£ˆÃìòöÊfŠÙ_g{8¦Õœû²ãas~ùò ]ö•ÌW8)­hÔåîÕ}vHˆ ÷†"‡¿g2*ã¯Ì&a.ÒM|ñËÔBé‚ä>™›Há.ð™›ì¸×ÎÜíÈ‚Hí(ÃŒ†YÎwÿ@ÛIÙX§è~E¾cEm//@V•CGË 'Š‘÷øK,á~ÁáRÄÎÑ2+5ÉÇÁ0_dîù¨$\ÀêÞ˜¢>*ò L”÷Á ]g¹f†#èR‘÷õPÇÛÎâ%£@ëMùpüðÊŠ å\S16¡ô‹ó`ÁЛð|C›»xD~×X¦“y·ŽoðW˜"·Òóá½?ÐÉL¹8¾^¶®Ûßsž9ï7:ä@f ¨Ô/}7”!9~é8úf³FÎqÞrØÍyíkô-ðàX5ZV 0YD¡)¯Ïê¿<®¼èŽé Ï Wÿìq뮈Ü|õ_O…ÅxçþP¥Ù™ %E@­ãìj2ºwhœ8‚EpC-±j¤[+@KØ)ŸŸ¶Iõhý°cPXbÇ…œÙ˜®Ã ¬8-†×âÆð™UÃ7fRüÐæw2M¸ÀŒL,J9»ÜjãÓ‡0S5péÓ{íúø¾Æ1½Ô”™E„ö,’Ø×æ¼*ÞŸ¬™5S_b[gY(2*™ûîE4êÉÍ\XXj•<Ø«}Ú‰Ôá³QçÜåz’ŠÇúáíOdÞö<%¢sZÁ*Kò¦tÉ“íµ›nïÆ6§ŸùÜ® ¨ÝÈF6Í w+R.©sÃЬyuéê[oi`ïÀøkÇávrþ«Â^súý}/À2*¹ÌZª"õi´Z4«Öï"y_¡')ã(KØ%ÎÛpë¬<Öø9óXÀÙy~*ýoVºZÒLøµÞþÖ/Îr3bÍlœ©øÊ4ÊnÒõ1#Ô_%þÁZF_:¹x®0NÜסK*ãÈ}TÀaÃ\MÍ%ꨈµ9ñ§¸æ=ÿ¤ât´tÐÎ ”.<ßæH+Ê.©8ãIý ZÏ~ ìq³¹7]^ຶIPIei ,-CÚ¢Pë)`q´»&‚À '˜£ÁFòÑŸyjßcÜ3Éï¸C†·ÁÕì…ªr;Ÿ *#ÿ½9äuZ%­ã'¢QWpZÂfÈâ&ñ «Q :y§%¢áaâ0 (Ù2ÃÙ¼³˜²/a,,pœ´";’sZ¶‡I'ó\.Y‰ŸAô+Tälc|Löe¿'/»Ú«Zå¢?Nޝpïbë_‹û£Þ jðŒüðÔ°l2["óŒXÇïwåa»˜i4$“ä^¥Ü€+tÉCK•ŸLçß}wÎT–zHŠÈ¤2:®•¯ â¿q9úI\¾z•¿;µa ¢áyÀ Ž˜1«å·€7‘²1Í™[10s¶y&É Üd2ùH<©™ªfGËûb#ª$Õ7Éz”xX‹}4Öj/¼„ýìÜ–ö¶¾àÃs0åèáGCI½¾’c÷ᤠ!ý[ðÝßK-Þ+1k">í·<ü¢`ª)¾êÞUf+V'œ…¤ lëeÃNüº*Ÿ7øL$À)5!ž³Ïÿžl^Yº—ßãâ¼Ií•vo¤ß9S@ÀøûÞÜQÁNËä‡!ÇÜíÇÝúyEh³iÀ…)ËÀ Êr½Hî¥iH²©0àÛ~ÅZŽxí]®’‹°)EC¹ÉÏå§»ÍBׯ ƒÅö§¡RB’¥es塯¤t¸ü ¥»:Wtz>XáBprFоgg0DHÝ zA·SßÎ…mXÑ ^§uO÷˜ÚD®ƒÔR¼jH¶×—èš«á›áhµØÅ ÁÑÈÜü'%VîHÿKn†ohÏ’GÔª%é¶v„¥õŒ. 5Rȳ·‰.o“^{†mhSÏãªiå‡UoY %ؽỡ„á¯Lú ñÀ‘C2mO‚oÂ@膗kΤ½BÃ-³‰á(“|h`Ä¡EJpxúï’©˜h¹„ûšwäÈôwSMDŠìf´ ˆS°È×µß /aÖ±I9×  ܰÉ'ɧ˜M88¯ˆ¯8qV&Hägú6úwÓéÖCºpJçkO+Á [H‰oý)½ñ¢ðëŸd/qt¤‚’üdº×p‹. †íùµ„X'ÇaΧW¸_šà‰îGãH¤‚0Úä㪰ǂOXã<3<™] ¬¾Ò¬ ºÕþ™MkÂøc»Z!`‹±v[åIPÿ±Ô*îá'e‚уK¸»[qÐÄ)(£›¯î=ÍKÀÈ·éíËx\Êò‚`ÝÆ4«šÅzIÊŠà`wû¾ÑŠ_ýAMgêP²¤ ·]9"]Šæ“<Ó}{èÖlÓD¯Åw 6S·.î, Å8(NÂWËÜã }Ê-3õ™J]#óòL{âs“¹*eæYJ9]­‰á¡ñØe``êÑsÅJqÆwj¹ÐÙû·ÑÀVKo`ÿßH–ƒ“‘²–Ù³ˆ¼u;nÐÒ”Îá”Î ŸÛTÒÉZz˜×†C§IÏt¾÷ÁÊî.\Rõ¶y¢Ùye2'œ³|_j!ÍoÚøÅ»vïpC×/ÓQ©24јۮ‘Ù §åô"Ÿ6 “8i·ÚPÿ/î¸N oQОDZã4A¿«ø5ä$%YkÅ’gŸ•[íÃ'­æ|¾¤àúɦôZVíß!EÝü2ìuOèX‡÷ ý¨JG…&¬,Š51ã+£¿9оîÐyúÕ&1._°¤¡g§uîjqÜ-Òà@VŠcfsÍÌ—PÛ³IÞØàVtÏÿSÄykÕ˰ÛQ²ÝÙ÷†û)„·jŠõUxŒ|H^«¤]ør[¬ï?:ë ĽòÝå¦ÜœQ–Ò½±Íáæ± §“ÝÁ¤üLí„¢hü´Oꊄ=RT·ãÖ€\DŠœO¨Ž0’Íõ¿‡£ßËTÍnß*–{9΋QH dSj±©àßÅóàhnî墥¯¿}D#äëΚân5¼©vN‚ {D2-ÜçlÜtæy‡­˜¯Êã˜Çõ"‘>Wå{Æó»¢×+j~`ºVBÏÝ`Yzej=,¹¯˜Óëã[·¸•ý´niY˵YA¦}¿çSnÏ)à(6ÇÖv·õ²4XÝ"~pvÛñóÇ®txÇtHŸø*+ŸÒ@¥.õwªéOHÆ_˜èáìïß…-ÁÓîÂwmMÞ78Ê\ª)Hâ4šµÜ™,µî!eD- Ú"fÔPAOhÛ,ÑÐ,¸~î’"2ûC 6E×)‘1ÅFÎzü0"ŠM²Öµÿ™µ¥ÄÐ9e­I·5¹gÂcßÿ§¤NçU;öL+áFgs–_6Í”¿šN^ò7ˆèî?î¯f¶¯jÍ<§Ég7"AuuUŸYñÁZÉ|Û)Ø?àhTC#.JŒ]÷y±ÄßÄM fA“±;qRÄKJË}-õãc|lCóÓïñ»!ÎXJµ°\S­Ÿ€‡à<°ÀvŒ!!V,Fù~×táÑ›ÁÕ.°5êU¨hu i^ ñ´w.¦e¿‰13Ò P—6ƒÅaÒÃß+“rÁÊT eÓûóG|… ]aFì?ÓõA¤¥Ws•/Lé[}k#¹|¥aú0|TühG5œÊ>žn/zˆKϺþË”c(¬ 5üãÂÌ3žŸKqûv–ClØ—iXc~s |rç^p· lÛ .ý:@Áh¥¶—ž+åçÓ±K˜–dt.9òL)hfÑÄ%¿zª¡Ï3¤c]ÓIÕƒD,>j&´àÄ®q_/”ª0*èÁ‘òÍVþþ8Lš+¯Ñªi¯€¢€ k•¬*˳°ž›;q)Ù°B0Ø¢rcõö˧¶ÿ~ UJö‘ä–N•7¯¥6×¹I@ÿü˜óªK°j%/Ï_}φ).¬‰yT2cv,Ø%Ê ¯býf¡xœHeOc7Ã>ÿ9 šÞðd™Ã‘“ÆOÄ)ñ¢ws¿²)7J©+—eHÙ-RÍ?ßO1Eî55±Éã.w 8#ݲZ´Ú§QÁ5`ñSbã Âe“·Æ­Ö“%sÂÐoY\ ׂÝÒïâ›Óß¹ÂjCWJ—8SáxêǪsæRÞ…=ÊþÜ®³ß "»0Lj\œîñ}Yÿà'vŽ©aŠˆ‘[¦Öú¾%Õ’~]0¾¤!XVi%aá2¡+¶i7£9váPªcYšÐØÓ uWñSØ)c:ÒŠµÞv¾³\ÿ#”kœô §|vˆŠnpÇp":½Z{òo©AÅÈŒÊ!äÚÊ”VšŒrr ¼U«Ž©1 ì:O¨k¼XÞª\µÅ/ØQŽ\Y·ÐƒæÏ½Ìÿí0¯¶¥õ4…TW¯Ô—_ÞP@ñ@l Ãy±mŸ?×ÔþÄe€ôíÛV¡øBÚ;pÚø¶††ŒyV,oUp\x³<8Kí,v'žž‘‡îú ÖN5Θþ†Yª Bv"ÛÆm¼Y°,ÊŠ–sÐ÷’Þ°1¼Ÿ[biØDÛž€[ÇQºX¾2MÈS’ Ú1) œÖÊœç0Ço‹'6ZšÅÁî3F0´Õ÷JXÔ.u“âþÀ!Ø6[ë"ïsuò‰ÿgé²Äc¹Õ)žN>¦3æÐzŸêÜ =¨H51õkð¡ïzØöÕožL7<_WµG«y:\ç',7E}&„wiÖÌ¿¯AŽCÛø=¤.'±{ºlØZ6¢œK”ûlL8y§3=ëýìèÙO˜N {ÌG(ÍA@™H×3¾vÇD…)¶¤6bˆ`K'i²/UÿB=çÀ¥HM@ÉX´rSÙûcémKçùí)Ü7aÉ@0nØÔ&zKÖ“+-èûV‹ ÝS±àÁý•¼»B#Æšˆùnág¡ÈG m‚‡ª"²@‚ÂÚá° 0‡¬ä›—Š28ÊQîg©¼é_?ÂÓªãÉ´_þlŽ}-©1®Þ3O)2œqˆ1c’|«ò‚ÐH1½ïu“±aÛR›@àê¢/#ô@,Iùåë­Åé+^ õìNvw³æË+ÿÂØ vXK@±ËŒÿµgSt1ʯ¼°3a×ù}5!¨ÀjRt°q‚±G`…ìÜoÆUÏÑÑ,£ª'ïÞlXÒ ƒýÊÝnMèŽÑ³çÞÈ?gÍê~ÝpÖj囹I§K%oB%='v’4wµQà “ÐƇОVMbŠ´Ñ¨p­ óõÕ 29úP(/ýûN;i#}ìáäS¦Ópc …èÞEË&°=l’àÁ½x+ÁÿôøDåXVÓ«É ¡ŸµE:öj‹ÚIæLèË,¡ó¾,Ä:»ožÚiç¾¹¢FIî“«­šÀfrµŠ8¬é”«›FšÄNG‡#c‘ ±ò+ £›‘æÜAµ€¾™®ÁÍY³Kj©ú(ΙCy@­Æ ¼L¹ØõæA3ãq]?cŽà™<žï}fVM!ï×`Ðôm÷€f­“4åÁþòIzWÈ„¨ÞŒ¼û²/ÉöïÎá[wƒ0¡™cxf2½bÐi~fj€…Ñ–Q<Øÿ»Þl©b`¥îróÿVÓ¦@@«¸S[ú»‹ô‹H¹(¤Y?°ΦáPnøÏHްhð)ªKó„2.« Ñe±ûîÀ—]F”¯+¬{iÞRnÎþHŽ+ë ùƒ 4¹«”±x$ñ¤Þ¤'h•vo?”|Vweñ®m¥{B)ðRù[Aý†U œì:Æ£ÂüÝ XÅ,Þ=CeF¢Eg÷ÎŒP‡krô­0®^Ú"^1Ú1ž[Îüu¤5 |çƒÅ;CÇÄú¡•š(Ž}¿5Fi´ïÌ ‘¿\½ŠŽ24gI~kÏa“D¥ÈÒÖ+s¿)<šPWŒ@0§‰~åN± )\:5Qn/Ê)6õ¼¼nø~Ægdw"*€ýÅÕp\[&4-Ó[ïBõº:€zÞL+a~ËZ’§,x%ã‚·,ÃgÕĤ¿W&AyRÙÀó¯Tž0áJ¬ŠKÙô•ÿ—^ÎòNº4ò²Ü@´M¨q<͸‚‚ÈŸãr!¬\Ï%ç$‹ÞI†<ëÆJ‚ê³Ù.¬Ò_bîô®ïÿ_A4ªóî8ºõÊð²Óvù…ÚŬÍZ¢…ã ÄGþÖ«nƒÝ „ã9pu¸„ RŠ'劷iS)ë}­ÁáR‚ c—•8S°…»™éø)|à=‡”мsêV‹f3\ßËÔ§duÆØjŠ€ÉÜ7IØlw|s¡VÅÉÒ%ùȤ~³„uš:‘ÇèÀ!A ör\ŽáÛ=£vÛ1 TIJgGƒ|L}†IËŽ/Âþ¡k.³’¼63~ýÆÌSþm€*dqÄÔ;$`3õ“+oVØw;i’0Ò0´çä¼ s’éЗQì7;ë¯öÚ£ƒ6_a"RïÑYù_E“üãÛ®ó¦×˜³s1æ âðálöµ ‰F¾úÅ¢þÄ%^VÓèÀÁ‹`M¥vÙøž®‹o)'æ­ÒtjÆ婊[ˆÕ£îT>!íƒø†˜6ÄšíÒ=Š÷éí ë™Hr½€1aõ†b‹oñ ø£-Wn= ík£!*—’Û“Nsöƒë½6û$WD¼ÕWYÉ—Åg úm»^ð(8לȬ̖ '}î±€Qú“Ášö;¨Åa–û=}Šœø ¼‚‘“Êv ïk£°Z–KOÒžžëÔMÐ1Á]ôš~Bó4iL„û¿n^ Ç7·ñ@³ø—YŠrÂË’Éì래äzUu §äšY U®ß°âŸÂy‡©÷Z;üzö§‰â«‡+^‹X½Mgæoár¡LIq^1íH⾉_Gá.sÄC‹À6íÚí.L%¥­ÂÌåâ´ JÄü¥‚——¼|Ð;Ø)lJÝLë¬Í„}9ÇŸ­E+8€ýiöevã/¿_©…@¾©þÜZ›‰G‡NŽÎI'¹~ }«)˜C‘W!v´>ƒ\ò±(€‡QŠI)ÆR•z6½ŠÈ?É ¾£H“Õîk½{»Žea‹¥û’GÞ·Új¼ÿPòªÔphdOº?ÎõÕˆˆP‡e¯ô¿å%ê¬狪˜(v¬¡8ƒä2fE¯ß] æ(mÎRš˜î”)´5„ð‚![o¥§#‡,8Ô.8r¾Ô¤Ò’;¶X+j‡â/?VZ`q,¬ùbã~Z3³Š·5ðï} è±uÊ]šWewØœì§O¨ãÅžìžäV7<À€züçP÷ïNï!óš1HH&Ü—BÓ’0 ±±Œ2ìAE[¢Ë¥­÷Ÿ-—rµêeFÏ„¯ ÷î÷×¹UjÇ×]]¯u]R0œOÊå-I‚1Ôði¯†×[PØGeŸ¾R…羋ÐÎM•´ ¦ôVp‹s)zTºzxžð²8C²ƒçSÄíÜ…Ì5?ôoÕs¾'Iµq¥×8/Ø¥j„ ¯1±brýíºŽJïüýæ9ƒ_nÙÎäB¨i˜ílõ`H-\˜—’ ¡àÙ^ë'R}^Ë–ÎeQ†»V§L´äI•Ï-mû°;½wgÈohÀ óUàÙªÈÒ_’M~œpy´&ÎE;ݱ™?Gä(,¡•¼Ó ·øã²–ÏUH0f5#¹ð2Næk„G“·ñ®½øåè‹,]5gFî|G±º4ôÇÂF«;³NkrÑ}àý…GK-†?§Ã;õc÷»öÔrΉâë,%ÍËŠøÎuHº¥Ý³ÏjIÈܱ¹`¡to·[4Úßž‘ûÄ ºû!Û Î¼£]û•ŸVrÎv[:ºäM9«ä¯@ ç’_:Ø0ŨÔýXÅ™;‡ýfQ‡S£®­jó¹t+ü Ù1R¬¶s§ZV ·‘PšIáƒÞFBr9t¾Ymã–¯†ÊP*ÛK±Çëd¹±•Må)ƒA²›oÂ_ Ñ× UnÕŠ) 8¬hw:VJâ LÜôv.˜*\¦„& ;´R\þ9ãH%*ëÆ¿òïÙ ×)ku?)õ »þ¿Ž—­þ¯™» d¨ªäâ¹iM©ØiQ.ñðè ˆPã0Óù6¦ä j•“;/ÜUÑYþ³Êtáá¢Zn¥Ñ X²y1¸œp«dè:­«Ø/‹-|ƒ‚2Ö‚¸(¥L[ò| JL ¶Œ¡ 5݆iOIšJÅex±_¥ÄfÝÔÛÁüàÚ•Ü<†/0_¡ÃëgEðžAF;:P²¨[S§]¤óüaƒ¼\î wá¿éiˆ‡èK½_Ò£„c¢Ö«“zÞžàwwì)a~À£†3ãêÉ›Tµ†spèüÛifÒCNÓ{u°å®ýN”ï>b¬n€oxg;4ØÇ¯8 ‘«x·ï¿Ô|¦@‰X'‚Ni, ê~\1C3ÛÖ*WuÈ-!ttºiD±å x0OÚô77[Am!Ή Oœgv¢þ>Õûó²|äÅWVº—Ý×ÚÂgr·«ÖÄ2žDYœX­¦ ˆjO•‘P—7íÅá£"Ãj{§9¨3!¼là€Äk²B¥¯!nVI”åû%~òéȧ,ŸÅ^Íˈ&'ù稞–µÄ„l 12¶†M%3·Èù9¼rƒïÃlûRmxÅíÜßï«}Þ8Šˆ Ò6µÛFŠ¢;Ü•1`}¥»²öŒªSF§ œ[ýÅ|Î G²Û ¬’¡õ::qD]d%E”l²ß0uÖm ×ÔC Mfïãczlƒ[xI×4õTÈ?ê[w6 ¢%ÂO6ÌX|œ±ˆ4 Û°‚'7iôÅŒU¢µ”y.Êm› yd‹U(Àº¶“IzånïŠ Z¿·m;PýR2D_ŸÀßI¸˜¼´NÔÆôn²ç4*Ò†DF<·…·²S+%‡+Ä,yÛ<-KÉö­¸Ö¦´½± ¬¦æ‡b»Oùð L!“,Ä ½&`'W”žw&NåÄlt™æ—ñ…)ªfÔÏXM 8n X«NP*‡ŒA:N.­ã‡¡žO?G¢4¯q7v=³eÇZ¸Žä„©nœCJGYß Èwa]»ùJÆK™N4˜ŒÆT×ÅïSßV­œV€àoÏ\ø‹Öá^”‹hØSƒ;³“`+ÐV\ŸOzÀ­—Ÿ*1'ÙŒà]ÕNadúÒHÁh§áo‹J°·B@/;±äEÏô•¬KN.­ØË¸X‰Qô zz5ÍJo—0±Lkïäý!˜Óéé¶ iI’L àP'H¸C‰ƒ“[Ní‚È °íÁ?™ ~“üùʾœR¬T}Õ¥é%ò+Câv¢NüÇÅ쟮!¹ª1}½G6d#¯È ]̺O} Ø¶Ý,Ñêàp»½­X\ë4>—3ÖÝS8 ^‚­,¿ônmßfx‘›’Òõœçü#ÚÎ×Ýž;+K~óv¯¸ï¯6¼óÈ÷‚lÆá`y'tz¾xâò×4WGºzÑqç¸Å›ÐÓ§ø»|½ß¤Û)þ„§ÿÝx°¥–›~‡q³àjDÒ´~€Bq»=± /È+»ZÀ‡Œ±Þ›,æ‹ÏßËú”ÊwþO[h+T³ãÄE+%‹œ.4¿üÏyTbùË“|w9t}xx‘©ª£'iWGkCøp’–¿þªêS²v'Ÿí–Xh=kÎÆ·Ø%CUçªpø)¦rOÍkÐþ'©‘BLš7b†)„Ëd6L9J=lvå#oñ’û¢‚gŸyxF4ÒDé ˆzQa€Ð‘]{Œâ93ˆšûoØÆs¥Êðƒ®“ð@©*$çò„/5fçG¿ˆÅËhìhíÂmÅÚ{•ãEÈöúyv?ŒÅN&Ó¤‰ë6I¿N{€ÃÆÛŽ—ê„kÁù!f ø;‰Ý8#Àq˜To¥+-ÿã°3‘Ѐ^‹üåäæûÔ›F$O‰‡ï¢k0T‡ÄV9XÁ?±6\héúÈÎÆ¯‡lÏצґX4Aæq¯ ˽,U²†zÁåx€ý6 ž¸qÃ’6óú‘LqÛôËÎôsJÐá5j Ê]²‡!ÀpLÔªD¥’c|œþ¿eù¯_ ×/ºN‘%Öné˜á!%eÕR]¯… qRµV¡”T¿iòBœ»E½¡„±Ĩs[”·«„Bašý‚%'½Õ™N>^à•=7Q<Ï­‘(×å  ü¯>ÁNã y<Å«G½ÎªÜ^Ã(¿×©—!¦†ÇDæLM)-5fà 128¦ølÈî®·À=åÿ]ïbÐç ” äS$ê ëůð€®å=MíòlŽÀÕfB•X²#Iî‹ öV]ÍÚÖ9‰²¶ÌËEnßð²8#‘¸-j ÄL„íEYÕo %Š7ŸIÆïAƒú)Æc¾b”[’ù]ÞdìqËø,.•ò+¬³ª¼3cEÆ*C¼ ÒݸÂÁÆ:ÄÔx1—/²ê\ªPµ€X.›³½7Òõn2P²YÝ=.'˜Z‡o®L¬äDØÖksõáÉË„qeø)U€d(ñÿKù•¯Ú}ï¸TÆÆ‚xŠÒÂö“ åÓ{é%ÄjM÷ÉLâJ=ÓË1KÍPò&Öæb£² СôV“„tt0Lšp =¾ÕNÎ?T0òúieqؘð!“¦²êžV‹¹{½†²<€È.G¶d;ºÿHœ±¿O9XT2ð¶ˆRiø99B¬wJ×Ê‚Æ:Ê5úF¯Ó³ýÿWÙ[η~†¡éX_;ÂöÇE{%ë ÂÄ©xzȇýmYª|“´´£¹äq>ðV ‰Î δإO ÄÊúKM Ì޻ŽrZRXœÂ`Hƽ ¶h¸¬ðx;1˜;3f£ªNx´zÓN.¤H–¸¥˰;>%„`Kº[ñ@^UmîªVþ­Vc„1­¢r•Yã¹$XÈhl‰Z^ÀD·äˆÊ82\ è¸ NÔïÚ­ÃÁE3ÈÔß[ÿ¤w›&ÐíBÔkbö§a\l”yòÞÌ¥“{‰«×ˆ3ƒ…¥² §Ü”ë½íÙÚ‚‘t|#¶Ÿa‡äz"kãÊJ](i9ÊC¼šç‚T+“FДŸâù ,²ºïìåàõ_ÌæWÉV0âÍHgð³Ž\ì¿LÚÛö’DêœrŠùlÆŒ9óì#šÓ:§{6g}Q¦8'avã<¸Tžº´°¬Ô¦k°¶K=âZ1È͹‹.BÙŒÅÝPW‚ÿ‰z;ô×7þ»‹¾~×É.Tôv²(« Ø@©‡¦G“îý…¶•ÃÕOŸ×Ô6B½I4 ·À|œÁ7ί¢Ö°DÉWòð„ ÄyÍ, Í50dƒSBîÛȃŠL€Ã‰–umЬ³ŒÜ²'.@ÚE5øhA…Ì%=–!öÞ¹ùÝ•§õ.~û¤) ÇËŸÅf 3ªgè?ͧÍÖ£×V.Ž7¡å ³vìÈëž<(ßÑ^ú3Ä>7 ãH+cvk‘|‚}ÞWÒz yÐ µsGSk²G¾Í%¦‹š½û6B}ByÆÏgA~¼^@åúwžÓË¡¡wP¼L˜úé %/<}8+ÇÀò{Îe4@JÚsÞáÏßÿ´Xp˜²¶F).~¥&2Pˆ´Yw¡2^Ñç2” *X´w‹¦9×ÓÝcň%Oå¥Kî1 îª:C¢¿š•M–C°(_?Üd–úœJ«°|­:X'¾azÏö ïA€hNëüsTCÑÁwh³XÂjŸ ^ªÃ9Ú0ã|ë!üÅiÀø<4=KqÂ'Ü2%4ÚÕ}ÑQþ%÷,˜ý"ýßwì2t#ÉÔU¬X :ž…çB”‹é;'µÏ›lÞéù»nɳo\º%‡aÙ»vn;Évz2ñÉ–Õ!ª°$pJfò^pû"*Ž-a}D-°°#»,lÝÛ‘A @0BV íÈÎR—4!ŠÅr¤á£IÂq²-Mçúe$½;Šdc²–Ý·¯J!\¥ùÆ7ï#ù«ê/>HOàB$Í™mÿß8Ç)Wå"Jì^ ¢ÀÕ ጘ:ÒKßß7§+JÚ™Uø×€×“ˆ-û£— 4«Ó Ý´Š)ü¬–ê-eþ·iÈQCƦ¨·+ LµPcV¡Ú?á.fHV Þ÷ÖÞÒu%ß(Í4,Û·¹ÓNî¡§öï®i™7t¢ñA?ë€U*«?§•]4 àÉ}ö$ª°ËG*Iø¶1 -7>ÅÐηöèß$tMw°"A–©Þ½vSPà‰×Älê¾Ç¿Õš—P8äAÅá¹ä û,  ^±02P/ svºžehšËÊ?3HømYð)MÏEò‹¸¡†–Q–ðí £°]nª¯êjŠôæNþf0 ¢tÀïˆÈWj1<Œ³T0øîmަ L™Iëë?i>›>­4^RJjØnck–ÇÆì”{©R ½íø†C¨;âC ;$Ëiߺ5žkZç®Óc!q“ö ¼aŠŠ¾&¤B¥°Eh£é;¸w÷„Pa“h_•Ô—Pÿ ëý´Ì¥ÅoZºé\Þ5™iÉ7,y©ŽZÅp{ÍÉ“a0˜pY:b”q7”û€Oa÷9¾"¸J%ôŠ#ÊLì\UdO¿òÇ1ÖX!ó©#ŠNa ¸•]m)G ;ön4¸LÑ´5àÀ&žuŸáqÉa” Ùè¯ÀÞí¬Ðåe°«ÊÃç틆ü@p[)ŒQüÊýG>Ö¯å6Ç¡»§l8…ÿÞúå¦4-Q¨þN~3¤2ý¥\L‡ïZ×á±n¥£~©åsÜ_ó,o}·¼kä+«‘Ñm—F®Ë -ü¤Ou⳩ðëÈs™‹ÂVÒÓ¬ŒžÔÛç\kM‡§ÖRpQ™]4=£îƒáé ÿÛö$ÄÁ+þŸ¾˜|wÁ¸& ž%9ûsƒIË79'PZ rmáЃ6#Š–×.úª»ƒð– ©£ºÎ)tÎWkÙªŽrêoA5Ø–Kuæ@¨¶‹—3î.Y¯™~çG<Ž‘ÊÓâùu™"L›Ê™y‹Úí(âíl³!?(¬œÐõ*aÝ5{Ž·¢@¶ÐÔuÒ쨀gž%ãR?´æœ*Í6?öÏÊ-õU<^(…ðYÈ7Í$‰ÛM¯™—Ým賡CQ O'­‚ëz7Ü ¶KJâ~°[Œæ„eRåwûð'¯ô2ç+ºŠìš‚OMOk"Ñåö|ª£(ï·4}Ø®6ZÔ kƒíÿÿÛmJ¬ìhAXÉ4w«:¨]‰Ë.´ŒUˆ9rk·:ëö~û\hûÓ!äù¼jS 2ÛÛo¼O°¸R/ÖÝP˜•¦/ÿ­ZJtš/|ð‡k÷NÚÁn\¹:xûuK{ÞIÄ}ª@ØÏ_‡î#JjSûA.K,'¬Èsþ”U׊êÍ®[DëFmË æx.‘ûl¢æÝm`,x¯ ÎcÔÓ7[é¼Õ‡›W2æf6ÍpÖk?á‚ÚÆvK˜Cí³@C„½‘Â×cà§ãT”wXzõØî镤%µ]ÑïfÑæŸØu`”1(µ‹?’7ÙºàdK†ߦ*) PÅs笛™–á¾7_Hã3‘‰bé~ø45F;î?si¶"•ÐÎ^Å™}DËGî R·e8E·#½éÕ•¬#žZ)Ä9LR.>ÈüZÒkCö„±>§õQƒå‚•a̼,B×/ÝÉ®Â8ýå×"7ì@ÍÐHÄ>šX€\îÿÅ94NŒûØF•10>1åZÓ¤‰ãžW!Qã‘ÎW2òç½]U<¬fÞKT~)…iÆZޤkDjVäcÓÐÓT£Z±ù l[0 ø-ìp†SzöÃ-ÒGØ!jÑ Hí},b3é¶ ‚ÑÝí!oÙ”C×D‡]÷¢ÔÐÅ]²â7ù\óºmÿ Ýní.Ø”õøÒ—«¨s‹ç¬F–ìÕÄ|ôÈ!¥&ùÇÜôB6çü •ǿʭðJÌ>œžô-BÄ„³†Ð„Þª¿%†“pÌ?<¬¢ò0ò›ð-®Å”gaR=MyLð‹dVYûÖ~F fæD©£Ç>«š™ÔœÓs¤‘Ü&1ïõµ£MG‰.œn»7 N”ÄÑ‚½ó¨®oì´EnàÿyÇ…Mö0¼Fe[´UÜ °!Ê ö4!7¤"ìK™.ÿ\ƒ™ÎI‹‘ÙG§èà[†ÏV8¡"•d n-®#S²Ëçéÿ\LmÜùŠÍÊ8#€ÆŽØì¶ ¼Çæ#¾âc;áø\×f3N‘ëÜ´a™¤üÉè™’ÿLóU}²AÔ*œóÓszMkW¤®¾Léxe¯½ÍZ|! ‚`J%çŒÑ¤ý±$Ù…E„µç‰n»G`V­shÇv…î*jB9¼„Ä>rç<æuhö•‘6[p^—ÖùAi*Žgu¹So3ÝAj…Ò”¤"ŒJœ:)Qh“Ü$)ý¸=#Úîj姯òS³?W@ka‹ÞëTÐÕYܾJ¥ÔÏcq¶ý€æ¸í=ÙÕk°—ñøýÙ+>ä²skÝš†Kà|uXÿñÆóh±§¾’~܃>Ï”š¤ŠØúuÝÇ1GcÁ1•mѹÖS¢¹ªùDqD„TB'bD ô0²Bª‡ÓkeÖÚ?H‰Xâ`ÒÆ:‚ðX†Çð䯼 ÀÖùöC0žJôÿ¶#ãûö4Áe:}OÄ}ñˆÞ®¿s£;a?¿UJ8º g»¦û±l‘] éÃX%ÑÂI7>êï¥ü¨•ˆ ¹"õlTªF]j¢ƒ÷Æ|ÑKbi#µS8_S8b­;+Xùò3!ÙQ²t´cj¡ô–F&*0¿­5Ü¢5›¾0Í]£¹¨qÛ@{üî®!Üf© «VñÝ>³^SsMñÿè$*ì¥Ãy´oh{â &â_V<Ç&$Ôè~! “VcXmr`A3íû®º±Œ©1̬Y…"º·}. ;ñ‡È‚„¿—éˆ%<ÖËêjëNKVJGÛT7ªWB"«¤å`ŒøÜ4’ô€8ë)|ª 4‰GÞœê+„ŒôJ ™B¯zk#F–%ºŠIT FËì¾K0ó5 5ý^Ð©Ü 1ZIÌôMÌï?2å#yI[ ½u>•¾Ü =8rœ»+‡?ô©xk»ÿ¢¤n…‹Úˆ½š©–œSSÚñïoåq¬[µ ­b/x-Tƒ@pù>XˆÑØ Ý|¼òÂäîFÊæÊçIgóµy·pc&Æ@Þs ` Ε÷3ªŸ*äº içÅgEE‹RÌÌ oÈÍM_¨M»†£Ô)+l¬ìšæFT<Ì­Å|H¿.âÍ™íÅ rÝ>|J0™Êb0§¿| [¿C†¡µ.‹ø÷ƒN1ßŽ[™ñlúøâÒ—¼m{åXƒÒzGl}q§ n¦— ‰‰gz?Í·™©`VxÄ ‘8–´ýúŒß)ÛOk,&ˆ·4§¨‡Ü Ð}»×¬¦ÝP;«ðSÅi ÐÛ£,‡®¡dVÀP¬¡n˜wcÏú׆J›bൌR È< z›B6ôéQc_É ÁÏ<}عàôÒVëÐØ2§–½èäKjw—³ùe¯~Úc`ÛÞ+ŒRÜb|;¶ @ ƒõŒõ©e6¬ U¬®ÛeR• £ëI ØöHàTƒ•SçÑ‹Rò‰æonù8¡–)c(G×3. ’DÎ4Ú»‘úMÈ–m~<s¦T|PºÅ–7Éu‹ÓjæO’XãÑ·&ïCè^xU«„›Üi€/Õ€mÆ}禳 *2íkÙÿè쪀`c™Ë¡&*Û(‰•vB‡jüÀ6ÒÌ3,¤ì¨ΗÜ:œOVésÜò<äcšNLÏáèlj26„$3nâÖåÖ˜nÒ¨Ï8ú?7Â@³ , ÏËlQÝeR?>Rç½ß²ÈÑs=ÅÜ·Ù$V!ßâ—Û+*D¡l† ÒûÙ ÊÓ-™Á£U}õk}E*uRÛÓYH_¯”v\pY¬Ó),Ù¶HÅïˆ(¢Z±±Zà=ˆ¤:%"¬t ˜’¾ý Óá4™zxuÙËX”`©æäÁ [ýÇ—ì¥Õñ‡v Ò)gÌÃiK ò-Š‘Ì‰T`ë¨ÇMûB¹©}°€R8õ‘Jt°bjšÂz~ĉ>þp ^Ü POÒ"\£An´Ãñ¡Û©­A4~+2v§àÉ€`©ä_xd½ÙŒžLÁÒš^•@E’þ²E·ÃÍlÿlԪ崅ü´²jH* ¯ÌˆÆ•Æ[cè\͸ïÀöžó|ûšP‘¦9LM~Od³é@sß)6Ðñ©|¢⧸ãòŸ‡û׺©ÁøR9ǶPüØõÃc+Fg%¹…5kÚ/¼«éú¡Â.3Œ«êwBÙÀ/ÜÍËõd…ÙÑlצC¢¶ÖçLŒqxlvmtï/Ûœ¸ð”{'-œ®êêRVKñÝïÑ1gO]Ù¦ T·Y˜3(ÏP™e°ƒýÖœÇ{·äºbOÇúâw+a„¤& ~T&kÙÈVºè yKEÄOܼ¥nzÃh…Ú¹Å=ŽS$›Pôe-ÙAýÚ¼ÞQ «¾Ðé£õ‡ì„ ÇÆüpùT`ÚtúX“+zÍ„ÒÖ†7¢q¹sˆ,ˆQ—æ©kmG†ò9”U– !âÈ[ö”tmNªj˜u `nÛrGËŸÞ±bI«ÁRZe=›ˆR5¢­[<÷ô5‰D.é«Ë“qì;jÛz}·„ §ª±‡ÊbZÞý3V’0 ³q©”‹<~”qå-7ýÑÈ_¹ñE¯™`Û”›ðºMaðO…ì Öô_)€U‹TxÕ‹(¿Àc[»fÐa™„Ä~ëpSÿBHi𨦬‘Sò•*TIJd#ä£gåçú"F¢_Zßëêæ0k¸Qà~· V›¢(8Ï@ ¯h¼Ùë AÅÓ.Ä9©’=ÂçèVnZÁÃB ráoö¼a›ÞP_çx—¶8DHm Ï·©œ2;ú§§(ÑW}Í@È€]ó47ø>ú¸þƒÕPncéUzB ™¾iöû0,Ôø?N3õð' Aeì§hòkkÏϹäcãîtWˆŽËvéÕk &**I‹±Ä$PØ1K¥xÕQ1 M?%IúçUx_ –eL[ õ·*GÕM‚Ÿ–¦!ËðRñÕý¡‘Zõ‘„m«Âo†•Èdo¬À ’çjbžºžÞ\*~e°ŒF¬aú¾®¨|Ä¢P†~9¹E”L`Álõ,øÙ O·ó+“Öý=Þ5¡ŠX¼N?LAòùy¼Ø ÿ_¶ûÜ2ǦÏä{X^øn†>/Ç&ŽüÞJkTä.vÇÅ40¬º'MÛ9–¬ @q/ó)›å)o¡ƒŸ×­{¿f¬Íûí¥á‡*ói¬[îüª-ìîG [à"ºoÇx,PKu¾–'ô¢súÙ]IX%D볪DI·}±ÃOQaëâWÙ©dÕØæ.·?@ .,û0›Ñôq¡)°Ô'$¶NÚPÉÓBó!%ZÎÚ›3hé*xÆ•N³ÈTbm~šT¨6Æ#Hø™';‡«‚e¹Hýã¿™3·"|J÷m˜áô+Ô"‚Fï ½R´¸íÙ ö69Í€»Ô&ËÿbPTR*ZPáBµÊé3™ Ci¾?½å¨Hæù+àw$}4mZ]Höˆa|4£TY| 0)‰¥^ƒ)™ômÇÎtZÂc _DYMWÿoËÿ"å´sExC ͳy—p} ÷¶üu}¸×W¬¸`C£0KhWD§ÀãìË쟑ªãhäÛ€ÚzÀ׊±ñr.Ú«A[ &:›ù8¯ÕF²ÌV}ú~³®ØÜ“»÷Ìâ•5]y™!mLD”bÓJç÷1!ÿ’Ñ&‚%‚ ”˜’xÐsÍxÕecy´¶±AØÕÂ5ÐŒáOé/Ðòn}oešËÈIf ~ƒÊÊ05Q¹[¿D­ü÷h=5ÇåNµ"3GÐ3Uö¦E=X‰²KèÎ#[¥íå¶ëo‚Í+wÙ²,hGÍlžû½ÿ¿O”Aç´dß™c3¸K“-(ò¦¹…8¬ ¯@ÖˆðN¬8›yô0SîãiîN#Na::u»¿€3°vq<èížP!³“¸LìÝ´Ž²„…2*ؼږJXb/o‹”5ñÂPµ܇b(ê€Ëžiᚣ.ŸgÄ¡¥AÁ!ê¡ vïVn*âà_Ç ™üw;—â²`¡4šY+ç°©HUM¦\h¥b¦wö 9A°¹Þ5 éµ »ÃCôʆ÷_TÐ@ª"!U+7üê¢S(¿5£¶µÕ•‡üf_„Â0ù\´f]Tã‹Ú¡©y<²ƒy"‘ãæ\!/brHïoÂwYý^öج°>ËÖÈn¦.|VüÄN˜•æ{‹ÈóRä-¨Átó¾<Ù, ë¿dÃõ:Ö?ãÌé¤G£O -1…H„*ަק’؉à'ÃrÖÈ«¡Y$îl·€Bå§:0 OXPT Sd¿åß((Œý£aÇèMÞÏ£áÐǘ’X÷’ôK(e¬udmÔ—f–ÞnÁi¢øíáƒ|Ú™¢!N>2~k˜¼³UбŠ¶pquXÝv•zv“µëe=ªâÞLÐ Ìx%Ýç™LngyY¥¶×1ðº>º"p¦5I¾¡ ùk¢y"äló°Ön½ì«ÂiÌ£äCÙFJÙ†ÌÆ,!Á]¤ämçéˆkw±ÒƒxÕu-s‘aw†Š¡Ük/n‘X»[ƒx“Ëí_žL)@[õ¨ˆæ¦”vt»›Ðú ›Ú%”¯õñ+Æ; ×%q¸½„aʼn†Ó0¤äDȘ`Oç |CN—‚à&¯¥G’ÙS) 2SÈ”öE±U¾Ù"ÂpOM¹vwl“³'”5) ªŒ”ªMŒŠ¹NÐ=(=#5]j‚'ÅÛ fÁÙ@c=Dj4A˱Ž9Ñ0¸5‰Å =þ÷‚°e.ÍòÝ·Ü´fO¾„Mrœûåt#¦mœ»½rO™ åìÝþ¶d‰L “Á ä¬@¹†TªUþ¨Ñ˜1úibk¾n¯ÌørÐ ƒÖõÊ´šmqÔ¢!3cBÂ]%or<éEo³° û×)D)6“AÒÆøßm"ðRÂퟴ$ÐÈÄÆŒ ê_ªà°Vþ‡Eå•Ûù…ÿ8¥à,2Á™A #¤,)f4žàCƒŸ"ÙEú_pŒÍcà3NEÿ²àkãl ¹’ˆä›‘&³ýåJshk‰¥£]ïH8Áq3úž1bLþÈ437‚$I›—ÛÕ·z¬É$Kç³Wòþ2„ø@r7:íD\SFl[ë'-PìY=‹cÂV¸†ýJÆlÂä¬Þ§l{K|~ڼ̽ç¨_-B$&ܼj(þÃêåQ"¼j)¢m_ƒ„ÛÁ}rü!ð5›¾xtî;zÎ 4ôz|÷ßv«?Â!û LǤô‰}Ñ"ÍR[ù"ölj÷V¦.åË+ñµ«áŠªá3j8 ´˜BJˆçKl2X?ò-C_ß6À#XUwx°R†¶CþŠœú u ÈI<‘ªëð/€'«t%Gº¬e•hûV‰èhÙIC+ÅçMdLÒ¡¸éêpD^ºyáôaÛ¨º¨·€  ò¬â*QwÔX6¹{´ËÐy-.Hó[-ÁäŸo5(DƒÓý½yõ±›qAž\ ]9ð½ù(šâÞ¥èí™u›3Øã3Rgpê8‡j¤º×Ýjyí•Ð’ûRz¡‘U»Ðyùèû‘L–»¹~Úîq³‡´H*5krw>|©ànky>Î$&õCAtéG˜qçÂ.Gõ²°=i”wý,3¹]uLLü`N÷@.G¿+ƒºEãÄD”½îÏ;Ú$ñ"€¬ïaÒ*å^W)9¿»7_tèn9:’£:qÀÚ1M(/ð=sVQx¡FÒåó’x¬ÿá53}d|F†‹K°³ «?Ó ¡GÚûpžåŠfƒ~A7z6:“ú a{˜j%\YpOB‡ç˜áß–Õ\G‡¤l|ŠmË_\è¯ œÛ*áO Lòéß¹ç?2ö.,t6–VŽ6j§sÉA•pì…Y’̇£W*P»P–@ªú•8¢ö/9IýBã,½ó}óq|ÕÏ5´Vˆ' ­ŒÌ¥èYù§CÙWÏN7o»ÙKwÈ`I(¾þõ ¿ñˆÔQN{k3 huµŽâ†­ ™Üì™îÒ@f'bzžÚ¶–æ”ÔÁ6è¯Íîþ„¿QIA*¥ \Bd¥ï#DB¬ÏE—Û™ V Q53ÙT’Ë®“Xë½>³­ónXÏIU/æìw¹S j®ކëã9…}Q·™ÌþI†Þá7"¯"¤l,Ã8,íT04ý²<åoÒ]qàÍbl=º|)ÆŽbž–ºP˵-ã’_a%à+Lió§L$oNI¤4älv× ÀÀ¢ ͉Hì€ÈÁ\%Óuê –^wdl Ì3â1œû©FýØ&_ÃÀžû‹$ÄøÔÐÛ¢ƒrOš ‘Ó™\pÐ?GY“êÌÏ´ | CV¯p™\Љæ¹0%Õ²c2`ÐBV³wAO (ÐÊk†eJâÕö†Dœu_+ö… ]z; ‚³ÚêŽ+é~Hlç—ôß ù¶©'8™>*'/U¢2¢GV0sA qVýá?W„:I,2‚¸µõÌÒ²ï§éÔAòo¹eU=¥Uª¢@0QSœŽÇ¢ŽÚS±ØPµ¢öfó'NçU8¬ˆüfäúþ1…‹ó jÂñT¿ÑÊ*”ëÕb÷¦kᨙOe'¥6hIH¿t=é Ú”ÃN’=÷áDüfJÕ‰Õ˜Ë}EO6R¿¡²5dö'LŽ”GÏÇ/¤¹¨W‘×ë\›û”^w%Ühä¼öÆ[É ´¬]à$ud.Y(\›ýhüapˆcX©´È‰&úK¤cþ+kÌ+ƒ¶Ÿ%ìê‘Q„ãéÞ¯ëp*|K¯%Ñè3mÙµU|P2w;/­aª5;)= )Ø ªÉà¬Ô«œxõÄ *߸ôÊ@œwâJÒ×å ­Éê©0vÅ[‰µ)F£ªFZ« 2ä§Ü}U臱tW\޳(æs»D~  :¨fÞó€ "z>UϹ€ûÓG²kôKŸêéMÚsÙ¶\klİäÛ‘^ Q¾@cWo+¾CKç˜×ó/àscEû(\¢¸+?Ãò´ë%ÿؼ/]uá%ºÎœdŸQÄEŒÒò–$¾Ÿ†åQ>%íâpDÖ!” dÀT6 n÷ãX@¥>ý‘¯ô÷Ç2äÓëëQ År8ÜÍeHz=óImï¦pôt…™wŠ·G¥”‚8WûoS^E¹]ðâ‘Gºx…Ž: l³Pì\ªyÿ#OÂO­xöpäë(Î&ãàó4*ôþ'´)óÇÂàFŽÞ^Â#˜R²vûEdm›»jåq|ÚRèayˆÁµ-¨²Ç'ê*B]Þ‡ÚmA|xæ¡‚¿EZ6:%B±-½LJ‘£!Ã3ûSTr);°œ¢`¯ÙÁUDgŸTIÞÝ:–û°öA\ÑUƪ‹´³ì¿=õ½s2T7‰d: qm4N³µ †´ôFí«‘m ÆiýìЉê_ãIBÈxöoЪî[ža½ÑÖJ¡PhB¡zý¢ãàS…N_æ¿2þ£¨Ï¾þé¥Ka6ÅÆŽºUG<*1MÇÕÞQbï„×£âB*öP6©žÈšL¾FfÌÙ–‹_±`n3VM[+(­M­úŠúÙ‹_Í÷rº‰;D:<ÎD u–]íö¿[–ÆØ;î¹Ê[€ÉëªÉã¶~ˆ#õ28ýÖ}ÓsûíÚÕMšv©‚¹ÛÝpp%š¹Å9ðð»f?¿!Ÿ8šÏ¡v 6Àúf+&6¨“TT­Ü”cS¹Ç£<­Z–V-o‚Ø?ÓÕ×@œt­û't•Sò~Aá·hþÇpJÑ0õ{úiüBŒûh1ÄIà'<²ýÞ凇VP˜£°¨ÊÈv˜ùœÖ5§«2÷‘LÉÙH¤(oä…àlµË蘵üdÙHB|Ψ41Ôgýá2Ý™^Ü&ï›»tÀµÒL&¯ qgW˜ ¯¼hëÖH±æµ*XV(xCH<®H—Þ4ŒbŽ9¡9gëáÜ1 ï½ ÊLM,AwÁ“ RT–_³úJXÔ©Ž¦§xLYvfÑû†dˆ´Øôû[±åØŠº[©·1«á2_©RY1%Ί9Únþ„ÕŽH2L¸  ”~[éJñÞl”Ë0ng†v%¬ßš‹ò±ë.HT ':,Àsì†An®ÈËŽŽÌʉäƒ3oNáëjŸ$}û…É \ {aÂõ×Ó,i)1H0ºœît”=¡´´_×À1ΉS ¿Õ‹ÀkÝß'ß¼6ÂŽz‡IÍ2h®¯(Ԣ˹ùxG_:Òûȹ )°`@?t·ü¶ ȸÚöú·S’›v‹µ’ᣣø´ð1§óD{p^£Î¤°ª©Ã9fVVÈý±ÕUÏ.ÎþîÙ<35„5\¤~Ÿ0Ç'›Ü»¸Å¢Á(-O»d~ sÓÙRë P¹ƒ>µyšì.š›Y¯µ©#WÖFïSÞŽó¾t,“ð G.ƒ~Ñ”ŒT¦9ZŒ3 Ïå3étnÊ`Djoƒ’ÀîÇš mÒ%º6¸f0¼L¸á¡¡²Ÿõá?ewÜ ¢€ø³´R}H=:ÛL¦”à rͱOc¿ ¸ìÊUȱÑyM™f{-@äð‹^–ƒßqè”r’•Àäy@|¬dl¸!^f›?ÇPO!X¦²n)¸ˆmÓDvôìjëzÎ$0M„¬Cá•»5€ˆµ–#P°›2˜›ÂK3ûgÀ4‹ÜBIM%©¥jËé=’Dò§«v’"Ê^ÜG/Ìw®ð¼_À^"À°T>I›)èÝ~ãÀb>HaP†Í|7ƒõ½„3çNóþ¬»ò•šnKÓO¬¥®“”¦rŠ <é#hE9ÉzcYÈ ÝXrCIJÙÄŒÀc\„W’µ ðuÈæ}ƨ«(MÁeKæFüöÓ O³# ȶ[æÞí6l³Iú~—‡ÒýÔP0³Bë0Îú*„{ $ ÈÊ ÕÙâgdpp¢ŠÀ /¶ ßSçÞ¾ýD ¥÷vQå7©Ã½M Š"†ºgˆ4êÞÌhÛµb°/ ôL5öHKyyM¿!ì(>;†¶v£PΆ©‰XÅÂߨ¼0²)ô›T–L¾'V¾\¡2àuç®Qôa˜(‰ÄßyWå¶ûI8„†£‰útµ_ý+mp§íˆÔÊw~@'WÚU«’hÀk3c5€ÛP­mCVX½ûG!5¹Lb™åyº½J_XÑÜ›­D¥fxÙ2‘>r/”5Ù˜ôÀ ÄÇžÂ2óTÐÓBËT4%s~ õ²µMXLóœåý¸eë óOÚw¶B¾Šá¢¾å¨­é ¬C<@Ï়ƶA/í§–ú`ÌO¨èNR%@·@׺ETA=S ’(9]‡÷_çgìÃxúÅE7(‚ú™àŸ]£ö|àI;I^.õü° ·g ™ê 5µÓZ¤öÚ.< Ü4QHæÐv‰P_ÄÓ;R@ªtœŒÙ Zœ ù/†J|±}šJ é[K[~n”⪺ëõç-i±íšAˆÛåi—R” ðêÁð’Ô½vk—¾¤£™¦—Ž8’ˆÐÈÎ\sä­Íþ¦}Œµ O­w,Pd½fƒOd ó(«”² §€9ÉÁœØý*êý ½“x^™ë X“½Mµ°:ëÜ|ˆnt¡õƒ”Ï>-š_ͨÅñp²c´:NûJ½Àð?M~^TñŒb¦ÝÒŽcF+Ì-¾C`®€wEŠ8BâY W@è õt1Ø®Ý&çÚÙ|å(=±|òXûÐó¸Ûd"%{»À*©¬$ÛQ¶HfÏæ-:¼HýRbéM¥ô¹æÆ>gÉN†.ZQ†þ6o’'Ýö(PÅþA¸7³x3Í%ÍÃ1ñå[é+õrnÖ£óÕf®>Èj^ïÏ4?à¦M=É⺥ے²ííÖí*†hRß©b±¤™Q$<®ýºàÓ£^8WЃÎ"­6Ó©b jÚ/2¾G¯úèD= t°‡¬H\áP™,ÒÜh¤ÉL„‘ Œ2Õ¹kjó-£'¤n‡ÜÛ9[x+uÛ<—†è—ìú±ÙVðªÍµžNæa§‘ú?7Ø#÷èB±;jNµæž0Ž“*ÜÐë›õÈ’¢×¿ÚíÿeÇ…‘¶yƒÈbü§"±—XPðò¯ee=š¡ü¢Ü+R)‚¨±bšò‘ö=¾Y:{Â,cAÙ£ `ÁêýB6ž•ã?ØèˆCbhü§ÝZ y{µ>£É'Ò0Kuû× U**øžZÚMâéþ©žØìäîøâ#wù-³æ~bÉṼ‡!„yñ3²™ÃÑ5£k(»J„x´~a¼<œRµ®÷¹½¼Î†G¯S½DªÄ mp3ht1ô”ž l/Ôr© ¸ïí†ïê¿úµf¡‹üÚ÷ŸMFØ9ûñ¹«p3®uy m¿üHd|¤ Wk©¨u$Ür3>T½Üöñ¬òîlÿûY6U[6£p }»î?{ØB• ®²i8>nÏAè^dv8ÍBX"tç›4‹²žMš¡bôÎëNùÀ,3iÎgEsÇ„¸<óEí*b’ížCãv:Bè"E´P 6´Î¬D²°ÅUžçL+wªÙ&Óû&¯Ûº‰dû©o‡%Œî)1ýø$?Í.x1´Ob:¿oëÛòP&ÐÞ¿î×OKv¢*âéÀ¿)F\ÆâÒ!€ÔºÕ¿@úZÄ&Ù´}è^>Ha<Ž A‹åv0Õ®ñà¡îÁú˜°0†u´ÒÎÅîS’íáŸë‰ÿmz÷’ýyõ˜ÇíŒí§g½é&íо°K™× ify”X—öIŠf‹–Ç\jÇZÐq`µû†Å”ýÈ‹‘ºWkÎí:T“[”©±,‘%RM(ÚÁ®‡‰zuÞ£[ìA$C܉®áët{]ÏØØðÏNPƤ¸äõ.un¸tš?J"Í¡cU¡¾aæ>l?S%б~QóI„ºS;t;“áJá¦ôϾÀèßhÙ³/Rì~ÐÑíé;ð.H˜Ìç1B6aÈåŠ3òÖžÃÏæ­lcɹ¹€TüÞ6Mé{Aâ „‘]–ŒÌß%¬úKºeîj)ÈÌù½*kìW3'}E@ái#jm‹!ü"^³<º›rˆ$×o†ùëêõ'W¨OH¤¦ùMµœÿÛP|]HU%ïRJBÜw—FUil¢lüuÚ:’dnâiŠDéj% #I0¥ò]R$†þÑÕ|Þ+ëUËcvÉ’rF„ðœíCª=OW-é-+BÇl¸ý%¬w®QQŒk?oÑÂq²MWÜß Ñ÷ê>p †œH¾wþžéÞÅ& <ÀpjîÕÔ óíxÌÃxxfn©6Ô>:ïAÙÿl&qêŧž¾ ëî¨Ö£bò»-ÂZ¼|xÇ?Lk€9j–7¦ìZ0£ŒD_Ý+¼ /!O›êTÍexµ¤\ÊöÚ½˜¤Õƒ_ã&0˜Ý p™?’Ìh.Kœ:³”bB v+XàTfí`ÍNîxt®(»& ñ 1±CtÚ‘«‡veΣuVT[ÕÖ€˜õÃ\®–"Ô®æ|iºÜd|^Ýd:ÐmµúÊ­ìã ¾ùs@·' 5ÄU†šWó ៯ÍËÛ®sJoz{~LnÄÔX`%CÍ•èjÓM÷(7¥†‚¨ý/Å3ƒã%$2¡J¯¸¯Ì°Á:9þW/£ö„€QãÜX>¹ZñõŸøAf¥¤8Å"±ÙÒyÈÏÏ´Ü«Ô,p$¨- ûÅêÊI¥\³Ÿm`ïð\lèDºf yöÜñæ&Α†ˆÙpN4LBÒQé2î|ùFgs°—¹!]•j>ÄÂCóÜÓT È"HÕ²HÞHØ]½ñ¢^|ï£<ãW¼G)½W³U°QwÑøÚ;³‘÷iÚƒ¿©ÕÓò’s›2ôÞýÕP¡*J¼ëì´Žh‚åå1À YVb^ð{ƒýx>‘p CîÓ]ê)ð<Ú~ÂÖš­9ÏÞï±}ö,õîVR0³kÝ!¦óBY5Âü2PøÃý§å%–"dÁ  Dí®5zZ—%ÇN(~0L“™Ã¯dž†ÐˆÂ)‰µ¡ó*[êÿ$…GïÄ;E´‹ÇJy>ˆ°ð jºŒ?¦Ážtºz åÅ_¦ ôyô1uçz½*Ïm‘P(v%ôÌÌáPS‹¶“kXÒº=íqs¬o¶h΋KV: ëìøw‡Ž­ÆLŸPƒÚ¬Î²<+–ÍkõYlÙ3D õo2K©+üß;«—C³0ðŠ9€{Z¸:ÆnýS1²>fÞt6Š~÷ ¶JAÚ èÎ~!;¹Ÿ®¬ ¾ÉÔl÷æDyÈj{EF–]6HI„Tl/7¿Æ¶ûL_ÜÞdœDwhñ¢5çãQ$´GŠPjß’ž è-«HneAI}>ä]]÷=öÎxY#JTåM‰¡Ý‡ëï·çîžÆMýæ5ñàÅê—¢ømŒQgkf=wú—è~«qý…ÆÒ?î£HCÒ·‚7»› v ËÌ6º9ÌO6iO üºçîKT[Oy2>!'ÛX(ÄIŸN8 *û–.p¹¤x äÑØ*ÌðrR¬Î2bµZÒýè°XK³‘ý§2“BGÅtlÿŸß#­tC¨PNEw~‰ëãŸ)²?ûjFÁzú`úEÍÜV”ðê0ʽ è0ðKtáDMàœæêS äO!>÷‰L­#¼8ò¶ÖGÝRÍ'RÿÞ@³HÝ…¢†g(Ðé ·‰AÊKÊ#¡LÖIôÜÌòîq¤’wúO×€ÓÙä.¿c§Zœšî2ï–ŠÁD\ljX‚kzîDaì¦Ç]Èr“×`­ô2ˆPâ )©ÁV´‹z8ß0®å4Ѻò¦O‡˜•Pöö¤/_¢y—û‘ó ÓÇ_u´†ÌëœÞ¦“‹@Zg­œ¾–3/˼³¤^ŸŸæ>ð±g…ÎÙ~Ã:¹Ø¨ô½^‹ 9©¶L)áqMæTV·f©#¿káØYý&èBޝ–Qpû¡g_³‡²[«joìp°Ké#·Ùí$«€"‚VšßÀ¡fŽ1uèÞ‰kŽVÉ“Ê9°çÝ2kZ{Å!µ}R yYžÆ•qíŽ-© ÆÐ³Ù:­ï»Œûîú«$Q¦LÍ{Œ<Ï=—¦Àhs „› #ÉZ…RÇX)è¹e,ï¥l9•+2&äS*{²V$–¸tvâv™"º‚ϯ®¼$W®Ìžgeèf[Û57Ï&ʬÒ\°Žèä¨-RUDl+Ûÿ¬]U¦hGá —Ô—lh¾5aiÅ<†ÿ“ïiÌ(¶vÏ)¶Þ &W‹Q—áÝ‚Ð=!á—þ²“¬CÍbh‚ÐŒå †3ý4ñµ(ðÑ5vÇïïÍPÎþ¢÷ñ^ªtô­óù3°Ö?·éMã±…Ø´ô½…çŸ@Š ×ᤠØþÔºŠ#Û—€ë|Œ »/êÊBt™0h`âWû†òR%nÝØˆ«><Œuûúãa1O!Ý0ïlhéÄáÖrÅÞY[­ÆcŒKië}é_ç) ÈëÕ"[àO×î%þ,#çåúZ ¶ÞY‡rçsAÀå©eÅrZËâÅrN›Æv›69ßý©^‡Çëë¤j¬Ø ÿÿÖÚöÊ1>ó§ x”ïÙ+ˆ¢D©{Մбv ïR!¾@3Ö ,W, Ϻ•Ú§!ƒëU'Ù›Æ5›w9qº¬ªôîǾÈYRˆÁªî¬ „†Z1®þI,P­ 7évI:,WÆB0岫0/¡1­‹HŒœý´Î5+¼¹¾»ý3蔫º‚Ä%¡‰I7‡ˆ„çK<¼b!w+ :Ó2AÉ^°©A•²âRjd•¸r¾=R¹#Í4ʵ}ØÚÃ|§)‘rI,ufw+|YwB¯²NȆÈ9©}Iä†ñÍÀ=+†¹ ¼ÒÀ¬döJõ¸Ø(E•£_G -œYÑÃÿ"FíÝ@ˆp3ÀùËhytrf iÃ*K©mRÜºŽ¬>Úd0¬îãózbªÉï}½ˆÉõ?©©m™ŠUã#òƒ4þ%,SO M~…†›{5ÒÄMöpZ›Ù›åÚ¸’¦Bð-l0Moú@µ´ä¸ÂnBE÷$]U)·Ðº¦Ç:ûÂ_¾´Bæ ÇŸ<Šbk„ðö±@{|#Òügå©4å'/“…àH°… ðZï?öêTù܆ç¦qU¨ˆ%HxË÷({Ù½ÃñÚxŸ7 B¢2Ž!"…4½zô­Þ' V”fVyæLe䬹¼z!"÷KÞØ!©³›~ÌO'þâ~¿GÍÀ¢%ñrדvÊ¡.¨|¸fÄå}¹9¿zD—`#H/]!ÙOÙÞ¥U€¬ƒ.Èýº +ÄEŠSè" П³¼¾’ë'qMYð3xþñk‹5Àã¾&1˜¶Edy‹#='^m¼`#·½4øCÞ>ÊMHÿQVdæcô«aÚŠ-¥;ɾ¸O¥Öd­Da]#‰üºt5múƒGtw!å‘ð„ØZxÞÄôxöfߊ‡D2©qÿéz×´ùÓŠÜé/¯ÀA”«~`‘“4#>¡ë«5×iå.¾îˆs"pîµú?LU‡þ-©²›k˜/FûxœjJ+™Th,xªìHÎÚ‚-Ì‹Ý :˜u1Ç@¸ÜŒwO- …Av¨Ÿ<{Ôõîõïªc(íŸ^Æ|§ RZ%£#°|Ø4™ùäd¢ý4]_]œ 1«z?¸†E^x·ïðFY¡à²mvËÃ:ög$ Ñ®wFdÑ>ªbí7'U¶:”C†¨ÏF•M%Z jV¹5¹~àb;Kà_úæy›çEGQC& *Û‘ÁJw¡¡ Gþ¾Å†!4I¥ ˜äy²Ñý!Q|ÍéÁ8DNþ[êo sö”8ݱn2Õ)ÌBVeª]–u÷¡¦KNüƒÐv¦o-)h°îäoÔÖZ¥fu¢¥>Lw…hš' ùÌTfCÖ©–'=º2aï¹»ÂåN×6¾¯R{~„îiG=A+d½h4nk¤<}x‚¤*Þ ø Ÿô5Ft´„12ÑS¥‹ìÜÓ.~>¸Ûëœ7™¶”«8M¨”ºõ´j-\®Å-/Ç’p0jþž!Ë5û‘ -Cñ€ç(9©É›Oú8V!¹áü„mÛò0¨(ÞøØñ>´=LÜÈîÒmçî€ ¢\ PÁïžë£ãš°€ãÎýNÙÙþÏtji|[þ_í©|ê±á-w·”îé´u…ñFëÜóC^_°jY?FÇÐJ†<ÙÓfQz4ãœt†œhÏa!±mz›°¶LnÑ ¦»³>é,èð¡Õ’âãVñA{¶B¡3oS/yƒ)Á1Èb¢žüÂdØ/a%ÿ‡î§†ö '•·v<#hM|Œ ¢šS .§-bSÇè†ÕòUÐúÿpRÝž >Cm$Õ'É}3e¸=°œ2·ôólA»á( âu ZUÒFÚr›OiiÕû9¨ÄFÞ½€À"¹<;Œ0ZÇ/á~¶í=(ÃÒ” ‰ *„§¦™™Õ,lÆ~ tRͬwˆˆDªÿù2 %{ùm:£ÉR[aW®~kÆÔAQ!øÕQG–Ñ‹yU`õ"@êõÓ&̽¶P²óÓö£—„\THfaÜûÎÕÚ È©åÆ¶?W‘Ÿ+‰vOã—{j2žˆUÚ5 ‹˜îs¨°ˆ')k 6U:P¡LþtVz#Õû§~EǺ©U³¿Ÿw¨Laê¾ÀbjbxÁdy»¢™$¤³Ù›OžÔ9d ¸%VNµÅè5>ζ¶êø#r߬F?˜õÇaE¯Èßæ[w;Iþñ˜¬¤Í± %ŒŠ‹à›WŸf‹âøÑÓ]oëAÕ ¼4â]"º-þ­?ËS¦b#:Ñ5³Œ/†I1£•Qƒ]kýBÓœèJEÂU¶,•ŒM>„ðû(á³(X¬ˆ†2Ð3+¡àË¿8ø,=û_ziØ0ylD`ãKÀ6æýÞQc$}ØNàôû©´'!GàƒmgÊ FÀ˜œžÔ7@u÷¾a8N¶fÉ@¼ˆ{¯2"¶ÁãЮÎ'Ž,z~ye'#lÑWFCC½V¿¦Ã§^® ÌÔ±þÉFøSå.Ôñž §ª{á>]PÓË1)8MF)ŸÀ©‚›À+"Ïø hÔÆPKSÛü Ì+æ'äÃ/»I?,-"ÂÓcò¡ó`vm(pÍvsXÙ»ÝZ|8€ÝH¾KDŽ©âÈÆòh.z‰„ˆÏÑbJŠæm[2ÍrË…sÀ¢oˆ£Æë1¥_ä>õhyuÊX**HN?gæt |›bl[îý­þ|j¼"ãE©ò¤Iò¡:º¦ƒ:ÙœðH‹]™Nj1wmø˜\»Yí¬ƒ5…˜dïÜz¿–•WŠô?¡,] ´ªëµãE<ázIòèÚ ;½ÂyØåKR‰g¥˜œ—–_WF2Ó/tä‚u'Eˆ¹±$r"›°,\ó{°Ö!•¼U°½6â&ÀŽßÿòƒ¤䜼Òç“’Y˜ôsÌRÙœ)ƒE²$î(ª¼\?lLD6oBظ^»_ýí`¬ÍÁ+jÀx©êö|[¨ûf@ôÓÁ«®›ó·r0ul'ßÀÀÞ`p#‡µ}Ô“x!mfùR{~¸!w"þϬlˆÄ—|ÀÑ{¼€ ñ­øV+_ß9àK±9 Ç/2é¾K–g5«ë&í튊XêU¨ì°·zŽ]‰LÌÑŒªÅÝIB`´„nþwŒºÞN†M¸ãÖŠèûÀ~ñ ÏVÈÒ½#4°DÀìb‡ƒýˆâMºB¹ŒiÌÆ”“%5éØÔZe™‚,ê43Þù ƒý7]Nt ö®œZy)Ì)õGEYÆÊjÚ‚eŽæ=Õý!7½%ÉÀaµjZNœÈà-ê#aáãÒ#;'ãSŽ/h—k¼&uyâðµºÝÚ-ÂíÑ”•Ôù`wøË`9 ‚f‰þ –‘ý×&ƒoqã§ZMÝ‹º¬š%uH.ø7Xð½ó®Œ‹רzTÀ—QÞeH ;]COÖÒš 'ŠàºdfV)ÄÝÎ fö„†˜C5¤¸šÍ¶èu¥"ä ezvVb<, ØPcƒJà<×#Ɔ’Y»µ¿v(YåœùZ2Ñç¹è3¬òÙ…ýüùrY·•}ÐúþŽÞº~!û4¡ðñªQˆ±ñ3à¸rTã|á-wnÙÍ d¸¡Eçd¶ô8 ce‡¢êN[Fɉ¢aÚíÔá7Y!ð¶P@AZÈ_1õþ[ܦ£¿g3uº˜#[Pö #XÎóXKÒ‘áÄ,ÉšŽ§Hp­ïWº-Ûâ.çr.Œ$o† {Îßk¸¥#Ž1Ÿ~*>œ‰ÄÌ'‡ÝÁ+(QU'ŽX«"л­Ë'EcâëjÁ,t H¹-A+&²£?”†ðEÆ"U£³QqQlÉÈ1g‹CeI| ô½Km{›ò>˺×+Zwñ}?uçCV­àãpÇòVrÌÜï¥0¨|Mä1ÿ/f+è·+º^ÂË8™et k»xj¢Uiõ¡¿;Ò¼ÁŠ`¿õäî Rê"5&\Á§Ur襌h¨uàŠ¡Ã‹¤”Ü¢&9üãWzK³V=ìu1Z8X'w‡º§ªÓN ÙlËr…&À(žV}S~}ôg¨ ÙHQ2Ôx«¦ùo{6G£¯›ζ+UàXÝРNâÖ&*-„Qµ‹Ôm2¬ù‹‰¡©ës‡Aë„Ox€ƒ3¶¥çóÕC…™wðîyÆ/ <°™ªHgYÐáfE¢±œ·ɸp½¯Š'Öž‚CYΙž=8•Z•^I˜MÛëøÓKXEëˆÚØUÕ;g)"“…4¤B¯åéqê1Úñ;dTk«ïKSÄá4‘œøàÇ!kÈD;D¤Z$L`¦åù<0tÍhzˆòm Âr&nÄKœµñy³0îÐ"…—aYˆí!¡Ô-®¼¢=2ïtH9‰|ÊÇÅ?¤½Šî7`L ä‹*:Èù°ÇÊ|œé°e¾ÙÛh"K=–ÃÑ÷³™µlœBÿ½˜`SòØ£-hzt¡Œ2r#¾´‰xïÍu¸6’/#Š{™ÐÆ d úÃ+ÄÔn3Î(Dªê%$àx“®÷NO ÜýgÓçš&©,zô! wIwå8Ôë+_Þ«ôôdïѳNxdGó"ì`•lCéYYoxXXúnê§o»…³Í[íXئŒT'¸ˆ Ä„ ëÍröœôx’òdÕO‹\¸›ëòaÑúP±‚õ^»Šžh稺ŸÙ ÖFPAêIâîHN,øYØœ.w-ôÇð±3+ɸiK»’‚7\j(“}×ú’ –±^˽»R§.ÑãÓ­G>»ìɯñíRÆû£1W“ÿ«p4Í ¨93J¡B²7Ü£Î÷¹YñáKÈ·èp™ñB:? ”do Õ£Ö .Þ£,lo [Ý^ôˆyBP‹ Vd0ÞMÝH-Èù‚vØ#7V©Éew «Æm¹òÍ †ÈìÕêÛ¥Ÿ£S Ýž¬Õ Ê)¨PÙ¤ÍSÌTgôdãûËçºoŒo*%ÐÇêò¤ÖŽÿz'ðü»íÇÌÑHއ—㵡ÝÙsÃͦ]_¿“kcãkeP¡s¢ã]Ž™ƒˆ[d-#ƒÛ@êÃU_í° ƒ„Íjc¹ÌéÜWšÁ²ÃæŒR2›„BLLå?ÃîÕ8 Q#LÈ€¼éÀ5?ä»ë9nxÇáàÀYÿ¦H>ÚŠ^œÚƒp¸ïÐõ¦Þ.néUóKETM;ŽÍ¶¨PêŸßÐB¹h{ȸ¿>~Ïy¸â^t,;„9kÔeÎÈr®G› ÌÓüû˜.`( BB¬FÂà‰eû}Ì…äø„»=xáÔÊ7ƒ»h¨òƈ̞v–’ðÁg‘ØÜ-Nmv›¬Ý”Ó/é‚ÅÁ¥Ã«Ùü¥ŠP5u0©…óïãý(·qxõ––Ûn"i$¸ŒVˆ¬Ós^ßà[_Ímm¼×^°L”ý™)à ý8=‘ýâ‘.cC(Ò+:B:d$Œ œ‘·«ª›Àä™ ø78ø7[©9ÞH=‹àzà¢s˜ ø5Êi‹kL¢ l*n¹€æe—Tè†å=<ß1˜û;À]Çê?ÞØýCÞéçiþ‹:™­a)8&=½=k3]¨Ñúä|t1Ç.n@l­ßpJÐ>e†gƒAÝâvËdåÖá–i™I9Ä^×§ß#ÙL)Ì›8ÜÑ2ÝÃëÍrüYŪ¸„§¥ëS®ré÷ Wî¡àÞ•ÐõÌX,­mR–’…]¸Ún“¦Íit4,üÉæI9Ô÷'l—¯³°JF„£|€qL¯­ybåáJSÊUÄ¢Æ6ŒÛœ×~F¨X=2X~vûû]’è´pCÍ ô—óáÕî•ÕŠ7äÚ-9%4ü,¦Þ*YÎàæ»ë Å¡ÄÀNª|¯°WY^¯nM­¬2ÕÕ“É;žFžV(¤¾ožb"ÐùÀ\„ܯ ¬Ê±nÉ-Re½áÁؤ,îxwi‘Ÿïûâ©ÊrSõpó%;ÈoåòæEŠ/ ¼`PSèÔ„]„‹x˧^|5¶™\Õ…ž<C|; »qyÁ †ö8‚\ST‘9ÍãÌUù>[trÚ,@QfY¼¡yy Οµ U¥¶¾?ýØŸÍuoíߨ!bœ9rc£j*Gýz%Æ­@é÷ÅA¼¦wìZQø¿ù'9†î†À™ô¯‹bR©UŽòVLWØù…Åæë$%Ñ{šÖ€r/-Â-T³<ù)ok„ÒFO¥Õ‚ÄUøÿûô?Lû¸izüîfj¡à*[os<ª‹¾*ŽYIdÒœ2ËNó©Š•>ˆ6ŽØ/Pi9<Ãõmæ N¸¶jœ¡NõbÙCÀOÁF3õ*¿±¾¨R,*ˆ'ú2BVnM®ó"_áü$_†0µÛûQ¯&×3Ž‘põçÖ¡K/àLÇ<Æ*i9ŽrD织`arÐ^cã ôT¯K´Üè¯.U|ï˹¦ )ÈÂg.wôl…8Åt£~\•`go´ÉŠÛèN;{¢Ú3²ã‚–$ŠgÅ—Ý."°.äÆ9 uÁ°×AÓˆíÄÕ™7/…cg÷^pm*ÛM‘˜;aÊ SÚ×I·ìÊx‚ÔjÇóZcs=à¹s ™ùw…£8Û”0|Ôy=?ŠƒÞå¦ð@•’Æl„Ã; ᣃ1˜y·~Ö‰1ñ'UŽZù´ƒ¢ãü1¯À1d„uΩmÞ\çD”éàÞùFµ«°¤Ü·jõðÙ%¨+•Gð>A.b„7œ˜Úö» ã¬0''”¹öó;Z:%´-h_ÉÄnS‹1Øè}Z,g[„CêCwÀ™dN·†¢Ã´L6V?H 82éÿ±j¼ ަÌ~ÃþïR:ò9OßθZ ñ«™I¦‰0A{Ÿ™êü¢jèr,Èkúq~C|´âÉ4+´ñ¥Ì†vf ³˜ž\¶$O)€¯÷C“ò5_m@7g¢˜áaTÛ®†ö:!jbgÉ{e9ìÚsàr„ jC8Þ„ÓHÜ$I¥é.Y:ªÍàâí3Ñn)"óпªg#(8ý@”¸„ÿ@_ößÄp„ ¨ÂýJŽUP-jÒRÿ}€àÏt±,âô·A£):CMWÿáÒwL-WИu³9'ú ch%â‚*{a *óÄÏ»š ;¦M&„Jzšø;›$>{ñG|˜›¾d´ˆ_ŸZ,”RdíÔ‹&„î­.¯9ÔA¨‡¿ñ’bà€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/type1/README0000664000175000017500000000174211742726711022532 0ustar uwabamiuwabamiThis is a copy of the Charter fonts which Bitstream contributed to the X consortium, arranged for use with TeX. Here is the copyright notice: (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA. You are hereby granted permission under all Bitstream propriety rights to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts for any purpose and without restriction; provided, that this notice is left intact on all copies of such fonts and that Bitstream's trademark is acknowledged as shown below on all unmodified copies of the 4 Charter Type 1 fonts. BITSTREAM CHARTER is a registered trademark of Bitstream Inc. I used the `afm2tfm' program which comes with Tom Rokicki's dvips to convert the AFM files to TFM and VF files. You can get dvips from labrea.stanford.edu. karl@cs.umb.edu Member of the League for Programming Freedom---write to lpf@uunet.uu.net. xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/type1/dcr10.pfb0000664000175000017500000011726311742726711023262 0ustar uwabamiuwabami€%!FontType1-1.0: dcr10 1.0(Level-B) % T1FMT, Copyright (c) 1993 Basil K. Malyshev. All rights reserved. 12 dict begin /FontInfo 13 dict dup begin /version (1.0\(Level-B\)) readonly def /Notice (Copyright \(C\) 1994, Basil K. Malyshev. All Rights Reserved.\012BaKoMa Fonts Collection, Level-B.) readonly def /FullName (dcr10) readonly def /FamilyName (dcr10) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def /Descender -194 def /CapHeight 683 def /XHeight 430 def /Ascender 694 def end readonly def /FontName /dcr10 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /grave put dup 1 /acute put dup 2 /circumflex put dup 3 /tilde put dup 4 /dieresis put dup 5 /hungarumlaut put dup 6 /ring put dup 7 /caron put dup 8 /breve put dup 9 /macron put dup 10 /dotaccent put dup 11 /cedilla put dup 12 /ogonek put dup 13 /quotesinglbase put dup 14 /guilsinglleft put dup 15 /guilsinglright put dup 16 /quotedblleft put dup 17 /quotedblright put dup 18 /quotedblbase put dup 19 /guillemotleft put dup 20 /guillemotright put dup 21 /endash put dup 22 /emdash put dup 23 /compoundwordmark put dup 24 /perthousand put dup 25 /dotlessi put dup 26 /dotlessj put dup 27 /ff put dup 28 /fi put dup 29 /fl put dup 30 /ffi put dup 31 /ffl put dup 32 /visiblespace put dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put dup 127 /hyphen put dup 128 /Abreve put dup 129 /Aogonek put dup 130 /Cacute put dup 131 /Ccaron put dup 132 /Dcaron put dup 133 /Ecaron put dup 134 /Eogonek put dup 135 /Gbreve put dup 136 /Lacute put dup 137 /Lquoteright put dup 138 /Lslash put dup 139 /Nacute put dup 140 /Ncaron put dup 141 /Eng put dup 142 /Ohungarumlaut put dup 143 /Racute put dup 144 /Rcaron put dup 145 /Sacute put dup 146 /Scaron put dup 147 /Scedilla put dup 148 /Tcaron put dup 149 /Tcedilla put dup 150 /Uhungarumlaut put dup 151 /Uring put dup 152 /Ydieresis put dup 153 /Zacute put dup 154 /Zcaron put dup 155 /Zdotaccent put dup 156 /IJ put dup 157 /Idotaccent put dup 158 /dbar put dup 159 /section put dup 160 /abreve put dup 161 /aogonek put dup 162 /cacute put dup 163 /ccaron put dup 164 /dquoteright put dup 165 /ecaron put dup 166 /eogonek put dup 167 /gbreve put dup 168 /lacute put dup 169 /lquoteright put dup 170 /lslash put dup 171 /nacute put dup 172 /ncaron put dup 173 /eng put dup 174 /ohungarumlaut put dup 175 /racute put dup 176 /rcaron put dup 177 /sacute put dup 178 /scaron put dup 179 /scedilla put dup 180 /tquoteright put dup 181 /tcedilla put dup 182 /uhungarumlaut put dup 183 /uring put dup 184 /ydieresis put dup 185 /zacute put dup 186 /zcaron put dup 187 /zdotaccent put dup 188 /ij put dup 189 /exclamdown put dup 190 /questiondown put dup 191 /sterling put dup 192 /Agrave put dup 193 /Aacute put dup 194 /Acircumflex put dup 195 /Atilde put dup 196 /Adieresis put dup 197 /Aring put dup 198 /AE put dup 199 /Ccedilla put dup 200 /Egrave put dup 201 /Eacute put dup 202 /Ecircumflex put dup 203 /Edieresis put dup 204 /Igrave put dup 205 /Iacute put dup 206 /Icircumflex put dup 207 /Idieresis put dup 208 /Eth put dup 209 /Ntilde put dup 210 /Ograve put dup 211 /Oacute put dup 212 /Ocircumflex put dup 213 /Otilde put dup 214 /Odieresis put dup 215 /OE put dup 216 /Oslash put dup 217 /Ugrave put dup 218 /Uacute put dup 219 /Ucircumflex put dup 220 /Udieresis put dup 221 /Yacute put dup 222 /Thorn put dup 223 /Germandbls put dup 224 /agrave put dup 225 /aacute put dup 226 /acircumflex put dup 227 /atilde put dup 228 /adieresis put dup 229 /aring put dup 230 /ae put dup 231 /ccedilla put dup 232 /egrave put dup 233 /eacute put dup 234 /ecircumflex put dup 235 /edieresis put dup 236 /igrave put dup 237 /iacute put dup 238 /icircumflex put dup 239 /idieresis put dup 240 /eth put dup 241 /ntilde put dup 242 /ograve put dup 243 /oacute put dup 244 /ocircumflex put dup 245 /otilde put dup 246 /odieresis put dup 247 /oe put dup 248 /oslash put dup 249 /ugrave put dup 250 /uacute put dup 251 /ucircumflex put dup 252 /udieresis put dup 253 /yacute put dup 254 /thorn put dup 255 /germandbls put readonly def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-44 -250 1054 913] readonly def /UniqueID 4700683 def /StrokeWidth 0 def currentdict end currentfile eexec €}…±Ôc, öøÔâþ³×Âû-iìœ ï÷Ju¤¤öï§S©°E²!¶Æ¹'hŒÉúõ¹Û`+#),ËÈÖ«JÈ&ãÌÏ•—mYÕ¯ ÿÈþkÂôÒ·¿'\›Ö)I²´^Í  4"L±°«~D`”¨X_˜O>IÀtcÿî#4¡FpOµA Z®ÅJ\.±{—T˜/NÊÀ ëû’ÑìmËYHƒŠ,ó͸;£Áo0 ¾àWõb,H AmÈý¢í»õü>oaÿ':· ²¶ºèd˜-ê¥ †A±A j…C¸JI½'OX›Æ+)úZ`b„š!jO“êý×bØϨ+-EMòïw»Ø+Eld?,­£+ƒ”ˬúšÀyrgWp¦¶a‰o~‘8+… Úy-]5¡<ôÀ”sy6r› ï~Àz%Ê‘OãͪìÁlHE© ¼Ž:¦Ö— "·†æŽú¢Íe#× aIˆ§o»…qjBâmÜó=Uqj#¥Íu‚E+Y4=jÍšémkÞ€ öŠ}uÊø±ôÕ,qļ"…mP•k;‰.$5ÐØ&€@Ò¸“ƒáMÕ†ë×êÓ1tÚ_ Ö“‘ÁŒyÎéJ/f¼]2Q¨«—%ðllÚ%¢>&¬1ÉèXŸ¤À:J˜ä-Sò Ÿ)ø·/YýdqÂÏàg§ã=ïˆ)cFˆû¢p.MÒ$˜$tôû¼=ö}€£ôméÿ³æ v7á‹°oK®“¡ÛuZ}Ê]HÝ 8º¦Dú=†}=硇e]²Ãœ§_?cð]ßò<â±=Fô¼'„‹È;€ª¶6WÓF̯óäÿ•õk–œ€8ì}ô¶JºHéR›‹µ«®$æ/ÇLi0*ÛˆpW7‡¨8òB†Œ‡ÚÇ'+wã{Ow–Õ’,ŽsGmj¹ž Èœ9 6`ðb·Óy³ C§èˆüWi´Ïaàãý”ä¿»t×°¥œ¼Ï¸ßÓpˆ‹'Y É*<ª~X-àSô´qÍk¦Ìaêѯe.B;Þ«m(éÿøƒœîÔ N€ 0º5 cû·ï`<ÂòFþå’&@åúüiÌ|‰g²oðóÅqît ¹oÔz7Å$”R†T‡Íu“w+ë+­oP¹ùŽéh¾ÐŸ`´…"¯à=¿-•B,7 Šãô­ôO´ûèÍ},Ó |^ YéŸ úвàa”8üeß'zщÀ2þmãYå~؉˜¸1ò Ìtc:•³<Ý´@öa(—^YL‰1lä;Œ,ÙAh4;çÓ®€@ÜÉ©¦[jÀ™u¥qc´¡Id1yt›‚ÁÑU¨A;›ûÓÿ©0n¯bçVæ/11ß‚îod‰A‹­iÚMQqì±MJ޹Ü!ø‚³i!AtÞRNê¡p¬©^–«0¼Ÿïß‘žu’\ó=I©‰SÁ¢É D± åÅ2æ&þW«½Âæ'³~`NŸNÝ{y†aCÂÏ“wÓMÆrp7ì¡@4­Ùœ£25v-…ægýàOZ¾Um¥yP«öÞÎÂ[*ßôž'ß'Ÿ, $%/T‹ ôe&l Ú:ÌU%,Ÿ;¿ç‚#[;Öåã3ö¶˜#äOtôÈ«"AòµÐZÇ[NðèÙ9J¡®™B'·€¾¥brð4 Iizn_Ðôb"ª ì$Û…Ü¢‰¸®cÿõ"å1z½rš¿d=ü%¦pÝ·™1ÌÕÞ(ÚÚ9•zà?Å»:4 Ûüm‰P§1ð@û8X¹´Cž0Œì¸æëI›Ó…p!cîŒÈVºbà-z®òWÞ‰ŸnàkÇuôðð(tjôiSŶ¥»Š·ÊëÂìJ½›yzsëAëzJ&'$<ßÚ©øÈhèÔÊÑG¡´Çð©9ˆ*¡ë:Ò.Œâ.P‰ä!EB8» ‘˜gÝOŸÂ3…*)2=°⣆),—üÜïÈV>7-YBdZ6¸Sˉ< mSzùúÕž”£\õÍ}éÇúÔwn€–ø¶= 'Ÿ8f‰A_bŽnÛutÝ^­içäµ ±®~¡~Év9Ò+…C4ª ³ “¶ŽŒÔÙò6¡£åx‚ηJZu?•¹¡À÷Ÿ|Œ5@,7†}ýÄbjò‹…ì¦W-ù›g(®ÙÛÕ%Ê}TÄCiì}¢M²c Lø†@¼j€„0òè¾Sëü½æ½ucjC­C°V´ÜÃþ$TOǽMÒ vwüHŸ^©àæ",Ý7;‡>æñZ„ô}´ Ù§ÿs"”%Ê-¦Ä÷´:˜® v\þÑæçY˜t5ߒǦ3·ð9ÄŸĕߵ2Rxtvžm0 üëÀðÞ£ŸWÁÞ™0Î@ Ö(ñ=‚ƒ5 8^€…±«¢RX¾«å—çeÐ>ÍÖß ¯º“AOær?Ò2,FØk~§ÝÀÌX—CrÑSµP÷îïÅã˜rÙ‡[©;rý"²øcîÕ gP³o~Ê”žhá¾2Ø+ XR“ùÛ£ûh- >çù¼*…x~àËWmµ'$ì¾ö€©ŠŒÏáÆÝX".8’&ß®U“×1A{5ÑóÅí oÐôp3£øÄ„ûçØ)b¹{]ùáÃÑ«Ú^÷n‡‡IШt”{~̵>ógõÀTËÞ,(rlI)ÈZzÜõ<{ »KádÁW¦!AÁÁ,È´ +¿mÛµÿüòÑï*r7†/¶3ÅEW¥/xgƃ؞ ½-¡Ý#*Ew¼æ|;®³£®º‡@¹ Ñ£sRÑÔÑMˆ{;5ñ ëÑ"CG¶±§ï|*ö]¸ÎFÖÌF:bdûiœ÷Ôétzž¸³W½%ˆôŒÅÁºöYÐtMã³KìDÇ÷K´’Ô°€Žoç¥×¡×˲Íí —Ö˜5nåЦM+Œ×M¦Ä­BREwǽú„J®Ø®Í Ì]¥‡ tD¥Éö” 'ž·ÓJ©šÉ‡Ú¾œÌÚ ÙZPV+QÍ7%.ŒL%GUQRãñÀ‘»W«%!cšöÌÓñ*½|ãaëq2ÈMê»s»­gå¨Î¸£Ú©ÿ>Ÿƒ~寓ä¿`€;À€ÐûåòÒ  [Hªx1ìxë~©àDÿ6<•Sœð$ pzÂdzr¦›…%À]¨(Ùe>ÀçÉgÁ•ø'ã+ñ5ð‹×í¿pT×±¹Ä_ì]ˆ´B{È\ʲíËLidkL¤‡®§2ŒIŸ’6ÕVÃæÏÏì *+Ìnnå´³qù‡È‚c­Øµ@Òro ÷›YNg¥¼;xöó$)Çt&¿Ñf•MP2 BŒÀøJ?@3óM`LÃWP\•´^»­ix/ÉŒ±š‡ƒAìtpî\ lOüœ×é/Þ !•°tNgçEsiñar¤i¸¨  cÕçJ”P ²=¡ôzx¶û,°@À+]m½òœ ‰?×Q¢úÑft†Z ÷2n66ÒZ·`2Çÿtè\¾†Ž†«®iêŽJšŽŠÖ(·MYèÙçHõÙMIQt[° ·¸MD„j;O#€ –ÕpÇ-±ŠíœäÁõ'Új´_¶ pëè&m‚[L+ê*P…úq€åÄ_fctâ$”³¤]ùÕš¯<‡ì$/ÛöÅ寽ª^üÓêNӑ锳ÃMþJŠÚ¥{HÝÔ“]}¥Ü¡˜†#Z/¨þòŽÿ2GU.Â¥û*3Þh|ê)´ [¯îÙBÏ/’éHz^) yú7—©¡Ñ¿«8Ò|¸­6„Ì‚ÅMaÙwxMA'Üá ù¥ôišêU阢ÚX\ƒS)*–àrDÜpMMòÄuŸîŸ]ËjÏÃðxÜØÁNvö˜æA–ÙÑš;à_9yfé¶²…Ð{myèÉU8¸ b!ú™çs.¸10©—g2oè„Ê»„±&¬4ª3uJTÂ( ònö@X]>^(ñ[ƪÓÿ÷λw–sOQ#޽ÚzycG¢¨!¾!þ9_€8³éß*ÀY›G³fÑVÌ/âvPÇ m…ÅrVå} ËëýÇí“çP4uܤ¥]sÝW@]uã‘æ‘ˆòÝuóf~BøìÄQ ÙÍþ3Vò£ëD©H8%L"3Y™÷X^Ô.e½‹é P•ÿXX¸ΖcÁŸá&M<ñô¤‰+:„êŽ&äM)Ì¡8ØÈt¯Aíf8†üeì£ðçºÏ;+?"Ü–F §‰E¿#]²;¹î¿BJ¤,s¼Â4Cš\>+ÿ¥ ‡2™Ð‰uýeg=ðüN‘ïªåÒæ´~[eh›e7_ŠŽtbÏÉ #þé3àRM¯å; 0Í tÇÛ¦‡ $Ý»›î&mUKÜÍ ®do³òç ¢¹ž‡cv ;š䥣ˆšPØÍÕÀ€wòG¢,Z6–ê6jôDÿå¾@­V½ d“¸l…óºþ¹YÔ#ç°û¥*TD0¬ÕÍ:E8‰ØÞ”NÖŸwËÆÞ™lx–ªS¹PÉ¢ŸUïÄ6ÕW`%ÌÒ˜?©Á­½êm–\o€ï4¹orÔÓÝyÚN>¨íƒ¶Â”Æ«–#ã”»"Z|Ô…I ÿ¯™ìžàýU?t\Ôxe`_Ž… ³û׊ÈÂ?+Oe ±6]ÒÃZøü`N€ÕmЋˆª¢}uè—ù5ö¼•­:z»|˪\ñ =åäÏœVÆTn¯È¤Û¶½d^˽,6è«À6"KÝÊëÉžÄùèliÎ}úL¸‰—Ø4ÉÇ<9â½¥ïÌ0û;€Ar8,èßkŽvóJ3CPã…DÑÈñᯠZ#LX*S÷ÈÀì ŠMãºø¥:\1ךƒ+ˆ½E‰TK O @µÅ°rtf!ìY¥@Kóƾÿ%#ê°4ä!­fӻϓ¤Ýµ*Ùië°I8s¢Ë®ƒl¤ÃBð™{2ïÛbÇnWç`HüDÃŒîþ}%&O,Û}õ[æ:½b±°¡•SÁ%ï¥cø×ॆʤFVLå¤÷OœÄÓ§¸íJÆ.à4uR»†¹àéñt§Ô:,"œN3(`î} Y‡›nQ·ƒ[X5?b³‰§xÕ‘\,rHš(<-v@ÊÅZ%D!vÚ±N• Î0£¥^"#2¤u}î$Nê'[J¤3ç ("ð#ÄÛ+k‘š“ÏÆ­äæç³Û1I£ôÙ>ƒ"áó§‡^C±*Þ³“†jÅÍÇ߃bº|@B€„ ˰Ñá5ª5?µ«U Û|\YZWîÈžàJDTó×™ÒH©{r>RÞV¾¬-š]›ÿ­9> b œCú¦¡ât?ÀªAÐÉj–>°~>œ§3;M$7ñ$tÖš"S⢂|I¸`rä%AäéN]®‹»`N²hãô˜œó´÷IhGCÒ0¤¦£² ièpK™Ç½È¯ð‹1äñ?Q`Ò§¢,Vß~ølË!B‹HÄêÍ7îÎg€Šèw#f¸…ýl¤à¿¸ oÒS:Ũ—m0ì¿Ø–¬•ÊoÙõ«CÄšÀ‹G¥nÖæFì Ê¿‚§p‹ë?*z{±ý‘l,Áe–emIµØW±)£`Ï»€Uí“%a5¸iQG´4‹1N“¥¿0 #ÈÎnûyß,ï’¸>"¥šî•îŠÛä¦xƒ¨èÞ‡g1"pIx3ˆ$Y"±_|5ÁNÈ~NÜQ@s)Vİ¢Žq Çq·¡ºh[¯qÈ’b?ѶýþôA7K&Mò§²òpfЕ'òÝXi{ Pý ]½Â«ÃÅ­÷! Ì8é/w9[ŸÏ“IتۯxMö÷jâʃËX#6­î_Þñ«®Ú[K®‚Qlqö¢Á©}aÖ]¨°Õ Wª_Jÿp@r@ù`0pÊ£Ž*VXΤ‰·²ý·1Úó&ʉƒH\’ÞÖýc‡x¤Auµ“ï཯g\‡ëFZ¡>ˆ`?Ù³ˆò¤ÐÉ›Á2›Cæ;Ç ÛÌjónäÙàBÙoå»™ëƒs²¾C¹Ä˜ýU›†~D3­k:‹ª«º‰üÜ ‚ðrrÏæ1—>Ú ²XËîy 2…/aj-s4æsÌñϦyŽ¿õ5TjšgY¬X)Á>r;ZÇíkº‚°êþOÖ˜†Ë›g9¸œ8…ÈYHRK@¨ç] 5Wp÷‰ô^ðúý<Qˆmñ×üÍ¢n…u”kÿBÍ™ÖÉäûýV MàÑ7þ~Y ¿wŸ´½"?ùâ#‘ú†_ ÝËs›H0ôÐeEÈ}û;|æ `4~÷òÕ lÇ(ŽÎ9ɹWB~ü2DJ®{“iîœdŒ{COJeÖ'’ˆ®¾ Å9Ì 4ŽUŸê?†ÍÔöE_] Ùα'?MŽ/OözRE—ÑÝûYJô†~kc½¯ÕIÒ ­Ñà[nï ‰×/Žüƒsýs£ˆR†b•“ öýMÊhP=KÒ^Dq[j]IéóÑ?l•¤ŽÓ9é@Ðñ3ÿT÷A3r§ I=­OO%)8 ÖTwž§gè„÷РÔÖM¯ œÖÑ ìè3MáÉü.‘γ’]3ý¸ Ëã½…ähPƒÌxCK{éÞªÉ ¸KZ èÆe £wŽ.1ª1€”‰ÿ>±ÞGL–r­ÎªwLšÅUž$ÒnÓFWw.x.1­üu~Æß‚Žg4},¼i™JWoG Ñõí 5«j\`Ãòx1ˆ­ /*†` írA¶ºäTÞÁ„1­ñÄ2Å,bÇ aDOšÉ5rÎE„ç¡-új‹v®×x ÔØ/MNУsš$zaA5t œ+jC)€Ëi¡ˆ¹ŽËaŒáƒžf½ûn”ø fW’àðB8Zaˆ‘SBÆùß/€äß.ØqÃ1ËÔФk%/ò)bAéL~´8°$”TðiUòº'2tA…·Ú»š‹T¶\缘0·ëú÷¹´^N'àÄž¥‹cëÈß`¡ÆX^‘DHkÁg]Æû4~N„Z^wÖ31²¼š‘‘ !©–ÕêöW’\„ YhˆËñtšïf=àþw¾ëèh„ëd­µN:³ˆ[‰í¾`RØ‚›\õ{ŸKálƒ†M‹î¬šé|•îœÙo¬ïï'Á‚’Âú MùqãåwÈ$šQty8°÷ ²1tØûCÃR‰-öˆ‡ ©ÈªUí ·#Îó¿é‹Êb‰V)å˜hv„)4)íÝöд)Ô§r–Râ¶™ F4á¡Ñ=Ð/Ó…#y¦þÛr]ÆŠ§ë”b†}”͸ˆr±ÓcƒîvŽçí“Vû}l^$ëª^NòØQ¦jÅo@Ø^ñcF §¹lCÂ×–ut[ëÔVA[Á[s*Ýãwœöq @%ãpIB¼0ƒ$V cq©ÔFªš«f—þOÑ 3‡‘ÊÝ2X\¦Êú¾…7ä¼®NR½‹\dŸGZ0Jz]ë ¹"»·YÛ¸¡ æöô½LþK¨)ñôû¤~#ÏG¢Þ¡Ÿö¤N}GüƒƒD{Åýß‹êœuMÚf:„•Á-º÷ÈÞu±%õãwî$çë´i·ÔW95A çuÿ²)ʆƒWI~qê·%qôÀkÉDžÒ)g÷ÒEÙäÐNðÁËCÚ/rðQ÷¬H™|ALºÝÁ£³ˆv‘8°&ùýsò”›[à«|!òh2/¹FüüÔ¼cý“5Ù]½‘°û‘‘¢BËK5ÒËíöZ8Xó8~—…dÚ›äÊU3t•'¦Aíªq¾½‰ñÖ¸à9Ë£q•e~Þ¯o9=fD iĆ[Hf¾Ý“âŠb{Íú¹x%ìKj“ÆrYQ|Ãð˜U® …‹¹•[ºŽtS«Ÿ|$ÌU»¬0›ÌÉRl¤û(}­ÐÿÕÓÑJƤ«ÿÆØ±žaëö_˜Hè98ù! À̇9nòäX€ ˜2,âòjF&€ˆw<“ä;‚®}4Ž=×q*$IáØ “˜O¯f¾ÇâÛíû€t†Õÿ¿wJÄ¿hDu{B²n ’›p@“b²\oòmÔ:"o[LÉFmÎ%³ÒëÒµÇוØ@8‰²€;7íU•^XG¨£‘ÆÚ‚«)A9‡kéçÿÆHÆðXL(|ÿ ô…ÐÃñ’Tí€ãù“OeÑ 2å}09|ôã×Ã.xŠãËk³iÜÞL‹ÀHUÊòÐ(¸Ý 6s:ŠŒã™¸¹ÏÎWhËÆ£ËgJ&qŒ%íOVÿh•ï¼¥Åh/Ô˽jØÀC[R1ëòù¼<ÒÜˤ1ÉÉøÕ‚C¾#®ü[©k »E÷·c±ÓĨo ó0§Áa5É`¼þØûÊ Q…g9‹8íêkFs@üµHáÙ™¤‚ÅÄ©ŒhÞ:Xç¦Ý‘–r•©„:”#¾ò<[fƒX¿¬ê/ƒXuåzÒ@ÉJô>*Ã.§Š‘dûv-PZ!—‹âÅ…"ž6*;%Õdr– 6 ß@®ó ÃpV¶ÑüãQ$]ÇÀâ9Øe²üZ2¯š]û6ûc\ƒ³°%]ÂR݃×ÜL×7¤uÑU¹¾ac'˜Ä:ª£°tЀ߽;&m$xõu¾ç#ßß~6ØbN£)êÆíäÀ=óê£s<ÃB†¬äþúÈÙOîÀ׆ïXà!J¥àHg›‹ƒÐ,šÉj0ŒŠJì"ËoØoѾ'ê²ÎFÂO¸×U‚Òy‚¿C‰Œ% ½mdWòÄÚ*”µH_û‡×`€<ý;C㥀6¯MüÍ…ÕJÄlÞj¨^ëÈž•Œ$ÈÄ:æ¹Õ¼êÔOÁ»¤†%ŒÇbûöø¸§­Ý%& *G%ìÝوſš–²û˜R¤¸hìûiJWîêô\mŒlu ð ³cùZÙšLüå¸]FéUÜèï=Í,=\Ù¢«S½(iúƒ 0´Ôtî&©P¶Q¶k]èxxH7†æ ³BLY]p{‰½Ã$”yx³Ÿ&V»ßi3ù(Õw‡ ¢a{~xÍúóÏ ß÷a{Í„#xѽ üìüg’¼2{ ±?üFœ¿`¦_Uø7“ÌO]±ÛµX¸J*ï¿0¤²v³Ø)` ïÀ€€´"s­ímÚ¨¹éQ2Êù<=/NNŠSOkì«õ+NUÒmc&ÚÇñü 4†ÊôÑ{–Œ4Bf—cB¯k³óV¦}جÁ§‘jϨXêQ{–óLþá`8ôJOc$–¡„Ý&Wè·ÓwÚØT \H•0ȇ›ÿR vì«3¾xŠp@oózz‡ÜfNeÆa÷ô©ºÄªÒÿ>;‹jö À©g?`Êû}ÄšõŽž;ÜZÖ©d±î!¿°5*|P¡Rf{”ÈPî‹~#§Á ¢#\ÝÔnüâjìžæYÚ~‡±G¬h H\jk|›¼K)P•:#_Y¤DgbiÖ£ÌU+s¿v?€NÛ"•ù àSÛk'ÆJË6˜y‡#À~VCd2oKdÚVjì…6;¯uKÏ—&´¸Ùbµà·}ßP¤¦-šóôG©—O”!ê)Ÿü¯GLæê»”c?סðJû½•žÇ¸iW l˜l?½†êí$Öà+ùüÛà8¨ä„ANàÄàéKn  ‘âaÃlÚ4£º Üi¶ŠÖ¼ö> DÒyöÕD²ï CLIÊd˜þí¹8±í-9#õ,Ê›ÌQ-w±©¯S•X|U´þY&)zq¬X(L¶Qù×*ôR˜ßli×40”Kcyu¤ p@¶È 9ÙÝᆲ€æÑ¿JÒTªžHéÕ>~0 íé>nk “ÎÙz‘ò üT%. ƒŒÌÖ“èZ? hŽD¡¾Îy6”dø¼Ì"ÿµ'f;áìíˆ2ÃY³†­5&¤ 0Η䖀 ±‰ˆ’Ò@Q˜{R|ˆ´O@«@ÚÞ¨”‚’ËúèáœÇbõLŸ5Ó˜Q¶ŒÂñ 6í¢±‰‡¿dÄóêñþ˜J#Û™™ìa¡o¯g“W`âjä›/÷Ï^À‹Ït¸ë¬X¦X£ìüƒÙ'&¢1ÿ±\$I¶n㺚¬6é:DÖb4Ón&¬ë43+œ*=‚BƤíØ5Üú.)é™Ùv³EIfk¥%Ì8š¬s^u:õ˜ »ô a2`€(Ú©OÆBø ËÆ…üÍ:˜½áç\C¥r&U| rM—þEkϪÜFZÒNøÂ² ŽD¸>dr9ZLJÙ¦3JOä³+¥<å¯èbÇÒ£ÈúֺR8AûóN-*-â>”aIn¯nD’jDmO–£Sõ"-‰«_{Ïoe—»ï°51¦S¿b¿á6J%{\ž»{ÔçF{Ì6 Èâ¹l8B.ʃSäÓ6Kme•CTI ÒÔ¿¦ØWmÌq›‘É16fÀXmÞvû!Öd¥34rµÐëâ³\wœQ±#Þ mïωPí\T–º9ƒzC›¼ºhÊ"…è@ Á:U˜k†ãUÊ/ÛÓçüòÔâmA”kÑ€_W‡×ñY<‡{ J¨Za”íp0Ëh•í”á> ݼ*·µzqè2¹1Ü:l-ÝëJR÷CõþZ:››â«7nÝÞ÷ù,¦Â3'M/E6ó’# (v·+xÒs]`Ó]G¾×î &[Fµ!÷ÆWG¦ 2)¯!2¼ µ!ìÛ´Jsi™’–òg7:ñcnÅ‚±½æeuP!äZû9HøÑ ,™'îº8C1¸ú™°RÇ|ÄCý4‘û“h+ˆ“s÷·$¨¢ SÎÈaß–4‘ {ïô·š æÕ’M¤­ÛºŘ&à‡’æ/.…OÏŒd±~Éç*™Ûz|*ðï{¥6eÒo¶e©Ù¸ÍÿsJÁc¬0Å`È_ï³:¿½¤±•øvVÏ ýáŽ-3ºäTç³P¸L"ŠQI’›¸£× }‡ì¥f}ö ¬Üó 1TmJì ™q¤Wͬ\×c »u®Þ<„™G“…0¾dèk±1Ãź¤È‹ïùùðÖ%G¡vÅ+\¶Ži M(­èÀ ïÿáåôé–Ò¯½±ú]:[ <{ÈÏ—6!YxyÏž¡`Œä ûL„3mî-þhÉÚÙU g4ªPU„n¾ÖOÅ÷ß]ÞåD×p´¡JD´UéFø–éøžáK|/Æ”HÊ$¬QÍ%`À…Äûa+`ÊM’]ë89ÙGFÕ6ÝÜcX*寽(ØÑ Ø ,²»ºRÓ(=õïÃx[£n`ÊÂ6 Æ9YA×_ú¸˜èjHðPøÄÑZË"÷ÔŒš±;¼Ãv“²Ã¨>Ùè|ëdÏ;ðM÷-O° ÔXÁدJ(L¨¹Ÿô+J¢›Qy En‡/¯­›JöíÕw£´ Åb«C¼Ž\øÛ»UÂçU¸¡ŒÚ…—^€5ˆË'á9)¿]…ò=*ã3¬¬ß7¼saÑê/^׿Ÿþë2È)~«±îÎ0va/I½ØyOkÞ»I:XãàøÇÝöï)%óó‘Ê¢†®Ö…é…å÷+e•b‘4"9„™ü( Ú8©w´Z ?]ÉQè9%œôO¢Ü{îÿ6åL³Íî<ý¹'­˜¤(ñ“oM6Õ¾¼ÆÿÙd(…ä¶sh¢"Tâ ÂÈU­ ³Ì1Þ—0‹ÇõàSv%E§–± Þ‘ƒò›‹Ù7‡nãôè-h?$>2ßⳑÈ5eä]ÕÚlim@ø —ñEvjîRW¼È@ísÆ-˜{*¹8l¡©œß=*¨çXÜ_YZ<žt Ÿ‚\0rsû—ƒBpÜÀÆÆ£lL°‰˜F,ˆ’œ… Y™ °Y™Ií±_ ²1ÆÌ,_«¹U-|p~}üU©¿G󛇶ycáj=`y)-ñNXC\z¸Ip‰˜íø6 ÖÎûfúüšBY +±™ÒÝ êjE´}0à-_ÁâúKÉ2“a6‡ú$¹`ç*.¿Ó:°È8(íðG2Á‹«%ÓÆ„ÓnçäætÆ^ÀCú>䤫Ú<4Öö5ƒ»4¶Ð? £%ßÞ?lbØÈDNØ…áÁûQB\1¤}NÉlH-bE¯,£Ox@yò­<Žé8ߣeßE·…7‰zxýÈ£t¦Ø Î’1«#ñ»´~ädùŸjóáT¼ŠÔ¶9¸2k=2^Oœ'w¥¨éP‚µ•­‰á€vìÒXC£ ‹W½(%œ{J¥(pð•c9³83³:AåoV¹I¬”³žHº¯­”úž§ä Ç/Ór°1ܼ…,*Bö{&ªÞP[œò=¾ó`%6WQhõï¬+Å"&ÛÛÝã’M”׳I½ÐŸ›n=Qanæ#Y«ñ¶ê롺·(>‘>/!ät/.`%ênØ|1@ñ4è,,Ú…ìK²~—ž`p.¯2·WW K5·K]ÉD3ótKÚtÆ`G° PÏ]μï•ãRPr¨·M¶@âìóþ¸6õþ||þÌm[<7<%)#IFÓHsû¨hÀdö{³<ßf4Ûí_Kæ]’'í„«DËOÝAµ8 /õŽ äKe¥øÄʈÄ)“g·hû%!$`ËCy…<G;(r?£ƒ”ä¾@“Á¡Àú:†ùË̉ﮃ†ù’VÏÓŸ$ÖÇGÂËåÎ2³º~'…·;Õì_D"ûBT:B¢) Bú­Íú,ünZPLLÚÌZ}~·ˆ"g‰X<%š` Œf*Øšì š¨TWÜeã“6£+L@;Ì´]¦ ÷[Ó”… D§B£?¨«•!3œ—8§ÜÇÿKQÆ›üû”ÿ;_—%‰ËVxè ð„îÿ²à¢@ÃMWÞk4%cE×xú]ßÂ^ Ùü2ëœ>Kfx™Znñ9m$lóêµèÆNj̹ƒÆ)„ÐülÜ£PŽ;ßwÂó@ÎÁT…¢ èø»§tÈlÿHWßÃoñ}—|Ë÷ºöñ«+doàÕHuœ1k[+TY3Yþ 3³Rï³7àöcÚx\Ñ)θ€XPô·‚çZàk%ÁCè^ß®wb16yìBRõ„Õ_¹4Üo»'˜èE»(Å>Рʉ֑"E¥ë^¯«>#Ÿl¨‚,ÜŸùf3î¾a†Sê*íÔ[©¨š”ï?n ¦Á<Ò”yÊâÜ´LÉùŽË"éí¸ÊËEù¼éÂÔžÅ@ýèÚèÃ|¶C¹' ,Dp`Ž™A ýw³uFeÏ”Ñï—Íßß>Hb¿¡Ÿ.¶â .áeÝÙ2ZùÁ(Ÿë³n¡f<Ë].Dl<ÙU¸ã5(fûC¥A@\Jis1lë!»ÊD‹G6í‚/Ý=ÉNËI‡·€Ò1¼à´¾eŠÿÝØ‹Û8pXBdžnu?íß”œ$!ÚˆÂJ=1N¿v€÷‡¢bs}§ÌcDèãä4‘Õûq¡’RDæ÷óßhJ”JUbµÞ,Á=ÅÞ.r_ü±€×E¤?sÕ‹ìÚ³áÙ¬Cçè¿ÿ>ÔÝïfé™Ovì8Ý&¥c}‰Rs¸Ô°õi0`ê¥þr﬷>ô3ûÖ&m’‘ùãdbô<ÔÝsÕÃ^;„É•dL™ÏdÎ`,>Á 8ãíñ/:Hž­áè'“->¶ÉküjÞ]~Òd´Ø¦mh6T#À˽d¬«œœ@!ÆÚZØ4‰üNYåS©Æî_i­2´-Š4UWWž™ôé7½ ®<€oÏÖÀõ‚('pbn8¾5j¥ƒ.»=} ý®Íaä½qÚNþ$ñ±uuƒ×2_³}oŠäW‡3~ٯݡ¤´Å•[ÿ*äÈã=!0ØBÍ„ŸZÂŽ­‚äÑäzÒÌ›=Ǭú?”wÕ!FÒFòèùÃÙ€Ò&—âj RÛ|Z%Æ=·vÈ÷ ôäÎÔÛ€œ§.Mëd”ùN•ÜËKz¯nÚ­ ­™†ÖùWð,Wô@ÿ–‰rââ¥#å)‡I£ÑÃD»ÄA¸„Ç}•Ñè5fñó´Ú ¬œvÙù_ßÇeÚéÜè.äeŽÙ¯²qý^½«D,Ý[@«”s6.pª¤¢•ƒ ë÷Å¡GâT¬=µ¶ÞÌçaÑeËLÒxž‰Çbu¶üÉó²ÏV¤?5ÌÕáà¨y|µÂ[“éþ9­Ü¹g /?™3 .¥U»ÀÂýÇÎÖˆ´­'ýº'lÛBí;Ôœ•.Ô›®e¦  ëˈo1Ï›ÓßAûá‡b%žf<3­TðÒ¥Ë5½®¹"J˜­u~;“}·ÙÕZ*äöq>_5ŽÀ#'°æ.äA#Ñ*…sȬÃ-r·  „8â¹¥P„”·iì÷½¨Uí‚ y—O[—°©ÀýiÛ\—™ „^„àŠÝJâͼ°Ê¶é¼ÖÈídŒâûî¶ ·Œcœå­ÆþcÃY<~ŠJŒPJN ²lÍד:=4„•þ'ã=Ãëj¹•ïEF¸Ÿ)RŒù,4zTO—£N?\Y¾>¾kio¿ê•– I‚ÑM¸àZx­Ï°­Hã ’÷ ÷)h>”õ–MO>ÜÚâj¤ð‚U’ Nûd’Að ÊSA‚ŒáˆŽ»V§ßœò»ë$f„Ìø_Û²F›ª‘šÖfå’„ŽÍ+iÈ1åS—è[VÃ9È16èÒ]󃿗y‘Œ?ÏY»¥’-|/l‡32U Wߌ¯rúÛñ®!‘³u$ØòâEÓßÙ›; ŽCÝëy©.yÃ$„)øç )»Á¾Çv޽­¶ÉƒC‘ßý޽ed þ¹Ÿy)ãŒt íÜÆ q .Bµœ‹`\0a™$a.#Ó¶Ù'û³™RãÌÆ’죸Õ/ws^ö9üêζ‘“×x_F+¨¯û.[òDŒ°ìœØ§0› T³ùÏ­æW{Ûdq¾<Šj.­:™ˆƒ¹¤S2¡–zY #ýüm[Pž·e%Ýýõ9«•ÃâºgÑ"wÍ¢]†ª{ò} y1uþ2ÈiáÍãEzùF«oAx/¬ÁÌë¦d™)4œmÜð²ØJ‡à26ªšNt_¦)1½h0ús¦Ö°é—Ô7¤d<%¨ð4Žž-ri„ÁKApo£x2ñÀ÷Gò¢ÅºF^G¦\.ÐåO®9gë’ò9$✦ÏÒºˆcÉÌ«ù‡“8¾)Û?î?, ßÙ‚¢Ã…Â+ÄòAæp±9—}°IÛ% ÍøD˜¶}†J†LKsõª¹Ç+Ýå,mªýÄg»»uP|cù{i/Ø•Ï Zk¸–è1ê‹ÜyŸ.¯w1që|CÉöð5Â8‘$>õ¼tr Isÿ¾Ô‚ª» ìt9Ç1Ðxêó«ä½ž?®×ì–i5 ¼Ãd+Ã+C«©§þ'ÔVl—ªdFÒ©†ŽŠLªLLq¹á1ч5å¢A8Ä1ó㨥ɣä~è_„㸑±ø–xÒ‹å+vÖE<„Úûµ8ût³ñÆÿµ¯:sÌT ±üäŠáý\ÐÜ2–LöŸ%°­Þ ×8‚T°}nDã)—X–Ú/’]dÐÇ­ ÜÇþ†Ü#àÍx›å¹ŽÃ`Äe¥ù‚œ¹Ô¸dPâp‘„Ú襥QxYJ?d™»ó þ’ôÍ[GÕÊõÄ[d‘`ÑH’6^M±H‡Kç$Ê;“úΘÎÏÓ9WbÚä^.ÿå®LÔ±Žê*\&m"º4N]µŠà>ãe~0o®îw.ÕÝamº§µÁ cIc[¢¿×¶ñ_—Ÿ•#\ï6…¿er{8É  µã-º‡$ûö²Zfšex`y+ÈüV‹{{Â%°šþx),ô˜þ2š©gBFΚFfJ[Î{Ç\Š©Ó\úAÅž“JB>a‘£ŠÐémàÈcyY!aøÀ‹d²GÃ>;.Bñó˜öwçÏiìf0ÂH¤ÎÞð…óºÔI§DïÀª9r˜fÊŠøúaÓ•ˆP&<+5Åa$¸[ÒîpB¢Íóa-XwÇ”} DþUIæç}‹¡9,‡ÔOÿ„ÆTpKʳFßÕÜ?æ,Ý’_öìaÀŸæ±^ãÓ@S Õ»Ï%»®;õ‡2Rc²~rRíBŽ™%®…–;xhlõ5x\ˆÄëè[;‹Îã“ÜF̵¢­ÂçóÎ?XXÞà¶w€TÏiÉb^{DÁ»ÄÄ¿¤ödhÜõ_˃©Œ†~Þ ¯œbt6“áoŸvÚBéS罡…––kÌ )rhÜ üÈpTÖ›lÊÁBº$íP§@—J-lëæ›!X`á’=²Ý›š 2«tªÓÛLFíèu£×4+I×®9l×XF¾–ù+X˜×¬†…& ò®pÎû‹Î,›2Ëh7¾<+ŸBO™$}„“Š6úÁŒœ‰`¢ûQ/…‹â뙽ªuDÇ—wl¦Œ›Œü$£ÿvlà6®bÓ±ÁJbhfú¹•^mÞH¨ùÎf™ÑÛ{ЉpR•èBðNXNU «‘*»a#CÊ¿'ëú ðšS †‘‹9GÏTRíϘÀÇçQ¢ê€‹‡Sõ¬&ònü0:Dá“®þ«€q-ÞZG†üX\äOÖFÄË S7iº$öŒèºò&<ß (xIû&×·ºÇ‰RÚzVj8& ª`Bã4·*úX dƒT*z“¥‡sнî\;4*“#w¤¬,,iŠ0©w±—Ϊ/ 6[Zg|¢[æ"BåÅiG>i¾"—Z!{½˜~‘iÁv`ˆüòï]MÙY©¾ëæË# A“¸,’ÍÂZ•®P° à¨Ë¤Á® \È‹aY´w‰õÝÍ˲۔ /ãqÒ$kîþqnèỠ還`ð:2Wcõ!üw6wÛ`k!槯›Ï€U| âÕµqÏ’á:¼êe4°p)%+Zã”Kxõò*y/ô„¢òImyÙNð˜6n†Çë…"2KÁZza#hs‘5½›MÜ/ÿuÿ•¤fsú'%±­¢«Åx-N~0!6RJX‚%!uäÚ6Ê£š¥†ù¦ÂrMIÎãWÑÒLZàØÂC꿸ڌ­£ÕâÛèûÓ¢`å÷[Á'Jcè ¤c§½tü†Ö´O\Qëö“YŒV[ß5 Ø…y##ƒø*E^3ÎÈëÅÌÝtø£ ‡i g˜#¡Âæ§Œ3Ê©£Ý¨òÀÿ " ´©…¬ÆfuÁù T¤=Ц>ýžÈ°ë(eLŽ)íl|P‰+þ?„s7]xZšV¶z0E½V”9ÈÁRn)a7Þkì0ß#IZزá÷e] Àpj%:ÅØ½ŠÂ«û—Üiè³K¨ AL?ß@R ¡5±$Dp=GÇ&I1—OXÞNa¦oï9»È#¤ûâð<i^AÿÔåÜ­q&–¦å7êysR¸ù=W0äí˜Âi‘™_‘æë6‹Rk¶ÏÚy3Ìt[¶·à€%Á#Ò­ÏHp؇ÈDiÓŒy¸ó?¤AA ²LGÆË"ñâ¹s÷‹á!Z–˜Ž%@b«"ŸWþ«˜›a_,B\¡HÉÛ¿F¡š’Z» ©úœ™b@}Ù ¦’•Á%œ‹¡½ú‰"°¦ã¤wCH!‰ªiÒM`½,éôIå5zà]ÊÃ[œÓ«¼ˆ¦§ÕüÆšÍzI’UŠÚÓ>úâR¡>5e.vHšcsiÇ;ÚU)¬„‡“ŸÑý/·lŸíܦ]/ ÀÄ«Kˆƒn1§háÐT9‘pû '«[¢•‡&A•‹,­‚P6ɾOád*$çê0â-“u êÐqæUÐd¿³½ª_ÞV®ú¦® r•œNÂÇiÍK%5Ñê½±|ƒ ü6®Ê¾Ý}ÏHösŠÚ¬BÒîÅ;¾0ËTh‹æ( #HšV™ª|©Ç¯\ñÙÆ5L*¤ûRªž'Jæ4Ç¢[tj½§ziÿk- U>±±(:£–·§\ÅC…ðTŸÁV“p‡‘Vì6Û­ƒgÒsBÕ#ƒ‰XD>µ9C»‘£¡£»m-Ê.™ï7Uo&,û$OÙìá~ èu¯Ôöd¾ÓÕ?–•(ß>÷Dfà¯ÔÑüv¬ ™ß›ãD$Ú6îX»¼’ƒ/¡š q +9²NÅÔ/"°‘ñ•••«Ê Ua"3¬x°X><{¿ä…jîo±£éÐó¹X#ºÂ.—ðêvNyB8$̘¶cbƒÇå’È+¤ö°/™e="ëW‹¥<˜q‚»×xı‡¹5g½õ Fõ°ƒhÇñ ”éŠpF.4~&ÒÐD!°wüÉ "(ÞMâøƒP¿¯£~qäDö-žd.~˜ZM«;»)£±9ê”Rv¤‡Y^w¼sTñuO=ºN1Y¤µd…åï1`ÓTm ‰n°hÄH?#¢,»G&Ùæ§dõ~4 à ñ¢î2I.q2,Ó›Xmçn 2 —€Œ¾Uo{1Ó˜ùì(‡\6oN“Ø¡5¡fðìŒKß —º-¯P€™´ €õJ q¯ÁJ¸Ö~©aeÈ£_ü…sdtä§|„a ŠQÁ¨6Ýú$?YF›3¤U͸w _ro”¯,¶p­i«øíµ¤ Ô=þ&ª‹ L–°¼.Ó¿’°½¼A›yy¢²h­’Øu~ç„1þNƒ$áqT;Þ—HN¡ì9Ø(¥ZIØ"$c¨ÝiÁºA•£ÇÛqø;>»Ó å÷¦…Ùb\ÎYq(P`¼Ú&>n0ª„A Ж9;Zwz) Õøü5ý„¹I4üæô²¸MlŸÕU9Ä£ðvÊ£àg¾çoÈŸ£na1Æ2æ~ʼn]†-(ÕN[BÑÌììí» UX×à É>LŸèV`\×O£ó-ïÀ€N«^1 «9Ët§¯á€„ŸkØ¢“#áO»(â[‹àüXze(ÿgOów¹²× \çbm6Բ‘â (Û÷A亂̵àÄéœé&LÝvu„H³Oa”ôalõ®ÚmïÓù_g)zzH2R¨4 ­¼v &‘ û ]²ÛòNWA?uz 1cÍ”õ/UíAC¯+—UÐÛJSîþ©TÐ"o’Ù’ÑPwÚ<á!êÒ%ð×AùEYæ EþçR—¶VÐIûNBfìÕUû?a:ºq…2‹”ðÈXý†jذç·9þª5‘£#Y‡½$|rsíŽßòíù“õN ¾á”ÞÍÇñÌhlèꟆ¢ù"ÚÛ³äK I¥¦c®·Žº^¥‚¦ ¶êÜÌmBómMjH,Íncg¡ š‹ãÏÇnZך¥QAfÿ}²0+êä:˜¡ò+hvšîÌEd¸Š*c‰Ê“…‰sÚ/µü¤:,ÂmSž6C¶€’gŽÄ>ð<ˆ”°ÐòŠW½å‚ó˜KæÄh¯ô¹fPû¡štš0%€Ì„ªß9Ü!Ô\Â7VÌ¨Ž°oË´†…ô³/‘€¾Öoýï4*M÷\}Q>ŠfÊM?ŒÒûÀ³.<ÒÕ3äëåõ6Œs,®Ñ#àmc$@B´×jvÔ å’UoÊMÚ©\8HìŒ7¬G1Þ%€‘Ú\µ¹(¹#qú:c˜\ñÁs_üØïóg0w˜2â ´xñ/¦æZÚ/M„8/Dß›¦!Êͺþ¯u ¬R!õú=¶½ž‚åª;óR.ÉËøaØÍ8½ã{áiîÏ ÚJxq-Õ”¼ DØvÖ÷7^ÇÁMHœ`ltpÿOˆ2ùìi³!8rçíHl¸•¤*GöþÊ13b’ã…Ùƒx õöêñÕ2Õ,c¡uÕA’®‹LáÒ¤¢¿<K¸jÉ…ue6fkÙ.¶#5KN.¼h/1Ë9><8Ó]?Äînb6ß:„ÀV¯¾…!¡G¬ùq¾Eƒ ÛŠ!E‘dpfŸÄësc„“ÑEôîP÷¼Œ1&ƒ›Ð0I¶QÙe›æb«-¼•±¡ATp$þ5š:½>ÝÖ{&lÈ/°¯”íŠ ïnÃù,•÷´É ,b®KÑŠ!+!šÙ ØnŒv}R¶±HÎg°“0‡Ž½z0Ћ0¬ˆº&b„*«ØÒoãNvé€80–b!‡oŒXN‘à5¡K„p̦„ªSl¢Sö1½ïPÂõeá" ‘í•ÓóðWD÷–©ç¼ŸàsïåRK¡Áúˆ©P†d[â>ˆV"Åd)ø‚`¯Á¸U¸+©sž6—r“®é*ŠkH 0žóájÔà¦Ì¦ŒQhá{äÈÓlÒ2:¥°€yšæÀ3‹L…Œsèß–'X¶;(,!” DŸyº†Î/A<(›(T išu?2¡Q³´OÍ“#:TQ!DbkL[1uÃÎêFñ鑌'4q:wÁB¶KšŽ·íÜ{šûIÎ ƒü'¤ýobG¢WÒn­ü¼ïË#[É w''vwü1Í-+¬¸ö/÷Â7à°ú ¶µWYå/ZZGcðYªä8Õ>LX¾ ǾŒªHkæ_g†© &¶î)÷” ±ôïY¶}* Ž¢€‹0úÿl¯ª„†OÄÏ\´=RV$†d¼ÒqŒ'7ÿWïä$:/º¦äuôóŸäGاdãU'Ž’>Å{yžÍP$n¾¦´.Í ,¨\µ4piO`³bÖˆ¾@; UõTLÚNæ’­WæÀDZDa;£M…›û ÁF *3€ç„€þçãÒ­54Ë„ ¥]ÛN~‘9ڿ擸Õû•ð»± £?½ §!ïÀ×¶¿xÆwós<+ƒÛ×µK™Äâ°dÓ'Éj5 "·wϤÆÇàˆ‚ÖŒw Ó"³ÅG 'Ö”¥=Ï0Ò(5`§¨¥Ïn Ø«UÒôÌþ‘ Z§äc^d§ëÁŠ£2\Xµz1$@ Ü–aàz›ßìdmûëª|IÌ´­;e ¬pL!ÂrFmF.ÛWäeeÓ­qýp0¨+$ $¶·ñrBqÅ2E»)ðŠñôª{ò˜Yž:•Ke9Í\\êÌA¼=ñ¢WîC&%·FA1€´}Þ_é £áL†ká¿ûp&ú‚ªPDõ-yÎR*oÉÛ£_fòHƒâs˜Þ—½Yptc‰š „õ3KA@ë^WÄ¿“d@:*çuœ )§I}„¡u¿—ðð¤×³‚â¯Pcn¡`ºèê÷‹?Åý´” ¾Dïd“±.1&ˆ%PyÊIÅݹÑ[ªÓ+Y_( ×Òþ=m+:Sr§¢=/cž}cƒmÎàŒ´‹ØV{£ý÷Qf\3…#°j°æ½3«/-k‰1kam[š R!¾b*RÍ%®ì™[hS; Mԥ˴øˆfOá» ?T`…I­®Žˆ'hP j™qŸCUqa‹nÆQ®ç‰Ø%ÜñÂ7Y¸F¨tÝv_¿þY5ÀqŒG _þ§Õ3ó¥ˆ×Á•9‹iÇGý—¿¢BGµ:`Ç:[šEèé²|m´žAÛðÅâ(Oˆ÷ßÎÛdðÔÙ\·$;ST>9ÐQ•@Pà­t¬’n7í‚T{ÞCî}[¼ì·í[ ,s8D;hÊþ_Ç{2[&”I˜\ÃfêŒ0"*QSÏãe»uØÈt©±Ó}Ç|·•^t JQ -ÜÔ~ºd¸cºq›ë„d*îGF´½ÃM-æÀÑ\l þÕomÙ-e- àŸKsÂÁ,¸ë¹LK$©+ÛºärÊàµæDL³ “rÓ=c?>5BeuKÛ$9YƒÈ¨9ÔœŒ=½ZˆH'r‡Š!b–ªeS± Nš•£CL+È»ûáu8ôf²&hí0y`ËîÒ txZ„LÉßgT¯„‹ð®QÓ²Oê @ÛbzU–²´ë»dL4Љòjû³ÔJp&è`U¥«µãA)Õp8›_ÕöFr‹ÓÚ\ÂJYçùx ]É/ññ¾9Eh@Ú^©–‘ òÏí¸ç;DS½(EÕÛv Ò—ø¤8Þhù%rÏäT£(*ë=–è>êèª6þBX¢Ÿ1U£ÔO ‰Üž¿ý*ÐÒÛ1[4o°æ_½=á+ˆ »¹‡Ì®h ¹Þùý&0’9Ôç~Å|ć¥iý ª€E2%5|.üJ™ÓcFL=V86&ºÂs5õ`4š'ʇìTï½ÍLR»Që4°n%Vƒï‹±]jAúz9÷3–Qp)ƉµÊÛjtÂ4¬ÿ!ëP¾B AƒÅ„V»ÈÈ•²·ýþKë5 Ù|y7”R#Ógf²MóŽ©Ú,Qêé/íK¸tª¥Q†9&G€£;¡|ï"Æ×-™ëÉ`ÚlEÜ]g{|ô’(2Ô±µ¹¿‘‚4 ½.îƒ;X_˜œêÚ¢|Ž¥m÷¸ ùŸ}^ø°pÓÑÆ¬3¸¢7¾qxŒ%å™ë‚ž&Ùž˜TõÞøÚxÙ‹Ü]¤Ý³ÛD¢Þ|aºž·PLóTB°©Pä 6Oo~.J†+!qN ÐÛ )f<€ê:ëú^ûâŽÜy«KYï┫„//ž·ŸóŽ:5úì€í<Û›TóV`àôåu7>a‚I¨40«k€©zåhã}éñs™‰9¦Z.zÐÒÜŸµ-çáo­KûV ¶×T@s 0ìÿA¾×sÿÖøqJÇý]¯ÒÛØƒ®q—ÞA±ŽÂÀ_ð‰&>‰Fÿ(|-ÃE#·S|’)âÞmtS ÐSîCHúOªÂIܧ±M´äA"£}p<7”Å¡4ÿuëKFb ŸÍîûjy¢î0u¾û‡%Z«ª¡P¶#þX_~iÊÞ‹‘Ü1Û±ø¢þ3Ûî2ÿ¯çŠ"„'ŸæV'žÚç´€5õ¼œøUOb:qæ=r“·èAŒLôFBoÁ…ô°íÎõ.0â’œÌ$9YƒÈ¨9燫~OB<Ò°¹×Oy|›Og rSQ× èwvG$ÇD¢¿•S¬.×#Ê)©}f_鿢›¥/ß[¢ÓÑâ7ûp)¶)[ÝA‰Ë¸úëgÑ&pº­ôZÑëùŸ«ÆGŸðS}ë§%[pdô}Ìb.:n´—¬ñ‡P]ä¸É –*>ZäËꪃ¥`1ùý(Õ| 2©Õ*7Zðz!¹Y Ñ&è4i<ÄŸÛÁ†æ`ã7Òë L·ÊŒ”Zã`œ³+™âß‹}Мðfʾ÷ò)ز¶2éékxC¦ÍÙû×JI"°Ì”‚iÂ@*нÈ%‘F[}"lo€À`“i̦¢õSà'U–ú!­2âDÿTõUZ é|ƒ`¨šäÉ€‘·Bz„ß³K],¸×©ØWN²CwÇò±|,C]Iø½²“{–î‘tš Q(\¹âšs„Ø«ðÄ©?©rI’q0$Ë%¨*½5w–M‰&ÁzD×´Ý…ñ¨·dÌ!ÜÒ oɲ,bï9Ô‰=#RÍŽ¤{6…›4Ûg‚jòTêÏí@X³ A`YŽãJàhÂ_±äk8K^ÜÅü€ѽe[¿mø"/—i:_J :ß;^Ú¤ï3:†¶Sl›Ö)HL-1¢ €Ò_ráqXþ=RXaK÷ûGÂâ¸h«“t˜F*Š*·o¿9@ŒÖ²Æ»„ó,)g×:]!n|s"3u°×²QبÓbQÒ“LÈ„Bý~DS r‹¦]ŽWZóÉ“Á8!®;ûÆé¶§pØu®´äMŠ˜¿ªê< ·Ùˆ\ûø&öZO[œIs졸Ø."'Ùˆ÷}Ë|íùVŽ:ÌÍÜÝhnüÎvKª¸–+s°\ÿ‰ ¨æ/'JªÁZ–€FÔÿ )+³Èbv '/y²}Ð}{:ŸÛ…ŸÔæxD3þ#͘qžž-Sévà²d"M‹£öÑl—oz奈¿†7~›|/ ±éé|sP¨sz§…qô×òH•úñó`Y8bOì0c4E~XÝºÌ `Ñ‘+*‰ù=ŸvìáÌÇK“6\YT#¨2w„Οޗ©yØbÇÒ<ƒ‰ÿ :EMͺ> ä«€Ö™„Z.lä¢óFÏÓÅT§v¢K;ý;Ó̪ZÆ•¿ÜŸQô¥rDoÊU€~™Ûô™)/`9Á¾½qV¾C`‚3߀˜×q4ubËý¶t¼âwžÛ#N`ØvÚ²=M,„QG<í6(Š"›ZÑy´*ß«æk¦Iúî”[#%Û®8áÕøA6O4  RÆ<ˆ3£³²¾¢1ÊF›á]Í@aü‡¦DÊ#ÚšÞL“gƒ *å ™¾,¸Kh©¡ŸcZ&ÊXôÚ—ÁËÖ­ÑÄûEäì¿%똫øšÙ×T áÈïtd©Ö#€‘ËA´·9º(òª#èÇB0Tª®¼ž$‚ä–¡ÝÓ7ðÒÞP®Üá1žŸØºî]=Aîõc¼¯üцÅú?ÍpÚ›íú·Ònñ;öóeuÌ9R3ªµ:4©[Ä S‰‡A„¿q×—D¤KŠÆã>´ÚáÉ&A—ÀJö7~1Jˆ`ù{›êWù|%Ô5YZn¥ ~<½† ù²iy bñ}uE_PáÔ8mQXDØ=ÙÉ7Ôð€ ¶Â@Hœµ›µæ‰‰«Q Á²4Ij`ï-–W0`~Z!@â¬éÂJðzQKÛ!Öþª”uµ{ö[<q˜šDá²a¬ó½¥˜V …$}ÇöGU€ô!s™t<Ê ªáËŸxBn†Ä+¥žzj»<ñzIøà”•9çR*R‘”V–ÃÔ¡)Ó{-¤ñ¶X atŒ«ìñy=ù—k«ïKÿL?û4ŒSìÅ(]¬yÒ¢·~ÍM°j!?â©§—“U‡/u¼ïüvÕ_k(TŸ ¿õ«µÁÇn ¨Z¦æF&Bœ¾lµµ×DBŽ?mè«WGê _[*/¯¸æ,ÿ‹Ã1uQpŵiÍòpÎÈÚ}ÿѨ6þ®èôºÈáÃ6³í1G=Ó½"e úÐÚ±ýcá,qºÝŸ2ôS§}BîØ!O@M§åjO[3Þ0Ã_4)ç%²Ê;iš®ór£ƒ†~2à gØ1áÚEåÛ†‹‘”®µ³A} &'½‹È§kMN²›ƒ……€,yÞ·cØäëŸn÷¹Icü€å^¿»j•OH}î&2ç!„QµÂ=ÂQÏwVê„-%TbÆ?•1~eãÅ>Hn&®®;¬€¬Æ¬f_xš&/ !¬³Ê¦Çq‚È3ª´N¯s »L1ÂÂ{EfZ†¬9/pþ5fÀÀ§WöޱÕTÃ*|\M~}FuúÈœø›ã[ Ç[ÝÑ‘žO­7Ì×X‡|@$Ýô{s~ûC­—1ÈÉžÇü­Búvp¨`è½Ñc…SÛÛ¯Øù…«LkPH€&è:A›{r]|sW?¯T£ÊÌYàô­0¯œS©ÀmmIùV6 8eicÃ)[8.ð€–h‘(¼ø±6ÊE{@\“°:%¶9š2„T°åŠãb‘ƒ#‚5Ñôó{޲¬ìIx¤#ŠÈ‚æ†â2@V¿4HÖ®y8—n¨d‰=û¥¦‚²ÖA±Znû±Ç#4¿Ðá21ôÐ7Ý¢°¿¤PqY"„8¸‘öHâ€GQö=xëõ€ÂžÙ² /×jvß}Pø R¡ÊŽœ¸T¬—´'ªFaûïä¹ËOÞgtã{ä^A<¥§gÁp#ú¤6¹CýNïH>ôw†Á ]¶¡7Ay²ÑY–çÙ†¯]8#â@Þ_¥/å£O[ü®í5ïߢËäÁ¡©”PÈp]“ÄuÓw,|±âg)$óÉx¡ºâÉŒ‡5z9ýw_ïðeÊE;ðs.F˜­¢ð±Çº[r¦ ¸ëUçŽÚÃ|¥‰Ä`^ŒÒ>Ñð“#¡Ûîa œþ~8Ïѽ/ç«ëTGMØn ’öcìÉÜ6V^Q±V®|÷19²J·+QG Ù£q€J`ÆÌ°léj |¨ìÖÀé~ f;‰»±ä!vXùŸ æÞ‹¬A$¹$ôå›þË·¨è¶$x9uðZWäDÏ”í2|+ƒñ‰VÒ™†]8b«€éÍ£é‡íŸáï¬ÑÈaÖ‘.Ž¯Ã·¯BodÃ]ŸÃ63úÂñuT^Òù;a®9¹BQÕ±KtZV¤ñù>5P.-»ŒÝÂák:NtÉâ¿Ã죽ý,©Uù—Š'±ú¹ŽŸºN¯¶?eçLË!3õzëÔËéçe ±xTâÙÉ—Žƒ¹/al\dkÁ7Ñâml幞Ña´íÐk ßqQÛ÷>ÚYý‘)oý&²M…ÞpvÄ{ÚÛçÁvÛ9y,:RAµ|Ÿ GaÛ$”3FîFë@Ä]/\S+ƒéçäøÉ'i‘­¹äa(—”±»'¯.‰|‰~Nð{­Ú‹#§EgpäøÓ(¸™·®m’âÁÊå¸û%‰“·]ð”îy`ÀüIdsµ$B¢MŠ ¯‡ŒÂÂ›ŽªsV.ˆ_É& K/ïZöéOʆ÷‰«ñÛÅg‹;¡ã0pSwëàéÂ1â 2§§u¾Mq U+Oš×ÏEŽÀmIWп™ëªœ(}4;¡@ÒíDÅ÷sâl{¢íûVx©.åŽîâðîXÚE߸„Á õ’Ú4´ÃU4Œk«S7/ÏK íö¹3ŸZ³kmØ"T<Il0×ðæ:ãç¯ìŸpÔ®™(Ò÷Ú¼bgåÛ1,=N;©!n¬(ۊȳ&æüagåIèŠÇ+ù!·CDqX…WûéÜäG Ü––H_0Ãh@V#Æ ˆ d@ËÓÒa3?\ƒû+G œ]©³Å÷„_nÆøÐÃÓ;åkÈ!&ÄÅü öðFå âÎ÷¦œõùá[ŽBU0˜ÐVõ‡º{Œ=1ÇCpìÜù\¡`Oã6u‚Äó¸Áƒeœ@xJÿc³/|àsuZÅ[™ò, †ÿ~ŸÔBX–n…1_y^¿ò0ñy‚X2`š"¼@ëœ$¥>ò­ý‚AÜ‘Œ¾·ˆN».­ ùhÔ2ã!` m1ƒÙ„*vÓ+‚qBB:»}² {ƒ”·NdFÕ›˜­mº/Fïß8²ä*EÃÏÑÉ-¼®nFÐ'ú¼ÈûZt¼pM‡a …B1J àB³¯…cwA‹6EUø8­ÿÜÈÞ«kmOº úõ6$±#d>²ŒÊxœ_v>8ÐÕæÃk±/­¤î+íÒH=\ã@ÕÛ2¯ùj q¹•¢/CKŠÐã¼Yµ€;»!öBÓ(*EXÑÄ”ý¿ X¯†M'ØÀ§žˆšÄA¶w]’½gf I·ÊY‰B‹¡¬kpÂL¼å¹îiZµá‡XüV ê!éHfr_Ñ —÷&ÂFì¾[ßcÊãæÝn”&3L¦ø?j›ƒ@÷ ½ój®åc2ÄÑ«˜ÊËŽ.×ê`Tpõj)ý˜óÔ©ˆÜ³ð2‚8’ˆžhÝ¥:ÔT¢râ%B[a}í£!ñ#Ý\—,À_ôh¨ŒŽÐ*€& ‹S6?b¸óUµN39H&êIé÷½Yom/ñNˆÄŠÖ^%ÿåä¸ôa9íw›^§9m½¥ú†ô#êÝNzÁR• ÖGŠŽB‹ý¥“"ŒÓôÆcúçöy7öù¨76cþ ~õ³‡o=Y”æ™#…Þøæ`­/©†˜V@–µƒ·óГ抔G5×]îBŽ2ëUñÓs±3æúΈg=ç³°<‘ú x«Ô(&øîÙ vÞªoÉ“Xk©Ÿþذaÿ\uéà8U…é"kñ©êN7ô•OÔ&þ`”f¶ã– ­‰‹nú’ˆÃ§cal°­d^Êô¿¯ÕÏ©HÀ)`i}×gø×Bò&˜£=‰cØ_nGÓÝRl -ÓCA8Êì/6‡özðC_² rÊ÷W†La¡v0"¾ÅÑwK›ƒ@¯gxq  ),׿6õœÂe!ÜgÊ›ª8¾‡:˜ã,jipJò*õ¸e2™ôÒÀ°ípØb~LUŽ‹>kêYïV¯9ïÙÂHÃ=ž( jß~°òµu'b,ˆn?€x.˜…}sÅÔW¬,S˜uò꯮‰íÜ\¶Öäs¤ºÍ›—¨6µ\álRØt¥Ôà;Ó»»=­r·=j·7GHqø¹ X¨6¸%Èu×N%¿k©§2FGÃçòÇÍð€{„Ϋ«¸þ¢Ë_^aï¦[S´¸¢½Ú$ÜÙy³ë®·þÖ}é×[M v aèþ#S2Ýi=jš²q~%óž]j¿œÔô¿¹ëW¾í€å„â}°56ʧTnˆnèFn¶GRt)²_9uH[„ R5«áÞžž5Äÿä÷â` +I‡E©¹Â—¿Eø&p)ŸÓº³ÒJ½%?…â&?™eÒ6v+sÊLê:¶„?…äÍšÞ«¼9äiÓ^’ÀÂÓ¹VS¹/{䮺¨¾ïÉm8`˜íGú™Ù\€¿-ŽÈæMäÝG.1äJ>CÒç–íaú > ‡Lz:}]k³Ïˆ@i’’°Q—5Až(ùPÙ¸„: òàD;üâÐ ï”@È¢ø gŸ,á8ƼÊ\«kg–Nºù¯…û¨êóø“€U²é$¦RÁˆeT;§’x«Î0šäv8{ÛH«Ÿ#v¹¼OAT|‰'a!†Q,Ñ#3ñIl¿L}úûÿ±Ò¾ÅŽ‹"ö ¬L‘wdH¿ ›Ý,_ž¶àïQïü9.‡ÿj{¼û ¹t’S‚ëZ Æb>& (Æ‚ÄSÞ±ú!ôS @vVàô‘b€Ç‹:Ìù°æÂ>œ»û‹)Ò¯dÿ ž¿‹Ž`”&–þ]@j‡Œxi«‹ {ô‰~;=mp-Nˆ¡ÁâZGOþ8»$ÑZØ× *¢õoŸ Úv$ò"Æ»ÿõ<ýš]%0iÉ™òÂo(MùüS¾ì%Àÿ2÷£7 Nä–w¢$–Ãô«vÓ@D–ÅäâC`}V~! ÅÒ­OÍF©, |Ä-wZçŽdÛVáLÓƒ‹ ý0“0™$Œ›Ò±Ê¥üŒgu­làhE"U¶atm‰Y•,N¢w–÷‚ Šàà!}¤åë÷úØŽP £¿‰ÊÀ­Û†¯Å…7ˆ6W\Ü_½ÌZG[žÉ»&éûàÑ.SbøÀ n7u1›5wèú!ú eëEñÏ]ý¼Ð ÿ¿Õn­Ãÿ]h01Å“O+ó*ê2e*Ùõ2ÄÊ/×±/u'À©°ãËoêÀ Ù’‰5wpòÛ.(ÞȬ’³8>›ã\Ÿ ·Bi–íùLº©M 9 Sõ™jÖÃÛ7þŽ7ïÂC ^(Ù¿ƒ Y´ÅjªJ.O„§sÜPƒÚKqSa‡ ÉgAކÈn©Äø”­Ž~ áÝFnL.$ÆõeZVÔ”Ïf:§R0ÙœÆãÂõá‰8• 9%÷—;7ÀÞQ]‘ómÛÅ1É&\‹c´˜D X+¿—DØ×ּ뭵Í\Aq³è¢šæ?XÕ’à—yyÉ€ÃeCû©aþO+XKßÀŸWÛbþ®f‰?ÃŽ%¼DÜ–i÷¥RüÞà ÀþÉz.\`*@À[  ¨…q o¸¡¤T[Šó¾;C˜Úç5Nò@L«@„´ÍpÙ“>Èɤ-.ÛÝ¥¬®Ñèì¯L§~áMªQàMNö-D-¼×“.‘ {¹^£pG¼Ñ[@gaÀè*²ï¥FòÛÊ…qù|ƒD è>KY–zóRþ¨´›û" CoT•þ«}æÚÌÞc­±«;‘‚=àó«RCV:èa=þ8x~ÎgÊzNÔ“w‚HeA„anò°H¬ò½OcN?·­RlPZïvֱްóðKð…¾ÂÎKcæóúd*'ýyQÍ67Ø{è¯ÆY!tèid¯&I¯]„¾F2º1ùMr*iÄ&ßâèë¯ExBTQJ¢L„Û›V49-AµÁüF ÛŠƒ8žrK|’‡òÑcpV…#pcú9B7ÚW(u¼ùÚ,s},ïij–\ÜbßÈxõ3×#šÈ3ÐDµcÜFtbhUlKIÒˆœm(Z9×Ó »TYR#™#ÞÚ'rÖQ;Îe³6´á6yŠž,þ$+:ÙÔ¬n ãÌ{íl°+ÅÙÌÿ¶¹E(û„5îc œŸË9ÃÔѺüO(n‡ž…Wê°2%É$0Ðó-¹6˜ 2Ò™Üd?,³ŽÎÊmϾÁ‹e·ŒGˆùô¬¡ë~WÐ2,LáŽ`]ó!žñ5vØ]‡ ¡Ið~–‹4Ð6¿Ë~i I‚uÔ¨yñÎ#p® ¼Â6¹/‘8{Õ©"¨L4FeÎAÌT‚@-b@[õ+톲¥F_Ó1ëCx²6wkÓtˆxé:36دgY>Rö;©Alèù%s@º"8P©5ÝNZ‰Ä ˆ ~½?±I÷^ â#šT2 ·ƒ³|Ȱ'é"Ø"®rèAúm˧¥ÞrÓ5ÀëÈ‚Yu8•¢‹"Ø`¢³4PvÄmd™ãd£!}]†ù#¡þ\W›NÏ<¥z‰Œ{4¢ì˜‚Í^ßæb£w±&ºó­×”_Õ'ÀGZ¹=®©B2¬–È"T»F=#p°•IHQÔt’·ÒqýÃ>®!DYÝš`Ø s/òXIØ=ê:ɬ¼½öG¸ÓQ½»^eü󆱦²µïaÆØç5³–) [z•éøã?¾b£K€ÐlZmÔ§ç-a°·H±l\!NÆ,´¯‚ÆŸ8ç–…ƒX”}$Ñ—ç?¦XHÿaޝiß$~’̰fÆ’´# ¢œT /XF½$ü‡«ÀKçT¿U‰C’Ï#¢¾<³®½9 scG—1:.Vp°"rýÙ -ëÍóÛ {Y÷1•)§¥£Qÿf˜Ë«RÁ#· ™ô>Ä—á~Þ¯:”ÈøÃ»š§t‰ÕXž‰À€!9Ëßf8ÏÖÒÆÊ7•áÎV›™±ñ3»VZ!Ymk /ò%$ÌüR±xêÎw“Œ!ÈŽâEÊàR*M{$éàZæððÓZ» òWX9ÌÖ9¾2“Ó'm›ÒƒWq„û~¸ù´êÅ ‹Z+ǯ4d"¿qéçÏMHaè2WÑ0_%­['‡ôx˘ðüçœ1-¹´šPÝ'³¶hžù•tÈÒ*Õõß*¨‚oǃ(7öíNËCoÁĪK“¿»hDê]ƒ&Þ[/»ËÄû».M”A6žÓvÓ3ÒWo9ðhWáåÀ†0¨2àó;_¿v •%Xîgïä¯Ç/H§Žá/gngËgÌo)ç¢QìÂÕÎ,Ê\äÆŠc=@=Ùsÿs™%ÏiÐZêËnG’£¿]•‹ð½*J)Ø6Ó¼Ôxhì—>a:’Dl”’«aÿÓS‚Ì‚8²ZÚ*áÐ4Êsc¦|éìK T’d‚‹40~"²À¥dÕP峩ir>ã[&­EÎÇ_¥!ɬ>ºË|¢Žlæ'Sb€=a+¸P#׎ùš1V²—àŽ0°êb9jlƒ 6 É*î‡ ßO‡3X¦Ù«4“Å‘à˜áŠÈ.ZØ3",x_AIˆ¿dQXš ~<l«›ïD‡ý‘M6ááÍA9®°Iõm4‡wõëqiz*øñÏD !ç·>„¦å[èÞO'pU§Ði§Ÿoùey½éoÁ5ËO+Õᤲ6¹ÇUaj÷_P#Û‘]‘ª :2—«'WÖ¡BÂpžìÐ<*4›ËCøEë—½ô×<^9F}:耇ðnòûôôf¸‹»ô¯`’èÿÆÛÕOž°çùÊ él ¤§ [4 Ù]Ñ'Xü·¼ÝW¡'Ã]¤2s¾J“þgDÚjÅ»f& _NßㄊÅÈ nGF1‹ülŠ;ÛaÖM¸>°z:¹',{âàšOA÷’fD‡#ïϧ ¿g›Çƒ™â?tÐ ú—T§*¬$RʪP@~>ÚÍ ü ¯†KÚT¿ÿ­Y–s+»ëÜxÁ8ÑJÎF¿¡f”!§\ö-|˜÷B.äê@¥ õ²•‡êù-pe(8‹Ä¡p½hㇼº™ Ço-B ­ p„.œÿ×еG&ÇÏõ‡‘åõ'§DsõDÿGj|’ΔmïÜ[IJâÄöhCȸ+„ùd±Ú‚÷›êöê‡ü§9¾Ö,ho¸çƒì£Ëm4Ý¢¯6ÂjÍ þÝÐDô]Øøë_AiÇëµ€+§î)i«²˜ÖoÎÐë&Ò7TZÓx‹ó0 b'͈{rŠ€MyV»Ìþ:SøÉ^ªCûi'”·-”™,>ʼÓ÷ïrI"ßRä„]ßPÎØìIˆ.•ÖÎ…µõéÝ”^ß§³M¦&%u9Â(ŠûËÍÕ™ü\.Ë'î~ùÔÔ$f–Ìÿ™®nÊYM¶jL^æA°ÿß+¥|º!'1½39ÁÇòbh>„F˜^ªš¿ýб¢¿ïeîQÒ(ÖãèŸý‹3öãW"v"<°Ð[.g=N”P/¼j­ßÁ\v~[î\4 „Ü)€”I‘:›ZY¹ŸPè(‰á#©xׯǛÿ‘”x„;È–oÁ¤9âf$WÒÅ Ó¥½f»>l«‘§q<®=CLÑ«ÙY(£kÜ/§Xti0ŠÄþì%A®{KÓ˜˜¸ãEž=ÙþgÆê‡dV£‚óó´áõ;¯v ƒ%Ýܳòš“ÝNæÉöd(¬ýoSVÀZÆ~$DfW;YYç±Gä;"D¥?Ä~ؽ·ÌÌÏÓ‹jEK2u–4#D¬„’–‡îOi·¦Ä.89—µYûîT`tÙ ÅgŸŠ<šV!ax”›ÍE}ô';â³,f†1Ü–=e¢=Q§LÔvKl"ÜÚˆ(!‚øÇ®ÏÚãe=£è[-@jO`6[³ùH´ýçLCÓÔǬ—»X9Í7‘R˼M2FÄqȈF ËÛkeFÜy/ó©ÇMôôÇ|ž+¼G¿ìÅÙ#»W¸‹²g`«ï‘Ç…Oh¢4.£„O %ãyàîCò¢DíèbÚŠ[`GÀæóíÂo0³½€ä,‰w‰ªmÚE¨kZš¾Œ nÜ}©K¥rÎou=4‡ÚÙ‹¾EId…D^ŸJ Aì> ¼Œˆ° ?Tx÷RïIžcbð'ïÜÊBpfŸ2'!DÉwYñéUßá]Èh%Hè0)ÃÛeþþƒt¸ÉÆsgÔ5(¾×P`‹ÚµSÈê®®O!,ëOËK@èy©çH{·S*ˆùåW±«Nã²ó*¶žE (Ì_n…ï “ì¬M€›ˆðdº§–Å¡üŒT^e|Zb‡¾X,¤D5°•Á ݯeCŽJ|ÔèÊS° ñY;ñµAiI¿ŒQý¦ÛÜȯN¬üБ'€zŽÔä ìa´",R ˜*ëPX@l\;è1œûa<½ÙèòÙë%ÀrvJzÝî@4çw>”¹Ý&9B,´†ÕÏY'‚âü›÷)“dêS× -;Ýÿ0‡›¢›o]<”Ÿ’4rþ „,Šsî(¿á¯\k×(UBJ¸0Ì!Yº˜^ƒœ²Q%« #&¥›‘[]©Ç $&ùÊ:»?,³Òâæðµä  ÆcÝÅó»ý½Æüãª&&/G¿(Õ=e–‘!„Zâ}¬~â€VŠÉõƒè¥j·&â• ³ˆO$eS#ƒ¯X̹—›·úÜ$´]Xf½$ß ›6˜‹Û x¤D4ªlºhQWõYNœ¹sSýÍZyf˜©<¤[Ø‘ õ¸YÃÜ{¥›iœtèØÑ¿ÍìêñûŠººÆA>B–ˆ|“\ç ÈLY„qúÒÍ»{}':(ìC<ƒª&þŸ‹‹w5†!Ês( S$µº}Ðnð"¸wÌ#ÂFý+¥š»<ö 6Š\dT"ø˜$ÃGÒý¡M,\þáÍÝóÝ÷]ûûQm ôciXmð]/°éqwÍ#ø}Œ·ªÿN’ αÏz$QrûCo?K–½$ót+/ÄWgSÊO„µ2=‡Kø/\p ;^¤Æ&»#Rm›§ûï–¸ÛÇ)©†¹rE S¿†@»`PèǼ~<ó™à"(í’r–ä!>g2¡Äev7_R…D°Naѵeè^c§_^°• l°/ð«ílX!Mz.Ksh=; ?d6:½EÎ{Çæåd› 3墧˜D¿‘4 ÙÄ+Yïp[I¾ª5­F<‹ŽKØÌ‚Àñ‚’»½”¦˜\Øù† ;›‹/GㇾhÏì¨jÃãUÖ\ ;çÎÞäê^‘:iæIÙÒÅü“4C­V. °Ô…Vä&ÁLXÿ7—4‹R­E‘CÁƒûQŸúùŸiüO¾íiƒú¦4 ”§ŒZœ‘zgn¦Š[ê¢@£õ?%&Qð½­ùjÁ1m쎾!Œkc®™Ê¥q˰·“4¹Ú-Àƒ»)O‡¼þ/¯ Üdsö ðlðNdm¶sCccÄ í†‹y åI$Ãfú×·xûÚO)³{D¨ P–*Fͪ?ûϽÎOD®~˜[>.È%Ô6# l|áÌh|ÃÐ9œ&ν‘DêE¾l”LÂfÛJ$¡ÍqµQ”•ÃjÖ7¾‘^åÇü¸‰^­«¤A‚k¡ò¶3mÙ¼õPa¡·âF9O%}½DAjäf+9³pPŠ3@ ]%Ä` N÷–53›ù t¤4þñh#ºlh K•ÖT]ˆ¸@©Ä%”+„Ê©ØÏÇÔð4½Qz–°ý¢Î‡é˜^9aâÚMHê˜ y€ïÐ I °O(]Ä ð¡ÉE‡³ÙcâtíMØWÞhÐeË63øgÏt:¾[ýbQóvŽ :‹‹ešU8Ÿ¬T¹€`RÄ»t3úl3zÐDÍûºªñ™úŽÛCÒB]Ñ)5!C<#‡æʈ3þ%ù(”’Ƨ¸Úv¨hç<–-¡7çˆ$<›ŒžSØr±„ w¦oTtº„QgлÍõzÕté¦ýÃ0ðµÏ¤—ؤ#¥i§‚™BÄÝw8.ŠºÝÖáDÕUk-Wg¿ ¹¿Ð¡ x¶ëWÊn8ãŒÅœ»-µç—µ†ÔF+á`³š‰ù–J`#Œ…')ý¹«ò„PiåQg¦Jç@ ÙŸ†ûây¨‡“8æ¤änòÙà?ÇxîŸÂé°ôû `cW ;…¥CI-;+W>TäQ'£ézWÜÄ…7„šÞv'£­æ‡aú4RµjàE jxÜ–‚8H Ï™ºµôÍÖfæmËOröT«·ÚŒøW$a¤¢—Õ?!Œ!å¸áü«}nš{F] ”"Ê¡ùV}Þ³å1è’9Ð|Ú¤ÿSm2ÛFÌýmŸË8æþA"pšŽˆ=± %:®Ý’ö‹<ÊÐÎ"¯´¹ NÅ=ñ¿·b¢ÖKt¸´m:5þZ,òRÐqû3·0ÉÔ­‘J —[’>DK‰!´üm# pú΂^“ð€ÐB}öÆÍo`Û–ßg EP¾2‰ñ+ÄsÚòb‚8Å©Žößý*†wQ@u%ìôuQÌóµ÷dnÿ€‡¨¶ nˆ¶ÿFõÌDÀÞ.¨ñŒšÂæTħì˜åŸ *ùÉLÞ~›é”¸Zµ»s¦8‰)s$€s|_ŶðUÁA3Ènkd§< ñ¡<9™1`?³n>;Ä‘þ/³-/«Ëó.åÎÝÃLL_Bƒ|óÈ`b¼0޾[«(Ð×0»G*Ûyo4#ì8¢¾)81ø‡ˆ¶cGdÜç‰ ŒúøBëCý;+ôõ=$ÄZè™Ýž”5|¡m鈦Ö>åÊÙgsW¯IØ®!I:RÖ¸ûÑÏȾ]TDÝ$ô’ø÷Ýæëüµ±h‰BŒ›¾óìÌ;ÞR¤ñÎÎ3JŸŠŒ;A½™ß"ÜÔr*Óƒ.€ ‰;Yçæl²Á¡ŒZ2„iZõ“ô k*?>ö‹«gïᦨ¸‚•Û.†b9ÏMÞƒùŽÕJMýœ†/…„âÈñ¥˜ò:|ÕbVʨ°Ùl¦ ™Ù" o Ø$=)ûÇ*)^ÙHo}W=RäRSôo¬›vÛœ±¤U`Ä\“k\pÎYÚˆªMñ·X{dvÎIáÑ[pR&îÔbr‚xgŽQ•é¥åŸÌÌY‹á¬ÀYî­¶n»ívÚŽºº´ÏÌÇ“¹•Òv{°Ë/°)ÿLÖNeë#y£uXOÞ9©s³†õ·è³,úe6N1^z®ù½$Ù.ß÷äÅŒ«Á¯Ê‡†P²cwë¶-s¤FûzS~+œyõრˆ-Ä»QWíF•÷Þ‹€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/type1/bchr.pfb0000664000175000017500000010406511742726711023263 0ustar uwabamiuwabami€Ô%!PS-AdobeFont-1.0 %%CreationDate: Fri Nov 2 19:00:13 1990 % Bitstream Type 1 Font Program % Copyright 1990 as an unpublished work by Bitstream Inc., Cambridge, MA. % All rights reserved. % Confidential and proprietary to Bitstream Inc. % U.S. GOVERNMENT RESTRICTED RIGHTS % This software typeface product is provided with RESTRICTED RIGHTS. Use, % duplication or disclosure by the Government is subject to restrictions % as set forth in the license agreement and in FAR 52.227-19 (c) (2) (May, 1987), % when applicable, or the applicable provisions of the DOD FAR supplement % 252.227-7013 subdivision (a) (15) (April, 1988) or subdivision (a) (17) % (April, 1988). Contractor/manufacturer is Bitstream Inc., % 215 First Street, Cambridge, MA 02142. % Bitstream is a registered trademark of Bitstream Inc. 11 dict begin /FontInfo 9 dict dup begin /version (2.0-1.0) readonly def /Notice (Copyright 1990 as an unpublished work by Bitstream Inc. All rights reserved. Confidential.) readonly def /FullName (Bitstream Charter) readonly def /FamilyName (Bitstream Charter) readonly def /Weight (Normal) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -109 def /UnderlineThickness 61 def end readonly def /FontName /CharterBT-Roman def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding StandardEncoding def /FontBBox {-161 -236 1193 963} readonly def /UniqueID 15530648 def currentdict end currentfile eexec €9€¢•@ƒŠA3ƒœ©Ò.+™ò¶v|Öu ¬ü²NÍ6s›¶I”Åg7 Lì’É”_ðt^÷ÿư©£¸Içé‡@ål Z÷‡UœÆ•j³3Ï…SÕ\ ŽõìkôbêÄ.s€Ê’®‚³Ö¼ò»]Vp”Ïâ}N¬–“èƒrÒX´~ 8vUŽ¿uz¼\Ýö+ÏÍ‚qòYƒ;¬yprìš0c¿s…à-ŒX¬ß³;Œ‡h²x±L‹ûËp5Á`iÝï–z3꣜ëiѦ3‹æù¤ˆ™”ôÕX‚åYCtë·V-gÌôn®äÑ©žV–CäÀ MÑc‰ÄÛ•ŠW×(üNR¾§>uŽã¹D/ÎŒŸ yP›¼¢^Et*ãRBB¦’·»¸h®tÙö#ùoÞžëª#.AöGÌg¢¾@¸ž&–‡v½spÅÚ•ËÅÄ~ Œý¢5@±áîY'hv Ž@~Ú¿‡®,5É>÷‚9?4KëÚ2îX{PÀJÃRúûhíÞn9’jÖ'QþÄ(_ü<Å9€E>טSÖ~Ùpƒ–Ú=¢ŒÑaxø<…v—ê5hªoBÈõºó;=¿LÍ÷½±]­: }ýgý®ÏÏçÀzpT¸î¦†­‹ B¿ÎôcgH2ÁBT͉e”FßôH}J2ýû,`Ôj0€racQZº~`,â6‚PûP‚Ã×@ç”ÅE0èk$ÖaèBf;¶½æTýeMP˜z  ê &¼˜c}¸³•‰ïξ!11“IütiØñÒ¾]§äig ºSm˜auÀ:§ç^4X,[»8ÜÜE›kÆY¢ê¹Ìåsx>¸¿Ï¸à/Ð÷Ãç;›dB¬"ù½Z“x?bQõ‹°-¾ê³þAÝw|BÆØÍ¥†x p-ì=™d‘¦õÇa3OëÆ­¿Ï6œ!¢Æ9±zçùlnGFbpó—ùtÛçeO0‰ÖÊÊìH¢Ø-÷sä·#U}®í ¸¹TÿëPD£¼–E…zü7Îw!òÊfC_¸Mí¿ ?/¯!‚}ÉXÅ[ÑÄ]Ìå¹^ lŽ…e KY’qÒo{–åFýÏš©Ž zìÂLˆÁÛ¿†SÉ%;ÇÙ&iX¶u￸ՠ̀cå«jièî™a†gÅß#9}Ëoùk$2fr< ˆ?ñ©ÆÒª`àzÒ†è(XÀ³³l&8Œqdð»‚U›J‘Ñxv‡T?åYK%c™Y|5!­=ûåoÞ“ülˆ/’•s»—Ÿ¿¯°ÂN% …N.§ªÃшKØtä 1é{µ·È:¬¦µ9Ô%† €“;&bÎ<‰ûtÁ¦ÙÙQV4ØšºÒ6vo|Dúšêp¢üƒŠ»"Nœ² aMŽ•IÇxˆ_¢ÝqDãÖÍòG\mÖõ^XœØpõVŠž¿ùùç yÄu®Ø‹&à85½'õ[Z’éâ”zoÉ=“Ó‘}iž^¸+¾Ù‹]wåK A ?0·¦ r ’|Q Ž|HÞý<, D)%mM+<ÿ-¡]®çló‘iæKoÔì¢'«ËŒÉÎÃ|`jUu:+Ev+"É`&ƒÀh”ªQ—³ gF+éºPkx;À•L©«€Fí <ÓººwŠ0ÂŒ³;ÀZãs²¸5É/:ÍèÊoº2•µýRïÉ‹wè¨kFÛæaÝzãUÀdÊYKqˆ \v¬R^:«à¨  ë*æxóæ_í²11&^'‹…áÃÏ7CëMê9Ñjý]¸^cþ¹&ËŽæT=¶¢ífŠ9í‹Osé4i‹Cïù¶Þv˜WL––Hx–éç„Kå ›¹¼ðú(à¼øZ)ù¸ŒÞVèÖ|+«7kœæþe¼ðÅÕÄ^ Äå¸-°Cy0ƒ¤jaaù©ŽkìYÆ7¼‡q’t’‰œ¿õ=³WÙ%‡ @È£>nþTTdm‘p¾s=\2í‹¿DƒŸx1jÓÏ,;;ßo³’a^H†$/SœÀÙeÿ|²¼OêÊó·x©÷A ÍG¼žSÁly{¼<]ð¸sóÉœ&‹\í¸À4÷Ù÷LòW†4x…•XÒÁ„XDÎuªVLârYý¹„…ƒíg²¦–Ÿ Ò•ýÜÞþ©LœG€Ó0Q‡ËŠVYo,© ñ;^ ,tGqÜró‘X½è¤È"{G¸ª¯z×ìÒ¤žÐœ#ˆ¦þÿO1]¹Œ™žD/6p©oD—mWë p Ihƒ×úžiJ‡EÙîºxͰäÞx 2“›‡ZÐÈWö˜onI@¶tÝ;DýçБºK§KðÓ›^¶ ¡Í€’û²©òy„h…ßùV®äfÁ¶4ZKaœV¥ÆšŒÓÞÎiRÇzZÏ`=óËRâ¶<HÍ÷;Yî±Û9 \6 K*ÿ)ŠLcÏ:˜ 8K‹ö‡•’HÂøÚi<½Ö<5‰O|y7+ÝsÞ·/d–gÜV“Cþ¢3‚ƒò¨»šbá”Àúø˜ÁÄÝU»ˆ"Û&l­3ƒÈó¼¢yo;&h”K‚¤ÿys˜Ã]:6wCãJ×W3¾t;&9ªœÓŸˆa*ÀѪfˆèývßÂŽ} › ¶ž ›kô.žý£,á)$KÀÒÖìªÏ”~8)âZ¸ä],Þyw—¡¹wÀ“÷ÅàæJYa?#èã!˜7yâa_È2}˜Ÿ„ùÐß¼ åûaÀ(©¤¹û9 VæmÀtv z båÔXåO%“·cmì”(1u0¿Q*Ýé^ ‹ÑÆŠ\Š ¯Â)½®çÌFáQú;*ãÇ­Ï<.‡½¸½/‡˜¡š4¦o¶9rÛË'öÖ$ÆÃef׿]y X: º.És.ˆnç@pâ‹¥—MgCÚSÞ2¿ðÄãDˆ_”L©Xq" +5.!É@cl,b+ûA§¢sOòE’|GòK+äçñÍõïçOÇØüY넞fkiÜ Ö!3 v³8—:ÕìGcÓï÷÷•…°Ö¿&µŠƒšiUj/QLj¢ìÁu_EHj ÄðÒXAß®ª+Cª× OèüMI¤ÖÆ“ýkPÍ#@ÅñÁãZ°ÖqSû™ã”z¥N xvTÎü*?ªdü¥Ì;'!o–Âcnûh,c‡ƒ{ˆ4¹Ä/(sÒTc;½$®VÔÚÅreÜÕiÆHuOºd†û j ~úü~3«¬Q£†üY•\¹C®ËŠè^ï‘a4]Hï…®ãŽîcë{zgÕsrµþ.sô3ÄùVùNý½kåªê¶ï¦ÍG°¾;±U,$åGL‘™B³CæÊS2–Dµn™%>Ðó”=wÇ{é,àR¼b&Ž„Ÿ¨³d)S9²p*ª‰f,\™1e$šÎ}¤ë8jaKW|+ô¦L  ô&½¤¾åVnèi8ÑsGèÿ‰mlü;Ö¼Œ…ÒÓI¶Ïx³¨‰Âsö2–›ü³¹mg!2ËEž%àò†àJ¼Z¢¡$(sßIl¥¹¤5‚jM²Z1¬ÕŒ¾q/ZWiÙNC—œì5¡æœa° '¾§Ÿ{|zQ`êê7¨6i‘ŽbW§Ü R²7)_-…%IŸ·ÑHc’_îÆI$—ºÙehOòaÙbDx×ù'÷^Ö´z'\¨îÝE%Ös"XG‡”XUéÌŸ[~„"*3‚zóÒã1ôßÁš¶êÏó~4Ó4‘؇EÛðîÉ13Ë¡â ÈZ"öÓÔh»ÔãØ,ÎEY V#ˆgŸ^ÿJòòö¾¾&ìaMO±Vž‘åô­€ZâCÝ üs׺HÏtÙõÔÃ÷¥ùiÒEîÚyó[ÇpÛp#bï&1%Ò¦ŠÑ-VvŒ´ˆ¯Ž!/Ύ“š+—Ð ^õ æ‚¼¡âø@Ö“–K•g‚V»„»jƒª¶¾&^mÝußlÄCqa|¶ŠcôìæGÐz+®W¦“K½bØæKÕלŒ2†ýÏ)z׫œÅ0õcn·»÷À e™€ôyظ ILÛ éO?œÊâÜ ~ÂYØf ô°¢¡™Osev#÷PÅRâÁï¶€?™Y ‘_ómð2ã^ÍÄg¹o÷ò¢PsÿyŸÞæU–¤ò{3YpŘ%ž«–böMô¼°´)Ü$ÃÎç©b ®‹x,À –Ap¸Å‰eKa6’&sCÌÃi7>"-èÚ/–œŒWn€9ý(%ˆêÓ< ù¯x_7)$1,/®û6½éä“âUjÅN|½Y®ëž¾Ùm&‹L>³YÅ¿!ÂvÈœ2½Â ñR©hIRéq¨2*ß³ ¸À„R[=Üúô1›¥U)¿eß­ЉSÊeX¶ç‘èuë%÷üè‹“,!>@ß¼é×йQÛïd);_¿S!z¦…Q]µ$ùU¥jÑ´ÓŸ~æ·l‚µÿ¢v”¯!¯Xç2ø—àÎ#=±ÂÒë¶`þÊGÌ+ !Ë?~#€¯o‰þ–W‚[´îîd±º"JðŠ%¶ŒÜ¡ó!UqZ²ð>5òÔ™ Ï™ñ)•ñ _ÞÍòȲã7 c¯ÀïV~ðrn¥¬ñJ‹ôù\å7êzPÐ(¥ äÜЃWÖOõ=‚ƒ5ð=(ÔÞßL!Úë -?ÂÀ8Ÿ89ÌèºÍ»d^|k£h}OQi(û¾ÜeKÅB‰âŸ$Þõ/$QH|:»'P †$0 ÛÞ@Z/“.<~z°™jœ1>Ä×ï‘·Õ“"VQc¶ªqÞ"ÌJI¾ç[2L¿ƒ-lË.Ù³ú´ªï^ª~ÉqX§É‹@[ižÉT¸) „¸[IKI²ä‰T‘š•»Êеô ‚ù‹÷-O¥5@û£o“¦ò¦åìåh 5ÆÛã¹Í6S[K³Š\}º‘?­Nâp ˆ³9E¥6p‹&Ñõãe „Ž[>˜ñäUå.¯ôSWFi„ågëàêýL×Ë!ð/ ¯_@Ú/j6P¬‚rªÉνá=JY?(ãNꥷٖýò~ã*B&Ç’ ʪÂO.Bâ‡HuDšBù” …çÞŽ/îÔsV#kfÇH¢ôà–d¶fÉ®dãeǪײO f6Øò)8˜-¢ Í£E]4îa#ͿҾìÄÀÄâɸëNÈäÛ(3L6m¢vJþÂJaÜ%ÄŽ¨ƒú¨U9AMw€àÊ;èP O°z q#äT0àþ7Vi°‹h)®bùƒ¿^ʃ¾FÙ‹ÿ…Ö0Ñg[8f¬Y‹²µÚƒG‚Pâ'û kDU‡ïë!”dšy“‰>÷… „x´P¹\Ë2JQ…<†×(µ«0º:á*Ó›0x2B<ïF$Ê&â ò¸Ì0®ù[`ÿۥȷJ„,ˆ<ØÂú{jCKy‡/NƦì¡Wx7æGÞÃ2ø=h ƒ'¹KD–v¸WÂעܩ³'Œˆq»Ì ÊʆtpÓÙÂ)ªº†¸ô2B·òÏVÔ-§É\£G2C´í ,md…˜ré£.”±¶fø .Õù¸¯Mr…äZ^c(  Ú‘®oTïrƒéf™µ£ÛpuðüZ⇿é†×‚¼ß}Ö#Ü(ÿ¡›µßÓfsÓŦ]sÚ†Ã_ ÿDuႎ“cMj0oíÝ9Ñ*Ióždâ–øV-¯V`2=ŠÜÃ#Vˆn‚¸Ñ[Ÿ2BÑZ.¯GR™›ƒ ’?ÉwW“x-RØñäÑËõ¬Vô°Rmp”ãÓb#«íÝÃñã|Ñ[ o^µbú”ÑH:z¤ÑžÁ†¬ÿ›nÇÆ¢nY?ל¾û{Ð"ݵ¸ún:.§Õå%šsL¾"RŸn^mDáêÛæ ºŽ_™}Í»c,úáQ(i,”c D.+ñHµdeÑ”Õ(4ć|0Ë¥~ñ¹Nz“ª\q¯èTfÞ'>=WÄ>dqœgF¤Ý9ž4/"ö_­þÕ7£wa_ÄÜ="Àe ׃oÖ‰Dð÷™áÄOz}Ú“1Ç(€Önµ[Šƒ> àPͶÃÔÞ…×Ðæ³/Îê¤ïqüiSPçÐá3†]_‹ÀèEÜéà?™Ì ËÕ[ÜÐnªÔ;dÈÙé¢OŠ{dH¢,àRßÙ¾ý—ø6bŒ~¡gì=|vCùTgG\p ’Á¥œôÐ_ joîÆÀé«£Pé¶Ö™ÛÞýw2£³uÛþß!heÔ‰&ê÷”?õ.*áF¡‘Œ‹i0üèDzŠ$™¬%ÊŸ:]œ„êþN‹éz%MüÀ]å¨4X5æUás² Ébò…¹ÆŠæ?CÙÐt®ØÄ0FˆŠÈS›0êH”§Ý\ÍëC˜ÇåR¿=áî-—žàdÛEŒ?ÔP9}!]xžê²cúù%Ýí)Ý£Oz¢¿)p3Ö˜Vr³“Ø)NÉ|âíµi`«ÌÎpC[™˜@ ×clâÔ¯9‹ÚÿLz)é^ã»éŠáfÈGçÏÁzÖõsôÑÓMrŠìu¢ÎS4Á-Õø*æÅª”^»î[õ~Ãéúàоí¸'m5èœæ¿4­eHÐòóÕ©nI ,iŠÑá¶]+±ÇÀÌø³ø@­µå«±ø»Šª¡×F>Öœ¯/”P'Û,*¤ÆýÒ{sùñ3»-[å8RëO¡¥‘t¦ÎlÄý_À%®÷Åù°3~‘Ep¢Œ}Y"yx ï4¯}´ÙFd–ÞåØ eIhW½dóWWÖ§s€o+:yx ôÌÜâX M¡_A,®§~ЊGüDT¨ÿ]tü2¦\¦ýÏg˜>ƒ,ˆ&ÂÛ¶þ†"òò|cãdJ>€›àâßÑØ6­£`@vÓ»å‹>3\WGíS 7L´ZÕâð±‡ÆìrlÈ'¶lÓ2ÝTP ¢dßþnQÀç ÚÍ«T‘‘©KJ»°%¾ÿ[´G¯¿œÓͬ$[*SR™mËïœîa!@œÑ/'Ùáª-šO–û |ý¼èøeÏêällÑC ÄûÀÖD êl"!cd sLñÊë”]&7º¢Ñ„š¥ `øiQ«f$n†Q9.s®ù’dq4‹­ðS/õÆÜÛ²Yˆ]¨3™óö— ã>º[lÌ­¹'"¨¶£8NŠú3¬1°vZÏ@É*"€k¦¼¾M9Æò<ô…|$F•,#/NOb zž'™1Xè/;Ñyï4TŽƒï;(Γt¤ó³Úò @ ™_Bå8i}|j÷ùƒ¥"N–DôÍ*•ày—›4àñ¸¯Wï}ñFäéÍZù‘àþµ‰MgŠLÞ·aúë®Ù‡â´¨ $r¶úaÎÎð“có1Å,q*mÖ%ÕÎVõ&êñ[*ê6HÅ]zkR<–ë1Äç‰æ5>´ÄýbúX®cPvOƒ†2ð¿¡Ûs'/ IFrãÈTÁÿ…,…ô/O ô‹ÚE@„ÆqGäCÔóéñ‡Â¶ó?WæŲmÊ_yð}$©ÈmÌu–ç ÿ[ <4K[?qy_3êЈ~Øf;Ÿxì ir#|™#Û0È^å¤Wi™7÷1Vy«'%è=yzþ`Ž»OÒPü—½%ŒùáNXU.tó!Áwa{:‘ð‡ø‘š¶=p\öïçü-PæZí¹2Âßp!÷¬Y(¦vs¦œЋW:c2à Í–®Ê@ÎOlh`¸AÛ¬Í(Ëÿ¿ a?c-t“x?¦50“ @6»¤вAHhnÁ–V}§Êa-€çã70¨e¡Ç#™ D››Ùw‡Nf\ —|ݼ!bðþÜ;…ŽïtÓ=TòõìùÚÖ ¨Ñ™¢hª6¶-´s%÷xù&áôÆX"*?€·zd€éuÕb*Ñ©&Œ¤0|ÙÑk8Ú%ŠÚŒ½ÁJ;¾¶ûràgœDT¬Ù¾aÐú8¡€.ávëlž®²¦ŒŠ«˜aÃwåx ã7t6«bqûä|·ôtê––s8»¢ß´¤Zñ[wà7²vÁ߯¦¢‘ ¼¼ EoÆjˆ#ñžÃu€sd“Z¥Sé …¥‹MÙl`3”~¦ˆ¨ s˜üŒ^&Gq»è¥É&«¹ÖKÙ÷ Öð’¯mmFÄ¿™C†¯uqŸ­_JZÆ@3U/¸O´z£r2^‘o®;0tÅ0ÞB O~sÁEvÆI€ËO®³E}[ý¢hâÅU¹u*|l£C'OŒ9W©ÜS§ÒðN„ŒT¤S¯µÌ$utTaÎJ+2À*3´_‰w‹6=/Aö¶A }VršQ«üš âį)éd¥øÞ܈˜ÂPêé 2FP4ƒÌ?2í´(¤|"Ù)B+ƒ'˜ÏÞÍ÷uFá?•¢È¤€3ÜéàÃå Ã&tÀ\äËå/¯ÛAT©%^ Z˜ª·à"øxFv×¶±Nk·?I—é)½ö" ÏHÊ23bvœ·#e«S]Æõ)iG¥¤9§®¤”l)_rñçÿTÑFǯTn®‡Æâú&ûw¨„‰#“96T\çȺaOb¿WéÌŸ[~„i—ÀZŠA‹ƒ½å¿ðÕB¹4Q¶¬UÖË•Ø|/q`k$Q;vcÝ4T 2ãêšù³‚j¬öäqbXn»ðã#…“±1Ñþä$b½9”äTÛr!ø}L£Š iž„Ê#ûP•ù aÒjû(cLh‘õÀˆî]À‚ö¾äÌeç˜P_v"l—¹óŽÎv×,OÛ¡a? œ§)´¿W¤Iׯ»‡ bÅë±t.}b/JŠW}Àõ¡Ôo10ÆøàRâ–o15šâjjWçfÿ§#€ýH΢‚©=r?9+ÄúÞÞ_´jR ýÚÀ«-VU¹º iö&4+1*¼˜ªÄPÅ4ˆty|•‡¤‹Ruw£üÅv\B?`÷‰¿ît/á*¼¢«K4RÚô— /“ž‘uïy4³ÕÞbÊAbZ0 )ZÀ ]4`ÚÑM Ù ž•ò7ŸqÓicLN}™‡{JP6æŠìn#çÂkR »L~Ô¦˜¬å÷õ°qõC"fŒÿX^ Ñý¯Wá…<eõ' ÄDðj})§Ù$shäòÑ ½z/p‡X7îÞ̉Å.½ª½ëð`zÄÕïz8ŠíÒzù•ÒC[âUãnÛû*Ä‘ÿñÅ õ¤ýÑ !Ê‹sG£ø¦Ñš»…,Vn”N²O‚#ªÈö}† ;¹ëÉD‹‹™Õd%Iìæo”ž5 Ó¡©€]~º4)Ûœ¥”ÛˆÉaEÑFK ZË?ëq肈Ø^:#hc]‹MX¤Ÿ¹e²Å,z£3fƒgqÓ†.ÇñÂ): ®^ªœ¹1Ê‚¥Úyׯá{Ñÿ ^°p)§|h’fÕ—?XwHF8¥o_ÓA`+MJlAø Ìæ™ž©)Üå¸Vëë ÖCÖXlîò¾)ÎA ôm 7• “.-ÄrÊнܜ–KsÚtÙ­¸9Ô1î— ï¶ 8ø%ê¿RO»VÖg·1•­v™~а%d9 Q뀙4.Á $0¡Bçui ’Þ•<Ìõ¶[Ôœé!C÷E¬J ¿¥²/†¨ÅRWnžna¤h@\©"¨Wƒv÷ˆÄ›6íí1åZ´9u+¡•ðXݰ<~—ÛàoÂKÄ¹šŒ± †çs dÀ]8ðDz›k±\8¤Ø{¼˜ i‰Ç윳ÍüXãwbFËJMp l&ói„íbG€uâYë„uÈÖ Èk #%]ÎM#‡mÑ(L¸åXf+…÷p¦ß6ôűbî~¦¯ºÜƒSuí:ØbÍúœöˆt†@Ÿ$ÀÉû„1¶%ácy6Åo&mR$üAH½®PßI‚±‹õQY óXžlthíLôÝÒü2'Ð’gm£È‚ ³ÌèU±¥hjõÒõæV#'§§)JB_ ÿ¢`fÏ€DqQÖÔ3ž”g8Å8ƒÏ4g†Am@jÛ<áÝûÜpîÓ¯d­ö‹™DWË”Žáó2J>ÉKG j‚A lt`•¸¶r6ª*S\Ý1u*BD,Á£jYæà`¯º!ÌW—âƒmëL¿^ô^„ε¿AîãM„·¥ÉÕw¦Ø'âðãŸ%ñ…O\éf“¨ÂÏ2}ÄÛóüDm±¾*ßYU•ýzîtŽÜömÜ Ovþ ˜Å$òôûõëÁP—!Neýµµ‘ñ¦`]JçÞtáT‰ Í¡©Ú›‡åŒÈÞå¸x·…0µ‘KýÀØèȦ§Æ¿q•s‹}3[rO*2‚¼7‹6þ~Wã©Ð ªö³ŸÞËáéǯ!Ú~9käj©b/ À+¿&M‘˜l=·ivèCP˜¶Õ©t¼ìñ‡fOÏT· ÿ¿ë­¨Òan¸bp¿æž,˃ü‘£j4Äœo+8”€²ÖjX´'eV'~–8©rÕ1õÖ06Yû'χ§ŽÛa1örŒçß­/û6f½£=ÊB²VóÙü€Ï…ãø;O@‘¯XǨ{ñ¸ïÒ–j-„ŠkSÈÓd 3ªð³¡i]©ÞŒßSÇvbkÒh;Á^7“Âè åÙ뜿zùØmç0÷«mQóÔŒh+ä|¨[V]mNyéz[6wÜdÐL蜫ËYÐðÜ×øê‹öo$’»Þ{ùÌ7m¼Ò$0E®áÝ6ܘCg½—ýãàúw«ëMûº®u…§~ÝG8ߺ¯r—`s£ý÷&šaöN‹ËKH†*Èé-gÿütÛÐ'sôÁ 4QåŠî0c/òí,¹,xð¦sVT ´ð§ð­-Ý­L¤p>±øÈˆ:ñë£F=¯i³2*NP™,É%$uVÏ^¬3cô¶(sq³«;‘Êò"˜¥²P0(pyá3?è5&‹«­ I*±¤A[õø–»ÒU_W“ÅQj¬ggs_×8Tþ­÷¶m¨7î˜ä¹gõ$º¢,ÔÎËë;ˆP|µ¨³=2×Yë!GéògŸÕ€ÍËz›²g€u|{.ºÉ_r‘Ÿ…+:ã{3ªj$l;¸a§HÆ[Õ–X @ÉeEäI‹Ö‰•½Z çDzöÒ€vâÝOÁ­X¢;'ÍëEI±0!:Cv¨`v¯$§{>EË“‹ŽÑ…ÿ)í‹O8f«¬M“1s „{c\sðjÊÖ¶ªî=]‚*\kµ S€f{;o ø»Á.%½çìä?¢Ù P혫™1ýë~\¬?Œi¯19®“^³îKtËâfA Ï4ÜLÔSOÜ»ëÁ@bô„Þ¤`šƒ"œU² èJ—qBº¼E­-È•¦À=ÀfÍ”hì·¦ÌørjN‚þ>˜ñ½Ï2Ãe¥jX@ŽYà…·W•mý™&›_\åøÕ´õìûgáCA#š, `´~(MèðXþbNÛÔ-/›Äª=u íS{ÑQ3e{~D‰Í uÏ/ÉEšô·'ݻݠ‘'ToqúNô·j·Ç„c)-j œ`c •µÅß\UZãÝ-µqäç%×›Cj­4™Os)˜õC±g·Bõóþè§9ë>ach…Ã÷ºci€ëœX#Æ$ÂàËU‘áÏ1ŠÉ­Ö kÕAŽg{ÿ ³ã´yèwb‰EJ‰]î¯ê¾™o1óºêËÞ‡d°{†¶ßCÇ\À¾hÎ.PO Ý,ö¬xµÚÏu‰ÌÌ—èoCBî?l´É8½Èy½|ƒ ®Ø(þÖÕò—Ú\>wä X•C\§¬o^hs ~ä(>mªå`½(kgŠFŒËùÈ苸nÜÈS.ɘæe›f™ˆÎ!|.{ËC'¬‰0?0¼'¤ªºVlñ¨$=îœÕ8޾QÎýÔÜ<=“›ñfÓg;%ȭŪ{èT9pä‘ǃo§½Ã›®¨¡QóD“ª6;jCD»qÖRû7&‹zXØì¦õúïsE¨ÿaþÞ­zlƒöÚVqi•`^ö(B[%eY‘‡@LÉh=È‚¼Ñ½mZìýƒ´ï ¡YP<ߘÆ÷-œ=o<¼Ë—PÒ¦ol[%Jmƒ>ïåÐÙv]c{0ïÇJm/vþ­ZQa2I/û(á¾~â¦)ÃÓz äƒ1Úãê®x± wüŸ†~àõDŽ•¿¦/|Á›[ ¬<ãÈ|!‡¸U@ õªhLŸ•ƒÍT#º“?¬¤W ÿLEbIÒúºÐö5Fµ ¦Á.‰Û§ñÿêJÙ¸Háù¿6ÎLóÇðy…o ÐDÐŧ Â?Èr÷¬pt‹ß›õí"‚wr®Ö͈4/áä}¢=«ovÇÚȇ÷]Œó–4î® 5*š®*ŒSÿ —~¡Yžú‰»M® B°˜Ì¤¼…qäî_½d‚päÁžûºÒ­õ-Å!j`³ˆ¸fø@û;q…h;’™l?_Åm½¿>äL>÷ÆÝÆìRÅ™`Õ8ÎU—m¬ÒËHZ2›ÏbÌô#Uù´ø ñ4k˜Î |É6pPÚ"é#31­?Õ¥ï‚ÒdÎýžòÀzL˜ ÛA¥éœÙ0uz„X±‚aC·—mm]*‚É´–áä+Û[Ãj*TR:QeoرlHoÑI_–B`mâ b>®!hbG8¾Ú9Xô#ð+LÛªPlèk¼V‚'Ò*¹,ÓoÊÃ%nqRéÈ·ôœ ?•Ú ÿáÌ13I*)¾ÿ3àlÜ5e8òË:ºs4ÈÖ0‡/ŽQ¹ñêuÏú<òGFª¯ÅCäüÝœ ârß&À@ Þì—Ã×Ï9_ÿ!âWCBy‚xóÄ@ÎJs2xþ äs›ë­à¦+¸ vÇ=Øû¢v£&Í"ÔQÏÜžÕênkpS3]àƒÅct?ŽÏ)+¤ŸñCäþVµÑò»Áh—3+K°Í/œ¼Ê€“ì›I´¥é&Ùs™<ÖÀÞ¤ÊIum¥o™»”é¹X9$™Cšw°‡%Ø‘ï*óVUË¥(“¬9Sfy'Öj7Q³˜œ@CÆå0V´’¬Ã×ä@Ú)¹KæÜDòkD3 ѱ‘—Gá‘ *–Ö+3yÚD £(2(Šyw‚X+qåŽqT¾ qA‹”S—@ó²ù ¶#lŽ•ç$ÇX±³eœUå(†Óq·#Iî·ðŒŽÁ ,a:jò4ŒÀfª<¨‚Øp…9*Ôôs± ’øEqi‚™Í¼Ï¾õ:pЇoŸØnh×0ÊpˆÙU:ñå^ð-ØÖz«!”»63…‡bl@Á&ÐëÅT™±òÌœèÓô`zÝaºp‰öÓï+3 nëZ¶×Eóü}Æ/w¯ ¬å c =ïí~dG¹„™aäGP»IùÀ¹8MQ¸Q÷b…I$"å¨uë¹Už¼7+ŒÖœ8äG½†òà/0f ³ÇXH¦=«‘ÆW}'„£ îýIÉ#È9AKîdÔîÙ€˜ó2üÃ~yÐùÂÓ,5†š›Ȧ?HÖ½"îÅŸÊÝY‹ºP ê)ä[ ¢PÛöžÊq> ÖðY·(`({/ÛLyD>3ÓUMXÄ¡çö0ÞÇ3Aå˾`y•Óbá¯$péA¬>ó p2ˆ‚ÚDx¢7:ipotwåw Ñ(2˜aJÛÞ4´ƒ¸Ÿsαö¼=;?z›—‡3˜òaÉ’*¨ÝúÒˆãÍ­2ÙPè¿uk(¡0.ÌÿÑ:P ^®bîàú'Î ŠÊƃYÃÅ-ªÛÖŒýf«^¨'²|Uh¾š%¬eÎü…)%¯<%V€ü‚K ÀƒŒªÐ–açàÇ»ìGö¿$´"}T¢Œ†÷ÝCëUÊúpz_Þ©Ýã‡FÏlVü(q˜ayeo`ûãħœýnè~¬g&ýç$­Ÿz±QX¿ñ'ûƒœ3 *¹Ä9"fMFocWp -b±íPj'µCçd“†0¢QüÀ|IŒ™=ˆ–n+ë. Åí`²Yn\Öö´I?0KUÉ‚‡¢§ ZóŸèîé³nè¾€8Mk”åÀý3æQþS6â@ÖE”üöÓ·T){ÞªCÓLFBü6ˆ²€z|8cøPº¯¨š¥Œâ_ûgѼŸï§J·lxÒ(ÿxrÇ–yÑ,Aˆ¬Lº’ó•´×±±Ðš-+yÚ®ŸçæYŒ¥¾ÆHÅ:Ýkx¡œ¬®j7Œ2ó; ÁƒX·fkEˆæçÅó‘õÆ›»D¼ï×Àe²¸"k˜¨9‚sSòý«|vøÐJp†V•Rkºyi ~Tž´!(Ø7Ð.z~”W¡aÇ=ÄùÃç~‚öw«5ó~Ÿh®8ŽâÇùŠTÚ§7áhÚw»r¡Ðì÷:î‰Å^Ug:ÂQjšÎ¶)M¿žEø(Uk¨è ?&ÐF”U8½æf)¢0¾–„¾Üöªî'îà—g üÜR’Òi’뎾¾…î&¡‡˜„&­Í_|)v \íËcÄߨ *üIš)¢ç'u88éÇn·hçwƸá.bÕ{oªÈ¼êC,¯ ¸b”’ìÆ.Ö¯©Ö32oâk¤£³‹zèÖìnÝ­Š»¿±æ/hŸMdõÄ·ˆø^zÎñ ©“ÓÞÏA ™vÐԜ݀…úxhÛ)P&²Oñ¯ îP©™²ÚXˆÍõÒ«hhü:×6ŽþÄ€úæl¾õaU½ÌrÙÞìÇý],Ûwdžœ­?M8D‘…ßÝÔ"n¸Ÿ›ù±<ŽyâЄý+zø¶¹›;ÏÛ!hi}†»Ù%gIûåºiéëK *ë;o;.Q‡ëøHÁÄW…õÌ_i^VŠFJPmäpY¿«÷ XFœï¹‘•tô¡œ¶§¢xKû¼÷“˜9tË>`ª©§*v÷Ø8N¦¬\ñ`ºÆDÀÀ®ÅÑc˜CÐŒœ…Ÿ{'ˆx•Et”µ÷GQÐ?ΞùÅ0? …þ–Zç<™Ãó±U&«•ôÔN<†b246ó·¬PÉAÒ¢Q UÕí=¨ º=ﳂ+,?b ´f2Ь@¥v- T,>Å øûðæ¼Ýc•øçvÖ×W'þ50•>22Ø<ÑÿÖû§5|p Õ:²7Ê+Ÿriv™¡s«â€)¯#p¨Ãa ¿yuT²Ó´xÇ») £#ßê¿Ú‚:ÂmqÙ:LàW€ Åù•‘~Z®cFV7!½f¥9Á­Hê„Ëþüû?‡»²«]…Èìœô(Þ‹l}VtÁ>½Û¢;Ìr—â8‹´‰”gQÂr û&HlÁµ³¤.è™9ØI À;­LjÚp¥øâ9ó½ O /œÕTAçòœWüÑ$/Zeù¤–-oçHÆœý7÷%ãá^ίüj3’~_òö¡92Ôù\Ë™t3•„«‡»—:8Ý0ÒÃú$umTx‡'$JàÈ™oEHäëEu°Ê¤Rdd¥5;À!; »FÅ&ùCVOzV¹½2Z²3ä×Â(!ì_*ð&¤ý‡ôú5-ÝÉ1³ˆÆ|ñ•ÎX×Û‚\Ç#h,ü—\ÀJµÑ—™jÃ8üùMê,W@w¸½)ÌRsÕÓ¹Ùa£ð8Jٳوa  "4}Íõ¦éÅM¡±¤–œ­¨7ÕÇbƒž-OW‰r†ž!?ŸäN‰Ïí»ˆW‡@’,+bÐ!׋ÃìÚÀ¾“9Jl›ù#•+ôƒÈÏ̯šâó¶i3…âD³›V­vކ¢%op¢Å<¥ñüâ¬$¼7YÑ”îœl©Ÿ|‡¨ûz÷i^¤*gטN”¹|æu±ZRÙH„_œ ™Sîñ.¾Æƒ½6~A®œ¢—„x;dç%)ó%ÑïÛp™jWâ?g"Žbà)F¡  XpŒÿúŒúì1 \j­{‰§$ùû÷Vߘ y‚à´1m ðŽ3J›QŠÓ¶i8úqáÃIH;PGõ §ê½-¡§mthkBÍIA£ÆòõÃr>Hmbñ>ªW7Á‰nšnW9 Ågñ»B½ŸÎHm»®;™_¢ñûå.r™à5Â$¥/¬çЛ´ ¨,DÆéÝÓ0LÈÅ[ G{ç©:"gP­xîF(I¢Iî0RØ­ÍÒ^ÒÇÇøƒáÕy™0g”@÷-Ó¹¨1W¤`ºÊý}{ßA0¥îhϦ í{I3méÝš²Ñ-è`²+“[ëë~•¢gajƨ®æ\QRž‡’`i$?«ÕÓ5i?NNñ߉ÌêrîüœÞshÀü/w 2/Ö#•uuðÛUœÌZd׃Ja¼V¯P­DÖñ™à ,°ÑZÜi,g¦ÔoîÆA±DxÀ‚¤¿?l˜œÇ„Í_´YáùÖ¯žYÖ>}ÝË„}ŘD©¦›õƒÂ¶¼ó8A«ÆS9ZT`u †B3ëK÷v‚Þ¯“•~ÐG(íßß}`¨Јf6\«ÓWé¡A1/С:.µjðÀ"ñ ÝXW‡(O‡Uâ1mJ!?§¾Ë¼W3Ž1? /R@ë¡ EuËê¦Fr‹Ý}:¤ï»-©*ùTé0æËR‰I ¿\É+£g{sÛy±°9Ë`ÁA¹AJa·Т]´3O|ò/šæKˆ’ÄHkpiT®™€mEM(Î,K Ÿ,÷Ñ÷‰âZ’A")@íy»#ÀçgêÑ o[,U0‰Ô ¶‚)û/»D#•Nt!ê$l—µõ‘ä¯Ö±i³eô:|£¸5kÑä_»9eÝ®"956zÀçx›‡:ÁÞõX.¬Ý¹ в$´ÖíìWeÓ˜=Óé>@]=% »þ®‰IÑ¿…‰Q°h@¦.ª0¤ƒO(í±.ÏAö¶áÙ>"ú¶±©Oùø%²Ø¦×>Ça«“ÜAµ9u™AbÍݺ԰wö,¦ØcnCÑEĦ ÁÜ„­¤é£"úŽ©œ‡ÅÎñ<ÞÉ÷…Y»àØ¡éÎ:'5Ž­=»ñ¬­ütF¸I›ßpBþ:Q»LÙÀöFãfåpgä•öÔà8Õ¨)ݵ ìL‚í¥º€Ç?PÜÂxy˜U3;‡#;O|X½RµxYG1ÕÆÒÍcKœMTØ9ÆWú¢\¬ž Ô® ‡œšuTZàã®óÎS‰5ÔÓˆ¦4FcûÍ-ñ¸ {†ac2Ñ(WÁ\Õ炊Tº‹Ú~F.ߘZÅCŠ1ÇÅ`m3g>Aä5Geh"–¯Ì&¸#œ¨\šAk¥ÃX²ÛK„?ýCâV€yͬþ x¼(²ðÍX~«ÂÆ-ôr?#®’&úÇf™4Ž›¢Þ´Y¹´…·`°ÓNñµyܼ¯ œ›Ð_ÅÉMò2©â@•Ѳ”¯ ÉŸné+”ðÀê åk7…19º÷û–BõÎ0àÎ'œ•PM}À¼*•mÙÓ¸¢â†5Qð¶Áœ42¸Þ¶y·Zb½o‡AþüQßÊÍ:»³“Æ oÒR#½ ÙB&o,Ño&š¸ŽxY¬Êòa‘"Y‡W_^ Ù@Ùg{ÞŒBR3§º‰mЫö¹E1;£EOŸ·ò”¾þžšÊlnÁ$Pë  $ïHê&ÀP _RÓ˜ >4°N){>×Q¤g(wµð¹G~o#@¶:–ü*óð)FºWÐÇjTSWò¡&~˱ý¼»»¸t,b>äYt WqòÛm¿ežÌ/<²ájwü)‘—E[š¶…=9=™§ÕÒÌkuv¾ÐNg^a0;öðÏðo„”°Šƒv·7œ)mv]#!ׂò£t<‘‹¦k?ËÀD|k†‚o³jºÒÃ%àÔ‹qi››ÛIÏjLI^®Ö vñœ`2¢œüI)6÷›“îlËðåwKÚ—WÙŒqÚ\M ƒ\E,²&¥4ß@“ÎJåq¥ßDÀW}¢\«ºª‰#˶+r­­u½æØev ñIç…[7rÙ ï¹’ßltlpÐ;T`δßTY´åFð?½šÕlYáf וWFƒ~‘TzN ½€ÕñC‚,<"<ýß"‹”UwZíkD.ÍÉ;þH@^.â8/Ns:³¶b~§µÎ×–IŠ‹¹žm„øMT ³óyœKþ¥9’ƒÂnAtNÔÄ8vÎPn^ÿIÁ-€;Â:œ™#±'º]~ç[Þë/T ”yÖÆK\›_¯GJzAކô{Û°½õMPQ‰x\§ÖRªÈ,!É—„ÕÝ›~»’ßò}—#}‘Ÿ™^ÉîXPyްF)øbR_–0='b±”QˆÙóÎŽHF݈À^ÀùÇ)B–y"ò¦ÎôÇ¢¢¬-÷J@•p!-§%€QÁs­1ÁÞ‹ô©!üž¹VfÎ7^›â«63Iá%a·å@²©²CâYƒû'I6'wŠ<œì—î­»Ÿ#bu); ª¼ok@[ü¬©ï·BÜý“ÒðoÈëasüV%ó1ëê$û‘÷—\BKd—-”&¼SÒj¥©¹LKà»<ðC/‚˜&;ºV=¼¶ÛUèüh:V!ÔÞ‹=<æ-ýÇaÿiz”Hh kÔáÚÔÕ`‚SìO sÃóÚsSV5ôˆƒæ1§Ø#‹¸] öƒœrø=ÌüX½Üúº,*[c®öž•;j‘[¦µŽ=«ƒåpœ mm ‰\RN®#O—Ua5ûr4Ùþ‹šQçÚ¾!g3È<îs`6I=xljϡžË°hÎáh[ñåÒ*/Óx?š <î’¤þÐÐ^$s—¤IÈH–¾•ŸRßÐÆb ‚°G³M#y¶ø³h]¤õó…bwü)„²\¬y‡ »ŸþºÄ™Þf Àj܇ZC”hõàÁ{ Î"BÓµÙ0¹·¯ÄΉ²²l€)b×M´»7¹'ÂBòÑØNti¼é:J‰­JÜNšýˆ2Êø´óñËÚ ‘—û 5hÖ\ñìŽ}ÖÇö”–˧6ˆØÆ›–ÁIseá\y!Æt±ŽHME˜%Êç®ožò:9O`¦EÈbM=˜Ÿ>ö¼*\óðíÊû?÷(¶“ãž/hî\4h1þ’<Ñt¬®ç9&ÌìƒúCäÉ£û ÷ 8uª×£’!ÀsYRf7°’m?@BfG*,{6V×,Oؽ þ³×I²?xpZJ¬ˆ)ëÛè÷ õI$)uts‚¯/²¨@§Wæ@D¶7‡*‹ )uƒ88 sA°Gˆ“Ø)í×õhçmµÙâ·~f1­1˜ùT#ˆCc¡ù&£"2ç‹`ì+TùÉ Î4^,\îÏM÷Àkb•k²¯£q¼ ìü Ñf¡¡Z\šA°Oìt\pߤ̯€àxOðË” ‘ª'(±óJ½˜9û¦å×<6¤¥ò9%*Oè¶•‹ß|]NÛ gÄ󸕉[Þ媀tnùPðÇ…¾wen Ì“¼äÕ5¡‹ Î슽«yŠz1j†S›4'O¦îY4ì ô1–¢NC½bëã1ÎsòžSê*ùobùÃKAU¿a0Âño¶ðεˮ1¢ë—„ÓÊÉÛ3W‰Ët£ GP¥eXázBÅ ™ð@V*œ(ünê„íÚ_³â<š(öZ³–.áj  czöŒQ¼¨'F >Ú[¾Ã›„8Ørd÷£ô"½<ÀmwÌXw*¸!‹Ù¼ äC˜2YjãŽv—bûŒ Ö-h 2î 뻚-^§£Áýñp"¦98Ô¾šùÕð¤H€ÀìÞPÜ句¡úWæ$6°ŸtPæ+PgG$YÆ.†«àxo¾ôËñ¯0Dœs!¿¦ã †ß-¢Ôuƒ7 $ÚØ‚uìJæ‚ÿDÇî·žþ3SÈä„b}m¤WœGe×±Ù…^?±ÇâF;?¯ƒd˜Å1K·¥.‚û‹³ÿÀÒwoÛ6¹ä ›á›Æq–‰Äþ$%s!|~@R´ýê*8ü<‡ÄÊ|/sìüÝ¢å îW¿øb­Å;²•ÿ9åä.ö˦&á»-©ñŠ„–âô (,;Û#x ÷]G£>EÌvêu’)» >4nVð§öÍ¢l_ızš.•r€³ÌÀ—¿käŒM0Â_9Ø'‹2ƒ·¢z>ÍÃJm;‹c×^~i»ñŠÒ èW7.wV¦ íK`¶«ÀZ l>±ÏAXsíYK –”0õðWV ô5R%q8‰"¶±°«„Bç¾=è1¼×S!kÖ(¥Ö;ÐûÍhÆ´v]NBm`„Â=g€9·L~(}Ð:Éž•@V÷ƒQÝÌȧãüd+£ÜEÙJ÷B_’}á«„ñŽõ”ýù\ñãl]ÈÇ“€â̤~¸"Ö|o)íd†ä©¤\ñº¼¦KbqG‡àÚI\4‚©¸¼ó¯Î¬–ôè;䘣FgÐŒä£#:ÞÝ¥lyßÙ’KÅzfsRd‘†ï ,ÄÍ–Æ&X<öIÌ"CQøMY9Í`Ì@D-Xû›JQÖ±lŒ’p6aØåvKrob4-,óâ’Ävø»ü#•Ú ñElu$MV¦Å*åÚJc›eÁW(;ÖøŠS¡uy$Õß$3Œä<õÇ#£.PÎ9e 3àì“ü P~{ŠÿcÔù‹Àb(èíÓˆ7¦ölÓvšlM>ª²Ò|ꂟCfÓvænÍz>úðC8öä{>C2«*•~Äv¢;üECM¸ URj$kk>˜ Zu:m£'k[Ù=h‘òÞäà¼K;ý5pöDz¢fü®-åø©-A±Îâx ¨“Ç’B8ëºá¡zX®2•æ³~Gq­®}•ÄÈ.¡Tì,RÏzXŸÏXˆäè=Ù¨×Îáž3ÄÀ*q§§eSkßÙñDŒåuBÙÔ9¨¦Ä˜¡#©UÄ[]¬qL°ŠÌ}Nœ„X’ËÕ¤T»C<'„ÂòÌ®ºuª)œ ¥‹ÏF2Ã4{:?´V³8|;?i¼Ç1ygEŽ|·raݨÁ¸¨âЊ|T’ z§M¼¸¾ÐôÙˆÑX‡=±p°.Tm†ìØç©s†h®ìÝÖ¬idñ€Yš?¬P¨¹c€6}Ý  ÏSÁ±–瑇qíÑÚº¿±yFA©ý]¸s‹A ob­§&€‰ÍÙ…±DÀ:G³°“x§$>ƒ•€Ðqåz¸xZcß›|®['"mü|Š)"PÃ%š\1ŒÊ!¸„[Ôü1Y *Å"ÙÔ2UÁz„ˆÿóÕUÓ•6œ…8T^Hp?¬vC³ ¢ÌÞ ˆÐ+%>w÷O¸ dp-­T‰lÈÙp?;S=µ” g-ÞY,y×±Ê.ñÆb{Îû¦—/jçÆ‚ÓÉ"°^àTc M”‰–L}j#zt·Z_°|Z6æjÃSóX5 ª=±ÝOˆî…¸õú"_Ï¿3~­Tƒ ý½ÆeËN6|ñC/©Üâý]ì5×g‰êið§ÔýI"t|MQj"ÀÅÛf7¼ï‡ã4M–lþåö–îK6g)‰*4ßD}0Gb°bù/è¨êo€Ö®÷tÁŽ…áPé;ŒŸ”îw_”4Ö’Õ™Š#Ťž…6½Ea;üþ_€`àÜkÆj»;‘c LóŠÄwgíƒmx”ÑFi"¦ŠxÿÀn~°ò¬=%¹ß¡žœ©jYÑ÷­eGŒdL‡ðûwX´v…a%ù ‡^£*Z Òø^l¯gÁÒÁÉ*Å–qïô™‚xsvb6 ßPƒÍ|]/Å©¯ÑàqäjSI{Ò€¨õ_]Ms^(ÈìIÛ÷®EÜ•YÌéâlê®PR|211¶'  ã7 ¾¥ëçcª=¢BE:Ÿ->[Ïk¨…1;éshÄ­mrÇ™ÚãÄ|7*«™¼:© Åï!/ðÒðÖ§ngÖÖʯÅ/›`»ýŽWÎ ¢¼ ãÈ5‚Å” ~á¢vµv¹I¹uüáùÈAôxºÙØ‹&¬V‡sŠšÓã9´·ˆòîæ°á¶N°ÑZ4ç·ÚT{þ¶³3 Qþ–¦üYy]ÈÌÆõß“~ð]›çö·Ò¶–9?kôãÉTü¼Z‰Ÿbœ6ó0×q½ <Âe¥·Ÿ§EM5­MoÂÄ ÄÚ£¥‹B}Ä"܇l‰ùÓs‡VYƒŸ²Ùê›cŠ| 4óC+htq#òF´ü”÷©k½uòZ¦À¯…wdý0»’;‘é1¥,±x ŒÞä¢!üí¡TärnIâõ_û+e¾½ÿ¶›ÐyÔ——nÁÏô$Ù\%Q&ß‹:1° ¢4<„O ãsE'ÛíèItÉŠ Ù;KÓ%Ày5Ê_DhØ<´U -ÄÑ\¿´Øçj9?V!WÍña0#iJ˜[ïÈþ ²8DRkÐ ÕèÉ0Ì¥%AÆ¥T£:Gž%Ü#ÎoݧX¬Zh*~¶gF OÜ98¶Ù¢50-ƒt–kDŠÓ‘èÙŸ³¾iL²«€ˆÿB†oˆšczÓ|L; RAZL€à[ŠÏ‡Vå¢CçSÄÏ7ýwßÙ”‰6•õ]H`ˆ¨ôFÆýË1BD0ÉO¹$A^Àôò ¿—|\×XQ¯¾äº\-ÝbªÁ o'cˆªBÍVô¶siVt¯ªGMÞ~x¾\Ãðš9õzˆ´KÆ„ C[Àù±ùEfÄ%cÒB¹ÊI€}5VÃÝò]³ú£ÔÌpUD82⃿°4¸£N†Kn0ç*^Ì=cš5Ž€j6ïŸ ·cMqe<œ[-ƒ·å®h(òt|TÔº£¸÷3õ¼ž/kô>ð3Á¨Ÿ *„ª„¾ÉZžç=ê …0IŒ÷1'jÍò{†Žñßuò’cñA&û<PKïo…¥EgÅZÄS\®¬ç¹ ë"Bq”j,{e 7—šÇÜÝQ_ZŸ[Ë{ cÒ¹d> »«:ÆÕÙÁ(!t> éaå½yUFF|¢-‹ê$.(<ö1 å9 s{ZH¸/(4‚GcÈÕÂjn ­Ð.‚¡6ñWªWýqy“ï n“NÐzͬ8«/œ.ùJ0ö o"ASö÷)mÃÍÀ Nd¡‰‰[Iu¦w’K>Ì‘%¹“(Y80H RÚ= žÌÐrÄÜGõx/¬J7HÎ ü“ ~·EìJ+¢·•~òFuy‘ÿµÂO@Íó“ .Q³‡µ}Í»ÈFCÜ#ª&6«&ñ.6·‡¯‡À˜"º¹f|ô´Z‚€]ï:•·zQæï‘»xõ3MãZnwÂæL%¹_¯^ÛØ À䳯ipæDd'•G Çáë FÊO°‹ß{ž”%öIkžº”Nb{Lcž¿ª]g—ôê>õ)N„”R»4…8¿ß¯ Ù˜ ›ò(A$LNàÌò\tmŸ¥äZÞ_Ëd;`L¢AÔ\©yÃoh¹È´Þ+HH¼?©µv}6Â>^I‘1ë§¹³·û]Ñ_Ò䫱$1iDžJµ˜^!5”§2luªyc9åw«J0IT~¢;cÂ^IŠñ—_3輿‘*±áÏ;)W©Š¸™¢3ÓUŒOº¼Z¼dÈó쉋y"K¨vIÔK}¹¾=7b"+ÈmpŽG#fëkËhhqá;{”È3=†´¶–o½Üàl;ãöʺŽL¡p Ôm%`ÊO‹Wòå`[%}mÙuJt€J·òس‹ÿC±âº› ðä9Æ]!s,sG|.»ûË5xùCÞ© SáöãYã¥ñô}Ry¢+XÄd¸Ñ‘áÊÊño_mȆ:Üîõ¹ H…Ø™ oiŒàxåêÀ•›b¿d5¡†Iâ“S®v¹:}õhwÌ/Áv9S(Ý~I“|£OÌéÒXs£÷8#ÉŠææV¢±Àl¨¯Áde”¸ÈË“L=d¯Ä÷}yêâ+Ш|¯*”øF% ‹^[q˜í„vIÇúZ>²õ‘?CçAV¸–jŠ@ÁúBËæÑsƒbømÛh˜qœ¸ùMu³Ú@0²‡Ðò¥î½2kZ±û:R³Îª¾®€‹´ÒM‘‰ Œ_›ò6yÂÌGc¿ÖY›f÷8àÙÒÜ-?áQ‘|އþPk°Û•Þ(á3tz¶àÂË~šíM¹å9Øh6[&É¢Ø¨í© :"Ým(A r•yk+­}ˆ¾RÂŒîÒNdõþõÛÕ}êÀª+¯þ̵©ÊtGæÈ r‚WEþàèP3*°s¥öá Z9¡Þb‰ÿ;¬4j7%PpXœ«P. E‰ä‹–r )û,J#Ý¡|Xú”…2äm!:Q·¨o¨ôÑ{¨õ| »o,TÉlï¼z•‹¯oI,Ù\„Li4ñêÿKcç ŽÌ/pMYvE‹«i·®iž=>¶—¬Òz(¸S!§LÇÀ:ô¡O ÆÌ<©YM¬ VH€ÑâÂÝIÙøØ¶qA&kºúê_³fDáLª pÀ&…>Ž{7ÄPyÐÈX§m“u’_‚Évã» /7FFb³šé.[PN©¦-O¤DÅ µîä8¼”ý ªërXÃÅôTyL$3•ÁÏÅz÷Ò’MS3\ê €÷0K3º¨ó´äÙÓWsñgž¿¤› žv¨‡`IÐ$<¼«T5ëùM‡ý"Ùà³P_ÁŒ¶¥&ï…ý:h¸² !–Ã42ù<]R#WÏo_° #Y1´…~û«¡BºÍ‹vÿD,l'ˆÐ"\¬ßÕåC@´0íÖ¦+= Ž·‚FÝOëó\Ë[ËE)%>ä…“U‘êr³½~_—]BÈ„½ ¿OÚ^qN¦O³~²Ƴêyk_P»TÅ wj4ò²'Ó“¨eL,¼ªˆÌܱyÞ—Ý/‚8l»sE€-âV÷¦n׊Àë‡å/z0á…¼Ñ.¤\ј)ÆŽ°gQ9â¼Ö¾äTK[ðáÐBåÅÝ£å,ñ»æùŒŒsù­[ nÔH^äEÍ)Ñæ5ï¹OÒxdf®,UéÝoœ…²fºpð?yÚ1dläõ ¿Òý²gQzÂÙ¢ ]8œ–¢µN'Ÿ»°Ò/½8ÎáueÀZâybèõúà߫֯WûÊ¥#Ë?1W&×±!d¾»)äDKH±ÈÜ¡•)ˆ _ˆ@ήÿÚ©f•6ÚõGÔCcv—8y³Þøþ ª½ð6?õsnÓéa ámFˆÔÂf OL]Æ^l ib’Žgž0 |–(:Ô0õ[Ùy¹l[ j"?„©rW™£ ¾ON+Mg×›>¬ñ€¹Xè†S+D§r)¬\üŸÞ`(©[¼ÖI ÜœÈü•!íI’šDãÊËë6X/ºÖ‰6Å×[ßMçö~–hªjO\L¬§A€-üPm Ümm·$YŽw=Ø FD s3˜ý+;U¹ƒTš+ÖÏG ã~ëB› s‡†?zfÑ3觪¦¤Y6•Hë)ÃÜýª-pS0G2:Nþ¸¾Áv;KEEÊ;żA£É¹(A˜žŽwB³s?85ŽûU¶W­ûHÒtþ£®†­T¥xö;ˆŽ"qÇæÆí1¢¸Î°\R®šÌᇜ¤ÍÐl.¾¤§3çh׿:©Bæ¾HB³É³Žs¨ûW!oÑŽ¼wçjãÚ­¤”—Y R*h_nœßð—¼LºïõVJôO€[@4ºNê ; wx°©“]C41SÔFÊ*2pëtaÂi®&\š‡l™4ÐVËÞ í✠ƒ4].#ÜGÍ“ )@Vd ž·•¤Â‚¹cí$ù€ˆhÞy‡Œz^ rùS\àýëò2Ò§Š°¾Xlˆª*ÔéÜ%zÝTl˜ú ®jè>þWŽ?Y–°+Ukš`Ò¹+è̬{„d+‘lQ{÷ì'¤µˆö<'ãN §â†Žz=iß |:öìXy¢ûœÈ_BÎaC攉å6_v½Óæ(tÝ×')Ü™öMG ËM6–ÔnQcGgðU¢‚à>„*,¶A5XAú†›eï1yÞtq`›w‰ízà z×1 Gn€õÌã‡þÒœÞãX®?ø²Á%Îõo6ÈéX 9.ìéÜ«zQR„~¾2~9TCŸ‘ÊZ[dýÐö‰áu6êIkXàò„_>ê¼Ç·:Û½Š×G‹jÑ’«Î‡u^o¸O OÆ‚¥"?TsçýÿUDƒ›«1+œ‹ WŽ$?wŠg´ÆöYÀÀH¨ Ù4ðC¹ržB_R¥?ÍÿYø9ÃŽÊÀ®2H*v3i$ÇŒw8up'i}ªë(ø  ¦Ñy¿Ñ0¬‰£!±rcÈ=ÿš×F8¤GpéïuØQ½Ô£èÿDk6b"Qmždcõ扪¸S.ÈÕ‰åúŠ õ¿‚B®¯P‹Ïµðs}·ÛÓe}ˆo뺃cÜíÉÇ„*lÌL6¶Ç cr”GÖB¬Npœ)Éû©‚ÿ=—)s A˜¤2ÁdÅmŒDB¥4Í-"'¸8Îç(žˆs›»¹b© ¤݇µÒÖÖïûÖèý²¥K[ÍY*‡·qÜ62‰ä8™Ò˜Ù'^Ybj:†5 Úȃú¬Òð£¢Þ <û+ºñlT¨àÕ21¾„gRR#EñÄ fÛ§Àr¾ˆ’ÆîÆ’TlVµ]I¼/êvYeIß´CErqüçÈ«pWó)­ü:îàDѺ`@Ù|Ÿ:é~¬*Ò^ ˜'š¨ÕEh¤š2Ó}’`ϺeE¿¤‹XÌiÿŠKŸù«P‹›c‘ìcv«¬³ èà7ä B€'&¦‰Ò ܳçó-ØêE‹ É ©·@:?FÖ-ìÆ&W›£j–Ym…®´•­)É•J?þH’·ô t$( XösΠ0ÝMÙ­áB(?QÇH²©†¢£ú<½mIžÔsÆ â ±Þíôm  ã@æ½RÆâ©`&µW?dÓÉq-fxŽî` Ó&¯©§ž1ª±kQ ¹¨¾ úEše¼@ß)@‹r:ÆØ5,Éÿ[PŸn‹ò#Ѝƒ\ßK, â‚å-È‘íUe™a†BFœÖ ÇÄEKVÑÖÊÒ"ò·„ä‚/SK-=fC`ã´Õ¦—Óˆ„S}J f³}Ò#Œ»ION¯»n­Æ€6¥$w¼³\ð'}¤&Õ ­.k€|!¯Â'ñ·1Êü=.wäòÈ òrPr‡ Ø9ÞmYEå£(ÎJÅ¥l…A¥Ñ$±ZwL¶â`M•Ø£u¸Q’§Õ$uƒb5A’f 8©kÛ DŸ ÐhÝžkŠÕUG>á—†ŠúyåUz{[êäÑÙ'À¸áÙÄa@“@ã‹1%­ÎÇ«L«)—Åñß–¬Œ6‘O^È‘c=Â"‚•¿Ãñ-Qp|¢™8’ÌL¼§ýõøº8¼ÝVNqt]q<¹Žþ^Ú¸¾Û#øI÷–Øm­)Eàç¶œlNÛø¼ØÝ-€aQ T sv"„ˆ~Ëó–îÂÃpz,ÃfÐ1%ìÛ¦8]"§V·N€©ƒzF‰fÅqLã\Y”±Lh¤÷£ŒKFoÈz—¸œíß[B÷§¾ÀwÚ¼±ÉQ"YΦqÞÔj$ÿðõ|¿ÕÍðÂ'5W£v`âT¥—/Ö¢UA%a¹>Â>ù‹JžÆÂª^ÿhª©Pâøþ#*!”rÛ/ÁÖâ¾ò 0bљɊ¿­C¡P!‰Þžûª^iו.4‡u–˜×²cIµ`Uåm1ìEÌÏ…+»C_ÂýМ—ÌR ó“Û»LWI”+zYìÐ!³†Ó1ÿsãöãMjjú O.nõEžœtÎøMæ&¦¡KtEËCÝ'‚ãć8®ä+ óJj 3µ—„Ø\¥í¾×UB¼Q) ð¨a17ƒ+)¶†BI.b\žndÒnKwàJ©hÂÆ6!ubÍæÍ½¬LAìæ z=%9Sq¶b×c”Þgw—ã¾G|åáߪ¦€Žë0ã¾#0œ*ñô8…¾ßÙñFÔ€0ˆ´'ËÌ,xE‰Ú?x˜ nŠæ3 póùß›¼“¬eâŒ%ÒÛîE!öNÎÅÈhp9 Ô5göqýaØ.Ý,1d!Z‹þÔü,BŽ>ÞØ3 –©¸$=™?áé_…÷p+êÐCAÝì¿™v÷yÌß.À‡‘Îý”ð.“ÏÈlšÊ$q.²aΫKBÊè0â9_ÎZ®Þ0 tùH®Þ ­ò ³qtÍcÓ_êUÀºnl±~õzžœ:èxô Ó,"B]0wŒ¨ÚOTÚ§„_lƒVœG»ù„OßzZ65Ý$©x0Û§Þû‹VU#vl.}+ÜÐ D_Ù& ªøavu Ù=ìˆhö±$ˆ¢‹GnoìÿïLoÊXÍž2J—ðm T:SâÕvBÂ1,ˆ¼÷uq‰Ì”¼É΂[H¾qf¥¬_½)x°ƒè¶ >9>(ÑÁì”: ñÇÁœ¦‰º*‹Ó k ø®Uõ&ª¼ÏÕ@À-&Ú}¢œ?aïrï!”¤‘¶£€‹¼ŒO¾ýªßsÜwDæÎ):¡,œoEÇÓÁ— š±‡÷£ ¿øAW1ƨÅÒÑPQøÈx¦¹í_:"©}•ƒµ¥+ê3n>&Ó {'ÿnwBƒŸðF î}ñÞ€èrÑ•KXbãó»®4³}1 ÝOO´êbÊ[ЮÇwt9@€C¼‹š7ñŽºMΦÆRÑïØ5²e÷= PøCŸA Sd†öóÖým³jºÐþ½dÍEyCÍòÕõ5ëw´Þ#"Ád—7|Ç>ÐuÇy×'ª?ax+c œã‰ê¡vrD’zQØùÏ\ó?úÎÈòK³-~oÊX~>`7;|ÃX޶4iÝô!J5./U@¼§Ç^ûê\e‰ [™æÕAf´?º'ð“c«f –ko ñnåq^Lx'†ÃÞx¨ÿ‹¿®ÙR=Mî*ó‰ÍÜ-¢ ÆÝSÃûaõý}âêE 9sº\cÊ.°¸¬TÙ?+Ýn>ø¹Û-ú‰J¼¨\ោ@»Û©wdš& ¸ø&Å#Vˆnökw‡+µ$ô“QïÛ«š£á óÿÊ‚'ŒAÓÉÉsF"¦v—q檘BHZ(GR}딜›¨­ ð{ac“{Jk0§9](ß°þH½·‹–i‹`Ï||ââ{¥«¬&½ÑR«±Ð[Ÿ7çÉÿ@¼\žóšž^Z YLà`ðû°LÅÊêDÂRÍçIöÛÙrN­FK™÷&(jGìGö™³ˆ¦¯\šE=W®b®…-¬ggh›ÅI¬ÜÍ…é«c)ç)vëk¹<ÜfÆ´NH>Ö…r ÈÏ/’í®*‹2w´B üszkŠZº% ?ê)fÿWx”34ü;Ê!Àô¸ƒ“ÓC±Þœr1y=82lÑÚ¯™q¶¸aw»4Êà2ã/*Ç€Îê1i78’Ñ¡‘r7x£wÄÅ{8ƒU´ýß è>N‡?„OÇÓ-x ^ðÙ$zõ­ƒÖ(VF d,+E»œ©à5xv‰SBÒnIPµÍ춨ꜿlùüséÏ´ÔÖD¿|´Õe¬|÷k& b³fôI“p'' ¡èÒ2–úï·m™ õ¥ù“š)û‚Ë+¬K!Ÿ¹ðM€B«kÛPã‘Ì9(Ã6¯žIâœÅó522êî¸O±›£ÛdâÅ;?wM”úËGÚÔA¡Ì^d¶Üàß+0:ÇßÎâao@z?d.{•[}~vpT¶¶póõïö´"ÖAžˆÉa>‡•DZ®°}÷ÅT]QÊ ÀNEµÜ®Ìq;Ræ.‘lQw0š—Çqãø”&^Ž‹¾x€Ít÷ÛX×\¥í™(DßIøÚ‡«=€  y}ñ:®A0¹S ¤¹á0ÄvkMß1¡Ã¶Z¾šUˆßqâ|¨k2>²UDh¹0Ï µh%ß4 ÄRå3m¼*qaõ·ÞAÞ1» f®JPëÀ¶vº‰Õȳ¾øc^±ÌHøªE…#Lû4;ïýˆ Iÿ^Þ%VXFkç£ÇäˆÓôƃ kÜÔ ÿyµƒ F¼ÄˆjÅÎtÀ§i ¨MŠê~^UÞ÷7/ØúÊZ(ó8e¾e“œÐÒU_+Yvî9›«Óªn²FÇ0‚·Ú%† ظQµH@Œ–Y>u’4»Ä;•ìi/âªr%ÃjoÄp2Dˆ=2}&ðçµôD¢cù«púin\íª­Uc2â÷)N0@À2X×îmL³Œ­MN÷þÜÝ©,9C·0T¸Øïµ¹CEðщŒë¢:ó éÝ·Xv×R[uAaYöù3á|gúWµoè÷\Ös¢ÿ&#âáz®ª¤½–2òï,Ä ¬ì@žù º—+ÐèOålª²püîÁUæ³Ã“mr óm·j¡/¥kÏ<üùÖ‘Çd`¡&–G"Ñ׌¹ëä£ —,ƱÞЛÚS…ëT_…^KD•Œ²%¸Ÿ›õÀ›0¿} ó9˜ãá×ñxÒ.Ò¶@»°6)nŽ÷ÒÎ æù‡$q¥Õ‹Ò(ÎFcúÍ— í;@AâŠ~NˆæŽ Ä&¢ó´&×ÕÀ€"µÑ1uýWJãr•Ó5šKÄ»‰¹*kSЯXwããþÙZŒ#z•ŽW . •ÖòÔÀÈŠÌçã`34ït_¨â«TU?94ˆ`°7¿¬­$IdxΖƒ’Ó…˜ÚureÚðwëMÒ³Ö£UÁ=@°øÊÿ±š‘ʽ|eª#ñè„‹ ±I©cf̸#ëêÓYÄc1®ãŒjÆûç“HTpƒïÄ…hÚ‰÷V~{ÜqîxîþÔfl nMI­… ‘ž!ºç ¼wTJÉãè0‚i±¸/H_ÐO°ýå¼ 1e¡ÈOM?Áœvg|Ø 6æ g7ëÀƒÃF:{xŸ?Ø Ví’•’ ìœZ޼«VÞ¸‡½a;Ú¬CÒÅ„WtÁb,Ö¨®c€ZAxã@ìîÀW¿I½k2pÎÅÕ&ZðRÐCQtÞi08û¢ilˆ \ÔRŒ®¼QbÄ—”’>PCšÓ¿…È ¼I' { µh&7ÖR°Nå˜e©²XáúReýáL£K{µ“-ƒÊ*Þžg?j–/¿"7‘Ô<{H;™½ãõ@“ÚÐ1~V]¢E‰ùoü\Y1«¬ &¡ïžj?±³Hµƒ:q³ªB5¢{ïJéÜØ¿õ8x½h–iœØÏ¬úTN´È„FIFÃäÐQ|Eì¾D%ù[šQc]Þ8¢úcý߀øµìü*"-NÇúÏ`úTœª{ì"ÐDzB_Râ"É€»¨QÚPq· ãÊ@«CWöxd¢L²û¥Wò_ë?nf3¹žXÚÓ uSÝìdÓÚ'bþ/@÷ä¢ñC[E•áûú[mÝý êzè:Ô »°°µ¢¥:lJ­ù¤_OFõŠ<¸ÌI·Vǽõ^±Ã„ЀpI—ƒPÅ=±¡x£6Ñ$–Õ„{’þ%Ç99·ª$\u–çNR©±ƒ±‡£Î¦¨a?¡ Á~ªVšu߇€¦È¸ìrgîÓü@@c½{Û#8¬[9Ã<߀öfš]%)ÿY[tÿ vü|ÂÒ€»ý¬\Ñ6YÙ¨ÛÔr+ÿ´vÚqzᎿ¨hJi\TmÂÞ¦E01óŸï᳦šäô^ÈMñdh ¿ƒøolÁJ-ïÉB€å…{Æ#„}=fò: ø3~¯­2iÀd#¥&_UÒü];ªGæÀŠR»x6ø©z˜–8£$Çê·‚EÈå-/6@ˆú¾Aß­&Jãó¤B™–ìS ,2&‹Œ­ ‰þê_TT̈D[ôÐ5€(½mn£Æ÷p 2N6kvxUñ=Õ$ˆýún^Ñ¥çåi3YFÇœ2J¾t¢J«çÒ³m#=@ù$ÜXÎâ&Õ;÷ð5dÒǯŸýY­Ç,ÒskV—ÛðïÈ:¥½;ÿ¤Î‰¸óÙÐ}¢ à×eÐ=—k½r=Ï%Ú¶=]£KçÊ4~ Ö˜áW¦¯Úõ>P>‘óý^Q¥÷_°E¶ÙÂîwT¢CDnQc×[ʹ[Oޯ˅V Ñv5fÆzK8 +Fe©CûJ¢ 6ôã„ ½B|«‡®wnqˆkƒ„~ŸC’ѹ;Žì¬~S“'scÍŸàAYvoB]© lŸ+ ËûôÖ‘º*¬&òÉ`@»Dµ>#ÀþZãG3þLÈõÞ¡ª¤ Ìy»-¹ì_eÖÂì¯d÷q!2ó©–Ùm[\òE mÁb›k³e9„}Ñœãy;× ³@»n›½|ò€è~þ˜q€IS ¥ûß’gA:³X"r:ËV'Ù$¹é À„"tÜdþjØâ5)êÕň 6ÍLËʼn—LE/ŸÉ“s^‰lLKƒ`N§º¾È;TC¨ÜÿHâÒ[˜Æ9%\ýgIÏñ#l¸Â‡‹óLh[òP>¸Ëñ‚ñkjÌñ&4­UfúžµLcSøæ¶ž“/ékÜEp0Ü–bÉæÿ(zÌf·š±“fK>\1Ýë"à¢p ä×ëS{$‹}y“Et¿»NA#ó{å˜y튺´¡‚Ê)¥´¬”,õæ£@)Ç/ãqHÞ8|Å^«¤Èqâ5€tŒ™y¯™—w^¾×ƒ$û²+ÄÓ\u¨Î¿ÞË"¦w÷Ló¢9VA8iÛàí}&ÔPý®ôÆdV es‘(0•Õˆ™HGãB²´¦6e»}"ÔpUˆ£Ù7•ÆïE1ŸRêö}Á\žvM›ÑzÚýæ\E«(éÍĬ¦môùr†¼{Ö÷r¥ Ί‰ Ÿ%®WRÑØëb­¢$,ïqåú$Ò!{ÎðæWQô#Ÿq°é/ví5##b¡éÊ¿p°VÞtZ;šzÃÁÃú¶?Œú…aê˜{K¬#yjLîÍg+þt_éÙá&p#¢¨~¢…VÇ¿v|i‚]¨×wÉ”'e#ü1ûv:3?5¦¼½W°lƒÊžÿ ÜÑ9 @Jú¦ÍˆzyÖZ3øÚ p ³cj¢’ø¨Ü±¯l†už6… ]àȱìðunMÜTXÊ:‡Ä[ÙÉí!ëh¥Vg^Ã,—¯þ}RHéë%x5À™5¦äó‡¡óD•ÜvôfM ËÁ*ªix3씣q*¸¹k+ 0çxtµ‚V*Á–Œd:…Tµ_“Ч+õæ>fÛw%c5o¢ÚAìš×‚"CmÔiØšÔìËzØõœ>’UÉíàÝsQ~?¯^ËQ3Ž>Ñ©Y©!^Ú,y]‰ž·úiÔ©w…iIa„Ë"+µ÷’:CuØW­\¨ê3õA98]±P€M€ŸgOŠš%¦´]Z­/fÅ‚ Ó*8ðÀ‹Ú`ˆ<½ÃxN²¸ù´Ñü +:(]GX¾îßð€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/type1/bchb.pfb0000664000175000017500000010200711742726711023235 0ustar uwabamiuwabami€Ö%!PS-AdobeFont-1.0 %%CreationDate: Sat Nov 3 22:32:22 1990 % Bitstream Type 1 Font Program % Copyright 1990 as an unpublished work by Bitstream Inc., Cambridge, MA. % All rights reserved. % Confidential and proprietary to Bitstream Inc. % U.S. GOVERNMENT RESTRICTED RIGHTS % This software typeface product is provided with RESTRICTED RIGHTS. Use, % duplication or disclosure by the Government is subject to restrictions % as set forth in the license agreement and in FAR 52.227-19 (c) (2) (May, 1987), % when applicable, or the applicable provisions of the DOD FAR supplement % 252.227-7013 subdivision (a) (15) (April, 1988) or subdivision (a) (17) % (April, 1988). Contractor/manufacturer is Bitstream Inc., % 215 First Street, Cambridge, MA 02142. % Bitstream is a registered trademark of Bitstream Inc. 11 dict begin /FontInfo 9 dict dup begin /version (2.0-1.0) readonly def /Notice (Copyright 1990 as an unpublished work by Bitstream Inc. All rights reserved. Confidential.) readonly def /FullName (Bitstream Charter Bold) readonly def /FamilyName (Bitstream Charter) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -109 def /UnderlineThickness 90 def end readonly def /FontName /CharterBT-Bold def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding StandardEncoding def /FontBBox {-166 -236 1262 963} readonly def /UniqueID 15530632 def currentdict end currentfile eexec € |¢•@ƒŠA3ƒœ©Ò.+™ò¶v|Öu ¬ü²NÍ6s›¶I”Åg7 Lì’É”_ðt^÷ÿư©£¸Içé‡@ål Z÷‡UœÆ•j³3Ï…SÕ\ ŽõìkôbêÄ.s€Ê’®‚³Ö¼ò»]Vp”Ïâ}N¬–“èƒrÒX´~ 8vUŽ¿uz¼\Ýö+ÏÍ‚qòYƒ;¬yprìš0c¿s…à-ŒX¬ß³;Œ‡h²x±KשOLfœ¦¸ó JoðΧ¨,kÀžHé'Dü"ê¾XºÁEƒmµª×ðä‡ä÷!(“ü›hâ| øORM²O±ë0#ëí@³úb!µD2(èjo¸ƒõ˜¯þ0«?(FÔB¿bæoÕJž‡¸0æ²èžáÁÎ8®"f€\ðArºiÕç%×Ýev[‚&”0äfm]9áDz®Ï"+zÿá+ j%‘»¯$ßUÌ!¢µ/PGŒÈ¾•Ÿh‚¦€t™gØÖñKý쫆x.UÔ¦RŠØ+ñFýø“2Qfš”~×”ªpÀê%øöFÁÞ­A’á6‰‚=7°FýQa|óâÃÇx®^"#8ùkî ˜Ç;þ ûçHþlN²-£s’<¶…¥ØÑ oHþk Ž[?j¿{æSŸaPg;lÈÚÄr´ÀH?/ÒõeåŽZ}DäÈÌýÔŽGí¿•í;¶ýêÜ Æ©›¼ÏUÆófMqåÏó{w ¤ýÍ}G®ññ$&h0öOg_ïÚÄéâBhú°KDùÅ1Q0¥´¤ó‚Âè}ü§¢/ÿØ)!¨Òm Û—ñdMº‡Lä;®GÊ^ùûÌ*ŽIrÏóI½ Þw„)SK@h'ƒTØ÷.‰ü]H8rð ®j2”ø¡‚œ­½l|†•îT3[Þ½žSm†ºD…Û¡´úÙNRŸ¦ôI$é¨ÊÍÌhb¾½º¯¤bè,,ÑpÖ}ªÔ†€˜ ¼UZË·ÂâÆU%Þ9ÊmVÀz+;ôg‡µ×õ]×¶óŒ ¨0çºûtPy7ÔärU‡„Ñi¹k¸þE oÕÏdi(¯‚( &$þŸ‡9Õéu' ØwÒUuŠª—'Ó3M؃.Y¸p‰H3RÒ*F=à´HñD`”*Ï7g¿„‡$]Å£žû`chPêÏ6ºó^Õ`´—ý¸vdðG¤.ÿ=m¸Ÿ¼ù¾cPî…‘tt¹©O5å+) ý1N™QÓù$^†—@º„¬É&ÃΧ0¿iB%‚3g¡µ$ôë6:¸d@b`Ðy ³”.<þNÁ÷ÜŽÌ’5léhL\ÅMµg™MXœ"ºu¹^ö Fä`öØÓÁgƒý«#÷ÃöNU9dåí£b cO$¢2ÛUË%EKWÐyú(ûüAºT{gÖ´ò¬Î-,@µ«´˜ÝômÁŸçB26½€ïi!§ó±Å1[†U¹q=ƒL¬ð)D6ïÞT\ƒÙˤóížLH'¼¹j$KcSñ)>mŽ Åzüm@¤¯øÛüG_ÜT_{‡¾À %³wtÌÞ6sB™Ð.E,Tz§RæÉTVI8`7ðïäy™éø»£Iv€ÁZO·âýX¤˜›ì¯É£A‡ä{ñD°@åÂÙe®\üç9­vr2é+ÍØ‰¼8B“!¨Û»Zc¬ÙÓ;xy¥†È1¾›á¯Ò¹ß¿<ÀÃ;Zê ó=|Sœ‘óÐÿ6‰lAîVgô ~λ£ÿPl¶ÇóTÙP涯 ç;PkYŽŸô5¿˜‹9ÊZ¹OØ™® ‘šWÇu/Ñ–¢¿ÂY>Ä Ñ‹ ó¿gätM.’TpÆ evÝî©Oèùn&õÒ'Ù›¦v˜òc¤¶“ƯBBët?¦çæ¨c7×eqK¡8F§Z(ì \ßHCà"Kd-Âg[å9WÕhJ$ï|r·…™.â:Ãì—yte ùóÅÁ¹ŒñH]³îÎx+Ù¹5—Ýf@¿T¼¬‰¿µ¸O ® ý‘¸pm­ÃêD£¾ûð^¸e§‹9âqÌ:p‰mUš_†›^˜voÊÀVÂ¥—+=Uƒ=Ý$ÑŒ=ƒPݬwÙÓ½‰S Õ‰Q„7Å ™æÝ:ÙÝUÔ)Di¸‰žë s–U M oûö×2±»éó>È‚S±1•S$¿@$PlPyüI5¹k¼§ÚÍt¥AÏ”dŠúßCªô‡“d‡6½Ô-Ú\ ÜA¹™—(O9üɪæ˜×/uÌê­Zð˜¥ãô*5MÐsåFæs=ýÚ×™IÅ«w™-jXßÏ'™yYr{—€>PÉ-²ªéŒ 'ØJë`ãǾìl0æ²Û%›%x">id]RÀQ¿%Ê4þò4yJN“ñwgª8Wâ 0ê—ä i,×ný` Ð)S^ilŠÏ,õ$ú©Ð¥fþbnñú‚éŠã#äöíèŒß1†©Žé´µùj*"‰CH&º2j[¯X[H¾—d8]ä"Úï aðý´–íre$N%jÏ9MJ32PVžñÎúF êÇ 3–G rA%&|”±.¡ùÈ_:¸1–ÈÚ{iA^MÂ>ë™xA ?NÏŸ}U=G·ÛeÜ( ,Ý:D²rÓ ”ÃÙVúMsZk.¤«ðÉ^¡œJCÝREÃãÅr:’Ðâ`í­¾Ö¯|1Cop£ êi:ó”5½ºQh9žˆè$®¦1‹¼ëRAî1Ào­ Â!ãTt±*@¢D’üïyÏ™© CↇO•@¹¼>§Pï¼ Ï`M>“†×%‹éÕX-w«’33Ž¥ê‚O°ÆàÅ£• $3”Á&n1šqª-¯±Þ2ËX–ÀÕx Ë4YÏŽoþûbƽžøD í×,G­nÏßLˆ˜pçߨ*‹†8Ó'Ÿø¶Wó#@üÒããy(P ѽá¾îy¸yˆÖ_=¸wÂ>"þ!?ŸßÅ$¯OÞÉV<òh'…PÞ>·–^½pb¹ïšo†e&­KÂìglÆ£ 1éÒ?:lP‰Ê{ªÃmk=kö1?qÛ)º»p»¹=AèØ‹­OÄ_Ë©¹³ÊÀ»€ZxÚÎJÎ/k´C{øþŽ# ù…Ö:ëÉã9C ‹î¼–t`6Û!ãúW2W։˯O0a¾$â"mµ#Ð|X¤YÒ£¶ØÛ ìÇý;¬«¡'cßnÜr·×¢‡6u=Cà¬ýæP–ÀŽ4zús¢¥\VPÁ4ÿ3³+睊5Z¦sòhYÿŠ[4 !±_0±%A…cGo¹:âýòŸåûnÏ…ŠF».ˉHHr-…Éõ¶½*AüzŒÑA\Àï›ɳ´3ç=¼ñ}HqXNl¶½7ÕðWÜÿ‹’T½R;Fû1Ù—öA\‡&·ÉV†‡ |Ðy^wxªÐ\>~êiD÷gˆî¯|Wä,2{·N92¬!Wáƒ|šthûùÆ£¤ì¬+Ò½ ^È×7T£€š!Ø$yt¿£üÃ'庿bä}Æuá¯þ<°v%Mê;®–0ŸwØäI,’Á½@êH&Ì5ÿ¸ùN¢|¿TÀMWÁÁû?²Š0"øWÿ éÎúÐP;áoïüÛ<Q!L)¬¬2ÈoV G.mQŒ¯›ã‘mü¨ì»&Àÿ·‘0‚òqò”‚TNŒ ^[ßË!–zEµ<ä$Ñ®!±-qoÇNS÷«;"À}ïôמrû$$ö[0áWÀ8”[£{ô8¥ú¼Ø’ÿA“ÞËV/OÍÛ5":Ôuµ–à÷Å~¸Û&Ð’ ª6ñ<›Òÿ¥ÍADªÁ˜cæïb÷÷Õ+³tßa³FYФåV „_/M1F2±ôTù0ññÒQ?—“¯â`ùóðWÿõˆ<¶oŠê®;ðR‡lyêm Á…žß˜*#ðsMßìF}—=Æ|—›søLèAן•Tuá0ü½ «øR€N^¤©Öè#ËYIn‘O*Õ5²ƒœÚì·r™ƒ)$ Ìõ@¸ñŒ¬ƒ³th=½d|»ŠÐ}gÈõšÕT^îE~ ´ƒ(áÑß¾êD_ …ñ”¸Ö™‹ÉoûÔJ!áäçöÜŸ-¹­=¹¤De+\È&ùw˜7ö](ÒŸÓ\¾ö&[Ô–ùPà2þBzÆ<ÀV eðùéï¸î=J  ö!·=ê+ŽÔÏâ:eæ>7(a8£ÓÈ “j€iÔÓ U¡ïªHÅgj«™”›à¡8±ô®p}'&^«£?—Ý3ùÜÑÜôŸùcñÒÔQ™D^ÙsV·$F¶ÀAe“tPžâN8š;d}-*•4H8ƒš®Ç=Îa@DæPAÅÿèö^îvþ9ÿë#p€{ÚÁa‘+Zô¤öUCMk‚l»¢¢œNR QA\˜Âôó€cCP‰ø–JëVbíú¢Xir ¡Ò±ò 2 mÕ$ݩ웸…•¸Ó@"š½áééuÖ* «R×Jm²J+£NC,*òèdÙ©‚ËV‡®ÚWX¹¢®é)]Æu¼ÜB:ú𯭾ÛqÄ–X¼Ó %Ü« eu@#þ'W>o³ŒU9•á=ÊO´ r.È\¼‰ôÖO¤g<¥‘ nÈ•2< v÷w ¬Þ)ÆÃ´-@3Y©¢®Ðry8Þ+4Ÿ{1> ; …zQcÖÔrécÄòû‚>QuBä‡SSðœMyqJWã–*¤üÁk—¤Õæ_Ý3ùxdöNÿJû¼7Q®P × S¶(Nâð(°O>«áW:Ê$˜>ܦ‹]±lôI¬¼tä^Æëˆ;«@Gâ^¢È%.ÅßåQ§6Múmò¤jQµÂså ýÎ!\vÉrÆü¹Bš4¥@Ì ‰µkOH_+nó;•Ëy4QâÚÙ0í!0GƽÓÏ(O3 ‘m!ðµ5Ægz_`Ìï¶' ½ÛNcü½ñ„Ovñ}‰ñvÕÑvTÿ|¦î6åZü!GgëRi PØ~ÜìtuÎ&ŠøQ(~F.‘`äÇf§âô*Ãý0,*kœÏ&›j’GJF3B˜W¨jTV¯žvpïìvX9<3’ÏÓÌbIÉD¯JD)ól—%½4WãyþMP¡Ž¿ƒMóÊhÐJ)y½ƒAË[*ï7ÇÀfïžW a„M·@‰r\þÎÖÛ@(ž¤cÂ/háPf‰^3‘1vwW»!ÇdºFŠK¯”JkfbD­¬$nYÙ  Á‚¦[¶&× ­»âR U¿m§ØßDz€‰L=äJ’Ö]]mŸËŒÖz`Èæ3Á«_w²÷áXœ‚m4Â)3‹ÈSÇ;Ô4¸Iä¿Ð9-ÀfäФørŠôN.äÔ<“°]j ÆDŽôR7¾¥49_£½Ê›¬¤½dú]œ[áýÁvŽ w8ì­~[ÍaÎ'1’Þºw@A Ëà==èD91:‘ö0Ñ-‡#𤮠Üõ~ôþ~žg»Ûm%HÆc&]Eá ¤áv«ðÄ5A©ÒMòÑk4fnf¿5Ͻ[£íW¾/r“ÞÙ'ßJç°­FÏÖêp¼)mtø‰Üó—º?µ÷â(âeîŽj&]n)iZ•B7swÓ¦öÚ‡$—ª£­ÄÖëC„9ì·œ:… L0¾5 ˜h½GcÃ]Þ³j3ºhû D;w±xòŒ "ØÙ“õ_zñóØgoÞÊ­u°|E§4{…î–{•ï½€ïJ+öªå„LˆÄ5,¿èj#«2IYfðAë´‰¤Ö£²åÁÃØ;™à R;™› Œ`N¬ª LvûÌ7.ª®Áø¬¾ñK‡…nÿ3G€YOžâüc%„®pU bŒ~èÍÆD²ü*ÒÄ!¿‹”ÙÇã&KòµsÜ! MFO_‘ä|®¾Ú•ô;Kd<æé¼Ò‹é‡º‹Èüä0 Q4þ,ª%õv2s”u±w¦’ùJP»DP.>y8˜ÿr,Èb÷ÌhúUM=Ïćg4øy9òª”üIÒ†}á+=a°iØñ.¡ÛUÿDbÙ;¼aˆ ï¤>ºZ:¨f§ƒwÙ‚œ-ÅÌip]aÄ(³Ñw­RÒ4¸täoîg¸ÏñòŽ@ÑJì;¶‘€ÖnÈuk†žkqyf#ZgÒk£ííš*¨W w87/ÅXTª¹p´Lõ…ZQ×0I?÷R,$AU‰ŠNѰcYާkx:úé*½ßümòÌ8|.Ýöíq4~¼ÕžåxâNÞæ '…Kмõi¤%(ègˆ®»—JÖÄúáíß îk¼¬8î’" »¢g¾¡ÚŸù!k~RI\žp„ï:,jai^S‡ÕS7Å/CëxZÞ©Ü­.ýL 2%p´Ëù,\~8’pÅdÜ7ØS3‰Ú6òÁõtnq‚m_¿,P1üQ<¶å¸)³¢.ÚëÆ”g A°ëGŒ‘béU´ë+±ú<úiU ÓbΞ›J³Œ—Ÿ:ÄgÜëòµ„6Ú•w_B…¹ p5‚®ØúÙIÝ4"”W© šV&hª #±sÕŒäâzÐÜ&hG@¦õÃZ ÈPá>¤ œÎH¯­îäFvÿ‹žÃ¬Ïøõå:ìK6qœí´â¯Óí›#¸Ã‰“M+mùØ9¸ržåÕvv£\¼ˆnèþ˜}Ïæo¤‹Rç¡ã¡×÷_'ãH¨¶½þ2 %“1ýX\ýPRTÒãëáeßPkËOÇ™ðL‚]PÀ!9 ÿiãmñÍ6káÛ¹¼ß<=e¿»ß,AÖ2cLV`0ù¿u°óN€bÍ9m1šú–‡S^>öS¿¦ºÞ-™ür2ÀºÎSÜÅùáK« h(T›j…—®dÑ“u¢ÜL6™ƒÝáþçý[´ æŠ3ý_ƒ8ô¶¨eø±VÇñ]Ó(ÒÙi¬µ7ïj‘G‘„í`Û/ 1øÖã¿ÇÆš ¨PØ ¢aÖÕV<úÉ*‰&v&þ;8áIæÎF¥êP>ióá¯K ó~øè,ïYªµu@ô½‚ÊHg‚9x*ËäÍbFVe:5ŽÓëy¸üå½iÆ¢O›àF$ˆ6^{xx!Û'ï¢ÊaæçÄÊÝ8Ž ]w·Ö̼ ŽVïüØÐ¦oµlQÕ0x2Ù¦¬†IˆÖ¬œ€M|…®r³õé›´ ù‘eÄú¥cÓX½#×%V\žcW%{¦¤Á·o‹à:µ+’îÁ‘TÄ-ÔÉÍ 0±æk‘Ûâð”úc™¤(ÖkÊÄ gðÜÒ¼"EEóD±‰#Úƒìák¶ÈcòFQムµ·r?­©»ÍÂd>WÓ€æBÐU ÕâÝ'Â:¤1 Ö¿¡ms¾ýu™—žG졬ì@ôו¯ÍkÕÀ×E¤µ‘hCý÷|‡8ϧ­¿{—IÀ]s;Ú—•%_—ÁÏ\ÖNz)[Äæíü6~îŸ!€pdÕµ”Ò0£ZŽT²ÖæB±§ˆBÔY5¥9~vßÛA»F½>‘yu^NÏü@щÛ_.U¥ÒëŽð)òÒ­•‘õ­²fÀAâÞ¾Q ¤ðšr‹òÀ¡“(D?âÀ€­2öãç¥ÞN'aþJS#“Ž–*TÇe8Žëa‹So]"[vË×f˜°.Ä€çyO ï &-túöù·ÙôŠ1fW»‰ì浉GÚoЊ”8¸ø@g-d- ª(NHs¿ Ã4s]Ž¾Üº÷†ä‡’e²Hüá„ bn§¸ ON —·áY²¾K mØùp1POesˆ‡æ¼› „5B KVÇõxúG±?[î²bb@Í´zu©ù¢3þPwvRݼCGØ?ÀëÏÉ Io7WƒÛ*¤ÿ45ë·¼ö–ÄÉt…¹ë£S®BbuÅcGITŽºÙ Õ?ÙÄCÛ;wìüð¢sí¯×ŠÀÅkÉÉÙCMN!ýòÚêìtZ-ô`àоí¸'m5èœæ¿4­eHÐòóÑP–§ÕÝ8uÿ–W%È ­!ôí¸êýÍõÎ"`¯+[88M/„bÈ3Ÿ¸XýÉP'‰Oܨ‘6¾É,õVÒi·kû™.éDÄyÍm€Ø,6Ž+{oöØ_³š ]9Rƒ[mIrë¿,?ŽÖë—y°0ºô£"𜞸DJÙÅÃDz†½`P¤ÍvP*÷,Ò 5ÂXŒÆr„×F±ì”@—º•d¾¾Ð"£À»ªB„Ol¢¼‚bP•±øÛymÚÄRÉZü–ùºâ^tÍ›ñàøhða‚¢;+Î2#˜†<òÓÃ_¢þ7ÐŽŸŠ4^R#£\øí%gFèΗܲ›¦ODÎào™,a¾æG’¹ HûÀ :¹ëSÞLÌ9HÒ¡b&tVëjÏÙ{j»³¤T, P¸ÂV Ë®¨¤™²Ë/m|÷sa\“‘D-»”-.†¿¯Kr\— Î-Žà’v|fÐX?Lò/Ïôbà«bs:ƒP&²ºi„‡¥äxâ⢦+9†ÀÂLm«»F´‰òŠ{æ/ç;³€XP¾D ë=Qt“âº(ºsr¹šL¡Ÿ£`õ³Çë“Äeªfl‰É^V,Ta°"ô_‹}¸ˆStñ­ô¸; é•õÎÿoºŒ3Á–\v¦2Áf}“É#õJ–M€ëÔYb{ÓX&ÈÿasýVwõ żF‹Üº‰”J@×'–/ÄÐîk_Æ3‘Š0sx§—G”)>á]’ßµQ£‹×^©@û?ZT;D`®5ö§ú44^¡Š.¸P¥¤ d›€±Û8SÉ­n¹Qxq"­=Ä?K4 ÷îž…ï´mÏ^ã¨\ÐcRçàn´›/ÜJH<ßõVœÂ{1ZÇ™ôˆ MGÏÛ$›«ÙÞß3á!¯²aÆé5q# ©k°Ä¾Ë)@)¹C‡ì&ð¡Z’†o]58l¥8AB÷/ºªC˜  / ™ÊªAŸVùºNëÐnØä&Ú"ñ‹'¬ÆÄ•S‡ŒqÚëèAˆ/Iœý£ÒËÀ$Ãò)3ÆÙþ+`ÿzòd/ñ’ü Ë­ 7ž!¬ƒ?ké¸Ò$B`GÖ\Õ¹§Þ逧è¡—Ë4t-¸Íü0ne²ápŒÎ,—hXØ€ÓâžB/âQƃç:Gn¥<\àÙúAS¸ GÝö8ŠÝKÜ¥ â6Ø,läÒŸscI^üê^bÃÕ°Æ zi6FõSºÄ“$R1&™)ôýa0_²1ߪy *¿L9¨ù‹ä9l y"ÏÒ³ŒSÍÍ|'V릸§-Lj>,¨1­•¾çÑûíèTwâš8ýÅQ¬¶¯…§×VJ¢Ð`z'圬çbo·\7]†+!”'‰#ôí·à¶¾Vv Uõő¯õ/‚Úm ´ó-£:úá6XÔ(ïåãt_®HêIi5ǾBйËÊ=kÇàä‚ZF_YÒ GJŠß<×^€¼/q\2êlf3X°X6ÿOv‘n,N°'[¦÷"ðìþúéÂGʪM^S÷³ª"éÝ7£ù¸O “È<§WI=•6ŸÂpŠ_'¿1œ~ zÄóÝ *Þn°K¨{+Õ«t뾃š'®þë6(oªi¸\«.º,Þ?U¹^·hº@ŠGûìÇ 8ÚYX(‹&tÝ€^€i2eWf†ášišl—‘*Çhª4u°‡ 2ò?œ³á‚Q {Ôâéý|s Þ–}½¥9$ú· ‹ƒ®.ODZ„Y8%‰¹3P¨tt&ù-ªþùAÝ GØÂú?AªåP– ¿‰ñ ƒ\ðÈÙRG¥H1T"õ“ÎÑî/ÕŒš¶ÙÛ9‹ô;É€®{ø•ªç70DÀÐïKO? ÍeªQMJ Ù¼’•Aç£.¿úú£0è*ýªN?¦­í°g­‘û#ÚŸ¯!87öííîéŒìJ°EÓvK]ÿä/dÇFüÁxuõ;›Pàùã û@0 –øK.t?²)k0Ô ­üpP¥¬$ª=À‰önS\šÜÞÞbÂoësÁøµˆq[ +'»Y|ñüe¡1S(@]û§„bãmx¦”•aã@/XÕ}ÿÛ³)<¡s¡ƒOʳ^KÔ»”ïV”¨6bóU©Nk$bÐ|7ßE0x‰\’Ò¹ ½…÷ˆÚ§š jWØÃ/éörô`Ò†üj!©‡hgÇ8_öúª“Šâ÷Ò—‘(íÔÌ[[bÀ]+ZŠwõ¿hí ðLµmP´Ž€Ri¹¨>hºn•ÃØ·5ÚGÌÞD{}›ÑÁl“ûK™ßahŒGŒÌÀY¹X(ðSÔ¸B¡t7ºö»…G¦~Qñ“¾DX¯7Ã$¼í×7ÝϪm–ç;Ï·ÈW&¾r0ψp‹‘iK@Xí±{B®zÃ%Ô(<%Ô¼{/”6»\9g_˾ÃÀÃμ+`ì:4QˆÚmàP&-»'DÍÍ7ÎønGs>éfàˆLï¾jšO§âŽCVAðAÅž1ꤵ+f#8¢âŠ€ › àb½B»6ZY,GX[[Wdã{š´øÆ¸>䧉 ?Ñ8ŸÊÒ¤ƒTòŠQªÌçi³U¼qª£ÉÑ<;>Y¨ð‚‰~zʬ [OšçJ›GZÞ@ÿïÕ [‰wp$äËqÝ=âéè ¬„qŒ÷çf" ÕuÅÊý¬PÊm–Á·Ò®–vÐkôˆ«çRJP¥/'€CñL87ZÉwøiïÈ’ËÐÊÃä·8$ÌÚxI5ýKlU÷Î=07N5ºïö )˜|ØÞ?YíÛð­$! RаävW34Ø °ä+â;ªhš}ß? RÞ«{: qWÿ¬äP™öá^‚=†:ãí;ü„‚îì-Qbw‹rí$àÏݜԓÀ(ueX3yªŸŠ×ÕE±‹xÁR¿À´ÃÊAšš\†/QŒÿm4/„n´é3µJ¥ò4ÿàO鋟~åÌU4;L“l+&·+(Àó­s¨îXuäh "'ÅX¦P2¸omz,­öoÓ³À+­ñ¸Ú(97úìxL°[§ÞrèÓ™SYUä €OP#`¤µ(e7×|ŸÊMT^ Cë±äÕÆ±3š¨}ÍS> ^ïµùÓ 'µôÛqk®HDRŸyQ] £ló!ù6Ä(—Õ µøªÝúbE(FÁÒÜúDê,f±?“[vÜš\æôá0ó ‘ZOj¹©ÜðüW&› ¤ø  TоxRI>¥LâIˆ€ÏëªÐš?=íJü\(rWM©" Ìý7%lÿ,C"éþ°²ikö‹¥T øÂ ¬µ¯ä)§N]ÖA¸ÿÓØi8-]¢ÉñG·p@ƒèà ·i+`T°‘ÇÕ›,å¬G¶ÀȱoIß¶a™G[ &àµPÜ«\‡< £*l€P ·©ˆ­‹ #m‰Ža¼éiR@v®¥ûòÞ–c¢˜þà3›WhC¤ô_îµw³V‰XàÆ*ÞZ­Êø·ô H)ó>]I«Ä%ª•q@‡Ð?Wœ ¹¯Ó&;§¿iµÕÒœõgø¾Õ”„„ßTÃÒþjüzŠ¢Ì ÷ÄɽÿsΆiyeˆ»£Z±ßö9ßêæ i´«ZÒö¦„–öÓŠƒ=-¦H)¢ïðyÿilä–$-^÷vøed±!ôÁCE×UŒú€†Ð[B6À÷â­û”«9?ñ؉Œ€ð°~¨‘~ÕŠŠF&øsnòÞm¿äÐs,å ú:¼s ~Oú˜ë¨@â®ýX»†ýw£ábŸ:3,uFŠxc¡Ï×=¾we´½õW7Œ?A L(róœðb6ëÔÙÁ]ê)ö°d°^ü , 83j °v˜#RG÷Þ ¦&ºq_ ƒcA:U0êü Ý!dØ ˜ÜÞó_gŒö*wfÝ#Aö"Y’°K'T£Dµ›¶Cg‘CIo÷·spD‚?ç~ì_ŽÂ × ‘N ùþ}¬*&e]Å­gTU2´l…]š›ˤ×c›†꜓œ[,SéÆšó¤†‚…ŽÎ,Z]ÿP[¹xÈWX‰ªW-CŸ;¨«f©ÜÝØ‘CM8¥+x÷s\zÑVûV0opUÜËmÆ©? H·ú_1CCº ¾ù}uNÐ2ÃÌk,Ókª)[^ˆ–hM¢u$åf…Þ¦mϸَ$ëø!ƒJžò²{¶_àRL®™jxØ2ðnÀˆöÐ\[aI„ÛO—øÕö¢À×ï`8ßO]"Xð¸ÙQRzKΧ‹Û¤ôe!‡4“•7ú±™»$í'FG)î!ƒ«€Ñùø­À0K±w[6“fHâõ:ÃWï~æ-F¬hãý¤]¯o «ó‡c/š°UÂøŸºîv×Tˆ]À.g.,ÍíæÙþ‰‘ÚÿjUùìBA² H?ŠÙüU™¸‘n‚0g’¿…±ÆÖ/ªk!JÃÐÝlȶ¡.cÛ”ûÞ‡'%¶èü œ’¤×Óø ÍzУDnÏNäD鿯ÄVÃ|ú[æn޳Ú¸ñˆ¬¡˜ºàgl¦˜ÙË?¨JC°Û#…i¸ó¹Î^ÚNu Êl+ëUГ‘¼Á>rà"hz»ØSYfoÕOÆä£“Ÿl¦·›gæÑý;ŒfXŠƒÈè2úɽ¨úãÍ–¥7øltÆŸÁ–Úæã`ËÅcÖ½}7Ó¯ßt4nÆË¥°‹•¯8,ZEœ‰)GAYó‡w¬è Örü¹{«‚O²À”Ð)p TÜÕ Cs• i§4úís¬ë7SÙtIΖâžwOzŽÁŸD”}KFÅãê¡Zôoßa€&ÍJR¼ò(?ã–uã‹üÆag)|’ì'ŠGN„òqØŠën)áÒL¾[ë¼8eÆÓ¸ ©º*ÀH7˜l¶_îÀÓM~.£Œ3¹”ßRî…ð¿IýloÔpK¢Â•GIFçGüû‰‰“]S¦çäŒeÌ3j ”ºJí} ³‰Ül•À9k# Lç UB—H&œ»pmº‚äpqU@¢ŽzœâDz Dz‡‡‰õþS~g\HéD çbÿAø(þ«y4Ôy#;.Š´ÚÈW…îLæ–ýˆë=V«åÎs»pbU&&o±÷aÜÉ—zˆL﫯Ԣ[#¿y'Øëq"2;<Ž «w[Òú£€;Ä_UiìÞF(­·•·îÀô£¯¾Ä˜kŸ¼›ði~‡‚h& ˆJz¾þVð¡ÍÍöV-–ÑÎwê1Eâ®ÓŒ´ùæÏV £þ›ÏQ¿…GG½—Dò·²’Ö¢§ULjð&`”Ù|Õ$ƒt Ñ, HùÊð,É ª=TZ]kb ô©Kž¢Ì5úù^¢õ‘¼ÍµÂ f]KÚ {ÈB:*£Û¿QjÎæ¤¹Þ;Úˆj|­* œ@&´âíå`ô`gJ`šèÿj‘ǃ¥·q"ì‚¥)Ê*] †¨;¡ëÐã#™¼tî 뻚úDágËl®øGãD ¸$WÊ:lðÀƒ½‘É6µ™Œ“+P£;T¹Õä÷Jò«äÆ/ð)Lýߦ­ù©s€ÙŸ!Î|jÿ½"8œò;cc©ñ¨°Ò@ÝÕèÀmíõľa˜R*´ÄLcÄä³,‘È” ûå`þ­Ž¡îÒ’ÃúÖ>/ w¬ ªúÌsp©W• Ká½¶;c™°•PpÞyP¡¼:¥ ·íÅìÞ¢†…`—pˆÆ¹•Ü 6Ë{º8=_4õ)³Эյ0g…p|–ßa®¶OŒ j–ý(òM©}¼£âìš«¯×7t®”v3TI(À¥ñú!¿ÔÚÐ@R§< ± ¤‹çZÿ™“æ ”ë 1«†0eH‰ïö†šù }¸ì ðÌïJÓf $¤ôr_LùÎ7ü@5ôN3c²}H+{Mç©õ¾‘®Vkç€ûÁ"1óÝñ±<êàx¥VÀ§²ñ7â«U&YŠÞ?š ΚeæPÚ—÷ ¦É3ï Ì©øCŒÁ þncqìŒì¼öÖ§×’Ôµƒž.q—[’FÈÄ“y–"®,(Fà3É’ *Æ}>… ¨¤òz}5\uyƨúìP@¤[Á•£åLSí¹°ŽÆŠ¸Z#SJ‹*BÔ×ÂX”VM+É_ÿbNéù„k5( •i¶´ÿwü!À% “¶-ÁŒ(ÖQ{­b¤SVAƒòÑÞcÜž‡o™¿”dÜ+DäE¸_BCYï¦b @L‹xÎÚÂ*Ð9ÙÃä ä¹Cž·¢8Nb}Ëf@-»Õ¦ô‡ZbXTÍ%ÀK®©ª?æ_?b-¿NÊš€zÄûóÒ÷¼ä¡»ûî*B‚¤ªØ±%þ3mŒ@ÂëA]þr± žï °¡š!ûýĆüµ3)â‘Wñ˜ÀÛPüõSÜÀ4Ô'˜C½Û7|fÖ ¸5ª44ÔÕuAÑm‚‚-㦡³ž)Çó"+û;èîìVªáÝFü@É(J}Ý¨Š¥¸J6vvLÀÙ'€‰Ý^´mè¼ts0ÅgZн¬´vä UXÎ7ªŒd{2@ZçDà¶åÒ$R^2üJtVi-E'ǧ~à^RGÙôu*)—:è@[gÒ§D=ŽBh;÷)!6ëõcÓC<žN#swØOÚYC¿¨¹l’Ña°šÖ橹ÌÀÚ§0í ÁlýVF;ÓÔ9\Zb·Thg&¡òF˜·-bdK‡ÙªuµrÇâ­e?nµäbÙJû¥oôÀÕ2öêñ ‚£'7j‘œï£‹îæ(}åjʇd¶9Ú†ƒ=Óû¾éX9+œ>Í Wuäf‡`_ð)wž­ð‹ÇÄ^O¼t«¡õb¾rŠAEjkî¿;M0{­æ/2ôYý5ôiqJœÚe*âÁÎù>Eì#¸x^µû¨9N¤ø„EYSWî·‹Fù[RS“íFnvíûãP½+v•i<­„¥ÿç‡8_à`ã`wŒÑ¢â˽Ì(ÁÌ.ë´ÂáíëèÁÌh7IJ™ï–!‹­öé ³œÄu8|ðÄUºX&ש¨• ÷çRv+ì³'£Á,®A±_ï׆"!âÛ³2õŒS”¢Ç+XLI˜p—ô'«ît|™ààÊù13Îâ›Å¾îÌÅÌ'w©™…¾wü'\Ô†.QF¢gºG|ûœ(8‡ÊÎ_üºrTCÁ3*^Þh¢êWôqkw2BùD‡ÉÐ÷´Šb½ú ¹ä¹–ËGͯ€«ÝP £ ¿{˜èd¤èôº·xÖ¢ I•‰ŽØ2›U’}Ç [1(ýƒš¨Fh ¯D±îAÙêŠÎÕ˜ÃAïSôx?¥uý½_§uHÕ¾»dõF+5¥^r;X2.|ä.ø<¼c`…$ƒ@‰“h‰é6ŽëÖYQ×°{“ósmYÓ€a—ˆü ³™Ñwt .SÊpµ,ˆ2ñƒ ßêžEÃnôÓžÉyæ›Æ48°PÄ…Z|‹ýTêÄ)JÔÊN‡%”|?ëaïØšm±’:Žv‚»ËÀ‚L>MPù+ß[ë̉ø%ôWš“rˆý“7äoóòÀíßå¬ nˆóXäþöY»2á!3 ®x+1 0åwŸg®1sóËÝûr:>H<xì6ý}iIÍØgì‚É!ÐãBw'RÓ‘Ä%·ýƒ@sáùYä}Ïj¢ùؤÒ),b©¡ Öty³L öO@6ƒ~N`û‰ÕÒp·Aç†5l ô8ÕjYÆÀaØñ¾ê”2SÄ7Ok„”¯?üÅ{¬ya™Ú¦SÁMm Dã9_?Ž\ŒšÂaR“YBÓ_L_±zTü;•œûàs;ßk_?M;oí#,;€œî[9­>Ñ3òÐÖ@é±UåØ ½vø„µØÅùÎï§–>˜ÊÁ^FeæøÃ¦Ù±16RøÏ›>ßÌZz'»3¯¥‘&kÆ„u؈+™Bˆ _ÓZ‚(ËàDõÊ´Z6ÕMúØ€Z¡ÓáûtŽ¡Ÿ" [~T³;¬s;8¨‹‰•HãgÚB‹ëoí÷«wçÝÅ÷‰| 2à¦L]6zGÂæºÅ3'»<þê€óCLõØlÎâôZlì3î&X†òàëKrÃ|ÐïZÞŠ]¸¨«<,‘îé©6"R_¢Àç'àÏI8£"Ì™ú:ZœP+€‘ÆC~óÕgÜâÏ Ì#vRݲƒW²r¢7ƃjQ:\úRYŒ*ìÅÝ‘Ä#øþm“I'æ²íV¯¡/;u%ó\ÿòã„Az­°N¿.gUº?ïG]=^0VÕY[ÚVWÎ|š²v¯+újxûa~i¤¨ÑöGòS4ð13àß”©³b>ÿCF£Es•-èå<%EyÆ ^ë9¶¯õ fjz€¥|ÉФ"]”dç,ÄUã©ÎÕŽ’ÎÒŒëf•¸›`†–¨æò6xùMdËï§¼ø~½)B>¥îET±ªç G—k§(ØöÒ§ÿ²ïœxëó_pÝL±`Î?ÝÏÛïZµÇ÷”þec…zE7„H®êö³Q3þÃéCÙ1õùØÃr†ÍÃÍ ‰NÞ"ÉmÃBuoðvˆóë8¨ºPÏ-Gó33»±•ñû.Bó¢B{]¸7híUÃͯ†U¸ÐGÄM.ˆ§:WWÄys®—¯‘Eî믞(Ks-ꟼ‚……²„Š-IVòäЙo N¯þt¦>i›‚¶Æý<ÿr& ›ÿëÚ_qVâÝܺw<.eÜ~òWTø~Ï©zcëÉíqzÜz)ìHsñ…=79J%±óí–¾ƒ™]MAæ'lKòfOï+¦4i‰›zâ%·9tvlʲ:„aJéÒiKðGàSê×SbÚ‡­DRœÍTí;”É4QK3M-¤¤ÐWLË@ô‚šf+ëÑbbùUîöÓcE$ØÕ=§L¯CÄRöè<“þ¥„d ¹æ®ôøQè?ß³Viâól‡z¦"UÃQhxYÕ÷?Ì˘wïlüÑCų ƒ•€s˜ÀŸEI#M…én»„iü`e¼·0Ý5Mvgñ_æÄ6œM{AÑ™)§0k“?NöÅ´ŠrÍaM±˜/è–þ(MóÃ@¼Â—¦ôëŠ#rAÀ0A¶d[Á›à¦ã’$g ÎæG¶½Ò!ÄÓÚânèå"ùÅe¨í¯ø‚/,ÍAm6° „rñm…Øòìi"lµY»¨eïž'üw¾ tOILúñäðûÊãøŒÇ-ãtN¬ínüP½ ÿªóóy}W´ç­:XcÛx[1¹]„æJm¨;Ž)- Ïѯ0}ðÙ‚=o}•t³X?’lˆ¼+ö7)ÝÓHNñcrDY°+×¹ï?º$pJW%ºÉçÃww}˜~2ã6©ˆ€ÍèÂ)øl~pH6U0úœ¬zãèFZ]}B\Î C¶/öBÕf®…5*Ï%#dðPB£z»û’{_†r*³BjÎp6ʺ·y?²1RÇï¹fÂu-![½?m†Q¦&ú_È¿ê¢FVá⺷ºÒVû“GñÜzãbüŠ$¨†ÑRß8iï+ ¯¡ÉT|,Ãì§6*@úuèŒAIcà¸xK" ,ñZ0°+é.bqã K–œËáÆYÁ­»²¡öHPLzyPhÅoñ–Ê#‰% ·ug8ËéÓ'ȆȬ–`’yù ƒD?:Šh?<´ y‚ÃÔLø«“ -W¬Øô³lÀüé§­X¤Ä:ïVXâ¡1GG´›Š˜±›,5sÌ«^ù‡ 3éð®m[¡*µ‰µI¿Á«lß§ªS­QÇ¬Ž¢|2šD£+8fÇ<¹TI‹Dœ%°+,‘·¸ß†§^ýPéÿ‹¬rõiˆô fVY÷ÈñMnê ™…ܧñ¨o_Þ#©Ÿïp?˜cˆù(ÓÂÐCEbØãÐÚ±ÉÒââz¥ ¸q¸­Ð„9Û-3Õ­6€ÅÚœ{žG®)×O ¥#mZ¯‰V+½%¬“¾5ϧ4FV®½æQ…)–…Ét‰ÛÔ5 ö” ^nzB¤Ì`©i¶Ëá6õÈÖËȘ¥#ríXœ…ü·E×%vc‘keÑ6¸ ٠̬çh¶žZìû¶µ$Q÷md•¢¬ø2ÖÙ{d$6ß±Þ^Îr gÞ=B3<íÛ‹ #œá— g¯£¼Ø;ôoì4—Ò¤{y(¡ï^ ×}Ö)Ø)Ý@{† 3ëÁܺ´¢i‡ÊzÞA*={¥"è}ÕÖs&H243,¦(1"w(¤" â_þ!ñv‚ùnÌÌæ¥‘$ÈyÂYßpÁ(1RK"®r{ðø*Ø‹ÏÆ\ý œ‘þA­JkârCé0}ìÎD†©ã¼߯›#A\e¡÷¦ÅQ,vÚŸ–»²MíqáN+CRsûžÃjï˜Ê‚ª¸šÉ9í³êwÖUr–±f¾ßÝÄ= I^ Ma'\„Ç`§m¢ì°>Æ”r3<°ªô˜ûTï~ÀÏvKßmɳ§xwqÌëzcf´»[žFAØÜGÞþÚA%kn~\Ù󤆈ëÀª!Ößæ×?ÁÚË:Ó:°[šûL5OÙð[$¹S¯4í¨r—†±î C;ö{JoöÛbº‰Æ[mŽE ‘g¼eÌž jiˆç1P‹Jx¤ù4ÒÎËCÏrJ^¼’¹c§oa5ñkäí¶ToÖ0¿ä3ÈbFg¨ê€"çì·ç¦S¨dpÏ–„m'UÉ„DNÏì]"ÀÒ~0Ç@·'àýVÇ›­~ÑÕø§ÖùǙۿifyͦ”L¡¨iˆ.;Qœ ³˜ÈnÕ^á7žÐæù3ÿ[ì—ûr2àø"–À_I©ÿÁZ†ü$vÚýw5¹¯š®R@Ðf[ù-òœʬÓ#×F$hl¿2Ý åð䮑Mšÿ÷ßmÉ>!øàd‘±®šZùïðÅV[‚Ͻ0™éݰ Áyt(÷=桽ô¬5ªG¢Á‹hmÔ7ˆH‹s¾†´eÍö[’Zî)pDŸtÞŸ«Ì‚)Þñ¢ÛšÊ¯Sãxæ,ÕáÀ˜¾ÁLvÑJ—ºœ4ÿñÄ.‚â„··zç‹òëÆ“¬z}kñi~ ¥§ŸËüš£/¥ðv(Û~"šóÕkçß5üÓ½ü  q8f—Â|ùþ>^´ wqlù‘o³–x[|àÊüô4~”™{X“Ð+›Üï!Æöº7»S­ò?ÔÉo´`ÐXpY ‚OÛ¯«É?%­Èû7²$#¨ÿ”?yà6sÚ¼«… £=)oäô+^Ñ·¥‰(a÷n³.C‘æÝ°M•ŽM:[ÞƒC'éÁ.åf¬É‰ü„g–÷äñFû•//V ª”êlwwÜÛî9vA«ƒ:ûæ+©çô¼¬Œø-º„`xê3„æ)îe¥•ØŸÆ?â«ÐR`*ƒ€”óú¬~™fÇ´}ègZAþˆ¯"@5­G7f‰ÄågiÙv>Ýñƒ*Ÿüm–É»¿Ä¹·â{Uº©¶eu×¢–[„’õ WkéL.ˆ0syÁ¼D§ñ0–}Ç™J‚a(åÛDZC9Ý­ºŽý‡Ütqó^åþem­ V_½³žT%æëZtU ö QxEoCÑœÿí|s/\5oV{N‹ÿ]àH;ýa1¥(ùjNcìõ!ßæÓ,±õ‹7›æÞêfû&ʹk/×'2 £°L”—c@;þÌj]º9‹ÚRe¯· µN*³¶‰¸4¹&R6{§@ÈB}WÊÎ"½±-À»À9(†Ž ˆɸ I§¿¢ ` _8Ó¿HVÒYL4»eù& ´Ç“_nUb.Óu•wAÔÀ :*œBqdHáÏ0ÀG0­Î>{:%‡Í_ÚÓÃGM»iiß,DrîZ‡œPÉæ¥¡XÅ…(ÀM¸ l¬ÿ¯Éo×Àÿk÷RY²˜“abšasõ;T?—8’¥¤TÖNç\ˆX„4,‡7-ât‚Wýqݘ8â„UË4s°»_‚ɺœ˜K¦Õuͽî’ÁÀ¥óÏúþ0Ù¾ä>¹—nä·­qŒö*eDöÛºÜê»ÇÕÄbrÞˆìµF† <óýhs-î2¾EŸ9:Ým.ÿå!›YN=‚„’ôò¿ƒ®)sóŠº2¢-ÚOq‰‹îó(ÇßÊ/’VEÆ›Mã3/nªš\6û£yæ3?Û0ªñdhú’9M/Ö)¬W¼S¾Ýo†=ykGQ;ÓþÏ¢¨uYfÊ õñ^ÈXLz­Fo ‚^xjáS´xûã[‘Ñ»¦6-öŠN.oÊÍ«üË‚]Àïs8ÐolŒa‡ÝU<-øq?aº5ìÎôKNT8®ñYÞTžGÿ_UŒÏ_'b7[ÎìLßE® ‚ö¡°ÀùL_Å5Œ]Áÿx8P˜s‹¼ÑÇÀÛ~}—øZ†Á'ž‰Ç Œ¥ø1‘{ ëÝaú¸9É_ʺEÂã¦OÄì—(–?¾ÿon;œŸ¨}s„¡x}FƒŽËq˜h¸0Q™îן7:éF|W£Ð1 7X›Þ¹ºˆ|‚îˆö§¾V±lªˆfÍ|KÇl%7 2[^É.ƒx©óš÷)­ãbƒã±ôÕeš ’9|2ò¦î£Ö/"À;jšœÔß}±ò,½­ÂÉ5U1]‹iÏ­™ àƒD³£T»ç: Ëf·´v§‘àÞ·6?\÷2g{tÔ76]š‚s ­ë*#&Xe@è:Z­úÖWWÞYÞ º§Û*q} ^±]ÅX-!÷p´NQw4@ã“P\$`¯~6Í3IÑjµÆÑ & ä:ÝtSà‰6ïskS肦»ÏÁ¯ŸTNÀÍö¦ § û-r·¤ šë#HtÖ0NE£›Ç’C.<|óD[ö”—ž_ Š÷hüòC6d¶•>kµàG¿.¸NVR_‚šéׯu8Ößg´’Ô‘Š÷ð^bT„Æ6«ëˆV38"·é‰ë°?k¢| áÐynly) |vŒü „Ñ'²¨?0=Öà:ÀqBªËeæâ™àÀ÷£×Uý¦V'ïÿ0ÊGÝc©Üú’öГ>ì}¼Kh¤_+/—½ñ÷ÆÈ N: úg)+²S¼ÂJ/,¶ ëAnµG#¨Ádâ.Ñ…Ëòta»ê½°‡Z?xÐÉ›Î%ÁѰh7’ép«åP!" ms,dcayqÓÒjäTº€îùêà\“H¬î[${ïæM¬w…I[vdëXðlxÃUséõÈÇ9Eå^MXžÁ¢åÊ “Ý[Bq$óõ±‹Ú~ bYÇ̱íWТ\Z#2% -º§Æ<¦DA@q<¥ –7’Þ-céð&T)¸-1\ µ·Ô Œ2AØáà‰Tô…ú¦ç‘Âï40G¤oÍ8 ÖÓäŸüZ%…är?òs-w\¾2bÍ-zUˆA|H9`§nر„û8ŒX|‰$½ÓàU²iw]ÐóyeÑyo›@„ÕVƃŸxßÔ¿‚ZfQ¿îRÔHõ¥…/bÂÇéeT•šC>„ ¢?•l zô\À\§°_ ‰ /d3Ò73ršKá%T Þ_ï6Âfñ2†•Ëc\ùÈ‚3g‰yÂØÄ÷ZXnÎöpI›+)äSÈX³7¨€2½ýhc›µfÞXæBþÎþ¡2âÂw†èÃð{·ÕÙsGÍ;/¬[ìežuúÞ¦Äއ¹”L$¸¦dˆUõ>ÐrVYXÂüƒ)HÞl\qg¥ˆN³–þÈÝb1ºkH#a—0Ê)gÁ·h#ÖøÙ ?c=³ò?óeU6PžH äšk…¥ìÖƒ¨à;ô³e‹1 ¥ói˜d'ÔÁzd_Ùo`ÁÒ—dû_úáöÑsàS.‘Ó·‘¬îüù,€D¿]ðxEË€ÈÔèæ2d$ÞÔ_¦ÛÇîO©ËF†¦C‚•À²0Pó§ɳyn‚ÒîÔ7’þ8¢Äƒ™Å”]§öŒ?Âý»‘ƒea½0‘Y/i[_1a†˜ut»ñ»¼'(æFeïÁ6EœeÝ΂ºí*.ª§VL¶RXàË8µWñrïú;Û°#‘p Év#ÓJÇ&sù7É;!Ƽ¨?ÔÌ|ŒH¯;k¬Z&O.:ý`U ¿t}ZÍá²E*Ò×óÕò‡1èµtO›UãOU­!ÌGLÛ £*yæªÌ:ÍÅÖ¦æY$ãD‘¹èJÁäæ½V´ðqì¡DñSÉqß}ÃHý¸2–š~Ä£á­çÇXØLN­&Æûø'^‹õ=•i"…yl›à½®©èw=Ý4Ö´ÆWÁ[‘ÇGƒÕÜvÑÅ´)Ç)ëFìQº24JØÅV`4S/ãЫßEÛ¼v-? èÚ2}þä%aöÿÚÒ¼­ýQÞ«(9“Âë¶5x¸‡/\kŠ&ï<æEoÎõN6á{©I¬ƒ<’›þÄÚdBT³„Üî™ o—å|¬\Ä<(¦ ûU³¢ökSª>yoäÉC]M#»ôU\%’Fçâ£n™ú­m¡ÞôñV?6‰¢{6w±SüÔâ1^Z㜸U”rù‚ø#+!ïRlì°W—g8ÇZÙ÷‚…«lóÐI}ngä@“Åc‡ÇÆr¥1yqO”RÈ—½¥ËfñÈÓÏûëGã‚lãä\ÀŒv:ˆó‰/¦b_¥`'›#G¶ ô_#uýJ³!ÀY~‚p)¾Vq® ÷¬·†#zÙU)î­ý}•n{Qñb"ý·{ @²cz¿;šŒÞß28:æ # ±cë‘ÿ××”âo%]ä<ßï©:ÈP}D¥^ffH "3üx]>ý Ï•ø˜èáôy b#ü6çÿ:ôøâ{ŸÝìÞ¥3B’²ÿSÄI¢¬tYñr¾ÅÏÂR%»5Ž »ME›Âè‚ÑÊ/B’œýí 9µ®2!ßISaƒ#ÚŠr¿Û“ƒÿMU4;K¤ަÛ;Œ)Z+Y×öÅ>¯ÛúpUhì5“ZñY¢–À»ûªÄ½zϾ‡5Q÷ýÜìØ\y±R&êá¥8Ú~@*D€Dš•ƒ·{ÀRlZ°’QÝÞQ> Ë<½%» ‰3GkÌ’Gý[Ä%êL\~»&»¡qyz‰Öqî¥fu- lg@¬Š~;°-¹:ÞLa¶E›ÎnÉ(ú€/V‚d­n‹§Fø¹ƒ”€X*0èÙÀ5-ðþÚN#ìdáîW­eÖÕòÁo èLÑã¡’èc}g‹pÑÊ?¨¶(r4vÆizá¥è`:œÑÛ¾Ù> =d]¾ó ïö¢ÃJC™ LíÜ <vÈaý;T#+bRj/7Tý=éïd£F¸¦e|ñÌ> AÌÅ5ïØ{˜ìx_|7¦¥VH;z+¶õ¾âÝ/çÏö@!™jó í£¿{ñÙåîþÚ¼óÖ¯á'’&0ä—‰¦Aóá’&-»z?šýK~áÜTêšçhBÁx=>iƒNšÖ“ÆB/Ó3ž|– QUü#›oÂõJÕë'ŒØJfWQG9ÓI#&']_³\`+D cëeŠ{d›OQC÷%iÿºÝL/uÀ rV6/<,vQx¸~vgyÞ*OôÆ+Eÿï?jö— ×n•ÆgZº¦6#Œ0Ù>õJ#Î1dï œÈ¶lP"1Ãk“Õ0²«ëß»TÐTâüIÕ •x»íñ&ëâ…ý•˜"‡ÚÀü4üNqôP#@WL‰ˆoÞý·[áWk?‚×y1O¶ –Y*V¨"d$¢ÎÙ.ѧÂSF¥Ëª¬†J v-ù|ò¿0Dø¸e R(`R=„eÛ|`"ÐcñŒÀ° vûŒ[JÓ]äîÿ2®´b;0<™þÄ­)Mi´m+Lj@W¨ñIÕûŸ ITÆäêtTxÊ„©_Sf¹Û˜dæ¯Þ(hTN¼`Z±£O;Å ­Æjã[[ ²¾?†ZhŽ$ónNÚäÇÉ<ž ïG~Ž¥OÎëSŠ ‰ºæûÊÔÓ_ᕵ‰ÊÊÌYÊ"Žé=ç½Oc¤N‰ç_x p£ŽÞÈw£óDxó^b0s’Ɖ¼ÆôŽáò‹‡µaý»/ˆÔƒ CJà*ð£ !ÂR«¡bò}$—ÑF,óE¡´§×fº²Ý®ËÜ=\ ? FöE¾ú1 ¤RLÚ„¹]óUíÕ2ÕåŠoLCä’cäàªú€w‰r:Ѓ4ûöêÔŒËò§îòü þÙø‰X²3™ÙÂh5Bp«tkók™ë4—)O»úÐÓsQöéB7ßeß¶°"5Ã`œq#¯¤I³¡Žßº·ú5öË•RáËõÌ€sZÅÍUÙ]ϾîÂ)¡Y”·úÌ÷kÿõ©§á+#éÞ‚£"˜ö7L:f.2o¡‚DVðN…ÿ¬ÕŠâQùßßsÆúÕS“´` £Ì4E_M´S×%xÙßÜ2ààô–Èø_¹¶˜J}ŸÆ©:H··ê­ÔöFBI§,ÌiMmÔÚÇ G˜i÷}RüLŸ¢ ‹{%y=ÃECúÿŠJ¬Ý(!,‰¤ ‘^ÌOÊ—jÀU7ü'¶uü\Û²ÉÎk{É *©x™À?ÌÄ `¨à-Çà/f.N4žs÷¯ì§ŽäG¾€ãÄÌ©pUôZ¦‚pNÙ––ýðy»3ù®!øßztªëtÐÍ„-R–ÚЄ°g|ÙÝAWøJ6òÍ”}½"ðaQÞ«nôv’}0y¥|xéWýŒ4!#ÂÞ8Â#'¶Èxêù|ø×ˆÿJ×ÄV£Ÿ²î.ûÏêÿ“ ß:ò¤™úlõË||<ˆ=áŽ`aE¾’JŒU(«‡¸-p1ãµìôy1 µé”X,JM’%z•I {5¸Dç~sà‹i•íò»ˆ ^·U5s"0a é[®)]}Œè ¡ 6ÚÍ»Æbðí!•?j¦ÜÖÍô#`„;Ѳ);¨ zèñ,—¼X´måÐw!Í뼑±ãNN›•¤¯y \>ŽÅ÷j£k:±«+€k³¡”ew_y¡SÆôn@2f™jnÿŒ/S¾-- 4<œ¤ë7úÂZx6T£”‰¥Zg±B,D³©Ê¬dÒÈøÄ¾G¹ö”Ö˜ gµÄ¢1¦ÚÍå[ýÖÍìéé¤Âd¾ÐU‚zL,E66ŠßZ®Ÿ x¾y88m·(å7ËHÚfGaDà÷y'ÂÐj²Ÿ(‘é›`¿ ÑÞ½<ó{zÊ!eæåeÉ|²¸á±ÝÆÑR²èI%ÝxÐ2†_A § âÑʽŒ‘i†5°Žª?UñÕc(þæqo<°ÝÔ„Éï ›h‡#lþßÍœQE[bÉìr7t¼ Ÿ¾%öy¬µ~}ÑÔ[N> wçÚ®ú^¨ÈaÀê…hö—GS:W?ª´îlݽ˲ÙZ«rÓ&=ƒŠ—ê6¶˜-²ö#-ÿå?ÝcßBÀۅƧÙy¾[îV°‘´zž Š|ŽF¢bÄdmF›×õ5ïü'«ÅË®b‘O£Ïþq¼ÀÈ>—ÓÑS?Õé,Ë]Szhì—f³ÅàþÝ•|ÐêíVê_‰ñn¿.%kRÁ|;C"¨+MÜg^àUî%Ù˜Üo}8mU G&Äg÷øCÈឪI¥'išãi’\‹‘ã¹¶ û „åcKKýÜÞ4}GMðSŠýXFd(‹¢uÎuûÄ‘ÍOÕ¸—Áð¿¡g”ß †söÛ¸÷©îP昊 ¡Ø‡kŸÞ'ùÀ2¦9›!ö¯ä¹í†%p¢®±¤.êiFô£ä ¥ƒce„œƒåö:qqb<²ËÈC ac6ª”Al ÷ÅÁù›Ï^‹‡]÷ÀL^pŸ½ÔÞtý:¯v,S‡ã\Ù„è ÇÛQÄþéûžJ8ù Ë=ŽÁüýÍåÎ×øŒPyð§CÜBÕ;X÷úI‡½… }¡ëmëÃíÙ‚Cé4ÇŒ9°èО@ˆËaãe×u«én{êFÐQ÷¨¤ Ù•k®O­Hi^ñ!„;oUþ“é ŽIªüpjõ¼ac™ŒwÔ†cà ¡8ò¶ÍxHËR>¯ñ3ôئqxf м°ñ4LFª{®ÑÈQ7Eö³ =ý{U-ZŒ³ÔÁï×Ýàì˜5ˆž‚NðgÀcɹ÷wQ© šðA.e¿Wî•Xð—ìɦÿ¤s`WR˜z|HûL ‡†ZýÆW£«k…¯Ùöz©Ò}„5ÜŒ®ÄÚÄFG&ã?ê9ï=(jo–¡m=Åï]·yNël‡øq ½¸m_ãëõÇä°.4îzhŠõž‹ßÿ~†Î=¤ùºaK¯-g§zÕ¢Tt’+»<£6:­ —¹ 9ÔÜÂþȔΜ¹ ïÌZ„ã¶".è2u]å¥0¸ÒaqúgÄ$/Ѩéæ#çð­Í4xDô+lŽHÜkãý¶XÍ*Åô&­@Ã~å– øÒD϶g Ûí¤0ã\Qfc@0‡iįÀ:r›%œ 8*·ÛŸNtrøµTzïû—q´ä&W]W…#éÂé¯@é0Bv•¥K~­‘AΔžH[”ŒÌ¯ž·œfcr›Å!Ð1×]¹h°då€sÐ ûúâi¶ïΛï Þ’1![Â1ã\9 e˜1~Ä(}§½V|¢²¨£^9Ü3 ûÑAš¯û§Z6ïdxÊõ»yÛØ{ör tƒIØi&Ѳ·²¿Tj‡§@ïaB㪋¸i 5ü©¬¼˜º‚—¥ÚqBtøÎ@0È%"¥dÁ¡j#ˆk Ô% )4º±zÒÓ–dñ¤¢æÌFÑ Z–8£gQV4uʧì»)DäMBQÁX›XZ5iì+/êBÚPü… 5±ÉÖ k_nÓÕã”ÖáJèš›ÜVÑ¥Ìzz&67NDܺÝ׫É-”¥AsŸº5ñjôŠƒ‚ökHr¼ˆNK¼L†ç·×úŸÊfÉUü¹éˆ#©£oö8k¾Ý rÕgü§9.mTÃùŒG“v‘Iádø1Z܀ι◄¤¾q’«4oRÑí,iLvýç­Ñ; œm q}£P–÷úy¹>1FL- !¹îa íFĤ÷ä…å±°. r‡Æáû¼ë-üåžA÷ÅñÞá*ßòuabQóCžF“d<žždZ¦ ä|f,þ’w‰œ;òª}ZäÍRµåÉòL Ž/p2n9`ðÉ¿/«\8nx5*bàÿþ“AÇrR‘däŸþ•{*êB«°6íVJ ­èîÊfÉo—¯a›:e„H8ºSxèZÜiSm[2L…fÔ—[ùò—>˜¥PóÍàö_ „ÅæÊj‘Y²·ÔY\vS­FænïÝB雑Ãíz*¦ðœ\Ž]êoãß’o.¬|#]¬ó¾âfÓÒÜí|ºçëK”Bü9 ìOKšÛ'X701¼¨ôbÿíý¡±6ha,!—ÉÇ ºæ $@ˆr÷ŽÌ½^#Vq5+ÓNZF ÚGs”gênñhï#+Êè¥mò¶ÄX$Ü„:®pOAå½)€t8©²w9¤üç`Naæ¨ ójb߆ƒ¼6ˆê LñçDGÎðõÀ÷Æ öC/ ö·RÀx—X Y&­÷ŸÞ’Ñqå.ÍüRNOä\°ˆBkîMHLB‘ôs»Ÿ¾j+ˆyÛIœyMF¾ÖoÌй«r Î"y.€ãð›«Gžû 1ì~­Ç^Pe%?ÿL}í*ÐÆ“>¥svaQ¦.pŽ9Árö¸F?!Ž©%¹†2¢uS½ÏÕÞw˜¼úý-¦“Øá›cCHäN4“i åÝ$ VÑ>õPÁ^Ö'&Yïqé5Deóêg``¬¥Ò¦Üú)èæŽmLr]‰¯ãå>3žð˜g€T…Õråtò-ö=I¡jxTÇ]{ÆâûøQv(ì|7¢¯ ]à)Ž©ôØ~âϬÒn­6 µO~ú• ˆ­,kŽ=I_õ4Èúu­îŠÏË¢Üøæ¹c¬Ä¨Ó‰Fõa¤¹…ˆ= d!H0Kªÿ’qx»ceH2¥ß—æ l`tMZXêsØù?–8(HݸòAjùí|ªË˜âÀ5ùO »­ð£ Ï¸¾yó-…¶z˜§}å›rá~ŸlÍ1á¿|Ñ̉ÙíN·_<âh¢C€èËÉ‘‚÷â´€Œ»÷ˆR™Ü —戒¿ÚY5ÛÚH D…â)O‰mÜFij¥¶û€,FÒöÙ.8£R€µÛmêÈ{fB`'Ýà«ÀqÏ‘e¬!ÈN“ì5y‘þøj?6–D™¯ªŸŽ?)1 ‘j®wå8«åÅW^0ÅH‹bOëþ ­ B1¸µÜ7X£Ng}0QöˆèÃi§`îyi-íù|±dlw·©iq­Ik>O.ÙŠŒr\ì¾:­íñi'­JžÔQiý×Ã}ˆ»¬)ÆØu¶>t“Žw@¿è·x9བྷªÄ  ÃBÊÚoþ‹é¢5o1À»8QO‹XT•.ÃdYuÄÊ€¢íŸ8oëÐ\‡(?§ËKZOÉÖÜ‚Ê}õu:açܳ3¸Õ2­IÕf}¦I(9áþ$$ìŸ/–âÃ[rG]Ûµ]{B´¹ö¬Æ ½G}¹NoÂU"µäæÂÌúhέšA7Á¿À˜‹H9öÙšÓ!™½µaY¹¼Sed¥.*k´b´ãXùØLM–ÊÈpšOÄàIìß!µE+¨Å¥+ ˜L>­ÇêÀÔ7îÃâ éúŽìæC‚neÎjÇbß Ê¹"˜ß¾¦laè1AR"R¤Ê/«ó–âä4¨÷ÍýL¦CÙn/eüh¾×FÆ´Èh¶b|MÅùÕÚžW ƒ_œoîÌñ|jÂì8$0ÁÖðÎqû q3íþWWq–¥{Í‚òÜøê`by2ÛˆhZY•îd6<³ 7ÉÐâ 8+|:&nÏ=ú¶sQ!Qt™êßON½IψÍ„}Ó’–ŸD;æ ï<ͱ“T—MhÏD±~oøz#Ž¡nÜdRòÂ'žƒŠG ð;"ÙX©ÓwP‰fž¸œ72ïÍÐé¿æªn(‡Ô'd7CGÚu±^uó5}›°X`× ³…Ÿþ‚ƻŠ´§‹‘îC6 .ø"t·Õ_ÑÌ^!9_é‹¢åjå^n±ä {zÀ…¢5Ž,;Üù[_Z”GAÌtO©L'\~4ßtÖŸJNIùoºöõò¹¡¯ÌøY/ì\wý:íNI ©¬„ø%2Ðý9ÊUüqíðˆyÎ倯´éÝáô9$f ÂÀ#ó‚Oòã;x;ç Pi”ØÀüÓ ØžÚëÓ¢kGð½t«ê_ŸÈÚ;ñïåSómyhóscu“'ɵÎZ¼ï{RÊo ‘Tyά€ŽYøÅŸx&ó#ªP„A$pÈôsIFf $ŸØn9mê¯^aÍq:\ÀÕâ_ ^WþFH9mì?¨KDëq^¤Ì î¸2néxÑl·ò=—ßI‹Vǵ±•O \†­~%‰ÔŠÆmÒd…X£2ïŠx%ñW¿§•Óºû\Ñ3xËÞ¯öRD°$Œv¤R²l¬A¢¾IÑ­­¶æÅ%?†=µ¸¬tÌk¡Â/ZI/•¦â(ê•ö¡ŸJ‚W¶îÉuxz[×Ìã¸}îÚnb  UY"+Ã1žâÉŸèò ÕS»"ý²þ¹"Fg$ù âÀ¥^›õtŒj> U4bÿ ?$ŠÚtIø£Õ'll˜¢?e¨5ýŽ s›Ð“N¡î[­.;.HûÙ E¬Òé™EãÁÎHŒ¿»FøhhCµ–ÒUµTÁƸ*ƒñd~û„p‹xíÉ1?ÐzùC RHP]Ý#àÁÜ4ø@¢÷wÎcÓ×p¤Å€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/type1/dcti10.pfb0000664000175000017500000013535211742726711023434 0ustar uwabamiuwabami€%!FontType1-1.0: dcti10 1.0(Level-B) % T1FMT, Copyright (c) 1993 Basil K. Malyshev. All rights reserved. 12 dict begin /FontInfo 13 dict dup begin /version (1.0\(Level-B\)) readonly def /Notice (Copyright \(C\) 1994, Basil K. Malyshev. All Rights Reserved.\012BaKoMa Fonts Collection, Level-B.) readonly def /FullName (dcti10) readonly def /FamilyName (dcti10) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def /CapHeight 683 def /XHeight 430 def /Ascender 694 def /Descender -194 def end readonly def /FontName /dcti10 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /grave put dup 1 /acute put dup 2 /circumflex put dup 3 /tilde put dup 4 /dieresis put dup 5 /hungarumlaut put dup 6 /ring put dup 7 /caron put dup 8 /breve put dup 9 /macron put dup 10 /dotaccent put dup 11 /cedilla put dup 12 /ogonek put dup 13 /quotesinglbase put dup 14 /guilsinglleft put dup 15 /guilsinglright put dup 16 /quotedblleft put dup 17 /quotedblright put dup 18 /quotedblbase put dup 19 /guillemotleft put dup 20 /guillemotright put dup 21 /endash put dup 22 /emdash put dup 23 /compoundwordmark put dup 24 /perthousand put dup 25 /dotlessi put dup 26 /dotlessj put dup 27 /ff put dup 28 /fi put dup 29 /fl put dup 30 /ffi put dup 31 /ffl put dup 32 /visiblespace put dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put dup 127 /hyphen put dup 128 /Abreve put dup 129 /Aogonek put dup 130 /Cacute put dup 131 /Ccaron put dup 132 /Dcaron put dup 133 /Ecaron put dup 134 /Eogonek put dup 135 /Gbreve put dup 136 /Lacute put dup 137 /Lquoteright put dup 138 /Lslash put dup 139 /Nacute put dup 140 /Ncaron put dup 141 /Eng put dup 142 /Ohungarumlaut put dup 143 /Racute put dup 144 /Rcaron put dup 145 /Sacute put dup 146 /Scaron put dup 147 /Scedilla put dup 148 /Tcaron put dup 149 /Tcedilla put dup 150 /Uhungarumlaut put dup 151 /Uring put dup 152 /Ydieresis put dup 153 /Zacute put dup 154 /Zcaron put dup 155 /Zdotaccent put dup 156 /IJ put dup 157 /Idotaccent put dup 158 /dbar put dup 159 /section put dup 160 /abreve put dup 161 /aogonek put dup 162 /cacute put dup 163 /ccaron put dup 164 /dquoteright put dup 165 /ecaron put dup 166 /eogonek put dup 167 /gbreve put dup 168 /lacute put dup 169 /lquoteright put dup 170 /lslash put dup 171 /nacute put dup 172 /ncaron put dup 173 /eng put dup 174 /ohungarumlaut put dup 175 /racute put dup 176 /rcaron put dup 177 /sacute put dup 178 /scaron put dup 179 /scedilla put dup 180 /tquoteright put dup 181 /tcedilla put dup 182 /uhungarumlaut put dup 183 /uring put dup 184 /ydieresis put dup 185 /zacute put dup 186 /zcaron put dup 187 /zdotaccent put dup 188 /ij put dup 189 /exclamdown put dup 190 /questiondown put dup 191 /sterling put dup 192 /Agrave put dup 193 /Aacute put dup 194 /Acircumflex put dup 195 /Atilde put dup 196 /Adieresis put dup 197 /Aring put dup 198 /AE put dup 199 /Ccedilla put dup 200 /Egrave put dup 201 /Eacute put dup 202 /Ecircumflex put dup 203 /Edieresis put dup 204 /Igrave put dup 205 /Iacute put dup 206 /Icircumflex put dup 207 /Idieresis put dup 208 /Eth put dup 209 /Ntilde put dup 210 /Ograve put dup 211 /Oacute put dup 212 /Ocircumflex put dup 213 /Otilde put dup 214 /Odieresis put dup 215 /OE put dup 216 /Oslash put dup 217 /Ugrave put dup 218 /Uacute put dup 219 /Ucircumflex put dup 220 /Udieresis put dup 221 /Yacute put dup 222 /Thorn put dup 223 /Germandbls put dup 224 /agrave put dup 225 /aacute put dup 226 /acircumflex put dup 227 /atilde put dup 228 /adieresis put dup 229 /aring put dup 230 /ae put dup 231 /ccedilla put dup 232 /egrave put dup 233 /eacute put dup 234 /ecircumflex put dup 235 /edieresis put dup 236 /igrave put dup 237 /iacute put dup 238 /icircumflex put dup 239 /idieresis put dup 240 /eth put dup 241 /ntilde put dup 242 /ograve put dup 243 /oacute put dup 244 /ocircumflex put dup 245 /otilde put dup 246 /odieresis put dup 247 /oe put dup 248 /oslash put dup 249 /ugrave put dup 250 /uacute put dup 251 /ucircumflex put dup 252 /udieresis put dup 253 /yacute put dup 254 /thorn put dup 255 /germandbls put readonly def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-35 -250 1144 913] readonly def /UniqueID 4700722 def /StrokeWidth 0 def currentdict end currentfile eexec €°¡±Ôc, öøÔâþ³×Âû-iìœ ï÷Ju¤¤öï§S©°E²!¶Æ¹'hŒÉúõ¹Û`+#),ËÈÖ«JÈ&ãÌÏ•—mYÕ¯ ÿÈþkÂôÒ·¿'\›Ö)I²´^Í  4"L±°«~D`”¨X_˜O>IÀtcÿî#4¡FpOµA Z®ÅJ\.±{—T˜/NÊÀ ëû’ÑìmËYHƒŠ,ó͸;£Áo0 ¾àWõb,H AmÈý¢í»õü>oaÿ':· ²¶ºèd˜-ê¥ †A±A j…C¸JI½'OX›Æ+)úZ`b„š!jO“êý×bØϨ+-EMòïw»Ø+Eld?,­£+ƒ”Ë­4y[në*&]ƒª˜ZÖ¥ÔΓòˆ`Ž´Ò6%áº1Ì[B|uv×cÉ<`~AÚ΢~Q·–¨í§¯>êtAg)I@›f3_ÍX^ŸŸ˜LÜ™¯í^z ¬ Êf„fÖðƒ¸X'`1©2@g€ ÔÍ"0P@OaÆiØ„Djÿ0F=ÕRbpåÿkæf`Y‚ã·ƒëgi)¾˜jsõ¤o€ø¥ÑOœL†oÚ ”ãÓ1x?f)ÄË¥Wl+R‡3™âÝyû¹Øí†pÆÚºzÕv¥P@*†+‘³(¿(ž ²Íy€%S®½¶÷î*zaÏRað0¼Ï‰í`Y™LÂ…Š™™­œÀÆö î:òáúWå'o¬@û„•X-‹‘8ÔôD,3•ß>wß(Ò=«ˆ?vÞÐáˆ4Q¯€åfçS¤f¦åJÛc^y K³Þñ–÷š¥[uvÈãÂï*Ë=~€5|3Òò Mµç/"ÍtsEÔûŲª5YSÃÐwÙSÐ_É[苳’•‹-l̪(Üz«Iao@ýñä‘fœï:ÈÉ3 Õí#åz Ö¨,;E}¯ð¢ë,v¶ßö¢a§|!Ù71ˆw"çõLŒô óÛ\×#‘Xä#jd¹ñ$‡NF;-æëª\#âwÇû-P6B>„ ìUèiHˆüäØRÜ«å¸ÉhdaïýŽ”Ùdð[%ôåI,3›»x£ …Ïkk*¤×y]¶·M?”"À^q0Ô$ ‡é,7×›W«`ùX‹õ߻ѻË~cž ýMÞJ¬Èô‘¯MÁãÕ/¢y÷è‘äƒýd¬® —îÏ—¯FsÚoìø”=ÕÅîåýýV§Û;]ë(; Ž¬@¹ˆ,¥ë-(œÒƒ\‰ cÉã‚‘öžPWæ? ¦üš›Ý ‘–q©'w™ë¹xs(Ï%÷ȶc©7zî©•¦3mÖ­©êfµÛUsD$]å[ͼ Æ?ƒr䕎 û)yd¿Ù©g| °†òq*Zµ/)¡‘ù¸Ò@Ïü–>&÷SÞÿOÂÊ~0Þ'g¦Ia¹×`³uæ$ù|7µXxÄuöìO˜ 5O:Ï%o¢lh#\µ))†¾qÁˆ5Y–ŸK¬šÂÝÇßLòƒÔ„—æ]”6pŒô) }˜ÿ_OSÉC*±dVÂ/6u»o G’(Fãïó´ ßÆ‚H³°r11!ÁU­¬¹!&06°-†à»¤$ùÎDf0v¨½¡£t³R¼véeƑӗgE„ð'ú¥ß^Ò5𙯛æY¨&pÿÆrÎà•×`‘B Û.æÈÇË<¨â4 bz>똢ËAÊØKVïܦñ~í èŒÈ¥PÂÝÁðÕA~4ŽºšË¼Û#Õ¢)QìõDÃ2§@F‡Oª:o†Fœë½ŒGÿŽ«õêÁÐÄñ0Ì“?õ$DuBèS[:Ä›¢ˆ u†0Ù î zUä±méýE£ŠŒÂHçË ¨ÇT<ÿÊVEI|FÈPœ~Ì_†Õ6¿Êµ„QÕÇæ9”¤´¯Aw2ZÉ4[B@àð'®íq¸`+$¸¦æ7déKü¹ÑŠ’Ó÷6â´¤Û0¡3s3Ùïk@ÏÃÝÔ¿Z™je6»Å®‚åEÜ"Ä$¯§ˆÚŒz¤%ø9÷ô÷®oJñO·Ò[Ò|Ë©ÿd À£¤ëÕ ¶ËﶆÀ3Úó“ékÜ] ™Éùzã, †!Jm†»w0ù¶8L…ýŠûsoYÏý³‚”¢JùÙØº¹ø³Ëâ1A-(ñ=Í€U°9ƒ„M0ô5ùOõÓfgñ%uî'ï2™$ð½¹Ml¨P=¿Ãñz‚4,gî¶ÛÝÖ§“ˆªõQ«žïø6¤Þ32ÖešÕ¶4rùëü⢹ßzS»bÄ…RÏaÉ+•Op\’ÎmÏ:gs'Ý5/s€ŠÓB…dÁ1bÑ3†>°¸ºÀç·³Ëì]$©é@úOš›ò×þþÑÌ—zÎE’y2L|ÃjZëS„m4½=—»•ùžÚŒS¸ Þ˽²LŽ]a’ûüÎî^$š_)þ†ÝÑ^ú †Ðø=¿T‹PŠñ;ZZM–”á6Áe“ßS’è<짌ٮTˆÝ|}4Ұǯô)ÜyW’kF‰ …ž*ýeŽ¢R™™æAb)²Ew”sÞê¼×š¯Wô8†qûHQ¬ª5g™-Œ‘¬{V8‡*É×@YÃŽ|/Dõò'lW¿)MH³› V”DÒª!°zpÔÜ 6P¤­:ä)Xkeu冀v°9œ‘¸çg<õKª¶;™›p8ý°åG„\Ëq˜–¿Ä¾A«ÇO ‘H“‚E½þ³ŽDÚbÞu}øIV¬u!™ºmbî@KAEjñ©qPºÞëZ¦žÌXà÷Ž }âÜåNæ[PRrï¯ûŸu@¾ÿ\ ŒQåpóÆ?7à ‹= ­’±ùl_ÎÔa)%÷UãÛ°„Ý·i)SòªqÒνˆ"ÐZ ¶íÔÒL„žÏ+«-þä) <úØnû)ÈQsP°Y ¾-dß¾úüK‰˜Ø?[Àxþ­¡ë!Ge'q2Øü~î.¥R¢ùaà- ΃`¬í<yw£bg "bG Šð飭9¯>¬')qlBð8‚üÙó´°È®‰éwˆÔ–´mI5RrÏ“"È7«0ç’¸xå嶯õ’M×ÕéÐR¤Àk§`|å>nÛ­êgùFÖ)¼=Þ±*!(Ò;çZYP'Œu¥û'•S¬YûË ëä²±A¼Ü¹wCì2“syߟF£8~â›x=ƒIz„*áì~'zúLÏFHQP2èû;+Ã@‡} —,ék…£QPôÒÖÄ w8΄’A¡Ty‚¶aL8“(á2ª¹§RëóaBùF-Ñþ§´¦C#ôãºkB/?VbLãv”/s¾,‡!”H…«Ùfƒ}‚™¨áæÇð ñcBÖÂÛ0Ÿ+,ÙsvMÓeþx:òM§°|ùŸÙì5ΡŒ#BèÌY¾ž,:éú²GÍW"Ú@êØ}ÞªPæk{ÜŽÒOo0Ô©{¨¬ý¡aæ °2WtSÖìC4,G´HФ?Új&wqüiæØ Ž)™†W H0A1]– @49ÈÐ!B)•÷3èœ,O ·ßTdÛiN¡ô©¸üËeþߦu„)Ù!©Ý Í8ÐSNë—EAUy˺¾±#ãĽÀâ¥ßµÏAÕQP©œò}–pÊ”;Ñ·¼·ä´òñ(æ0A…Þ‹ Ù’ØXÐPGî™4f«U@÷<²âW‰ç‡ü·`Éw³Arº2y“@&¡ÄÔœtåÈó½b'zk½Ýò"JiGµ7Ûû%ãê1ÔÆDÄ W7 Èa¯Îd‡˜,„¯2§ZTÿþhÔÃsüs½š±5±¨U©ÚóétƒC>«ÆF‘Û/©²#Í !a®p/ùá–Ü~«³Ç¦l@ñ£àŠB –ϧy1:pä]Ä¥ì¢ã\ãð„ì¬Wi!k[Ö¢Ã÷áéÝ"àAø–@æžbÖ¶Ñ4V¿]"îZFÜÏè°J…x¯Aê›Î þâø¸±« ßèæö=ˆÓpÊoâ¡ ÷/ï:—YߊÃLq¾Ñ¾Z3·*ÏÄüÒýmY__>³¬œ£æ`e8n<1ƒ38.³¹©‰TŠNœ<DýùHèbVf.®}§|8»?§[ˆ9ËÀ·*Ø$•Íò¥¡´íPñþaæ`@ìaÒM¸±óÇÚ6@¤`Ôÿ,Ü”›ãšÀ^’ÇX-z2¾/¯–Úèx]Á§ðY¸"WSŸ4ª•‡o~»ç—LÈlú_kŽçÊç€4R¹ÏæHE|µïŸ'§’wÓGôÞJ@úþ(<*…G…LÅÓ6’–1#1ß±ÅÍÖÖª/àÔˆ•f؈ùªMÅèéÉšD:ë¾Aç´àâŒÞ¬$w'H¶@x0¦ssõzI2kŽü}¨u›™×wßV•Ÿ ÝaÀó> þ–ÈÐ.ä>€àÏt-51û—S°­kŸœ_x9[k‹ OŸ‚o-—”jRS>lÐî ^D<õ# NoâÒ'/aK¹ÛB¨qBñ9Eõ¹T%„ŸÖsŠ­wýŸwÌNèU‰xÔ6í"Þàf)Ÿ Ú¯˜0Ñ d¾l3ʹæ1_ôoZ³µ/<ƒƒ ¼2ï÷ƒCÝäXe4Æ/‚I]yESËŽGøo´¿8v·ð“RÑbË2ž‹8…GÕšK·úIãÈÿ£‰Ï8ÛIOB‚ç?Ûõ…Iñš%æd”H­áMµº’Ó7‹*G [ÇRlÜÖ]£=HrªÍJ :ŸC×5 èˆ$ ÛÈj—ë¼·WgIÀ÷òþ4ÄM¼C6¾IYhƒ¤¢0ÐÆ^Þ–²†ÑŒÝ`nQ\9ûv›Õã Oìq¨ÄjÄáæ1´™CuýŹ€#öïöƬ\¦s…ƒv‡iyÎ/ @„^b3úi¸ð·t‡RccwÚÅàÊJÿè™etAÈöÏäA+ñÂþdùvÄ œ1‹!ëÐje]­Yejp/ò4ZÒ£q±Ä OöÊךÞC†s­G{½Tël'ü6 °Ø*Q4•y¸YðWþq*…2ò•þÖ  2X=<Šp™,Bb‹è¡ŒƒtæmP}TbÂv•`~FTøå¬_¦F+—’–·†pêaòC c*5s†Löc˜C§äNEÜ´¶óÅö‡¨ c*ˆ4؟õ¨©¶É‘³ÙGˆ†): >A4Ðı‹Â·X[¾ÀáTyz8ëÝ0V9‚E òÜ÷u)î¥æ‹aóìTLZÖ¢†³ûyäÄð¿îóO¤Àê­\m-Šm«äw Vp«pD-7èƒCË'mžì¡#8ŽÅ®\RÓÃt°6޼#` °‘2p#CÄo–ÝÒ$æ,¤ˆ˜ÝéÝKpþe—g´›¦˜WË•œuZ[Ñ^š´êKÃeK'6çþƒ‘/P®øåÝsvé¶.Ï2CÁ A|¦ú–¼> ®–’‰Ïôµ[À»GÝçÛìÚ¢:ô;O ±ZýÔƒ}òºÓÁVá‘&èÿ dÔO%¾ì¥‹S1ý¥v;ÓUûƒ2˜vnÎi®1|´.ƒQµŸzGÃM¼6x¥IM)8–«…ŽJã•x{ý×B/KI‚ÅwŽ`.2„D p' ÝY¦=È‚8ÍAŸÃÄØmÎ,IÃ'ùÆ¡4<»i\.À|·«8x]b;VZ‹S/!ñ2t+&ʪÅÉHö¸°Ú~<'± ¤M+Fg;FC¹‰ÏÝ´cn'²<<2W>åàªäe‹ äP¿±·)ñèûV–Ó3¢Ï´cþ½ š. ¥QÌ*ß»\ø¤­V-P-xm2‰ãç`ù¶Fî ¸ÑsóÔr–‚³Tü1 ‘ •Àð}7噯1€¦¡Ë õ¤|€sņ%L¹1RûŠGºÇþXr -;6Ø“\W…f»Rrýc=dÛñpj[X¯™ßlóu¡¢_¶2’›W5Ë×ïŸ*÷öÓX¬7ñŒ ƒ©&æë£Õ^!篵´²žè!;;•·ä‡‹”(ˆ9‚¥%Œ¬@Di=ìü g”-o”O§]ã`Ä%øåÀ"\%t˜ÕHM2^{B¼'‰WÓzÊS€CL¿åv ÖM‡µý¶Â:g|8»°WÚú:íˆVwI«â¹¿17–¿,ÐñfѪ (5z¸ˆT²ïr¹Cä ŸÑB%hó?Îë³’b)N2çuàn æ4åz’#YÓÔuaL›C¤ïo‚ÈÁ0Aׂíø#°¥K< îš.ö 5@É(]˜ÿÁ=Ans |Zä©ÍD÷cAÌ.í‘— š­Æ@X±…@>;ÜaŽÒâ¾r"l4-/H@j¢þV·„ê½éî©õiñóÛï{ݣŚQ'"pQîË:øÇ jC+Œ“ú UqÖ뜂™Ìà&¡¸å¸¼} âÚÞ\¨ŠN© Nà{«qšŽzîŠLÝV~×­ºà}‚Và ÜöìûƒÞ‘ecjésŠÏú7øó I>È6Éý.o6vàBvI)ýŽ$|’PW4åkIžtz.œ»¼þôq+³&$yLyŠ ÄÈÿ†Dü¡/ÁëH¢½ücÙPr! f4½•tuš(uu›ŸA¸ùÚ‡É2%‹&—ŠIc2ý-HHñÄ=|üìK]cÃ9<¡†5 m½¯Ž¹>ð¸¢,\YÛ`/é ìÒ«±ýÁZA·hž€DÁ¸¶ÓÌS ìÏ»¼©#ÑKÿ²‚¡„¯ @~,6ã×`Žæ~s#ëpí_Üb‘æ‘^~ÖÙ²ZÛËH±6ÕšÙîÙg“†ŽêèC¨l¹íî³~–¨þð;Êo@º¾'D«â¾C5û%Á.ùÏ\“Ë<§`ÙWZ |k¦Œkô \‡a aRó)§ £›øãéñyC)¦ZJâØ.:»ˆÐo£Ÿp >²o'x½Ÿá1âEÌ(ku ‚‰K WÓUU}œ¶©vý7)“Ï3“`S}¥ Íç0¹,_£. Šg Ä£XétéúnÍÁúX+R2—e«[»š${{S±áécS%¤æuP«¢_ÜyVd”ëd%¥Ÿm¦Â0% ”`½kDkréK*41Ž ©‘]2 Øúª•?íW/- úJš¡Ý¬q»©† aÕ6\qRó_ 8øÝämêgdÙ´a°àA™c•ðqt¹û~fópÜ…Á/¢éVÆg4=­dB^hÝÎ}S° !7,Å¿öl‚‘LMdÒ\¿wêsÞi^˜¯’y¯¥Çì2Ðkœ†ÙQÙî•dÃZ0€¢IR$?ªÀüÖÓZÛIš6èó¢a1ü\8äüj{†…˜náZå%+°j%¹à2{œõËáaäÑ6b<‰‰‘ÙöÃmZXG=ö0]lQŠØ¯¤Ÿ<ÄAŽ){èÍ J-C_±fÞ b‘Á9×Ëû0 ý7ÄfðAo¿*Û²tÙ«e=2\›”t„fǹ̓Ӭ­Läü{;F IÉÿå@ý|É ‡ÞœRcMZ•{T@J´qÑ(ä%CtG¼Š×gU¼3sy•‰ú‚C Y×HøÈîÿGEÓP«kf9|Ÿú9µž—ª|9ÌŸ¹³êË:K_ ˆÀƃMyE§g䪋 5ÙyCÅq!R)UðB ÌÀšâ㡞kP/£ã)þšÐ&:Al³CëÈ+?”tÖKí©Ÿ»³„¸šKÍÿht¼/h;@°îÉ£SÅ÷¡„0fr¹²¢6šVÍÅNL×'9š‰ó³ü½®Ç™ç†âGjGЉê+Gp¡(íi´r;ƒ±Ç._[¶DóøÑW’QR7¹Âj˜ù ñ.ââØ+†A±T+Í¿ð *JOÞvDàɼ+z‚#ØX(aïu ÂÜÿz­Ècn0»ÕºABs4!º¨·È)…¢/ä{»æÅ’KÉbÿQtÂ’çƒEÏ4Ž$â¢ï÷çñ¼8N~×e{ßuÚÓ¦ÊZÈÖÄGÿíø‚xç‹ÏZÌ$]Vçøß±ep&*B ‚@ªx£+Á»­B[R@kÿrõ˜‡ÌtsÝ>ßé‘;0”³¤12q¨®¶ûغg½›xå¯Û¿ ó³BòÌÖÔö{jûOŹ•œUfâ»h9©;“ýȬk¨Ý®‰|ðñé0Ilè]#“Ed>£œ´h­HVDÛ÷ef6fô€®Ð!*|¨ÓãܪÌÈwý!Îè?}ª‚…RŒÄXª„ë…»,ìú*ò/‚vML.‚Slúôœ“¢y=U"ôµLn =.üûã öçÃí‚Ä mûd¹§NÜ\LDœðHWÒϲpôæÆ<#!–žSœ‡ŽPW¤DÙMEz´PwÌG±èÞ¢¬NW‘'÷>»(KX•-Á£àéÈùqã/'[jWòŠ6ÖøLiC“ô÷sý³*æ-œË£Q ]˜+͹ïî­qõ"3y×"QêL@•TX‡’ ë&ZWE,Ÿ†]Û<ôC;gŠRY”ÚôëâÙŽ$‰;"P¸ WH’5ZÏ•#$™”aCšSÈ=Up,»'«ðG@í]’!†T‘ÌI®IàוFz"…\×)š>޶{zg WSjÜÄ ’­°úëþA¼ñ-Ck&n¨Õáó½A‡oÙ•š’;TH#à 6?ÐøR¼õΘ_ÁŒÑÌO§T¨7á„Tt H,0 `hfLëR°-ʈÏ$¡¡ l0ù²”|µ@£ê"nß3p:“ |sÔFËgCÛIBf¨PÞu!õKœ Ã]õA&B‘’C†XHÿ’‹=JУîy‡ëIxìŠëÌ.4¿@~¯*áY†Öif6¸ xÿh½ d‰ƒD+Ç{€œF–@Ð[ܘb‹»`†ÇCðp6jÙL¤z‹ðÍÉ»»-Ê`!Ê$ñ·ÁSp o¾§²XÉÕÓøž%ˆ+ 8$)‰çƒ¥–BqžÓŽí;þÇüÑ¥ARv—ÝÏÒorﱡk”SuÂY×ONZ>š¥³$ú›Å{kŒ*ËkÃ’'¨"jö$cЊ)™gÍÑR?Øý¨õõ4vðJÊn~k<ôO>[V«IL†—–}a D”¤áPæ$Ŧš]û} ÿþ¿I`¥ t³ â¹â^¦œüíûÜ#Û'µnOóFŸÝªWmPŠð飭9¯çH¸^Àþ æ(äÛ~¡%…Üšå‚ ?„ ”¢*Y«¼‚}ê¸@F¿÷LÞÜ1íê”=áW ¢Óš PïDB-éB-äY—nt\ÃOEšàu!­as[i¦?{ãa£m["ùRƒÞ VÌT‡øKä|Äd¹g‡m—¾9ߌKªTŠÍ•ƒê9^l¦?wg¹›9¡ÁÕìÁIÏø“¨ëgფtŽâeUK} Áå.h ãâìË ¢göc±Þê‹¡r¶ÉBzÊöÀPá>¤ Ô|­o 0î a’µ&IÔ| —µÙèö -ôsϬݒ÷‡³e¬¼F-`ÂP Òm„Åxsã…üYz”dî÷×@ñ#qÕáM¸ ½å¾.ó¸gF4¨;°“¾J„”¡SW{ö®)'>þ(‘%—ÐPð¢ë‰Y”å=ü6C­H Ašv&Ð~$çh’;ñæ£W;ŠCÎMJ]Y|¨\ïæì#ÔçÉí?u¡IéwÝ·æ2ø7×JBB¤bÚHêÆ²¯b+^)RzÝ›!ìUÆÀ™·>ëLø¦™7ç ïõ'Eƒq¨u}õU^H(¼ÜìÑÉì¾ì'ÅŽ?Žö­ÿR[y$áî çÒ—‰‚–QÌ@“¡žÿ”2ìØ‡³BÛ¿„§Î5 "º¨+3¤O ¼¬za\~aìq_ ”ôÂâXV®ô¤IÇ«O†…Ã.Ô /:ro×ðf "½PÜÕ* yåŽ:þÓ¼jjÉy®ðñ`<Ð|9û_õq5É¿J'úÊ>"d*ú¥ÔäNÁºÒخ̨NQB{<êáý6Ó•d5½Búƒí/Oõ=q$†;b©æ11”¼è½¢‘üœÈ‘„¯ûþ•Nú6ò*8 o™ çÏÂùXŸ ’§Híí.@áéaÔªªÂWæx™môàÙ …s qÎ+÷âlÂUþºñäÑ–Ê9w|IÃ+Ã[ÄÑdÌ4ˆ17öUX¤bĶŒÜTvF¶Po‹g<×ßiÈS’¤o$~Ä Æ$f)àY}ಪhF¨ûiš°x,ŠÂª]™Z­¯ßâl½Ÿ)¸TŠo%ŠoˆlômšÃØp >œøÈÑ$Q–”{áÇò1(Þêí%“ÑyL;!ÄöëF;´”Ä–ë¾0 SQñó’-î¼ZQbÍ-Y±~þ2#ïõµ‡t*8öI;½Ø-/“êx¼ÂïåbveâÃp~`Ÿ+Á™ø:êi8S¾‘"ëWû&ïœFAPv•yVà1àþ³Ñû Dëƒí˃V›ù^—á¨é>“;M"0‘HC]˜‘.Â'+Ïs÷ü@Eɪ!õ6…Ö°°?J€ÀŶñi7uëBÅy*=¼nT‹Àן”aF'³Þ)û†¸0»Ê\ƒÃ†§V—€ÍŠüÁìƒç>É[D'L}J½Ê6ŠÀ,ŒšGtÜäÝk·ŽÛ\°{Ç\*j¿Y"«~€þ°ÈÊéÖîâ-^¢]²_‘BÉçQÏTiMâQÄaÊ‚[Iz­ˆ*’`€‡sj®ãÛ|T çµú®¹Ÿ*™i¨4 †Kk$Xœ4n.ÿõ˜(j8Í+‘Q@7'¸;5T’1¢t¼j°Âv@Ië Á(Ï•BVÝMÌM Nº/%Ôë»==†™Ü7h–g g?× ;CŸ»WŠþ}ë°“[¡ÚÕº™Ù¢šµ~W·µiä4Útõ¬Õ«?§tþñCŠ<—iãVx.ÙãÀE«› ‰©ìÑ“TˆÓ¡Q?dúåÈþ<ˆ‡Ò“¬$—ʃ#;ûͽ”|‡r¨ùûC#À¥òÈÁíSq*¢]M-}÷Dœ–_¢oÔqgÚ5è®Î²tONë (…$äK‘4˜D\£œ*é$™M m¬ðÃõ#âYM>Z¯3y2îU˜Ÿ£PÆz:ø!xë˜RÍ[õ®óþ»6äË ¬å?t$že†.0ô& åg©\òR×~–¾gP ¼’ê—FSóMWÐD)Tªµoàq%uD’‰E¸8ݦOº‰t[QݾSÿ=#ÐæÌAìžoÙ—RíÇ\D‚{…Ôÿè’ÂZkŽ›ÃNyIbýEÕÿƬ×ýØÁQB2e³¶¯…gãJa^ƒä›B\“J,^\¥¨.ŒÊd“=¸ ò'‘žÙ?/ ]hp4Lµ`ïøwöHxšÔÒC9íípÂí+];=oÿÔÁáåpP0|ûKÇ×Z“Ñ6QÏÒ¯S Ä;¸þ„-(0¤ñ©¥R"V;¦ÂJÑT¯ý .Ô—ÉK3ü%¶ÖLáP ”Š£[ê(vI+§§ËÛ9p²ò½Ž¯Ûè¨.x"ÅBY ¤bÓ.Ûîó%1²_ÊOa,‚íP§÷|r€ÝÒÝÙ¾ýôj[ÇòîòMúìdñÄ·“• þèòì»):¬Ã­\Y”)2:Uk¡ì‹LN²èùê—À™¾$®Ì 2ø|’ غë›X (ξ֘;~´ìh’ C´r"pëáró ¼w~ª?Ó §<º6ÝƒØø»u‘R§ÜA»%NÚá³U Þ£WºÔM†‹: kÀä=ƒ³ƒójv¾»c¯ 2>®Õpîe‚yJÏÉëG¬îœ-‹ã+ø3œ˜+Í%`Ù+'rœ8{ú˜­(çUÃí6UõÚ;©ð§ 5#%0ëæðp_³ ˆ´&YÏn2¾‰ ÚÂðz6ŸDÜÛpˆáóÜYØ¢Þ÷òß8ç>Âð›á2ï­šüñFÁÐ⫽86’Á¸ÕtTŸºs3·\>wÏ*rõÓ%€<7ÁªÉš½;'Tã¡C£Å)ÕsËbs¿øÎ-ž ËÁìk*4ÚÝÁ¸ã(ÃÜB±WßÔÏMá‚ç÷sp@WgÈGÅ&cŽuL1…•}Wç9|é ù<ÿ³Á1S9¡A[Bk›¢‰çî ×¶„jÌo|œ™ÜùS~áÿ(¬.ˆ«óS<{&Àš–!b¢öÕ»æc}‚*œ8“™üÃÛ¢‘†±¨Æk›ñ Ã-IÉŠïîäÔ€A&I¹>Ý®™z‡*3R,/”¦Êô¤ÉGf>g 'u ¹=ɹ„£vîˆSõº/SK™Ô9›ô†9R[Öý;ï¢+sj~æ ¯$O1ug¬_Ç>z}9-…ºÍ·½äÔa0ZéЈ¦‡Òsîï|š L¹Õ údù»¶!MÜpAó=(òÝYíÝÓú‚êX_*&7Ž-]ÂÜ\üÊ,¶Ü¶÷„‚aÊ)›éÇSù$ËEÎèh-ÏRU¥€¸Gà,~ªÝ¾BDû#©ÛuŽ%Ù.Na¸èD¿Ð{9Áriýäåo‘ÛQ©v@Y—Ùµéœz©jþN2U%êƒûÜÎ 3¤c< s§ªïvÚŸS6s´ÑùQ½*àBgaÐZ­)Ž·é¼#߯PãSýL…6Ûúð’•/óp3&^ðêßç`hC ´T£°ugU1Ç],6ä–Ë*T[ÝÆ\c»D¡Ë7!obywìÀ‘<vüsõŽS:ÒàÜû… ßïóJÎz’‰Ìd·¹_Ï‹Pà»|ç;c”7ç'ôÑc#¬§‰p¬s–Èc²ÃU®…Ýîð¨q‰#›;òs‹=$Ô×7òtȤ¶Toût3Î÷\o1Và·º—¶LµAƒ‡IÍxv}ˆhv”J±¸1Ò1Ãèlöw¨MY2šVÙe¢6ÄÂ=„ù=>m9u‰#ŸYŒÀÜþæ_¯õžj{ª•‹ý„†²åÃrxóÏûÕTefqÒ*·®—ΡöÓ(¦ëtò„Ê}%Ó0Ñ0T’gdN*IÅ7(a­"s»§JÄO[—"—Ô­—?<oaå]³m@™R:øϺ³†k´®%²Ç$;Ð rªŒz)ð÷Ù‚A %^…8”Ýé=~åz³Êä;ç7·ãBÅ t´¹õ¯ªæ«ÄóŽ_è¯À¿(•· µ2ŸÌ-¥£'6¡•O¢®¹Æa2éRm<ïÌAmbèÜ›¾kü¸½¤&jÎæ‘-<û©mŠñðk!Œ·)u¡õ°F¾a´§E?jv-áé®Z"ÔýQ±o¤h,X†=wšî6+Nƒd¤9uƒS¸E„å'ð/åQ ¬j¶À™ÿêI]Z:ý±tÈxÀo$i‰X´Œ¾¹);ÞAsëìdGÝKŽØå<<ÄšoE•ôV‚VS<§ —æ—¾5Ô´gÃaÖÌV‡6ED¢m_…~V¼zÍAaÚ :þj2”:Õ½(Ô™$_€Ã8˜Ý-¸a¼D yÉGž¢#¼¤#© mhyc‰Eê’ö!„½IRÓÔyÜQ' Æœò§]Ç&­„Vǃêï°íô0aXU&>Ä~Ô§o#ÍI÷žÇdëq 9Ñ%É7¬|$+Ì&ÀÆ“OñˆÅ[páî®i.¤²|&ûfxË•7ºò£Gý`#xøÄÊaIàµ:Î;:LHsÌÎë‡cÈ)ÑV7žu‡C±ÝIWAG€¿?TÞ+>zM•Œ_c1øHÞ`±)€XV9àw+ƒiý½´ p« ë÷:yÔBÑ¥†%%„–ͨYf%!á¿Öö-áú,î#rÎq.07 é‘Mzáy¼XóÐxWýŽ<‹àN7ÌÞÅÇðHƒ æ×yR×{%pm¸üf&Æô<ˆÙ1ïfKiÕøÇE䟖©þa’Ê\pµ¢“VµKè 6ºš'¦ýñÚ@ŠÑ|CX3‡éËlÂæíb?bÁƒ3Zé7µ'wÛ£øOÍæ ÂæR:TÇ,¦j7¡%7gu:3~œ£V*ä¬Àº f±È€L²ÃxíøoщRq…¾ôÂëŽ1RÓÄõ(Í%½ïŠÞÈ¼Ï B`²§‘ ÿDÝ=nˆ—°qs{Rù >¶¹tÄ70‡­Ç·,KwYyá™YóÝå9­Ìÿy˜€bÑ I,Pðú›StKu:ƒØ–›SŒû¤ÈåÞt´)ÚS &Y£X8Ñ„‚ì™ì߮ԉþ;RôðÚþhž¤‰²JÿSŽR{¾ê±&É@ìñN¢rÝÉgQ —çZä‘ñxžl¤š2vÌäsñøŸ¬¤ ƒý·Æøö›³˜(‰Ió¬¹zÔ ïÀEz§öK‘x‘ˆ®›p¿jcÕR¶Léç¶™Ÿ|9ë•ç&gBšˆù§§A®)+¨þ ªÿ;²ïý‚´rEZ2žÏ ´@§â:—8*DzÍÞ„“Y>:/j¹œ}øƒ·åŸ¬Ùå!”ØJðÔ©$Áƒ¡Âé™* œï©øG 0óm6ejŸ/ ÊþgÇfƒ1][BOê¼_÷ÇcF¥Ô>’Ú¹? (b²Ìã$ÜXMö­XubyUž{@ƒd»sV}€”Ï-f«ÂÎ-IÑ¥þZ<;ç£|è³Í{ÆC|R\Ñ5T³u<Ÿ+•³“?qP%µI¢NZë¼¹'ûì¯ñZ¢ë—#3ŒÅŸÉ!@t÷¨…àSå϶^+;>íÔŸÅ.ÓØî˜ËZÞ c õ#)%¿ÃÓ? 8Å{D×›ƒÂKö“^<‚Äüãä‚.k_U²=hxÙ-+d„O{pà„+¬ð“lá) ÐìßÞ. š³ižˆ7\ÓÁ„’íc2ÐNUHŸN…W8߯µ}²°}²pªUQp ø? Pu¼Ä_jU xÌåžï°®¥½¸ 1˜{A¡g»êo^öbÊÎÁºÊÓðp ç.Ž3JœÈÁ8 >6˯ÕØ.—R‡V~¿Ä}ÐM¤æO´(¡0xÏGehîÇ¢˜¹†´ËH†-´¶“š9Ø6»úü´ÁeÅèëŃãjs§XÒŠ©°éBåcŠªÙ«^›…ükeôÚ,¶Ú ¢¶šãíî‘\Ñ‘YÐt˜¨C'm»ÍK›{;yh'¹)º5§žäSÔ9ö¸÷ô¯9²‰Öƒe&ß:yMdâû§(ÆÃ%~o˜)—­)'OMgWY&3‘×8Ó1UÃ4q¿²µÝ,ÍìL{Â)Æwhà.ÔµUåøBóáÀHp%ˆ‰<&¿C¶Võ#çEÕ+4L°‡{,gÎq¡æ//›Ýek¡oôÂ…om¸p€@ ’8É[p;v ã/I=­ p¹AqOC£Z¡úYùb>ËOG¾ÀÌÛH± ÚÐ@"hý–¿ 4·3G@èŰuƒÎÇØôÅ\VâåÜOóị¯,Õ>ÒQUúõ!¹ Z oO%úé2F ¶ 6~§6~Èým$"³U`t5׊Jÿ‡¿‡„ u4 ÔÅrgÒÎNŒRÉ'òÅ™h?‰÷X=Éc©ŽEì4[Ë kÙùsŽ:5úì€Ë÷0AÕKæâ/‘_Ͷ’}ˆ—u¦=4†Yodb [[@eÛ]~ˆªÝˆ… V»TÜüo‡ÁZ\f/’|¬ú©._8“î†}ö»‹G¿“KT,Ê£‡pAsÕïêOùkÊÆ0Ú«¾ õünŽfâBGŸM´õ4¦`3GÆ4‚[cì÷BÌTT©Yã=ZЇ¶óêÃèüTÊnÐåIÀXÌŽÇ1IJ–[Û¦PÉ7\‘×D˜®2 zæQD¿´d"}sÜ3pá4”bf3½Ïu豜h5²ßa¤Dü/ |pZ5‰jxñãûn óc¹|l 4ù’c$Z…u ¯óÅ÷ Ê•}NÙÛš Ï™,ÿüJD–Ðh‡iq;!r–ÎM8,Ÿ¿-…J”æ ”A(dÈçï|7)™o½HF+au@¾cGÞ<¸Ì®Œ…T\ņûE§[¶¦»+Á"ÈûQiÉta+ÓO`!Ô·œ)å‡ö$Œ¬pG° j„;¤Ì«Ô¦Ûî EÂe)!èŠlY ØÚ¸ßeʲš~YÝÿœ*iÚ £õða×_ðYù¢ncU¦G &fO–9”Á_´h¼ÉÙNN[Ù^Îó)Œ˜_׬þý×Aª”g:) $ôxäï¿Yø ü…‹8–‰±˜ÞyþÌP‚*bB'ŒôF$ÑVø ÷rWÝgë²&¶"ïŒMí¡'úTŽxiOýQñ€«d—©rÀ\²CšL_ åQ„YtšZØEÚ[Q K¥DöB4¼ÕÏõÅÖQ„˜6¦ÝID×SèàC 6å[Éžö"R Eìã¶U v8 çÀ!3*¹|Åýi#y‡Èd,ô.2ÅClžñ_©_ÍŸ·¶ê:'œ ½-FzkU98ÜD¼¤vú/5AŽ‚\£¬q³õ²Ø«ƒ÷Qô*re_Ëàúeº¿µ‡ü™ ôqM“î•Æß¹$ê™Dûù[~í-s;´eT\͆Ðã†Û|äª ‰²¯U6,Oí®æDþ%R[»CNäf[T™Wë§6Ãa¦þmàŠ©~±a?€cJ¥ˆ/®ÓóÈÝpDFŒçŠb0`ÀCx«¥Î6î0ç{Ó!'ŽIÑx4j.-3Þr9V×wkò°v9&$Pøæ?½¨Å~Ÿ £}j)¬ß9K¦sN%»G¼I¥ß뱩‹11—8 ĦGû°¨~ÀK·Ý<$Z¾»ï¯ïrâR Èéý‘’8{É¢ßqÛßOÛ-1…$Ý¥G£ôL•$ ‹Þ4§;OŽÑ[^iï)Åþpí,ý—öŠ_Õ°LW¹8)kvåN¨ÿü¥e®Œ+œO®2ÎNž”Í£†T­Àôêjý‹Å€ÞŸG@’ˆ†~ëÛl'²Æ¼et±ó«Ü8Ý(hº; Žð2á˜rÐv‹IïMn©I]ŒWÆ-œÅìÊüͲFiÂC+­:–MCJUƒÚøqAMW{<|ö|…,a±yo))}ÈsK+‡ÊtéÞôh+ÁßÛ©¡þò h8^•«lê´ÁÂ-" ×ËG)wÙßUj2ëWuXñôQó:÷â‘Ûg€Klê÷Dcqdž«‡×¾EdØÑL+©ÕTì'N­y‘#7±$Žl¿=¹dã~ç›‰ï ›l$ãyýX£ÓÈ¿àv_™Ã¬…;º ¨óléëÙç9Iì Kå6sS¹ßùõ [c´©Íä"˜n·ÖÀÛ1‹:S^^†qŒ…7ä¢8lLµÒ¯š1ák2ºéÏنɌ‹Ì42㧠–¦€é­éø2“¤s´„K™•6ª1†öÒ&5ÈÉs“컸LÇ!ÄÚ»Aý íO~Îj¨†nç>’€QF4t –­¨±Ã` š“˜ÝJÎc±ÈÞö©“,MŠžÚÀ½ô¥Ú™#1tŽÀ’ÝóœÒºÍFÓdÛ3¯ˆ·Î–“Ú®ÅÌ# œ‰€ÒIR¶:õ.ÃÉ…9ZWszŒAŒéŽ3õp4â†G¶ŠÇ >p3ZV΃Ê_n`]‚‰,ÂûÛ7½ø>w¶Æñías‰8Hã8ŽAކ.O¼]ËZ‹C7â²Î<ÐîÅ8Ï~hÈu·ð/„sÅЈ¿’".?õú0PÑ1ÉåV²*—¥‚wì•ÊÏÖ»‹È’#£„ÛÊÜS^±V+|šyœxIŸ1³Ž½Uo#“w_ δOÉHøþ?©šŽøéxu‘¬¢i}µ­H¹þî~'}1Sp£ Õm¨ºŽ7ÀÄ£PÚéO#?r?8™iý²ãø.€ÊÄR%·».„šùþÝ·^JšoqÜõ@²Ú9îü8Ù‰7´“*Î ”¯izgìU]ÀîçÎr#é4Ø©þôÝIOÑLãõÖV K<ðÿr8ÈweÊÏ=lFE…$¨vMr³ªYQŸ=DúðŠUûPu4fk¨5ÎFºFS©ƒùÔþ\ä`a÷ÀqBëÝEå -£Ò‰§“\“¢Ð>GòÐã»Q䤯_ÑänRsž­ZEüƒÝj,iã®ÁLF#xÔA—8óÎ%½Ì¾àZ¶güÛQ~]­ç…~†*ˆÿèíÌâŸå£Ûìšx[k9´×˜ÝŽs#à˜ŸÒ‡8*7õÆ5Kš ˜8ý8¸žGØï-ôhÁñ›í—d|<4ÃúÃýÚQ*3²ˆ2e–fÓFÕG*­I©ç.`M%PO *ÂéNÂ8ŠÎx}àQŽ;Q*ãoÈOõ5§(L+oœ±WhÃÌøí\þ5D“½æ›ã¸/~µ,3HÏñŠïxž F¼7òÆÚ×ÊÓÞó!Ú]2Ñ!­É‹l{›¥Ú}k3ÏÀŸ ã÷>Ô³1¦ÆÃŠ`ÝKáÄþÅú¥ƒ'屫‚5eѹ:Ä¡dÀ·"²$?nÇ’­]J4JåŽêkªç]Zø~ëØÚ…‰úÏöÿó¹‹Þæ´ï\1D)+U ÂBä¯ïé¯m–®J5ü£Ð^»STKÌ…8)–B)ÓkÜìŽè€"żzîÙCñhŒy[Æ#¦Ù‡æÒ”Ь‘ÕCµ—KÚÙÏ¢Ž»±/7ešÆ{ygóÛCŽ)yÌ€¡X#çοÏ À~ï̵nlnÕ^+ 5¨7lòHÑMqô%$¯ôã‚Ǩ§üfÙ‘Š3ó}æ:¥Á@è;£!hè°@»sæ~>Èý‚M‰¤1ƒ rÃ÷éìiùR]Å‹¥®b(¨_iæiÉýzŽ| ÂÛ™F†›Å³N¡” yùV©.º£Ò{pý\•!Âd§¤Ñ›=+„R.éNokWRÖ Èå/)àü¾”Z¬|ÔÀØOlÂA.¶#Ül' »èúC6R#ü–-\¡ÌÏr ƒ/ó“ó$œþ7}[ŽõDY‹jÀÑ¿6‡ä¨Ëÿ<í§=ó¤Rˆ¯èºì±Úfv;ösƒù‰„qÞ}eØšó)®ˆ´ðJíÉ€öâÙþðíìç„>°8]m€ÑÚ±4Æ,Ðõ3AÌñiå#ñƒ«hn“ÉBv`Ž'B‡F2¦«WÜwË52f?›:>ç_»r.Ó6nÔI¿nÄrùՌÈ`0ù“‘ãxÚGÆ\Œ¨i@h4®È6è»ÐÙq>‡³rç%=L&S2¶Ýw Ä­º<Ú˜y¬$g8ßk'ër4F*®†)jK©òßÎaãThÜïïSsgÖž»¾eÓ'7wÜðsÜ¥=’®$çIôš˜‰C!ìv•D¼80ñ¤<(×Kà>˜Š»VøkKŠM„t'¢!‹3rP&˜K«;^Ìtº”|aqwþÖªÌ ý]ViÍÑ«‡“ TŠP”KAZ/t6®Ãç©è.%íÇÈÜ“J½$|Ÿ,¶.\¼è€N:& Bã«´ÈëÚ4µÈšÂþFJ 1Yöÿ¾§ƒvZ°µkI6àSj(Öª">'/åt–„¡ÞŠñ̸Ÿ$±4_?%lU‚‰þbüºÐ9!ή0ñwÄNB¤(ϸ• `©kò¼÷cBÇë¾;ýt°¦Ô,‡. mð0p©D2‹ƒC#Þd, WY»/–Sû±búS{˜y Íæf#¢dgi9?ê4oHiˆ›Ž¾zóS"|_S½¢‹ $^¾³ 8Ï9Ÿ-’úZºÆ÷Üjå¾ 6¯E‘D›“Hc©c'‹Ž|cÓÈó¿“ú< þyrÔȬAxgÿX Ý–‹Ïµ]$MAàÊ"DS½×¦ö‹Ü5>¹eüxéØŠ×nj%ïµè'ñŒÒ")öÓa£M5áµæ6ÄÒƒjï¥%Ð1/eG vŠâÑ[›hâ½b™æG)ÛŠÎ-u -ÕØýÿËe8ëÍ÷OÚü‹MªW‹‡4WCÝó¶—ûœy _T$•ÏѾ@rÏ„é?uÚ¬?$›ÓÞ÷P[‡¯!äý~Ó¤üJW©óÈI¸UM"n´¶ú´>aÒBl`œ¤™êAw¬å­Ã~rèÕhGË8ð*¦a:L. |Û¶xtnȇ”xßQ²êGN"GPŸTSLN‡sfQ+ÆY;¿ ã¯I/Ñ'O“vo€%Ú¡m&þs‹ \iAˆÚ ¶üœ\}šP’ÜçþN“hý`³:/u8#IšÒoVƒúExò‰ömºã –ºË||³T ÆA‘—XÛ «A`Ï '~Uo<ƒ ¥,“rë\j<þm,96üP\XgÆŸÞÏÝM˜|Ë›^•ËE±Nk戫>%]¯`ll–hJlSì²ôåƒn ÞNÙ slª§†_ödé”)÷›£r£ÉÅEšÎй÷TÁèç:úîíZÅ«Ãý"¼‰¢‘œ›À«8v¢y£dž¡?ú)P”ñȉu«º|}œç²›@˜ÆAiX± ¯[Ʀ¸¿ l2˜øe1Cè‡XÉs °‹ã ĺb~B¨Ñ,Š« êÁÁWºÄØõ—?gÚ{Uju}71¡uSâž-\±ûí°± lˆ±=_Q3&Ÿ#S¯Ps[! .îÜ>eÕ½µËíŠÎþâÝmþWúxþŽž»Ï“ýÃøTKmÛ#4¡9 L½!”ÕcXc’`f¥gp C)ùÕÉV@‹rBõBrh5¦eà2Ö>þJrŒTÀ³þ§‹·îDòÙkmPv“kÞ€›^("™y 팴Ɣ %L•>Je–1~y#5j¢ç¿?¤±&±@m0\*gÀô"¥ø{Ñ!‹Ûè¦Ñ Í®Üjš¹öb‹¨H$vçtôdSvÀýª½ÉVÖšçà°°ÖIל'Å"ÉY¿wâUî=©—þ¡$°¦LgXàÂâô©=pTÅ1JÈ£„šEš±zkë™ÝU]6Æ á‚k ¾þ(6‚§AGªûWºžÔi˜²n2¾ti–LVs•-Œèê‹_{ñº/!ämUAǧ ~TÅ*ý K&ía!ä¸Ëšø¾–]8o·eÐò‡1zC&9åF|[ûÈ+±ò ŒÇ³B1Y×GêªSð;ë2Dßi"<?Ýbê–ÞMP3;TÚ›ŠëŠ­–€5àb-wþñŸåg?´¡Ùsy×«î¹ ›{¥nêKTRQ:š?¤Éä@Î=½ù‘Ü=øKÛX׎Á²×‘Ò”ÐØ}Jâ•>z‹*tä¢{ * ŒOf ֑· ½Ç{Эø£=W"A-ïú(}"f:Ŧò(\ÊñgµVû+Ëp5³‚±2Æ)ÐQ¸ù5±9\PHºo!ÉõâXÁ¢ðB¨˜’…°ªOäf¥8‰¯Hr[ˆT>tÅ”³”ÆqDÙ”hÍÛÔ^æv­í¦ÅÑñ—äã YÔ˜¥:ÒƒX~B‘E|s»¡Ë¿‹U•«"W€™%ã”çTI+÷,dMŸXRµ©ï8VDxñ¾r{:’]Ù&$èCx \Eû?ßÍŠDtóð+òÄÁ9Úìã?ÿëà _¯S’%¹¢„G™/¹L¸†3fõÛ¾ è:TÌó÷}ÜoìM€ƒuF áÌQ¯ˆîèZÎ-íqz0:|¯a1 ŠEÙ­0öú‚ 鋊þ²ËÚ ‘tï$ýv³Õ' \rôœjäxÕau¶ø¤+—ÒùÛLˆ_§öúÄéa¿`³]l¾#T}´ÂQ‹ÔXdšÂ`¶i×Aæ4¸÷IÞjëîÁdÅ{"&pø½À¬Q´po–¼|`àãÀ¤ÛÙêmÝP¾MF“ÍTÃldóyLŒÿMѽߗ†›v25QÜ@Rbp«¯Ö»ÏE'ëpt5ÕŠ,LýÝ$¨4x¿ú-®Ëãþ­5a^üéÝ›å,ÆÖпåIŸ,FʈÄSLߢ•¹Ò£›y0A‰ÉÿøÛÎ;c"~ÏZÛs³c_³J‰W§€ƒÿÆ´ÿ`š„â+·M^Œ½î^ð mjÆîk¼¡¿ SlÝ w¯öܽuXz]:Še¿sJd½‰JAW‚7Ë5,L…†º0y’{šoŸÓ+þœ_ Âî/•Â; :}2QÿÇŽ€T¯ ¨„¦¨"¨ž÷Ó^åa–ìò•Y¸Š©vûé¯EÜnL|Ùœ@ó·GœK A´©îcë©>ñ$q;\y^Žv( ûÇ¡†÷ô?WºìŠd÷ÞÈ?SÄÖœðˆÅ3[Ÿ¶äÊÑo’Â퇙…FÚûC90ÊÜ+%ú±ÐÆ”nºØ¿ûÔM‚•Æ´ „¬Æ{©+2=˜?ª¦r»Wy¡±6‡. 3´ý»­Çu\öË€k,ŒÖ«Ü/?úsycRÿÏPab´­^ݶÎ\i|¬Š¨aÅKo¥-o@zRA#šb=8öŒÞ)¼*ö5µµGØ4|ª/· “~FÑÕå]_ˆå\Èc‰‘Pó¹:Àq¾¥!’n4Ì)ÖûÛÌŃïÄ€¼m‚…²Tw>3òøÄÑ¡AÍÌõbœ–#C¬·ƒy~¹^ŽHª³_ ä)d¹Pc‹;Á¾M=Rª-s[#mßç#æ÷qÆÈ­sú™Ò­mŸí„ùHa$ø 7 Â,€2ôKÊç³ab .8vªæ+ÄÏ=³Ï»ÀeCGKQ5뀞Ãà¨iIFMîg2«o¹u[Ƭä›ï*G¯Ç<(¨Ãêèµ^‹ExÅ"]¾Ê³@ÚjyÅ•Aú"ƒ®°BƒçNP€e)ùv¶há>£3§È6ýÉ5¶óÄCóRÍêi¿ºPö­Ìâ2,ŽÃ¨ôsHÎ^H¾[d­zÞ¡½Íû¨ïçD··à™óð@ªÛB¦åôT9j#iŸz’€Äz©væàÊ‚©‚Q.RðHz{©ú>+Š’íÐmE”ØÆKç tœ¡^;&^°®‹ç’Ž9_-dèg‹íŒ=ðÎâž‹Êñá=ÓoîëY¶9¨©·hÕ’Þ%R«x¨(/×— DI˜ž¹ÂEbûW,”ÜWZDñýhî¢^Žzäw}ª¬Þ9«¡¨C~³ž¼‘ôu¾wA³.,ë5ñlj 7yŽWÞ*·ÚÙ¤ÛlarÛ² ¾(‡(¥ž*QPNm]ÏZ‡©•¨cc,Mcò2¼4‹SS.£„¨NîpÞ¯![þ—ôàJª'ñ¼ ™ç)|¤AÈ0ã皇£èì3í•B`ù¬óí¬ xÏÔò8ÿ‹¾QDËÆë¹rñ¼×t"ªbJ[…¥ç·¥ ; » `»þW!/ûî ¥ ¦(šhïÔÔJe$‘]ÃÀØ+\Ö~v}/öo™BΔ¾£˜s¼D¤}$Y Ø’Ø=í¼‚JsS•^Ý"öà+¼vy™dþ/ÀY],N†æe|ÍÐìƒPÒ[j4åœÉ{X¬1?£cÒóW<0Î=ì}Ì|m«7Ïw‚Ö<™ëÞI3ËÚÐH tú„í¦Ì›Þ °ÜÂå$oIK^ý D~tgSŽríñnE¬ ½ŽF<|JˆÄ®S¹´Œ4òÙÉ3.•æ>Õ‘ùiM~³Q7Ÿ5ç¶n2¬I3¯FØÊHç%ÀZò6Snûù7àa=D¶Î|A-æ£<{kÔ£³>ñ/&]ã?hçá"„6±@÷ÓܨP'5’-æSt±>³´zpOBÉ>©L( 5$㨬ÏÞ)e•áM®0œëá)~< ÷zq>î„[âMí›ÿ"Å_féÓš½dhá`Ûq3+\rHG¦yü‰~¯¥©W”Y„¼ùìQõ”V9”ø ²\uBåÄ˃F)U/É4ñlMâÍú!©ó}žœPÊŸÒ#['«‹´õýÎ!ëŠÓ§IV¸{©ƒ¢R¶¶þ|Φü¹×h±ÿ¦ýäI6];É|÷=:*h׸€-œ ¤_Áõ³§UnÛÒvŒ¯œ 4Œ}L tDêñ»6~²·¡&ÅÈb6¡´`¥9t‡„Ì”nd])ï€ç…9 ñ6ÅD¢tyæeë)æ {¯Îã¤0“ïó¾JTßóâ B£ñ0zÔpãÁá<ZW5¼µ Ÿè°Ö™ ;õ^ '5¸ºîEIÓ)0„HÓt}uzÓ/¼ÇÅj¸+Ž"¥å—†€Ì&ZÔ ß¶,æÕ2õ–%-™%…‰Ì°ªÒ„¶¾qV•®ÏYQï;ƒŽ¢À:^¸Ü%G{?D¿â <å[âû¼ºÔõýúU©ô¨Ócª¡ôcÛÅ#kFÇæY·( }‹~Xx“KgÄ[_ÿÃÊ“c/•Zõ;ì%[ãÜÜ5-¦àƒ^ˆþBJ²ϱϭ¾,`ɵp…8Íԣɨë/>L|I²’r«É܃„ƒçeoè¼v3ž¼‰NÇÏ}lAýÑÄöv›pÏû#(/“íáócž¯OeÂá¿Ì$­Iƪ)*‰jBö"nU1·O‘@*M“MfË\ýr#f ¨›®÷­Ã<Éæá6à3™¾‹ÆÏ™x Mñ „Õ‘ínzö BI¡5ÖWBCµH~™Sxi?íð×ü)˜~A<¨KíO…¦è ÀlDæ‘3u¹©1¦d_}‹Q¼¶Ð£Ž£a™I|¸oVŒöþ øz)ðÈSB-@Þ¢1’0vò]C×z—ª Qß—ò¥¥KºŠP¬ÄˆKhTöìØ½;ñg&³º¢¢^©<ƒ­líÄ=pÓT Ô"98wk³»ýäzáíQÜ·ä9âÒw™ÒçãŒk]„Ľ>ÆY—QR† r>0ï:ð}WK«ðb_5j(¯Àá˜Iïn¼5„X„P†%G"Ö·Q!5 £~Ò F¿`_yŽŸ Žë*I’‚ƒ[QOr{›Û,\š°*¹,M†=øOg{RŽÜ/(%Åp€WðÛÍQãß#>α0ÀZXh]CþÚ£ªñŸˆÑ2Ÿúg¥¯ä62¾sܾï+÷+‘Šag§}Ì„ÞÇȾïÁ(–‰WÉR|@LÖS«Åùþ1»{†{hFÞoü,[ô_ÕÊýEP®ì{•+!0€Bö©qöÕ±”.É„,鼚Êe [~w5»š ®î¥IǪ§˜Î°¡ðdâg†:òe™ÑN£Ìï*üWƒZLr »¦I¡DDÎfä,Pe~×çxÞ{]O–‹ß;yuZ¿XqÃÔ¾åY€@JRýØE(cISY[¥'"iºÿÈ>öÕS{¢áô`ÌVÊô ò6âóBbãŠÆÑ>RRScœ@¤“oFo¡Ñ z/a*}«*Û©Ä¿°ªjž„Ì_V‹R<˜ªÔ髤€ª¶7Ncˆ“A?% /åðBÅÑÀgå°6õ2:žg^ƒé_õá©«?¨ù.ÙPá0çü Õ[”£…\ÂirZü¶ymÑé¯ÿ°Ú_` õC¸sä–Ž_ —ûÉT©Ãà¡L²;ËÊé{Þ%ðc<»ó®¨d†±\2¹á‡F˜»2¢¾æd™¨þ¦d_’˜t ¯)i¿ $µ¢liUˆZßB‡^õrxj,"W5xMBpÀVO¦‹©•\ô>Né{¦³êØBC%jöú ] Çæ5;%ÒKˆrf.ÒíRȾxÏ˃ú¼,bü‰pNgÒ$bÛzÄM‚Fšç3¤zd­Þù ºpý+-¥`—uÙÐJ"Ï»,$+Э2ƒóíL° ¦·aòÙÉXÒÀ9Žåˆ÷(žÊƒ¿j\BîöýJ!ñ-#-aI£ÉÕ)ÝIB„9s_Š‘ä';NÇ<¸’ h”Ñ[¡¬ðó݈ŸÝìNU•Ø¢WIá”tUnàÒ(—vJõÄëÒZGÈÏMs>¸UlT÷üìF(:$Î;}¦9ËëÓ×[ƒœ˜ÆGd)Ô*ƒÆ®Á„¡1–zeãš[òä(ÃŽÁ£YE œ²@ðžJ*’`ŒÝ ñÀØ/Eñ”1ÀOž<¤'­Ö︯=—út1VúZÎUˆó£(d¯ÕŒ¼ê,7?ÂðUuƒ:ÛYLÓœöÔaè}¯ß°§ ÃíZZF¡¢)U-ŒrÐ4Â7D‚™ì³Yæ?MÕ;ùÒë4a$î$ºA&r›5í€ï ó4Å{„<=d”c×䬘€Kz>vk5‰Cö3ª[€OÉJ[ÉúqpØ'òR:Øb§Ï-¥4—f¦øS¬B»NMþ±^@fk\H£™<ê4÷ÜG$J^9¤Q[ ÔM$ƒ\Nž";›%2\ƒbjÚTÎä-ÅQp娭û0”[n ÆÁöž„SÛ×Ϩ¶‹^rÍà7›U´ª÷Ÿr„ [ö¹L#B@ZhQd­,ÅõnÚ{Ch&'nN,RyUQe³õ´ÃéX;4‰¹ž ‘wT/>ýœpZ7®?Pãä;3£2…C—/`Þ(F!ÅVx†yÒF_”œ²k\Ãu¬ðËÒ¼¹ùG– ‰>¹NÎÍ5E’|G/xîÍZX¹1”ÛîÕ¼f;½Æ¡Fc›2”é7ú¦«gÉŒ Ûwuÿi©’2 %¶X†é³–2³­ŸsËç¨ÙvEme“M7kPyu¤é]åÊ9ñ³C Í¨«ð5Òç yQ1Ú^¢%•ç€Msë ZÙDþÚø`L'²GArkׯ.ËrÍnVtõP4ÉT–ß Å22¸‡ûµcpj©Ч"«ŸÙu•ù¨¼ùó´#`>š°nã“ôóƨΧY¢Þ4.ÁhaSÊf f=“6E8ø‰WÐþRrÚB†Îª*r‹PŽ:+1 ùKoÕbP˜XZxé¯ÄK÷n.ìH/óÏ×tùÔŒæ'¯…!Ëüª|òGÓ’‚é8ü̾زЇ®æ,™ßstÌhsЋ•qøãìž*”k¦PYÊ?¹NØ.æ$iÄs8àeF[L62Ð:‹¹.•ƒÛd¨Óîí42sESôÑŸv¥y£ul\¤ýÔ¯ ‰úÔ3) tRè,‡ÌËGdžYOÊu ¯]‘:¿x6¨ ïËÜy?”Ðo2s# Í×V¶èMTI7½í®K?`…Ôé+¨Ó‘É;·£Õÿ°?ƒ¾Q§ÈêˆNk×È'beùgÉJU¡ ÊÍq„MÀ¦ü"´ôðÂ,ò¸ª ù· –Ëšœs~óÀ¯’³!Yˆü€ÿ~:ÁwT`;ð}:<¶É& /o¥nÿx›ñàLiȹ]fX| G©a³«ï!˜ßØÞÀ‹TL|?{å9T¼mÚåD¬÷2Ò¯}¢5ILÙ_Ζ"?ÖX•:ìMI ¤¶õœÜNÛ¤u§(ÏÄ!šÿè#Å=;*oÍ$åÉFóâº8ÞÒ!['…§¶ os3bÕÜbê\Lz˜€Î‰R¶÷8aÏ~áÍãÆêù¦Â'”?µ6á"­RRüq/•Û.'â‡F¸§£t¦ÀNÿA›}j¤² ¹E;S^ÅF¤3Sº‚ ¶*í.òðÍñtþÛ-´¢£VãÎTÍÕ`ú”¤Âd±]w¨pȧ4£[-ÞOüKüw¹ç‹‰æf¶.J4 ¨»°‚È6¬w÷â_“ö£Î·YÄS:ùv/ŠÐØSçÂâ1¦©¿§TžõDK<âÂ@#_^ oú%ÐŽÉm«R0nùeÛ©Rœ®÷(Ù;¡ÇBƒÂuó¾Ö {¿á³ [:oæ ýS&òÖoÁ¢‚G;„‡ÒHÓ܉VkþÁ«÷ß¶«¸à tÌ@ÇìFNÚ ]sm¸6SàäãQÇ•øˆu³Ð¾M=ý_Qé,Sz> )ÀÇ –±ÌæZ¦^4:;î_²¿2ã«§!ÃP+öâÞ½5osôOMeêå×BØPN*›Bì#KÕYÙ Éi"òBò¬9„˜ßC:»m-%£Û, Lß°¥,­í,÷ŸŠ6òw˜þ¿‹EÓùDꕱ ºÒEô27ñ Øb<Ø.bV䓳m AD¸Ä4S²³ogÜøƒpµdIa£«CH!jš Ã0å$$ #žg)í6X÷L`ÿ†`•êÏæþÍW”›ðk³Ì/« UÕSLÃ8ªK@F1á°ð9æ6$TÔß!'B ‡“ŸÑý+ç0é[÷ *â©h:1gJ׾ˮOž $«Š¤R¬ž9<èÏâ.fÔôùqŒ©Î©Ýן-¾—š´i+|L° ÎÛ¶?c¶ï·1Ü:l-ÝëJ;ÃŒS™éÆEuOn mtîÿqßMaf|$b ³Ÿ_i°VŽJÌÁ|’ꨉ̜–þÆã®dÐC{Þp­¸ž¹ˆp4X³+M1`e‹¹¨‹l]=+°{övB}^w< Ò+Ö5Œ(¨õ²A¨S¦/x­u¹¹dé!©“t;Û;ãDÁ¡¬¼³Ô[ÑùÚØ  ¥Ò9X¤þˆFVé!£­a¦€šÃô:-l‰!ÞmU%›¦GÝøÜ{ص2CpšàOyæÒÛÒJKÛݸbtµcºÝk> M7´tC|¬Æ4Ž7…¶¦k°LCfzqþ€Ðy(Â굕­ãÖZ Éíw¨–ôÒªºY[ÇZUÿ3¦ÜKƒ#ºò×'¦fìûjdUÀÇ;ªÖ¬æÔïÛ’ªí3 ?UyÌ_WT¿IÂtÖ=e–­ §JÔõ!¬6öÙ8×KjÄúa&u;_«ªÈ1º ßÇö!¿ÆŒ4˜°2ùÞXáFÃ?e`*½Å‰Db8¥ø{É,Ž1åcC;ƒÀ‹FÑq©ÇœÜÀ:'!|Q³ÕaK+YÑocÝÈÕ½O6‘úJØÕZk!«gB=QØN\ T É¿Ó<ðÃá¦&…æ¨/¢„,™šÿšÜz*"»sçmg —t$á½øs Ë égB€I4BøÂOïš›fšíÞ7}B?ë!&?×¶Ú.à ĸȰNìc+{è‡dÊ‹vŠŸÿ ƒn ç {¼ÙÝPìùsM jüôÞe0a:¹F"ô÷?óÃ_¯>‹¤ì(…äýàº0䱃õrQ~ü@6¤sR0>Þ™&OÉXT#éÏ£ÕðŸß‰Ü&‹Ç \ *ió;ؽ¯]Ý5ØÃê½4–`y§Š>áQä¿Åƒ”Ô÷å.ã}$3ýŽš›¶'ëéw¡b‘nû×82«ªRí´ìòüä´wîbèau»²ûRQYòÔè¤Ì[aªl¬åØèn\<’ø$’Ôë"zÓâù6j rçø¯y’ª…kô[KÐåG­Ä)´“fšj´¬Gù¸žá© £G ×÷‚ûPøä…®}F/ÔU…"rŠc èf‚ôw#„à—vÍÛÍÐüõðÀÃÂ놰¤¡¡eÎý£ØF}^î¦i^Áª{š5ƒ7»„:ñvt Z.¡G B|ò,±û‰0_@ÀÏfïç)Ù'²îbPJRtœoýwª@½ÔžáQøÒÝò¼M©W{Ç”XNRé¨Ó/S=T,0GW5„ D ¡ÍÀcäkù¶4q¯°ŸÙJ‚mòBë«Ñ4Ë÷«#„‘±JmV×ÄU£ßÎS8¹ûoñý ¹U#®ÝÞÌ‘‰OÌHéÊ…GötÈõJ7K¿ûÀ¼±½…LÊ…c¦¾uȃÅÞßèKU®’£Ú[¶£1¥—a[6gX¶}·‘ÂG>B— o4íµÊØVL§€ô#ýªßËøQR:0uŸ…u‚‰S´d\iÝŒ‚öÀ¤‚¾U/zÊÙeâJ÷»â’m€Á›¾ŸZÙÌ)ëØ.Z  ðfcÄ·à~— µ^X{Ä?êä̵õ—@RñBò}ñåÒ¡ —Zv¡Šš Vd®Â¡õÌî½Üš¿°Ü%ZIºH½Öƒ1답Ç@·Išõàž?”µb½ÈUÔG»Xdž¸¶g9£tÆS3R‚ñ9r|íòðÇ(­ÉUm¸Xðan¯Ÿ•“ÁxF¡³Š˜.›]!`„ˆ ŸiÖHÆc»¬Bˆ4?0éFT©x¶€¦ö —6­œW;øÁÔÆ¾‘Ärõ˜ñ¤^ÿÐ ¢ÂL°”;½Ç¸´ZVE¯sZø‡œG¥B݇þ¸×êÍ›n}·¿\.ùýJšêÛr@™Ï˜rÎ[×ÙRÁ ™.ÁMimgã63ã`œmªuÊlkƒLëó>ÑŒµ¥ƒ2‡º %9g© lj¹&Ö)Àµ³|‰xg%öø| 0ÌÛ‚3ÀBÌþ"’A(Çy/v³­±=[‚$²Å½äŸXwíÉÇwS9·VzÍð)"èçúw…ÒîøPx ¦Î îC<©i›yôŠaSQ]eÛî¦C˜©7¹4b{biËoQ–ƒ„{ù¯ ¾:¦Pµg„Tæ  tûoÐWK¼$^ÈÏ´ÿK‰ñh—×G,  Â&—Tž_Süˆn³Míur|îD›Þ®$ôe4â$F»™öäíÚîs±/x9é€ÊØ—§ÁM‰E‘–tYΞsøöpC"¡µ‹LѨmˆ¢¢çþo˜¢€‹ÇϦÚÄX…ÑOÝÍýÁ¥Hµw†ü­Nå‡'·§ìÎ…I^ Š mwžØ…ð<Ò¼A¶A_Š$ýE÷*n$æ:ŒqʈÌÃÌòûMBµVnÕ°Aa¿§Ãûú¨¬2ËhîfÈÚ¶‘‹£Á®LUWÐŸÜ K’p Hëçã¿(™éAÅFÙŸPg±+페&#¶ß—^OO>ÿ›ÈKr»ä?—‰ä3á–%•…¥QˆÂsÅÍJ÷L<#W²­M~¼÷®ÿ•óÛNsæ]ü1ìÌëõ$¾\é6„7UÉžfóÿ @p^.xõ‘ðÁi±¢vÁ/xXL É+®Û®p¢&Û5½Ü=½U¿]Ä~äÇBžƒ©·\çôF{!WŒ-6­Xbí¥O窿 ’•bFœ–Œ×œ*Éç0dt°p_pðó¤¡ô@§†† ±½í{݇½O{GÍ3y?*¡r®#f4ýÑ8SM@Ér±!†Åø`óÃ×¥4«e\KŠcPÓgÀÛz))p.ØýØ·TYâFÚ/ÇòH¾³Z]¹àé‹DÄ-Gç`Þ Žu4&ší´C†7~~Ïx†½f/³šÙÀRž )øOÂX}÷@‰þÆ}«ðIqè €ÿù¶jóHº“ ëræ$ÝKù52¬’ÇY®Z£‡K1Á+ŠNµHF4ßfPõEoQ>áD,•E”¤¨JÅfûÝé#ð¸µë028Ïâ'5È”Qå(6ößý¤¡ø”¾ÈYð)âLV‹d¨EpGÙÀað]u$ÊgÔhAmùì›\ZÓèÌú¤wñÝ{õæÇ޵Ó)€ÃÔ.8µª_({Éþ9{[©Býׇ‘ø ÝpÞõMT»¤zìÜÍD÷áj{ð8ïùjç Þ›µ¥’즵[²A½ùÑ9-‡–GZ‚¯©k ØD7<{c'q'Öæó Ä𦸤LÁ ¿v'¦xUU'°qN‘åH)ý'‹ÓÅ,™T×MŽè mqP§4Œº›·x`K7eâåšø"ÒC¹ƒØ¥DŽJºï}žFøºPàq¤¥°Ó/‡+ù…ÖÐdzÿuþL²³°ñžr·Ùgßž©ë”|‚#ÃBl7›)E`£ gY¤¯åªVv/—ӓ]ÍKGq??A“3.3åÞa)ÉAœ­—¼«û·¢k¡å^»ÝÕbÞ¿²I ñ¿C—½¸‡M:¹xQSP‚9êf°%»³eç,ÉÍÞä²I&ƒ¨NqyvºQÔ=$+8·1ÉŸŠ—èòaÄs™,­Çzp”½©UêPW661_ûë¡'^‹Û: “9|O¶ã¯ñƒ¿õIy(ðþ¤ô§–wP¯‡µ:‚x*múIBÁ/œ™ÂÁoÒ(5ÛW°tìÝß!Ìøçª‚2»…ȦMÕZX ä\ZRT Z1a5o‰ßʱQ"¿°á“ùý+éÓ |ñnÍð<#óMæšËr6$^E$sA÷åÝ…£,±!° €&B~ÒtsÚ¢''^ÅrÌÜ1ñÐ4¢6-%â iã6JLž*—F’ïý¦Ññ~"Ïà~šÁEã·=…Ѓ$ÚŠhß¿™:F@„‡¨áwÔpò"uDß”ò©–H—Öq0Ÿ49GÍ”.J"ø\·+BGÀdwV<“A®}nÖ¬KãU«·xJ#J±Ä¼C_ ³×GUfŒÁ9?—+ª”„˜Ó7þsâ{ê#œ¾ÅBTÆl–MŒØÕ›\Ö˜e†ÝtèÌèÁ¦ñ9€5Yheš‰iÔþ3¬&`{[„mú5‡ã`Ûª²9Æ5üQ,ÃeÚ$AÒÆÈ~k(¡Åþ‘^ $¿~Ï$…€Þ‰äaüß›ý‹NZ¥RÛ®@{ õ=öš–òJKÇéª)-‰á³œ!ùïy®Ýbø?—qG¬bp²pÒÚý\-ÌR7x÷¸Ò¢rÁao­Ƥ[a¨ V‘ª|lÄYë&¢!ØM{²«Üò YÚ‡µ±´ZÍTT¼I“«â¿Q&mÛv“Q¨BœÑ·0 î@)FöSd œm kjºÒ@xL„ÂmšQÛ ´Úh†¤k«fÜÂÏÝ&`ŽwFîc2ZJÕ(5,Ù\ÛnÃøFy~Ææ˜ÇpC,J¤>Š¿"¡WÕ£(ç©.%8_ÅÓðPÁ´²oß4–_zÈ®Š*ŠsÃÒ—ÙTé@Ò&`–ø:Ò‘­rÀm{£ÎŒFM¦¼¾<ÿ u^ 7ê5|}.sp#`¼ãÉ8 ¦>¯Í{Ô¼Õ¢·‘ûŸ ù·”åR‰\îs#Fþþó<—šÆÜLc6Ž˜€SX‰»Öx6âYΘتž]\ù¨M‹[°y¼à—…Ö5ø…D¥61ú_±Ë1ÇWœ€ N¯A°†1ÜN‘0ÈX'²¢˜®Eç*->!éîz$B[F5wýÈe© VPáà’;q-t¨ùJ9 Èµ•9±˜¼.øqZÔî‹Í÷'’—Ö-מ khmé®6RÌáØ'Y胚ð%I©t@ü—&Ï,âìåmÍXq«ÓÏçâ¦/<áco½õ¢)~ñpa߉6ó{©ÂºÓ¯×§Fªkk Ù5ÄŠlWª[–ĨÞšK‰Aív%­ñ>0¾¦n…åg¾É#c‡þXr'É”œ$#ôù P#Íå 7L5Õô—d¹ù‰6F| !E©^_#†«£Þ3vÒ‚,=\ƒzoõ9‡XX•€b +’ƒžþ;Ùz_јœ‹·)÷vÒ»Pß°‰`;=ñZµþ öPh¤]Ð’h_ôÛ @±?牭¢z·ÁzW g9\ˆ˜a.äÂWû**ƒ\>£[9hX¼2g™ë°:dPåÓ¯`b‚M3äOªÉ”ÑV¿¡½ È%÷^³„Lš+ªù3ûû²*9*e/s”<þ'[€¨À1xë¬9عQ+W4¿3Z®‹èòBÄû8óóþ³[-åiRÓ\HÆãzÃÛÔãÓÆµÜ‚'ƒÇÚYŸàsBæô¦±-ôÝXË•õÓÚ7P>;¨6ì8+ÃïÏÚß^ˆ³˜b=ªŠèËø¬ 8ôYE3pL„(Ó8íî½!QôådZ}²r¨«*Bµ°Øº—Hß"ÇÓþcE$ÿ€ž&\×Oºõ‹í-ÖÒë«l‰?ÞC; éAد„ö¹o&¥ëd° …ÍR5‘;ÃsBËqÆ ÝÐliÀ\MË‹|:ë"‘Ì¡À¼sõíŒf¤è¢}ÙIŸŽ aGr®+ʬ¾ l»äm•.HE'3 ÊœÂè€ÿÓªÞ‘Å §È…_l©yõGj)@7DDéïò7#±¬pÀÇb~ó’?IfZ0ò.v‘Åÿ!·Œ›‚îk£ GƒK¡7 1LCc|îy2±9|@÷Œwá*Ψ;ŠŽç¼ž@Ç–¸z¬Ù@>tP‡®ZØÀQÔ%CÂ3ÞC–\(h\l4|b'Aê;àì*I{ p·ìèk€ªº'žÄ?¸iœ~…Amű¦î–oú ëQ/}&Zc5ÌMÔ“ žçÚÌÓ‰’ý³Ë¢¼ø§à È65ª’’*r¨Ä&øv « Ih|šfü¶|¼éÝ «ŠE)*Å÷MŸ8ÐŽ ððbŠgåÁapoÖ ¶#Ô6 €èJýþé ÝŸÿ­-y;™v|BŒ»®Q޾!Êêºã;0ƬÑ]¼ÁKW«¸¶Î„ÕžëF'É× E@GäbµIöc¹Tyz"˜ƒ­lwz×ÉUÓÞL¯œc¥8p€ÉHÒ<M¾éÉø~[æ½ÍàFS:8&+.v¶7PÖóvaÕ“˜`BÜúˆÀož º<0gÙb&™Úã7—F°õh&Âz¬@ÓÓ¼4ØnÄ­ÊœšÚ=î`œô |Mh]î p7üÊ*% ›ºs„I#t†µ ¸²6®®àÿ@Þ”–>g5Ý=¿a×2åìNçòöœµœD¸ÿÐë©Ìx KS\p_+˜Ò=¤dIä“j—Ñp±#®íÓóÙÒ”ó«ËšW‘'»—l{‚¨‰1|tº,Zå‚x]†¾ÅG5·¦è&å\Òsì6€®¶¿Ä}ZY`Þ×) 骢Onäy»%5{ ð á¸Û„¹÷PåI<ï8 &svLVïö=ˆ:}ç ÂÿPTR t¿WUÆé¦··¤D]Y©ÇuÔ¾b^FTm¥,<½1Vrÿy ¹Þ]™ó´âé"Û 8ù.MÊÒ¿ˆÚñ[Ûþëw<(ÞÓv?_yÅŠR{½ªè¨bÃ)5¦PVŠŸ5NêjAz«*ÒÄûa×ÃÂ3ù¹üÏiô\7P‹¥áp2Ãs·]˰š (Y#3 WÖ‘)?ÖìÑþA…Þ³”#À'Iuã¾<~ûÍ¢uÑ“PR§E!sPî[ ”öBö1Þ Ï®ÈDni*VùÜèèÇt?„wÁ "qSOô€_EeW’J^4íÿÌp­:R =íBSÁã»$÷±¨àNu¶¥m­3Ä÷Sl™JÙæ¤ ñ-Å Ó.·˜ÓÄ@p¸}„ „„©òŽò[‡em¯),K¡¸ÉksÙímš•ãV³‡¼ÿîäÙ'llj®½ž¯çÉ_DÉ%m~0|ŒGJ¼2uºê¡µè&@áª.òWÈìØ«ïXÜ*ð{Åž!ùu„Î4­˜E¯¬:|ÙA+V'áçè¬@‚ŒÞcˆ"–‘+Ýx¾0,i ¥Û ˆ·”Çöƒ~°S ý©Câ#ÝLœ_ýºMvÄ»G,¤½[ð>ž t‚…QYŠI=›FßHÙ;VXYÎu”¥xìÔ@ÍR¯³ò?¬‚F{"µH&ƒ†”ñK¾À¼¡|}¼2B4ưš|YéE×s60[į»éæ¶N=2ᅥjK-šÐ½gEe;…aWëª,¸úßMÚ×öa‰¯pmÛ5á£Ò@ºÿ‹Àmô—!ŒÍØî´ñB^hNš¡Ë°”%bË„ã+Õ©¢ùœÀ;tž£OFÑfR­Å*(Ü»HC»“wðHKéç•Æ9\Q=oÃ'wGµŠ ë ¨ªs²1]ó»Ð_ijlL[Þ8£q-O•vB~œYÒù&å ,é×çy%® æúÈòE¤æùš,\ÆŽºUŠoÔ,é?ÌÀŒ?ÆS`ìôõíêåcédE6¨‹€ñy‰±]Ò šT'²U‰éUÕÊÎ]¬®É.Öž ‹à~ ™©¦àïT…=‚} W ¤rRœ£'Vëáë/ÓŠ»(åßuÀæ}Q³ÿ— o¾tFAûöÜ5…'Ñ|XÏ_B9y.Ã=C€÷–½½j”»ûÈŠ~GE$5¦l||`g‹NoŽÜÙ"vàÛŠŽŒÛÖã«¥dü¡Dzó›õxdÂ,~DÚgT¹9F*výÂÜ©™Øô«î‡Ý^ç*ÎÏÓÀ±Ü Ø¿ÿ”ç:ç°Ã”I` ZüìJ°·xž²u§ËËMö±MÄNyý´Ò¹VÒoñIËŽºør">¿þjfn˜xèºEC (8¦uúO¾»t¯¿Úé$ílG{ò©l^ äcî 2Œ‚«?’ÉÊ; O©ÕVSŒv<Ý“8DæŠe_ä•n”EÓ›²k¶{{N¤qâ¼{ÁŸVa=pÛÉÒxÎBœóž«/l\‘DõAŠk V…¯CÔaTú%KU·„vðu]‡á™}·åÿS³f°ÖÞ¿§öu¶E£Á«r)§L]œ‘F\J™¾ŒŒcÑy Zqh ¼¦fùÒðW) c¢ßüx±R©ôºRyAÏ1£ÈË9ªGîVܺk |•n%°ÂiHfnc´ÿ…öü|€mp݇“S& Q}&™ØRÆ(€…éÞ*™}O¶/zÈÁ# ¹ÇM§bzíÑ3LÓ&pVõ^M¸‹rÚ×<ˆ6Ç'êfc,C£Ísl±^ ƨ¤ÇWä´œ3kÇ"&£n…0¶àãÝæ]Ø@=ØZuωí@ *Ÿ—8ަ—“¬Hj¥=%{u,Kp´ÂŸ'e…ȱ2 ž†¥(2eUsY(¹ø2Tq ‰Œà³è CEúïÇOg#ŽÙ¼‡ékâ4D~|F ®,b[ÙE/xg €Vµý•dtùX!ØpãW•òŽ  º™ð2™#²´Ô,¦ ”4MÂ9ö†iî ;Ιö3è`2 ]”ƹâü×Ð41a9„ë~áÎcýFDñû ¦Wßë Ýš⠄ãÔÖù?yå Ù:,Û5¸”“.=cx¨O1x©RxÛôhäÏɱ»vØÏoòøV{'G3¨“SD°|Ù3X©·=Áâø?tˆu¥çŸ,W¾†‡èÇsõÒ`à vî™y=Z†øpA> :»‡¿­”Ê£¨FP.%Î*&w6m™V“Œla½…«‡=ØšÇæ0¦M¢V ÇGò«ÔQ;®PÚn0Ai7ÕÄ·jóñ‹ô£U‰˜_š%_üZo“ ð«~üÜJƒ`öŒØ3ªg:á%>¤?è‰ÿ´Í\(ŽWZ±×} Ï‚'\cd–BÞá¸;ùPˆÎÜÝ׃>÷×óßbÅ;#í-:z¤ñe¹i{"wù–öR¥ŸZ TJãZc{çîÚtQ4ÑMiÒ”v³Ü7^hAØ% ºlÍ9z“Ô“]vDʺÓ"{ Ì];àqN”F¸± ¨¤“b3RÖð ý_¤L[mUœb ±fëyàÊ®&Ï¿H}ì+#YgUÐ-28[{)f@\ÎgVËÊ òH C$áÿ $¢ ÄYôu×0p ÊÂÇÐZëÌÿú+Ù à¯'U’:¡tá­Kv´o‘Íä¿û?Á3ÇØjE]ºÓÒcØ(O ´$¿ ÓÝcó{dô™Ÿ©çÆQO æNµ¹NÊ{j:Š_çrçÍè×ÚßÌÀQÍæ³Ñ¶‹›$˜«ãÛ&¥ñeš‰@McÊ!ÒpáΠܲé³&‹9 ¸.}Yy ý&²öкãŒÊ ­)ZnÒÜ Ó¢Jz$…1&)ð™Û3:u,…âG{<ºÉ Jâ4»ì·Ì”^²Ü†Û™2-Kø9mäEÍ÷–G3 Ïz=j‹±nßA:#”Ä„¾‘pŽjMÏò!k°ñ'Gò¬S&‡ˆúŸžË‘z_»uãØwHj’—릧†2ÝÂCí߬‘Š-îÜd½ƒm¯þŸ?Hk›t‚O ö%ƲÈ{a’=aõƒSO¬TtãkG‡9Íyy] ¸TÚh½C;ƹBÍåû%.±u,ÞoÄPl^9ÙëxËœ˜{¿)é-g—´g¢f€-eå•ÚòëúyG³—æÖ7¯-¾Ô]âÓ# F“ñhøø±‹¢¦­›6^ÆM]ku:Í8‰¦„éš\(oøÂøÅ ƒYÎp@=׎¼’/éï‹ã˜b-¡¦a}>ZÎV¢²$¼«Àž©ÖT§™ý¼¨\MC3´¾X¤^«®éÏ’|Ô*ÄdËÆ>ƒÐ6í^oŒöü1{èA+¿&bD+iMžhœw[…Nù¥ a’Ȇð1È^» !ˆÇÈJkêxô—s˜0 Š¥Ô½«ó…®°¼ Yj‘•¢æõV½ý€/‡À¹Ûò£~·pd´ÌÞM-àá:3¿b,2Võ÷x,C›ÏE§‚Ø#à˜|¯>ë¢Ò+çZ—/àå#–µÈ‰ÎhD•.!öý”ê˜Ed<¿GchúƒjÌj¹Ûfˆbr1·Ï•²RܾĽ0Mv†fËO $ Ì–LveÔÖ…'7íøUµâU1ö‚‘2éïÙ*KSAðNbqk}QlÚbže䞦­v¬·”ñ d·Ï¥ká\DÍt¶ivN—`9Ó'—%ó$èýÂaRM¤¹¥¶¦rŒ«ZÈäʹ³lS£Ïï=¡þˆÞZè%ðr]&ô†»7'sôÂ#{#vÛÐQum%áI™ûµàÃe Y}ß©`[®1ˆ¯;X•ys³¢ûû& í¯*fMŒÇÏ-ù¢ צéRù†Ó#Ð"2—ùE,•4¯¶#BE¬€<µ«ÄŽ¡ÔnšYA4ðD4VËú‰;GýÏçw'Ö§hµ/¥óTN™ÀájŸ9[%8©"<àú²=Çf¨Ë2ÿg­Ñ·Бoý¿5†Ú‘ ³Õh÷Í4 Ê{*è2—–||—’ñbä ®-Þ€=ž¼NîŬï¶ÁµØÓuµC"Ê‘¶»x¤9)Ì?¹}wN6Çq»¢åaúmæX¡Š%Àm7óÃgÎ*µäSÑ fùŽïXÛœTº ã6$ƒ@§5NS†Í¶’ bŽêóWÀ;s€ÆÏ;è¼çN÷’‰LÛ*¬uj­Á«o,ÇñYvùÁ±SS-ülskœÑúÆ¢Nó…NMí¨´DÏ¢°²˵m/Ó‚òúÐ(Ã3{KÚRʽø”^aÜóÐáMŸ—…!‚ õ™ðO‘¯õ1©(rFŧ¿žn‰dVèŸH[gþ> `b}_‹yÇ¢JHÉÁ¨#/mc?‡ª°)'Pu­ÜÕtÐLÖÁç†þôÎYÎcÚ.?oŠ!ò8†Ûë,¡©¬k&PhÙH­2†óô4áNv–Yk榀½‡S,åìP±áÐÞ{Úý¼öIµJŒ­¥¾aøºê>žMëNgVáym¦Á½´i-Ù» ›Ýƒæ^ÖLâ!©“ž»‚7†XøQÃn«z¦B7¡ry„ Öd pþ‚øk³¹ï„Á±(Ø×ìfü^wŽj’Òˆ¸óÓMô"oç sÃNáÿ¡£¹Õx|Kõ÷…rèläà„^ÂÇù!Š]E•¾ª×¬õêïݤ邎œoûµI=ÑüËr31ü®×é ‡ªÈ0ܬ”Èwׂç¦{}µm™`¤É‡²„ yyå ‡ñª¯V‘)‡…N*DŽüÅ Û$f…þ[ÌŽ¢N eg8Ù·á³Ü¶qr6ó±l—¹,   zÓ0Ïú¤(å¾õuV©W4}¤ÜÒȹœt5Z©~f¦/ûµZïéÏyȰÖXªH{TCCŸ›CÜkõîu$ Cþ†'rr_ë‘ÂÑQù`s©_ÆôI…Œ å€Çœÿ˜Y@9“kað‹ÁsZÇÝÇhm;¾‹‹äÓc½½ûYµ}ºC¾ûû‹ß…/®·p©\u0ìzà­WKb ñ0[•.z•žÆ‡1’ÿ"§HBÃëþçD¬ðŠaÁÀ²jÎL»f£Ñ8xLGÏŸØc &8§œ½aìúM<Û–Gz‰„t(/2¢ °]ܧ6fiÁôeЧ<¯Î§"©°S%jà Þ9IåÎ&œë’Ҧݣû¨…š6Kc¹ÐTı tÖu€ À·6.¹Ûì¼õ¼¤Á¶Ì@Zå…PKK•2h¼t®Þþ»£Å€µ·†«¼§`_¹ßK¼Ý0†ÌrÓžsØÒÔ{õ«‘òŽÏÕy5iÓ #2÷dyìÒÞâ0{5E¨°–ï ó®Às'/ 'ò1õ+>Ú*a pÂË€˜§ q ‰…踤ˆ ภµ# ª˜íµI´€˜‹‰Ï&F1µWuiDgƒâç}Ä2€:À%«¡N[¤ƒÒʱ´àJƾµw,íîåÎË u€¡Ê~)(—9F•»*g‰»½ÛN_£u¤ÆýêÈW¯³J0N€Mõs¬ì&tÖœ(÷Pš ‘@"zA%Äfßè•«@ÅeÒÀ|ëC8ØcW~@æs:{»^—Ç;¶Æwµ á©,qmª“è^¬YFâ8Ç$Øl]ù± µáίö4 kaç†&ƒ_¿’‘œøþ&`ñH2Ýå=Ñç×lZɹüzÏ¿ßG†=çˆp½3Ã.b.YæV4¾ú ÀÅo:7á׈Õ.Ž's{Û¬q[sdÀ“^Ck5~@ :7l¹µ.|@TnM–†ƒÃ“» dRÔñAê ×ð)É÷9D6Úƒ ôxá³YJ·œ K)20PàœLØÕyÚ? £q?p·Õ¬¥ÆÑ£<-^´Õ… ˜(·ŽA"Ÿ0À »Ï¨S´Bòg£õå=þÁ15xëÏ‚=®¥»£/È”¼Ñb@h/ ö5ì b~(ƒ¹¶ÒDŽRæ HŸ‹ñqh=×Ý”Êñ’ŸÏ~ÒP!&÷ÍŽ˜8¨˜+u~Ò:žbóg:ÈŒ!1õž€O2nÊ\æg˜ÇFRªŽ?≦ñÌ©N¿Ñ+ÿqò L‰›7®p¼g¾Àd½F+«]NĦ ½4YÖp“b†}”;òµ¥‘Y©ñ¹èš»JÔ{I£àËŠGF+õ*b5KUëûàOí ?ڔǶÑò(òR‚¥\­1Õn3ø³fY¬ ¨;éÅF=òq;â7×zGCKº¿9ÍÓ°ÀzÍPyxÁ%6ØTšŒiÅ+ o^ÏP,úâ3FÓsÿuÑñ¶®ˆ¥×2Mûª²QZ„~Ë.0M¾ÇÛx\†U€GzÅ7F·;Õ{:hNþxF8G•µ¾Ç…õZt¬ÓY4ïºÏg‹F.Çç«:)"ðß÷gi9 aÍd‹g—žJ ûس)}dÏF·E û õ¾áíàÙü&F?•¤*q rŒ;I}ŽvóDûyßau5®ÂÚlÕI\à÷µcñ /P¶¥µÖ–š1–‚›»`]Ú\`‡%Dƒ ‚vÞ™ [þ=ö‹*i¢ " ‚WŒø²{†6¶}•–LU±<ŒµÃþ8]-"B¦6ÄFÇ«+F <:”ƒ06øÉÛ’Áì ì¿w<†æ\tv_áE$»l¢ãâ ÄzÞ„kL÷ c>¶©wë^˜èöÓ/N»tpé’â#ªóÔP>µ¬ ¹l>ªw¥¶Uàv5 =Àx9q¬Crò« £xv:¯ÊZe!â*¹»V ¡Yÿe¬Èbyö•GùÚ¦<6Ëz±È"‡ÓÇ—iå®>}$‚Üx‡iùM™û,µWž¡ñW#ÐÂÞÙi‰Çl"ŽÅŒ×ð{}ɰÿ~äžïöÇw¨w!ð%O#³ŸâNOö©«<“Fš°ûD7Õ¦'-ói—û›AÏÅ|hàáèp/ƒè0¸&múˆ7”Q•·×¡©Ï3Y|óÕ+5 bÿu®µói|vŽ@Acw€+é°#23n…˜üÄ„åýM”ú‰4ŒT4  »ÿLÈ|/R¹ìGR=sýÇ;[Ãú¤ÃoEíÑr¨d×Öÿqg{ ÐfN®ß®Óôkô¤IJ„YùÌ¡s‹3Âmò¶®SQ1Ö~bHß –®ZåðLæK"âgpuïóÅàÿ)M ŸÀ]ÝS‚Û›œù ÚÖh(_²Æêä"£(D–«>ŽOèLÑ_ñè$(%8ñ!ïõq ê_H±&år5›M¨O“>Uʯ úðÄÓ¨S¡H3ÚKz¥f®ÕþȰp»¥`ñ;D,4\¯ê¢ª¯k(YX‰é,=„À'!ß`þùÌ7|ò7ÌMt´9 ϠĶO„©ëIùiÙ Škh, ¨L¼™Ü´”àÌаÛ½ó£÷k¼@ñ`—°©ã¬zWÉ„éePœ·èiòôk$é’9LÞ)|ãÈšî.nø/‡ÀâC(r <ÏÈ=LȰÂcLzWÜú³FWÑ‘`¤]Ȧ‚²fÕ‰¼ êßáø”øu)ðúu9mG‘áü4êÞÊ™ ³þüä§Wêß(°\,úØ…8†/ãD4U-æZ:–Í. 듯Úq8Ý“L‡¤ý`XÍ@öØí¬),¡ñv»$9À˜üïãàÐ$(1½s¡±µKŽÔËZç„´n…¶®ñ_Ñ\m0}7\=P”Â.y„†`аêÃ:XˆLCHóX'Q#-«õÜ€>ž«`Tléœ((Ô+pÿŠ“f| ùøíKòa1µ2 N{ÚpÕ¦€"—Õ[Èæ5Ÿ½{ÁN¬U~etÔ×aÆT?ªÇWìPK@–+I.`Î&š´¿HÍ<‡&ÅÁð#lP•UÑkÞfiBHa6ŽNcÐ/IEô†îV,‚¦h¶.¯èxãUà‹Oö ]uÚü.Rì6óåÅ#jP)ãd`§òþÆI´ Èëå}ÍÂ[ 4+>âÎ\|ëZ‡{ÉôÅÂÚ—NKeëI|dÊÂ’>Õ3½$z1Bòƒm•W€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/type1/eufm10.pfb0000664000175000017500000005556011742726711023447 0ustar uwabamiuwabami€ %!FontType1-1.0: eufm10 1.2/19-Jan-95 %%VMusage: 24418 24670 % T1FMT-V2.0, Copyright (c) 1993,1994, Basil K. Malyshev. All rights reserved. 12 dict begin /FontInfo 9 dict dup begin /version (1.2/19-Jan-95) readonly def /Notice (Copyright \(C\) 1994, 1995, Basil K. Malyshev. All Rights Reserved.\012BaKoMa Fonts Collection, Level-C.) readonly def /FullName (eufm10) readonly def /FamilyName (eufm10) readonly def /Weight (Regular) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -133 def /UnderlineThickness 20 def end readonly def /FontName /eufm10 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 32 /space put dup 33 /exclam put dup 38 /ampersand put dup 39 /quotesingle put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /minus put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 61 /equal put dup 63 /question put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 93 /bracketright put dup 94 /asciicircum put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 125 /quotedbl put dup 160 /hardspace put dup 161 /dadv put dup 162 /dalt put dup 163 /fnos put dup 164 /falt put dup 165 /galt put dup 166 /kalt put dup 167 /talt put dup 168 /ualt put dup 181 /quoteleft put dup 182 /quoteright put dup 196 /onealt put dup dup 161 10 getinterval 0 exch putinterval dup dup 173 23 getinterval 10 exch putinterval dup dup 127 exch 196 get put readonly def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-26 -224 1054 740] readonly def /UniqueID 4702319 def /StrokeWidth 0 def currentdict end currentfile eexec €EO›œ‡Ûƒû̓5°»9Îð¯dð€³z¼¡4nëÐÔ^ÖÿG(ûËàSïxUõ!€ˆˆª1¨MK΃—¹ 8£"C¬ ²ÑÛ”· hK“Gð&(c§^mÃoøGIÂç`iN€¸ŒÒËËzÖÕK ÉFÄi*õdÚ~XçºÙST¹Iü.ŸÒüP‹Ä y©¢ÿipPK,Kz®ò¯†j]ª~´Õ`IP?6–2¶lzœ3qPHàßYoŒØB6†•Å*/·$~ŽËí홆€ )ìÆÎÙu‚m¡#›°<,ku>-µKˆ˜‘E×dÄu“ú®¯Ù>¶QFï)ëΞ›úÚ~CÅGî‡ôhsÏE=”VaKzýªº×oíÊ@iô„‚R¯ô]¢5Ui¤tï–Úˆœñª›|¹ÞÉHDk/Ñëêª?*Uqè±×¤M…K&)Fy<>B0-\:‡qôŽÉ‹I¤ØÁh•î¶œf¼-’Á{Kó }f%žrª=dÇZÏ t×b9yÀq ÀûÁ_IO»]0~§Ö7µT~Ç}¬’`‰:[gùÃá>)lÉaG½‚aó†ÛAãzó€Ò*«3ý#>½Ç~^¹Z%jžYøî'« ‚IÞˆõ7£-7yÒH€j?ާ:­Þ°V%ÎQ;][ƒQ_y®îÝ!ØÚ©Å2‰(‘¥·ÔÎvWºþÆs1'’‚±d3û8 Ø‚hV¾(^‡Ì@ª9@0z¾ãÀ _º`”˜Ïî1)(5ŸauSDlí'Z2¶¬Y ©€8n„윦üBJ± 4ŒUH¨õkfJߨísÜÒNI®›6‹àô<ÍõÊFÀ0ȨEÍâÛÈ5Qca@£òknØÆ’lðR¿(à3¤‚sÌ“¼µÅCWx&ŸÐi³Öuý•í+=¡töù?Xf:ÃR£¯ÆîÙžhñ•ƒíÊ…#[ a1Ø}ÖÕ\­5Rh¾I ˆ\.j O*{§úpX_ÝNɘ]ZÑ)6îé^Œ¡vª5—b&ëX˜Œ1"ä©HÝÔ“]}¤_â!‡~§ð õåà•oÖǪI–’PÿlƒÄAµT¤AZ†*Cþ/EŒÈ8õ‚èØÒBW~Í{!Å,›à‘"a—Â"·þO.‚ªõÅè­ãiÚ{ZGë¯à\s19xòÀÝ/à÷~†Ãf_½'¤)Ý­PMÙñìkSaÊš¿œte{ÆUÁ®%Ôåˆ0*â­Òd ‘ÆgQu%.M*Íšúb¬WTÔëà´mþŽG°—„,Ý¿t +ß¶oí§p~Ç]MÈbn&ï‡|bÇ%è·FFÿp6ƒ _·\ˆCv~È*×”­ŠW˜„;~©YOœ¼?Ñj›TKiuGµ‹‚_és7¾LmÍFã=ÿãÝzåxÀ´ ­<¾ hÜ–„-§5ñôJk×éïˆu ›±q]Œ¼8zzÈÅ©D|¬†ÎbVò”>†Ävº¾Rææêçq}Hv ²A:æà¿&Sp%,oqÕ+R9¬ÙRMç=‚›KËÎYμê [»ùf§¾’šN)oÙë4mÔgä {Øå=zBM+¤è¾‚õ~£u~?v²®m1CèfT?·G/Ú‰Ó6o àÃ]Ô1*f(°@Á¨´}îÒŸj{ûÌîZr(–i5½MÜõ»ÏèÁÌŽho!ÿ¯bÙß!éîÃ=LžÒ7Ù Ù*–•„Eë¦Q1$ .ª.wä¼é´5VCï:’ mip~¼çcW‹;Ýwü°í#Ìq¿°³ãna§'ÇÈøI6E‹Ó[E<ÝÀy`SkJÁ6–{G³|z–0žÁæ-JëQ/›[•íjŠ_üƒ},æ^þm>|ó¹SÔ{—P íÈÎR—4Fªeæ­ ‚¹ë<„\œz‰m¿zR³ÑT¦"F[˶‹Å~ ?³?ÆhgL´wæãaá+òƒt~QmMˆáUîÓ Û¨Mp@’^P&†ƒ¼CFzû:ST²o¯/q_«o/k¥·¤žjDí>>Õ¥AáÜé¯#iIµÑ-HßË­Å]b\^˜"èÞzÔ̹6üôÂF°æØ©3v¯Có©Ör¼”)VÒ‰ þµzV™*F'Û_w`gQ`ÂÁ_º:·uHɪ÷ܬzÈ'^ª‹þŸ•;áׂLl 6‡[³ô(¢ŽÊ1r£ž‹ž{mp ‰jï¤Ü!ÙÅûÓÁ#Üt‰riÇ%¹ý›ÌýÄsä Žµå…Ýp øÆ4-;ˆž;n\ÊA)“´½³[%—¿8±ˆYDªÂ>x#áŸ:9ùÃÓˆdIt/úl¹ÝØQÌa[  »¼Ì‘ ÃõzmÞŽß²9§5X$z'§%ÞÕzv85ãÀNãúá^yFa6”*»$p¼ŽŠ+ŒOÞ[ü\óWjcº\jT÷&×y„©¦S* ~·>­ Û•”®œ>¬Õ! ´ÐÜ¥,`ËËå/2íòš”V ¶DóYŒÜ"ù ª–¾Ø,ÇÀõ"`neöûœæ>NñHƒé|€z7Ù©á»Wq@È(äL¿¨l åûØ#œ\êåÊ­b”+Ž"»ö`5%(›E¸_@ZÛáíð îpäϹð·ó^pá¾ ¨~Ü#¸•ð„…ï_=`ØÅDí1ÙWfˆ\X=³BOß%°€­ðÚ¹ N¯ÊÍZÜØÛ†øª‘`ªÌz„jÙ|R»ÁqP¼¶¼/#êXêÉ—Iÿp†?tpv±¼ÝA ò/°po0åsòúŽ ðÄp‡ñä*§wc#š†¤£°€Fn74Wº¼‘Š¿¦(eŒ Ç0¨.çò–ÀçÁN {[úNsP˜ŸÞѹ>÷ô0Å´s¿”ÍÔ0g-•G¸º¾:é^ïÓº­ô- ¡¥“¥4>ƒÞ$E$¡´¹$ý•j LêF-»ŸËyö{eE)Dµv,\^Ú‚|Íkç«.Ö€c%!bf̵3G v잌+K VÎAI€¯çÓ×dÞLªŽÆ‡ )±s‰vq=Æhö¬·{+w¶Fó7‚}ñ9”ß+~ðX{¥Q#4z¥j€SµVÚ8ޏ¢_æ£K t%Ëp_Ý”_«iôõÛ¦ÔÃ=HëÅ(í Ù^‘5ã%Þr·ž¾ÆdãZ­–´ Ùe¢›ù`Y0û6ˆUÒ;{)ØoRÁú“Ô¬{ä4ÂÎçÙ½H‹ÓfèQ¡R_i¡tȱØo~ õAE‘Ò7`»SÌL]‰Ä¹ÕwÑlÜ?·¡Ñ¸Á/¥²@|Òºø%_|l¥ÎLŽÎ{°ØÑ¢‡èõuæ+ 'Iˆ,É`È&˨³C~NIy.ãæãpˆ~߸÷ÞÛ}d¹‚©ÉmNáw½eø¡‰ÙŽü®céµ(\£ñÎ ø?ë ©ÇÝ×Òút¤ø“¹*³æL'»†w:i{÷s!â”ltÌ5Å­ãØ{žòH¿saœ v9¤­{Ÿ8LÇÆA›]MùúÅ–¤7-NÍY *"³Â€Ó ˆm¿Ð8(Ƴä+‡¶à‹yÜÈ»œ!Ò¦~׋ÙLƒ’ynŽ4Žã;ËGG\>¦5¤b¢:œû Š ‹ W)\äÜËœäR«‘̃µ)!†´>ÆÒÉ~8LãX:cIéåÀ6Ò¿@•nŸ¶÷437Löó½áÑçfUs*ƒ )¤©šæœîA;îµ"ëGÓµ»äkÐR!bƒêG|E¯îÖeuåÀb«†çád¾ú+>/óRØ»»,-m)ÆëE&ÉÕÜ1dA$SÀó(¯6µ—KÊk·,^•Òv~)>$ííLa1ÈbøƒË1^›ü Ž’Ö°³è´5t¿óL=Ä£“øšÞº„\%^ýs,×zí²ºäMÅ µI”™¡¿vç,ºö›[-\è0 ·ÆÐ4žSï·²ì:_ݦ®~ƒVT£µ­2àXª]ÄY/7ÇxË"ÄQ²ÿ@"MA=æfæ…-M*_‰R¨ ûj\dÌ,×UþXÂŧìú°5Þfñ›ÔÙ÷µç ,5ÍÞ *-û_Ùo«ùŒ¼•¼[©*ÖÖÞ<…ö¦Y¾ÿDzU“'A½á_w̯{û?9sà ±C#Døk\ºìlõ„!8T¼ç$½Þ¬ª¸ÑŠåžõ­!ñ©9ŸDQNkžˆ’8˜)Ž` ¯feëyÙúÕ„ö$€Zýææ†pGÆÂЖ¥,ê·e#ò •è«ÌEÓ;ÖŒÓß(D<›¸3a{3ïuŠ@d×iDgÄÿ:i8ÇJC(Í Û)×%¢ž7yKØy¬\6h^Âð½¯ÍGÞ‘±Ù#?ƒ7  ‹ªXTEËÃÿ,†Kka•­ˆê´³°’‚ëzÔr>ûaw”[‘76V² ­6)ïÍ2zÇ¢àÔn"`rOz9عâ-mˆSŒ1òw«JÊ€H°yÞVù²mð?Nðâ,ß#{ƒ¹cu¦™4 ¿â ìßÔUvâ è øŠpëd ¿äc[iê=-Z—Ü0;ËÙ[ " ]òc/\8ÒIaÏTvö"P›ÊÔM6U>ÙO}}аÞ^œu#ªã.¨Çj¶®Ìüé+l²AÆbÈß‹äÖùfýÎßdÓòw nˆ­Ú¯º N¾!¯úÇ2I‘î`ÓGþ §jù)èýÍ%èŽVhÿÁ™så5VGa‰ŒoŒÅûÑRøÅÐjÓ¨Ž4«£{¶áäGT\ऒ€íŠK0ÊÝÍò¢þýÄbn¢`À]¬Ø_DÒŒ.$[ÑŽtÏóiéÑü¨AIS±*1ÉIFE”͇jtR½Cˆ/;Ûœ Ž>z¯Ã'ß_.`W¬nNd+n)`¸sЮÇ=ñ¦áÊö»ª5M¨Ó#äòU™ÁH»JCÀB˜WuöúïBÇ\3áã1 ¾P<\å'†fŸ¶Zš‰0ñT«ãoMP3ÅøøTå¿Þ£ê ‘íÖuuhzóßEë§—Œ•bf$Ó©©M&/¬£¿} ÕšþmB&ç1ÛÊ;*ÒsÀ~ÏÄ ñ-¼i­ôë‡jÕ(Yà|R$@GÀ$°O´]Âç<)§6…Ǻÿõ D(݉iŒUr´Ú-'ÿr“üadD‰þC*ÝÊMîá1›9i¦„8àŒ·ñ¡7k0Ë%Hϼú’ºôýѰìDcJÀ~¢f;¯ýŠÀZIb&-Œ%pP²Kã•õhgF‡Öü³ž}‰còØÂQR«ßTæ-É‹"ÚúòþØ‘ºn߬X…dªiú/& TÍ=':ôÔ췵ʆûE§[^0±{«¸›†¶»¢1S»Ì÷jS<'bVåpÈük`>‰: ÿÖ-žæq#ÝÖCX×ýl+šWë£w“bA Ú€xÄS OÖ)­…½¿¾(Dã ÒÖVMœgÕ%0¾¹†P†tDI¹ÉÜÃ'M#nœ$-‰“¡0u¸œ;K,Þ4eéõÍaå®âÉ”p®>—d!JÆT¾µ¹.'|Ž5¿Ê×1Xk Ï!-1`·³õ ™mwEP?CWB®6ó_¼Úˆ´Êå`6,êµl“Þh}^˜f±ß"©Žr3 ïá¦HLTþŠ8{Õp` «ÖSz=©¸Î–ÂaQ±!Ëÿv³))¼ç"¬‚½úÎhÞJC1Ã]ŸX W8låïr·®â¢¶(¯5 }ad?~¸K_õ§“ü­ú§Ï °ƒËyRëšQ,Ááh|å“\÷—Æ­ëÊptÊÓú WÍ×Ð*%Ìʺ2u\>k†_¬%Á8¡ýÙ|öàùölÇmù¢H¢eùð¶…c,3o£fˈ¿T±_¬x¹Jݵ»í§À…úiÙÛ• !ů£m'¼´‚A+t‰<å¼n„âµê…øàXK™dÃIÜ ÑÄÑNmƒôŽ‹þŒ±R2üÄõùJRÁ!6Ãs%̽>¬é€†ÌDž8 H¾$ð™÷ë·n 4’(’C¹†>Î›Ú € ùìû€óÀÁ« ¹n ²:FÝA>€’s’Fù*pGZ›!‹"#ºÙL…sfÄ¥e%ŠÈý&ðKÿ›áͺ¾¦~ˆ¿Ù6‡öɹ¤Hdíô—%3 üÌÏOs zöþaè BÜó@PÑi_ðÃj?°ÙÝ‚}þÛÂÖü¸üÈù»@É)ãtR¬Ì$虽‘døOýaš;™åüRí‚âkï¬T#x8.˜OvmMôSß ›£$“ g0‘ikP$ÓÀ HÉHÖÀ/j^AÐßT‚Pa…›œ+U°ù€ÃVf^Ð7ü+è9L+¦ ×E‰Ðò Ú®cö™¿»uK+gÂöϹÕré‹Cè„n¯'2§äÑÄõê‰\}‚߈|¤HíÆ„Ã|„îCªÎ?ï§"…û™°†CuQú+ÿ¾1õôÇ-S[ü« :•4–1§Ï¡M ÚMF~cœuxÝ2¶¾Þå’Z,¹¾BG×b.äü6®p§Ÿè†½jãž3<°ŠA´OÏX½š@°É¥(Å —Þoÿ©U4 l)bìköMY«RÄü½›ýI;nYz¿§›Æ¢Ÿ U‘B¨â(p†—¹ +.…¯fÈONÇÞØãÌ.IÎQÉ[=°úæzEÂ<äò¼‡Ì7ó¼¡2t5\Íù4Mz•ô[ ½ñöZb°*ÎMS1“ú²Œà¥ëܳ3)¥xzã,f¡ÏÆÿX‚L|£ãÅÿfÂ[¨W)|2¬èC:‰áÉо蛚`X5­ŒÉ¸KýfJ2Y¡Ù8Æ”Ü&®â€oaøÉjD3Ct'Z7ÂÑi×øºTà>®ÀdŽx®¨KX¿3HÿbncwªªV¯^´OÃÆ)5ÞÚwŒqÓAºì_RMöÃnU3×ýE¿cÏc_óÛVköÓj*œùŒ€‹ÿ@J/sF'Rà|=ö‰J­&®ˆw9nØ<èã„øvÜ6ÕçòÅ“¦¦:ˆ6•Bé‰RtŸ'óë#ÊÙàà¦]-=^iÅŒ`»ªT:±†«,ò=\î³O^¶±Ù¿ÎÖ7‹žÛîÝÌÄÚdàq"¥Ka6Í<^òœ¨/4˜Fi#%„«YåT‰öË‘©2d±cS“Lü­¸h³gôYV1 í Áy ˜ë×U¾à ‘Þt #®ˆÌ²°ç2û•\Á‡j¾\ tE˜i+ˆK׈;ö=ÏNõ¹gú&¦ás[Éqò—#Ñ®è^“&Eh®fÓþ«¥.eZÒX8&ç¼À©Íp[ŠB4oWZWáÃ\ä8•CÀ‚à-»´Ó4äxwÃé$È•ÿÂ]BòÒ'#ôQöD|•Üü^e “{'I|ü!íîpÇjo‘U1Ø cðËB€Z |ÃwTœAšèùÌ_ÚÅDp Ý›÷ÏÅÝKø£cDãz‘hd¡ù|šU EI?JñúÕŽoÖyÓÃ}ì¬XyÜLºŠçÉA…æ¿4j:&˧¾Þ?«üžI¿é‹¾·7÷Q·÷ì÷iJ”b&ÓadB7‡&0í÷H=.-%Cu¹xþ°rý‡/a97|wFä»Í1’möÖÓ娣€E½ä<)ûÙ>I’ šZ§z„£xL¨wb?Ð-JGmw¥Àe8SÞ\D?æï||nð»DXD¥ëƒ¨Ï<€A9n·|;V#ÝÙfïB ©ˆî€£¢zW§ÆôÅd@— ¢¸¸8v"ößô'õ…¸T¯dŸÌ˜Õ’¸|”‡ yK¹ÖÌ& dÀí0¯°ƒ•[—óÌ©MŸp>ðJ !~À‚>,³jh+Š™»}÷ÍávØ{eÐÎ*Æ–bR÷IÄ:‰‹UŽGmLæ`ãeÅáó¦z=fHPÙoÝíaj“Þb¢¦qúȆÜýó „SàÝ~ǵžÓô6$wù)¨9þ#\ë]·kâñý1݃@Eš^.~‡¥ÆîJÖDÄÒ‰vÁ‚ÕYFÉgռ܎ÛζOâM @8 {û˜É>fÐIÅH>¿#ÄcX‡;“MfÏ‹rð*6³ÂTà'$=fK”|—bUL¹ºô¿Ût rv‘S€§ÕG(jÿ#Q¿$ÃÀ‹hl¾Vê» í²°Ôgè1ÔÜ^ŤæÇeñ.²‰ñéF‘¦V_J•ʦ”Ãg“ÈX­WܧJÅÕÔ‚×wú¿©€üÂå‚Ó£b/ÇTßý#y-gÃv½Ïn éÕó÷ äb§¥Ñé>Ús®îèˆI¥PˆÂaŒÀsð«Ì®äÏI,i^Aè¹Ns” ˜¹0†”É…<–ÚÔVqìjÛ»ê6‘jŠÍYÄ|“ÏbàRâ¶&š5%ÍÕnŒˆ]š?¯焺Ëôþe {Ä$e(k·‡œ,Ùµ^—qq§À¤ˆ÷ªÂÓµµåþŽ}ï9µïà`æ}BÐÝdJ× Q€¹_Ù½ºžMã€¬Ü I“Ò™¹lKuḴY…ÐW³BÀäžBKáŠqE¶‹QfÚu…ÙºIØñžcý_)Œw®—Õö®“ÕՋݳ»Uòœ‹ë`²Zðïû‘âÿ=qh=\ºÇ/)¥¸´¼"mê½*äj*1ûÖ\-+‡¹€çRf|cgƒ…è*yGÖÜùῊŒeoFR'v4ú~l&¥¼ZÄŒƒYZꪘ¨al*$Ù2úmžÛ.Ò0ólÁ´§R°ÌÒIýëõWq‡ë2v„–"¯’ñ\Fuwèÿ8bö’„)”— }BuCgñáÂä¿ÑpfÄe:.S¨Ü× þ.*SâÜi#|‚¢ÓüEà#ú¥˜g›ìP~)žd÷óY¨SP`ÁŠ¥ð}¹eì[§½Úx1´io«Õ3Èø6aK#Ñ3t2çÑ·*¢,Зó¯¹Ï)@lb•ÖJéÏð¹§ïn¦mS¨¨æ*æ63•Ó–šÏɰ=ÀŽ©×m»FbÝ 6o„ êÕL ªÆƒ‰AS+ºÝN úy$äÂ>‡%Eü)‹:pÕ *ç Ñ?Ú ÂL‰Ïof6@×~Þ°™Ñ\ТÈWVù=§ûs âë0cµùga‚fîÜ™š([äìƒ5®‚|–Ù*¨ò,S­è$ dÂÀµö©ÊÓ]Þ}—Ëx:©õÞ:n:ƨBšÍËýÍ â¸_£‹ÌE SC z°L{§µðw>ÿ¿Ï[\ƒø´ãiÿijÀÓ8Ýq&&õþÂ]ÞŠØï*ƒ˜N}–B>/øŽøM[˜¾úù. ±PåÔ¦ Õ^VŸÂê3£8&ŒzõH s˜"ÎX'ñ²6+u… “ë‚-Z1º| Ä“qéÊ¡“ë1ÃYG쵤ûiBÚA0e¯# V¼—·¹–ÝŸ“/´®æõø öOK?Ø5r4Œ˜ß §v„Ýs±E˜Øï£€U_–ëScÚ (HY'=á )Q¢¿üº«Ý:¢¯#hòãôsYH7MRtÇR8“HAi™™O08í½*¨õÊÆ‘Ôÿ蜦šÖü¼ Ul§,/¡3G0Ôý eÙˆ›èàÏ‘vÎBøþ4î¡ù³µ·Z¬Ó[5Pù‡×í^,Fˆµ&ße¨I„ñ‹Åt¸ÌPÄOT•×V"È›ÓÉ—HµÓ”ͦ žþç5Ó¦±r,©Ä!­pâÆ´·ïXUm°q‚ï|ôD×sgÏÏ)¡ÅÜžb€ã„‡â ϸ?~ÒŒÇ ëh,jí&ŒGºEX¨ìÕëÅÝ­òv®»ÅvÕ­B ‰#W,ÍC•(¹O¸lßâ©i x-gØ#ü(Ä'±s0Oyá!âá¼tÁQ_#Y*ŒVÂ%à_Q M†·§o1›ó¥&Lx ª}*mS'O t×Ökc¡ù@³ÆVø #,ç••iÞ æ~L³O­è;ÆŽÐkúxp2‚­ EWЭ5l.…]8}mûbÌ[«ë™sUT"ÀáÎkØçÃ3Ãfú&.ÌJäLL 8«RP‹æª8ÏÀ~"ÁO rÛï–;ðVè°ÊÓãÉû¶ˆfšCxæŸäeѺ}Þé³Þv‘Z&ô—ÙÔˆ×_Ìn~nöz¥¢3¥’Ewuª”§m¼˜ù :/e ³õÚDUܲÕÓ4ÞBl?å,…wS¼Æû-º+ïÉœ+s¡IçiûâæáöþÆRz£$ (å˜%–ÜÓ'«- ?‹jßÓ˜$‡/…¼F]‚^FðÅÔæÖÂЇ-ùˆå÷"3=ßÜž; ]\˜L¹>lÇ4n¸~±ó -uõ§‹ViŽ­rmV¶‹Ë>@W"qæ÷O¸Ž4ãɬ?ݺѷ5£y®œ°äˆ/â…\‹ºœÔ±×,%9¹Ü½ë¶ËÁýAU *à‹eï péi]¤­Â";{cGµœKPýZ£„ utOÒé:Z < T•¨— õ¢Ñ ¼“®XììûQ‘ó'Íic‚–)‰ñÝØfmÓ+ÿy³âÑÅëê&éEnòu·~š&ŸÄ?¥mB>R‡ ŒÁÇSFQà\•QÊð Eo6G?ÎõÞ‘ÔÌÿYΜ¯Ó¨D “+Úér*:ó!ðþùÌÇ{¼²I_ú£»á†uæÚØ]M/ÄE¼& ¥švm -g„Ø€OPµ§£b1$”VÍÚ5à¤ÅR¹BÙÅÓ$öP1@²+n ¡CÅæàOåHù¨-¹¼1ó)mNÓRëNkASEB£Â-Àâ“”Xè\«š#Êj¦}ˆ¡ÇV{~3.·1«|Ó2/éq_!4ô«“ ë\ ²>¶d÷VyøŒ5Ø›¾w15} 2¦»EáòˆJìm¯ Ÿä÷d]Û‰¡_¾nЫJÈÑWÀÛ¬Vö g°p€Öy%šùh6ñ™l%ñTj(ëàÕÞßH‚º±KžS›Œº˜£¡˜ðÜS:SÛó‹ÇHSyˆ (¬{“³Ã_8n¹šæd m× µ0¿Ê´òŸùœ#-oJ;i«ÉS©Þ|­Ðþ®Ý²ü6êÙqòž;/î¢ÆÌñ1éX^Ûe€õìíA0AœµÝ:Õ¦UvDÇx—”ÿ˜Îdòs·À7§ú[²ŽÐ¯±â"£òÝ×a󨜒íÆ|C¸"(or Ãh¢_ç‰7xI -&H§e•]„•—·O ì-§É5Ç"m©Þù}Æ@4>×üؾ ÂfX•ÁÔ”p5y+áäš}YÄø Ð''žŸU#¹=…Äð´Åþ£û '"š±Y-Ñ( _½Aåñëe}Véc<Mwnà 5UrËà"eªÍÑ™æ"xNŸ'@‚¿S†@†™ap*’pö]é¸\ƒPŠ, PÓØ­Lë'q;–`ÿm=®{ÐuÜ$YôúcÆï‰SÙL¾£Œ6*z<ŸÕ2ØìùØ>À‘Îaþ&¥ªÝ‹±é=« DŸHj½Î7™]þPQËU?Ù×Bš'@î`uþî¨@æ‹5³9ï+-Pÿd¯ëîÝÙ¼Êu…˼XŠbÆÊ´ý@C,²[mG½‹%íÒsERú0Ðí>„bwÿµOË×µLæ›KÖç¿ÔÕ£#b›6g‡j©ün¸?­u³'­e›ž2M´^CƒµA‘!ÄãêåfÎ'ýwðÃûº>sÈ òË)x,phYVÁýB±ËÙMùct¦«lç-³µÞ×Kà_îMJ¸ÇØ„Œ p~ûÿg’”ÍÆµã ÆßÿÚO‰u*ˆ4üÙ/uÓÏIöKþÇûu¢”:å U]¿*q~®ŒÓj=£šÄV%BUû“¨k¯lmì´¬ü‘æ1Œ°œÓ8É2ŠÏNn±¢Ðr--ù-o°?¢¶)[*ÖÒý ˜[àmå 1ø~xòè4«b‘·Þ™)»³qüΠ‚ºqÃè؉3¬Þ€Þ)rRë y|³'ŠY!¹„£-žPòi8Û3&JHÒït4yÀ1ÿu—lÃ/†ãbùS rÏb±Åãþ.ea£èdeÆh-Ê(Òêø*`Ø1got5¶ÌûR°þ¶ášq5N&œk“Eûtmî2VâI 0Ù‚ñ¨‹Xæ™ê9°òª³Sá{+@´µÈ¬¯Î l*QªU³uÿ~ÄÊWWÉÅEß(©£m¨4¥@O8Û„Q²Ñ{z0”fèM `G?A›òÉ»¬}Ý·=ƒ«¸'çoÆ´µÎÙ¾& ê'tûÖëv¼—×x–í°ôàJÐÑœ3*àixDb_ÇH|–ªŠ¯s6,%KY´¶öGaú¢=MHb):Pu;‡Ã|µc¹ýµn×+§ïSE/åRÂ>W×cl'hì,ÿ Ÿ +MU’ú8àáxÌ…Ék©&I©½5¤H¦Ð ìN%˜¹§MÐv¾>ëm!`å.04®tN¥‰¤ûéÀgÑ@ƒÒ£m»Ù++ãZœñs†ÿ¹¢¹ŠÅ¥Cß4Þ¿mjÍÀºìMCžA¼}Ÿ /Á е)~ú¹‰­]­êËk÷ð?À…¼¢ÿöèÈÙðF91A-I§ƒñ߭Ǩ½I…¹1ðúGv£¦µBeý$÷­óI±Æç5çg–|àóIU[8uv®ÉëÊxø Õ0¿”ßí™.²ðèºÚ|aKëÓÿt¹Ä½ÕfiG…³6˜_½†ÿçþ–‰…p®ƒn •¦ aäo°ßž^Žýs«DŽŒ­Á8“jBër6ûÖ¢T`?c½ÆßjPÄ@ùIý(34¦îg‡c8W5éì„Õe¢íÏ<ªN„fi¾É¬+–îI½v}A¿=ó!ÅZ§O¥ú*’!,Z‘¹3c³‚›ö2Æ—ÐSÑÒ.®Å)~'1Ý‘<6ÝÃ8àV륞³þÕ‹^æ— ¬±i3CЀ¸;É‹ÁÙ …9ÌÐkå® ÂÝKtˆ(ÛNä~å°çÓtºÒj<$é”æÌ„ƒŽ3÷<mÒ`dØ÷"°¥×à Ô;ü…ÿ*óM"¼vV fµÈ ¯¹–À *4Óì2½_9µQÆ“Nãõ .Š “Ù/1 ¦7µ$úÃY$¤Ö%~Ž1ˆßÐ÷ƒ‹,'Ø~x)t„c1?j$X†FÕg•qˆqMwH4u]4'ôY ¨„F*íÁÛEt`’Œ‚™·¥lª“ŽQ8ùú´Âï¹&,ÌÈj›óØXõ5Ã{jQ~Ÿ¬žo™WpéÊGšEêPฬVQé¹|øøˆ+ÐUbMÝ£ÍXƒ ã¬EÔŒ‘¤šÇ6Ë2î¸G•vKÚw:ìršÅq‰F Ч×/C|^yæT›JöBøîÇÄÁAïïT¿0Ú“ÓlŠ3¢Få ´¸­PÀG`2c:æò/º·)z8ìÏ êq€ÿ„?$Lå=Fd^ZvsKÌ5¬¹Åp:Y„Xø4ïl/s~£D8Ô<»Œåж5x¾™¼QR“¸H3l(î«lCph!Ó hpë”BŽËGaøßL:Ø“¤ÇF'cZÂûéÀÜêOÀœfá‰ÌêJ­ZÈŽÀ #$ÿÖk'OÖŠ$sSBÜ®ßu O„Â=ò/Ì`&†ÖŒl,ªýÔ›°ø_®ÊûQî Ûž,/-3®¸æ|x¬$ƒŠ"­½ðñàæ×êì—5½™çŠÆf® Î+IdœHø ØèbŸ¡cjý©¡¥[ ¼Ñ­[’/FÙÅ0©¼Ê6ÚHÐÕN÷ð"†ÿô£Iÿ¿šB‘ÏljI½|l|+ŸŽ»ŠÅ±Õ+]¬KöótQÖ8?̲<>ÒªtTµñwÖZsC™8ûÆqcSrdÌSÌV`˜Ú5 %Ó3ˆ8z ûÊ…ù„Tý þr]x˜ÊÃ’Aùˆ’üš)Î(Qw—@›4­kµOf¨ÃÜì– !eS‡~„·ã‡^÷.³Ââ×ÿHô:Š\<û\pTjŸÛ"÷|ó®ƒXåIvò»»ªj+4q{·VTh/ŸÝ=&s™ŠÛéä‚fõŒâMÖ5H\á òÈ.µ¯Z½tJ¡ÉÕÒ".ýs­ í3JÀ”¾ÐÌ+pŠYdçé¹?¢£<¶ÕçU΂ÏõÁð‡<æMÛâjµèIjÁбYgXwô°O·#…k‘ßí`È»lß–2µ™79ÍÏÁs€òKè4ÚãÀ ieÊ®,/!‚OPðIÑÎ*H—4 :Êb²í4?x"ãé%‰êÄ#Ñ3ž‡a“÷%ÏëXâ.Ï.背NA‰?ÝZî°¤w…¿k¬ù¾ÙÊuòsÜœ#ãªVϘžé@š-9 ¢Á˜ zTÖ"¹Ý¢Oç÷ŸE<€‘½üåBÏsI çPÜ/#¬cÅx¬›”O¸¾³eȶcC¿*ìúÏï2^inpÇjFÐß¶jé%BÒ8Ô ×Eg¤â~5›×_¼¸Òù]M·,ºÑŽ™ðâ|³£§x0u ´®I‡—é„7ÚÌÒÄÊúÐ^ÄN$½jåÕKÐÜO\áé#mc1IïôzG\Wá4F¸£ÕŠÂiÒ1³¹ÎgÔsöjh˜æµ—B?8ž æßJdYè²”…sw±]-¥ÔÐü¾kfZyáÐÉh0Pö2"T?µ-艤àl§©LuÉrg‘›®Õu¬`.âì¼6QÄûË%ƒ;âze{:ci± 17ˆ}0Ã.ͺ·J–KD¥¿¶ü·McƒÝ{Kê“xŸLÞB*Ñ”¼#™3«±¿³;ÔË«Ûdˆ&•ËíÓ¤BGÖ®A|ød¦Ë!Ç— /°Šdœ @õõ´œ¾fY“™V¡CR"¿—õ¨ê²_ÍûC²=·œää––O¸U-äß( kv„$åÉH\ÀÁ·B(`¼'Œž€jgó?¤KXo.¶rp‘©+–w=®ñ›V x5û‘‹f;J=8;'7¸½ùÒ{UµgR#ïƒmä¬Ãá$ûÚPŒ@@& Ä´ëhܼ±Ö«öîYq1ûË’I¿ò¤ŽÆçC“!¡P`)/ìš¶EÚÁ`#þC4 â0FŸGMGÓ@¼H­ébß>XÅMŠÛåέ!òLÊJ!,IJ.%·øŸt\Ÿ/ý™;™|¤ú•ÜÿP „¹Û7™"0ÉX<~¼°Qª$ðÍO*ºn›ô);X Á ìöé’qW~6çÚrÿì<’Ÿ¬ÛÒ¹NÚíâÈømâ®ûjŽa¾5Ö"Ü-CµÃÄÞdcÇŒ‹¸ø2–l‚1\›®½AªÞq|ÒÜ?±?°q‘»0¯X+›Ý–¸Žj¬QÉ¡ñlJÀr$…n†WÜT‡Þ¢gç³ Ó?ãŽê¹ùÚJdä¹?ŸÏ †l#_T¤ŽþÒ!¡¨yŸo}?ù.ø|?v̼”(MúkK½t‡-Ñ3C}ËîG_õSè@Þi±ÏRW¹4 t{VNë­‡~… À ÁrÉƂ/FÓгs“Kíóa­R;äƒ7Çšs5±\vˆþÍá4÷eÅÀ·J©¥*Y" E¥Úa=¯Ñèì¯L§‡H.ò¨‹a« Ûx¡=‡]ÆaTlêŒ`ˆ—h÷–ŒîTÒ/%Oš}>Xô¨›©{À¨ ˆzuxt±ãîžâ:¦ë·zéèô¿q’ÛB $ò¥,ê ,ðUe4×iÞ6ÕàªjwMŒÁ7‚*€bCUàVé§½£ÄÁžQg¡Q‰ÕørˆfSmy&ÛŽóÚê¿»y°×B6ER7û|) `1Ñ–•U˜8YòÂÓ¨gÉ£^}Á ÷­ ÄG ç9³„&³Ñ%ˆ– ÿúý5åÿ¢%·]É6cGÊ+2ÒJùWêô¥ÌØ—úˆÁ GÛ&$4:+¾)o.~/Z$[#|Úø« ºö\¡÷þ©~ôÚñ ß?Vhж¦Ì±Þµ?"{êXŒ£îà£LQ!ÎQ¬I=¼Ó…Uµ2ŠÏì_mÒº¿[»‰Ô5[| 8Fœ9ÙìøÌ¢_:ýtü ZŽu‘¬îÚ3¡†ÈãÑ$•1ö ·š™bÝûZìDˆTO-• +,õ­MPž†¦nvÔ²Áþ5¨ê_IÁÑìÇýQZÙ°ï;= ÊyNÊHõ2›\«Šžw^Ô¸úcù¯mŒ_ï ž5nÀ™¿ý ÂE(—[X–¯Jg1"¼5ŸÊòø!LâàîÀ€öy{®WB € ƒ·ÿ튑v®â¶™³à»éáȹ¥½™nÉ„}ûp~Ã1_Œºr ò N˜äp/¬ëOŒL1Ö¾{"Àý¿°ˆAòµ¹µmŽçBµÛ*jê-Àó"ãò5Àú_‘W(1ë¨[æ bÖó™Ó|Õ¶n°,ÍËjt@¼×ɺà€‰&ÃŽ¥ƒTF1†¯†C€†yà“¾áüÖ˜V«‰æõÜ=¯¡>àAq“Òd-3Ò¤9¹ì[&Ó“#r§s0`B¡jÊ~ŽíÜfÉ|/BÃÀª'V^$>]Ú­2×QÇn€7J“Èô1ÒÕýg¡*'\26ósaAÅOØ`ÉtNÆ€¦j™çʶ#áÁ<ïãž´7®Bz\ÊéÍCìÚ™¼2eŠUºYo=ðùðµÉ5Ú]£&ÌRrƒj­a[eLô¡ã¡e2(ðË ÖÛMP—ù(mÔƒ~~ÎçïÀÉ;} F 28 "ôÖ²©‹Êp]+‘F›½}a"lºž·=±r™ØJŠ7l,-œ¹JäÎ×ÓŒ’oI0èWp¥†Â@^`̘çŠNæ²vÕ-=Ísadˬ<\¿©JMw¨JX;˹êP”]ñ{9÷K0 ¼ºÑ¹€?§Ÿ«GUÓÝX \º!Ì yûH©KJ­l`ñ¼†BÊì;ݺbö'S`Ðmg(#àÜR¹ý°8™”<ù´Ø/}ŠØ ée’îä{`‹ݺ>é¶¥¾eÛáù°Ÿm6J±ß¢é¡k‹¾6ø€)—$ø# /@»‹^ñÑÓ" „Â÷àšÍhí¸9óöî•qÉľ?‡+[¯-FQ©“Œ^Ⱦâë¶Zß6SM@ÚLŽ`óýÅʤòsùšq'C$M`‚žÖYø¼O„#2aTmYÉ™„6S³àA¸¬»æ6¹ú„³J“˜ªÌñ½¤ÿê 3[,ð¦6eTR5}ô¶"…½¹Á"¡ÓÃÊÃð‹´U!PþîG–YL‹IŸysÜVšDP*_é0õªþ¥WÑ{Þë6€Tô–ÄÍ™ä½E!ÿ•K0©óŠ&Í9ñí47y­+Ù[3\ ZW攣ˆÁ`l,£½ï8P‹Gug$ùÔô(J 0 ïÃüóRÂ6!dUùmÌâ"#Çã ²Â=¯9§Á×ÓPà#æ×qåx³à³tmÈ‚EÇA/èWð1Ÿ®B5Gbæ¬rÂ%-¼Ü edŠŽÌÐeFS«·´LÖðÚ2À ̸kÙÚ@Ìbé»ñTÚÄÈe¼H_Ї¤ñ8{Jÿ¿ÍP=µ ‡óÆ‹6ƒ 1='tv $|—˜ÇTÃ0£ñ;?™A*… Æý93Zð¶Ô¬<¹¨ ¯mYn|²v¦_BäÁÉÑ&Ϧá˜JA‚Ý»¯›ú„ãŸëÈJíNëeÁ>žñjÅÔ³N2¾>Cvá3kBâ/f,{\µª‘Bèïƒñåbв#ßZq-^±©õwþ_µi êKÄD.2ÕÁ÷lsrDKúÚ!Yµ ‹Rzˆçú‘ç•ÝOá]ìðØù†–lÙ®U®Yþ¢4‘\à g>kyê…ÓÛ-¢™ÎS•ƒa¸Ÿ“H—PßrœFÊhsT/ý\á¯üß!O'  OÕ¬Mö±ýnZ¤ºÔ >¥QTµtL‚ßjÒ³Uêû£‹ #ô‡IbÕåuP˜Ó*¾ƒ(eøopèÎ#4\}çþÒ¢žRµï¦ ëkÊÃÕ€u·%Ÿ ¾/@sÚ JænmMIÞ×pω¯ÂD@×gf£«fI–4Œ|&{ÿ\+¤M ÿä=·‚Í£kÀ×`QOܳ«e³ºÞ³äßaÌjÆP#0¬†DL­È•7‡ú´®lˆ³QùÙ׆#7ý®öë3Å{HãçRhI+7ŒÏÕ.,Å×h7N]¬’ë©¡,!Çc…ˆ>ù jǬéÆªZ¬³$pØ©¼€-äÝ{ŸÁeL_C?hÿµ6ûïq_ žjLýaF舅¿*ºû¡¶Æ“º*·mÔ1ƒ¨ÏWùÝ%hµÉ¼ù N{–“¨jÃq…RsŠBÚˆýiñ‡I¼VÎyKÉrÖe°§±r…]q#°ºÁhÙi¼r¢_㑬ÛWis‰uÀ)·'…Èr´&µÊÆ!5ëŽD,Õü6þ`æ,‚´#ñ¾e'™>a’Põ$¯Ô)ªˆˆÿö ÿ`Øc@þ¿ÔcµN ý/ÂðŒ«'A:\KWfô—=üŸt¼cVA¶í ЯÅDãó⤊ŠÞoÛå$Þasg¯Â?n¡ˆšk¹É@-ªØdx+µ¡£x¥ú°ëA]>FªÍ:ñö‹–mþ|% µ?aèð™’‹›I¶ ¯ÉMD)kJ* H&æ·÷2wl"Gv õ5ò¤D1`ýgúom·ý«òPcb»$’ñw)¾¬ü=-¶—‹|I rŸ†ï×P:&ühöI•‘žÌ_aiØ=–s+cÞRÒJ°ozf³K×¢SVÛÕæ°ÁY×ju‘*´”Ñ`¹FѶ-ü0~Ïôr¼´úV™[.×ÃYÓÜ1áŸÊäGrU ÑÅDä%ÿ¥gN…)ÛÚ«ÂÞ0ú±rÊb’C°FÍ•Án¶gÿm†ÏVjÔ¶œ·]@?=.Á> ËS¸šÝ)Ćíò9MRv=° ¿ÌQ.Ÿ¨†É;¤ÖþWJ~L„]ëÖqyÉ åVpØ?#LšF æ>©Óa²© £ ïÿâËõù=Øx‹Žm”ZA h÷ùbù&¦Ñ‘O)ÛÏQÓÖ@mŽ•T§–釞X5´¦Àºó–_ä¡€BB°éâZÍ_)Ä[Ò¢â‘G@L®†ròõ™eú ×»;B¦–‹…=Ó´õêÒ›4V®° ýÜy~EÑÉÖm_£Œîøq?z~[j¼zb_¥á=×/ð49¦T¢ÝüNúŒR,qyP*Kfr9ò5ïßÚÛº-rhàCŸ3uÛêƒöÄÃ$'Ï"³¹M3·}•Ò"- ´|ÕN27bª½’ÛŠõï ~÷ms[æ¸6ó Ьg‰2è)Jvj®ŸB4IËIɰNˆ t.<0^µmúo…°/ÑèeT¡·ÚV.ªìvNѲ@"¾OrRN“·z:Á‚aŽ“%ÏÓu¡Ïq¿€@ŠO iìª 5X£øWsù¤® Äí;:sF'sè䬗ôˆ¸¸×kçüNë:uÔÑX5%ÔQxr¿LGQ|á¡Ùz{„5ùÂkZ°ìÐ !~}wî:÷ñˆÏ¿µ!ôKê…ƒöèa¬†YC5>7V¹ßÍÄЬ—ÖRF­>üisdº„ÓŸé ñÍ·ö[î^Äw ¬A&_‘)—ƒü«N›ow´¨Â‚W){üT×`&œ™l3ÅBÑÅ]–«õú<^q¬9? }8\Ãó½ò}›4Dk&ŠUÛš§¹kg7ÒxbÏ B¨ÁtæÛõ™êŽè€Y†Ù³MTŠº /I/,ÞžÃÙ™¶JJÞJp)5Šý³cx+e®Ç¤ ’³SYƒÌí ñ&+!»%ÈC^óþÆÔ ?ݦÝÆ ´Ô°c%†tIº’Æ»r²7"NÑù‰fß±¨ ‘ GY î“fæL…#øÓÉus?^N-œè[² îû—èR€>U¶7ACÂËWƺ‘ºå†÷R;AÔ£ê<ú½ëoEW”%n¤h|.6W/|júßRT5ìjëžÆŽ)N=æ«Ìh ©‚.‰³csBñj/ !(tÍ3ˆ23}á`è²'1OB?n¶*£Ö­^ñÊ·ˆ>šˆ`C3Ä… Ò[šÖÍ•W6àÏ8Q—†˜æ›%iHæÎ#I_<3ûkâäžÙ„Ù·!{ñØèF¼Ô ö^ÀÒýŸ8ÊÂbG© ;Cö€;qfgvuËî¸Ýw.—× šƒ ²öKQDh ¦§¶ÏXM±Œt+sW19J6 GQ%ðÌb!úE« žÊÎ,²óuGŠŽ¹A[È +Û=”1_Ût« ?–ŠÎ½P!¢†¬Ü¨>2Õy‚™ëYä1âÉrÝí䨼¬tš0MÄgÿ@„oÂ,J‹mîÚ,*Þ#]ËQA66æÊìkJ…en?÷å¥å‚¡lõ˜¢^¥j b“|˜¾!Ã,sGÅ:én(xtdÇJøïK4¥ÄšÙnÃ~µáÆÁ“3M Ví—«œŸÐN„J\KŠÖÊév`õb)¾:YŒ~Š /ûôûp@Wæ5ëðüøŒý­ú¿Ø³¿$O3uÄ’ £#Ùc J ʯM3ÑÞ˜3‡±RZä‹û‰ñ‰JU‘Pû9Zï5¹ ’ï;eÅi¬ ù Ÿ…5ã5 ‘{Ä¡Ïj¬3PjëGù+kš(7Œ »‹×Ö«§H¼eAüüÕ–ÅdápÃÛ4>÷öñC3WÍ ¸,1*ƒlYâ::·É$СØßcÕÆ\üø¦æXÎ%ý“âÿê»h ¬3~˜…@fc e](°iJ³ƒ†^pØJ4…3q“Qª¨DA0¦{¿Þ1˜À„íg«ÃøEq«ˆäóáøc ÁÒF&,²§-Fx6 W_5Rx<Ÿ+³LþQBE|pôÂ5N‰2ÁñàÆ¤ZW´þ‚—Ñ×Äf&OçZþ+È ×hÙ7_ìß$¿tıÍþ{£ùÇŸÈ•$ž@‘32A…zÎL0€?éF¸mÎß9 „€Í‚Ü£aô÷/KŸñ€L)ÎI Aè3—¾œu”.`:Ñ/ÈcÇ·¹ãt­¯†_2µ¬4Èm+ N]Lì'rîðs#~ûNõ"%ˆ È‚ÿ>Šnay@‡±‡.˜OÜ#æ\šDñ•mó•äÙ«dRÚÒvn¯—R™ug(¢[ä@‚¸yûwŒßňõ!CY¯qRêÕ›ÆÝ+•Œá;Ù|¸D¼ å­ Z¢”?yN;#AãßšûKÆÝõç7ï(jó#£Ë¡ê\™òpOG©:žò‘Ao.™P«®°éTùs.`Œ="éú*—cãJÚ¶­|ÊÔí›M%ßÍŽ;TÎ%)N_¤»À’R®¤ }¼bØ–®}™[qÈ œŽ0YFôÇAD'2vS/ I4ݦ+™•´ª–4è€ûϋާR¾£5Aàð¸†Â)ý#º[–0öí!†þÓýýK.`æ&˜£’bÓ¨dK@¥9ရ2D~|¾Ü“ŽÆwkÑRtvº« 'Á1Êû¢yTÄÚ+Ÿkš±ôqÿc;¥X_HVº;-zº¹Öçå—‘×í÷±¥V_0ÜëûQ;×mŽ>õ0kd²<ÁÒâõUHÚÄåB)<[m³$òÊAOxl&yÿ8Z‹l¯ÿªc÷€æÕ¡;p„Í “¿+CbGÄ·V–n¬¡z#Ï.ÁLÿà{?y¢•msSI^õßç¨x5¤ *nÿ™ÖΑÊÊ7¶,·E ãñõ,‚”ŸîAå»=Ò&3—¡"4#S™øª* Øøú’Ĥ|ÞÄ3åîg^^&,0=d²b\R å‰;[?WH¾% ‘rR¼£ÌþjÅ•žÏ0×êÚ°S÷ÿ?.Óß碄Z:¶a=#‰ý Òȹ¶AQÀZJkì®BK`[ê²]…µ×u„hÃüäºV™Õeuà°(¿ìÅ„H½‰üŸÛ¢¤å/ÐüyõYu(÷¥Ñ„Ê·27ÎtÆ¥Žâ82âQЈb¶VÌo0¿ÃIÚ³a¶møÖÏP¿6’{™ê]µÚW¿W,bÜhœ^©ÿåÆg¥›Ÿú q(ë!0dÂ>î”’²-ó™šmhÉtÀëù´vÁ:ÂÆE­áæÓm´Lfá´û­Í~Q}â ´»¶[Óvq’Ñä"Ù£«º…‹G>(Ÿy’û|ƽ*}2:Rf› ‡åOVKôô=~éêa™‚¸ó¸ß\Ò:$,¬.ÑxsFéw–nÉâ¾¶€§X´‡í« j¿à¹ï9’]Òú `Å]Eçc {×øàÛ£çñë˜!gN›Ä§²2ªç§V1çò»Ò³|K ¦é ­£„w|¢ÂNƒÊ¦Ù³‘i½ÉÚjxẹkäI0Ó@Ï6â Ÿ&í#ª nE6_{Qþ©mzCÂ\¡E¬`飰 ‡ 1ñÅk‡­ TȈþ8d>¸BËi”Õí3cv騲ýô¤*ÃìHŠyK|s‚ý i: Á [ãóµw9pt’ÖXx•£~Ë×óªµNg-H‘tj5g¯©éE©gÔÈû»[f'Ã4-5¡ë?*Ü”Ëùégº*mÉ,8Mªe@jÉ€»+¤œ}Í<y>ûŽù•ØÝpÄögsU:k…B-!Å¿48-rméYódzDúp=1ößDÃ(M ¸‚ÕòªÅÂéàƒ“·Š¨q0^h³Ä0QÊc¯²§kÛ8Äݗ8xŠžÆ…~– ýÎ궆Jßs(ÓÒ10Û\êQîg”ÖkÇUM"›G:,-P¼:ª‹þ3ðO6gŒÆ1åüý—½$‰Ö/¹8á;ÐùeÈÂYŒE,Wñ"nIÀ"!wÖy`Ö6舅+m$U™9x.â“ìAo«2Jв*­ •†­*X´Z” Þ»?À;ð‘Ø!i÷ *sÿ¤å=QâcŸ§‹³¿‹Ù¢è/ÚHq´bh€@w€i‚¦iG ‘mWŽª¥wR²²³þ:]EœFq´ÐÀÇÚÆ¨oUB¦¢.Wb ·aV"eûhv;½0C|Pön˜5›C„ù ©3,‡!”M~0e¦„1˜ôÂbGg§¦õåZ2x€ÕŠí‹jN†¶C+įéxb9hJ#nñkw;âKë¦$?§bu×Ë ˆµu®uB³ˆæRKº63_Þe)e^á^D¤lùÜPÜR‹ À(S,Ý;°E+öÅ)k“oÅ)82Ñ7ÂGi®Eí®ì­âž”ròrÜ¿pè ã™Ô74Æëð*zô>#üSgøÂ~Ó*Læ’Õ¡ ‰ËT‚‘\ÒÂ7è+C7æËyÔ›mL¤òÉÅë}4wƒ²YTÑ8Ö3˜ÏqP7=½d“¸%Û6,£“ª åÕêZtZWo—ö ÏJ45ÑÕÄ!¤”ÉŠÃx&r5}åѤ€+ ´ßËräº`Ѻږãä•ZÚÁÍñÑ;ÛJ.ú˜CX¨EZÕ I'gœ‹†_å;tÅ Œà÷1ì©÷wåpP D¿Ñ/FªäøáPì8¹ãôáê¥XüØû·ñ…ÒEÌ~t?°,JN-me¡”º¶h&J˜z¢Yà«ÆA‹“éàŽ’uðb¯µà¾é~¬V¨17RIbFVhfªßÇ-z:Úòyàâ®7ý’ÒIŽCôÝôm=™ï€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/type1/bchri.pfb0000664000175000017500000010445611742726711023440 0ustar uwabamiuwabami€ã%!PS-AdobeFont-1.0 %%CreationDate: Fri Nov 2 19:03:54 1990 % Bitstream Type 1 Font Program % Copyright 1990 as an unpublished work by Bitstream Inc., Cambridge, MA. % All rights reserved. % Confidential and proprietary to Bitstream Inc. % U.S. GOVERNMENT RESTRICTED RIGHTS % This software typeface product is provided with RESTRICTED RIGHTS. Use, % duplication or disclosure by the Government is subject to restrictions % as set forth in the license agreement and in FAR 52.227-19 (c) (2) (May, 1987), % when applicable, or the applicable provisions of the DOD FAR supplement % 252.227-7013 subdivision (a) (15) (April, 1988) or subdivision (a) (17) % (April, 1988). Contractor/manufacturer is Bitstream Inc., % 215 First Street, Cambridge, MA 02142. % Bitstream is a registered trademark of Bitstream Inc. 11 dict begin /FontInfo 9 dict dup begin /version (2.0-1.0) readonly def /Notice (Copyright 1990 as an unpublished work by Bitstream Inc. All rights reserved. Confidential.) readonly def /FullName (Bitstream Charter Italic) readonly def /FamilyName (Bitstream Charter) readonly def /Weight (Normal) readonly def /ItalicAngle 11.0000 def /isFixedPitch false def /UnderlinePosition -109 def /UnderlineThickness 61 def end readonly def /FontName /CharterBT-Italic def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding StandardEncoding def /FontBBox {-226 -236 1174 980} readonly def /UniqueID 15530649 def currentdict end currentfile eexec €#¢•@ƒŠA3ƒœ©Ò.+™ò¶v|Öu ¬ü²NÍ6s›¶I”Åg7 Lì’É”_ðt^÷ÿư©£¸Içé‡@ål Z÷‡UœÆ•j³3Ï…SÕ\ ŽõìkôbêÄ.s€Ê’®‚³Ö¼ò»]Vp”Ïâ}N¬–“èƒrÒX´~ 8vUŽ¿uz¼\Ýö+ÏÍ‚qòYƒ;¬yprìš0c¿s…à-ŒX¬ß³;Œ‡h²x±LŠ-åõ4bAáTWOÅÔÞ¿j¸¹—¾;$®&ÿI¯âeÂ"¢ó„5è’¶ö æ¬Ñblä°¤‘ '½³Ó!‹)ÈFtÒÍÔs36‡ÔN³AáÝt8o,ï+JØLœá=Í^©2q¹Hž­ÁvþqTñ ?ˆ´;c›—ŸxY¹`El/Çecoȼò2ô ç´gàæ¢Ãd¹£cnãdû]¢ÇÉÒ™™èQPÿ +ù–¼»ƒHÀ™Måâ Eè…/]Œ{YX2Û5ø}_,Ò2SS(h¬s»· CrJ’‡±µ0ž'Pªcz‚˜eØî¾lŽG·S±ÚîÛÇ2pñØÐ°³º·:xX%S¹À,g«žE‰Å¹!‹óçWš•Wi.·9Ì*ÜUõþï¤oÇFúše&¶4Kšyks%üï´°óqM¹Ë‹¯ʨ)y6rŠÄÏ2Ô/!½7J@n˜“`/’ƸtáPÍÏ1–D(«<šc‰áyÄ °ä`1·bVU­?žÞXoÌx­„6š_f]ÀR –×ê#·ÖÎÊñ*ê.=?n2•fÇ6½È¦Xóxÿòwó1gxèÖwÓo…;X…>á#ºYø“ëqˆ€Û…Îf7ÊhúVY<3ÕUnüVˆ‰]¶þ®í×OÇsã°‹J]{Uì|è6IùoJƶ¤uÑ»:T°‚®r0ã«ÝÍ}C>ЧGw'!ün!1<"½@*¾Ô0 ìžD¿auN\€DàX”Ñm쑃ùã©2ôñù#—.¾¿Nïg+iøáPS½Ð¤Mf½ árw‘úÛœÞHÕnøây„Œ—©€Þ¬D²Á‘óv z!ÿZÀ ãv}qTÒ¨Ž6îqqÄ[ª§‚v‰ ø¡Osò‚#Hy²HNh ‡«¼ùüCr*ït¬û–¾;ù¢²PIÝP0Ï:þ3^ÛIôÓ24‹YdæëÏÁzëHLOü1A¼HÇÒ#|÷27ëm§BECó(r¶?˜µ?n¹u¶@tA€mXØ„âsV#PCõû+rT,ÝæÿåÊ‘*±©PòبŽîWY.Ëœõg ü)Ç'Šu—µtBÝD 'Kúxóʧ YÉ­÷ÐÍùÇaÉâ'Iª¶èô£\©ê¤Yné”3µÂX\P]Cv+ø@ým°Z ;5Lä"# 㿆)¢›É©ìñÝœÀ¸þóev>Ķ9d§áA||RsÕŽ0ì»0vá3ê$Cí,â‰{¾ä4ßçéˆ ðîˆd);,Ç·Ð7Üþ#Þ[|Šû`SêW‚•ÿ@Édb·6w—–©ÙŽÀ¢ÇÀBèyCÍÊØX£!Ýôr…\KcºOéòG‡Á«Ÿ­WvËøXŸHµõ £êýP!É KœÜób¾&Ø$Ðį,‹\4^—ñkûÏkc–Û~ üPçµ°paNËn] ¹Ð.Š9ºB¶Ùð˜¤rëKÛ£AœcEgತ½„£áøˆ‰A¼=¶îÑb/pÐs9|–“ŒrJ>oG)$úgaÿ› ’vÍ…Ç®}1’^çÓA4ÝiR{ª+zõÞY¤ÿ|ø~8*¬ @®~æ&®Þo&¤ HšXíJRÕX™“Ô”¸ µß8ûñî9UùúÚ"ñšp)CŸÍ@kÅùÜ<û0Ê>®ñrd'‹‹.²(® =P(÷×aäã§x‚rÜ£¬åòœ´©3­ÏQØqk…¶š¹–Å€R™ør +ç}?6eQ¦ƒJe`*)9_pZ;û¡þV{Y'ñ$WôÍ'*ójs‰÷#4„¡–œª…lö'°ã¢÷Î#ãݰ~ûÊD 4Í%—Ý ŠkÁ†qÄ+wã(,Ì¿êA—ßþ8±.9mr™ìó(Ϥ+ùŠï0CV¨–À׺gHê£GsMä‚o«Yþ0Þm22͈¿ E:œž8&¦‚}7üÙ¹çÆWø¸‚i>ÌÍ¢´ßŠdCQ'³õŒSÈò¥+êÄþ aÒäIÙÚnHu· q„N/T{|6;×ú¼‚ÊŸ[~„r]üÊθÚççÏ# רn»¾¨yvœEŸlagp`AÚ\£oJÆ eE^výO²îÓŸ—ák¾t¡ ªoýÐK³Þ¸0ìRmDXú¸…Ó—ÈA¿ÎÁK> gêºI™áê/9€C0QI Z  “† ÍÑ“ß$ÊôâÓT-}Þv›©>’/bPÎÞ‡ ®/HÈŸàÈözÈ©ÐmÞÒºÈLª‚Õoùë©”µ &£{]ú~5ݹÊb¾U‡@®U´31KÐ~;84þ¦Á«ï9TÝ­®ÒÇØé¼ZÉMý.ç”)4ë/ãšìÃJ4 k䤓ɾx²Uåô¿QM«# Ø É $ßìºÃHÑâne˜XuêŒÞ©û¤ê*Š{²)˯¡,h¢ùù#:xè`)\ÃÈ"„{é‘Ï !Pfº¢•Cõ&¾*ÏeVŸàOô±²w…VJžó¼¶'•î˜ì’­=¿‘ù%¯ýâ Àµ•ïÞ¢žwùU\5›ÄaTøqNBh)Ÿ;ê¦pϦV´ókò‰ÊüQ@£VÕ{4‹šýIFû‰pù,æp?¸&ñ•jºÞ'Š ¥ä „¸(¢¬¬ö[) ®÷ã _ºß)‡È%Éã¿ÙjN‹³¾û*®DX0M–$¦%‰Û¸ó’ôôt ól5©†E—©­ŒAÌ•Á-@z#w3ÆTƒ„0/|?âE–Ç´rÏ/ž {3E3AÛG§Ic„Y£Sf±×p ½õEL~Ohºpõ¢&/NÍĆ>ˆ•üì°ê¯7p¦VÂGÿÅY˜ôýc#/nËíM-"øO„ Ô‹å€³¾ÊEU‘Á8órµ“$¼ª%gmG˜†Q¤_Sf¡óë´àÂñj­Ø«û©Š)u7Ì\ys×Í»nóû±γ%àÈ0}²\+€"ósèG¼¥ºkKvÆkÞ´È'Ùæ|«êùžÿ’-Ù: Å£K;ÌÕiÿs÷ÏS2ížÝQ½éèSãôg®>€¾ó)»â ˜Ø½ä+8»–*^»<=n Šçjð+I©¨z¬õ ¶ž&q¢&©*ëÑ¤Ž Ó†?ã/ºÆýø|A‰£ä%L¦-ÒÈ•™”¥ÃJû÷S9xë2ŽÎ%¥x­;b÷òªXÚ2/¶¸M:„MfêÍÌlåä+üÕä4Ç?õLF/t¢ý® ; ÉÖrݦ ÒT’¨íã©ê^톈Žî]””?&«Ñ†Q€jN0©}Î.oX³05ÄVPnÏ"¨.èo†ãØwìZd ,b…D»³äËýúö%·Õú$5ÖãÜ#1zÚäïåLª½ØÉú’€„–êÃteÖ¢&–,„`¢7²ýM\4â€Nº4†Õž¶úâ–,-»}Ò ÁL‘]´÷U€95`•ÃÊê³%=²ëmšÍEÉ…ùÒÿbšëÈîü»ÙusúÈ¢7Ï¡ðŽÛ™ÐM„E)R^4TC0©©¼^0(0:¿esKöaK–¦¯™¼Éöž95UQšn©ÊŸVóÅÛ‰z%ÀÞîP …>ý–ÏmKKÁ.,†Áþ´èî&s)Æõ-_ÄÀð*3gCWa¡dŒ »Ì¿êÂP>ܱ¸›M °ÖÂßKö6ï«ÆL0‚Àµñù&ÛV+¥TS‘÷Ä4æÜA·üw®÷ï¿ÆˆôÍ£Dc¹ûYÁwš¶"µ@ãÑfP<ÍàxïC£µÔ1h\>z¬0Êkíh±½UCVÛŒ9†â'%ö 30Ãì–­Q‡y† x4ROÁUs>º-Jˆ¼GutüÉhðÏHûñŸÖ™rë›»¦¼âçÿc% L×êÓ:ǰMë`®í ·[×îvëžò±âŒ–o;Ä8Óßµ¸úûðWŠr¸&r¥úïMzVKÌUÅ©}m}UºýÖ§â©Ï“ïBÊy3]¼ÑW@Ô¥”èÂÔ²“b½¡¡è;Í1ÜZ2ÑÛsåÛì£+×hB¹4 >¯²”|ÿ:ÿO¦Ô+9FÔή`ñ´·T.j·‚*…)ØNnƒµmÚUÒÜÂbI•§œ¤íûÿƒòQ’• 43ЛÆÊÖœ=w“I?k i†ŒvÚk5x±L-SZ%ýW[$…݆r›¢½þŠh–>ßýI{ñÿaˆÛI¢Ú¬Ïx¯-e^]Ò§œë&aëÚÓ͕Π"‚ï“֘߈Ÿý¢%pÏ÷¡&¦ág »ºhv¶dêÓ¹1DÜ>“2lœò*‹|ÎÅ!¤6¡ç°1.ýõODIM”Ý8ˆ9ˆþv¬zÿ}[ÊO ™PÍxYŸ»[m*PµxhÉ_†ST£CRÌv1Nž‡û$û•æÃÕ/d³ö*Bj‹YEM…|ì#;6óšŒÿ?Ð&F­î·ÏkC’ò!ûýM…¯Aéïf!]9,;ÖWYÜŸÚ„÷Ã`RڜҾl';×ÎÓlȬç}o™Ø…½ixÚuÎFø–4Dåp°LtGNë?î <)‰)¦Ë’;nG¦#îšÚ”"s¢­=ÏËÜ5z~õc…¶­šw<@ \5m½Px&¡6Öì™­pÝ6©¤ÁôAŽ«‘櫸exÑYhµ¨Ç#¹J;Åw^LJBµ€jNÇ-©UG®.CÃï¸ÂC2§!Ç ƒó÷ªª1i·{_HÅZ“%]xå2ðD)W}…k äI ÿò}|(äÞ¾vUÊc¸) ¡IÁd‚KZ®j ²„"ÈÝc)P]Ó~û¡lŸêj}Þ‚nv_æ·õ\Yö•jK¤W€•U M“ÅÈ↖¹YÐ5 ·î nW§>òzÕÚT¡{U5)‡7on<µFeí ó³ýr0o÷¬é˜z…MÁüÖÇáURñ!S¡wœ–.oq§~è¾Ê]Z‚M{¨Å Âì.¢FvÌdbÃËKí‰F J¢ä£’¯&çðd«áUƒBùøÔ CÀvQŸW˹:eKª‹ï”· †°,¡Ôm:8ùï¶ýì±T’;ÖI/y¼÷ @Š7å `Éâ°œƒÂ<ĀâÎÃN³¬o A7Z_Âd¾Ü˜xP¶EˬۃûÓšG‰–le+½< ßA¿æ¿ê§tÝ]såöWÂIøÞÌ‘èv/3PAWñb6¾Ìóx\]™KJ®˜¯JB\ÔüåX´xPáÛàã·õ Wç X£X +ÞzoP­’àmQÆÐ«à`ø“Ç3_Øõ±¤dESƒÈ>Sß¹ÇÏ_]§,Öª %¬+SñQð§:úÅnÙ™“ƒïýÙ §dÌ.IBIð)6Ñ~žTÌ2±ö*ã4@œ/¼¤èRIÁ¤w›äzSm6Â1½Ø)’}‰¢ýLhÕõûpO†w¢‹·SýM1÷ü‡Ånô#5|Þ†îo#®0íË UNÑà&ø¾?£#»ßù %ýu¸%Ø„‹-¬™#<®,¦"àâ¹4ÀPÅ©'¢Óùb”·ôÚj%Ý·çuï8BÍìí(q"YZð-áªÖdó÷3-ì9Ð䮓†£$+Ím¡ä8ÇØª¾¶’ M&?çˆv³¶ÂSÇJ;L(úzïa\–™–‰OÃè ¢wb¡²žå]QÙömxØÎÖh‚›Ê0#™-5&xG]ÓŠ!¾+™sY)ÕÚÛZ‘<NšHD _ÆÆÙ0¿v‡§`¸‡ógpRWÀ¦²»öÌR$B©pTÌ$Þgô&¯9@àe§^'ÑŠo!h¶ï£Å†L_ç-Q>|Ï?[ê:ñ+w€¶È»„0?Á¢«…¨™ªÛL3ß Óœ¨É„÷ª™ÇÚ{%ò¥«ó‚O½;ž¾¡”|zàötåvýÕ»ÐÚ^y·!X–?§ü%ô(Gº6§ 8˜gä †Î|Öx¾Ëù§Z`_BÎ\D*GV^C¤h•u’Ÿ×q÷ {ß(ºöÚ$ÈVÝWGTy<`ˆnÐk7†»pý/-Bés]øgùŽ&…8ð;½@z –<¬å¼þ‚Ó)Ó®EÖN|.æÄRÕu®µ ‘½ñ€i¾7Å‹oSü¯L§„úä|qæ‰n—–Ó1ò/Á0?Á÷á@%²ÌÃn?.b^9`4†"AiZËô‰‹¶ÝÔ“]lÓ"Äû_o€KèÁßn4ÙÆ¹Ajƒ·Ûãcæ]JÈ^ƒÙOn«D&–\ª¬.7ž‘"ûryúXÊE÷ß½kWcüPÓE‚Îh¡˜"˜fß¿ªíSŠ/‰WEx»õjŒ¹•°?È6’ÊÁM<,ÌáþŸÚs´_wƒNm}ÿmŠ×¤™î_ÝÖìÝ!&•w ¶¸ú¶T箩&¾ì|0xûÌÇ›Ìi'°ê¿r™P 8þŽÖHv´Ä¾˜ü‹޲ÕÚ\&ìk¶iÅ ™brZ¹ôÈ ¹èn¯Â"gt`~3;ƒ¶Š5!ŽÎ‚± ¥Å›Æ¯Äå}°bV8DCõlM%b-FæGÂÊÐÚúд¥ˆnmÍ6ïdB6È— pql´70í·"‘h#­dœðäÎäû€0Ê ¸÷ï>âÝOÁÆÌsVI|Ô¾ÓGÓ•:ñƒ|qK®ÿϾzŒ£“ñdÀG~É õH%ɬçDÂ…ˆsõÄgăjÔÐ~^‡gkã’>q´gÑŒµOŠe¿DW!ñ€Í b1DWÜì3iȯºå8¤+–p‘¸ÔÈT…ÆTgç17‹ø›û˜õ5ÏîÔûù{ùÜ0+X ,ES ×j4ø: ¬C·¶(FRtsmÅ“æ‚Íy4íì¨h$}õã 8D¸ÞpŸdÉ¥9ý¢¿\èlúx+G¹~É&E(Œ`[GîgJ\üG°›LÖ4Æ—Ÿ÷¤}ܽýèòu~Ô$Š(d|@C#šHn«³ÊEñþ5{нk© Él›i³“­(±Ìð°ê±H¶s‚±#ç…SüÔàêÔð“cP6'v±­³JòÀÂ…æÖ3ºÍ-IR³îí&G|K˜¶ˆÖYä`dò44åÍ'Ú<¹ ¸zbH§‡ìlÝ¢Ô d7ž?Oüî~ñmøíáƒÈ@ÚYÐv]À'R‡ÉWÙ @§* Ÿd-™û!öo²+`mäbVh2.Üc…Ùoƒz¾7J4z:õ=ƒzØ{€Ÿ©=nÉ‘•–LÕìü@0'†Ö^ †Bn4ï,äú)pã)ãƒÙ̺Ì*Í®k%÷ä:pÞBÔÆ:µ}—Áµ·S3í¤Dê îøMààÞö ç% É0ˆôM.fÙãRÝbÌ$+G¯ì£QõüN³q,ªû "ŸûÏçú³”¤"ß•ÕÄÆ¢ºíœnXÎ6Êÿ€¢Qçì€ÿ‘ßU쇨¼`M»NÔdÖ ³ëß&FËû.ÔzZÚbpmNÊIŠˆÚÒF¯˜ûAºñËNošõ×^/4ãϲ¿GhF[a;>vžÿE¾àußï‹GàÚzöC1Y¢°÷ôñÀ®Ʋø–Öùœ¼ùãÞÓ2é‘&»H¶Šz—ÛȺç[³¾cú ¢ôE€Ïk¾?‰ò’ê"ŒŽOŽÑîu"ë[>FªËV¸µ•s¯ª”á Ô –¬_/LÝå˪Ã,³ðêôÒaÃo¥ïNÒÕÿaȉî\Ä"8Ž23þ"ï/ljp<’]Ç-ßã$fîò2ÓYaxö—(Þþ_7¤ú=O\¡[¿ ç'Wº}ºgïž…ºßçÇà™>RoV€ö¥¶¶uKàüÁ)ôæ(q Á”zàÇÉð¸Ø¯¬AôxךsDV|V¬\ÕÔ•@Á©·;T¬L 7,(±5UÜwKbB),]·zp£ˆ[øc~o±ÝgÝú”#Œ Yn›aœËA¬i£6U¥Àλ…i’,½®Óÿû:ÈiE²¥*Ýöê™GUTî$GL¸w NQöó%qcƒI»ldõOÚñóu®È‘ð–ÁŒ‰tîrÿÜö·€9 C½s¾ ¾N7¹û›$þÎu6º×Ú¶6D;*çÄ?]óœ%ްw¸£-Ëb}¨Ðf~ºa) $pT£þ&\K“@`ŒÃÓŹR†ï1Wít娃ØPô÷›gî¸d±ï¼¯)rÌÛ¬~ Í!`Âç4ÅŸôÂMʉ‹ªL ͼ‚¤Tƒ†N¾ÂÆKvìFE BxÈèv±#¡´Rp·k\ȧKö'=vm!i z‘ýàÚ®Xðxta· UgOäw|Ãnâ“BÙ{ȱOÆ Ý»HåÔ×uÈŒg±&5ÑiV] —Ǿ™-³ËàwܳßÐàÓê{Ѹ0 nD’Nv#êëõX]}!t¼;Ùw$XÒÁø’ÝæWÉ}®‚ðÊÀ’ÙÇ!’ÞÕ›­çòý  ž·,L‚6àçŸì|˜¹è•è«h\Þ ƒõº`ô&ËÁ¡ET^'ÞEÅï÷}ÄTô¹aù[éIyƧbhÀ2"SG‘Ú£ãÎ^Ds’>^ ¸oûL;/Ã/Ów"=5À0!›.IoC&@@!$ú©–ø·ÊË[Înj#¯Ä|&ê¹& R ‚·ì:¯§0„çÎXUUÉJíä"NãZ«Èz†@µØ*¼ cÜCˆ küÚ³Ä3Í0“àr¬¸õ„ž­ÒTÈøY¿­¬ðO]?›Èô·î nW§>òzÕÚT¡{U5)ºüÛÌî‰&„Qqvv0Çüͳéß·c@CöÞˆoÀ¤\:ÚÉn ï»Ó—ó‚Pa]v­XO­ §~Áû˜ùó8ò…aßw"芎€vº¦=bWœD_fÖ°iß6»¤f½”QÓ `°J† Ž´9ô‘Qã÷DNšªÃ±²Á§¾@ †öÕ=uP3pFx”ì­âpêék] ®AtÅÑßqÇl‰3u†üH°Ùeú½c÷¼™tkÂ+Ý^Ñ0jWò6Á8Ûã2ÆÞ°0æez黨°_ÿÕXm¸v{&å¶fj•¨µ*µ C"…‰LL_"°ø‰ö©\’Û)ᘂµ£3?Ú &«¬Y“ȃڙ­¼•=c宇Ϊ#8ìñª;ÉAx@ìl®„~¬¤8hã™1ómNûÀ<"GÇ7ûô]¶ -ïqd{«>ð)JýñœäcWn¾@eØÇ킌ˆj‡à ŠhÞ-Ów)ÍAîÅLxðk3åoÍRÑ ÝÃwô&C‚^rd–Œ¯ŸŸÏG¶fü–‚DAã¯kÝxM‡½¡ Î]1.ŽFÒ®gu…~ç3It¹õ]z—äsD³í/1º·cÆH³(aÚsDD×|çäŠ=apée;ã4ìÀU†w§òÊ;›„œ@qkÀÕ78M bBœÍºO.Åî¸Ë±‡DÔØ”0–n6™ó°[LjZç¤ë^Ê{‘RžÊí5“XcŽ:SÌåÕ[ÂxÌø•îÿúŸ›l]a"w2ñ3as·C7áp$¥ð<ùíè^ÿ°!@Ïé]Ö„_-š3Kà *8¯¹Öû 6K›º‹”ž«Ì6QhuÈr8_6¢EšiV÷ûßÀ•ÅNu’vÒ[ØŒØ4d0ËjS³”,%f/zt§uŽê-È(¿ù£Ø¼Ä* †{Zvrãõãy䴲쟗ùŸÎk0¿üz¤\™™Uô7¸à&k,iZ·¿QàÛ'!Cý'[eÍK›#cºXvïzèZsÈÎj¿ç„ú¶_¸.Šòl¨õ±uËU-‚¶›o^¼>„XãŸQ6'“ŸÃ_Q¶?èN¶Åjøb³ ï_Y™áÒ¨8‘ùÎ9Y°ñÃé„î±t0k¥¨w?sÞ¬P±Óž*a—!³“ *v´ÎÐ1<(2+´'¶B›pɧ!#Œã1Hš¯¥˜wv7Só]‰j‰'­ ¦Ü9gÙ¤ 1c“€î—ôù¦šŸ-úÓgc‚9Pª[š…眃z§JJ'È?—•À°Vè“qÓþÙÎüYHÝuÏ}ñ£Òú6ªu£@¿á:ÿ4r/ñYÌbµ¹;Ô»}8ªß¢š Ó;Q8‰N•¢w 3£8éð+[XgÂŽ”µ28ß/(Í®ëY[º¤ÉOG~º'žÑU”ö,\)Ï€âã#Ù'Ñd[h4 %<#½ÃX…sÁËMõ¬ÄyÁF,Ç5LÁüª|6‡²dËV×зÎ#ªƒ;fÍŸ êåÐÊMœ{ޕРð±RExöÙ<߆:Š?†v¨W{Ë.KÀ¶†„dáÑ“AR7ú?ˆv[+X`lÕ’‘ÒâÊ·ñ²˜@â605Ÿ×'I@egçsÈE)U¶%••õäS³04½`aÅOÞ!l<ºöí7*3)´±s”W™Ilù5JS‚R&K«‚­‘øœ9›—I¶Ro×ÙdnMåì¤`ŸHøWOÅ·V$Î[_€g<†·<5…Ú¡k¢µº,Ä8ZA)l6<~Ûʱ±ÓáºfPlZ† ë%G> ¹„CÕòy*]ŸIÒ1,4 ›ewözs_gûð_…;$÷vìÁÿ4œ:­òsÏn„>¯Û·Mô2—1NÒ¹62ë ©v‰å«A ’DSÏ{¡î ¥(~åíÀw8¿“¹þXƒ7’@ëÜØsá´†…Òª¤±bíTèýzŸ;Ê£L¾Q|Jˆ fÌÜAÂa©H‡Á6qÀÑÈ®Bd»Ó|“«¼»¹*zm”©'ìÉõß»Ì(®ÜçvŽ`¥ G4yl„tÖ r€'æ'øJÀÎ÷ýã.)ú‡`?›Ø w=ÀZõZæNøN_ÇŪµù"J=%JûÚ†ýgûX—ÿâÉì5 „h#˜'âç/ÇŒ¡YáàY]&ò¡w+Iç–¿8ëpÜ#ïœ7âpÌ>*ð†Bm#8¢¶´céX<Ì æÄ0ª E ÕëιÅOˆŽ¤r0dÞê±w$€“D#Ú'Y&,†]&U³u>8Ù©AäíóG?o”ËDØöÕצ]å!uã+°ÚÉL7Ta¤ dNxÃ!VkÁ%ÖÒŸÒ3¡ÙGZ’æ26Y4A&2¾Ÿç½3€mq¥PÓSt½ªÍ™Ø),Jb…Gøç&yîe,QÃXt±@y˜è ‰üCǪ?ûáôáˆÓé}%¹ëa>õêä¦ó€ÅC5‰n¾qÝyIá~)’û#X7äØ0»Ð9ãšòPœï± ™%vsØsøzé ñÁ¦ÃºêsŒIpO—Œrtï‰ê¬Bvܾâ¿7áO_UJ4Ÿj9@“á¥k¹sƒ9›’4ð&\pºcð°ß?~tè…Ýšÿ’ñø¸¶“e%­ù¹,×ANÚmGÙqÍöÒÉuÈÙ»8I>¸a—æÃ¨»_{ bZd+´áZ+ÚôÎÀ»ý Ÿ±0ò­óLܺ°5íØ´aÈ$zØèáç”Ðz¹×š`éÌw”,Ro”å¿E{gÒžVH›f©¸U|úŸšÃ‡‘/9$£oÀÝ…‹é/¹ ™„µý('KIpƒf&Ίá<·#˜"Á[¨´Óyî “¼ZµRìÌC˜žI1ཤ´Ã’‰Ä«¤>:ø•K a—K'.W¶ªkòÅ ©J¡ÑÔÔÏÊ­_ïœ5×Ü<`i¢~ö:ÆVñK\ޤµŠ©ÈiüΉ5ÔÈ0Ÿ"!©ïѱïŽ+^ιKt¹ƒd'JHþ9ÜñÖK¦~Ïúá½ï¯/¸“UU#U«Ç[qÃo5ðæ¢c!2ºkœ5«+N°¿CkßS5AêZæÿ®¢(TG·‹÷KßÁyÛžOnÓå-ïŸhƦ2]…&W:æ÷´~dm Þ2NŠâ*õÏï¼™*C"Ç…(gZa¼û,«ã¡ÝÑ1´‘\Á•"10Áƒ8&kŽø#%sœpO,„€V‡³[¼¸T¹æò7°À­ù[ìhžîì&S¬Zi£ÍM÷ÈQÊð¹ž5…²|”}¢WP\ìÀÖôé¿Pj 0}jÐÔ ü-·×LK··^ŽAC?î^s{<÷²7%¹L€¬ž½ ËÇ©cP‘ ,#[gŸm訩힛ƒúû#—ŸCïAãŸú])ʰF’«ˆ¹¾‘;ijí•ÙÙ{‘fcJ*¤^[5¨¾¦p•vÒL¼÷z0m4íÕ|Ö¢¯F"ã²Å¤ù-%çÙ;Hêµ8U£‚)›Ó¿¹!A9M<Ý^õ ŸM…Ì_ÃZúÛà¦rBX"?h~ÑJ‡êN.ëà‡-d9<™?²îv?Ò‰v%š“÷ï© ûYÃw1ò M$ˆ“›°œ`é^L•Z$ù\7*µ÷ÌŸ¯G’4kv ºš«k`+7ôTŽÉA˜‹¥¥µÚD^›S­:Á@ý‚!bÔ~!åf©ZâTlqä1]¬Á›X 0¾t›‰ ÙÓi”¾±°Ò‰ìÊ~]$o{NlÂ<†Í<Üz—êBxeÐá`5 [:¤¥ŒÃ€œÌ>¾–|· ¢-14!‹ÊP¦1Y‘½ÿl½•K „oíñן)áþÌ›oz"ÃM9•ŒÚhþX ¸êwvaÙiÅdÆ]ûmðŽXA":hXú&C,`Tv°Ä8¬¾xq+ü²Ê|Ov}ò 'ÎR]ÉœÕßÞZæF»þû'ʃë ò¥Fíѧÿ³õ1–„ ÉWZKÁßê(ãí›{t $Þ6ë×só¯R_õë %¥÷ÓÖô¡…Z.åÖC%ǶtœŽ)b6ËðzžþT¾‡!P¹à§Ò¾î€‡|D™÷EzEº9qWì³>,¿ãpX,#%© å¯ú'KP\>A*¼!‡ŒA³¢ÓZFå'U¨R`eo€|E^LÏ>ÉÞëÍçºÛ á‡úwG×tU¬^w¨VÁÜeºó.iÊ/jÁkº`SÑßQ_ÈîÆßòBþR8âøAˆ`÷pçÛÉ—Âóìj.ü±Ì)m L§ éT·èDZÿ…D¬Ö+¯wÖöCµA´ú÷ ¯²JÀ Þ†ÔóuQÂ0 è>U#rˆÄCsö¶+@¥ý´NföÐŒHñÑÂNåÊ¥ûãJŽ›²ÅP{¢æÆ¯Óuº=ŠÎ¶PÈŠ/ìˆíDªQ¨czOåÞ^.Тn$Ç÷ }m]xQ‰ÔÃw(vœÐ4FÕÑ^#æLøñ2ÕÌõæq&Íè¯"'½ßôç¾þÝ8Î52W´¬ÌÆ”Â?êá'ɲáä$(Ä3U­–ˆãì@|8M \]fíø¾rîZ«èð“‡Ãû>ÒÔ‡¤6ôT¹HÞ^'O„}ºc­`C”»Ç‘;o¤üxÐúhòãª$/Ûyfƒ¸¾[¿qôŠÀJ7V`xã.O’@=ÓÇ8Ÿ뜔ú1ÙH¢ù@¤°….t‡‡ eu®ÂØ´£«ŠÞ³»Ëü€¤h¦£Žc^W}¨HÇY©øó˜Œº° eΈ1ûGì|.épÐþPÁ‘‚XäW’e¥ëߨžŠ]) »5UÙal}ÿü'ywS\~Æä`ã¤]9ñ.dÎ!º+ ì•niÿ-I’+¾Yq~ë°¬b§ôuDd³UϤDðÝ%nÑà"Ö\á;¨eåŽ4¶—CÞp‹óž1ê‡ÝÜf9=BFiD†›î H¹±ÜÝðÜ*XâKʉH‚;Ze†Dšþ¹±,AG­þ¼d©ÕhÛØ Ž€ÁÃØÖ“d *ËFœ‘¼'§øäO%(H^ýxCÿX4HÒ_²›Ëå–;éÀyšƒý†?$ߦ¿` '§»¸¬ø3\Df´ï4ú7üÎ7‘JeRÿUÜ ŒT´[“5+1“úcçŠé4gš5Ç¢Xm\¿Â“Ð Í5Xäo•LOÕ-€n@NöEME€9@â“ÌBn臉hÍ Ñ Z­±e‰Í_·èù}Á>ÙuºÖöùmO h4w‡Šä9í@±=[ÿÒýúß¹Y~ é_ ó¾ ýÌâ?ˆàpÀÜסbEz!Ð}swûßë°€K½7›¡V~nÞ@«›‚ñ”™FJ Õ‰I Þp¸ÙÉÁÉ ‡×w§Êe7>`ƒjÅC’íQ¨èZS¥0ê\%"¹ØLKÍnC3Ye¯L¹®ªjªüë èWÚgßúÀô3X4½vŸµÕ@¬¨æ±`áËD0著uÇ2G·8sÝöÿ4¡ñîí¦ñ—Y|ÈI¾×]¨g±Mæm±Êã4µ6)Ñ%/¼Â_»¬ÿ kì 1y9ƒeúÎä|®+]äZÔ¥–8–U¦ÎOYÅÒ\7`iÄß²ÆñÿM¥ô‹2Ë“×èØZJ<[øŸLæ‚[¨ˆS,"<ÒתÅc’khsC¹*fîð¶ø²dœJ?oºb²U«I‘qTøkî‚%º .·¬¹bý:‚xÑãK:ºa1%ãá’C(ï ó'Ó¡\XCs‘JáÕ‹ufb½‰d.ÞÑ9ÀíGÄXë? 9W8BM_ÀrsyÞvÏlÖYv÷-ç®ß¯ÒúJ—´>Œþ“Zs‘ÌD—Æ¢Ù‘(ˆæøö8å‚ñûŒ¾Ñ—Ü)58¥XäÒjXªŸÉG¼n¼pÂïyСî×JTü¦6æBp†%`·S߬԰“¨s¢«¾½YZ±&&Ç"•† ÕG»ŒX̉€Ç˜Ã3Œ'XžÕ8T¢do£'szU’Vâ&_~6ðÄWÿUlÀÓèÆÎ"©cTTtcɦËíó$uÓƒ½¤(eI‹_êËRHƒÿ%hR>Ú‰[~³_ˆ,m³ÝdUô¹_& p»T:ÚÍæq©EIãec‹qWÌu ì., ‰¹‡­š±’Õ t—VtÇÄ/Ì—{Ê0’ôŽ+硪s&Î){¥¾4To:€P5¼–٠צÖVJ’­¢¹!NJ¦8áå ÛK^ó0hT7 ¡…äày Îsô’°BŒÈà‰O?þÍH—ÖÊê©ïnð¶,ïy7+•L’)°.6#1FÑœ˜xVª–ób&˜©Šú½°>ik¥("êQyãÄê=ü[ œOø™þáb1¯‘BY¥Ž-}?úi^ù‚¯õ}ƒãí`çõ‚­E˜/"FéÚØGrfÝ}ÇþXx…z_÷[Ë¿æ\åNáòÚþ¶å[Ï;ºÑÃYÔaÔM¥‚B&º:&™ŸJÝüQgaR€ÿzÍÊøYüÖ|,"©NoWçZ<ÓÆÍZC~HN²î5Y3Ç&ÃMÚÕR:ÇËçµðWMH€úÍF¼pÑÄÖà¤g_¸ wÆWk–”‹uPLF [w>ƒAžiô‹¶ïX þÕ-—mwKFìr ˜¼«c }O<ØîáKøHÒµµRZ€æÓkþ6AFÙ ­óP¡Öÿ~=ǨrC!½qPsË€Àm¤¤Š¯&—ÙSÉìõ/9VÖÚxíÁœqj!îL¡…o>bÎY¯=ëɉÍ//<ìt¸М%H×ldBdÔΘ]9û–Àpˆsйš·&–, ç¹ÌõÊ¡v0£Ï+6Š>ýî*ïà©5›PCé&˜‘Q¦y§à§¯¶Dà 䆧ÒÑ_|NÜØa_ ¤²AòÞŠ¸ÞtÖ5‚åc¦/2댾ï]LÉ(‡Aàòì&¿o¿®úðÎ ˆ3 ø˜ÉK\½}œe‚¶Jâ/\ <.ï8«†iŽã áÄÅ*ϵ¤0H^.˜;Ƀ^þáEȳý%°TØZZ™ì†ì…B“V¶êk'JØâÙÒE_ÿ 9Ç>•B Kƒ ’±œ­8í± ̬Ðë¼ ë“6ÿ¬ð©HÀº»ß5M¤ÅoHdŽÌKQR¬úV/òß-×gÇ3Õš~ôYÚ—¡ˆY™L‰±±Ï«†áµ¶ßÖôcÇÎ]zÊÙ0c7*_êÛMgš‰0_ríÈ•kiøhí›§2`dýJ«G{_'©à n?²ádÍI½ßî-Ðs’éæL³¹`1VÐȮŚõõá‘/S¥ /í P á¡àiK/ÀÚËf¸g‡¨÷»¬¯?­ÍøÌGö2æ}^;]ëôŠJÛç–Æ7Jø3¾lÊ#ýµ7"_ÉçVÇ벡b¨7!Ž„J´U„«K1}ÖV$§ãú¶•—{.Ò¬ÖÉ57£®°t˜Ÿ{tíR¢Ñ«õU¸¦kÒ»/ªðM`Ío݇ýñž4¨øïšsówç«ÚÁÃäk›ÞÛ`]#ɱžÿ˧_Ù@Ó™vEé°1 WÞÖ\# ^.LûÒ®îFÖco$ª”•Æ#Œ³Üö¨Tê³úC†kYÁqÛ7*'‹Ø!Íå[I¹ÙÞiÐÍãÅ=[ ߣsò¹ÞÔpX9¶B‹/éÇÓùÇ¡(‚¡½ó:·l—-Y[ЀŠl¨vOÜ’ÚþP8wñì\½ ‡º*2ÍÏÅŒ 8&58…gÃÕÃRòÔ‘b>šÕM”qÜ·Ö垆¬š™ã}„¢ƒÊº¯åÚœ5(}¡`ƒPHÅGA¯ û·ì¯™`ΨÍ`“užÑs×T;¬’£V!E·ÕÚH¼éþDI Î]{:þ¼a¿$Qm³žG„êঔ¬£*¾†Ôáú© ÙBôÖwíßG ÝEÇgXw«‡˜-¤ç?ž®¾C+`4# To\µWé×Àn"à+3ÒyNÖžÏ(CYAîÊbaüþŃZ%{ãt¬kÝŒ£Í……“ P“Õ'}~Ý`7íHÖÒã[_:>mÿæÃI”ë➪-oÅ«ˆ›mU*ÞÛ…YÞè}œA…vˆñ‰^y ;²t2“׉—q€zñÍÝBÒ[„6óNÓ]½vžÕ«ë-伟­ÙÅ´—1Oà7y]j›–b0É;"¡›GΔXÖÁIõš•Qµ…® ZÐØÃ¹K€€7Üå–b+Ûº"XŸ-½9½Èˆ²˜ÞV¾vØhT_¥Ï¾ ¦0‚®dq‡a¨:Q”­EàÜ“n& A·4*¢ …° 4·Ï&G„–ÝTÀ@ F)Kö,Óω Ål ßÍý| ®*ú¼¸+áÏ\—yàÉ[—¾÷ ë™FÂð¡Ó€;«#„ïùË" $$™×¯GZ)d,È2Kí-–Í)·³ÀuèÉ*¡sÅâµæÄ/ìX·4Iò‰xCôbj¥6‹ùÝCêÁÅ'†?F~|ŠÄ“7•HŠø·l³jlŽD°m„|o{Y—-àˆ…Y•ÎT¿N]&.\®÷ñvÇù*·CxÙâÄœññM§ Zµöä›)@Ÿ!X¦-ÊóÅN?lñ„GJPëDÚÀGTÈ- ½B½Åçqãz«1'©?dÍ8ìJoŽP¦Fs_¹õ™MXV½×Ev[F|ü‹2xM¤3…œÎgBÙ‚ß8°×݉áè½LY€;^Œ¯|ÐÆoѧ“óR§#¶ÒDø³ØÈ²JIõ ‰³-ä:Óîc 46?YA [[Yñ=žXæÏšÇê¡4Î-±±åÜØ@ÀÛùE}c%ÑEÐ8Íþõ‰›F‡u»ƒ8«í{TÌ$ [Vš¤èòõ÷7l»¢X_žø§ºøü⺵¥uWÉu¬fÆfî¯_ܯg.ï€-kç\ý<6B ¿Î`iœõÓsY} l;ÏýïŽD ‚„ù{•l%ún£uR{Žw øîõXµHÛ€s?øo¦þ½ ¿—jÛoÖ l½‹éíV¿O–¼(§ 'Òm¾ZËM–q_WUð©êñš²8µªÅÂ0¦Ç»ýÖµdΗó4V¸kÙM4@‚˜au¼«¼*\Šê.פWÑŸ{Ì¡“kD3C”„›–z¼l¼I1ü®^Ìä9sßo2}ó.g0AÙ'($GG_&)²áuÁKÂß±{†ê¨Øâ¹Ÿ‘µ”ù©c½ÄÈu¢7qí †zНõü¯Ï zŸC:øt9!)5½ŸºËÆÝÍ z)éMÅüD±0qb:bµ›çê`=Ù?±ïó…xr·‚ÊU{I`óx<˜B¼Æ¹‘RÅ%ögolx k¡ºË$ÛÎ0wY¶¿7÷Üž¦sª‘ˆ<<Öân“³"÷LMÆŠþŽ1áQqè1}uÀ'´m{lÚe–‚˜pMæÄ¶>ELT4I‰t{ hlóM',h¬eÞ¢:þ–À¹™¶¶-IÌAUi$̽â¨Î…zã=)­…}\h:Rœ„’rD÷޹÷ÁûuQû-«ux’ºL!„<†zE8öÃ[ |ïägâlº]{œ.TÚ§µ ‘º'd±†íøñ},(–;°ætõa1|è°âmxW-sŠªŒ:´R36{m § œ0†Ñ6+x¨Ún­Öû·A!øÛäIñl‚.\øFzà…ohŸÙ>£Ü[±NT3¶3T¤¿Lƒ1Û9Á¼Tß±ÁƒÔp½cÅ7’«PF#ñC×þ·ÞÃÿúþ~…æ>~§¬ÐŒÈ{!M ¯‰ti–B›Êðƒ;)YÄJÚá¼Zùž¹ø÷eÝÁ*MЋ>HîiŽ›˜ÿvð®áîÏjŽIÞú éœ$ºÝ?9^¢™«€­‘ÖìG2§{ÜÁ3s‡Z¥bYuÃeÔééØZÕ‹½½fäý9µ– ÔŸ‹0ù˜hD=bßMDLJÔùI‡42¯¯½Û:¿urz!èÛ{vº¨fZõ±è¼‚ˆ ¤päx(&»kƒ—Òw-ÊWMïšý”’¯Ö.B—Ê!Æ@·òâ¶\0ƒ7á#óÂFG IŸwLÞ ^àB6ÕJþ/Úÿ„×ïrã„Éð•f=• ˜ã8Í Šª¢¬²¸U0ÜDRWjgcÎþ–ιh®éý<ÙOþÓ°%–õVâ‹®|ÍŠ›“˜¯ë•1Ò«» UÉšÓòm‚dx®WWPPaWÆg ñûHOItî§ò!g\SËìÝ^‚ð©=Í~…Œ–3iC¹Ÿ‚ü²IC‹ð,{ÅÒž:Üøé V1•J Ë“à»/•Z–ô¢nµjZó4…‹"ä\Eû0æ±yz#1"¤Ö?Ïâ³bíÖÌö¿^’WÙVt¤qî÷‚ ‹ÜÈ^M¡‰Þ‡ã$ªg‚ÇÌ3*ãÌvIó_CùèåOÑá`4®¬CÏÔ¶æùð—R%6¶ÑrŸ‰a¾__¶±E- „l0ºSs"|èÖ-ø¡–ÎM]µý/!Â)OŽÃwòs±,Û{†õ@aŠ-‚$Zм^þ+Û¢+E:J  °œQ¬é3d’=êßá]›ökk8Çè{a¸Á%Å@ÄXäu G‘©-Ê´x;D zqQßì®4L2®‰ºmÁÄr>§T]®žŠÈ¢Á8°$'$6i!fSž™@rwão’ê@x¶³Œl+\m©5çpK†Ë5(*UÕ$hÅç·ûhIû•ÁAÆŠ™ú2Qª‚˜isñ£}@o§U;þÆ>„h XpE‰ÅÒÈæœ’$A×B =í£˜®é Ø§˜‰Ä ,dvõìñy]kñ`}5þÒ0¼ÍBãb£9=‡îÔ”Mßo@:éÛ÷ä‰óÖ`$X5-ñT~MŽ@•F~¼˜èXAÓah•\ÐR|^üm¨’)EeˆJúóÈ„RbL×p¹jÁ «¦`aýß8΀0qîs ;ž,ZïxsVAä7µS£ Ò>¹›ý஡eS; l’¥û?N´…y“l.ýàÌ.ø¯“ÈÞØš¸‰a¢HÍ|܇ý½W}G‚hˆeø]%RÓ3¹£Ûe¾Ö3Ë7ü*=eJ×Îîä î&›h·†¥šú4í£ Ž[é9–3[R´n:9qÆI¼)]aßPäyÛõ@о¦k×Y¡N“TîD5/«ÌÏܶeÞ]wÁÞÝÒÉ3âä—±®rñä“iz³T˜W“s,úõùêÛ×5qo—Ÿt=î¤k°4oþ5Ï„!:Zv…Ž23 &ÇEÄ­2;ù§hwwV6ÆõH²%×Õ%ð§e\£¶7dеL:E”œk™Y°%b§Á oÁª"+§<¢¼D”Hˆ!P=áÒ¶XŸÂŸO1’KÚè/²ì ’¦Ó€Õž«C0Suû´=6Õ`ÏyBá( b€G–º™`½‡äh\J#‡ Ly9"©¸aì5<+YÊ*³q€¨>…ìNÃ/×0¡ªŽGùcB™âZžz¢ipÊïu-Oeu•ß ˆœ•¿W¸6§1 Â1Ò,¾[[ʦDÍ\§.e.Ã϶3.ùÜŒf‰ÖïOLûCÛhÔÄÕ!¹Ø2ã§Ö‡¸º‘‹À{³®sïÛ†ãÉmq\Ð:¶iŽö "Ç3a„¿ÁÄê4LàОa5“„ÓÙEd>ggÀÙ¬%—¹‘4T]ðWâ_™wj#)E‹ à·¢;Í#Û¥jG“fmïÜÁôuFêa©õ41:õoÈW ±NŠæQÌ’º µ$Ž@ìÒò®v/„îð׉U¦»éòA…´ÅAMî”ï/yíƒNâ R 5ýçÄýÄ+/H&ÂF ã#jæµå‹×iQ  B6ÕÈ!`ë!‹2ŠýZà%ØØ¢M˜¤ÁDhüHžŽþŠ‹HÁqì>Œíݧkôe3Jö2—å»i_B<ÁÝLsN“6be&7Û­jŽ´iô¨D ~c®¿;!»ï±–fé¶õ˜ àv’:3™^…äT\o—·’3Û¤ÔÑ‹‚F4ã ,Y›ŒLBbûs|ï'æÆR„Fóyêî|5öwMi{7ÖX€-‘“F‚ή”.šÆqî·ë)'™4^îQ—¡P)D ÉŒ‹G±šb)‹!ŠƒôN´&)]W(BrÕ;¯0äÙUŠ6+¢–‡ðƒ@»¾7?gíá§DAFÉv›Aw}h~bÃqЏ’H/VÝòNôÛ|²§¡VÂÂŽùâ]Jϲ>‹Ö-’éô7)¶°q›Âsƒà`a'IÕd¢Bw0‰  ¯ÈG!Vm>Ø5=hõ¸Ðvgã˜&˜ìL׊ÑZÍT]®äU6Ç¢3ÕC€ÄV˜OýÙ’¢…²îëÐV9,J"4tsÈ…a"PU’µ"¹œ‰5lÕ3ノ1"Ú¼@@ &„`ƒAÙZ¨mÍ|+æã$ïñõy »î&Š¡—+Mº ä®GKGáÁãdŸí ~‰‡ëÃkÄÑhNsÔ"1èí¯@u·Û({@ ùs]ªþ±êúC˜•t;CI’}v´:.Q9}ö>ì-ÕÖb »k›¸ûg¾íø$ÄèÊÄ´Ç\|à-e)Ýåµ_«äZ¶Á ½^ÏÜÐ d3 ˻ΠJÉ#ä ¨ïÚ2 àŠëýåö ëMöägˆ¬P s`é3Z>¸¼ÂíY‡‡Gä¼U3Nçü±?ÓÇ-Ûz„õ$\‹qU!ž´¯?á_³:¬üÏè—F‘o§Nމú’nÉΗwôZ’¾Š±“К} ôÆCP´'Ú1Û>Éø‡V‹ôb7ÅÐxÃ&¹fmÉre‚²Z¼Y%:ºæ5QÑ»àB}Lz*¸Yw3 ]*íŒ"w€þ[:›åá!þm¾› Ì¡?\”Å8½,ÀàËÖ×!·j¯²}š[€Ll‡ÌGNª›@Ž›K RêKþpŠ£þo PÊÓ¤ÀþS$Nc¸Ó0fN *m|Æû¿'kt»$yž^¹Ñ=øýë¹ÑÌÑf¬B.,ŠöMÆÅ%’tÞÊn6ù?š«ŠVW¨·*FÿõaSCdÔ²/Ç ¾ú±kÕ¼$*£ë~§ ‹Ÿµtiú¥<˘Bñä©$0hÀ"s;%²¿Ó)Êý¥±wž&•`€Y~Ä õI“~ç i¥=¤õîTò#<Â-ó.8õëKA¡ô9ÚI Äu@µ5È;¢‰Fë4 DN…Ãb>&>ä®Ðy®j›œ{­îÅ—E>'TgâÍþi徑2ë¤Ä«ßÿ µdS †‘WÖ,:]Ó>TëžU¢4h¢¢Ž¯Ög:.PŠÔ…í2r%X¢è³µÂíSŘ³‡ Ò5Â'âÏ–nh¨™ôPßǪ<Ÿ$U¨8ˆïÑç”úÛØÛGÆÛ´[B¶g“Ybp:ËA –,a݆üN<×_ð ¢HbÛ äGmÍÂ0дÀÒ:¢Vé•K›3¨P‰ʘµ"·Äª*©ÿ;Òi¾Œ£”b$ü¶cÈ о“´NŽ÷±¶Ñj[ÚÕP¹¦eΠë«ó¬©ÕY½§ªj4Ì“3Dú¼ÌÙÊ]ÞåôC¨P5¯ºÜÏøùX™‹qk:L¹[Ï6¯˜B85º‡êœÇÚÁyS2´G9àÊiEÏÙ¨ç ÷@‘¯ÆÎc'“"e£ÿ^Ì­ß„oïêÅ>Î’Zl&öüÛ7ƒÖ¤kç¡ôSG[§PC{ÂåÔÊ‹¦›~ö®ké?%9¥†Ê1G·æƒ°¤è(«>¬^"™‰$ºG]øBTŒ¯±Ýd r9[TôKh#™Ä8ÒüÙ»Û:ÊkÿEr6Ú Ë9ìàéât6r’‚ww²4ëí±Q 4Gë‹ô“ŽÿÈÏSôû§«¥0¬ûÚ{Í}ß7ª¤ZURŠZ>Ьªœøìq"äÍ_I’Èfnp›_~ùæáZÙ‡*ž„^e£#Ùû‚Ǩ|¥ãBŽôq(jAÜù~§ãàêll†³ý!âð@f…¾²Ò}êxK…—ª³É{£³f§?7æF/ü½(IDðià Ø‡ïÅÏ o^ÍL>·í‚5©ér4!úw1ìÉ¡þÇæ’ÛI@^°9¢å;MÇrT@ÿ1v]A¼ó|ïÄàÕt©ßôC‰³NGˆÿ%-Ã×e€œfhI‰=e%D+™”øxÕðZ!«/΂[H™]öoœpKˆ´gë•ÅlUN»¦é”š'Âhƒì Œ¤2WÌÎžŽ Fça‚®U˜)•3’sí[׬ýÈ®öauö™+žUHzzÛT’#ˆMJ@‹Ÿ÷¡fV\Ç;¡ýÊ>/Ñ3­À¥ž8ä~{Ä+÷…˜q€Ë.wì–"*šŠaTäu{à_;z½Ë–/ Ö̓€?Ÿ@šõs1¹ê@ ¹#â3î:ºÑ¿ fÆv:Ѫ5:.b®þ-në·¸×xB…–¯SYéͲâ@3Ô²ºìÅ×ñ}–=Ç^]Ðñj¡æ-|rjH Dø§N&o©¼øOqìu¼xì¨ñˆé3<­”IÆæ8h¿æ†½¯|2½®_×=[±Ãb1T“UT09`œÔ jmÈÈ×.Œþêâ¾d^ ?r+\µê¢‚ªké«ýÝ,ÅOo©~„ÃÀ‹Õ1›Õü@‚’c·®2eéÃGƒ=Œ¯á¶QïÂ7[…Gó+з/„£ÃêY,“äzàÄÖQ J²ŽJ; ¸ 行¾sˆ7º®Ö˜hó+MU‡pßpÒ±Gc‚Px/~ƒÿGŸ{Jå\›€°^Ÿr%óW€`T°ªyž31×èTØb$Â!õ~–[ ©ƒýÙ–^%œ`DbÔõv| ×Ë~ «LA[E¹ê&ci—g~™öR¶XŸ_ „•Ø?jâ°(®*â|WyædŽ¥f" D75eyŽ&£oâfßÑÍ)úó?ö«Íh=µA:ñþpú7[œgî¦G{ÌøÉÁj²BÒ¨áÓÒvRW£k)hþrÂ_qmèÀ ü/f-^€ú°€w69ˆ½^-G¦¾(KõBR£ZV@ÿ‰¤ñçË$`Ø•Nm1¬8)K; ðKŽG—Y[F¡=qæ%a ãÊvÁÕèl[}®œú ò¨]ƒkhŠí ©¨šrá¬ìQ¾´$kŒ $¼ïx¼Ì $ c^I¨{Úï «W‰w®"‡RÖ®¶‚Bm×ê…2.Î^UBó*½rMÈè᫈k0øOþ5õ‰AX Ž_»¯–ÓM[5N’o[Ås¿½»XËf@ 4ϱRïÿ)´6köž;7„9hCóJ7ñÁ÷¡ÔVÒ¡°¿VG±¸éƆÄ"<½p•Nd4 x“O4^ÞRì»éH°*ùio‰5ýH{sÄŽÕIüº8švÒ–AЃ&h"|Í£«eí†HÕíOû>¸« °Éiúl6'O¹þ& Œó”„­`Øä8…É‚l¿$f1} ¡¥Øã× v_«$“ÔòÅÞ›€±Õ‡ÕO–ÙÔ(ëAÀIVÇ"ÏI‰(é?0_Üme'Ïóãy‘‹Htµ$"š)zþïÌuf 7†«•Žlƒ{2xŒ+/y¨>Ñ3zí£l>Miâ/ñF®[¿í‡,¥Å÷­ûEŸW¯ÙN­µ÷ýËhÈe¤rU$—JKNþ›`?T”ŒM4Ð{7ifH]Û±áN„åóšs¿“óÅêu\lsñ±þ”½Þ¿|uè±gó³Áp÷.Cšîÿ+\nKÏ7ãJ$)6×W¶²ú±ÈeZ¿q25šåFúØ,«~åUJ®MÍ8'ß…á(6ÀäÁÊ™·Ö? '?šö˜•‹˜¼|í~k~ ±5Òo£]á`r1K#Ÿ,>Ì j§jå¼-í_ªJ›šâþ³Á=P{ÌÌŠÁ÷×®DÀ·ðM¿VlÓ8‹y‡Iߨ7Ç´QäÍšËp]¸\|íoL¿Ó¸c=óýXi••™Øv<(;5J›ÇzèdïÅ×T½Î±u§oV†OÀ¼8³f­MQ8?*"H•=”4%àDf!Þl"%¯ ¼¿c«µæê.ûŽkîE,PoûXöMÞZ¨•Ú,(ÒoÈÍÇËd€·ˆéG eP1Ž,Ð!'°”cÑü3¢¡ iÌ9íCÿñg¦U‹(Æ$¿•¿èýw;Ü4^å,zãwúW^K‹G6zj¥0YcfÙ=iÉ;(ðc¨d%~(ÿã{®w»â¼®P5àþ¾M—0d×ðÒ·š(ü²S ½B% ÐËœ$+!éBþ­sÁ,o8Š¡CsLhüÆyn?“=…™z4}nek«l7zȾIr¸ _¼LŽ›»l¹é<ï‡'Ùvu8©úϺ`(?fS¹¢öA“ˆœ¿ðio“úÛì2qwu¯WÑ¡i…± R«[yF\ ¤ðløoa&ÞŠ žm•T8:¹Po…IA©Â ‹°‘·jôöuk”Hc%X3þ¸ú »Èý×ô®m_ØŽF)†ã?´ÌAß½»‘¬Ñãê_ëÝø…ñð {ÙÜgäœ]ºý‰²å®Ú&r2æþÓWÑ«&¿ÉÙîŒÆQ êà(¸œ àÚè-t:fÁ”dSø«}‰0C±ásQI’±Ug!‰Bh;,cDû<…TR(òYÜ÷‰r•íïŲÉeçö˜_Øì ÕÔ¤KJßô‹køéSê˜b¸8ñOj~q$$ Iõa6Sÿ E—Ý—fp‡{ ^Jï×qÌaxÖ À!ÿ›ª³[Æ!1ÇèË"éå¿"R_âù$ó¹ (•BþìYØÃµ¤îF€_²Ñ%VÏ}ÍÎTRõ Ú¹ŸäN2®ˆ¬B¦+pK®à"E ¦¨ê4 ;aˆËõŽËsù¦![ÚHä(p1fk-&|sñ®-0h}nE"|HzNª&ÈÙWB›M©%]ïÊâ:Y@Xi°å³„¶ØR-;ƒZ¼QIåæ›Îó‡c²¼³K¯ ©ã ØúØô[˜ëyeý,ø(Ä’•¢ž7oð$xD-&úÜ ›HòYñÒ\ÿ3´žsGø*jk.€Ym &gVn,›3P’HFFx×x¼&fÝfd bi²®üQàž‚µAQ6Ü¢þJø¥Ýe'b¬rkràɅ§îÒôX¥‘íé#£m©› ðíŒØ~¿Rro,`©Ÿ(a—Q¶1« } ˆÃ6"9ÿ–zëËÉ“BÉzõäTà¢õC ~¾3¸GÀi•Z‚.ø&òV}Ã+ÿ#ùýo@ûžb\ΚÙ=¼ãã/8F³ÂH¿€Ó¨L¨ct‰F=nƒ5r]óñ¸û÷jw~ýÛ‚‡ KÃ*¸Q…XP­4A5ª›¬ KG­®÷`bÊŸ2*vªJ° ÊTj‹O^Í5vÅkÞàCÛ‹ûÍT‘¿Ê²£$>_s¸š)÷$"‚Ç±É ·—@;\)üFI;ãIŸ¼atÿs½ä}>rj3‘H•qÇyp”8(¥údlÑ5‘ #‘ýv–âÉÚÅ_tœ·M!ÓɪÐp1¼*r€úˆ¾­?gj»gÿ«g {wy£|xÉž —º¸×N<Y£»ý©g[ð±os#¾K"_Š–Z秊ֲ²er¯(ëC$¹!eáÈñ%È#› ab’2£›!ûnÔ‡ :F p¨ûô7!›XÒ«28oøù‰ƒ»CX^ÂÜ®3®Á€“l0x¥€šnáÇú8)L-LÁþ3¤Ý__¢Æ¾=?C¾¿‘ÅÎmg§<Ÿú]Á«p›²Â΂I¢¦ëòW1‡´A'®—˜Þ¦êÞ»vúë"‹3qQ#2*Üñ5;IìGEú©Tˆåî|ímŽ_¯±ëËÉ„£ Yy†=ßÞ°))›Ñ~ºêI˜Zoë2ŒMÒãš÷­÷æ¯Ç ‡´±Ço9|W[zÈéY˜Â;êy«.Jùï`‘ªø{ª~4¤>´§¤åùrÎÜ’¢VãïV¶Ì:œq%ñùÈw¬* àâŒtÐñyø»y§—<6·ªpÃYoC]s KÅX+yZ—v˵\L.Þƒìæµb˔½}Iù¹ÜhïIñÎ’£´œ'ØÂY5†c ÛN\À©Fì/¡ô‘Ì¡¹Zƒƒ1i^…‹PVc/;bãÄ®ÊéH·¾dz:a(íË€+¥Ðó %˜Yêt¦çÔ@÷ÔR±ú5 ¨ùËœ­Àâa·¿N… ÔfĨBšÄ5\dû#8Î<Û©©‰X#«¿ÃŸ^l/=404—` ™¡!á+á¹¶GsÿbÉŸ®þ@sWÝ.QÔ7ÕHM²Œ@w.nËu¬z·¡éñÝÕxp¶ÝCÙÄR?­r”¶ 9vvˆqg ÷S€JžŒÛc?„tžðZÙuž`Xén„îkH ÿÀ·©PÄ ‰^y#¶åíêAï Œu´_[Pðk¤ž"Fñðbk_*V,ý‰åDŽQ5d @<«wú¾g,¢a§ˆàŽÐðA~‡Q/1—÷BìSŽI¹`+txp ex•¯}Íû]3àÔQºl¦PŠ8˜¸ÀÍôà–à»¶ºšÄ¹„44¸2dñè×ðÿ~…A½v ‘÷¦ ±wÃ^õ"›YþAéñˆ¸Ûyœù:`\d*2Îd2w±ÿ1YZFÚ¾3œ'Æ Ävs†›c’L[j½F ,š[g Så™Ö¥×¬ûo(x’_£ÀûW¼æÑw‡©­<uæ@\~Pyi¡TÚl…¤MQò±j¸@ó™`žÑ¯ÂaÌ@ i•¹†Ìã„ôòm‚µ¹öß xÑz>à«^j7œ„âAzíÀM…ûîO­¤p«&–tjIšF>F;ðÁ¸ÌdåÁêÂ?™–Hø ¹6 þÔ9ƒšzE"ÀäÁ icÊâÅdš‘[Þ3´ÌróØÔÎv ØÁ¾„TFY!2‚ذ씕 Œ@ø”ÜO DìQB"Úá©DS¯uÀ¡ÈíÔØ`=°7ÒNÖ<î¼ÙOÙ+-·ý.¶t©RýêEâýÇ8ÜÃÿò…Þ•¹ôçð«+rWáž{õ³ŒŽÕN=”©d.rÊS¿O¬ýº2ÛDFP¸­-÷DÎfç‚%)¬øt;Üñ•%#;Üncñ¯2äo–`Ý]e´<Ï/þZ‘áŸÆhZPSÎ8Ì{O+–ÝœTUBfŠÀ¸Û³`Ê#žÑÔÐ.sØì®˜jÏW°+m—Þc™óø®ZîS2d£UžÍ <ÈQV^øÛ­Ž`µ l„åZuDå*ë¢óÕÑ’ÉúPï ô@9²ç >ÆLvœnSӚƄfkbr÷n&ãGÊãû‡aò”H¤»âuM3õ£ä9ºÌÚ_ߟ½›ß_}ÊYíB]¯žø·D^ݾaèSŸ kn{×´Q…ª•JŠ?P-Tо˜ ù¸þ½÷Ë=á„æÎXs2H¦Á…PL=Ÿ}gºà•Þ´0Ö{Ê®Óbƒ)j­á¨õ>­R¡«w¹3ß}te¾¡èeåÓpF"÷Øëí“ã·ÇƒÇœöâ¶¥Ùœ(”¤Œ£$$9<ærE¾u?ç-Ù¤†Zçd”zñ8èÝ/BÍ»0Šõì|D²‰‚²€°£Áb€_ÌÓd¿È±ŸcŒ¦~BÿÑ©o}0dÆx%"0½ ·¡Ž;úd úá]²¹eìõjˆ¾ ƒ®H̯\Pm?~R„x™VUz˜L˜iig×eõ3MTôŠ ü^àl~•k ›·)•¨ºþP÷Çœ“Rn³T Wµƒó?9”0Ö{ª©£ìYKû)cL®`Àl¨Ñ»þOŠ­‚ö:+g!T0§ãûf×5«Þøf;GßøÍT¤FÖè‹„V`“RпÀ]>0(sCêä¦ÕÆ}Ê@¡aGX†Ã0I"gÓTá´úû_\ ,„›ÅUÂó4>ˆ'yç=ËB‡8lÍè’î *ǨáPäÐÁL„_L³t™tÝ,ý8?åጳ¡a½Ñ¿BY^¿öYWV¼C5&iµñ¡†}Ü„Åñ€+ãAŸ£g©SéÌW+ÑǶҭ"-ݪEYê¶W(8×Ï¢¯æÃktó%©Zëéå°ŠŒw&!³™BøÒ1¤²Ò ³ãDzáhî.!(Zé6L@x¹Ëj5Ê¥æé–&¡•…)vÑm_  øªdM®@7Ãtîv¡É¿ž7i‹Ñ¼ó ?Ie©‚É£¬P¬¸âkð+ÑºËÆh¦‡Ä’ûB܇úl ¼¶°‡ùûãoXʧ›<`´ ÁK*†j%î_óÖS±¨tÖ™/àD 'Η۫¸,¹žø—•ÚjýH“æ Š‘_ŸÞ‘·K+ -ùŠøF6Úšêõ¢ÐÓ£ÊÐníP)¸zQ–@_’€Ê†Éb˜¾gª<œ®žî |*îA“ó#úÜ(ÞÆé†2›9.MëTÚ¬¦é‹sÆŠ5ç]z¼âé4\À>â%§hý+‹Hvß+ #>…úÀy“ùI·žŠÕÖ™ÔpÇBm ñhBÖyÚ{`¨05ŒÉßêt~XÕ^¾VSh NH œÌlâUŠŸ]Øæ¶ýF×ùã.ãPQÍ©hfCê¿óJ¡­ZÑ…Ýw-¬áÃ@—f»ü޽zæ‘J6²‹L]gÞ¢… ÷Ycð(¥›Á šÊÒð ³úô‹ ¡îq×2¤øõ|·ZJ0ŽÎζíó…Ý…­û†G ˜«ðмqQ;Ja¨P5~ @̼ª‹ÔçÛªKVRvi³•¦\7úhÞ”U_ò÷%"eìés^©þ¥aJËæ¬;âp'Ÿ¶È2ÏD±cqSòž'*KT?²GÛŽJšƒ ÔX›ß=‚DÓÅ4\Á¼ÉmHm# P—úÝO³œÜŸc¬„Š®³s­‚|Jú[Ö€P†ë.íþ"ƒµÑÈ’mR`o;ïÔ‚>mC´Uùsæ«ØÖ:KkPèS–ÇÒ‰Ò…dÉÌw‡ø´¶¿ÅJ•sIÆL#¸¬Î[©• "ðw°=ºô˜L:Š?Æõîõgte)5®Ëù#^e‰)›>f=V²d_/æ*6Z-…óÊ¥ü_Vîk@‚Z»½»$3(Æ$Âs(–íG/[íVÛ”Ðw¨…[³[]GA”]N nmàÔ°÷F÷])»žó·jY¡-eDº¤™R? Ö)aQDŸ¥·—IP“C72ëC‡;Vº´l¶Ë­þ+åúG®6leg;N'Â9o{‘Ç1ÏaËT¸N þ'‡gh¬$…–•QÖìY’–oQ:ø¡œƒÐ>’µD›Ë6§¨|Ø$…Ñ tnƒ1?é›}œë<âáóZOõwHŠç_båšd/Ì•¦Å S©áÈñËjÜWíj`̉ßj3//kú :†½és5ŸgîCtiwUí O%c´Nž'êñÀ6rŸ9ÐÜéÐÛ’> ÕB½e;J\…W5Ûä„‹«ÍÙ!pT¾&u㞌)×w˜m{ ×`ýîl«eéabÝo4®¦Œ= ö‰¨z¶W,ÅJ/oZY}bsb1’ù¿²^ðÓƒ¶ÐŠB´”v†b,L¾W31_^Ýíçì¼ÙÇÐîáT¹1ŽÍ¯Á?ù1‹¾‚²Î¥’·”îlÝ6·]nNãÄuŠbÔüøbüÆ ¯ï%«ùÐÊØñxЉa£Îú²î˲‘ñMûAŽ:ù~Túj>^«XøB4áîðþo_‹D’ ™¿²¸à< ùðZéjµ'hô߿רéÉ}wÚ¬A¨‰Øb%Lš‹:Ë:Ç6Ë£¹Ýl%‚œmü`•†ä=pr•…aQìÀ@¹í;@2¨} ß´å\Ð7tÕþí°êJCÒÜgµåÐ÷å‡Q¹ :ƒÏlËŸ8ž=lêEm…œ‡zÖ…ëÉï|aãQrž/ª,ö¢Uá;9 zxH“¿§\”,Ÿ!]>üÙè òXƒAã®ûz>~¥j ,nÀéIoÖ¢žƒš~…ral„Ù–¬.Õ6Ϙÿ¤<Óö¦}„l_êkd0ˆ=m’}b¦ø0ÝÿÚ$Ön<ÀÙ,»›úx/cŒ«ÄŠ\}3CRµ®s>gm:“ƒ’íù½@c'å(F =g{v@hŸí*Áؽeâ´Æ¿ÛãzT,ÏÖ–ñó`ˆ‹‹æ{‚jB„ýÿúÒ¯ëÿûÆ%^² 15ìf©C Ü¢¶ § ñË÷:B™›†i¥sî¢Ûºhä-ä]"[rÓÕ¡®ÝÖx²»³7^òÙvü¬$¤´Øk„¹>ÇGÙ! µ*íWF%•W{úeTÈT¬’åê¡j Ñ„ù@1ÒgvKìƒsÙfͲ ¤±ç§MPº––Ëù¾~h¿fòKÓ‰Øqªlk?¶4‚3Ýí< boÞi{½e&kjXãå"7™ zéNæFÃÎÿ^$®A K ™Ëº8ÝBž&£¹eòÀŒˆG‰“9 d‡s“õéa(rθÇ1*š²¥˜—ÔÞhƒ7ÃÿˆŸ™É\úǪ÷¶F©c±ÏZ›ýzXDŽgÒ Í”i¤°}À¼@ž8ò´5Xþ@üªVÆÚH†CÕY­üê!u…cmÁ,.P ‘£î´éÄ?Žø8[y’a ¡…½!¦ß^¨þÚ AßAV—Às«‰*½ÍÀ_—î’ïèªdàÓ¦7H8­¨d˜“cQî1댳ë±iJñPzU@ 0ˆÙ f‰ùš ³Gꉋñô³ØÊ®qÖ êõrÊsïÍùZ€ µÞG’OdB¡p#•sЄwй¤ÓCË^ïB÷c»/v³N §ü ÙìúÕ?{ÑšƒsÌ‹Í2¶œB­RܤçHܤ›êû¾ <ê–Evy$†o·ÅñĬ2IÈRó˜I¶€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/enc/0000775000175000017500000000000011742726711021351 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/enc/IsoLatin1.enc0000664000175000017500000003170011742726711023644 0ustar uwabamiuwabami% % t1lib-encodingfile % % This file is intended to be read by the function T1_LoadEncoding(), which is % part of t1lib. The syntactic format is really simple. The file contents is % scanned according to the following priciple: % % 1) There appears a "Encoding=[scheme]" at the beginning of a line. % % 2) Then exacly 256 lines of text must follow. These lines have to % start with a valid charactername, followed by at least one white % space character. The remaining of the line is ignored and may be % used for comments, e.g., for numbering of characters. % % 3) After these 256 lines all following data is ignored. % % Notice: This encoding contains what *I* believe is the ISOLatin1Encoding. % It differs slightly from what the PostScript interpreter believes. % Please note that there is no unique definition for the % charactername appearing at 45 (dec) in ISO 8859-1. % % (1999-11-16, RMz) % %-------------------------------------------------------------------------- Encoding=ISOLatin1Encoding /* The name of the encoding scheme */ .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ .notdef /* '003 003 "03 */ .notdef /* '004 004 "04 */ .notdef /* '005 005 "05 */ .notdef /* '006 006 "06 */ .notdef /* '007 007 "07 */ .notdef /* '010 008 "08 */ .notdef /* '011 009 "09 */ .notdef /* '012 010 "0A */ .notdef /* '013 011 "0B */ .notdef /* '014 012 "0C */ .notdef /* '015 013 "0D */ .notdef /* '016 014 "0E */ .notdef /* '017 015 "0F */ .notdef /* '020 016 "10 */ .notdef /* '021 017 "11 */ .notdef /* '022 018 "12 */ .notdef /* '023 019 "13 */ .notdef /* '024 020 "14 */ .notdef /* '025 021 "15 */ .notdef /* '026 022 "16 */ .notdef /* '027 023 "17 */ .notdef /* '030 024 "18 */ .notdef /* '031 025 "19 */ .notdef /* '032 026 "1A */ .notdef /* '033 027 "1B */ .notdef /* '034 028 "1C */ .notdef /* '035 029 "1D */ .notdef /* '036 030 "1E */ .notdef /* '037 031 "1F */ space /* '040 032 "20 */ exclam /* '041 033 "21 */ quotedbl /* '042 034 "22 */ numbersign /* '043 035 "23 */ dollar /* '044 036 "24 */ percent /* '045 037 "25 */ ampersand /* '046 038 "26 */ quoteright /* '047 039 "27 */ parenleft /* '050 040 "28 */ parenright /* '051 041 "29 */ asterisk /* '052 042 "2A */ plus /* '053 043 "2B */ comma /* '054 044 "2C */ hyphen /* '055 045 "2D */ period /* '056 046 "2E */ slash /* '057 047 "2F */ zero /* '060 048 "30 */ one /* '061 049 "31 */ two /* '062 050 "32 */ three /* '063 051 "33 */ four /* '064 052 "34 */ five /* '065 053 "35 */ six /* '066 054 "36 */ seven /* '067 055 "37 */ eight /* '070 056 "38 */ nine /* '071 057 "39 */ colon /* '072 058 "3A */ semicolon /* '073 059 "3B */ less /* '074 060 "3C */ equal /* '075 061 "3D */ greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ C /* '103 067 "43 */ D /* '104 068 "44 */ E /* '105 069 "45 */ F /* '106 070 "46 */ G /* '107 071 "47 */ H /* '110 072 "48 */ I /* '111 073 "49 */ J /* '112 074 "4A */ K /* '113 075 "4B */ L /* '114 076 "4C */ M /* '115 077 "4D */ N /* '116 078 "4E */ O /* '117 079 "4F */ P /* '120 080 "50 */ Q /* '121 081 "51 */ R /* '122 082 "52 */ S /* '123 083 "53 */ T /* '124 084 "54 */ U /* '125 085 "55 */ V /* '126 086 "56 */ W /* '127 087 "57 */ X /* '130 088 "58 */ Y /* '131 089 "59 */ Z /* '132 090 "5A */ bracketleft /* '133 091 "5B */ backslash /* '134 092 "5C */ bracketright /* '135 093 "5D */ asciicircum /* '136 094 "5E */ underscore /* '137 095 "5F */ grave /* '140 096 "60 */ a /* '141 097 "61 */ b /* '142 098 "62 */ c /* '143 099 "63 */ d /* '144 100 "64 */ e /* '145 101 "65 */ f /* '146 102 "66 */ g /* '147 103 "67 */ h /* '150 104 "68 */ i /* '151 105 "69 */ j /* '152 106 "6A */ k /* '153 107 "6B */ l /* '154 108 "6C */ m /* '155 109 "6D */ n /* '156 110 "6E */ o /* '157 111 "6F */ p /* '160 112 "70 */ q /* '161 113 "71 */ r /* '162 114 "72 */ s /* '163 115 "73 */ t /* '164 116 "74 */ u /* '165 117 "75 */ v /* '166 118 "76 */ w /* '167 119 "77 */ x /* '170 120 "78 */ y /* '171 121 "79 */ z /* '172 122 "7A */ braceleft /* '173 123 "7B */ bar /* '174 124 "7C */ braceright /* '175 125 "7D */ asciitilde /* '176 126 "7E */ .notdef /* '177 127 "7F */ .notdef /* '200 128 "80 */ .notdef /* '201 129 "81 */ .notdef /* '202 130 "82 */ .notdef /* '203 131 "83 */ .notdef /* '204 132 "84 */ .notdef /* '205 133 "85 */ .notdef /* '206 134 "86 */ .notdef /* '207 135 "87 */ .notdef /* '210 136 "88 */ .notdef /* '211 137 "89 */ .notdef /* '212 138 "8A */ .notdef /* '213 139 "8B */ .notdef /* '214 140 "8C */ .notdef /* '215 141 "8D */ .notdef /* '216 142 "8E */ .notdef /* '217 143 "8F */ dotlessi /* '220 144 "90 */ grave /* '221 145 "91 */ acute /* '222 146 "92 */ circumflex /* '223 147 "93 */ tilde /* '224 148 "94 */ macron /* '225 149 "95 */ breve /* '226 150 "96 */ dotaccent /* '227 151 "97 */ dieresis /* '230 152 "98 */ .notdef /* '231 153 "99 */ ring /* '232 154 "9A */ cedilla /* '233 155 "9B */ .notdef /* '234 156 "9C */ hungarumlaut /* '235 157 "9D */ ogonek /* '236 158 "9E */ caron /* '237 159 "9F */ space /* '240 160 "A0 */ exclamdown /* '241 161 "A1 */ cent /* '242 162 "A2 */ sterling /* '243 163 "A3 */ currency /* '244 164 "A4 */ yen /* '245 165 "A5 */ brokenbar /* '246 166 "A6 */ section /* '247 167 "A7 */ dieresis /* '250 168 "A8 */ copyright /* '251 169 "A9 */ ordfeminine /* '252 170 "AA */ guillemotleft /* '253 171 "AB */ logicalnot /* '254 172 "AC */ hyphen /* '255 173 "AD */ registered /* '256 174 "AE */ macron /* '257 175 "AF */ degree /* '260 176 "B0 */ plusminus /* '261 177 "B1 */ twosuperior /* '262 178 "B2 */ threesuperior /* '263 179 "B3 */ acute /* '264 180 "B4 */ mu /* '265 181 "B5 */ paragraph /* '266 182 "B6 */ periodcentered /* '267 183 "B7 */ cedilla /* '270 184 "B8 */ onesuperior /* '271 185 "B9 */ ordmasculine /* '272 186 "BA */ guillemotright /* '273 187 "BB */ onequarter /* '274 188 "BC */ onehalf /* '275 189 "BD */ threequarters /* '276 190 "BE */ questiondown /* '277 191 "BF */ Agrave /* '300 192 "C0 */ Aacute /* '301 193 "C1 */ Acircumflex /* '302 194 "C2 */ Atilde /* '303 195 "C3 */ Adieresis /* '304 196 "C4 */ Aring /* '305 197 "C5 */ AE /* '306 198 "C6 */ Ccedilla /* '307 199 "C7 */ Egrave /* '310 200 "C8 */ Eacute /* '311 201 "C9 */ Ecircumflex /* '312 202 "CA */ Edieresis /* '313 203 "CB */ Igrave /* '314 204 "CC */ Iacute /* '315 205 "CD */ Icircumflex /* '316 206 "CE */ Idieresis /* '317 207 "CF */ Eth /* '320 208 "D0 */ Ntilde /* '321 209 "D1 */ Ograve /* '322 210 "D2 */ Oacute /* '323 211 "D3 */ Ocircumflex /* '324 212 "D4 */ Otilde /* '325 213 "D5 */ Odieresis /* '326 214 "D6 */ multiply /* '327 215 "D7 */ Oslash /* '330 216 "D8 */ Ugrave /* '331 217 "D9 */ Uacute /* '332 218 "DA */ Ucircumflex /* '333 219 "DB */ Udieresis /* '334 220 "DC */ Yacute /* '335 221 "DD */ Thorn /* '336 222 "DE */ germandbls /* '337 223 "DF */ agrave /* '340 224 "E0 */ aacute /* '341 225 "E1 */ acircumflex /* '342 226 "E2 */ atilde /* '343 227 "E3 */ adieresis /* '344 228 "E4 */ aring /* '345 229 "E5 */ ae /* '346 230 "E6 */ ccedilla /* '347 231 "E7 */ egrave /* '350 232 "E8 */ eacute /* '351 233 "E9 */ ecircumflex /* '352 234 "EA */ edieresis /* '353 235 "EB */ igrave /* '354 236 "EC */ iacute /* '355 237 "ED */ icircumflex /* '356 238 "EE */ idieresis /* '357 239 "EF */ eth /* '360 240 "F0 */ ntilde /* '361 241 "F1 */ ograve /* '362 242 "F2 */ oacute /* '363 243 "F3 */ ocircumflex /* '364 244 "F4 */ otilde /* '365 245 "F5 */ odieresis /* '366 246 "F6 */ divide /* '367 247 "F7 */ oslash /* '370 248 "F8 */ ugrave /* '371 249 "F9 */ uacute /* '372 250 "FA */ ucircumflex /* '373 251 "FB */ udieresis /* '374 252 "FC */ yacute /* '375 253 "FD */ thorn /* '376 254 "FE */ ydieresis /* '377 255 "FF */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/enc/IsoLatin2.enc0000664000175000017500000000402111742726711023641 0ustar uwabamiuwabami-------------------------------------------------------------- I hope this is correct representation of ISO-8859-2 encoding, which is used in most Center European languages. Drop me a mail at , if you find a bug here. ---------------------------------------------------------- Encoding=ISOLatin2Encoding .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef space exclam quotedbl numbersign dollar percent ampersand quoteright parenleft parenright asterisk plus comma minus period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore quoteleft a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef dotlessi grave acute circumflex tilde .notdef breve .notdef .notdef .notdef ring .notdef .notdef hungarumlaut ogonek caron .notdef Aogonek breve Lslash currency Lcaron Sacute section dieresis Scaron Scedilla Tcaron Zacute hyphen Zcaron Zdotaccent degree aogonek ogonek lslash acute lcaron sacute circumflex cedilla scaron scedilla tcaron zacute hungarumlaut zcaron zdotaccent Racute Aacute Acircumflex Abreve Adieresis Lacute Cacute Ccedilla Ccaron Eacute Eogonek Edieresis Ecaron Iacute Icircumflex Dcaron Eth Nacute Ncaron Oacute Ocircumflex Ohungarumlaut Odieresis multiply Rcaron Uring Uacute Uhungarumlaut Udieresis Yacute Tcedilla germandbls racute aacute acircumflex abreve adieresis lacute cacute ccedilla ccaron eacute eogonek edieresis ecaron iacute icircumflex dcaron eth nacute ncaron oacute ocircumflex ohungarumlaut odieresis divide rcaron uring uacute uhungarumlaut udieresis yacute tcedilla dotaccent xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/enc/dc.enc0000664000175000017500000000650711742726711022436 0ustar uwabamiuwabami% This is an old version of the Cork encoding, with no value but historical. % % These are the ligs and kerns in addition to those found in the % AFM file. (The only ligs in the Times-Roman.afm file are the % fi and fl ligatures.) % % LIGKERN space l =: lslash ; space L =: Lslash ; % LIGKERN question quoteleft =: questiondown ; exclam quoteleft =: exclamdown ; % LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ; % LIGKERN quoteleft quoteleft =: quotedblleft ; % LIGKERN quoteright quoteright =: quotedblright ; % % We blow away kerns to and from spaces (TeX doesn't have a % space) and also remove any kerns from the numbers (although % the only kern pair that mentions a number in Times-Roman.afm % is one one.) % % LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ; % LIGKERN one {} * ; * {} one ; two {} * ; * {} two ; % LIGKERN three {} * ; * {} three ; four {} * ; * {} four ; % LIGKERN five {} * ; * {} five ; six {} * ; * {} six ; % LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ; % LIGKERN nine {} * ; * {} nine ; % LIGKERN comma comma =: quotedblbase ; less less =: guillemotleft ; % LIGKERN greater greater =: guillemotright ; % /DCEncoding[/test/test2 % now 256 chars follow % 0x00 /grave /acute /circumflex /tilde /dieresis /hungarumlaut %/ring /caron /breve /macron /dotaccent /cedilla /ogonek /quotesinglbase /guilsinglleft /guilsinglright % 0x10 /quotedblleft /quotedblright /quotedblbase /guillemotleft /guillemotright /endash /emdash /.notdef /zeroinferior /dotlessi /dotlessj /ff /fi /fl /ffi /ffl % 0x20 /.notdef /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash % 0x30 /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question % 0x40 /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O % 0x50 /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore % 0x60 /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o % 0x70 /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /hyphen % 0x80 /Abreve /Aogonek /Cacute /Ccaron /Dcaron /Ecaron /Eogonek /Gbreve /Lacute /Lcaron /Lslash /Nacute /Ncaron /Ng /Ohungarumlaut /Racute % 0x90 /Rcaron /Sacute /Scaron /Scedilla /Tcaron /Tcedilla /Uhungarumlaut /Uring /Ldot /Zacute /Zcaron /Zdotaccent /IJ /Idotaccent /dbar /section % 0xA0 /abreve /aogonek /cacute /ccaron /dcaron /ecaron /eogonek /gbreve /lacute /lcaron /lslash /nacute /ncaron /ng /ohungarumlaut /racute % 0xB0 /rcaron /sacute /scaron /scedilla /tcaron /tcedilla /uhungarumlaut /uring /ldot /zacute /zcaron /zdotaccent /ij /exclamdown /questiondown /sterling % 0xC0 /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis % 0xD0 /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /OE /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /SS % 0xE0 /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis % /igrave /iacute /icircumflex /idieresis % 0xF0 /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /oe /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/germandbls ] defxdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/enc/IsoLatin9.enc0000664000175000017500000000373211742726711023660 0ustar uwabamiuwabami Encoding=ISOLatin9Encoding .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef space exclam quotedbl numbersign dollar percent ampersand quoteright parenleft parenright asterisk plus comma minus period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore quoteleft a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef space exclamdown cent sterling Euro yen Scaron section scaron copyright ordfeminine guillemotleft logicalnot hyphen registered macron degree plusminus twosuperior threesuperior Zcaron mu paragraph bullet zcaron onesuperior ordmasculine guillemotright OE oe Ydieresis questiondown Agrave Aacute Acircumflex Atilde Adieresis Aring AE Ccedilla Egrave Eacute Ecircumflex Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde Ograve Oacute Ocircumflex Otilde Odieresis multiply Oslash Ugrave Uacute Ucircumflex Udieresis Yacute Thorn germandbls agrave aacute acircumflex atilde adieresis aring ae ccedilla egrave eacute ecircumflex edieresis igrave iacute icircumflex idieresis eth ntilde ograve oacute ocircumflex otilde odieresis divide oslash ugrave uacute ucircumflex udieresis yacute thorn ydieresis xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/enc/PSLatin1.enc0000664000175000017500000003150611742726711023440 0ustar uwabamiuwabami t1lib-encodingfile This file is intended to be read by the function T1_LoadEncoding(), which is part of t1lib. The syntactic format is really simple. The file contents is scanned according to the following priciple: 1) There appears a "Encoding=[scheme]" at the beginning of a line. 2) Then exacly 256 lines of text must follow. These lines have to start with a valid charactername, followed by at least one white space character. The remaining of the line is ignored and may be used for comments, e.g., for numbering of characters. 3) After these 256 lines all following data is ignored. Notice: This file contains ISOLatin1Encoding as defined in the PostScript language (Level 2 and above). It differs slightly from what is specified in ISO 8859-1. (1999-11-16, RMz) -------------------------------------------------------------------------- Encoding=PSLatin1Encoding /* The name of the encoding scheme */ .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ .notdef /* '003 003 "03 */ .notdef /* '004 004 "04 */ .notdef /* '005 005 "05 */ .notdef /* '006 006 "06 */ .notdef /* '007 007 "07 */ .notdef /* '010 008 "08 */ .notdef /* '011 009 "09 */ .notdef /* '012 010 "0A */ .notdef /* '013 011 "0B */ .notdef /* '014 012 "0C */ .notdef /* '015 013 "0D */ .notdef /* '016 014 "0E */ .notdef /* '017 015 "0F */ .notdef /* '020 016 "10 */ .notdef /* '021 017 "11 */ .notdef /* '022 018 "12 */ .notdef /* '023 019 "13 */ .notdef /* '024 020 "14 */ .notdef /* '025 021 "15 */ .notdef /* '026 022 "16 */ .notdef /* '027 023 "17 */ .notdef /* '030 024 "18 */ .notdef /* '031 025 "19 */ .notdef /* '032 026 "1A */ .notdef /* '033 027 "1B */ .notdef /* '034 028 "1C */ .notdef /* '035 029 "1D */ .notdef /* '036 030 "1E */ .notdef /* '037 031 "1F */ space /* '040 032 "20 */ exclam /* '041 033 "21 */ quotedbl /* '042 034 "22 */ numbersign /* '043 035 "23 */ dollar /* '044 036 "24 */ percent /* '045 037 "25 */ ampersand /* '046 038 "26 */ quoteright /* '047 039 "27 */ parenleft /* '050 040 "28 */ parenright /* '051 041 "29 */ asterisk /* '052 042 "2A */ plus /* '053 043 "2B */ comma /* '054 044 "2C */ minus /* '055 045 "2D */ period /* '056 046 "2E */ slash /* '057 047 "2F */ zero /* '060 048 "30 */ one /* '061 049 "31 */ two /* '062 050 "32 */ three /* '063 051 "33 */ four /* '064 052 "34 */ five /* '065 053 "35 */ six /* '066 054 "36 */ seven /* '067 055 "37 */ eight /* '070 056 "38 */ nine /* '071 057 "39 */ colon /* '072 058 "3A */ semicolon /* '073 059 "3B */ less /* '074 060 "3C */ equal /* '075 061 "3D */ greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ C /* '103 067 "43 */ D /* '104 068 "44 */ E /* '105 069 "45 */ F /* '106 070 "46 */ G /* '107 071 "47 */ H /* '110 072 "48 */ I /* '111 073 "49 */ J /* '112 074 "4A */ K /* '113 075 "4B */ L /* '114 076 "4C */ M /* '115 077 "4D */ N /* '116 078 "4E */ O /* '117 079 "4F */ P /* '120 080 "50 */ Q /* '121 081 "51 */ R /* '122 082 "52 */ S /* '123 083 "53 */ T /* '124 084 "54 */ U /* '125 085 "55 */ V /* '126 086 "56 */ W /* '127 087 "57 */ X /* '130 088 "58 */ Y /* '131 089 "59 */ Z /* '132 090 "5A */ bracketleft /* '133 091 "5B */ backslash /* '134 092 "5C */ bracketright /* '135 093 "5D */ asciicircum /* '136 094 "5E */ underscore /* '137 095 "5F */ quoteleft /* '140 096 "60 */ a /* '141 097 "61 */ b /* '142 098 "62 */ c /* '143 099 "63 */ d /* '144 100 "64 */ e /* '145 101 "65 */ f /* '146 102 "66 */ g /* '147 103 "67 */ h /* '150 104 "68 */ i /* '151 105 "69 */ j /* '152 106 "6A */ k /* '153 107 "6B */ l /* '154 108 "6C */ m /* '155 109 "6D */ n /* '156 110 "6E */ o /* '157 111 "6F */ p /* '160 112 "70 */ q /* '161 113 "71 */ r /* '162 114 "72 */ s /* '163 115 "73 */ t /* '164 116 "74 */ u /* '165 117 "75 */ v /* '166 118 "76 */ w /* '167 119 "77 */ x /* '170 120 "78 */ y /* '171 121 "79 */ z /* '172 122 "7A */ braceleft /* '173 123 "7B */ bar /* '174 124 "7C */ braceright /* '175 125 "7D */ asciitilde /* '176 126 "7E */ .notdef /* '177 127 "7F */ .notdef /* '200 128 "80 */ .notdef /* '201 129 "81 */ .notdef /* '202 130 "82 */ .notdef /* '203 131 "83 */ .notdef /* '204 132 "84 */ .notdef /* '205 133 "85 */ .notdef /* '206 134 "86 */ .notdef /* '207 135 "87 */ .notdef /* '210 136 "88 */ .notdef /* '211 137 "89 */ .notdef /* '212 138 "8A */ .notdef /* '213 139 "8B */ .notdef /* '214 140 "8C */ .notdef /* '215 141 "8D */ .notdef /* '216 142 "8E */ .notdef /* '217 143 "8F */ dotlessi /* '220 144 "90 */ grave /* '221 145 "91 */ acute /* '222 146 "92 */ circumflex /* '223 147 "93 */ tilde /* '224 148 "94 */ macron /* '225 149 "95 */ breve /* '226 150 "96 */ dotaccent /* '227 151 "97 */ dieresis /* '230 152 "98 */ .notdef /* '231 153 "99 */ ring /* '232 154 "9A */ cedilla /* '233 155 "9B */ .notdef /* '234 156 "9C */ hungarumlaut /* '235 157 "9D */ ogonek /* '236 158 "9E */ caron /* '237 159 "9F */ space /* '240 160 "A0 */ exclamdown /* '241 161 "A1 */ cent /* '242 162 "A2 */ sterling /* '243 163 "A3 */ currency /* '244 164 "A4 */ yen /* '245 165 "A5 */ brokenbar /* '246 166 "A6 */ section /* '247 167 "A7 */ dieresis /* '250 168 "A8 */ copyright /* '251 169 "A9 */ ordfeminine /* '252 170 "AA */ guillemotleft /* '253 171 "AB */ logicalnot /* '254 172 "AC */ hyphen /* '255 173 "AD */ registered /* '256 174 "AE */ macron /* '257 175 "AF */ degree /* '260 176 "B0 */ plusminus /* '261 177 "B1 */ twosuperior /* '262 178 "B2 */ threesuperior /* '263 179 "B3 */ acute /* '264 180 "B4 */ mu /* '265 181 "B5 */ paragraph /* '266 182 "B6 */ periodcentered /* '267 183 "B7 */ cedilla /* '270 184 "B8 */ onesuperior /* '271 185 "B9 */ ordmasculine /* '272 186 "BA */ guillemotright /* '273 187 "BB */ onequarter /* '274 188 "BC */ onehalf /* '275 189 "BD */ threequarters /* '276 190 "BE */ questiondown /* '277 191 "BF */ Agrave /* '300 192 "C0 */ Aacute /* '301 193 "C1 */ Acircumflex /* '302 194 "C2 */ Atilde /* '303 195 "C3 */ Adieresis /* '304 196 "C4 */ Aring /* '305 197 "C5 */ AE /* '306 198 "C6 */ Ccedilla /* '307 199 "C7 */ Egrave /* '310 200 "C8 */ Eacute /* '311 201 "C9 */ Ecircumflex /* '312 202 "CA */ Edieresis /* '313 203 "CB */ Igrave /* '314 204 "CC */ Iacute /* '315 205 "CD */ Icircumflex /* '316 206 "CE */ Idieresis /* '317 207 "CF */ Eth /* '320 208 "D0 */ Ntilde /* '321 209 "D1 */ Ograve /* '322 210 "D2 */ Oacute /* '323 211 "D3 */ Ocircumflex /* '324 212 "D4 */ Otilde /* '325 213 "D5 */ Odieresis /* '326 214 "D6 */ multiply /* '327 215 "D7 */ Oslash /* '330 216 "D8 */ Ugrave /* '331 217 "D9 */ Uacute /* '332 218 "DA */ Ucircumflex /* '333 219 "DB */ Udieresis /* '334 220 "DC */ Yacute /* '335 221 "DD */ Thorn /* '336 222 "DE */ germandbls /* '337 223 "DF */ agrave /* '340 224 "E0 */ aacute /* '341 225 "E1 */ acircumflex /* '342 226 "E2 */ atilde /* '343 227 "E3 */ adieresis /* '344 228 "E4 */ aring /* '345 229 "E5 */ ae /* '346 230 "E6 */ ccedilla /* '347 231 "E7 */ egrave /* '350 232 "E8 */ eacute /* '351 233 "E9 */ ecircumflex /* '352 234 "EA */ edieresis /* '353 235 "EB */ igrave /* '354 236 "EC */ iacute /* '355 237 "ED */ icircumflex /* '356 238 "EE */ idieresis /* '357 239 "EF */ eth /* '360 240 "F0 */ ntilde /* '361 241 "F1 */ ograve /* '362 242 "F2 */ oacute /* '363 243 "F3 */ ocircumflex /* '364 244 "F4 */ otilde /* '365 245 "F5 */ odieresis /* '366 246 "F6 */ divide /* '367 247 "F7 */ oslash /* '370 248 "F8 */ ugrave /* '371 249 "F9 */ uacute /* '372 250 "FA */ ucircumflex /* '373 251 "FB */ udieresis /* '374 252 "FC */ yacute /* '375 253 "FD */ thorn /* '376 254 "FE */ ydieresis /* '377 255 "FF */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/enc/dvips.enc0000664000175000017500000000720311742726711023167 0ustar uwabamiuwabami% @@psencodingfile@{ % author = "T. Rokicki, K. Berry", % version = "2.0", % date = "22 June 1996", % filename = "dvips.enc", % email = "kb@@mail.tug.org", % address = "135 Center Hill Rd. // Plymouth, MA 02360", % codetable = "ISO/ASCII", % checksum = "75 515 3715", % docstring = "An encoding for PostScript fonts to be used with TeX." % @} % % This is almost the default encoding produced by the afm2tfm program % that comes with the dvips distribution, when it is applied to a % StandardEncoding PostScript font. The positions of the accented % characters (which afm2tfm assigned more or less randomly in the % previous set of fonts) have been held fixed. % % It is almost upward-compatible with TeX text. (The primary exceptions % are dotaccent and hungarumlaut.) Some of the ligatures are also in % different positions, but this is not important, since ligature % positions are defined in the TFM file, not by macros. % % The character positions were assigned in this order: % 1) non-composite characters in the afm2tfm encoding (except dotlessj % was included in its plain TeX position); % 2) available characters in the Cork (EC) encoding; % 3) remaining composite characters in the base encoding (starting at % position 130 decimal). We don't include all the other base % characters because that changes the height/depth/width tables in % the TFM files (because more characters mean more distinct values). % % We leave the initial positions open for the Greek letters in Times-Roman. % /DvipsEncoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /circumflex /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /tilde /dieresis /asciicircum /asciitilde /Ccedilla /Iacute /Icircumflex /atilde /edieresis /egrave /scaron /zcaron /Eth /ff /ffi /ffl /.notdef /.notdef /.notdef /.notdef /Scaron /.notdef /.notdef /.notdef /.notdef /.notdef /Ydieresis /.notdef /Zcaron /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /cent /sterling /fraction /yen /florin /section /currency /copyright /quotedblleft /guillemotleft /guilsinglleft /guilsinglright /fi /fl /degree /endash /dagger /daggerdbl /periodcentered /.notdef /paragraph /bullet /quotesinglbase /quotedblbase /quotedblright /guillemotright /ellipsis /perthousand /.notdef /.notdef /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /.notdef /dotaccent /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /hungarumlaut /ogonek /Idieresis /emdash /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /.notdef /.notdef /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /.notdef /agrave /aacute /acircumflex /ordfeminine /adieresis /aring /.notdef /ccedilla /Lslash /eacute /ecircumflex /ordmasculine /igrave /iacute /icircumflex /idieresis /.notdef /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /.notdef /lslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/afm/0000775000175000017500000000000011742726711021347 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/afm/dcr10.afm0000664000175000017500000005321011742726711022746 0ustar uwabamiuwabamiStartFontMetrics 2.0 FontName dcr10 FullName dcr10 FamilyName dcr10 Weight Medium ItalicAngle 0.000000 IsFixedPitch false UnderlinePosition -133 UnderlineThickness 20 Version 1.0\(Level-B\) FontBBox -55, -250, 1054, 913 Notice Copyright \(C\) 1994, Basil K. Malyshev. All Rights Reserved.\nBaKoMa Fonts Collection, Level-B. EncodingScheme FontSpecific CapHeight 683 XHeight 430 Descender -194 Ascender 694 StartCharMetrics 256 C 0 ; WX 499.89 ; N grave ; B 107 508 294 698 ; C 1 ; WX 499.89 ; N acute ; B 205 508 392 698 ; C 2 ; WX 499.89 ; N circumflex ; B 115 537 384 694 ; C 3 ; WX 499.89 ; N tilde ; B 83 572 416 668 ; C 4 ; WX 499.89 ; N dieresis ; B 101 565 398 669 ; C 5 ; WX 499.89 ; N hungarumlaut ; B 126 511 420 699 ; C 6 ; WX 749.83 ; N ring ; B 263 540 458 716 ; C 7 ; WX 499.89 ; N caron ; B 117 515 382 640 ; C 8 ; WX 499.89 ; N breve ; B 98 519 401 694 ; C 9 ; WX 499.89 ; N macron ; B 69 555 430 590 ; C 10 ; WX 277.72 ; N dotaccent ; B 84 559 194 669 ; C 11 ; WX 444.33 ; N cedilla ; B 129 -205 369 -22 ; C 12 ; WX 277.72 ; N ogonek ; B 9 -194 226 20 ; C 13 ; WX 277.72 ; N quotesinglbase ; B 112 -194 233 110 ; C 14 ; WX 444.33 ; N guilsinglleft ; B 94 26 330 457 ; C 15 ; WX 444.33 ; N guilsinglright ; B 94 26 360 457 ; C 16 ; WX 499.89 ; N quotedblleft ; B 148 390 466 694 ; C 17 ; WX 499.89 ; N quotedblright ; B 33 390 351 694 ; C 18 ; WX 499.89 ; N quotedblbase ; B 138 -194 456 110 ; C 19 ; WX 666.5 ; N guillemotleft ; B 94 26 553 457 ; C 20 ; WX 666.5 ; N guillemotright ; B 94 26 583 457 ; C 21 ; WX 499.89 ; N endash ; B 0 253 499 279 ; L hyphen emdash ; C 22 ; WX 999.78 ; N emdash ; B 0 253 999 279 ; C 23 ; WX 0 ; N compoundwordmark ; B 0 0 0 0 ; C 24 ; WX 388.78 ; N perthousand ; B 55 -56 333 347 ; C 25 ; WX 277.72 ; N dotlessi ; B 25 0 243 441 ; C 26 ; WX 305.5 ; N dotlessj ; B -55 -205 201 441 ; C 27 ; WX 583.17 ; N ff ; B 26 0 632 705 ; L i ffi ; L l ffl ; C 28 ; WX 555.44 ; N fi ; B 26 0 528 705 ; C 29 ; WX 555.44 ; N fl ; B 26 0 528 705 ; C 30 ; WX 833.11 ; N ffi ; B 26 0 807 705 ; C 31 ; WX 833.11 ; N ffl ; B 26 0 807 705 ; C 32 ; WX 499.89 ; N visiblespace ; B 42 -107 457 252 ; C 33 ; WX 277.72 ; N exclam ; B 84 0 194 716 ; C 34 ; WX 499.89 ; N quotedbl ; B 117 349 383 711 ; C 35 ; WX 833.11 ; N numbersign ; B 56 -194 776 694 ; C 36 ; WX 499.89 ; N dollar ; B 57 -56 444 750 ; C 37 ; WX 833.11 ; N percent ; B 56 -56 776 750 ; C 38 ; WX 777.61 ; N ampersand ; B 42 -22 727 716 ; C 39 ; WX 277.72 ; N quoteright ; B 84 390 208 694 ; L quoteright quotedblright ; C 40 ; WX 388.78 ; N parenleft ; B 97 -250 332 750 ; C 41 ; WX 388.78 ; N parenright ; B 56 -250 291 750 ; C 42 ; WX 499.89 ; N asterisk ; B 65 320 434 750 ; C 43 ; WX 777.61 ; N plus ; B 56 -83 721 583 ; C 44 ; WX 277.72 ; N comma ; B 84 -194 205 110 ; L comma quotedblbase ; C 45 ; WX 333.28 ; N hyphen ; B 11 184 276 246 ; L hyphen endash ; C 46 ; WX 277.72 ; N period ; B 84 0 194 110 ; C 47 ; WX 499.89 ; N slash ; B 56 -250 443 750 ; C 48 ; WX 499.89 ; N zero ; B 39 -22 460 666 ; C 49 ; WX 499.89 ; N one ; B 87 0 421 666 ; C 50 ; WX 499.89 ; N two ; B 50 0 449 666 ; C 51 ; WX 499.89 ; N three ; B 42 -22 457 666 ; C 52 ; WX 499.89 ; N four ; B 28 0 471 677 ; C 53 ; WX 499.89 ; N five ; B 50 -22 449 666 ; C 54 ; WX 499.89 ; N six ; B 42 -22 457 666 ; C 55 ; WX 499.89 ; N seven ; B 56 -22 485 676 ; C 56 ; WX 499.89 ; N eight ; B 42 -22 457 666 ; C 57 ; WX 499.89 ; N nine ; B 42 -22 457 666 ; C 58 ; WX 277.72 ; N colon ; B 84 0 194 430 ; C 59 ; WX 277.72 ; N semicolon ; B 84 -194 197 430 ; C 60 ; WX 777.61 ; N less ; B 83 -33 694 533 ; L less guillemotleft ; C 61 ; WX 777.61 ; N equal ; B 56 140 721 360 ; C 62 ; WX 777.61 ; N greater ; B 83 -33 694 533 ; L greater guillemotright ; C 63 ; WX 472.11 ; N question ; B 56 0 415 705 ; C 64 ; WX 777.61 ; N at ; B 56 -11 721 705 ; C 65 ; WX 749.83 ; N A ; B 18 0 703 716 ; C 66 ; WX 708.17 ; N B ; B 20 0 637 683 ; C 67 ; WX 722 ; N C ; B 56 -22 665 705 ; C 68 ; WX 763.72 ; N D ; B 19 0 693 683 ; C 69 ; WX 680.39 ; N E ; B 17 0 637 680 ; C 70 ; WX 652.61 ; N F ; B 17 0 596 680 ; C 71 ; WX 784.56 ; N G ; B 56 -22 735 705 ; C 72 ; WX 749.83 ; N H ; B 17 0 704 683 ; C 73 ; WX 361 ; N I ; B 12 0 321 683 ; C 74 ; WX 513.78 ; N J ; B 37 -22 465 683 ; C 75 ; WX 777.61 ; N K ; B 17 0 722 683 ; C 76 ; WX 624.83 ; N L ; B 17 0 568 683 ; C 77 ; WX 916.44 ; N M ; B 21 0 866 683 ; C 78 ; WX 749.83 ; N N ; B 17 0 704 683 ; C 79 ; WX 777.61 ; N O ; B 56 -22 721 705 ; C 80 ; WX 680.39 ; N P ; B 19 0 609 683 ; C 81 ; WX 777.61 ; N Q ; B 56 -194 727 705 ; C 82 ; WX 735.94 ; N R ; B 19 -22 718 683 ; C 83 ; WX 555.44 ; N S ; B 56 -22 498 705 ; C 84 ; WX 722 ; N T ; B 37 0 686 677 ; C 85 ; WX 749.83 ; N U ; B 17 -22 704 683 ; C 86 ; WX 749.83 ; N V ; B 5 -22 716 683 ; C 87 ; WX 1027.56 ; N W ; B 4 -22 995 683 ; C 88 ; WX 749.83 ; N X ; B 9 0 712 683 ; C 89 ; WX 749.83 ; N Y ; B -3 0 724 683 ; C 90 ; WX 611 ; N Z ; B 56 0 560 683 ; C 91 ; WX 277.72 ; N bracketleft ; B 103 -250 255 750 ; C 92 ; WX 499.89 ; N backslash ; B 56 -250 443 750 ; C 93 ; WX 277.72 ; N bracketright ; B 22 -250 174 750 ; C 94 ; WX 611 ; N asciicircum ; B 117 461 493 628 ; C 95 ; WX 777.61 ; N underscore ; B 83 -233 694 -193 ; C 96 ; WX 277.72 ; N quoteleft ; B 70 390 194 694 ; L quoteleft quotedblleft ; C 97 ; WX 499.89 ; N a ; B 40 -11 493 447 ; C 98 ; WX 555.44 ; N b ; B 26 -11 521 694 ; C 99 ; WX 444.33 ; N c ; B 33 -11 415 447 ; C 100 ; WX 555.44 ; N d ; B 33 -11 528 694 ; C 101 ; WX 444.33 ; N e ; B 28 -11 415 447 ; C 102 ; WX 305.5 ; N f ; B 26 0 354 705 ; L i fi ; L f ff ; L l fl ; C 103 ; WX 499.89 ; N g ; B 28 -206 485 452 ; C 104 ; WX 555.44 ; N h ; B 24 0 530 694 ; C 105 ; WX 277.72 ; N i ; B 25 0 243 669 ; C 106 ; WX 305.5 ; N j ; B -55 -205 201 669 ; C 107 ; WX 527.67 ; N k ; B 26 0 511 694 ; C 108 ; WX 277.72 ; N l ; B 25 0 251 694 ; C 109 ; WX 833.11 ; N m ; B 24 0 810 441 ; C 110 ; WX 555.44 ; N n ; B 24 0 530 441 ; C 111 ; WX 499.89 ; N o ; B 28 -11 471 447 ; C 112 ; WX 555.44 ; N p ; B 26 -194 521 441 ; C 113 ; WX 527.67 ; N q ; B 33 -194 529 441 ; C 114 ; WX 391.56 ; N r ; B 26 0 364 441 ; C 115 ; WX 394.33 ; N s ; B 33 -11 360 447 ; C 116 ; WX 388.78 ; N t ; B 19 -11 332 615 ; C 117 ; WX 555.44 ; N u ; B 24 -11 530 441 ; C 118 ; WX 527.67 ; N v ; B 19 -11 508 430 ; C 119 ; WX 722 ; N w ; B 18 -11 703 430 ; C 120 ; WX 527.67 ; N x ; B 12 0 516 430 ; C 121 ; WX 527.67 ; N y ; B 19 -205 508 430 ; C 122 ; WX 444.33 ; N z ; B 28 0 401 430 ; C 123 ; WX 499.89 ; N braceleft ; B 70 -250 429 750 ; C 124 ; WX 277.72 ; N bar ; B 119 -250 159 750 ; C 125 ; WX 499.89 ; N braceright ; B 70 -250 429 750 ; C 126 ; WX 611 ; N asciitilde ; B 83 572 527 668 ; C 127 ; WX 333.28 ; N hyphen ; B 11 184 276 246 ; C 128 ; WX 749.83 ; N Abreve ; B 18 0 703 891 ; C 129 ; WX 749.83 ; N Aogonek ; B 18 -188 740 716 ; C 130 ; WX 722 ; N Cacute ; B 56 -22 665 895 ; C 131 ; WX 722 ; N Ccaron ; B 56 -22 665 856 ; C 132 ; WX 763.72 ; N Dcaron ; B 19 0 693 856 ; C 133 ; WX 680.39 ; N Ecaron ; B 17 0 637 856 ; C 134 ; WX 680.39 ; N Eogonek ; B 17 -188 637 680 ; C 135 ; WX 784.56 ; N Gbreve ; B 56 -22 735 891 ; C 136 ; WX 624.83 ; N Lacute ; B 17 0 568 895 ; C 137 ; WX 624.83 ; N Lquoteright ; B 17 0 568 683 ; C 138 ; WX 624.83 ; N Lslash ; B 17 0 568 683 ; C 139 ; WX 749.83 ; N Nacute ; B 17 0 704 895 ; C 140 ; WX 749.83 ; N Ncaron ; B 17 0 704 856 ; C 141 ; WX 727.61 ; N Eng ; B 24 -22 676 694 ; C 142 ; WX 777.61 ; N Ohungarumlaut ; B 56 -22 721 895 ; C 143 ; WX 735.94 ; N Racute ; B 19 -22 718 895 ; C 144 ; WX 735.94 ; N Rcaron ; B 19 -22 718 856 ; C 145 ; WX 555.44 ; N Sacute ; B 56 -22 498 895 ; C 146 ; WX 555.44 ; N Scaron ; B 56 -22 498 856 ; C 147 ; WX 555.44 ; N Scedilla ; B 56 -205 498 705 ; C 148 ; WX 722 ; N Tcaron ; B 37 0 686 856 ; C 149 ; WX 722 ; N Tcedilla ; B 37 -205 686 677 ; C 150 ; WX 749.83 ; N Uhungarumlaut ; B 17 -22 704 895 ; C 151 ; WX 749.83 ; N Uring ; B 17 -22 704 913 ; C 152 ; WX 749.83 ; N Ydieresis ; B -3 0 724 839 ; C 153 ; WX 611 ; N Zacute ; B 56 0 560 895 ; C 154 ; WX 611 ; N Zcaron ; B 56 0 560 856 ; C 155 ; WX 611 ; N Zdotaccent ; B 56 0 560 891 ; C 156 ; WX 860.89 ; N IJ ; B 12 -22 798 683 ; C 157 ; WX 361 ; N Idotaccent ; B 12 0 321 877 ; C 158 ; WX 555.44 ; N dbar ; B 33 -11 528 694 ; C 159 ; WX 444.33 ; N section ; B 69 -205 374 705 ; C 160 ; WX 499.89 ; N abreve ; B 40 -11 493 694 ; C 161 ; WX 499.89 ; N aogonek ; B 40 -194 493 447 ; C 162 ; WX 444.33 ; N cacute ; B 33 -11 415 643 ; C 163 ; WX 444.33 ; N ccaron ; B 33 -11 415 604 ; C 164 ; WX 674.83 ; N dquoteright ; B 33 -11 665 694 ; C 165 ; WX 444.33 ; N ecaron ; B 28 -11 415 604 ; C 166 ; WX 444.33 ; N eogonek ; B 28 -194 415 447 ; C 167 ; WX 499.89 ; N gbreve ; B 28 -206 485 694 ; C 168 ; WX 277.72 ; N lacute ; B 25 0 282 907 ; C 169 ; WX 402.67 ; N lquoteright ; B 25 0 386 694 ; C 170 ; WX 277.72 ; N lslash ; B 18 0 258 694 ; C 171 ; WX 555.44 ; N nacute ; B 24 0 530 643 ; C 172 ; WX 555.44 ; N ncaron ; B 24 0 530 604 ; C 173 ; WX 555.44 ; N eng ; B 24 -205 452 441 ; C 174 ; WX 499.89 ; N ohungarumlaut ; B 28 -11 521 643 ; C 175 ; WX 391.56 ; N racute ; B 26 0 364 643 ; C 176 ; WX 391.56 ; N rcaron ; B 26 0 364 604 ; C 177 ; WX 394.33 ; N sacute ; B 33 -11 360 643 ; C 178 ; WX 394.33 ; N scaron ; B 33 -11 360 604 ; C 179 ; WX 394.33 ; N scedilla ; B 33 -205 360 447 ; C 180 ; WX 411 ; N tquoteright ; B 19 -11 401 704 ; C 181 ; WX 388.78 ; N tcedilla ; B 19 -205 359 615 ; C 182 ; WX 555.44 ; N uhungarumlaut ; B 24 -11 549 643 ; C 183 ; WX 555.44 ; N uring ; B 24 -11 530 661 ; C 184 ; WX 527.67 ; N ydieresis ; B 19 -205 508 586 ; C 185 ; WX 444.33 ; N zacute ; B 28 0 401 643 ; C 186 ; WX 444.33 ; N zcaron ; B 28 0 401 604 ; C 187 ; WX 444.33 ; N zdotaccent ; B 28 0 402 669 ; C 188 ; WX 583.17 ; N ij ; B 33 -205 485 669 ; C 189 ; WX 277.72 ; N exclamdown ; B 84 -216 194 500 ; C 190 ; WX 472.11 ; N questiondown ; B 56 -205 415 500 ; C 191 ; WX 638.72 ; N sterling ; B 56 -11 620 709 ; C 192 ; WX 749.83 ; N Agrave ; B 18 0 703 895 ; C 193 ; WX 749.83 ; N Aacute ; B 18 0 703 895 ; C 194 ; WX 749.83 ; N Acircumflex ; B 18 0 703 891 ; C 195 ; WX 749.83 ; N Atilde ; B 18 0 703 891 ; C 196 ; WX 749.83 ; N Adieresis ; B 18 0 703 839 ; C 197 ; WX 749.83 ; N Aring ; B 18 0 703 872 ; C 198 ; WX 902.56 ; N AE ; B 18 0 860 683 ; C 199 ; WX 722 ; N Ccedilla ; B 56 -205 665 705 ; C 200 ; WX 680.39 ; N Egrave ; B 17 0 637 895 ; C 201 ; WX 680.39 ; N Eacute ; B 17 0 637 895 ; C 202 ; WX 680.39 ; N Ecircumflex ; B 17 0 637 891 ; C 203 ; WX 680.39 ; N Edieresis ; B 17 0 637 839 ; C 204 ; WX 361 ; N Igrave ; B 12 0 321 895 ; C 205 ; WX 361 ; N Iacute ; B 12 0 321 895 ; C 206 ; WX 361 ; N Icircumflex ; B 12 0 321 891 ; C 207 ; WX 361 ; N Idieresis ; B 12 0 321 839 ; C 208 ; WX 763.72 ; N Eth ; B 19 0 693 683 ; C 209 ; WX 749.83 ; N Ntilde ; B 17 0 704 891 ; C 210 ; WX 777.61 ; N Ograve ; B 56 -22 721 895 ; C 211 ; WX 777.61 ; N Oacute ; B 56 -22 721 895 ; C 212 ; WX 777.61 ; N Ocircumflex ; B 56 -22 721 891 ; C 213 ; WX 777.61 ; N Otilde ; B 56 -22 721 891 ; C 214 ; WX 777.61 ; N Odieresis ; B 56 -22 721 839 ; C 215 ; WX 1013.67 ; N OE ; B 56 -22 971 705 ; C 216 ; WX 777.61 ; N Oslash ; B 56 -57 721 740 ; C 217 ; WX 749.83 ; N Ugrave ; B 17 -22 704 895 ; C 218 ; WX 749.83 ; N Uacute ; B 17 -22 704 895 ; C 219 ; WX 749.83 ; N Ucircumflex ; B 17 -22 704 891 ; C 220 ; WX 749.83 ; N Udieresis ; B 17 -22 704 839 ; C 221 ; WX 749.83 ; N Yacute ; B -3 0 724 895 ; C 222 ; WX 624.83 ; N Thorn ; B 20 0 554 683 ; C 223 ; WX 1110.83 ; N Germandbls ; B 56 -22 1054 705 ; C 224 ; WX 499.89 ; N agrave ; B 40 -11 493 643 ; C 225 ; WX 499.89 ; N aacute ; B 40 -11 493 643 ; C 226 ; WX 499.89 ; N acircumflex ; B 40 -11 493 639 ; C 227 ; WX 499.89 ; N atilde ; B 40 -11 493 669 ; C 228 ; WX 499.89 ; N adieresis ; B 40 -11 493 586 ; C 229 ; WX 499.89 ; N aring ; B 40 -11 493 661 ; C 230 ; WX 722 ; N ae ; B 43 -11 693 447 ; C 231 ; WX 444.33 ; N ccedilla ; B 33 -205 415 447 ; C 232 ; WX 444.33 ; N egrave ; B 28 -11 415 643 ; C 233 ; WX 444.33 ; N eacute ; B 28 -11 415 643 ; C 234 ; WX 444.33 ; N ecircumflex ; B 28 -11 415 639 ; C 235 ; WX 444.33 ; N edieresis ; B 28 -11 415 586 ; C 236 ; WX 277.72 ; N igrave ; B -6 0 243 643 ; C 237 ; WX 277.72 ; N iacute ; B 25 0 282 643 ; C 238 ; WX 277.72 ; N icircumflex ; B 3 0 274 639 ; C 239 ; WX 333.28 ; N idieresis ; B -9 0 289 586 ; C 240 ; WX 499.89 ; N eth ; B 28 -11 471 694 ; C 241 ; WX 555.44 ; N ntilde ; B 24 0 530 669 ; C 242 ; WX 499.89 ; N ograve ; B 28 -11 471 643 ; C 243 ; WX 499.89 ; N oacute ; B 28 -11 471 643 ; C 244 ; WX 499.89 ; N ocircumflex ; B 28 -11 471 639 ; C 245 ; WX 499.89 ; N otilde ; B 28 -11 471 669 ; C 246 ; WX 499.89 ; N odieresis ; B 28 -11 471 586 ; C 247 ; WX 777.61 ; N oe ; B 28 -11 749 447 ; C 248 ; WX 499.89 ; N oslash ; B 33 -103 466 534 ; C 249 ; WX 555.44 ; N ugrave ; B 24 -11 530 643 ; C 250 ; WX 555.44 ; N uacute ; B 24 -11 530 643 ; C 251 ; WX 555.44 ; N ucircumflex ; B 24 -11 530 639 ; C 252 ; WX 555.44 ; N udieresis ; B 24 -11 530 586 ; C 253 ; WX 527.67 ; N yacute ; B 19 -205 508 643 ; C 254 ; WX 555.44 ; N thorn ; B 25 -205 521 694 ; C 255 ; WX 499.89 ; N germandbls ; B 26 -11 471 705 ; EndCharMetrics StartKernData StartKernPairs 471 KPX A C -27.77 KPX A G -27.77 KPX A O -27.77 KPX A Q -27.77 KPX A T -83.31 KPX A U -27.77 KPX A V -111.08 KPX A W -111.08 KPX A Y -83.31 KPX A t -27.77 KPX Aacute C -27.77 KPX Aacute G -27.77 KPX Aacute O -27.77 KPX Aacute Q -27.77 KPX Aacute T -83.31 KPX Aacute U -27.77 KPX Aacute V -111.08 KPX Aacute W -111.08 KPX Aacute Y -83.31 KPX Aacute t -27.77 KPX Abreve C -27.77 KPX Abreve G -27.77 KPX Abreve O -27.77 KPX Abreve Q -27.77 KPX Abreve T -83.31 KPX Abreve U -27.77 KPX Abreve V -111.08 KPX Abreve W -111.08 KPX Abreve Y -83.31 KPX Abreve t -27.77 KPX Acircumflex C -27.77 KPX Acircumflex G -27.77 KPX Acircumflex O -27.77 KPX Acircumflex Q -27.77 KPX Acircumflex T -83.31 KPX Acircumflex U -27.77 KPX Acircumflex V -111.08 KPX Acircumflex W -111.08 KPX Acircumflex Y -83.31 KPX Acircumflex t -27.77 KPX Adieresis C -27.77 KPX Adieresis G -27.77 KPX Adieresis O -27.77 KPX Adieresis Q -27.77 KPX Adieresis T -83.31 KPX Adieresis U -27.77 KPX Adieresis V -111.08 KPX Adieresis W -111.08 KPX Adieresis Y -83.31 KPX Adieresis t -27.77 KPX Agrave C -27.77 KPX Agrave G -27.77 KPX Agrave O -27.77 KPX Agrave Q -27.77 KPX Agrave T -83.31 KPX Agrave U -27.77 KPX Agrave V -111.08 KPX Agrave W -111.08 KPX Agrave Y -83.31 KPX Agrave t -27.77 KPX Aogonek C -27.77 KPX Aogonek G -27.77 KPX Aogonek O -27.77 KPX Aogonek Q -27.77 KPX Aogonek T -83.31 KPX Aogonek U -27.77 KPX Aogonek V -111.08 KPX Aogonek W -111.08 KPX Aogonek Y -83.31 KPX Aogonek t -27.77 KPX Aring C -27.77 KPX Aring G -27.77 KPX Aring O -27.77 KPX Aring Q -27.77 KPX Aring T -83.31 KPX Aring U -27.77 KPX Aring V -111.08 KPX Aring W -111.08 KPX Aring Y -83.31 KPX Aring t -27.77 KPX Atilde C -27.77 KPX Atilde G -27.77 KPX Atilde O -27.77 KPX Atilde Q -27.77 KPX Atilde T -83.31 KPX Atilde U -27.77 KPX Atilde V -111.08 KPX Atilde W -111.08 KPX Atilde Y -83.31 KPX Atilde t -27.77 KPX D A -27.77 KPX D V -27.77 KPX D W -27.77 KPX D X -27.77 KPX D Y -27.77 KPX F A -111.08 KPX F C -27.77 KPX F G -27.77 KPX F O -27.77 KPX F Q -27.77 KPX F a -83.31 KPX F e -83.31 KPX F o -83.31 KPX F r -83.31 KPX F u -83.31 KPX I I 27.77 KPX K C -27.77 KPX K G -27.77 KPX K O -27.77 KPX K Q -27.77 KPX L T -83.31 KPX L V -111.08 KPX L W -111.08 KPX L Y -83.31 KPX O A -27.77 KPX O V -27.77 KPX O W -27.77 KPX O X -27.77 KPX O Y -27.77 KPX P A -83.31 KPX P a -27.77 KPX P aacute -27.77 KPX P acircumflex -27.77 KPX P acircumflex -27.77 KPX P adieresis -27.77 KPX P ae -27.77 KPX P agrave -27.77 KPX P aogonek -27.77 KPX P aring -27.77 KPX P atilde -27.77 KPX P cacute -27.77 KPX P comma -83.31 KPX P e -27.77 KPX P eacute -27.77 KPX P ecaron -27.77 KPX P ecircumflex -27.77 KPX P edieresis -27.77 KPX P egrave -27.77 KPX P eogonek -27.77 KPX P o -27.77 KPX P oacute -27.77 KPX P ocircumflex -27.77 KPX P odieresis -27.77 KPX P oe -27.77 KPX P ograve -27.77 KPX P ohungarumlaut -27.77 KPX P otilde -27.77 KPX P period -83.31 KPX R C -27.77 KPX R G -27.77 KPX R O -27.77 KPX R Q -27.77 KPX R T -83.31 KPX R U -27.77 KPX R V -111.08 KPX R W -111.08 KPX R Y -83.31 KPX R t -27.77 KPX T A -83.31 KPX T a -83.31 KPX T e -83.31 KPX T o -83.31 KPX T r -83.31 KPX T u -83.31 KPX T y -27.77 KPX V A -111.08 KPX V C -27.77 KPX V G -27.77 KPX V O -27.77 KPX V Q -27.77 KPX V a -83.31 KPX V e -83.31 KPX V o -83.31 KPX V r -83.31 KPX V u -83.31 KPX W A -111.08 KPX W C -27.77 KPX W G -27.77 KPX W O -27.77 KPX W Q -27.77 KPX W a -83.31 KPX W e -83.31 KPX W o -83.31 KPX W r -83.31 KPX W u -83.31 KPX X C -27.77 KPX X G -27.77 KPX X O -27.77 KPX X Q -27.77 KPX Y A -83.31 KPX Y a -83.31 KPX Y e -83.31 KPX Y o -83.31 KPX Y r -83.31 KPX Y u -83.31 KPX a j 55.54 KPX a v -27.77 KPX a w -27.77 KPX a y -27.77 KPX b c 27.77 KPX b cacute 27.77 KPX b ccaron 27.77 KPX b ccedilla 27.77 KPX b d 27.77 KPX b e 27.77 KPX b eacute 27.77 KPX b ecaron 27.77 KPX b ecircumflex 27.77 KPX b edieresis 27.77 KPX b egrave 27.77 KPX b eogonek 27.77 KPX b j 55.54 KPX b o 27.77 KPX b oacute 27.77 KPX b ocircumflex 27.77 KPX b odieresis 27.77 KPX b oe 27.77 KPX b ograve 27.77 KPX b ohungarumlaut 27.77 KPX b otilde 27.77 KPX b q 27.77 KPX b v -27.77 KPX b w -27.77 KPX b x -27.77 KPX b y -27.77 KPX c h -27.77 KPX c k -27.77 KPX f bracketright 77.76 KPX f exclam 77.76 KPX f parenright 77.76 KPX f question 77.76 KPX f quoteright 77.76 KPX ff bracketright 77.76 KPX ff exclam 77.76 KPX ff parenright 77.76 KPX ff question 77.76 KPX ff quoteright 77.76 KPX g j 27.77 KPX h b -27.77 KPX h t -27.77 KPX h u -27.77 KPX h uacute -27.77 KPX h ucircumflex -27.77 KPX h udieresis -27.77 KPX h ugrave -27.77 KPX h uhungarumlaut -27.77 KPX h uring -27.77 KPX h v -27.77 KPX h w -27.77 KPX h y -27.77 KPX k a -27.77 KPX k a -55.54 KPX k aacute -27.77 KPX k aacute -55.54 KPX k acircumflex -55.54 KPX k acircumflex -55.54 KPX k acircumflex -27.77 KPX k acircumflex -27.77 KPX k adieresis -27.77 KPX k adieresis -55.54 KPX k ae -55.54 KPX k ae -27.77 KPX k agrave -55.54 KPX k agrave -27.77 KPX k aogonek -55.54 KPX k aogonek -27.77 KPX k aring -55.54 KPX k aring -27.77 KPX k atilde -27.77 KPX k atilde -55.54 KPX k c -27.77 KPX k cacute -27.77 KPX k cacute -27.77 KPX k cacute -55.54 KPX k ccaron -27.77 KPX k ccedilla -27.77 KPX k e -27.77 KPX k eacute -27.77 KPX k ecaron -27.77 KPX k ecircumflex -27.77 KPX k edieresis -27.77 KPX k egrave -27.77 KPX k eogonek -27.77 KPX k o -27.77 KPX k oacute -27.77 KPX k ocircumflex -27.77 KPX k odieresis -27.77 KPX k oe -27.77 KPX k ograve -27.77 KPX k ohungarumlaut -27.77 KPX k otilde -27.77 KPX m b -27.77 KPX m t -27.77 KPX m u -27.77 KPX m uacute -27.77 KPX m ucircumflex -27.77 KPX m udieresis -27.77 KPX m ugrave -27.77 KPX m uhungarumlaut -27.77 KPX m uring -27.77 KPX m v -27.77 KPX m w -27.77 KPX m y -27.77 KPX n b -27.77 KPX n t -27.77 KPX n u -27.77 KPX n uacute -27.77 KPX n ucircumflex -27.77 KPX n udieresis -27.77 KPX n ugrave -27.77 KPX n uhungarumlaut -27.77 KPX n uring -27.77 KPX n v -27.77 KPX n w -27.77 KPX n y -27.77 KPX o c 27.77 KPX o cacute 27.77 KPX o ccaron 27.77 KPX o ccedilla 27.77 KPX o d 27.77 KPX o e 27.77 KPX o eacute 27.77 KPX o ecaron 27.77 KPX o ecircumflex 27.77 KPX o edieresis 27.77 KPX o egrave 27.77 KPX o eogonek 27.77 KPX o j 55.54 KPX o o 27.77 KPX o oacute 27.77 KPX o ocircumflex 27.77 KPX o odieresis 27.77 KPX o oe 27.77 KPX o ograve 27.77 KPX o ohungarumlaut 27.77 KPX o otilde 27.77 KPX o q 27.77 KPX o v -27.77 KPX o w -27.77 KPX o x -27.77 KPX o y -27.77 KPX p c 27.77 KPX p cacute 27.77 KPX p ccaron 27.77 KPX p ccedilla 27.77 KPX p d 27.77 KPX p e 27.77 KPX p eacute 27.77 KPX p ecaron 27.77 KPX p ecircumflex 27.77 KPX p edieresis 27.77 KPX p egrave 27.77 KPX p eogonek 27.77 KPX p j 55.54 KPX p o 27.77 KPX p oacute 27.77 KPX p ocircumflex 27.77 KPX p odieresis 27.77 KPX p oe 27.77 KPX p ograve 27.77 KPX p ohungarumlaut 27.77 KPX p otilde 27.77 KPX p q 27.77 KPX p v -27.77 KPX p w -27.77 KPX p x -27.77 KPX p y -27.77 KPX quoteright exclam 111.08 KPX quoteright question 111.08 KPX t w -27.77 KPX t y -27.77 KPX u w -27.77 KPX v a -27.77 KPX v a -55.54 KPX v aacute -27.77 KPX v aacute -55.54 KPX v acircumflex -55.54 KPX v acircumflex -27.77 KPX v acircumflex -27.77 KPX v acircumflex -55.54 KPX v adieresis -27.77 KPX v adieresis -55.54 KPX v ae -27.77 KPX v ae -55.54 KPX v agrave -27.77 KPX v agrave -55.54 KPX v aogonek -55.54 KPX v aogonek -27.77 KPX v aring -55.54 KPX v aring -27.77 KPX v atilde -55.54 KPX v atilde -27.77 KPX v c -27.77 KPX v cacute -55.54 KPX v cacute -27.77 KPX v cacute -27.77 KPX v ccaron -27.77 KPX v ccedilla -27.77 KPX v e -27.77 KPX v eacute -27.77 KPX v ecaron -27.77 KPX v ecircumflex -27.77 KPX v edieresis -27.77 KPX v egrave -27.77 KPX v eogonek -27.77 KPX v o -27.77 KPX v oacute -27.77 KPX v ocircumflex -27.77 KPX v odieresis -27.77 KPX v oe -27.77 KPX v ograve -27.77 KPX v ohungarumlaut -27.77 KPX v otilde -27.77 KPX w a -27.77 KPX w aacute -27.77 KPX w acircumflex -27.77 KPX w acircumflex -27.77 KPX w adieresis -27.77 KPX w ae -27.77 KPX w agrave -27.77 KPX w aogonek -27.77 KPX w aring -27.77 KPX w atilde -27.77 KPX w c -27.77 KPX w cacute -27.77 KPX w cacute -27.77 KPX w ccaron -27.77 KPX w ccedilla -27.77 KPX w e -27.77 KPX w eacute -27.77 KPX w ecaron -27.77 KPX w ecircumflex -27.77 KPX w edieresis -27.77 KPX w egrave -27.77 KPX w eogonek -27.77 KPX w o -27.77 KPX w oacute -27.77 KPX w ocircumflex -27.77 KPX w odieresis -27.77 KPX w oe -27.77 KPX w ograve -27.77 KPX w ohungarumlaut -27.77 KPX w otilde -27.77 KPX y a -27.77 KPX y aacute -27.77 KPX y acircumflex -27.77 KPX y acircumflex -27.77 KPX y adieresis -27.77 KPX y ae -27.77 KPX y agrave -27.77 KPX y aogonek -27.77 KPX y aring -27.77 KPX y atilde -27.77 KPX y cacute -27.77 KPX y comma -83.31 KPX y e -27.77 KPX y eacute -27.77 KPX y ecaron -27.77 KPX y ecircumflex -27.77 KPX y edieresis -27.77 KPX y egrave -27.77 KPX y eogonek -27.77 KPX y o -27.77 KPX y oacute -27.77 KPX y ocircumflex -27.77 KPX y odieresis -27.77 KPX y oe -27.77 KPX y ograve -27.77 KPX y ohungarumlaut -27.77 KPX y otilde -27.77 KPX y period -83.31 EndKernPairs EndKernData EndFontMetrics xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/afm/dcbx10.afm0000664000175000017500000005300111742726711023114 0ustar uwabamiuwabamiStartFontMetrics 2.0 FontName dcbx10 FullName dcbx10 FamilyName dcbx10 Weight Medium ItalicAngle 0.000000 IsFixedPitch false UnderlinePosition -133 UnderlineThickness 20 Version 1.0\(Level-B\) FontBBox -82, -308, 1212, 914 Notice Copyright \(C\) 1994, Basil K. Malyshev. All Rights Reserved.\nBaKoMa Fonts Collection, Level-B. EncodingScheme FontSpecific CapHeight 686 XHeight 444 Descender -194 Ascender 694 StartCharMetrics 256 C 0 ; WX 574.83 ; N grave ; B 116 507 336 705 ; C 1 ; WX 574.83 ; N acute ; B 238 507 458 705 ; C 2 ; WX 574.83 ; N circumflex ; B 129 527 445 694 ; C 3 ; WX 574.83 ; N tilde ; B 96 577 478 694 ; C 4 ; WX 574.83 ; N dieresis ; B 101 546 473 695 ; C 5 ; WX 574.83 ; N hungarumlaut ; B 138 514 491 711 ; C 6 ; WX 869.22 ; N ring ; B 294 535 536 702 ; C 7 ; WX 574.83 ; N caron ; B 132 517 442 655 ; C 8 ; WX 574.83 ; N breve ; B 108 505 466 694 ; C 9 ; WX 574.83 ; N macron ; B 80 551 494 607 ; C 10 ; WX 319.39 ; N dotaccent ; B 79 535 239 695 ; C 11 ; WX 511 ; N cedilla ; B 132 -201 442 -11 ; C 12 ; WX 319.39 ; N ogonek ; B -10 -219 262 31 ; C 13 ; WX 319.39 ; N quotesinglbase ; B 78 -194 251 160 ; C 14 ; WX 511 ; N guilsinglleft ; B 109 40 375 432 ; C 15 ; WX 511 ; N guilsinglright ; B 109 40 419 432 ; C 16 ; WX 602.61 ; N quotedblleft ; B 132 340 564 694 ; C 17 ; WX 602.61 ; N quotedblright ; B 38 340 470 694 ; C 18 ; WX 602.61 ; N quotedblbase ; B 154 -194 586 160 ; C 19 ; WX 766.5 ; N guillemotleft ; B 109 40 630 432 ; C 20 ; WX 766.5 ; N guillemotright ; B 109 40 674 432 ; C 21 ; WX 574.83 ; N endash ; B 0 254 574 294 ; L hyphen emdash ; C 22 ; WX 1149.72 ; N emdash ; B 0 254 1149 294 ; C 23 ; WX 0 ; N compoundwordmark ; B 0 0 0 0 ; C 24 ; WX 447.11 ; N perthousand ; B 63 -56 383 347 ; C 25 ; WX 319.39 ; N dotlessi ; B 34 0 277 450 ; C 26 ; WX 351.28 ; N dotlessj ; B -82 -194 247 450 ; C 27 ; WX 670.67 ; N ff ; B 31 0 750 700 ; L i ffi ; L l ffl ; C 28 ; WX 638.72 ; N fi ; B 31 0 603 700 ; C 29 ; WX 638.72 ; N fl ; B 31 0 603 700 ; C 30 ; WX 958.11 ; N ffi ; B 31 0 923 700 ; C 31 ; WX 958.11 ; N ffl ; B 31 0 923 700 ; C 32 ; WX 574.83 ; N visiblespace ; B 48 -111 526 251 ; C 33 ; WX 349.89 ; N exclam ; B 94 0 256 705 ; C 34 ; WX 574.83 ; N quotedbl ; B 125 360 450 711 ; C 35 ; WX 958.11 ; N numbersign ; B 64 -194 893 694 ; C 36 ; WX 574.83 ; N dollar ; B 65 -56 511 750 ; C 37 ; WX 958.11 ; N percent ; B 64 -56 893 750 ; C 38 ; WX 894.22 ; N ampersand ; B 48 -11 836 705 ; C 39 ; WX 319.39 ; N quoteright ; B 79 340 255 694 ; L quoteright quotedblright ; C 40 ; WX 447.11 ; N parenleft ; B 107 -251 382 750 ; C 41 ; WX 447.11 ; N parenright ; B 64 -251 339 750 ; C 42 ; WX 574.83 ; N asterisk ; B 73 306 501 750 ; C 43 ; WX 894.22 ; N plus ; B 64 -134 829 633 ; C 44 ; WX 319.39 ; N comma ; B 79 -194 252 160 ; L comma quotedblbase ; C 45 ; WX 383.22 ; N hyphen ; B 13 172 318 273 ; L hyphen endash ; C 46 ; WX 319.39 ; N period ; B 79 0 239 160 ; C 47 ; WX 574.83 ; N slash ; B 64 -250 510 750 ; C 48 ; WX 574.83 ; N zero ; B 45 -11 529 655 ; C 49 ; WX 574.83 ; N one ; B 83 0 494 655 ; C 50 ; WX 574.83 ; N two ; B 57 0 517 655 ; C 51 ; WX 574.83 ; N three ; B 48 -11 526 655 ; C 52 ; WX 574.83 ; N four ; B 32 0 542 656 ; C 53 ; WX 574.83 ; N five ; B 57 -11 517 655 ; C 54 ; WX 574.83 ; N six ; B 48 -11 526 655 ; C 55 ; WX 574.83 ; N seven ; B 64 -11 558 676 ; C 56 ; WX 574.83 ; N eight ; B 48 -11 526 655 ; C 57 ; WX 574.83 ; N nine ; B 48 -11 526 655 ; C 58 ; WX 319.39 ; N colon ; B 79 0 239 444 ; C 59 ; WX 319.39 ; N semicolon ; B 79 -194 242 444 ; C 60 ; WX 894.22 ; N less ; B 96 -76 797 575 ; L less guillemotleft ; C 61 ; WX 894.22 ; N equal ; B 64 118 829 381 ; C 62 ; WX 894.22 ; N greater ; B 96 -76 797 575 ; L greater guillemotright ; C 63 ; WX 542.94 ; N question ; B 64 0 478 700 ; C 64 ; WX 894.22 ; N at ; B 64 0 829 700 ; C 65 ; WX 869.22 ; N A ; B 22 0 808 698 ; C 66 ; WX 817.83 ; N B ; B 20 0 734 686 ; C 67 ; WX 830.33 ; N C ; B 64 -11 765 697 ; C 68 ; WX 881.72 ; N D ; B 20 0 798 686 ; C 69 ; WX 755.39 ; N E ; B 20 0 703 680 ; C 70 ; WX 723.44 ; N F ; B 20 0 655 680 ; C 71 ; WX 904 ; N G ; B 64 -11 845 697 ; C 72 ; WX 899.78 ; N H ; B 20 0 841 686 ; C 73 ; WX 436 ; N I ; B 12 0 386 686 ; C 74 ; WX 594.28 ; N J ; B 19 -11 527 686 ; C 75 ; WX 901.17 ; N K ; B 20 0 833 686 ; C 76 ; WX 691.5 ; N L ; B 20 0 623 686 ; C 77 ; WX 1091.39 ; N M ; B 20 0 1032 686 ; C 78 ; WX 899.78 ; N N ; B 20 0 841 686 ; C 79 ; WX 863.67 ; N O ; B 64 -11 799 697 ; C 80 ; WX 785.94 ; N P ; B 20 0 702 686 ; C 81 ; WX 863.67 ; N Q ; B 64 -194 805 697 ; C 82 ; WX 862.28 ; N R ; B 20 -11 839 686 ; C 83 ; WX 638.72 ; N S ; B 64 -11 574 697 ; C 84 ; WX 799.78 ; N T ; B 43 0 758 675 ; C 85 ; WX 884.5 ; N U ; B 20 -11 826 686 ; C 86 ; WX 869.22 ; N V ; B 7 -8 823 686 ; C 87 ; WX 1188.61 ; N W ; B 5 -8 1145 686 ; C 88 ; WX 869.22 ; N X ; B 15 0 816 686 ; C 89 ; WX 869.22 ; N Y ; B 0 0 830 686 ; C 90 ; WX 702.61 ; N Z ; B 64 0 645 686 ; C 91 ; WX 319.39 ; N bracketleft ; B 102 -250 293 750 ; C 92 ; WX 574.83 ; N backslash ; B 64 -250 510 750 ; C 93 ; WX 319.39 ; N bracketright ; B 25 -250 216 750 ; C 94 ; WX 702.61 ; N asciicircum ; B 132 458 570 632 ; C 95 ; WX 894.22 ; N underscore ; B 96 -308 797 -247 ; C 96 ; WX 319.39 ; N quoteleft ; B 63 340 239 694 ; L quoteleft quotedblleft ; C 97 ; WX 558.89 ; N a ; B 32 0 558 453 ; C 98 ; WX 638.72 ; N b ; B 35 0 600 694 ; C 99 ; WX 511 ; N c ; B 38 0 478 453 ; C 100 ; WX 638.72 ; N d ; B 38 0 603 694 ; C 101 ; WX 527 ; N e ; B 32 0 494 453 ; C 102 ; WX 351.28 ; N f ; B 31 0 430 700 ; L i fi ; L f ff ; L l fl ; C 103 ; WX 574.83 ; N g ; B 32 -201 558 455 ; C 104 ; WX 638.72 ; N h ; B 32 0 606 694 ; C 105 ; WX 319.39 ; N i ; B 34 0 277 695 ; C 106 ; WX 351.28 ; N j ; B -82 -194 247 695 ; C 107 ; WX 606.78 ; N k ; B 35 0 587 694 ; C 108 ; WX 319.39 ; N l ; B 34 0 284 694 ; C 109 ; WX 958.11 ; N m ; B 32 0 927 444 ; C 110 ; WX 638.72 ; N n ; B 32 0 606 444 ; C 111 ; WX 574.83 ; N o ; B 32 0 542 453 ; C 112 ; WX 638.72 ; N p ; B 35 -194 600 444 ; C 113 ; WX 606.78 ; N q ; B 38 -194 603 444 ; C 114 ; WX 473.5 ; N r ; B 35 0 441 444 ; C 115 ; WX 453.5 ; N s ; B 38 0 415 453 ; C 116 ; WX 447.11 ; N t ; B 21 0 382 635 ; C 117 ; WX 638.72 ; N u ; B 32 0 606 450 ; C 118 ; WX 606.78 ; N v ; B 26 0 580 444 ; C 119 ; WX 830.33 ; N w ; B 25 0 804 444 ; C 120 ; WX 606.78 ; N x ; B 22 0 586 444 ; C 121 ; WX 606.78 ; N y ; B 22 -194 580 444 ; C 122 ; WX 511 ; N z ; B 32 0 462 444 ; C 123 ; WX 574.83 ; N braceleft ; B 76 -250 498 750 ; C 124 ; WX 319.39 ; N bar ; B 129 -250 190 750 ; C 125 ; WX 574.83 ; N braceright ; B 76 -250 498 750 ; C 126 ; WX 702.61 ; N asciitilde ; B 96 577 606 694 ; C 127 ; WX 383.22 ; N hyphen ; B 13 172 318 273 ; C 128 ; WX 869.22 ; N Abreve ; B 22 0 808 894 ; C 129 ; WX 869.22 ; N Aogonek ; B 22 -207 856 698 ; C 130 ; WX 830.33 ; N Cacute ; B 64 -11 765 905 ; C 131 ; WX 830.33 ; N Ccaron ; B 64 -11 765 864 ; C 132 ; WX 881.72 ; N Dcaron ; B 20 0 798 864 ; C 133 ; WX 755.39 ; N Ecaron ; B 20 0 703 863 ; C 134 ; WX 755.39 ; N Eogonek ; B 20 -207 703 680 ; C 135 ; WX 904 ; N Gbreve ; B 64 -11 845 894 ; C 136 ; WX 691.5 ; N Lacute ; B 20 0 623 905 ; C 137 ; WX 691.5 ; N Lquoteright ; B 20 0 647 686 ; C 138 ; WX 691.5 ; N Lslash ; B 20 0 623 686 ; C 139 ; WX 899.78 ; N Nacute ; B 20 0 841 905 ; C 140 ; WX 899.78 ; N Ncaron ; B 20 0 841 863 ; C 141 ; WX 841.44 ; N Eng ; B 32 -11 783 686 ; C 142 ; WX 863.67 ; N Ohungarumlaut ; B 64 -11 799 904 ; C 143 ; WX 862.28 ; N Racute ; B 20 -11 839 905 ; C 144 ; WX 862.28 ; N Rcaron ; B 20 -11 839 864 ; C 145 ; WX 638.72 ; N Sacute ; B 64 -11 574 905 ; C 146 ; WX 638.72 ; N Scaron ; B 64 -11 574 864 ; C 147 ; WX 638.72 ; N Scedilla ; B 64 -201 574 697 ; C 148 ; WX 799.78 ; N Tcaron ; B 43 0 758 863 ; C 149 ; WX 799.78 ; N Tcedilla ; B 43 -201 758 675 ; C 150 ; WX 884.5 ; N Uhungarumlaut ; B 20 -11 826 904 ; C 151 ; WX 884.5 ; N Uring ; B 20 -11 826 902 ; C 152 ; WX 869.22 ; N Ydieresis ; B 0 0 830 894 ; C 153 ; WX 702.61 ; N Zacute ; B 64 0 645 905 ; C 154 ; WX 702.61 ; N Zcaron ; B 64 0 645 864 ; C 155 ; WX 702.61 ; N Zdotaccent ; B 64 0 645 894 ; C 156 ; WX 1010.83 ; N IJ ; B 12 -11 925 686 ; C 157 ; WX 436 ; N Idotaccent ; B 12 0 386 902 ; C 158 ; WX 638.72 ; N dbar ; B 38 0 603 694 ; C 159 ; WX 529 ; N section ; B 80 -194 448 700 ; C 160 ; WX 558.89 ; N abreve ; B 32 0 558 694 ; C 161 ; WX 558.89 ; N aogonek ; B 32 -219 558 453 ; C 162 ; WX 511 ; N cacute ; B 38 0 478 664 ; C 163 ; WX 511 ; N ccaron ; B 38 0 478 623 ; C 164 ; WX 810.22 ; N dquoteright ; B 38 0 798 694 ; C 165 ; WX 527 ; N ecaron ; B 32 0 494 623 ; C 166 ; WX 527 ; N eogonek ; B 32 -219 494 453 ; C 167 ; WX 574.83 ; N gbreve ; B 32 -201 558 694 ; C 168 ; WX 319.39 ; N lacute ; B 34 0 332 914 ; C 169 ; WX 502 ; N lquoteright ; B 34 0 478 694 ; C 170 ; WX 319.39 ; N lslash ; B 4 0 314 694 ; C 171 ; WX 638.72 ; N nacute ; B 32 0 606 664 ; C 172 ; WX 638.72 ; N ncaron ; B 32 0 606 623 ; C 173 ; WX 638.72 ; N eng ; B 32 -194 537 444 ; C 174 ; WX 574.83 ; N ohungarumlaut ; B 32 0 606 663 ; C 175 ; WX 473.5 ; N racute ; B 35 0 441 664 ; C 176 ; WX 473.5 ; N rcaron ; B 35 0 441 623 ; C 177 ; WX 453.5 ; N sacute ; B 38 0 415 664 ; C 178 ; WX 453.5 ; N scaron ; B 38 0 415 622 ; C 179 ; WX 453.5 ; N scedilla ; B 38 -201 415 453 ; C 180 ; WX 506.83 ; N tquoteright ; B 21 0 494 708 ; C 181 ; WX 447.11 ; N tcedilla ; B 21 -201 430 635 ; C 182 ; WX 638.72 ; N uhungarumlaut ; B 32 0 638 663 ; C 183 ; WX 638.72 ; N uring ; B 32 0 606 661 ; C 184 ; WX 606.78 ; N ydieresis ; B 22 -194 580 652 ; C 185 ; WX 511 ; N zacute ; B 32 0 462 664 ; C 186 ; WX 511 ; N zcaron ; B 32 0 462 623 ; C 187 ; WX 511 ; N zdotaccent ; B 32 0 463 694 ; C 188 ; WX 670.67 ; N ij ; B 43 -194 574 695 ; C 189 ; WX 349.89 ; N exclamdown ; B 94 -205 256 500 ; C 190 ; WX 542.94 ; N questiondown ; B 64 -194 478 500 ; C 191 ; WX 734.56 ; N sterling ; B 64 0 725 706 ; C 192 ; WX 869.22 ; N Agrave ; B 22 0 808 905 ; C 193 ; WX 869.22 ; N Aacute ; B 22 0 808 905 ; C 194 ; WX 869.22 ; N Acircumflex ; B 22 0 808 894 ; C 195 ; WX 869.22 ; N Atilde ; B 22 0 808 894 ; C 196 ; WX 869.22 ; N Adieresis ; B 22 0 808 894 ; C 197 ; WX 869.22 ; N Aring ; B 22 0 808 861 ; C 198 ; WX 1041.39 ; N AE ; B 22 0 989 686 ; C 199 ; WX 830.33 ; N Ccedilla ; B 64 -201 765 697 ; C 200 ; WX 755.39 ; N Egrave ; B 20 0 703 905 ; C 201 ; WX 755.39 ; N Eacute ; B 20 0 703 905 ; C 202 ; WX 755.39 ; N Ecircumflex ; B 20 0 703 894 ; C 203 ; WX 755.39 ; N Edieresis ; B 20 0 703 894 ; C 204 ; WX 436 ; N Igrave ; B 12 0 386 905 ; C 205 ; WX 436 ; N Iacute ; B 12 0 386 905 ; C 206 ; WX 436 ; N Icircumflex ; B 12 0 386 894 ; C 207 ; WX 436 ; N Idieresis ; B 12 0 386 894 ; C 208 ; WX 881.72 ; N Eth ; B 20 0 798 686 ; C 209 ; WX 899.78 ; N Ntilde ; B 20 0 841 894 ; C 210 ; WX 863.67 ; N Ograve ; B 64 -11 799 905 ; C 211 ; WX 863.67 ; N Oacute ; B 64 -11 799 905 ; C 212 ; WX 863.67 ; N Ocircumflex ; B 64 -11 799 894 ; C 213 ; WX 863.67 ; N Otilde ; B 64 -11 799 894 ; C 214 ; WX 863.67 ; N Odieresis ; B 64 -11 799 894 ; C 215 ; WX 1169.17 ; N OE ; B 64 -11 1117 697 ; C 216 ; WX 894.22 ; N Oslash ; B 64 -61 829 747 ; C 217 ; WX 884.5 ; N Ugrave ; B 20 -11 826 905 ; C 218 ; WX 884.5 ; N Uacute ; B 20 -11 826 905 ; C 219 ; WX 884.5 ; N Ucircumflex ; B 20 -11 826 894 ; C 220 ; WX 884.5 ; N Udieresis ; B 20 -11 826 894 ; C 221 ; WX 869.22 ; N Yacute ; B 0 0 830 905 ; C 222 ; WX 722 ; N Thorn ; B 20 0 638 686 ; C 223 ; WX 1277.44 ; N Germandbls ; B 64 -11 1212 697 ; C 224 ; WX 558.89 ; N agrave ; B 32 0 558 664 ; C 225 ; WX 558.89 ; N aacute ; B 32 0 558 664 ; C 226 ; WX 558.89 ; N acircumflex ; B 32 0 558 653 ; C 227 ; WX 558.89 ; N atilde ; B 32 0 558 694 ; C 228 ; WX 558.89 ; N adieresis ; B 32 0 558 652 ; C 229 ; WX 558.89 ; N aring ; B 32 0 558 661 ; C 230 ; WX 830.33 ; N ae ; B 35 0 797 453 ; C 231 ; WX 511 ; N ccedilla ; B 38 -201 478 453 ; C 232 ; WX 527 ; N egrave ; B 32 0 494 664 ; C 233 ; WX 527 ; N eacute ; B 32 0 494 664 ; C 234 ; WX 527 ; N ecircumflex ; B 32 0 494 653 ; C 235 ; WX 527 ; N edieresis ; B 32 0 494 652 ; C 236 ; WX 319.39 ; N igrave ; B -14 0 277 664 ; C 237 ; WX 319.39 ; N iacute ; B 34 0 332 664 ; C 238 ; WX 319.39 ; N icircumflex ; B -1 0 319 653 ; C 239 ; WX 383.22 ; N idieresis ; B -27 0 346 652 ; C 240 ; WX 574.83 ; N eth ; B 32 0 542 694 ; C 241 ; WX 638.72 ; N ntilde ; B 32 0 606 694 ; C 242 ; WX 574.83 ; N ograve ; B 32 0 542 664 ; C 243 ; WX 574.83 ; N oacute ; B 32 0 542 664 ; C 244 ; WX 574.83 ; N ocircumflex ; B 32 0 542 653 ; C 245 ; WX 574.83 ; N otilde ; B 32 0 542 694 ; C 246 ; WX 574.83 ; N odieresis ; B 32 0 542 652 ; C 247 ; WX 894.22 ; N oe ; B 32 0 861 453 ; C 248 ; WX 574.83 ; N oslash ; B 32 -107 542 552 ; C 249 ; WX 638.72 ; N ugrave ; B 32 0 606 664 ; C 250 ; WX 638.72 ; N uacute ; B 32 0 606 664 ; C 251 ; WX 638.72 ; N ucircumflex ; B 32 0 606 653 ; C 252 ; WX 638.72 ; N udieresis ; B 32 0 606 652 ; C 253 ; WX 606.78 ; N yacute ; B 22 -194 580 664 ; C 254 ; WX 638.72 ; N thorn ; B 34 -212 600 694 ; C 255 ; WX 597.06 ; N germandbls ; B 35 0 564 700 ; EndCharMetrics StartKernData StartKernPairs 471 KPX A C -31.94 KPX A G -31.94 KPX A O -31.94 KPX A Q -31.94 KPX A T -95.81 KPX A U -31.94 KPX A V -127.75 KPX A W -127.75 KPX A Y -95.81 KPX A t -31.94 KPX Aacute C -31.94 KPX Aacute G -31.94 KPX Aacute O -31.94 KPX Aacute Q -31.94 KPX Aacute T -95.81 KPX Aacute U -31.94 KPX Aacute V -127.75 KPX Aacute W -127.75 KPX Aacute Y -95.81 KPX Aacute t -31.94 KPX Abreve C -31.94 KPX Abreve G -31.94 KPX Abreve O -31.94 KPX Abreve Q -31.94 KPX Abreve T -95.81 KPX Abreve U -31.94 KPX Abreve V -127.75 KPX Abreve W -127.75 KPX Abreve Y -95.81 KPX Abreve t -31.94 KPX Acircumflex C -31.94 KPX Acircumflex G -31.94 KPX Acircumflex O -31.94 KPX Acircumflex Q -31.94 KPX Acircumflex T -95.81 KPX Acircumflex U -31.94 KPX Acircumflex V -127.75 KPX Acircumflex W -127.75 KPX Acircumflex Y -95.81 KPX Acircumflex t -31.94 KPX Adieresis C -31.94 KPX Adieresis G -31.94 KPX Adieresis O -31.94 KPX Adieresis Q -31.94 KPX Adieresis T -95.81 KPX Adieresis U -31.94 KPX Adieresis V -127.75 KPX Adieresis W -127.75 KPX Adieresis Y -95.81 KPX Adieresis t -31.94 KPX Agrave C -31.94 KPX Agrave G -31.94 KPX Agrave O -31.94 KPX Agrave Q -31.94 KPX Agrave T -95.81 KPX Agrave U -31.94 KPX Agrave V -127.75 KPX Agrave W -127.75 KPX Agrave Y -95.81 KPX Agrave t -31.94 KPX Aogonek C -31.94 KPX Aogonek G -31.94 KPX Aogonek O -31.94 KPX Aogonek Q -31.94 KPX Aogonek T -95.81 KPX Aogonek U -31.94 KPX Aogonek V -127.75 KPX Aogonek W -127.75 KPX Aogonek Y -95.81 KPX Aogonek t -31.94 KPX Aring C -31.94 KPX Aring G -31.94 KPX Aring O -31.94 KPX Aring Q -31.94 KPX Aring T -95.81 KPX Aring U -31.94 KPX Aring V -127.75 KPX Aring W -127.75 KPX Aring Y -95.81 KPX Aring t -31.94 KPX Atilde C -31.94 KPX Atilde G -31.94 KPX Atilde O -31.94 KPX Atilde Q -31.94 KPX Atilde T -95.81 KPX Atilde U -31.94 KPX Atilde V -127.75 KPX Atilde W -127.75 KPX Atilde Y -95.81 KPX Atilde t -31.94 KPX D A -31.94 KPX D V -31.94 KPX D W -31.94 KPX D X -31.94 KPX D Y -31.94 KPX F A -127.75 KPX F C -31.94 KPX F G -31.94 KPX F O -31.94 KPX F Q -31.94 KPX F a -95.81 KPX F e -95.81 KPX F o -95.81 KPX F r -95.81 KPX F u -95.81 KPX I I 31.94 KPX K C -31.94 KPX K G -31.94 KPX K O -31.94 KPX K Q -31.94 KPX L T -95.81 KPX L V -127.75 KPX L W -127.75 KPX L Y -95.81 KPX O A -31.94 KPX O V -31.94 KPX O W -31.94 KPX O X -31.94 KPX O Y -31.94 KPX P A -95.81 KPX P a -31.94 KPX P aacute -31.94 KPX P acircumflex -31.94 KPX P acircumflex -31.94 KPX P adieresis -31.94 KPX P ae -31.94 KPX P agrave -31.94 KPX P aogonek -31.94 KPX P aring -31.94 KPX P atilde -31.94 KPX P cacute -31.94 KPX P comma -95.81 KPX P e -31.94 KPX P eacute -31.94 KPX P ecaron -31.94 KPX P ecircumflex -31.94 KPX P edieresis -31.94 KPX P egrave -31.94 KPX P eogonek -31.94 KPX P o -31.94 KPX P oacute -31.94 KPX P ocircumflex -31.94 KPX P odieresis -31.94 KPX P oe -31.94 KPX P ograve -31.94 KPX P ohungarumlaut -31.94 KPX P otilde -31.94 KPX P period -95.81 KPX R C -31.94 KPX R G -31.94 KPX R O -31.94 KPX R Q -31.94 KPX R T -95.81 KPX R U -31.94 KPX R V -127.75 KPX R W -127.75 KPX R Y -95.81 KPX R t -31.94 KPX T A -95.81 KPX T a -95.81 KPX T e -95.81 KPX T o -95.81 KPX T r -95.81 KPX T u -95.81 KPX T y -31.94 KPX V A -127.75 KPX V C -31.94 KPX V G -31.94 KPX V O -31.94 KPX V Q -31.94 KPX V a -95.81 KPX V e -95.81 KPX V o -95.81 KPX V r -95.81 KPX V u -95.81 KPX W A -127.75 KPX W C -31.94 KPX W G -31.94 KPX W O -31.94 KPX W Q -31.94 KPX W a -95.81 KPX W e -95.81 KPX W o -95.81 KPX W r -95.81 KPX W u -95.81 KPX X C -31.94 KPX X G -31.94 KPX X O -31.94 KPX X Q -31.94 KPX Y A -95.81 KPX Y a -95.81 KPX Y e -95.81 KPX Y o -95.81 KPX Y r -95.81 KPX Y u -95.81 KPX a j 63.87 KPX a v -31.94 KPX a w -31.94 KPX a y -31.94 KPX b c 31.94 KPX b cacute 31.94 KPX b ccaron 31.94 KPX b ccedilla 31.94 KPX b d 31.94 KPX b e 31.94 KPX b eacute 31.94 KPX b ecaron 31.94 KPX b ecircumflex 31.94 KPX b edieresis 31.94 KPX b egrave 31.94 KPX b eogonek 31.94 KPX b j 63.87 KPX b o 31.94 KPX b oacute 31.94 KPX b ocircumflex 31.94 KPX b odieresis 31.94 KPX b oe 31.94 KPX b ograve 31.94 KPX b ohungarumlaut 31.94 KPX b otilde 31.94 KPX b q 31.94 KPX b v -31.94 KPX b w -31.94 KPX b x -31.94 KPX b y -31.94 KPX c h -31.94 KPX c k -31.94 KPX f bracketright 109 KPX f exclam 109 KPX f parenright 109 KPX f question 109 KPX f quoteright 109 KPX ff bracketright 109 KPX ff exclam 109 KPX ff parenright 109 KPX ff question 109 KPX ff quoteright 109 KPX g j 31.94 KPX h b -31.94 KPX h t -31.94 KPX h u -31.94 KPX h uacute -31.94 KPX h ucircumflex -31.94 KPX h udieresis -31.94 KPX h ugrave -31.94 KPX h uhungarumlaut -31.94 KPX h uring -31.94 KPX h v -31.94 KPX h w -31.94 KPX h y -31.94 KPX k a -31.94 KPX k a -63.87 KPX k aacute -31.94 KPX k aacute -63.87 KPX k acircumflex -63.87 KPX k acircumflex -63.87 KPX k acircumflex -31.94 KPX k acircumflex -31.94 KPX k adieresis -31.94 KPX k adieresis -63.87 KPX k ae -63.87 KPX k ae -31.94 KPX k agrave -63.87 KPX k agrave -31.94 KPX k aogonek -63.87 KPX k aogonek -31.94 KPX k aring -63.87 KPX k aring -31.94 KPX k atilde -31.94 KPX k atilde -63.87 KPX k c -31.94 KPX k cacute -31.94 KPX k cacute -31.94 KPX k cacute -63.87 KPX k ccaron -31.94 KPX k ccedilla -31.94 KPX k e -31.94 KPX k eacute -31.94 KPX k ecaron -31.94 KPX k ecircumflex -31.94 KPX k edieresis -31.94 KPX k egrave -31.94 KPX k eogonek -31.94 KPX k o -31.94 KPX k oacute -31.94 KPX k ocircumflex -31.94 KPX k odieresis -31.94 KPX k oe -31.94 KPX k ograve -31.94 KPX k ohungarumlaut -31.94 KPX k otilde -31.94 KPX m b -31.94 KPX m t -31.94 KPX m u -31.94 KPX m uacute -31.94 KPX m ucircumflex -31.94 KPX m udieresis -31.94 KPX m ugrave -31.94 KPX m uhungarumlaut -31.94 KPX m uring -31.94 KPX m v -31.94 KPX m w -31.94 KPX m y -31.94 KPX n b -31.94 KPX n t -31.94 KPX n u -31.94 KPX n uacute -31.94 KPX n ucircumflex -31.94 KPX n udieresis -31.94 KPX n ugrave -31.94 KPX n uhungarumlaut -31.94 KPX n uring -31.94 KPX n v -31.94 KPX n w -31.94 KPX n y -31.94 KPX o c 31.94 KPX o cacute 31.94 KPX o ccaron 31.94 KPX o ccedilla 31.94 KPX o d 31.94 KPX o e 31.94 KPX o eacute 31.94 KPX o ecaron 31.94 KPX o ecircumflex 31.94 KPX o edieresis 31.94 KPX o egrave 31.94 KPX o eogonek 31.94 KPX o j 63.87 KPX o o 31.94 KPX o oacute 31.94 KPX o ocircumflex 31.94 KPX o odieresis 31.94 KPX o oe 31.94 KPX o ograve 31.94 KPX o ohungarumlaut 31.94 KPX o otilde 31.94 KPX o q 31.94 KPX o v -31.94 KPX o w -31.94 KPX o x -31.94 KPX o y -31.94 KPX p c 31.94 KPX p cacute 31.94 KPX p ccaron 31.94 KPX p ccedilla 31.94 KPX p d 31.94 KPX p e 31.94 KPX p eacute 31.94 KPX p ecaron 31.94 KPX p ecircumflex 31.94 KPX p edieresis 31.94 KPX p egrave 31.94 KPX p eogonek 31.94 KPX p j 63.87 KPX p o 31.94 KPX p oacute 31.94 KPX p ocircumflex 31.94 KPX p odieresis 31.94 KPX p oe 31.94 KPX p ograve 31.94 KPX p ohungarumlaut 31.94 KPX p otilde 31.94 KPX p q 31.94 KPX p v -31.94 KPX p w -31.94 KPX p x -31.94 KPX p y -31.94 KPX quoteright exclam 127.75 KPX quoteright question 127.75 KPX t w -31.94 KPX t y -31.94 KPX u w -31.94 KPX v a -31.94 KPX v a -63.87 KPX v aacute -31.94 KPX v aacute -63.87 KPX v acircumflex -63.87 KPX v acircumflex -31.94 KPX v acircumflex -31.94 KPX v acircumflex -63.87 KPX v adieresis -31.94 KPX v adieresis -63.87 KPX v ae -31.94 KPX v ae -63.87 KPX v agrave -31.94 KPX v agrave -63.87 KPX v aogonek -63.87 KPX v aogonek -31.94 KPX v aring -63.87 KPX v aring -31.94 KPX v atilde -63.87 KPX v atilde -31.94 KPX v c -31.94 KPX v cacute -63.87 KPX v cacute -31.94 KPX v cacute -31.94 KPX v ccaron -31.94 KPX v ccedilla -31.94 KPX v e -31.94 KPX v eacute -31.94 KPX v ecaron -31.94 KPX v ecircumflex -31.94 KPX v edieresis -31.94 KPX v egrave -31.94 KPX v eogonek -31.94 KPX v o -31.94 KPX v oacute -31.94 KPX v ocircumflex -31.94 KPX v odieresis -31.94 KPX v oe -31.94 KPX v ograve -31.94 KPX v ohungarumlaut -31.94 KPX v otilde -31.94 KPX w a -31.94 KPX w aacute -31.94 KPX w acircumflex -31.94 KPX w acircumflex -31.94 KPX w adieresis -31.94 KPX w ae -31.94 KPX w agrave -31.94 KPX w aogonek -31.94 KPX w aring -31.94 KPX w atilde -31.94 KPX w c -31.94 KPX w cacute -31.94 KPX w cacute -31.94 KPX w ccaron -31.94 KPX w ccedilla -31.94 KPX w e -31.94 KPX w eacute -31.94 KPX w ecaron -31.94 KPX w ecircumflex -31.94 KPX w edieresis -31.94 KPX w egrave -31.94 KPX w eogonek -31.94 KPX w o -31.94 KPX w oacute -31.94 KPX w ocircumflex -31.94 KPX w odieresis -31.94 KPX w oe -31.94 KPX w ograve -31.94 KPX w ohungarumlaut -31.94 KPX w otilde -31.94 KPX y a -31.94 KPX y aacute -31.94 KPX y acircumflex -31.94 KPX y acircumflex -31.94 KPX y adieresis -31.94 KPX y ae -31.94 KPX y agrave -31.94 KPX y aogonek -31.94 KPX y aring -31.94 KPX y atilde -31.94 KPX y cacute -31.94 KPX y comma -95.81 KPX y e -31.94 KPX y eacute -31.94 KPX y ecaron -31.94 KPX y ecircumflex -31.94 KPX y edieresis -31.94 KPX y egrave -31.94 KPX y eogonek -31.94 KPX y o -31.94 KPX y oacute -31.94 KPX y ocircumflex -31.94 KPX y odieresis -31.94 KPX y oe -31.94 KPX y ograve -31.94 KPX y ohungarumlaut -31.94 KPX y otilde -31.94 KPX y period -95.81 EndKernPairs EndKernData EndFontMetrics xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/afm/bchr.afm0000664000175000017500000004646411742726711022770 0ustar uwabamiuwabamiStartFontMetrics 2.0 Comment Bitstream AFM Data Comment Copyright 1987-1990 as an unpublished work by Bitstream Inc., Cambridge, MA. Comment All rights reserved Comment Confidential and proprietary to Bitstream Inc. Comment Bitstream is a registered trademark of Bitstream Inc. Comment bitsClassification Transitional 801 Comment bitsFontID 0648 Comment bitsManufacturingDate Tue Nov 6 02:52:05 1990 Comment bitsLayoutName clayout.adobe.text228.new Comment UniqueID 15530648 FontName CharterBT-Roman FullName Bitstream Charter FamilyName Bitstream Charter Weight Normal ItalicAngle 0.00 IsFixedPitch false FontBBox -162 -237 1194 963 UnderlinePosition -109 UnderlineThickness 61 Version 1.0 [UFO] Notice Copyright 1987-1990 as an unpublished work by Bitstream Inc. All rights reserved. Confidential. EncodingScheme AdobeStandardEncoding CapHeight 672 XHeight 482 Ascender 737 Descender -218 StartCharMetrics 228 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 338 ; N exclam ; B 112 -9 226 683 ; C 34 ; WX 331 ; N quotedbl ; B 43 421 288 715 ; C 35 ; WX 745 ; N numbersign ; B 63 -24 681 710 ; C 36 ; WX 556 ; N dollar ; B 57 -102 498 744 ; C 37 ; WX 852 ; N percent ; B 30 -12 822 683 ; C 38 ; WX 704 ; N ampersand ; B 53 -12 683 683 ; C 39 ; WX 201 ; N quoteright ; B 30 442 170 714 ; C 40 ; WX 417 ; N parenleft ; B 105 -142 386 718 ; C 41 ; WX 417 ; N parenright ; B 31 -142 311 718 ; C 42 ; WX 500 ; N asterisk ; B 53 337 447 718 ; C 43 ; WX 833 ; N plus ; B 124 0 710 597 ; C 44 ; WX 278 ; N comma ; B 39 -169 208 107 ; C 45 ; WX 319 ; N hyphen ; B 47 207 272 275 ; C 46 ; WX 278 ; N period ; B 75 -10 203 118 ; C 47 ; WX 481 ; N slash ; B -29 -93 461 672 ; C 48 ; WX 556 ; N zero ; B 40 -12 516 683 ; C 49 ; WX 556 ; N one ; B 94 0 460 683 ; C 50 ; WX 556 ; N two ; B 42 0 506 684 ; C 51 ; WX 556 ; N three ; B 40 -11 492 684 ; C 52 ; WX 556 ; N four ; B 26 -38 539 678 ; C 53 ; WX 556 ; N five ; B 49 -10 489 672 ; C 54 ; WX 556 ; N six ; B 50 -13 526 714 ; C 55 ; WX 556 ; N seven ; B 70 -38 532 672 ; C 56 ; WX 556 ; N eight ; B 43 -16 507 685 ; C 57 ; WX 556 ; N nine ; B 43 -53 512 681 ; C 58 ; WX 319 ; N colon ; B 96 -10 224 482 ; C 59 ; WX 319 ; N semicolon ; B 64 -169 234 482 ; C 60 ; WX 833 ; N less ; B 128 37 704 560 ; C 61 ; WX 833 ; N equal ; B 124 175 710 421 ; C 62 ; WX 833 ; N greater ; B 129 37 704 560 ; C 63 ; WX 486 ; N question ; B 54 -9 410 683 ; C 64 ; WX 942 ; N at ; B 76 -154 871 693 ; C 65 ; WX 639 ; N A ; B -8 0 651 680 ; C 66 ; WX 604 ; N B ; B 32 0 559 672 ; C 67 ; WX 632 ; N C ; B 42 -13 588 683 ; C 68 ; WX 693 ; N D ; B 32 0 649 672 ; C 69 ; WX 576 ; N E ; B 32 0 549 672 ; C 70 ; WX 537 ; N F ; B 24 0 506 672 ; C 71 ; WX 694 ; N G ; B 42 -13 667 684 ; C 72 ; WX 738 ; N H ; B 32 0 706 672 ; C 73 ; WX 324 ; N I ; B 35 0 289 672 ; C 74 ; WX 444 ; N J ; B 12 -13 440 672 ; C 75 ; WX 611 ; N K ; B 32 0 628 672 ; C 76 ; WX 520 ; N L ; B 26 0 507 672 ; C 77 ; WX 866 ; N M ; B 30 0 835 672 ; C 78 ; WX 713 ; N N ; B 26 0 688 672 ; C 79 ; WX 731 ; N O ; B 42 -17 689 688 ; C 80 ; WX 558 ; N P ; B 24 0 532 672 ; C 81 ; WX 731 ; N Q ; B 39 -177 694 689 ; C 82 ; WX 646 ; N R ; B 32 -9 657 672 ; C 83 ; WX 556 ; N S ; B 60 -12 499 684 ; C 84 ; WX 597 ; N T ; B 15 0 582 672 ; C 85 ; WX 694 ; N U ; B 24 -12 680 672 ; C 86 ; WX 618 ; N V ; B -23 -5 638 672 ; C 87 ; WX 928 ; N W ; B 0 0 928 672 ; C 88 ; WX 600 ; N X ; B -9 0 610 672 ; C 89 ; WX 586 ; N Y ; B -14 0 607 672 ; C 90 ; WX 586 ; N Z ; B 45 0 540 672 ; C 91 ; WX 421 ; N bracketleft ; B 138 -133 376 709 ; C 92 ; WX 481 ; N backslash ; B 12 -93 502 672 ; C 93 ; WX 421 ; N bracketright ; B 45 -133 283 709 ; C 94 ; WX 1000 ; N asciicircum ; B 201 437 798 714 ; C 95 ; WX 500 ; N underscore ; B 0 -237 500 -178 ; C 96 ; WX 201 ; N quoteleft ; B 34 441 174 713 ; C 97 ; WX 507 ; N a ; B 41 -7 489 492 ; C 98 ; WX 539 ; N b ; B 8 0 504 737 ; C 99 ; WX 446 ; N c ; B 37 -7 426 491 ; C 100 ; WX 565 ; N d ; B 36 -10 531 737 ; C 101 ; WX 491 ; N e ; B 37 -10 449 491 ; C 102 ; WX 321 ; N f ; B 28 0 381 744 ; C 103 ; WX 523 ; N g ; B 39 -219 513 492 ; C 104 ; WX 564 ; N h ; B 18 0 547 737 ; C 105 ; WX 280 ; N i ; B 34 0 261 709 ; C 106 ; WX 266 ; N j ; B -79 -218 204 709 ; C 107 ; WX 517 ; N k ; B 18 0 528 737 ; C 108 ; WX 282 ; N l ; B 26 0 262 737 ; C 109 ; WX 843 ; N m ; B 30 0 826 491 ; C 110 ; WX 568 ; N n ; B 30 0 551 491 ; C 111 ; WX 539 ; N o ; B 37 -10 503 491 ; C 112 ; WX 551 ; N p ; B 23 -218 517 491 ; C 113 ; WX 531 ; N q ; B 36 -218 527 492 ; C 114 ; WX 382 ; N r ; B 29 0 377 492 ; C 115 ; WX 400 ; N s ; B 41 -10 359 492 ; C 116 ; WX 334 ; N t ; B 24 -4 323 575 ; C 117 ; WX 569 ; N u ; B 26 -10 542 491 ; C 118 ; WX 494 ; N v ; B -6 0 508 482 ; C 119 ; WX 771 ; N w ; B -3 0 772 482 ; C 120 ; WX 503 ; N x ; B 12 0 501 482 ; C 121 ; WX 495 ; N y ; B -2 -218 512 482 ; C 122 ; WX 468 ; N z ; B 45 0 431 482 ; C 123 ; WX 486 ; N braceleft ; B 64 -135 418 703 ; C 124 ; WX 500 ; N bar ; B 219 -237 282 764 ; C 125 ; WX 486 ; N braceright ; B 64 -135 418 703 ; C 126 ; WX 833 ; N asciitilde ; B 86 225 747 371 ; C 161 ; WX 338 ; N exclamdown ; B 112 -9 226 683 ; C 162 ; WX 556 ; N cent ; B 64 -98 464 602 ; C 163 ; WX 556 ; N sterling ; B 37 0 509 683 ; C 164 ; WX 167 ; N fraction ; B -162 0 328 672 ; C 165 ; WX 556 ; N yen ; B -6 0 560 672 ; C 166 ; WX 556 ; N florin ; B 6 -169 507 683 ; C 167 ; WX 500 ; N section ; B 62 -141 437 718 ; C 168 ; WX 606 ; N currency ; B 41 171 566 694 ; C 169 ; WX 170 ; N quotesingle ; B 43 421 127 715 ; C 170 ; WX 403 ; N quotedblleft ; B 34 441 376 713 ; C 171 ; WX 442 ; N guillemotleft ; B 39 67 401 413 ; C 172 ; WX 245 ; N guilsinglleft ; B 39 67 204 413 ; C 173 ; WX 245 ; N guilsinglright ; B 45 67 210 413 ; C 174 ; WX 574 ; N fi ; B 28 0 544 744 ; C 175 ; WX 579 ; N fl ; B 28 0 561 744 ; C 177 ; WX 500 ; N endash ; B 0 210 500 271 ; C 178 ; WX 500 ; N dagger ; B 17 -130 484 718 ; C 179 ; WX 500 ; N daggerdbl ; B 17 -132 484 718 ; C 180 ; WX 278 ; N periodcentered ; B 75 271 203 400 ; C 182 ; WX 484 ; N paragraph ; B 25 -79 459 672 ; C 183 ; WX 590 ; N bullet ; B 150 227 439 516 ; C 184 ; WX 201 ; N quotesinglbase ; B 31 -165 171 107 ; C 185 ; WX 403 ; N quotedblbase ; B 31 -165 372 107 ; C 186 ; WX 403 ; N quotedblright ; B 30 442 371 714 ; C 187 ; WX 442 ; N guillemotright ; B 45 67 407 413 ; C 188 ; WX 1000 ; N ellipsis ; B 102 -10 898 118 ; C 189 ; WX 1225 ; N perthousand ; B 30 -12 1194 683 ; C 191 ; WX 486 ; N questiondown ; B 60 -9 415 683 ; C 193 ; WX 500 ; N grave ; B 104 546 300 737 ; C 194 ; WX 500 ; N acute ; B 212 546 409 737 ; C 195 ; WX 500 ; N circumflex ; B 107 546 393 737 ; C 196 ; WX 500 ; N tilde ; B 97 572 403 709 ; C 197 ; WX 500 ; N macron ; B 101 607 403 668 ; C 198 ; WX 500 ; N breve ; B 108 567 392 709 ; C 199 ; WX 500 ; N dotaccent ; B 196 589 304 697 ; C 200 ; WX 500 ; N dieresis ; B 106 589 394 691 ; C 202 ; WX 500 ; N ring ; B 132 546 368 782 ; C 203 ; WX 500 ; N cedilla ; B 179 -224 368 0 ; C 205 ; WX 500 ; N hungarumlaut ; B 133 546 473 737 ; C 206 ; WX 500 ; N ogonek ; B 182 -217 330 0 ; C 207 ; WX 500 ; N caron ; B 107 545 393 736 ; C 208 ; WX 1000 ; N emdash ; B 0 210 1000 271 ; C 225 ; WX 866 ; N AE ; B -57 0 838 672 ; C 227 ; WX 380 ; N ordfeminine ; B 30 329 367 679 ; C 232 ; WX 520 ; N Lslash ; B 10 0 507 672 ; C 233 ; WX 731 ; N Oslash ; B 42 -78 689 748 ; C 234 ; WX 993 ; N OE ; B 42 -8 965 680 ; C 235 ; WX 404 ; N ordmasculine ; B 27 327 378 678 ; C 241 ; WX 725 ; N ae ; B 43 -10 683 492 ; C 245 ; WX 280 ; N dotlessi ; B 34 0 261 487 ; C 248 ; WX 282 ; N lslash ; B 4 0 300 737 ; C 249 ; WX 539 ; N oslash ; B 37 -81 503 560 ; C 250 ; WX 817 ; N oe ; B 36 -10 776 491 ; C 251 ; WX 609 ; N germandbls ; B 18 -7 581 741 ; C -1 ; WX 639 ; N Aacute ; B -8 0 651 934 ; C -1 ; WX 639 ; N Acircumflex ; B -8 0 651 934 ; C -1 ; WX 639 ; N Adieresis ; B -8 0 651 888 ; C -1 ; WX 639 ; N Agrave ; B -8 0 651 934 ; C -1 ; WX 639 ; N Aring ; B -8 0 651 963 ; C -1 ; WX 639 ; N Atilde ; B -8 0 651 906 ; C -1 ; WX 632 ; N Ccedilla ; B 42 -224 588 683 ; C -1 ; WX 576 ; N Eacute ; B 32 0 549 934 ; C -1 ; WX 576 ; N Ecircumflex ; B 32 0 549 934 ; C -1 ; WX 576 ; N Edieresis ; B 32 0 549 888 ; C -1 ; WX 576 ; N Egrave ; B 32 0 549 934 ; C -1 ; WX 324 ; N Iacute ; B 35 0 321 934 ; C -1 ; WX 324 ; N Icircumflex ; B 19 0 305 934 ; C -1 ; WX 324 ; N Idieresis ; B 18 0 306 888 ; C -1 ; WX 324 ; N Igrave ; B 16 0 289 934 ; C -1 ; WX 713 ; N Ntilde ; B 26 0 688 906 ; C -1 ; WX 731 ; N Oacute ; B 42 -17 689 934 ; C -1 ; WX 731 ; N Ocircumflex ; B 42 -17 689 934 ; C -1 ; WX 731 ; N Odieresis ; B 42 -17 689 888 ; C -1 ; WX 731 ; N Ograve ; B 42 -17 689 934 ; C -1 ; WX 731 ; N Otilde ; B 42 -17 689 906 ; C -1 ; WX 556 ; N Scaron ; B 60 -12 499 933 ; C -1 ; WX 694 ; N Uacute ; B 24 -12 680 934 ; C -1 ; WX 694 ; N Ucircumflex ; B 24 -12 680 934 ; C -1 ; WX 694 ; N Udieresis ; B 24 -12 680 888 ; C -1 ; WX 694 ; N Ugrave ; B 24 -12 680 934 ; C -1 ; WX 586 ; N Ydieresis ; B -14 0 607 888 ; C -1 ; WX 586 ; N Zcaron ; B 45 0 540 933 ; C -1 ; WX 507 ; N aacute ; B 41 -7 489 737 ; C -1 ; WX 507 ; N acircumflex ; B 41 -7 489 737 ; C -1 ; WX 507 ; N adieresis ; B 41 -7 489 691 ; C -1 ; WX 507 ; N agrave ; B 41 -7 489 737 ; C -1 ; WX 507 ; N aring ; B 41 -7 489 782 ; C -1 ; WX 507 ; N atilde ; B 41 -7 489 709 ; C -1 ; WX 446 ; N ccedilla ; B 37 -224 426 491 ; C -1 ; WX 491 ; N eacute ; B 37 -10 449 737 ; C -1 ; WX 491 ; N ecircumflex ; B 37 -10 449 737 ; C -1 ; WX 491 ; N edieresis ; B 37 -10 449 691 ; C -1 ; WX 491 ; N egrave ; B 37 -10 449 737 ; C -1 ; WX 280 ; N iacute ; B 34 0 299 737 ; C -1 ; WX 280 ; N icircumflex ; B -3 0 283 737 ; C -1 ; WX 280 ; N idieresis ; B -4 0 284 691 ; C -1 ; WX 280 ; N igrave ; B -6 0 261 737 ; C -1 ; WX 568 ; N ntilde ; B 30 0 551 709 ; C -1 ; WX 539 ; N oacute ; B 37 -10 503 737 ; C -1 ; WX 539 ; N ocircumflex ; B 37 -10 503 737 ; C -1 ; WX 539 ; N odieresis ; B 37 -10 503 691 ; C -1 ; WX 539 ; N ograve ; B 37 -10 503 737 ; C -1 ; WX 539 ; N otilde ; B 37 -10 503 709 ; C -1 ; WX 400 ; N scaron ; B 41 -10 359 736 ; C -1 ; WX 569 ; N uacute ; B 26 -10 542 737 ; C -1 ; WX 569 ; N ucircumflex ; B 26 -10 542 737 ; C -1 ; WX 569 ; N udieresis ; B 26 -10 542 691 ; C -1 ; WX 569 ; N ugrave ; B 26 -10 542 737 ; C -1 ; WX 495 ; N ydieresis ; B -2 -218 512 691 ; C -1 ; WX 468 ; N zcaron ; B 45 0 431 736 ; C -1 ; WX 822 ; N trademark ; B 118 398 716 663 ; C -1 ; WX 900 ; N copyright ; B 66 -46 838 726 ; C -1 ; WX 833 ; N logicalnot ; B 124 174 710 419 ; C -1 ; WX 900 ; N registered ; B 66 -46 838 726 ; C -1 ; WX 833 ; N minus ; B 124 269 710 328 ; C -1 ; WX 693 ; N Eth ; B 14 0 649 672 ; C -1 ; WX 558 ; N Thorn ; B 35 0 534 672 ; C -1 ; WX 586 ; N Yacute ; B -14 0 607 934 ; C -1 ; WX 500 ; N brokenbar ; B 219 -172 282 699 ; C -1 ; WX 329 ; N degree ; B 26 434 303 710 ; C -1 ; WX 833 ; N divide ; B 124 66 710 531 ; C -1 ; WX 528 ; N eth ; B 33 -11 493 734 ; C -1 ; WX 547 ; N mu ; B -39 -204 532 433 ; C -1 ; WX 833 ; N multiply ; B 146 26 691 571 ; C -1 ; WX 867 ; N onehalf ; B 59 0 836 678 ; C -1 ; WX 867 ; N onequarter ; B 59 -22 857 678 ; C -1 ; WX 367 ; N onesuperior ; B 62 268 304 679 ; C -1 ; WX 833 ; N plusminus ; B 124 20 710 577 ; C -1 ; WX 551 ; N thorn ; B 20 -218 521 737 ; C -1 ; WX 868 ; N threequarters ; B 25 -22 857 679 ; C -1 ; WX 367 ; N threesuperior ; B 26 261 325 679 ; C -1 ; WX 367 ; N twosuperior ; B 27 268 334 679 ; C -1 ; WX 495 ; N yacute ; B -2 -218 512 737 ; EndCharMetrics StartKernData StartKernPairs 271 KPX hyphen T -37 KPX hyphen V -56 KPX hyphen W -56 KPX hyphen X -37 KPX hyphen Y -74 KPX A quoteright -130 KPX A T -111 KPX A U -23 KPX A V -56 KPX A W -42 KPX A Y -42 KPX A f -19 KPX A t -19 KPX A v -32 KPX A w -46 KPX A y -23 KPX A fi -19 KPX A fl -19 KPX A quotedblright -130 KPX B hyphen 37 KPX B C 19 KPX B G 19 KPX B O 19 KPX B S 19 KPX B V -37 KPX B W -19 KPX B Y -19 KPX B Oslash 19 KPX B OE 19 KPX C quoteright 37 KPX C hyphen 23 KPX C A -19 KPX C S 19 KPX C quotedblright 37 KPX C Aring -19 KPX D hyphen 37 KPX D A -19 KPX D V -19 KPX D Y -19 KPX D Aring -19 KPX F comma -190 KPX F hyphen -93 KPX F period -190 KPX F colon -37 KPX F semicolon -37 KPX F A -97 KPX F a -79 KPX F e -65 KPX F o -65 KPX F ae -79 KPX F oslash -65 KPX F oe -65 KPX F Aring -97 KPX G hyphen 19 KPX G T -19 KPX G W -19 KPX G Y -23 KPX J A -37 KPX J Aring -37 KPX K hyphen -37 KPX K A -23 KPX K C -28 KPX K O -28 KPX K U -37 KPX K W -37 KPX K Y -28 KPX K e -19 KPX K o -19 KPX K u -19 KPX K y -28 KPX K Oslash -28 KPX K OE -28 KPX K oslash -19 KPX K oe -19 KPX K Aring -23 KPX L quoteright -241 KPX L T -83 KPX L U -19 KPX L V -120 KPX L W -88 KPX L Y -102 KPX L y -19 KPX L quotedblright -241 KPX O comma -60 KPX O hyphen 37 KPX O period -60 KPX O V -19 KPX O X -19 KPX P comma -259 KPX P hyphen -93 KPX P period -259 KPX P colon -37 KPX P semicolon -37 KPX P A -93 KPX P U -19 KPX P a -56 KPX P e -56 KPX P o -51 KPX P s -32 KPX P ae -56 KPX P oslash -51 KPX P oe -51 KPX P Aring -93 KPX Q quoteright 19 KPX Q hyphen 37 KPX Q quotedblright 19 KPX R quoteright -37 KPX R colon -19 KPX R semicolon -19 KPX R T -37 KPX R V -56 KPX R W -42 KPX R Y -51 KPX R quoteleft -37 KPX R e -37 KPX R o -37 KPX R u -37 KPX R y -46 KPX R quotedblleft -37 KPX R quotesinglbase 37 KPX R quotedblbase 37 KPX R quotedblright -37 KPX R oslash -37 KPX R oe -37 KPX T quoteright 19 KPX T comma -148 KPX T hyphen -130 KPX T period -148 KPX T colon -37 KPX T semicolon -37 KPX T A -111 KPX T T 19 KPX T quoteleft 37 KPX T a -97 KPX T c -97 KPX T e -97 KPX T i -19 KPX T o -97 KPX T r -74 KPX T s -74 KPX T u -111 KPX T w -74 KPX T y -93 KPX T quotedblleft 37 KPX T guillemotleft -37 KPX T guilsinglleft -37 KPX T quotedblright 19 KPX T ae -97 KPX T oslash -97 KPX T oe -97 KPX T Aring -111 KPX U A -32 KPX U J -28 KPX U Aring -32 KPX V quoteright 37 KPX V comma -222 KPX V hyphen -93 KPX V period -222 KPX V colon -102 KPX V semicolon -102 KPX V A -79 KPX V O -19 KPX V a -111 KPX V e -106 KPX V i -28 KPX V o -93 KPX V u -65 KPX V y -65 KPX V quotedblright 37 KPX V Oslash -19 KPX V OE -19 KPX V ae -111 KPX V oslash -93 KPX V oe -93 KPX V Aring -79 KPX W quoteright 19 KPX W comma -176 KPX W hyphen -74 KPX W period -176 KPX W colon -88 KPX W semicolon -88 KPX W A -60 KPX W a -69 KPX W e -83 KPX W i -19 KPX W o -69 KPX W r -46 KPX W u -42 KPX W y -23 KPX W quotedblright 19 KPX W ae -69 KPX W oslash -69 KPX W oe -69 KPX W Aring -60 KPX X hyphen -37 KPX X A -19 KPX X C -19 KPX X O -19 KPX X Oslash -19 KPX X OE -19 KPX X Aring -19 KPX Y comma -130 KPX Y hyphen -130 KPX Y period -130 KPX Y colon -125 KPX Y semicolon -125 KPX Y A -60 KPX Y C -19 KPX Y a -97 KPX Y e -106 KPX Y i -37 KPX Y o -97 KPX Y u -69 KPX Y ae -97 KPX Y oslash -97 KPX Y oe -97 KPX Y Aring -60 KPX quoteleft A -130 KPX quoteleft J -167 KPX quoteleft AE -111 KPX quoteleft Aring -130 KPX f quoteright 74 KPX f comma -37 KPX f hyphen -19 KPX f period -37 KPX f quotedblright 74 KPX r comma -111 KPX r period -111 KPX v comma -120 KPX v period -120 KPX w comma -120 KPX w period -120 KPX y comma -134 KPX y period -134 KPX quotedblleft A -130 KPX quotedblleft J -167 KPX quotedblleft AE -111 KPX quotedblleft Aring -130 KPX AE hyphen 19 KPX Lslash quoteright -241 KPX Lslash T -83 KPX Lslash U -19 KPX Lslash V -120 KPX Lslash W -88 KPX Lslash Y -102 KPX Lslash y -19 KPX Lslash quotedblright -241 KPX Oslash comma -60 KPX Oslash hyphen 37 KPX Oslash period -60 KPX Oslash V -19 KPX Oslash X -19 KPX Aring quoteright -130 KPX Aring T -111 KPX Aring U -23 KPX Aring V -56 KPX Aring W -42 KPX Aring Y -42 KPX Aring f -19 KPX Aring t -19 KPX Aring v -32 KPX Aring w -46 KPX Aring y -23 KPX Aring fi -19 KPX Aring fl -19 KPX Aring quotedblright -130 KPX Eth hyphen 37 KPX Eth A -19 KPX Eth V -19 KPX Eth Y -19 KPX Eth Aring -19 EndKernPairs StartTrackKern 3 TrackKern -1 6 0.10 144 -2.09 TrackKern -2 6 0.05 144 -4.02 TrackKern -3 6 0.00 144 -5.96 EndTrackKern EndKernData EndFontMetrics xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/afm/README0000664000175000017500000000174211742726711022233 0ustar uwabamiuwabamiThis is a copy of the Charter fonts which Bitstream contributed to the X consortium, arranged for use with TeX. Here is the copyright notice: (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA. You are hereby granted permission under all Bitstream propriety rights to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts for any purpose and without restriction; provided, that this notice is left intact on all copies of such fonts and that Bitstream's trademark is acknowledged as shown below on all unmodified copies of the 4 Charter Type 1 fonts. BITSTREAM CHARTER is a registered trademark of Bitstream Inc. I used the `afm2tfm' program which comes with Tom Rokicki's dvips to convert the AFM files to TFM and VF files. You can get dvips from labrea.stanford.edu. karl@cs.umb.edu Member of the League for Programming Freedom---write to lpf@uunet.uu.net. xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/afm/bchri.afm0000664000175000017500000004672711742726711023143 0ustar uwabamiuwabamiStartFontMetrics 2.0 Comment Bitstream AFM Data Comment Copyright 1987-1990 as an unpublished work by Bitstream Inc., Cambridge, MA. Comment All rights reserved Comment Confidential and proprietary to Bitstream Inc. Comment Bitstream is a registered trademark of Bitstream Inc. Comment bitsClassification Transitional 801 Comment bitsFontID 0649 Comment bitsManufacturingDate Tue Nov 6 02:55:16 1990 Comment bitsLayoutName clayout.adobe.text228.new Comment UniqueID 15530649 FontName CharterBT-Italic FullName Bitstream Charter Italic FamilyName Bitstream Charter Weight Normal ItalicAngle 11.0000 IsFixedPitch false FontBBox -226 -237 1175 980 UnderlinePosition -109 UnderlineThickness 61 Version 1.0 [UFO] Notice Copyright 1987-1990 as an unpublished work by Bitstream Inc. All rights reserved. Confidential. EncodingScheme AdobeStandardEncoding CapHeight 672 XHeight 486 Ascender 737 Descender -218 StartCharMetrics 228 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 338 ; N exclam ; B 63 -9 281 683 ; C 34 ; WX 331 ; N quotedbl ; B 43 421 288 715 ; C 35 ; WX 745 ; N numbersign ; B 63 -24 681 710 ; C 36 ; WX 556 ; N dollar ; B 21 -102 514 744 ; C 37 ; WX 852 ; N percent ; B 49 -12 802 683 ; C 38 ; WX 704 ; N ampersand ; B 19 -12 665 684 ; C 39 ; WX 201 ; N quoteright ; B 51 442 227 714 ; C 40 ; WX 419 ; N parenleft ; B 79 -142 460 718 ; C 41 ; WX 419 ; N parenright ; B -67 -142 313 718 ; C 42 ; WX 500 ; N asterisk ; B 98 337 492 718 ; C 43 ; WX 833 ; N plus ; B 124 0 710 597 ; C 44 ; WX 278 ; N comma ; B -58 -169 149 107 ; C 45 ; WX 319 ; N hyphen ; B 22 207 260 275 ; C 46 ; WX 278 ; N period ; B 25 -6 145 114 ; C 47 ; WX 481 ; N slash ; B -111 -93 525 672 ; C 48 ; WX 556 ; N zero ; B 27 -12 528 683 ; C 49 ; WX 556 ; N one ; B 82 0 405 683 ; C 50 ; WX 556 ; N two ; B -22 0 518 684 ; C 51 ; WX 556 ; N three ; B 0 -12 512 684 ; C 52 ; WX 556 ; N four ; B -1 -38 524 678 ; C 53 ; WX 556 ; N five ; B 3 -13 519 672 ; C 54 ; WX 556 ; N six ; B 31 -13 501 716 ; C 55 ; WX 556 ; N seven ; B 44 -38 596 672 ; C 56 ; WX 556 ; N eight ; B 18 -18 518 685 ; C 57 ; WX 556 ; N nine ; B 28 -56 523 684 ; C 58 ; WX 319 ; N colon ; B 46 -6 235 478 ; C 59 ; WX 319 ; N semicolon ; B -33 -169 235 478 ; C 60 ; WX 833 ; N less ; B 128 37 704 560 ; C 61 ; WX 833 ; N equal ; B 124 175 710 421 ; C 62 ; WX 833 ; N greater ; B 129 37 704 560 ; C 63 ; WX 486 ; N question ; B 94 -9 446 683 ; C 64 ; WX 942 ; N at ; B 76 -154 871 693 ; C 65 ; WX 606 ; N A ; B -79 0 585 677 ; C 66 ; WX 588 ; N B ; B -29 0 543 672 ; C 67 ; WX 604 ; N C ; B 41 -12 622 683 ; C 68 ; WX 671 ; N D ; B -28 0 623 672 ; C 69 ; WX 546 ; N E ; B -25 0 554 672 ; C 70 ; WX 509 ; N F ; B -27 0 540 671 ; C 71 ; WX 664 ; N G ; B 39 -12 650 684 ; C 72 ; WX 712 ; N H ; B -29 0 741 672 ; C 73 ; WX 312 ; N I ; B -23 0 333 672 ; C 74 ; WX 447 ; N J ; B -43 -12 472 672 ; C 75 ; WX 625 ; N K ; B -30 -5 660 672 ; C 76 ; WX 498 ; N L ; B -29 0 453 672 ; C 77 ; WX 839 ; N M ; B -28 0 868 672 ; C 78 ; WX 683 ; N N ; B -31 0 720 672 ; C 79 ; WX 708 ; N O ; B 40 -13 669 683 ; C 80 ; WX 542 ; N P ; B -29 0 543 672 ; C 81 ; WX 708 ; N Q ; B 40 -160 700 682 ; C 82 ; WX 602 ; N R ; B -30 -6 591 671 ; C 83 ; WX 537 ; N S ; B 9 -13 511 683 ; C 84 ; WX 565 ; N T ; B 43 0 610 672 ; C 85 ; WX 664 ; N U ; B 64 -12 705 672 ; C 86 ; WX 590 ; N V ; B 30 -6 649 672 ; C 87 ; WX 898 ; N W ; B 51 0 952 672 ; C 88 ; WX 569 ; N X ; B -83 0 633 672 ; C 89 ; WX 562 ; N Y ; B 31 0 642 672 ; C 90 ; WX 556 ; N Z ; B -26 0 572 672 ; C 91 ; WX 421 ; N bracketleft ; B 49 -133 448 709 ; C 92 ; WX 481 ; N backslash ; B 34 -93 489 672 ; C 93 ; WX 421 ; N bracketright ; B -45 -133 354 709 ; C 94 ; WX 1000 ; N asciicircum ; B 201 437 798 714 ; C 95 ; WX 500 ; N underscore ; B 0 -237 500 -178 ; C 96 ; WX 201 ; N quoteleft ; B 70 441 247 713 ; C 97 ; WX 525 ; N a ; B 17 -9 488 483 ; C 98 ; WX 507 ; N b ; B 24 -10 453 737 ; C 99 ; WX 394 ; N c ; B 14 -10 370 486 ; C 100 ; WX 523 ; N d ; B 20 -9 501 737 ; C 101 ; WX 424 ; N e ; B 20 -10 378 483 ; C 102 ; WX 292 ; N f ; B -151 -216 404 733 ; C 103 ; WX 481 ; N g ; B -31 -218 480 483 ; C 104 ; WX 551 ; N h ; B 23 -6 505 737 ; C 105 ; WX 287 ; N i ; B 32 -7 255 705 ; C 106 ; WX 269 ; N j ; B -128 -216 249 701 ; C 107 ; WX 514 ; N k ; B 25 -6 494 737 ; C 108 ; WX 275 ; N l ; B 35 -10 241 737 ; C 109 ; WX 815 ; N m ; B 31 -6 773 483 ; C 110 ; WX 556 ; N n ; B 32 -7 515 483 ; C 111 ; WX 502 ; N o ; B 21 -9 450 483 ; C 112 ; WX 516 ; N p ; B -70 -218 461 483 ; C 113 ; WX 512 ; N q ; B 24 -218 463 488 ; C 114 ; WX 398 ; N r ; B 27 0 400 482 ; C 115 ; WX 370 ; N s ; B -17 -9 324 483 ; C 116 ; WX 333 ; N t ; B 43 -7 337 580 ; C 117 ; WX 553 ; N u ; B 30 -9 513 483 ; C 118 ; WX 454 ; N v ; B -9 -2 435 484 ; C 119 ; WX 713 ; N w ; B -1 0 689 485 ; C 120 ; WX 477 ; N x ; B -47 -9 495 486 ; C 121 ; WX 475 ; N y ; B -113 -218 485 485 ; C 122 ; WX 440 ; N z ; B -15 -12 434 490 ; C 123 ; WX 486 ; N braceleft ; B 64 -135 418 703 ; C 124 ; WX 500 ; N bar ; B 219 -237 282 764 ; C 125 ; WX 486 ; N braceright ; B 64 -135 418 703 ; C 126 ; WX 833 ; N asciitilde ; B 86 225 747 371 ; C 161 ; WX 338 ; N exclamdown ; B 60 -9 278 683 ; C 162 ; WX 556 ; N cent ; B 41 -98 492 602 ; C 163 ; WX 556 ; N sterling ; B -22 0 547 683 ; C 164 ; WX 167 ; N fraction ; B -226 0 392 672 ; C 165 ; WX 556 ; N yen ; B 2 0 616 665 ; C 166 ; WX 556 ; N florin ; B -81 -169 563 683 ; C 167 ; WX 500 ; N section ; B 3 -141 475 718 ; C 168 ; WX 606 ; N currency ; B 41 171 566 694 ; C 169 ; WX 170 ; N quotesingle ; B 43 421 127 715 ; C 170 ; WX 403 ; N quotedblleft ; B 70 441 448 713 ; C 171 ; WX 442 ; N guillemotleft ; B 13 67 416 413 ; C 172 ; WX 245 ; N guilsinglleft ; B 13 67 218 413 ; C 173 ; WX 245 ; N guilsinglright ; B -7 67 199 413 ; C 174 ; WX 574 ; N fi ; B -151 -216 547 733 ; C 175 ; WX 579 ; N fl ; B -151 -216 544 737 ; C 177 ; WX 500 ; N endash ; B -25 210 488 271 ; C 178 ; WX 500 ; N dagger ; B 45 -130 512 718 ; C 179 ; WX 500 ; N daggerdbl ; B -27 -132 512 718 ; C 180 ; WX 278 ; N periodcentered ; B 79 276 199 396 ; C 182 ; WX 484 ; N paragraph ; B 25 -79 459 672 ; C 183 ; WX 590 ; N bullet ; B 150 227 439 516 ; C 184 ; WX 201 ; N quotesinglbase ; B -65 -165 111 107 ; C 185 ; WX 403 ; N quotedblbase ; B -65 -165 313 107 ; C 186 ; WX 403 ; N quotedblright ; B 51 442 429 714 ; C 187 ; WX 442 ; N guillemotright ; B -7 67 397 413 ; C 188 ; WX 1000 ; N ellipsis ; B 52 -6 840 114 ; C 189 ; WX 1225 ; N perthousand ; B 49 -12 1175 683 ; C 191 ; WX 486 ; N questiondown ; B 27 -9 379 683 ; C 193 ; WX 500 ; N grave ; B 181 546 341 737 ; C 194 ; WX 500 ; N acute ; B 252 546 485 737 ; C 195 ; WX 500 ; N circumflex ; B 148 546 433 737 ; C 196 ; WX 500 ; N tilde ; B 143 572 474 709 ; C 197 ; WX 500 ; N macron ; B 154 614 465 667 ; C 198 ; WX 500 ; N breve ; B 177 567 464 709 ; C 199 ; WX 500 ; N dotaccent ; B 248 584 361 697 ; C 200 ; WX 500 ; N dieresis ; B 163 589 452 692 ; C 202 ; WX 500 ; N ring ; B 209 557 426 774 ; C 203 ; WX 500 ; N cedilla ; B 61 -224 267 0 ; C 205 ; WX 500 ; N hungarumlaut ; B 175 546 569 737 ; C 206 ; WX 500 ; N ogonek ; B 90 -217 235 0 ; C 207 ; WX 500 ; N caron ; B 184 545 470 736 ; C 208 ; WX 1000 ; N emdash ; B -19 210 991 271 ; C 225 ; WX 873 ; N AE ; B -115 0 879 672 ; C 227 ; WX 394 ; N ordfeminine ; B 12 325 366 671 ; C 232 ; WX 498 ; N Lslash ; B -29 0 453 672 ; C 233 ; WX 708 ; N Oslash ; B 41 -74 669 744 ; C 234 ; WX 1007 ; N OE ; B 40 -13 1004 682 ; C 235 ; WX 377 ; N ordmasculine ; B 15 325 338 671 ; C 241 ; WX 671 ; N ae ; B 1 -10 628 483 ; C 245 ; WX 287 ; N dotlessi ; B 32 -7 255 483 ; C 248 ; WX 275 ; N lslash ; B -14 -10 293 737 ; C 249 ; WX 502 ; N oslash ; B 22 -80 450 548 ; C 250 ; WX 750 ; N oe ; B 21 -9 704 483 ; C 251 ; WX 574 ; N germandbls ; B -151 -216 522 739 ; C -1 ; WX 606 ; N Aacute ; B -79 0 585 930 ; C -1 ; WX 606 ; N Acircumflex ; B -79 0 585 930 ; C -1 ; WX 606 ; N Adieresis ; B -79 0 585 885 ; C -1 ; WX 606 ; N Agrave ; B -79 0 585 930 ; C -1 ; WX 606 ; N Aring ; B -79 0 585 980 ; C -1 ; WX 606 ; N Atilde ; B -79 0 585 902 ; C -1 ; WX 604 ; N Ccedilla ; B 41 -224 622 683 ; C -1 ; WX 546 ; N Eacute ; B -25 0 554 930 ; C -1 ; WX 546 ; N Ecircumflex ; B -25 0 554 930 ; C -1 ; WX 546 ; N Edieresis ; B -25 0 554 885 ; C -1 ; WX 546 ; N Egrave ; B -25 0 554 930 ; C -1 ; WX 312 ; N Iacute ; B -23 0 418 930 ; C -1 ; WX 312 ; N Icircumflex ; B -23 0 366 930 ; C -1 ; WX 312 ; N Idieresis ; B -23 0 385 885 ; C -1 ; WX 312 ; N Igrave ; B -23 0 333 930 ; C -1 ; WX 683 ; N Ntilde ; B -31 0 720 902 ; C -1 ; WX 708 ; N Oacute ; B 40 -13 669 930 ; C -1 ; WX 708 ; N Ocircumflex ; B 40 -13 669 930 ; C -1 ; WX 708 ; N Odieresis ; B 40 -13 669 885 ; C -1 ; WX 708 ; N Ograve ; B 40 -13 669 930 ; C -1 ; WX 708 ; N Otilde ; B 40 -13 669 902 ; C -1 ; WX 537 ; N Scaron ; B 9 -13 516 929 ; C -1 ; WX 664 ; N Uacute ; B 64 -12 705 930 ; C -1 ; WX 664 ; N Ucircumflex ; B 64 -12 705 930 ; C -1 ; WX 664 ; N Udieresis ; B 64 -12 705 885 ; C -1 ; WX 664 ; N Ugrave ; B 64 -12 705 930 ; C -1 ; WX 562 ; N Ydieresis ; B 31 0 642 885 ; C -1 ; WX 556 ; N Zcaron ; B -26 0 572 929 ; C -1 ; WX 525 ; N aacute ; B 17 -9 498 737 ; C -1 ; WX 525 ; N acircumflex ; B 17 -9 488 737 ; C -1 ; WX 525 ; N adieresis ; B 17 -9 488 692 ; C -1 ; WX 525 ; N agrave ; B 17 -9 488 737 ; C -1 ; WX 525 ; N aring ; B 17 -9 488 762 ; C -1 ; WX 525 ; N atilde ; B 17 -9 488 709 ; C -1 ; WX 394 ; N ccedilla ; B 8 -224 370 486 ; C -1 ; WX 424 ; N eacute ; B 20 -10 460 737 ; C -1 ; WX 424 ; N ecircumflex ; B 20 -10 408 737 ; C -1 ; WX 424 ; N edieresis ; B 20 -10 427 692 ; C -1 ; WX 424 ; N egrave ; B 20 -10 378 737 ; C -1 ; WX 287 ; N iacute ; B 32 -7 379 737 ; C -1 ; WX 287 ; N icircumflex ; B 32 -7 327 737 ; C -1 ; WX 287 ; N idieresis ; B 32 -7 346 692 ; C -1 ; WX 287 ; N igrave ; B 32 -7 255 737 ; C -1 ; WX 556 ; N ntilde ; B 32 -7 515 709 ; C -1 ; WX 502 ; N oacute ; B 21 -9 486 737 ; C -1 ; WX 502 ; N ocircumflex ; B 21 -9 450 737 ; C -1 ; WX 502 ; N odieresis ; B 21 -9 453 692 ; C -1 ; WX 502 ; N ograve ; B 21 -9 450 737 ; C -1 ; WX 502 ; N otilde ; B 21 -9 475 709 ; C -1 ; WX 370 ; N scaron ; B -17 -9 405 736 ; C -1 ; WX 553 ; N uacute ; B 30 -9 513 737 ; C -1 ; WX 553 ; N ucircumflex ; B 30 -9 513 737 ; C -1 ; WX 553 ; N udieresis ; B 30 -9 513 692 ; C -1 ; WX 553 ; N ugrave ; B 30 -9 513 737 ; C -1 ; WX 475 ; N ydieresis ; B -113 -218 485 692 ; C -1 ; WX 440 ; N zcaron ; B -15 -12 440 736 ; C -1 ; WX 822 ; N trademark ; B 118 398 716 663 ; C -1 ; WX 900 ; N copyright ; B 66 -46 838 726 ; C -1 ; WX 833 ; N logicalnot ; B 124 174 710 419 ; C -1 ; WX 900 ; N registered ; B 66 -46 838 726 ; C -1 ; WX 833 ; N minus ; B 124 269 710 328 ; C -1 ; WX 671 ; N Eth ; B -28 0 624 672 ; C -1 ; WX 532 ; N Thorn ; B -30 0 518 672 ; C -1 ; WX 562 ; N Yacute ; B 31 0 642 930 ; C -1 ; WX 500 ; N brokenbar ; B 219 -172 282 699 ; C -1 ; WX 329 ; N degree ; B 26 434 303 710 ; C -1 ; WX 833 ; N divide ; B 124 66 710 531 ; C -1 ; WX 500 ; N eth ; B 21 -9 464 726 ; C -1 ; WX 547 ; N mu ; B -39 -204 532 433 ; C -1 ; WX 833 ; N multiply ; B 146 26 691 571 ; C -1 ; WX 867 ; N onehalf ; B 51 0 844 678 ; C -1 ; WX 867 ; N onequarter ; B 51 -22 848 678 ; C -1 ; WX 367 ; N onesuperior ; B 54 268 267 679 ; C -1 ; WX 833 ; N plusminus ; B 124 20 710 577 ; C -1 ; WX 516 ; N thorn ; B -70 -218 461 737 ; C -1 ; WX 868 ; N threequarters ; B 0 -22 848 679 ; C -1 ; WX 367 ; N threesuperior ; B 0 261 338 679 ; C -1 ; WX 367 ; N twosuperior ; B -15 268 342 679 ; C -1 ; WX 475 ; N yacute ; B -113 -218 485 737 ; EndCharMetrics StartKernData StartKernPairs 280 KPX hyphen T -37 KPX hyphen V -56 KPX hyphen W -56 KPX hyphen X -37 KPX hyphen Y -74 KPX A quoteright -130 KPX A colon 19 KPX A semicolon 19 KPX A S 19 KPX A T -37 KPX A U -23 KPX A V -56 KPX A W -42 KPX A Y -42 KPX A y -19 KPX A quotedblright -130 KPX B hyphen 56 KPX B S 19 KPX B V -19 KPX B W -19 KPX B Y -19 KPX C quoteright 37 KPX C hyphen 23 KPX C S 19 KPX C quotedblright 37 KPX D hyphen 37 KPX D A -19 KPX D V -19 KPX D W -19 KPX D Y -28 KPX D Aring -19 KPX F comma -167 KPX F hyphen -56 KPX F period -167 KPX F colon -37 KPX F semicolon -37 KPX F A -32 KPX F a -42 KPX F e -46 KPX F o -46 KPX F ae -42 KPX F oslash -46 KPX F oe -46 KPX F Aring -32 KPX G hyphen 19 KPX J A -23 KPX J Aring -23 KPX K hyphen -37 KPX K A -23 KPX K C -28 KPX K O -28 KPX K U -37 KPX K W -42 KPX K Y -32 KPX K a -19 KPX K e -56 KPX K o -56 KPX K u -56 KPX K y -83 KPX K Oslash -28 KPX K OE -28 KPX K ae -19 KPX K oslash -56 KPX K oe -56 KPX K Aring -23 KPX L quoteright -185 KPX L hyphen 56 KPX L A 19 KPX L T -74 KPX L U -19 KPX L V -102 KPX L W -88 KPX L Y -88 KPX L u -19 KPX L y -37 KPX L quotesinglbase 19 KPX L quotedblbase 19 KPX L quotedblright -185 KPX L Aring 19 KPX O comma -37 KPX O hyphen 19 KPX O period -37 KPX O V -19 KPX O X -19 KPX O Y -19 KPX P comma -250 KPX P hyphen -74 KPX P period -250 KPX P colon -19 KPX P semicolon -19 KPX P A -56 KPX P U -19 KPX P W -19 KPX P Y -19 KPX P a -37 KPX P e -56 KPX P o -51 KPX P s -32 KPX P ae -37 KPX P oslash -51 KPX P oe -51 KPX P Aring -56 KPX Q quoteright 19 KPX Q hyphen 19 KPX Q quotedblright 19 KPX R quoteright -37 KPX R comma 19 KPX R hyphen -19 KPX R period 19 KPX R T -19 KPX R V -19 KPX R W -23 KPX R Y -37 KPX R quoteleft -19 KPX R a -19 KPX R e -19 KPX R o -19 KPX R y -19 KPX R quotedblleft -19 KPX R quotedblright -37 KPX R ae -19 KPX R oslash -19 KPX R oe -19 KPX S A 37 KPX S G 19 KPX S O 19 KPX S Q 19 KPX S S 19 KPX S Oslash 19 KPX S OE 19 KPX S Aring 37 KPX T comma -148 KPX T hyphen -130 KPX T period -148 KPX T colon -37 KPX T semicolon -37 KPX T A -56 KPX T T 19 KPX T a -116 KPX T c -97 KPX T e -97 KPX T i -19 KPX T o -116 KPX T r -74 KPX T s -93 KPX T u -93 KPX T w -93 KPX T y -74 KPX T ae -116 KPX T oslash -116 KPX T oe -116 KPX T Aring -56 KPX U A -28 KPX U J -19 KPX U Z -19 KPX U Aring -28 KPX V comma -185 KPX V hyphen -56 KPX V period -185 KPX V colon -93 KPX V semicolon -93 KPX V A -79 KPX V O -19 KPX V a -93 KPX V e -93 KPX V i -28 KPX V o -60 KPX V u -32 KPX V y -46 KPX V Oslash -19 KPX V OE -19 KPX V ae -93 KPX V oslash -60 KPX V oe -60 KPX V Aring -79 KPX W comma -134 KPX W hyphen -37 KPX W period -134 KPX W colon -28 KPX W semicolon -28 KPX W A -28 KPX W a -51 KPX W e -74 KPX W i -19 KPX W o -51 KPX W r -28 KPX W u -28 KPX W y -23 KPX W ae -51 KPX W oslash -51 KPX W oe -51 KPX W Aring -28 KPX X hyphen -19 KPX X A -19 KPX X Aring -19 KPX Y comma -130 KPX Y hyphen -111 KPX Y period -130 KPX Y colon -106 KPX Y semicolon -106 KPX Y A -46 KPX Y a -116 KPX Y e -116 KPX Y i -19 KPX Y o -97 KPX Y u -56 KPX Y ae -116 KPX Y oslash -97 KPX Y oe -97 KPX Y Aring -46 KPX Z hyphen 37 KPX quoteleft A -130 KPX quoteleft J -130 KPX quoteleft V 19 KPX quoteleft AE -111 KPX quoteleft Aring -130 KPX f quoteright 93 KPX f comma -83 KPX f hyphen -19 KPX f period -83 KPX f quotedblright 93 KPX r comma -130 KPX r hyphen -19 KPX r period -130 KPX v comma -46 KPX v hyphen 37 KPX v period -46 KPX w comma -56 KPX w hyphen 19 KPX w period -56 KPX y comma -60 KPX y hyphen 19 KPX y period -60 KPX quotedblleft A -130 KPX quotedblleft J -130 KPX quotedblleft V 19 KPX quotedblleft AE -111 KPX quotedblleft Aring -130 KPX AE hyphen 19 KPX Lslash quoteright -185 KPX Lslash hyphen 56 KPX Lslash A 19 KPX Lslash T -74 KPX Lslash U -19 KPX Lslash V -102 KPX Lslash W -88 KPX Lslash Y -88 KPX Lslash u -19 KPX Lslash y -37 KPX Lslash quotesinglbase 19 KPX Lslash quotedblbase 19 KPX Lslash quotedblright -185 KPX Lslash Aring 19 KPX Oslash comma -37 KPX Oslash hyphen 19 KPX Oslash period -37 KPX Oslash V -19 KPX Oslash X -19 KPX Oslash Y -19 KPX Aring quoteright -130 KPX Aring colon 19 KPX Aring semicolon 19 KPX Aring S 19 KPX Aring T -37 KPX Aring U -23 KPX Aring V -56 KPX Aring W -42 KPX Aring Y -42 KPX Aring y -19 KPX Aring quotedblright -130 KPX Eth hyphen 37 KPX Eth A -19 KPX Eth V -19 KPX Eth W -19 KPX Eth Y -28 KPX Eth Aring -19 KPX Thorn quoteright -37 KPX Thorn comma -148 KPX Thorn period -148 KPX Thorn quotedblright -37 EndKernPairs StartTrackKern 3 TrackKern -1 6 0.10 144 -2.09 TrackKern -2 6 0.05 144 -4.02 TrackKern -3 6 0.00 144 -5.96 EndTrackKern EndKernData EndFontMetrics xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/afm/dcti10.afm0000664000175000017500000016712211742726711023131 0ustar uwabamiuwabamiStartFontMetrics 2.0 FontName dcti10 FullName dcti10 FamilyName dcti10 Weight Medium ItalicAngle 0.000000 IsFixedPitch false UnderlinePosition -133 UnderlineThickness 20 Version 1.0\(Level-B\) FontBBox -61, -250, 1119, 913 Notice Copyright \(C\) 1994, Basil K. Malyshev. All Rights Reserved.\nBaKoMa Fonts Collection, Level-B. EncodingScheme FontSpecific CapHeight 683 XHeight 430 Descender -194 Ascender 694 StartCharMetrics 256 C 0 ; WX 511 ; N grave ; B 265 503 407 696 ; C 1 ; WX 511 ; N acute ; B 313 503 525 696 ; C 2 ; WX 511 ; N circumflex ; B 238 533 498 694 ; C 3 ; WX 511 ; N tilde ; B 221 564 546 668 ; C 4 ; WX 511 ; N dieresis ; B 242 565 526 669 ; C 5 ; WX 511 ; N hungarumlaut ; B 241 504 550 697 ; C 6 ; WX 831.11 ; N ring ; B 435 540 630 716 ; C 7 ; WX 511 ; N caron ; B 253 505 512 633 ; C 8 ; WX 511 ; N breve ; B 254 520 541 694 ; C 9 ; WX 511 ; N macron ; B 206 555 540 589 ; C 10 ; WX 306.61 ; N dotaccent ; B 225 559 337 669 ; C 11 ; WX 459.89 ; N cedilla ; B 73 -194 312 0 ; C 12 ; WX 306.61 ; N ogonek ; B -16 -181 192 23 ; C 13 ; WX 306.61 ; N quotesinglbase ; B 63 -194 217 110 ; C 14 ; WX 459.89 ; N guilsinglleft ; B 147 26 417 457 ; C 15 ; WX 459.89 ; N guilsinglright ; B 96 26 392 457 ; C 16 ; WX 514.33 ; N quotedblleft ; B 239 390 583 694 ; C 17 ; WX 514.33 ; N quotedblright ; B 150 390 494 694 ; C 18 ; WX 514.33 ; N quotedblbase ; B 95 -194 439 110 ; C 19 ; WX 664.28 ; N guillemotleft ; B 147 26 621 457 ; C 20 ; WX 664.28 ; N guillemotright ; B 96 26 596 457 ; C 21 ; WX 511 ; N endash ; B 66 253 526 279 ; L hyphen emdash ; C 22 ; WX 1022 ; N emdash ; B 66 253 985 279 ; C 23 ; WX 0 ; N compoundwordmark ; B 0 0 0 0 ; C 24 ; WX 408.78 ; N perthousand ; B 78 -56 353 347 ; C 25 ; WX 306.61 ; N dotlessi ; B 55 -11 308 441 ; C 26 ; WX 332.17 ; N dotlessj ; B -61 -205 296 441 ; C 27 ; WX 613.17 ; N ff ; B -51 -205 732 705 ; L i ffi ; L l ffl ; C 28 ; WX 562.11 ; N fi ; B -51 -205 571 705 ; C 29 ; WX 587.61 ; N fl ; B -51 -205 613 705 ; C 30 ; WX 881.44 ; N ffi ; B -51 -205 890 705 ; C 31 ; WX 894.22 ; N ffl ; B -51 -205 919 705 ; C 32 ; WX 511 ; N visiblespace ; B 13 -107 482 252 ; C 33 ; WX 306.61 ; N exclam ; B 85 0 350 716 ; C 34 ; WX 511 ; N quotedbl ; B 226 338 517 706 ; C 35 ; WX 817.56 ; N numbersign ; B 89 -194 802 694 ; C 36 ; WX 511 ; N dollar ; B 89 -56 546 750 ; C 37 ; WX 817.56 ; N percent ; B 119 -56 821 750 ; C 38 ; WX 766.5 ; N ampersand ; B 101 -22 776 716 ; C 39 ; WX 306.61 ; N quoteright ; B 192 390 349 694 ; L quoteright quotedblright ; C 40 ; WX 408.78 ; N parenleft ; B 124 -250 491 750 ; C 41 ; WX 408.78 ; N parenright ; B -9 -250 358 750 ; C 42 ; WX 511 ; N asterisk ; B 169 320 558 750 ; C 43 ; WX 766.5 ; N plus ; B 114 -57 726 557 ; C 44 ; WX 306.61 ; N comma ; B 46 -194 200 110 ; L comma quotedblbase ; C 45 ; WX 357.67 ; N hyphen ; B 59 185 314 245 ; L hyphen endash ; C 46 ; WX 306.61 ; N period ; B 85 0 198 110 ; C 47 ; WX 511 ; N slash ; B -8 -250 592 750 ; C 48 ; WX 511 ; N zero ; B 89 -22 530 666 ; C 49 ; WX 511 ; N one ; B 89 0 437 666 ; C 50 ; WX 511 ; N two ; B 56 -22 525 666 ; C 51 ; WX 511 ; N three ; B 69 -22 536 666 ; C 52 ; WX 511 ; N four ; B 18 -194 449 666 ; C 53 ; WX 511 ; N five ; B 81 -22 541 666 ; C 54 ; WX 511 ; N six ; B 94 -22 541 666 ; C 55 ; WX 511 ; N seven ; B 116 -22 602 666 ; C 56 ; WX 511 ; N eight ; B 71 -22 528 666 ; C 57 ; WX 511 ; N nine ; B 79 -22 527 666 ; C 58 ; WX 306.61 ; N colon ; B 85 0 278 430 ; C 59 ; WX 306.61 ; N semicolon ; B 46 -194 278 430 ; C 60 ; WX 766.5 ; N less ; B 140 -33 767 533 ; L less guillemotleft ; C 61 ; WX 766.5 ; N equal ; B 89 140 749 360 ; C 62 ; WX 766.5 ; N greater ; B 72 -33 700 533 ; L greater guillemotright ; C 63 ; WX 511 ; N question ; B 168 0 525 716 ; C 64 ; WX 766.5 ; N at ; B 125 -11 762 705 ; C 65 ; WX 743.17 ; N A ; B 18 0 653 716 ; C 66 ; WX 703.72 ; N B ; B 22 0 694 683 ; C 67 ; WX 715.39 ; N C ; B 124 -22 786 705 ; C 68 ; WX 754.83 ; N D ; B 20 0 735 683 ; C 69 ; WX 678.17 ; N E ; B 19 0 703 680 ; C 70 ; WX 652.61 ; N F ; B 19 0 691 680 ; C 71 ; WX 773.44 ; N G ; B 124 -22 786 705 ; C 72 ; WX 743.17 ; N H ; B 19 0 814 683 ; C 73 ; WX 385.44 ; N I ; B 14 0 462 683 ; C 74 ; WX 524.89 ; N J ; B 64 -22 596 683 ; C 75 ; WX 768.72 ; N K ; B 19 0 820 683 ; C 76 ; WX 627.06 ; N L ; B 19 0 586 683 ; C 77 ; WX 896.44 ; N M ; B 23 0 963 683 ; C 78 ; WX 743.17 ; N N ; B 19 0 814 683 ; C 79 ; WX 766.5 ; N O ; B 122 -22 761 705 ; C 80 ; WX 678.17 ; N P ; B 20 0 690 683 ; C 81 ; WX 766.5 ; N Q ; B 122 -194 761 705 ; C 82 ; WX 729.28 ; N R ; B 20 -22 683 683 ; C 83 ; WX 562.11 ; N S ; B 48 -22 607 705 ; C 84 ; WX 715.39 ; N T ; B 148 0 780 677 ; C 85 ; WX 743.17 ; N U ; B 160 -22 814 683 ; C 86 ; WX 743.17 ; N V ; B 168 -22 828 683 ; C 87 ; WX 998.67 ; N W ; B 167 -22 1085 683 ; C 88 ; WX 743.17 ; N X ; B 10 0 785 683 ; C 89 ; WX 743.17 ; N Y ; B 161 0 835 683 ; C 90 ; WX 613.17 ; N Z ; B 53 0 678 683 ; C 91 ; WX 306.61 ; N bracketleft ; B 34 -250 420 750 ; C 92 ; WX 511 ; N backslash ; B 235 -250 349 750 ; C 93 ; WX 306.61 ; N bracketright ; B -40 -250 346 750 ; C 94 ; WX 613.17 ; N asciicircum ; B 219 457 580 628 ; C 95 ; WX 766.5 ; N underscore ; B 24 -233 584 -193 ; C 96 ; WX 306.61 ; N quoteleft ; B 178 390 335 694 ; L quoteleft quotedblleft ; C 97 ; WX 511 ; N a ; B 81 -11 512 441 ; C 98 ; WX 459.89 ; N b ; B 87 -11 435 694 ; C 99 ; WX 459.89 ; N c ; B 82 -11 444 441 ; C 100 ; WX 511 ; N d ; B 81 -11 536 694 ; C 101 ; WX 459.89 ; N e ; B 86 -11 442 441 ; C 102 ; WX 306.61 ; N f ; B -51 -205 426 705 ; L i fi ; L f ff ; L l fl ; C 103 ; WX 459.89 ; N g ; B 25 -205 463 441 ; C 104 ; WX 511 ; N h ; B 48 -11 512 694 ; C 105 ; WX 306.61 ; N i ; B 55 -11 308 656 ; C 106 ; WX 306.61 ; N j ; B -61 -205 333 656 ; C 107 ; WX 459.89 ; N k ; B 48 -11 474 694 ; C 108 ; WX 255.5 ; N l ; B 66 -11 282 694 ; C 109 ; WX 817.56 ; N m ; B 55 -11 819 441 ; C 110 ; WX 562.11 ; N n ; B 55 -11 563 441 ; C 111 ; WX 511 ; N o ; B 82 -11 485 441 ; C 112 ; WX 511 ; N p ; B -14 -194 486 441 ; C 113 ; WX 459.89 ; N q ; B 81 -194 473 441 ; C 114 ; WX 421.56 ; N r ; B 55 -11 462 441 ; C 115 ; WX 408.78 ; N s ; B 50 -11 392 441 ; C 116 ; WX 332.17 ; N t ; B 64 -11 347 626 ; C 117 ; WX 536.56 ; N u ; B 55 -11 538 441 ; C 118 ; WX 459.89 ; N v ; B 55 -11 466 442 ; C 119 ; WX 664.28 ; N w ; B 55 -11 670 442 ; C 120 ; WX 463.78 ; N x ; B 29 -11 491 441 ; C 121 ; WX 485.44 ; N y ; B 55 -205 490 441 ; C 122 ; WX 408.78 ; N z ; B 34 -11 439 441 ; C 123 ; WX 511 ; N braceleft ; B 126 -250 580 750 ; C 124 ; WX 306.61 ; N bar ; B 51 -250 331 750 ; C 125 ; WX 511 ; N braceright ; B 4 -250 458 750 ; C 126 ; WX 613.17 ; N asciitilde ; B 221 564 648 668 ; C 127 ; WX 357.67 ; N hyphen ; B 59 185 314 245 ; C 128 ; WX 743.17 ; N Abreve ; B 18 0 693 891 ; C 129 ; WX 743.17 ; N Aogonek ; B 18 -169 668 716 ; C 130 ; WX 715.39 ; N Cacute ; B 124 -22 786 893 ; C 131 ; WX 715.39 ; N Ccaron ; B 124 -22 786 844 ; C 132 ; WX 754.83 ; N Dcaron ; B 20 0 735 844 ; C 133 ; WX 678.17 ; N Ecaron ; B 19 0 703 844 ; C 134 ; WX 678.17 ; N Eogonek ; B 19 -169 703 680 ; C 135 ; WX 773.44 ; N Gbreve ; B 124 -22 786 891 ; C 136 ; WX 627.06 ; N Lacute ; B 19 0 626 893 ; C 137 ; WX 627.06 ; N Lquoteright ; B 19 0 632 683 ; C 138 ; WX 627.06 ; N Lslash ; B 19 0 586 683 ; C 139 ; WX 743.17 ; N Nacute ; B 19 0 814 893 ; C 140 ; WX 743.17 ; N Ncaron ; B 19 0 814 844 ; C 141 ; WX 720.94 ; N Eng ; B 13 -22 763 694 ; C 142 ; WX 766.5 ; N Ohungarumlaut ; B 122 -22 819 893 ; C 143 ; WX 729.28 ; N Racute ; B 20 -22 683 893 ; C 144 ; WX 729.28 ; N Rcaron ; B 20 -22 683 844 ; C 145 ; WX 562.11 ; N Sacute ; B 48 -22 607 893 ; C 146 ; WX 562.11 ; N Scaron ; B 48 -22 607 844 ; C 147 ; WX 562.11 ; N Scedilla ; B 48 -194 607 705 ; C 148 ; WX 715.39 ; N Tcaron ; B 148 0 780 844 ; C 149 ; WX 715.39 ; N Tcedilla ; B 148 -194 780 677 ; C 150 ; WX 743.17 ; N Uhungarumlaut ; B 160 -22 819 893 ; C 151 ; WX 743.17 ; N Uring ; B 160 -22 814 913 ; C 152 ; WX 743.17 ; N Ydieresis ; B 161 0 835 891 ; C 153 ; WX 613.17 ; N Zacute ; B 53 0 678 893 ; C 154 ; WX 613.17 ; N Zcaron ; B 53 0 678 844 ; C 155 ; WX 613.17 ; N Zdotaccent ; B 53 0 678 891 ; C 156 ; WX 845.33 ; N IJ ; B 14 -22 902 683 ; C 157 ; WX 385.44 ; N Idotaccent ; B 14 0 462 878 ; C 158 ; WX 511 ; N dbar ; B 81 -11 556 694 ; C 159 ; WX 459.89 ; N section ; B 53 -205 480 705 ; C 160 ; WX 511 ; N abreve ; B 81 -11 527 639 ; C 161 ; WX 511 ; N aogonek ; B 81 -181 512 441 ; C 162 ; WX 459.89 ; N cacute ; B 82 -11 486 641 ; C 163 ; WX 459.89 ; N ccaron ; B 82 -11 502 592 ; C 164 ; WX 511 ; N dquoteright ; B 81 -11 723 694 ; C 165 ; WX 459.89 ; N ecaron ; B 86 -11 477 592 ; C 166 ; WX 459.89 ; N eogonek ; B 86 -152 442 441 ; C 167 ; WX 459.89 ; N gbreve ; B 25 -205 502 639 ; C 168 ; WX 255.5 ; N lacute ; B 66 -11 450 905 ; C 169 ; WX 255.5 ; N lquoteright ; B 66 -11 467 694 ; C 170 ; WX 255.5 ; N lslash ; B 34 -11 288 694 ; C 171 ; WX 562.11 ; N nacute ; B 55 -11 563 641 ; C 172 ; WX 562.11 ; N ncaron ; B 55 -11 563 592 ; C 173 ; WX 562.11 ; N eng ; B 55 -205 494 441 ; C 174 ; WX 511 ; N ohungarumlaut ; B 82 -11 629 641 ; C 175 ; WX 421.56 ; N racute ; B 55 -11 462 641 ; C 176 ; WX 421.56 ; N rcaron ; B 55 -11 462 592 ; C 177 ; WX 408.78 ; N sacute ; B 50 -11 461 641 ; C 178 ; WX 408.78 ; N scaron ; B 50 -11 451 592 ; C 179 ; WX 408.78 ; N scedilla ; B 22 -194 392 441 ; C 180 ; WX 332.17 ; N tquoteright ; B 64 -11 462 704 ; C 181 ; WX 332.17 ; N tcedilla ; B 22 -194 347 626 ; C 182 ; WX 536.56 ; N uhungarumlaut ; B 55 -11 642 641 ; C 183 ; WX 536.56 ; N uring ; B 55 -11 538 661 ; C 184 ; WX 485.44 ; N ydieresis ; B 55 -205 505 638 ; C 185 ; WX 408.78 ; N zacute ; B 34 -11 461 641 ; C 186 ; WX 408.78 ; N zcaron ; B 34 -11 451 592 ; C 187 ; WX 408.78 ; N zdotaccent ; B 34 -11 439 670 ; C 188 ; WX 562.11 ; N ij ; B 55 -205 588 656 ; C 189 ; WX 306.61 ; N exclamdown ; B 31 -216 295 500 ; C 190 ; WX 511 ; N questiondown ; B 59 -216 416 500 ; C 191 ; WX 768.89 ; N sterling ; B 62 -11 672 709 ; C 192 ; WX 743.17 ; N Agrave ; B 18 0 653 893 ; C 193 ; WX 743.17 ; N Aacute ; B 18 0 677 893 ; C 194 ; WX 743.17 ; N Acircumflex ; B 18 0 653 891 ; C 195 ; WX 743.17 ; N Atilde ; B 18 0 704 891 ; C 196 ; WX 743.17 ; N Adieresis ; B 18 0 683 891 ; C 197 ; WX 743.17 ; N Aring ; B 18 0 653 872 ; C 198 ; WX 882.56 ; N AE ; B 18 0 909 683 ; C 199 ; WX 715.39 ; N Ccedilla ; B 124 -194 786 705 ; C 200 ; WX 678.17 ; N Egrave ; B 19 0 703 893 ; C 201 ; WX 678.17 ; N Eacute ; B 19 0 703 893 ; C 202 ; WX 678.17 ; N Ecircumflex ; B 19 0 703 891 ; C 203 ; WX 678.17 ; N Edieresis ; B 19 0 703 891 ; C 204 ; WX 385.44 ; N Igrave ; B 14 0 462 893 ; C 205 ; WX 385.44 ; N Iacute ; B 14 0 498 893 ; C 206 ; WX 385.44 ; N Icircumflex ; B 14 0 468 891 ; C 207 ; WX 385.44 ; N Idieresis ; B 14 0 504 891 ; C 208 ; WX 754.83 ; N Eth ; B 20 0 735 683 ; C 209 ; WX 743.17 ; N Ntilde ; B 19 0 814 891 ; C 210 ; WX 766.5 ; N Ograve ; B 122 -22 761 893 ; C 211 ; WX 766.5 ; N Oacute ; B 122 -22 761 893 ; C 212 ; WX 766.5 ; N Ocircumflex ; B 122 -22 761 891 ; C 213 ; WX 766.5 ; N Otilde ; B 122 -22 761 891 ; C 214 ; WX 766.5 ; N Odieresis ; B 122 -22 761 891 ; C 215 ; WX 984.78 ; N OE ; B 122 -22 1011 705 ; C 216 ; WX 766.5 ; N Oslash ; B 94 -62 791 745 ; C 217 ; WX 743.17 ; N Ugrave ; B 160 -22 814 893 ; C 218 ; WX 743.17 ; N Uacute ; B 160 -22 814 893 ; C 219 ; WX 743.17 ; N Ucircumflex ; B 160 -22 814 891 ; C 220 ; WX 743.17 ; N Udieresis ; B 160 -22 814 891 ; C 221 ; WX 743.17 ; N Yacute ; B 161 0 835 893 ; C 222 ; WX 627.06 ; N Thorn ; B 22 0 607 683 ; C 223 ; WX 1073.06 ; N Germandbls ; B 48 -22 1119 705 ; C 224 ; WX 511 ; N agrave ; B 81 -11 512 641 ; C 225 ; WX 511 ; N aacute ; B 81 -11 512 641 ; C 226 ; WX 511 ; N acircumflex ; B 81 -11 512 639 ; C 227 ; WX 511 ; N atilde ; B 81 -11 521 669 ; C 228 ; WX 511 ; N adieresis ; B 81 -11 518 638 ; C 229 ; WX 511 ; N aring ; B 81 -11 512 661 ; C 230 ; WX 715.39 ; N ae ; B 64 -11 693 441 ; C 231 ; WX 459.89 ; N ccedilla ; B 73 -194 444 441 ; C 232 ; WX 459.89 ; N egrave ; B 86 -11 442 641 ; C 233 ; WX 459.89 ; N eacute ; B 86 -11 442 641 ; C 234 ; WX 459.89 ; N ecircumflex ; B 86 -11 456 639 ; C 235 ; WX 459.89 ; N edieresis ; B 86 -11 493 638 ; C 236 ; WX 306.61 ; N igrave ; B 55 -11 308 641 ; C 237 ; WX 306.61 ; N iacute ; B 55 -11 410 641 ; C 238 ; WX 306.61 ; N icircumflex ; B 55 -11 348 639 ; C 239 ; WX 306.61 ; N idieresis ; B 55 -11 416 638 ; C 240 ; WX 511 ; N eth ; B 71 -11 534 694 ; C 241 ; WX 562.11 ; N ntilde ; B 55 -11 572 669 ; C 242 ; WX 511 ; N ograve ; B 82 -11 485 641 ; C 243 ; WX 511 ; N oacute ; B 82 -11 512 641 ; C 244 ; WX 511 ; N ocircumflex ; B 82 -11 485 639 ; C 245 ; WX 511 ; N otilde ; B 82 -11 547 669 ; C 246 ; WX 511 ; N odieresis ; B 82 -11 518 638 ; C 247 ; WX 715.39 ; N oe ; B 80 -15 693 445 ; C 248 ; WX 511 ; N oslash ; B 40 -109 527 540 ; C 249 ; WX 536.56 ; N ugrave ; B 55 -11 538 641 ; C 250 ; WX 536.56 ; N uacute ; B 55 -11 538 641 ; C 251 ; WX 536.56 ; N ucircumflex ; B 55 -11 538 639 ; C 252 ; WX 536.56 ; N udieresis ; B 55 -11 538 638 ; C 253 ; WX 485.44 ; N yacute ; B 55 -205 499 641 ; C 254 ; WX 511 ; N thorn ; B -34 -194 491 694 ; C 255 ; WX 536.56 ; N germandbls ; B -46 -205 552 705 ; EndCharMetrics StartKernData StartKernPairs 2061 KPX A C -25.55 KPX A Cacute -25.55 KPX A Ccaron -25.55 KPX A G -25.55 KPX A Gbreve -25.55 KPX A O -25.55 KPX A Oacute -25.55 KPX A Ocircumflex -25.55 KPX A Odieresis -25.55 KPX A Ograve -25.55 KPX A Ohungarumlaut -25.55 KPX A Oslash -25.55 KPX A Otilde -25.55 KPX A Q -25.55 KPX A T -76.65 KPX A Tcaron -76.65 KPX A Tcedilla -76.65 KPX A U -25.55 KPX A Uacute -25.55 KPX A Ucircumflex -25.55 KPX A Udieresis -25.55 KPX A Ugrave -25.55 KPX A Uhungarumlaut -25.55 KPX A Uring -25.55 KPX A V -102.2 KPX A W -102.2 KPX A Y -76.65 KPX A Ydieresis -76.65 KPX A a -51.1 KPX A aacute -51.1 KPX A acircumflex -51.1 KPX A acircumflex -51.1 KPX A adieresis -51.1 KPX A ae -51.1 KPX A agrave -51.1 KPX A aogonek -51.1 KPX A aring -51.1 KPX A atilde -51.1 KPX A b -25.55 KPX A c -51.1 KPX A cacute -51.1 KPX A cacute -51.1 KPX A ccaron -51.1 KPX A ccedilla -51.1 KPX A d -51.1 KPX A dbar -51.1 KPX A e -51.1 KPX A eacute -51.1 KPX A ecaron -51.1 KPX A ecircumflex -51.1 KPX A edieresis -51.1 KPX A egrave -51.1 KPX A eogonek -51.1 KPX A g -51.1 KPX A gbreve -51.1 KPX A h -25.55 KPX A i -25.55 KPX A iacute -25.55 KPX A k -25.55 KPX A l -25.55 KPX A lacute -25.55 KPX A lquoteright -25.55 KPX A m -25.55 KPX A n -25.55 KPX A o -51.1 KPX A oacute -51.1 KPX A ocircumflex -51.1 KPX A odieresis -51.1 KPX A oe -51.1 KPX A ograve -51.1 KPX A ohungarumlaut -51.1 KPX A oslash -51.1 KPX A otilde -51.1 KPX A q -51.1 KPX A r -25.55 KPX A t -25.55 KPX A tcedilla -25.55 KPX A tquoteright -25.55 KPX A u -25.55 KPX A uacute -25.55 KPX A ucircumflex -25.55 KPX A udieresis -25.55 KPX A ugrave -25.55 KPX A uhungarumlaut -25.55 KPX A uring -25.55 KPX A v -25.55 KPX A w -25.55 KPX Aacute C -25.55 KPX Aacute Cacute -25.55 KPX Aacute Ccaron -25.55 KPX Aacute G -25.55 KPX Aacute Gbreve -25.55 KPX Aacute O -25.55 KPX Aacute Oacute -25.55 KPX Aacute Ocircumflex -25.55 KPX Aacute Odieresis -25.55 KPX Aacute Ograve -25.55 KPX Aacute Ohungarumlaut -25.55 KPX Aacute Oslash -25.55 KPX Aacute Otilde -25.55 KPX Aacute Q -25.55 KPX Aacute T -76.65 KPX Aacute Tcaron -76.65 KPX Aacute Tcedilla -76.65 KPX Aacute U -25.55 KPX Aacute Uacute -25.55 KPX Aacute Ucircumflex -25.55 KPX Aacute Udieresis -25.55 KPX Aacute Ugrave -25.55 KPX Aacute Uhungarumlaut -25.55 KPX Aacute Uring -25.55 KPX Aacute V -102.2 KPX Aacute W -102.2 KPX Aacute Y -76.65 KPX Aacute Ydieresis -76.65 KPX Aacute a -51.1 KPX Aacute aacute -51.1 KPX Aacute acircumflex -51.1 KPX Aacute acircumflex -51.1 KPX Aacute adieresis -51.1 KPX Aacute ae -51.1 KPX Aacute agrave -51.1 KPX Aacute aogonek -51.1 KPX Aacute aring -51.1 KPX Aacute atilde -51.1 KPX Aacute b -25.55 KPX Aacute c -51.1 KPX Aacute cacute -51.1 KPX Aacute cacute -51.1 KPX Aacute ccaron -51.1 KPX Aacute ccedilla -51.1 KPX Aacute d -51.1 KPX Aacute dbar -51.1 KPX Aacute e -51.1 KPX Aacute eacute -51.1 KPX Aacute ecaron -51.1 KPX Aacute ecircumflex -51.1 KPX Aacute edieresis -51.1 KPX Aacute egrave -51.1 KPX Aacute eogonek -51.1 KPX Aacute g -51.1 KPX Aacute gbreve -51.1 KPX Aacute h -25.55 KPX Aacute i -25.55 KPX Aacute iacute -25.55 KPX Aacute k -25.55 KPX Aacute l -25.55 KPX Aacute lacute -25.55 KPX Aacute lquoteright -25.55 KPX Aacute m -25.55 KPX Aacute n -25.55 KPX Aacute o -51.1 KPX Aacute oacute -51.1 KPX Aacute ocircumflex -51.1 KPX Aacute odieresis -51.1 KPX Aacute oe -51.1 KPX Aacute ograve -51.1 KPX Aacute ohungarumlaut -51.1 KPX Aacute oslash -51.1 KPX Aacute otilde -51.1 KPX Aacute q -51.1 KPX Aacute r -25.55 KPX Aacute t -25.55 KPX Aacute tcedilla -25.55 KPX Aacute tquoteright -25.55 KPX Aacute u -25.55 KPX Aacute uacute -25.55 KPX Aacute ucircumflex -25.55 KPX Aacute udieresis -25.55 KPX Aacute ugrave -25.55 KPX Aacute uhungarumlaut -25.55 KPX Aacute uring -25.55 KPX Aacute v -25.55 KPX Aacute w -25.55 KPX Abreve C -25.55 KPX Abreve Cacute -25.55 KPX Abreve Ccaron -25.55 KPX Abreve G -25.55 KPX Abreve Gbreve -25.55 KPX Abreve O -25.55 KPX Abreve Oacute -25.55 KPX Abreve Ocircumflex -25.55 KPX Abreve Odieresis -25.55 KPX Abreve Ograve -25.55 KPX Abreve Ohungarumlaut -25.55 KPX Abreve Oslash -25.55 KPX Abreve Otilde -25.55 KPX Abreve Q -25.55 KPX Abreve T -76.65 KPX Abreve Tcaron -76.65 KPX Abreve Tcedilla -76.65 KPX Abreve U -25.55 KPX Abreve Uacute -25.55 KPX Abreve Ucircumflex -25.55 KPX Abreve Udieresis -25.55 KPX Abreve Ugrave -25.55 KPX Abreve Uhungarumlaut -25.55 KPX Abreve Uring -25.55 KPX Abreve V -102.2 KPX Abreve W -102.2 KPX Abreve Y -76.65 KPX Abreve Ydieresis -76.65 KPX Abreve a -51.1 KPX Abreve aacute -51.1 KPX Abreve acircumflex -51.1 KPX Abreve acircumflex -51.1 KPX Abreve adieresis -51.1 KPX Abreve ae -51.1 KPX Abreve agrave -51.1 KPX Abreve aogonek -51.1 KPX Abreve aring -51.1 KPX Abreve atilde -51.1 KPX Abreve b -25.55 KPX Abreve c -51.1 KPX Abreve cacute -51.1 KPX Abreve cacute -51.1 KPX Abreve ccaron -51.1 KPX Abreve ccedilla -51.1 KPX Abreve d -51.1 KPX Abreve dbar -51.1 KPX Abreve e -51.1 KPX Abreve eacute -51.1 KPX Abreve ecaron -51.1 KPX Abreve ecircumflex -51.1 KPX Abreve edieresis -51.1 KPX Abreve egrave -51.1 KPX Abreve eogonek -51.1 KPX Abreve g -51.1 KPX Abreve gbreve -51.1 KPX Abreve h -25.55 KPX Abreve i -25.55 KPX Abreve iacute -25.55 KPX Abreve k -25.55 KPX Abreve l -25.55 KPX Abreve lacute -25.55 KPX Abreve lquoteright -25.55 KPX Abreve m -25.55 KPX Abreve n -25.55 KPX Abreve o -51.1 KPX Abreve oacute -51.1 KPX Abreve ocircumflex -51.1 KPX Abreve odieresis -51.1 KPX Abreve oe -51.1 KPX Abreve ograve -51.1 KPX Abreve ohungarumlaut -51.1 KPX Abreve oslash -51.1 KPX Abreve otilde -51.1 KPX Abreve q -51.1 KPX Abreve r -25.55 KPX Abreve t -25.55 KPX Abreve tcedilla -25.55 KPX Abreve tquoteright -25.55 KPX Abreve u -25.55 KPX Abreve uacute -25.55 KPX Abreve ucircumflex -25.55 KPX Abreve udieresis -25.55 KPX Abreve ugrave -25.55 KPX Abreve uhungarumlaut -25.55 KPX Abreve uring -25.55 KPX Abreve v -25.55 KPX Abreve w -25.55 KPX Acircumflex C -25.55 KPX Acircumflex Cacute -25.55 KPX Acircumflex Ccaron -25.55 KPX Acircumflex G -25.55 KPX Acircumflex Gbreve -25.55 KPX Acircumflex O -25.55 KPX Acircumflex Oacute -25.55 KPX Acircumflex Ocircumflex -25.55 KPX Acircumflex Odieresis -25.55 KPX Acircumflex Ograve -25.55 KPX Acircumflex Ohungarumlaut -25.55 KPX Acircumflex Oslash -25.55 KPX Acircumflex Otilde -25.55 KPX Acircumflex Q -25.55 KPX Acircumflex T -76.65 KPX Acircumflex Tcaron -76.65 KPX Acircumflex Tcedilla -76.65 KPX Acircumflex U -25.55 KPX Acircumflex Uacute -25.55 KPX Acircumflex Ucircumflex -25.55 KPX Acircumflex Udieresis -25.55 KPX Acircumflex Ugrave -25.55 KPX Acircumflex Uhungarumlaut -25.55 KPX Acircumflex Uring -25.55 KPX Acircumflex V -102.2 KPX Acircumflex W -102.2 KPX Acircumflex Y -76.65 KPX Acircumflex Ydieresis -76.65 KPX Acircumflex a -51.1 KPX Acircumflex aacute -51.1 KPX Acircumflex acircumflex -51.1 KPX Acircumflex acircumflex -51.1 KPX Acircumflex adieresis -51.1 KPX Acircumflex ae -51.1 KPX Acircumflex agrave -51.1 KPX Acircumflex aogonek -51.1 KPX Acircumflex aring -51.1 KPX Acircumflex atilde -51.1 KPX Acircumflex b -25.55 KPX Acircumflex c -51.1 KPX Acircumflex cacute -51.1 KPX Acircumflex cacute -51.1 KPX Acircumflex ccaron -51.1 KPX Acircumflex ccedilla -51.1 KPX Acircumflex d -51.1 KPX Acircumflex dbar -51.1 KPX Acircumflex e -51.1 KPX Acircumflex eacute -51.1 KPX Acircumflex ecaron -51.1 KPX Acircumflex ecircumflex -51.1 KPX Acircumflex edieresis -51.1 KPX Acircumflex egrave -51.1 KPX Acircumflex eogonek -51.1 KPX Acircumflex g -51.1 KPX Acircumflex gbreve -51.1 KPX Acircumflex h -25.55 KPX Acircumflex i -25.55 KPX Acircumflex iacute -25.55 KPX Acircumflex k -25.55 KPX Acircumflex l -25.55 KPX Acircumflex lacute -25.55 KPX Acircumflex lquoteright -25.55 KPX Acircumflex m -25.55 KPX Acircumflex n -25.55 KPX Acircumflex o -51.1 KPX Acircumflex oacute -51.1 KPX Acircumflex ocircumflex -51.1 KPX Acircumflex odieresis -51.1 KPX Acircumflex oe -51.1 KPX Acircumflex ograve -51.1 KPX Acircumflex ohungarumlaut -51.1 KPX Acircumflex oslash -51.1 KPX Acircumflex otilde -51.1 KPX Acircumflex q -51.1 KPX Acircumflex r -25.55 KPX Acircumflex t -25.55 KPX Acircumflex tcedilla -25.55 KPX Acircumflex tquoteright -25.55 KPX Acircumflex u -25.55 KPX Acircumflex uacute -25.55 KPX Acircumflex ucircumflex -25.55 KPX Acircumflex udieresis -25.55 KPX Acircumflex ugrave -25.55 KPX Acircumflex uhungarumlaut -25.55 KPX Acircumflex uring -25.55 KPX Acircumflex v -25.55 KPX Acircumflex w -25.55 KPX Adieresis C -25.55 KPX Adieresis Cacute -25.55 KPX Adieresis Ccaron -25.55 KPX Adieresis G -25.55 KPX Adieresis Gbreve -25.55 KPX Adieresis O -25.55 KPX Adieresis Oacute -25.55 KPX Adieresis Ocircumflex -25.55 KPX Adieresis Odieresis -25.55 KPX Adieresis Ograve -25.55 KPX Adieresis Ohungarumlaut -25.55 KPX Adieresis Oslash -25.55 KPX Adieresis Otilde -25.55 KPX Adieresis Q -25.55 KPX Adieresis T -76.65 KPX Adieresis Tcaron -76.65 KPX Adieresis Tcedilla -76.65 KPX Adieresis U -25.55 KPX Adieresis Uacute -25.55 KPX Adieresis Ucircumflex -25.55 KPX Adieresis Udieresis -25.55 KPX Adieresis Ugrave -25.55 KPX Adieresis Uhungarumlaut -25.55 KPX Adieresis Uring -25.55 KPX Adieresis V -102.2 KPX Adieresis W -102.2 KPX Adieresis Y -76.65 KPX Adieresis Ydieresis -76.65 KPX Adieresis a -51.1 KPX Adieresis aacute -51.1 KPX Adieresis acircumflex -51.1 KPX Adieresis acircumflex -51.1 KPX Adieresis adieresis -51.1 KPX Adieresis ae -51.1 KPX Adieresis agrave -51.1 KPX Adieresis aogonek -51.1 KPX Adieresis aring -51.1 KPX Adieresis atilde -51.1 KPX Adieresis b -25.55 KPX Adieresis c -51.1 KPX Adieresis cacute -51.1 KPX Adieresis cacute -51.1 KPX Adieresis ccaron -51.1 KPX Adieresis ccedilla -51.1 KPX Adieresis d -51.1 KPX Adieresis dbar -51.1 KPX Adieresis e -51.1 KPX Adieresis eacute -51.1 KPX Adieresis ecaron -51.1 KPX Adieresis ecircumflex -51.1 KPX Adieresis edieresis -51.1 KPX Adieresis egrave -51.1 KPX Adieresis eogonek -51.1 KPX Adieresis g -51.1 KPX Adieresis gbreve -51.1 KPX Adieresis h -25.55 KPX Adieresis i -25.55 KPX Adieresis iacute -25.55 KPX Adieresis k -25.55 KPX Adieresis l -25.55 KPX Adieresis lacute -25.55 KPX Adieresis lquoteright -25.55 KPX Adieresis m -25.55 KPX Adieresis n -25.55 KPX Adieresis o -51.1 KPX Adieresis oacute -51.1 KPX Adieresis ocircumflex -51.1 KPX Adieresis odieresis -51.1 KPX Adieresis oe -51.1 KPX Adieresis ograve -51.1 KPX Adieresis ohungarumlaut -51.1 KPX Adieresis oslash -51.1 KPX Adieresis otilde -51.1 KPX Adieresis q -51.1 KPX Adieresis r -25.55 KPX Adieresis t -25.55 KPX Adieresis tcedilla -25.55 KPX Adieresis tquoteright -25.55 KPX Adieresis u -25.55 KPX Adieresis uacute -25.55 KPX Adieresis ucircumflex -25.55 KPX Adieresis udieresis -25.55 KPX Adieresis ugrave -25.55 KPX Adieresis uhungarumlaut -25.55 KPX Adieresis uring -25.55 KPX Adieresis v -25.55 KPX Adieresis w -25.55 KPX Agrave C -25.55 KPX Agrave Cacute -25.55 KPX Agrave Ccaron -25.55 KPX Agrave G -25.55 KPX Agrave Gbreve -25.55 KPX Agrave O -25.55 KPX Agrave Oacute -25.55 KPX Agrave Ocircumflex -25.55 KPX Agrave Odieresis -25.55 KPX Agrave Ograve -25.55 KPX Agrave Ohungarumlaut -25.55 KPX Agrave Oslash -25.55 KPX Agrave Otilde -25.55 KPX Agrave Q -25.55 KPX Agrave T -76.65 KPX Agrave Tcaron -76.65 KPX Agrave Tcedilla -76.65 KPX Agrave U -25.55 KPX Agrave Uacute -25.55 KPX Agrave Ucircumflex -25.55 KPX Agrave Udieresis -25.55 KPX Agrave Ugrave -25.55 KPX Agrave Uhungarumlaut -25.55 KPX Agrave Uring -25.55 KPX Agrave V -102.2 KPX Agrave W -102.2 KPX Agrave Y -76.65 KPX Agrave Ydieresis -76.65 KPX Agrave a -51.1 KPX Agrave aacute -51.1 KPX Agrave acircumflex -51.1 KPX Agrave acircumflex -51.1 KPX Agrave adieresis -51.1 KPX Agrave ae -51.1 KPX Agrave agrave -51.1 KPX Agrave aogonek -51.1 KPX Agrave aring -51.1 KPX Agrave atilde -51.1 KPX Agrave b -25.55 KPX Agrave c -51.1 KPX Agrave cacute -51.1 KPX Agrave cacute -51.1 KPX Agrave ccaron -51.1 KPX Agrave ccedilla -51.1 KPX Agrave d -51.1 KPX Agrave dbar -51.1 KPX Agrave e -51.1 KPX Agrave eacute -51.1 KPX Agrave ecaron -51.1 KPX Agrave ecircumflex -51.1 KPX Agrave edieresis -51.1 KPX Agrave egrave -51.1 KPX Agrave eogonek -51.1 KPX Agrave g -51.1 KPX Agrave gbreve -51.1 KPX Agrave h -25.55 KPX Agrave i -25.55 KPX Agrave iacute -25.55 KPX Agrave k -25.55 KPX Agrave l -25.55 KPX Agrave lacute -25.55 KPX Agrave lquoteright -25.55 KPX Agrave m -25.55 KPX Agrave n -25.55 KPX Agrave o -51.1 KPX Agrave oacute -51.1 KPX Agrave ocircumflex -51.1 KPX Agrave odieresis -51.1 KPX Agrave oe -51.1 KPX Agrave ograve -51.1 KPX Agrave ohungarumlaut -51.1 KPX Agrave oslash -51.1 KPX Agrave otilde -51.1 KPX Agrave q -51.1 KPX Agrave r -25.55 KPX Agrave t -25.55 KPX Agrave tcedilla -25.55 KPX Agrave tquoteright -25.55 KPX Agrave u -25.55 KPX Agrave uacute -25.55 KPX Agrave ucircumflex -25.55 KPX Agrave udieresis -25.55 KPX Agrave ugrave -25.55 KPX Agrave uhungarumlaut -25.55 KPX Agrave uring -25.55 KPX Agrave v -25.55 KPX Agrave w -25.55 KPX Aogonek C -25.55 KPX Aogonek Cacute -25.55 KPX Aogonek Ccaron -25.55 KPX Aogonek G -25.55 KPX Aogonek Gbreve -25.55 KPX Aogonek O -25.55 KPX Aogonek Oacute -25.55 KPX Aogonek Ocircumflex -25.55 KPX Aogonek Odieresis -25.55 KPX Aogonek Ograve -25.55 KPX Aogonek Ohungarumlaut -25.55 KPX Aogonek Oslash -25.55 KPX Aogonek Otilde -25.55 KPX Aogonek Q -25.55 KPX Aogonek T -76.65 KPX Aogonek Tcaron -76.65 KPX Aogonek Tcedilla -76.65 KPX Aogonek U -25.55 KPX Aogonek Uacute -25.55 KPX Aogonek Ucircumflex -25.55 KPX Aogonek Udieresis -25.55 KPX Aogonek Ugrave -25.55 KPX Aogonek Uhungarumlaut -25.55 KPX Aogonek Uring -25.55 KPX Aogonek V -102.2 KPX Aogonek W -102.2 KPX Aogonek Y -76.65 KPX Aogonek Ydieresis -76.65 KPX Aogonek a -51.1 KPX Aogonek aacute -51.1 KPX Aogonek acircumflex -51.1 KPX Aogonek acircumflex -51.1 KPX Aogonek adieresis -51.1 KPX Aogonek ae -51.1 KPX Aogonek agrave -51.1 KPX Aogonek aogonek -51.1 KPX Aogonek aring -51.1 KPX Aogonek atilde -51.1 KPX Aogonek b -25.55 KPX Aogonek c -51.1 KPX Aogonek cacute -51.1 KPX Aogonek cacute -51.1 KPX Aogonek ccaron -51.1 KPX Aogonek ccedilla -51.1 KPX Aogonek d -51.1 KPX Aogonek dbar -51.1 KPX Aogonek e -51.1 KPX Aogonek eacute -51.1 KPX Aogonek ecaron -51.1 KPX Aogonek ecircumflex -51.1 KPX Aogonek edieresis -51.1 KPX Aogonek egrave -51.1 KPX Aogonek eogonek -51.1 KPX Aogonek g -51.1 KPX Aogonek gbreve -51.1 KPX Aogonek h -25.55 KPX Aogonek i -25.55 KPX Aogonek iacute -25.55 KPX Aogonek k -25.55 KPX Aogonek l -25.55 KPX Aogonek lacute -25.55 KPX Aogonek lquoteright -25.55 KPX Aogonek m -25.55 KPX Aogonek n -25.55 KPX Aogonek o -51.1 KPX Aogonek oacute -51.1 KPX Aogonek ocircumflex -51.1 KPX Aogonek odieresis -51.1 KPX Aogonek oe -51.1 KPX Aogonek ograve -51.1 KPX Aogonek ohungarumlaut -51.1 KPX Aogonek oslash -51.1 KPX Aogonek otilde -51.1 KPX Aogonek q -51.1 KPX Aogonek r -25.55 KPX Aogonek t -25.55 KPX Aogonek tcedilla -25.55 KPX Aogonek tquoteright -25.55 KPX Aogonek u -25.55 KPX Aogonek uacute -25.55 KPX Aogonek ucircumflex -25.55 KPX Aogonek udieresis -25.55 KPX Aogonek ugrave -25.55 KPX Aogonek uhungarumlaut -25.55 KPX Aogonek uring -25.55 KPX Aogonek v -25.55 KPX Aogonek w -25.55 KPX Aring C -25.55 KPX Aring Cacute -25.55 KPX Aring Ccaron -25.55 KPX Aring G -25.55 KPX Aring Gbreve -25.55 KPX Aring O -25.55 KPX Aring Oacute -25.55 KPX Aring Ocircumflex -25.55 KPX Aring Odieresis -25.55 KPX Aring Ograve -25.55 KPX Aring Ohungarumlaut -25.55 KPX Aring Oslash -25.55 KPX Aring Otilde -25.55 KPX Aring Q -25.55 KPX Aring T -76.65 KPX Aring Tcaron -76.65 KPX Aring Tcedilla -76.65 KPX Aring U -25.55 KPX Aring Uacute -25.55 KPX Aring Ucircumflex -25.55 KPX Aring Udieresis -25.55 KPX Aring Ugrave -25.55 KPX Aring Uhungarumlaut -25.55 KPX Aring Uring -25.55 KPX Aring V -102.2 KPX Aring W -102.2 KPX Aring Y -76.65 KPX Aring Ydieresis -76.65 KPX Aring a -51.1 KPX Aring aacute -51.1 KPX Aring acircumflex -51.1 KPX Aring acircumflex -51.1 KPX Aring adieresis -51.1 KPX Aring ae -51.1 KPX Aring agrave -51.1 KPX Aring aogonek -51.1 KPX Aring aring -51.1 KPX Aring atilde -51.1 KPX Aring b -25.55 KPX Aring c -51.1 KPX Aring cacute -51.1 KPX Aring cacute -51.1 KPX Aring ccaron -51.1 KPX Aring ccedilla -51.1 KPX Aring d -51.1 KPX Aring dbar -51.1 KPX Aring e -51.1 KPX Aring eacute -51.1 KPX Aring ecaron -51.1 KPX Aring ecircumflex -51.1 KPX Aring edieresis -51.1 KPX Aring egrave -51.1 KPX Aring eogonek -51.1 KPX Aring g -51.1 KPX Aring gbreve -51.1 KPX Aring h -25.55 KPX Aring i -25.55 KPX Aring iacute -25.55 KPX Aring k -25.55 KPX Aring l -25.55 KPX Aring lacute -25.55 KPX Aring lquoteright -25.55 KPX Aring m -25.55 KPX Aring n -25.55 KPX Aring o -51.1 KPX Aring oacute -51.1 KPX Aring ocircumflex -51.1 KPX Aring odieresis -51.1 KPX Aring oe -51.1 KPX Aring ograve -51.1 KPX Aring ohungarumlaut -51.1 KPX Aring oslash -51.1 KPX Aring otilde -51.1 KPX Aring q -51.1 KPX Aring r -25.55 KPX Aring t -25.55 KPX Aring tcedilla -25.55 KPX Aring tquoteright -25.55 KPX Aring u -25.55 KPX Aring uacute -25.55 KPX Aring ucircumflex -25.55 KPX Aring udieresis -25.55 KPX Aring ugrave -25.55 KPX Aring uhungarumlaut -25.55 KPX Aring uring -25.55 KPX Aring v -25.55 KPX Aring w -25.55 KPX Atilde C -25.55 KPX Atilde Cacute -25.55 KPX Atilde Ccaron -25.55 KPX Atilde G -25.55 KPX Atilde Gbreve -25.55 KPX Atilde O -25.55 KPX Atilde Oacute -25.55 KPX Atilde Ocircumflex -25.55 KPX Atilde Odieresis -25.55 KPX Atilde Ograve -25.55 KPX Atilde Ohungarumlaut -25.55 KPX Atilde Oslash -25.55 KPX Atilde Otilde -25.55 KPX Atilde Q -25.55 KPX Atilde T -76.65 KPX Atilde Tcaron -76.65 KPX Atilde Tcedilla -76.65 KPX Atilde U -25.55 KPX Atilde Uacute -25.55 KPX Atilde Ucircumflex -25.55 KPX Atilde Udieresis -25.55 KPX Atilde Ugrave -25.55 KPX Atilde Uhungarumlaut -25.55 KPX Atilde Uring -25.55 KPX Atilde V -102.2 KPX Atilde W -102.2 KPX Atilde Y -76.65 KPX Atilde Ydieresis -76.65 KPX Atilde a -51.1 KPX Atilde aacute -51.1 KPX Atilde acircumflex -51.1 KPX Atilde acircumflex -51.1 KPX Atilde adieresis -51.1 KPX Atilde ae -51.1 KPX Atilde agrave -51.1 KPX Atilde aogonek -51.1 KPX Atilde aring -51.1 KPX Atilde atilde -51.1 KPX Atilde b -25.55 KPX Atilde c -51.1 KPX Atilde cacute -51.1 KPX Atilde cacute -51.1 KPX Atilde ccaron -51.1 KPX Atilde ccedilla -51.1 KPX Atilde d -51.1 KPX Atilde dbar -51.1 KPX Atilde e -51.1 KPX Atilde eacute -51.1 KPX Atilde ecaron -51.1 KPX Atilde ecircumflex -51.1 KPX Atilde edieresis -51.1 KPX Atilde egrave -51.1 KPX Atilde eogonek -51.1 KPX Atilde g -51.1 KPX Atilde gbreve -51.1 KPX Atilde h -25.55 KPX Atilde i -25.55 KPX Atilde iacute -25.55 KPX Atilde k -25.55 KPX Atilde l -25.55 KPX Atilde lacute -25.55 KPX Atilde lquoteright -25.55 KPX Atilde m -25.55 KPX Atilde n -25.55 KPX Atilde o -51.1 KPX Atilde oacute -51.1 KPX Atilde ocircumflex -51.1 KPX Atilde odieresis -51.1 KPX Atilde oe -51.1 KPX Atilde ograve -51.1 KPX Atilde ohungarumlaut -51.1 KPX Atilde oslash -51.1 KPX Atilde otilde -51.1 KPX Atilde q -51.1 KPX Atilde r -25.55 KPX Atilde t -25.55 KPX Atilde tcedilla -25.55 KPX Atilde tquoteright -25.55 KPX Atilde u -25.55 KPX Atilde uacute -25.55 KPX Atilde ucircumflex -25.55 KPX Atilde udieresis -25.55 KPX Atilde ugrave -25.55 KPX Atilde uhungarumlaut -25.55 KPX Atilde uring -25.55 KPX Atilde v -25.55 KPX Atilde w -25.55 KPX D A -25.55 KPX D Aacute -25.55 KPX D Abreve -25.55 KPX D Acircumflex -25.55 KPX D Adieresis -25.55 KPX D Agrave -25.55 KPX D Aogonek -25.55 KPX D Aring -25.55 KPX D Atilde -25.55 KPX D V -25.55 KPX D W -25.55 KPX D X -25.55 KPX D Y -25.55 KPX D Yacute -25.55 KPX Dcaron A -25.55 KPX Dcaron Aacute -25.55 KPX Dcaron Abreve -25.55 KPX Dcaron Acircumflex -25.55 KPX Dcaron Adieresis -25.55 KPX Dcaron Agrave -25.55 KPX Dcaron Aogonek -25.55 KPX Dcaron Aring -25.55 KPX Dcaron Atilde -25.55 KPX Dcaron V -25.55 KPX Dcaron W -25.55 KPX Dcaron X -25.55 KPX Dcaron Y -25.55 KPX Dcaron Yacute -25.55 KPX F A -102.2 KPX F Aacute -102.2 KPX F Abreve -102.2 KPX F Acircumflex -102.2 KPX F Adieresis -102.2 KPX F Agrave -102.2 KPX F Aogonek -102.2 KPX F Aring -102.2 KPX F Atilde -102.2 KPX F C -25.55 KPX F Cacute -25.55 KPX F Ccaron -25.55 KPX F G -25.55 KPX F Gbreve -25.55 KPX F O -25.55 KPX F Oacute -25.55 KPX F Ocircumflex -25.55 KPX F Odieresis -25.55 KPX F Ograve -25.55 KPX F Ohungarumlaut -25.55 KPX F Oslash -25.55 KPX F Otilde -25.55 KPX F Q -25.55 KPX F a -76.65 KPX F aogonek -76.65 KPX F e -76.65 KPX F eogonek -76.65 KPX F o -76.65 KPX F r -76.65 KPX F u -76.65 KPX K C -25.55 KPX K Cacute -25.55 KPX K Ccaron -25.55 KPX K G -25.55 KPX K Gbreve -25.55 KPX K O -25.55 KPX K Oacute -25.55 KPX K Ocircumflex -25.55 KPX K Odieresis -25.55 KPX K Ograve -25.55 KPX K Ohungarumlaut -25.55 KPX K Oslash -25.55 KPX K Otilde -25.55 KPX K Q -25.55 KPX L T -76.65 KPX L Tcaron -76.65 KPX L Tcedilla -76.65 KPX L V -102.2 KPX L W -102.2 KPX L Y -76.65 KPX L Ydieresis -76.65 KPX L a -51.1 KPX L aacute -51.1 KPX L acircumflex -51.1 KPX L acircumflex -51.1 KPX L adieresis -51.1 KPX L ae -51.1 KPX L agrave -51.1 KPX L aogonek -51.1 KPX L aring -51.1 KPX L atilde -51.1 KPX L c -51.1 KPX L cacute -51.1 KPX L cacute -51.1 KPX L ccaron -51.1 KPX L ccedilla -51.1 KPX L d -51.1 KPX L dbar -51.1 KPX L e -51.1 KPX L eacute -51.1 KPX L ecaron -51.1 KPX L ecircumflex -51.1 KPX L edieresis -51.1 KPX L egrave -51.1 KPX L eogonek -51.1 KPX L g -51.1 KPX L gbreve -51.1 KPX L o -51.1 KPX L oacute -51.1 KPX L ocircumflex -51.1 KPX L odieresis -51.1 KPX L oe -51.1 KPX L ograve -51.1 KPX L ohungarumlaut -51.1 KPX L oslash -51.1 KPX L otilde -51.1 KPX L q -51.1 KPX O A -25.55 KPX O Aacute -25.55 KPX O Abreve -25.55 KPX O Acircumflex -25.55 KPX O Adieresis -25.55 KPX O Agrave -25.55 KPX O Aogonek -25.55 KPX O Aring -25.55 KPX O Atilde -25.55 KPX O V -25.55 KPX O W -25.55 KPX O X -25.55 KPX O Y -25.55 KPX O Yacute -25.55 KPX Oacute A -25.55 KPX Oacute Aacute -25.55 KPX Oacute Abreve -25.55 KPX Oacute Acircumflex -25.55 KPX Oacute Adieresis -25.55 KPX Oacute Agrave -25.55 KPX Oacute Aogonek -25.55 KPX Oacute Aring -25.55 KPX Oacute Atilde -25.55 KPX Oacute V -25.55 KPX Oacute W -25.55 KPX Oacute X -25.55 KPX Oacute Y -25.55 KPX Oacute Yacute -25.55 KPX Ocircumflex A -25.55 KPX Ocircumflex Aacute -25.55 KPX Ocircumflex Abreve -25.55 KPX Ocircumflex Acircumflex -25.55 KPX Ocircumflex Adieresis -25.55 KPX Ocircumflex Agrave -25.55 KPX Ocircumflex Aogonek -25.55 KPX Ocircumflex Aring -25.55 KPX Ocircumflex Atilde -25.55 KPX Ocircumflex V -25.55 KPX Ocircumflex W -25.55 KPX Ocircumflex X -25.55 KPX Ocircumflex Y -25.55 KPX Ocircumflex Yacute -25.55 KPX Odieresis A -25.55 KPX Odieresis Aacute -25.55 KPX Odieresis Abreve -25.55 KPX Odieresis Acircumflex -25.55 KPX Odieresis Adieresis -25.55 KPX Odieresis Agrave -25.55 KPX Odieresis Aogonek -25.55 KPX Odieresis Aring -25.55 KPX Odieresis Atilde -25.55 KPX Odieresis V -25.55 KPX Odieresis W -25.55 KPX Odieresis X -25.55 KPX Odieresis Y -25.55 KPX Odieresis Yacute -25.55 KPX Ograve A -25.55 KPX Ograve Aacute -25.55 KPX Ograve Abreve -25.55 KPX Ograve Acircumflex -25.55 KPX Ograve Adieresis -25.55 KPX Ograve Agrave -25.55 KPX Ograve Aogonek -25.55 KPX Ograve Aring -25.55 KPX Ograve Atilde -25.55 KPX Ograve V -25.55 KPX Ograve W -25.55 KPX Ograve X -25.55 KPX Ograve Y -25.55 KPX Ograve Yacute -25.55 KPX Ohungarumlaut A -25.55 KPX Ohungarumlaut Aacute -25.55 KPX Ohungarumlaut Abreve -25.55 KPX Ohungarumlaut Acircumflex -25.55 KPX Ohungarumlaut Adieresis -25.55 KPX Ohungarumlaut Agrave -25.55 KPX Ohungarumlaut Aogonek -25.55 KPX Ohungarumlaut Aring -25.55 KPX Ohungarumlaut Atilde -25.55 KPX Ohungarumlaut V -25.55 KPX Ohungarumlaut W -25.55 KPX Ohungarumlaut X -25.55 KPX Ohungarumlaut Y -25.55 KPX Ohungarumlaut Yacute -25.55 KPX Oslash A -25.55 KPX Oslash Aacute -25.55 KPX Oslash Abreve -25.55 KPX Oslash Acircumflex -25.55 KPX Oslash Adieresis -25.55 KPX Oslash Agrave -25.55 KPX Oslash Aogonek -25.55 KPX Oslash Aring -25.55 KPX Oslash Atilde -25.55 KPX Oslash V -25.55 KPX Oslash W -25.55 KPX Oslash X -25.55 KPX Oslash Y -25.55 KPX Oslash Yacute -25.55 KPX Otilde A -25.55 KPX Otilde Aacute -25.55 KPX Otilde Abreve -25.55 KPX Otilde Acircumflex -25.55 KPX Otilde Adieresis -25.55 KPX Otilde Agrave -25.55 KPX Otilde Aogonek -25.55 KPX Otilde Aring -25.55 KPX Otilde Atilde -25.55 KPX Otilde V -25.55 KPX Otilde W -25.55 KPX Otilde X -25.55 KPX Otilde Y -25.55 KPX Otilde Yacute -25.55 KPX P A -76.65 KPX P Aacute -76.65 KPX P Abreve -76.65 KPX P Acircumflex -76.65 KPX P Adieresis -76.65 KPX P Agrave -76.65 KPX P Aogonek -76.65 KPX P Aring -76.65 KPX P Atilde -76.65 KPX R C -25.55 KPX R Cacute -25.55 KPX R Ccaron -25.55 KPX R G -25.55 KPX R Gbreve -25.55 KPX R O -25.55 KPX R Oacute -25.55 KPX R Ocircumflex -25.55 KPX R Odieresis -25.55 KPX R Ograve -25.55 KPX R Ohungarumlaut -25.55 KPX R Oslash -25.55 KPX R Otilde -25.55 KPX R Q -25.55 KPX R T -76.65 KPX R Tcaron -76.65 KPX R Tcedilla -76.65 KPX R U -25.55 KPX R Uacute -25.55 KPX R Ucircumflex -25.55 KPX R Udieresis -25.55 KPX R Ugrave -25.55 KPX R Uhungarumlaut -25.55 KPX R Uring -25.55 KPX R V -102.2 KPX R W -102.2 KPX R Y -76.65 KPX R Ydieresis -76.65 KPX R a -51.1 KPX R aacute -51.1 KPX R acircumflex -51.1 KPX R acircumflex -51.1 KPX R adieresis -51.1 KPX R ae -51.1 KPX R agrave -51.1 KPX R aogonek -51.1 KPX R aring -51.1 KPX R atilde -51.1 KPX R b -25.55 KPX R c -51.1 KPX R cacute -51.1 KPX R cacute -51.1 KPX R ccaron -51.1 KPX R ccedilla -51.1 KPX R d -51.1 KPX R dbar -51.1 KPX R e -51.1 KPX R eacute -51.1 KPX R ecaron -51.1 KPX R ecircumflex -51.1 KPX R edieresis -51.1 KPX R egrave -51.1 KPX R eogonek -51.1 KPX R g -51.1 KPX R gbreve -51.1 KPX R h -25.55 KPX R i -25.55 KPX R iacute -25.55 KPX R k -25.55 KPX R l -25.55 KPX R lacute -25.55 KPX R lquoteright -25.55 KPX R m -25.55 KPX R n -25.55 KPX R o -51.1 KPX R oacute -51.1 KPX R ocircumflex -51.1 KPX R odieresis -51.1 KPX R oe -51.1 KPX R ograve -51.1 KPX R ohungarumlaut -51.1 KPX R oslash -51.1 KPX R otilde -51.1 KPX R q -51.1 KPX R r -25.55 KPX R t -25.55 KPX R tcedilla -25.55 KPX R tquoteright -25.55 KPX R u -25.55 KPX R uacute -25.55 KPX R ucircumflex -25.55 KPX R udieresis -25.55 KPX R ugrave -25.55 KPX R uhungarumlaut -25.55 KPX R uring -25.55 KPX R v -25.55 KPX R w -25.55 KPX Racute C -25.55 KPX Racute Cacute -25.55 KPX Racute Ccaron -25.55 KPX Racute G -25.55 KPX Racute Gbreve -25.55 KPX Racute O -25.55 KPX Racute Oacute -25.55 KPX Racute Ocircumflex -25.55 KPX Racute Odieresis -25.55 KPX Racute Ograve -25.55 KPX Racute Ohungarumlaut -25.55 KPX Racute Oslash -25.55 KPX Racute Otilde -25.55 KPX Racute Q -25.55 KPX Racute T -76.65 KPX Racute Tcaron -76.65 KPX Racute Tcedilla -76.65 KPX Racute U -25.55 KPX Racute Uacute -25.55 KPX Racute Ucircumflex -25.55 KPX Racute Udieresis -25.55 KPX Racute Ugrave -25.55 KPX Racute Uhungarumlaut -25.55 KPX Racute Uring -25.55 KPX Racute V -102.2 KPX Racute W -102.2 KPX Racute Y -76.65 KPX Racute Ydieresis -76.65 KPX Racute a -51.1 KPX Racute aacute -51.1 KPX Racute acircumflex -51.1 KPX Racute acircumflex -51.1 KPX Racute adieresis -51.1 KPX Racute ae -51.1 KPX Racute agrave -51.1 KPX Racute aogonek -51.1 KPX Racute aring -51.1 KPX Racute atilde -51.1 KPX Racute b -25.55 KPX Racute c -51.1 KPX Racute cacute -51.1 KPX Racute cacute -51.1 KPX Racute ccaron -51.1 KPX Racute ccedilla -51.1 KPX Racute d -51.1 KPX Racute dbar -51.1 KPX Racute e -51.1 KPX Racute eacute -51.1 KPX Racute ecaron -51.1 KPX Racute ecircumflex -51.1 KPX Racute edieresis -51.1 KPX Racute egrave -51.1 KPX Racute eogonek -51.1 KPX Racute g -51.1 KPX Racute gbreve -51.1 KPX Racute h -25.55 KPX Racute i -25.55 KPX Racute iacute -25.55 KPX Racute k -25.55 KPX Racute l -25.55 KPX Racute lacute -25.55 KPX Racute lquoteright -25.55 KPX Racute m -25.55 KPX Racute n -25.55 KPX Racute o -51.1 KPX Racute oacute -51.1 KPX Racute ocircumflex -51.1 KPX Racute odieresis -51.1 KPX Racute oe -51.1 KPX Racute ograve -51.1 KPX Racute ohungarumlaut -51.1 KPX Racute oslash -51.1 KPX Racute otilde -51.1 KPX Racute q -51.1 KPX Racute r -25.55 KPX Racute t -25.55 KPX Racute tcedilla -25.55 KPX Racute tquoteright -25.55 KPX Racute u -25.55 KPX Racute uacute -25.55 KPX Racute ucircumflex -25.55 KPX Racute udieresis -25.55 KPX Racute ugrave -25.55 KPX Racute uhungarumlaut -25.55 KPX Racute uring -25.55 KPX Racute v -25.55 KPX Racute w -25.55 KPX T A -76.65 KPX T Aacute -76.65 KPX T Abreve -76.65 KPX T Acircumflex -76.65 KPX T Adieresis -76.65 KPX T Agrave -76.65 KPX T Aogonek -76.65 KPX T Aring -76.65 KPX T Atilde -76.65 KPX T a -76.65 KPX T e -76.65 KPX T o -76.65 KPX T r -76.65 KPX T u -76.65 KPX T y -76.65 KPX Tcaron A -76.65 KPX Tcaron Aacute -76.65 KPX Tcaron Abreve -76.65 KPX Tcaron Acircumflex -76.65 KPX Tcaron Adieresis -76.65 KPX Tcaron Agrave -76.65 KPX Tcaron Aogonek -76.65 KPX Tcaron Aring -76.65 KPX Tcaron Atilde -76.65 KPX Tcaron a -76.65 KPX Tcaron e -76.65 KPX Tcaron o -76.65 KPX Tcaron r -76.65 KPX Tcaron u -76.65 KPX Tcaron y -76.65 KPX Tcedilla A -76.65 KPX Tcedilla Aacute -76.65 KPX Tcedilla Abreve -76.65 KPX Tcedilla Acircumflex -76.65 KPX Tcedilla Adieresis -76.65 KPX Tcedilla Agrave -76.65 KPX Tcedilla Aogonek -76.65 KPX Tcedilla Aring -76.65 KPX Tcedilla Atilde -76.65 KPX Tcedilla a -76.65 KPX Tcedilla e -76.65 KPX Tcedilla o -76.65 KPX Tcedilla r -76.65 KPX Tcedilla u -76.65 KPX Tcedilla y -76.65 KPX V A -102.2 KPX V Aacute -102.2 KPX V Abreve -102.2 KPX V Acircumflex -102.2 KPX V Adieresis -102.2 KPX V Agrave -102.2 KPX V Aogonek -102.2 KPX V Aring -102.2 KPX V Atilde -102.2 KPX V C -25.55 KPX V Cacute -25.55 KPX V Ccaron -25.55 KPX V G -25.55 KPX V Gbreve -25.55 KPX V O -25.55 KPX V Oacute -25.55 KPX V Ocircumflex -25.55 KPX V Odieresis -25.55 KPX V Ograve -25.55 KPX V Ohungarumlaut -25.55 KPX V Oslash -25.55 KPX V Otilde -25.55 KPX V Q -25.55 KPX V a -76.65 KPX V aogonek -76.65 KPX V e -76.65 KPX V eogonek -76.65 KPX V o -76.65 KPX V r -76.65 KPX V u -76.65 KPX W A -76.65 KPX W Aacute -76.65 KPX W Abreve -76.65 KPX W Acircumflex -76.65 KPX W Adieresis -76.65 KPX W Agrave -76.65 KPX W Aogonek -76.65 KPX W Aring -76.65 KPX W Atilde -76.65 KPX X C -25.55 KPX X Cacute -25.55 KPX X Ccaron -25.55 KPX X G -25.55 KPX X Gbreve -25.55 KPX X O -25.55 KPX X Oacute -25.55 KPX X Ocircumflex -25.55 KPX X Odieresis -25.55 KPX X Ograve -25.55 KPX X Ohungarumlaut -25.55 KPX X Oslash -25.55 KPX X Otilde -25.55 KPX X Q -25.55 KPX Y A -76.65 KPX Y Aacute -76.65 KPX Y Abreve -76.65 KPX Y Acircumflex -76.65 KPX Y Adieresis -76.65 KPX Y Agrave -76.65 KPX Y Aogonek -76.65 KPX Y Aring -76.65 KPX Y Atilde -76.65 KPX Y a -76.65 KPX Y e -76.65 KPX Y o -76.65 KPX Y r -76.65 KPX Y u -76.65 KPX Yacute A -76.65 KPX Yacute Aacute -76.65 KPX Yacute Abreve -76.65 KPX Yacute Acircumflex -76.65 KPX Yacute Adieresis -76.65 KPX Yacute Agrave -76.65 KPX Yacute Aogonek -76.65 KPX Yacute Aring -76.65 KPX Yacute Atilde -76.65 KPX Yacute a -76.65 KPX Yacute e -76.65 KPX Yacute o -76.65 KPX Yacute r -76.65 KPX Yacute u -76.65 KPX b a -51.1 KPX b aacute -51.1 KPX b acircumflex -51.1 KPX b acircumflex -51.1 KPX b adieresis -51.1 KPX b ae -51.1 KPX b agrave -51.1 KPX b aogonek -51.1 KPX b aring -51.1 KPX b atilde -51.1 KPX b c -51.1 KPX b cacute -51.1 KPX b cacute -51.1 KPX b ccaron -51.1 KPX b ccedilla -51.1 KPX b d -51.1 KPX b dbar -51.1 KPX b e -51.1 KPX b eacute -51.1 KPX b ecaron -51.1 KPX b ecircumflex -51.1 KPX b edieresis -51.1 KPX b egrave -51.1 KPX b eogonek -51.1 KPX b g -51.1 KPX b gbreve -51.1 KPX b o -51.1 KPX b oacute -51.1 KPX b ocircumflex -51.1 KPX b odieresis -51.1 KPX b oe -51.1 KPX b ograve -51.1 KPX b ohungarumlaut -51.1 KPX b oslash -51.1 KPX b otilde -51.1 KPX b q -51.1 KPX c a -51.1 KPX c aacute -51.1 KPX c acircumflex -51.1 KPX c acircumflex -51.1 KPX c adieresis -51.1 KPX c ae -51.1 KPX c agrave -51.1 KPX c aogonek -51.1 KPX c aring -51.1 KPX c atilde -51.1 KPX c c -51.1 KPX c cacute -51.1 KPX c cacute -51.1 KPX c ccaron -51.1 KPX c ccedilla -51.1 KPX c d -51.1 KPX c dbar -51.1 KPX c e -51.1 KPX c eacute -51.1 KPX c ecaron -51.1 KPX c ecircumflex -51.1 KPX c edieresis -51.1 KPX c egrave -51.1 KPX c eogonek -51.1 KPX c g -51.1 KPX c gbreve -51.1 KPX c o -51.1 KPX c oacute -51.1 KPX c ocircumflex -51.1 KPX c odieresis -51.1 KPX c oe -51.1 KPX c ograve -51.1 KPX c ohungarumlaut -51.1 KPX c oslash -51.1 KPX c otilde -51.1 KPX c q -51.1 KPX cacute a -51.1 KPX cacute aacute -51.1 KPX cacute acircumflex -51.1 KPX cacute acircumflex -51.1 KPX cacute adieresis -51.1 KPX cacute ae -51.1 KPX cacute agrave -51.1 KPX cacute aogonek -51.1 KPX cacute aring -51.1 KPX cacute atilde -51.1 KPX cacute c -51.1 KPX cacute cacute -51.1 KPX cacute cacute -51.1 KPX cacute ccaron -51.1 KPX cacute ccedilla -51.1 KPX cacute d -51.1 KPX cacute dbar -51.1 KPX cacute e -51.1 KPX cacute eacute -51.1 KPX cacute ecaron -51.1 KPX cacute ecircumflex -51.1 KPX cacute edieresis -51.1 KPX cacute egrave -51.1 KPX cacute eogonek -51.1 KPX cacute g -51.1 KPX cacute gbreve -51.1 KPX cacute o -51.1 KPX cacute oacute -51.1 KPX cacute ocircumflex -51.1 KPX cacute odieresis -51.1 KPX cacute oe -51.1 KPX cacute ograve -51.1 KPX cacute ohungarumlaut -51.1 KPX cacute oslash -51.1 KPX cacute otilde -51.1 KPX cacute q -51.1 KPX ccaron a -51.1 KPX ccaron aacute -51.1 KPX ccaron acircumflex -51.1 KPX ccaron acircumflex -51.1 KPX ccaron adieresis -51.1 KPX ccaron ae -51.1 KPX ccaron agrave -51.1 KPX ccaron aogonek -51.1 KPX ccaron aring -51.1 KPX ccaron atilde -51.1 KPX ccaron c -51.1 KPX ccaron cacute -51.1 KPX ccaron cacute -51.1 KPX ccaron ccaron -51.1 KPX ccaron ccedilla -51.1 KPX ccaron d -51.1 KPX ccaron dbar -51.1 KPX ccaron e -51.1 KPX ccaron eacute -51.1 KPX ccaron ecaron -51.1 KPX ccaron ecircumflex -51.1 KPX ccaron edieresis -51.1 KPX ccaron egrave -51.1 KPX ccaron eogonek -51.1 KPX ccaron g -51.1 KPX ccaron gbreve -51.1 KPX ccaron o -51.1 KPX ccaron oacute -51.1 KPX ccaron ocircumflex -51.1 KPX ccaron odieresis -51.1 KPX ccaron oe -51.1 KPX ccaron ograve -51.1 KPX ccaron ohungarumlaut -51.1 KPX ccaron oslash -51.1 KPX ccaron otilde -51.1 KPX ccaron q -51.1 KPX d l 51.1 KPX d lacute 51.1 KPX d lquoteright 51.1 KPX e a -51.1 KPX e aacute -51.1 KPX e acircumflex -51.1 KPX e acircumflex -51.1 KPX e adieresis -51.1 KPX e ae -51.1 KPX e agrave -51.1 KPX e aogonek -51.1 KPX e aring -51.1 KPX e atilde -51.1 KPX e c -51.1 KPX e cacute -51.1 KPX e cacute -51.1 KPX e ccaron -51.1 KPX e ccedilla -51.1 KPX e d -51.1 KPX e dbar -51.1 KPX e e -51.1 KPX e eacute -51.1 KPX e ecaron -51.1 KPX e ecircumflex -51.1 KPX e edieresis -51.1 KPX e egrave -51.1 KPX e eogonek -51.1 KPX e g -51.1 KPX e gbreve -51.1 KPX e o -51.1 KPX e oacute -51.1 KPX e ocircumflex -51.1 KPX e odieresis -51.1 KPX e oe -51.1 KPX e ograve -51.1 KPX e ohungarumlaut -51.1 KPX e oslash -51.1 KPX e otilde -51.1 KPX e q -51.1 KPX eacute a -51.1 KPX eacute aacute -51.1 KPX eacute acircumflex -51.1 KPX eacute acircumflex -51.1 KPX eacute adieresis -51.1 KPX eacute ae -51.1 KPX eacute agrave -51.1 KPX eacute aogonek -51.1 KPX eacute aring -51.1 KPX eacute atilde -51.1 KPX eacute c -51.1 KPX eacute cacute -51.1 KPX eacute cacute -51.1 KPX eacute ccaron -51.1 KPX eacute ccedilla -51.1 KPX eacute d -51.1 KPX eacute dbar -51.1 KPX eacute e -51.1 KPX eacute eacute -51.1 KPX eacute ecaron -51.1 KPX eacute ecircumflex -51.1 KPX eacute edieresis -51.1 KPX eacute egrave -51.1 KPX eacute eogonek -51.1 KPX eacute g -51.1 KPX eacute gbreve -51.1 KPX eacute o -51.1 KPX eacute oacute -51.1 KPX eacute ocircumflex -51.1 KPX eacute odieresis -51.1 KPX eacute oe -51.1 KPX eacute ograve -51.1 KPX eacute ohungarumlaut -51.1 KPX eacute oslash -51.1 KPX eacute otilde -51.1 KPX eacute q -51.1 KPX ecaron a -51.1 KPX ecaron aacute -51.1 KPX ecaron acircumflex -51.1 KPX ecaron acircumflex -51.1 KPX ecaron adieresis -51.1 KPX ecaron ae -51.1 KPX ecaron agrave -51.1 KPX ecaron aogonek -51.1 KPX ecaron aring -51.1 KPX ecaron atilde -51.1 KPX ecaron c -51.1 KPX ecaron cacute -51.1 KPX ecaron cacute -51.1 KPX ecaron ccaron -51.1 KPX ecaron ccedilla -51.1 KPX ecaron d -51.1 KPX ecaron dbar -51.1 KPX ecaron e -51.1 KPX ecaron eacute -51.1 KPX ecaron ecaron -51.1 KPX ecaron ecircumflex -51.1 KPX ecaron edieresis -51.1 KPX ecaron egrave -51.1 KPX ecaron eogonek -51.1 KPX ecaron g -51.1 KPX ecaron gbreve -51.1 KPX ecaron o -51.1 KPX ecaron oacute -51.1 KPX ecaron ocircumflex -51.1 KPX ecaron odieresis -51.1 KPX ecaron oe -51.1 KPX ecaron ograve -51.1 KPX ecaron ohungarumlaut -51.1 KPX ecaron oslash -51.1 KPX ecaron otilde -51.1 KPX ecaron q -51.1 KPX ecircumflex a -51.1 KPX ecircumflex aacute -51.1 KPX ecircumflex acircumflex -51.1 KPX ecircumflex acircumflex -51.1 KPX ecircumflex adieresis -51.1 KPX ecircumflex ae -51.1 KPX ecircumflex agrave -51.1 KPX ecircumflex aogonek -51.1 KPX ecircumflex aring -51.1 KPX ecircumflex atilde -51.1 KPX ecircumflex c -51.1 KPX ecircumflex cacute -51.1 KPX ecircumflex cacute -51.1 KPX ecircumflex ccaron -51.1 KPX ecircumflex ccedilla -51.1 KPX ecircumflex d -51.1 KPX ecircumflex dbar -51.1 KPX ecircumflex e -51.1 KPX ecircumflex eacute -51.1 KPX ecircumflex ecaron -51.1 KPX ecircumflex ecircumflex -51.1 KPX ecircumflex edieresis -51.1 KPX ecircumflex egrave -51.1 KPX ecircumflex eogonek -51.1 KPX ecircumflex g -51.1 KPX ecircumflex gbreve -51.1 KPX ecircumflex o -51.1 KPX ecircumflex oacute -51.1 KPX ecircumflex ocircumflex -51.1 KPX ecircumflex odieresis -51.1 KPX ecircumflex oe -51.1 KPX ecircumflex ograve -51.1 KPX ecircumflex ohungarumlaut -51.1 KPX ecircumflex oslash -51.1 KPX ecircumflex otilde -51.1 KPX ecircumflex q -51.1 KPX edieresis a -51.1 KPX edieresis aacute -51.1 KPX edieresis acircumflex -51.1 KPX edieresis acircumflex -51.1 KPX edieresis adieresis -51.1 KPX edieresis ae -51.1 KPX edieresis agrave -51.1 KPX edieresis aogonek -51.1 KPX edieresis aring -51.1 KPX edieresis atilde -51.1 KPX edieresis c -51.1 KPX edieresis cacute -51.1 KPX edieresis cacute -51.1 KPX edieresis ccaron -51.1 KPX edieresis ccedilla -51.1 KPX edieresis d -51.1 KPX edieresis dbar -51.1 KPX edieresis e -51.1 KPX edieresis eacute -51.1 KPX edieresis ecaron -51.1 KPX edieresis ecircumflex -51.1 KPX edieresis edieresis -51.1 KPX edieresis egrave -51.1 KPX edieresis eogonek -51.1 KPX edieresis g -51.1 KPX edieresis gbreve -51.1 KPX edieresis o -51.1 KPX edieresis oacute -51.1 KPX edieresis ocircumflex -51.1 KPX edieresis odieresis -51.1 KPX edieresis oe -51.1 KPX edieresis ograve -51.1 KPX edieresis ohungarumlaut -51.1 KPX edieresis oslash -51.1 KPX edieresis otilde -51.1 KPX edieresis q -51.1 KPX egrave a -51.1 KPX egrave aacute -51.1 KPX egrave acircumflex -51.1 KPX egrave acircumflex -51.1 KPX egrave adieresis -51.1 KPX egrave ae -51.1 KPX egrave agrave -51.1 KPX egrave aogonek -51.1 KPX egrave aring -51.1 KPX egrave atilde -51.1 KPX egrave c -51.1 KPX egrave cacute -51.1 KPX egrave cacute -51.1 KPX egrave ccaron -51.1 KPX egrave ccedilla -51.1 KPX egrave d -51.1 KPX egrave dbar -51.1 KPX egrave e -51.1 KPX egrave eacute -51.1 KPX egrave ecaron -51.1 KPX egrave ecircumflex -51.1 KPX egrave edieresis -51.1 KPX egrave egrave -51.1 KPX egrave eogonek -51.1 KPX egrave g -51.1 KPX egrave gbreve -51.1 KPX egrave o -51.1 KPX egrave oacute -51.1 KPX egrave ocircumflex -51.1 KPX egrave odieresis -51.1 KPX egrave oe -51.1 KPX egrave ograve -51.1 KPX egrave ohungarumlaut -51.1 KPX egrave oslash -51.1 KPX egrave otilde -51.1 KPX egrave q -51.1 KPX eogonek a -51.1 KPX eogonek aacute -51.1 KPX eogonek acircumflex -51.1 KPX eogonek acircumflex -51.1 KPX eogonek adieresis -51.1 KPX eogonek ae -51.1 KPX eogonek agrave -51.1 KPX eogonek aogonek -51.1 KPX eogonek aring -51.1 KPX eogonek atilde -51.1 KPX eogonek c -51.1 KPX eogonek cacute -51.1 KPX eogonek cacute -51.1 KPX eogonek ccaron -51.1 KPX eogonek ccedilla -51.1 KPX eogonek d -51.1 KPX eogonek dbar -51.1 KPX eogonek e -51.1 KPX eogonek eacute -51.1 KPX eogonek ecaron -51.1 KPX eogonek ecircumflex -51.1 KPX eogonek edieresis -51.1 KPX eogonek egrave -51.1 KPX eogonek eogonek -51.1 KPX eogonek g -51.1 KPX eogonek gbreve -51.1 KPX eogonek o -51.1 KPX eogonek oacute -51.1 KPX eogonek ocircumflex -51.1 KPX eogonek odieresis -51.1 KPX eogonek oe -51.1 KPX eogonek ograve -51.1 KPX eogonek ohungarumlaut -51.1 KPX eogonek oslash -51.1 KPX eogonek otilde -51.1 KPX eogonek q -51.1 KPX f bracketright 104.28 KPX f exclam 104.28 KPX f parenright 104.28 KPX f question 104.28 KPX f quoteright 104.28 KPX ff bracketright 104.28 KPX ff exclam 104.28 KPX ff parenright 104.28 KPX ff question 104.28 KPX ff quoteright 104.28 KPX l l 51.1 KPX l lacute 51.1 KPX l lquoteright 51.1 KPX n quoteright -102.2 KPX o a -51.1 KPX o aacute -51.1 KPX o acircumflex -51.1 KPX o acircumflex -51.1 KPX o adieresis -51.1 KPX o ae -51.1 KPX o agrave -51.1 KPX o aogonek -51.1 KPX o aring -51.1 KPX o atilde -51.1 KPX o c -51.1 KPX o cacute -51.1 KPX o cacute -51.1 KPX o ccaron -51.1 KPX o ccedilla -51.1 KPX o d -51.1 KPX o dbar -51.1 KPX o e -51.1 KPX o eacute -51.1 KPX o ecaron -51.1 KPX o ecircumflex -51.1 KPX o edieresis -51.1 KPX o egrave -51.1 KPX o eogonek -51.1 KPX o g -51.1 KPX o gbreve -51.1 KPX o o -51.1 KPX o oacute -51.1 KPX o ocircumflex -51.1 KPX o odieresis -51.1 KPX o oe -51.1 KPX o ograve -51.1 KPX o ohungarumlaut -51.1 KPX o oslash -51.1 KPX o otilde -51.1 KPX o q -51.1 KPX oacute a -51.1 KPX oacute aacute -51.1 KPX oacute acircumflex -51.1 KPX oacute acircumflex -51.1 KPX oacute adieresis -51.1 KPX oacute ae -51.1 KPX oacute agrave -51.1 KPX oacute aogonek -51.1 KPX oacute aring -51.1 KPX oacute atilde -51.1 KPX oacute c -51.1 KPX oacute cacute -51.1 KPX oacute cacute -51.1 KPX oacute ccaron -51.1 KPX oacute ccedilla -51.1 KPX oacute d -51.1 KPX oacute dbar -51.1 KPX oacute e -51.1 KPX oacute eacute -51.1 KPX oacute ecaron -51.1 KPX oacute ecircumflex -51.1 KPX oacute edieresis -51.1 KPX oacute egrave -51.1 KPX oacute eogonek -51.1 KPX oacute g -51.1 KPX oacute gbreve -51.1 KPX oacute o -51.1 KPX oacute oacute -51.1 KPX oacute ocircumflex -51.1 KPX oacute odieresis -51.1 KPX oacute oe -51.1 KPX oacute ograve -51.1 KPX oacute ohungarumlaut -51.1 KPX oacute oslash -51.1 KPX oacute otilde -51.1 KPX oacute q -51.1 KPX ocircumflex a -51.1 KPX ocircumflex aacute -51.1 KPX ocircumflex acircumflex -51.1 KPX ocircumflex acircumflex -51.1 KPX ocircumflex adieresis -51.1 KPX ocircumflex ae -51.1 KPX ocircumflex agrave -51.1 KPX ocircumflex aogonek -51.1 KPX ocircumflex aring -51.1 KPX ocircumflex atilde -51.1 KPX ocircumflex c -51.1 KPX ocircumflex cacute -51.1 KPX ocircumflex cacute -51.1 KPX ocircumflex ccaron -51.1 KPX ocircumflex ccedilla -51.1 KPX ocircumflex d -51.1 KPX ocircumflex dbar -51.1 KPX ocircumflex e -51.1 KPX ocircumflex eacute -51.1 KPX ocircumflex ecaron -51.1 KPX ocircumflex ecircumflex -51.1 KPX ocircumflex edieresis -51.1 KPX ocircumflex egrave -51.1 KPX ocircumflex eogonek -51.1 KPX ocircumflex g -51.1 KPX ocircumflex gbreve -51.1 KPX ocircumflex o -51.1 KPX ocircumflex oacute -51.1 KPX ocircumflex ocircumflex -51.1 KPX ocircumflex odieresis -51.1 KPX ocircumflex oe -51.1 KPX ocircumflex ograve -51.1 KPX ocircumflex ohungarumlaut -51.1 KPX ocircumflex oslash -51.1 KPX ocircumflex otilde -51.1 KPX ocircumflex q -51.1 KPX odieresis a -51.1 KPX odieresis aacute -51.1 KPX odieresis acircumflex -51.1 KPX odieresis acircumflex -51.1 KPX odieresis adieresis -51.1 KPX odieresis ae -51.1 KPX odieresis agrave -51.1 KPX odieresis aogonek -51.1 KPX odieresis aring -51.1 KPX odieresis atilde -51.1 KPX odieresis c -51.1 KPX odieresis cacute -51.1 KPX odieresis cacute -51.1 KPX odieresis ccaron -51.1 KPX odieresis ccedilla -51.1 KPX odieresis d -51.1 KPX odieresis dbar -51.1 KPX odieresis e -51.1 KPX odieresis eacute -51.1 KPX odieresis ecaron -51.1 KPX odieresis ecircumflex -51.1 KPX odieresis edieresis -51.1 KPX odieresis egrave -51.1 KPX odieresis eogonek -51.1 KPX odieresis g -51.1 KPX odieresis gbreve -51.1 KPX odieresis o -51.1 KPX odieresis oacute -51.1 KPX odieresis ocircumflex -51.1 KPX odieresis odieresis -51.1 KPX odieresis oe -51.1 KPX odieresis ograve -51.1 KPX odieresis ohungarumlaut -51.1 KPX odieresis oslash -51.1 KPX odieresis otilde -51.1 KPX odieresis q -51.1 KPX ograve a -51.1 KPX ograve aacute -51.1 KPX ograve acircumflex -51.1 KPX ograve acircumflex -51.1 KPX ograve adieresis -51.1 KPX ograve ae -51.1 KPX ograve agrave -51.1 KPX ograve aogonek -51.1 KPX ograve aring -51.1 KPX ograve atilde -51.1 KPX ograve c -51.1 KPX ograve cacute -51.1 KPX ograve cacute -51.1 KPX ograve ccaron -51.1 KPX ograve ccedilla -51.1 KPX ograve d -51.1 KPX ograve dbar -51.1 KPX ograve e -51.1 KPX ograve eacute -51.1 KPX ograve ecaron -51.1 KPX ograve ecircumflex -51.1 KPX ograve edieresis -51.1 KPX ograve egrave -51.1 KPX ograve eogonek -51.1 KPX ograve g -51.1 KPX ograve gbreve -51.1 KPX ograve o -51.1 KPX ograve oacute -51.1 KPX ograve ocircumflex -51.1 KPX ograve odieresis -51.1 KPX ograve oe -51.1 KPX ograve ograve -51.1 KPX ograve ohungarumlaut -51.1 KPX ograve oslash -51.1 KPX ograve otilde -51.1 KPX ograve q -51.1 KPX otilde a -51.1 KPX otilde aacute -51.1 KPX otilde acircumflex -51.1 KPX otilde acircumflex -51.1 KPX otilde adieresis -51.1 KPX otilde ae -51.1 KPX otilde agrave -51.1 KPX otilde aogonek -51.1 KPX otilde aring -51.1 KPX otilde atilde -51.1 KPX otilde c -51.1 KPX otilde cacute -51.1 KPX otilde cacute -51.1 KPX otilde ccaron -51.1 KPX otilde ccedilla -51.1 KPX otilde d -51.1 KPX otilde dbar -51.1 KPX otilde e -51.1 KPX otilde eacute -51.1 KPX otilde ecaron -51.1 KPX otilde ecircumflex -51.1 KPX otilde edieresis -51.1 KPX otilde egrave -51.1 KPX otilde eogonek -51.1 KPX otilde g -51.1 KPX otilde gbreve -51.1 KPX otilde o -51.1 KPX otilde oacute -51.1 KPX otilde ocircumflex -51.1 KPX otilde odieresis -51.1 KPX otilde oe -51.1 KPX otilde ograve -51.1 KPX otilde ohungarumlaut -51.1 KPX otilde oslash -51.1 KPX otilde otilde -51.1 KPX otilde q -51.1 KPX p a -51.1 KPX p aacute -51.1 KPX p acircumflex -51.1 KPX p acircumflex -51.1 KPX p adieresis -51.1 KPX p ae -51.1 KPX p agrave -51.1 KPX p aogonek -51.1 KPX p aring -51.1 KPX p atilde -51.1 KPX p c -51.1 KPX p cacute -51.1 KPX p cacute -51.1 KPX p ccaron -51.1 KPX p ccedilla -51.1 KPX p d -51.1 KPX p dbar -51.1 KPX p e -51.1 KPX p eacute -51.1 KPX p ecaron -51.1 KPX p ecircumflex -51.1 KPX p edieresis -51.1 KPX p egrave -51.1 KPX p eogonek -51.1 KPX p g -51.1 KPX p gbreve -51.1 KPX p o -51.1 KPX p oacute -51.1 KPX p ocircumflex -51.1 KPX p odieresis -51.1 KPX p oe -51.1 KPX p ograve -51.1 KPX p ohungarumlaut -51.1 KPX p oslash -51.1 KPX p otilde -51.1 KPX p q -51.1 KPX quoteright exclam 102.2 KPX quoteright question 102.2 KPX r a -51.1 KPX r aacute -51.1 KPX r acircumflex -51.1 KPX r acircumflex -51.1 KPX r adieresis -51.1 KPX r ae -51.1 KPX r agrave -51.1 KPX r aogonek -51.1 KPX r aring -51.1 KPX r atilde -51.1 KPX r c -51.1 KPX r cacute -51.1 KPX r cacute -51.1 KPX r ccaron -51.1 KPX r ccedilla -51.1 KPX r d -51.1 KPX r dbar -51.1 KPX r e -51.1 KPX r eacute -51.1 KPX r ecaron -51.1 KPX r ecircumflex -51.1 KPX r edieresis -51.1 KPX r egrave -51.1 KPX r eogonek -51.1 KPX r g -51.1 KPX r gbreve -51.1 KPX r o -51.1 KPX r oacute -51.1 KPX r ocircumflex -51.1 KPX r odieresis -51.1 KPX r oe -51.1 KPX r ograve -51.1 KPX r ohungarumlaut -51.1 KPX r oslash -51.1 KPX r otilde -51.1 KPX r q -51.1 KPX thorn a -51.1 KPX thorn aacute -51.1 KPX thorn acircumflex -51.1 KPX thorn acircumflex -51.1 KPX thorn adieresis -51.1 KPX thorn ae -51.1 KPX thorn agrave -51.1 KPX thorn aogonek -51.1 KPX thorn aring -51.1 KPX thorn atilde -51.1 KPX thorn c -51.1 KPX thorn cacute -51.1 KPX thorn cacute -51.1 KPX thorn ccaron -51.1 KPX thorn ccedilla -51.1 KPX thorn d -51.1 KPX thorn dbar -51.1 KPX thorn e -51.1 KPX thorn eacute -51.1 KPX thorn ecaron -51.1 KPX thorn ecircumflex -51.1 KPX thorn edieresis -51.1 KPX thorn egrave -51.1 KPX thorn eogonek -51.1 KPX thorn g -51.1 KPX thorn gbreve -51.1 KPX thorn o -51.1 KPX thorn oacute -51.1 KPX thorn ocircumflex -51.1 KPX thorn odieresis -51.1 KPX thorn oe -51.1 KPX thorn ograve -51.1 KPX thorn ohungarumlaut -51.1 KPX thorn oslash -51.1 KPX thorn otilde -51.1 KPX thorn q -51.1 KPX w l 51.1 KPX w lacute 51.1 KPX w lquoteright 51.1 EndKernPairs EndKernData EndFontMetrics xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/afm/dcbxti10.afm0000664000175000017500000017131611742726711023463 0ustar uwabamiuwabamiStartFontMetrics 2.0 FontName dcbxti10 FullName dcbxti10 FamilyName dcbxti10 Weight Medium ItalicAngle 0.000000 IsFixedPitch false UnderlinePosition -133 UnderlineThickness 20 Version 1.0\(Level-B\) FontBBox -60, -308, 1261, 911 Notice Copyright \(C\) 1994, Basil K. Malyshev. All Rights Reserved.\nBaKoMa Fonts Collection, Level-B. EncodingScheme FontSpecific CapHeight 686 XHeight 444 Descender -194 Ascender 694 StartCharMetrics 256 C 0 ; WX 591 ; N grave ; B 272 500 455 699 ; C 1 ; WX 591 ; N acute ; B 342 500 578 699 ; C 2 ; WX 591 ; N circumflex ; B 246 521 562 694 ; C 3 ; WX 591 ; N tilde ; B 236 572 609 694 ; C 4 ; WX 591 ; N dieresis ; B 247 555 595 695 ; C 5 ; WX 591 ; N hungarumlaut ; B 252 504 609 702 ; C 6 ; WX 948.67 ; N ring ; B 462 544 701 711 ; C 7 ; WX 591 ; N caron ; B 259 500 572 642 ; C 8 ; WX 591 ; N breve ; B 263 513 600 694 ; C 9 ; WX 591 ; N macron ; B 218 557 603 611 ; C 10 ; WX 355.44 ; N dotaccent ; B 224 544 379 695 ; C 11 ; WX 532.11 ; N cedilla ; B 78 -189 383 19 ; C 12 ; WX 355.44 ; N ogonek ; B -29 -194 232 36 ; C 13 ; WX 355.44 ; N quotesinglbase ; B 52 -194 242 151 ; C 14 ; WX 532.11 ; N guilsinglleft ; B 159 40 452 432 ; C 15 ; WX 532.11 ; N guilsinglright ; B 115 40 447 432 ; C 16 ; WX 620.39 ; N quotedblleft ; B 231 349 663 694 ; C 17 ; WX 620.39 ; N quotedblright ; B 156 349 588 694 ; C 18 ; WX 620.39 ; N quotedblbase ; B 127 -194 559 151 ; C 19 ; WX 767.61 ; N guillemotleft ; B 159 40 688 432 ; C 20 ; WX 767.61 ; N guillemotright ; B 115 40 683 432 ; C 21 ; WX 591 ; N endash ; B 68 254 598 294 ; L hyphen emdash ; C 22 ; WX 1181.94 ; N emdash ; B 68 254 1127 294 ; C 23 ; WX 0 ; N compoundwordmark ; B 0 0 0 0 ; C 24 ; WX 473.22 ; N perthousand ; B 85 -56 400 347 ; C 25 ; WX 355.44 ; N dotlessi ; B 44 -8 360 452 ; C 26 ; WX 384.89 ; N dotlessj ; B -60 -202 346 452 ; C 27 ; WX 755.39 ; N ff ; B -49 -202 861 702 ; L i ffi ; L l ffl ; C 28 ; WX 674.28 ; N fi ; B -49 -202 679 702 ; C 29 ; WX 703.72 ; N fl ; B -49 -202 720 702 ; C 30 ; WX 1044.44 ; N ffi ; B -49 -202 1049 702 ; C 31 ; WX 1059.17 ; N ffl ; B -49 -202 1075 702 ; C 32 ; WX 591 ; N visiblespace ; B 19 -111 545 251 ; C 33 ; WX 386 ; N exclam ; B 104 0 400 711 ; C 34 ; WX 591 ; N quotedbl ; B 245 342 579 706 ; C 35 ; WX 944.22 ; N numbersign ; B 94 -194 913 694 ; C 36 ; WX 591 ; N dollar ; B 99 -56 606 750 ; C 37 ; WX 944.22 ; N percent ; B 141 -56 915 750 ; C 38 ; WX 885.33 ; N ampersand ; B 110 -17 865 711 ; C 39 ; WX 355.44 ; N quoteright ; B 192 349 385 694 ; L quoteright quotedblright ; C 40 ; WX 473.22 ; N parenleft ; B 136 -251 536 750 ; C 41 ; WX 473.22 ; N parenright ; B 0 -251 400 750 ; C 42 ; WX 591 ; N asterisk ; B 176 306 617 750 ; C 43 ; WX 885.33 ; N plus ; B 121 -104 826 603 ; C 44 ; WX 355.44 ; N comma ; B 56 -194 246 151 ; L comma quotedblbase ; C 45 ; WX 414.33 ; N hyphen ; B 60 174 356 271 ; L hyphen endash ; C 46 ; WX 355.44 ; N period ; B 88 0 243 151 ; C 47 ; WX 591 ; N slash ; B 2 -250 653 750 ; C 48 ; WX 591 ; N zero ; B 82 -17 607 661 ; C 49 ; WX 591 ; N one ; B 93 0 489 661 ; C 50 ; WX 591 ; N two ; B 57 -17 587 661 ; C 51 ; WX 591 ; N three ; B 77 -17 597 661 ; C 52 ; WX 591 ; N four ; B 23 -194 516 661 ; C 53 ; WX 591 ; N five ; B 88 -17 597 661 ; C 54 ; WX 591 ; N six ; B 101 -17 596 661 ; C 55 ; WX 591 ; N seven ; B 110 -17 677 661 ; C 56 ; WX 591 ; N eight ; B 79 -17 587 661 ; C 57 ; WX 591 ; N nine ; B 94 -17 590 661 ; C 58 ; WX 355.44 ; N colon ; B 88 0 316 444 ; C 59 ; WX 355.44 ; N semicolon ; B 56 -194 316 444 ; C 60 ; WX 885.33 ; N less ; B 150 -76 874 575 ; L less guillemotleft ; C 61 ; WX 885.33 ; N equal ; B 94 118 855 381 ; C 62 ; WX 885.33 ; N greater ; B 74 -76 797 575 ; L greater guillemotright ; C 63 ; WX 591 ; N question ; B 183 0 583 711 ; C 64 ; WX 885.33 ; N at ; B 133 -8 864 702 ; C 65 ; WX 865.33 ; N A ; B 22 0 755 711 ; C 66 ; WX 816.44 ; N B ; B 14 0 780 686 ; C 67 ; WX 826.44 ; N C ; B 132 -17 877 703 ; C 68 ; WX 875.33 ; N D ; B 14 0 834 686 ; C 69 ; WX 756.5 ; N E ; B 14 0 754 680 ; C 70 ; WX 727 ; N F ; B 14 0 740 680 ; C 71 ; WX 895.06 ; N G ; B 132 -17 877 703 ; C 72 ; WX 895.89 ; N H ; B 14 0 953 686 ; C 73 ; WX 471.56 ; N I ; B 7 0 537 686 ; C 74 ; WX 610.39 ; N J ; B 37 -17 659 686 ; C 75 ; WX 894.78 ; N K ; B 14 0 922 686 ; C 76 ; WX 697.61 ; N L ; B 14 0 638 686 ; C 77 ; WX 1072.5 ; N M ; B 14 0 1130 686 ; C 78 ; WX 895.89 ; N N ; B 14 0 953 686 ; C 79 ; WX 854.78 ; N O ; B 129 -17 834 703 ; C 80 ; WX 787 ; N P ; B 14 0 775 686 ; C 81 ; WX 854.78 ; N Q ; B 129 -194 834 703 ; C 82 ; WX 859.22 ; N R ; B 14 -17 800 686 ; C 83 ; WX 649.83 ; N S ; B 58 -17 672 703 ; C 84 ; WX 795.94 ; N T ; B 148 0 841 675 ; C 85 ; WX 880.61 ; N U ; B 168 -17 938 686 ; C 86 ; WX 865.33 ; N V ; B 167 -17 928 686 ; C 87 ; WX 1159.72 ; N W ; B 166 -17 1224 686 ; C 88 ; WX 865.33 ; N X ; B 16 0 877 686 ; C 89 ; WX 865.33 ; N Y ; B 161 0 934 686 ; C 90 ; WX 708.72 ; N Z ; B 63 0 756 686 ; C 91 ; WX 356 ; N bracketleft ; B 36 -250 454 750 ; C 92 ; WX 591 ; N backslash ; B 242 -250 413 750 ; C 93 ; WX 356 ; N bracketright ; B -35 -250 383 750 ; C 94 ; WX 708.72 ; N asciicircum ; B 231 452 662 632 ; C 95 ; WX 885.33 ; N underscore ; B 19 -308 666 -247 ; C 96 ; WX 355.44 ; N quoteleft ; B 169 349 362 694 ; L quoteleft quotedblleft ; C 97 ; WX 591 ; N a ; B 73 -8 596 452 ; C 98 ; WX 532.11 ; N b ; B 79 -8 508 694 ; C 99 ; WX 532.11 ; N c ; B 74 -8 505 452 ; C 100 ; WX 591 ; N d ; B 73 -8 606 694 ; C 101 ; WX 532.11 ; N e ; B 77 -8 505 452 ; C 102 ; WX 399.89 ; N f ; B -49 -202 506 702 ; L i fi ; L f ff ; L l fl ; C 103 ; WX 532.11 ; N g ; B 26 -202 534 452 ; C 104 ; WX 591 ; N h ; B 43 -8 596 694 ; C 105 ; WX 355.44 ; N i ; B 44 -8 360 694 ; C 106 ; WX 355.44 ; N j ; B -60 -202 383 694 ; C 107 ; WX 532.11 ; N k ; B 43 -8 537 694 ; C 108 ; WX 296.61 ; N l ; B 57 -8 312 694 ; C 109 ; WX 944.22 ; N m ; B 44 -8 949 452 ; C 110 ; WX 649.83 ; N n ; B 44 -8 655 452 ; C 111 ; WX 591 ; N o ; B 75 -8 566 452 ; C 112 ; WX 591 ; N p ; B -8 -194 567 452 ; C 113 ; WX 532.11 ; N q ; B 73 -194 546 452 ; C 114 ; WX 501.56 ; N r ; B 44 -8 529 452 ; C 115 ; WX 486.83 ; N s ; B 54 -8 455 452 ; C 116 ; WX 384.89 ; N t ; B 59 -8 390 643 ; C 117 ; WX 620.39 ; N u ; B 44 -8 625 452 ; C 118 ; WX 532.11 ; N v ; B 44 -8 524 453 ; C 119 ; WX 767.61 ; N w ; B 44 -8 760 453 ; C 120 ; WX 560.44 ; N x ; B 39 -8 570 452 ; C 121 ; WX 561.56 ; N y ; B 44 -202 566 452 ; C 122 ; WX 490.44 ; N z ; B 31 -8 509 452 ; C 123 ; WX 591 ; N braceleft ; B 129 -250 645 750 ; C 124 ; WX 355.44 ; N bar ; B 61 -250 357 750 ; C 125 ; WX 591 ; N braceright ; B 9 -250 525 750 ; C 126 ; WX 708.72 ; N asciitilde ; B 236 572 727 694 ; C 127 ; WX 414.33 ; N hyphen ; B 60 174 356 271 ; C 128 ; WX 865.33 ; N Abreve ; B 22 0 769 894 ; C 129 ; WX 865.33 ; N Aogonek ; B 22 -182 784 711 ; C 130 ; WX 826.44 ; N Cacute ; B 132 -17 877 899 ; C 131 ; WX 826.44 ; N Ccaron ; B 132 -17 877 843 ; C 132 ; WX 875.33 ; N Dcaron ; B 14 0 834 843 ; C 133 ; WX 756.5 ; N Ecaron ; B 14 0 754 843 ; C 134 ; WX 756.5 ; N Eogonek ; B 14 -182 754 680 ; C 135 ; WX 895.06 ; N Gbreve ; B 132 -17 877 894 ; C 136 ; WX 697.61 ; N Lacute ; B 14 0 674 899 ; C 137 ; WX 697.61 ; N Lquoteright ; B 14 0 764 686 ; C 138 ; WX 697.61 ; N Lslash ; B 14 0 638 686 ; C 139 ; WX 895.89 ; N Nacute ; B 14 0 953 899 ; C 140 ; WX 895.89 ; N Ncaron ; B 14 0 953 843 ; C 141 ; WX 837.56 ; N Eng ; B 22 -17 862 694 ; C 142 ; WX 854.78 ; N Ohungarumlaut ; B 129 -17 896 899 ; C 143 ; WX 859.22 ; N Racute ; B 14 -17 800 899 ; C 144 ; WX 859.22 ; N Rcaron ; B 14 -17 800 843 ; C 145 ; WX 649.83 ; N Sacute ; B 58 -17 672 899 ; C 146 ; WX 649.83 ; N Scaron ; B 58 -17 672 843 ; C 147 ; WX 649.83 ; N Scedilla ; B 58 -189 672 703 ; C 148 ; WX 795.94 ; N Tcaron ; B 148 0 841 843 ; C 149 ; WX 795.94 ; N Tcedilla ; B 148 -189 841 675 ; C 150 ; WX 880.61 ; N Uhungarumlaut ; B 168 -17 938 899 ; C 151 ; WX 880.61 ; N Uring ; B 168 -17 938 911 ; C 152 ; WX 865.33 ; N Ydieresis ; B 161 0 934 894 ; C 153 ; WX 708.72 ; N Zacute ; B 63 0 756 899 ; C 154 ; WX 708.72 ; N Zcaron ; B 63 0 756 843 ; C 155 ; WX 708.72 ; N Zdotaccent ; B 63 0 756 894 ; C 156 ; WX 1001.44 ; N IJ ; B 7 -17 1031 686 ; C 157 ; WX 471.56 ; N Idotaccent ; B 7 0 537 902 ; C 158 ; WX 591 ; N dbar ; B 73 -8 626 694 ; C 159 ; WX 549.33 ; N section ; B 66 -202 546 702 ; C 160 ; WX 591 ; N abreve ; B 73 -8 596 653 ; C 161 ; WX 591 ; N aogonek ; B 73 -194 596 452 ; C 162 ; WX 532.11 ; N cacute ; B 74 -8 539 658 ; C 163 ; WX 532.11 ; N ccaron ; B 74 -8 563 602 ; C 164 ; WX 591 ; N dquoteright ; B 73 -8 830 694 ; C 165 ; WX 532.11 ; N ecaron ; B 77 -8 533 602 ; C 166 ; WX 532.11 ; N eogonek ; B 77 -179 505 452 ; C 167 ; WX 532.11 ; N gbreve ; B 26 -202 561 653 ; C 168 ; WX 296.61 ; N lacute ; B 57 -8 485 908 ; C 169 ; WX 296.61 ; N lquoteright ; B 57 -8 536 694 ; C 170 ; WX 296.61 ; N lslash ; B 8 -8 338 694 ; C 171 ; WX 649.83 ; N nacute ; B 44 -8 655 658 ; C 172 ; WX 649.83 ; N ncaron ; B 44 -8 655 602 ; C 173 ; WX 649.83 ; N eng ; B 44 -202 575 452 ; C 174 ; WX 591 ; N ohungarumlaut ; B 75 -8 704 658 ; C 175 ; WX 501.56 ; N racute ; B 44 -8 529 658 ; C 176 ; WX 501.56 ; N rcaron ; B 44 -8 529 602 ; C 177 ; WX 486.83 ; N sacute ; B 54 -8 517 658 ; C 178 ; WX 486.83 ; N scaron ; B 54 -8 510 602 ; C 179 ; WX 486.83 ; N scedilla ; B 26 -189 455 452 ; C 180 ; WX 384.89 ; N tquoteright ; B 59 -8 529 708 ; C 181 ; WX 384.89 ; N tcedilla ; B 20 -189 390 643 ; C 182 ; WX 620.39 ; N uhungarumlaut ; B 44 -8 719 658 ; C 183 ; WX 620.39 ; N uring ; B 44 -8 625 670 ; C 184 ; WX 561.56 ; N ydieresis ; B 44 -202 570 652 ; C 185 ; WX 490.44 ; N zacute ; B 31 -8 518 658 ; C 186 ; WX 490.44 ; N zcaron ; B 31 -8 512 602 ; C 187 ; WX 490.44 ; N zdotaccent ; B 31 -8 509 694 ; C 188 ; WX 649.83 ; N ij ; B 44 -202 678 694 ; C 189 ; WX 386 ; N exclamdown ; B 50 -211 346 500 ; C 190 ; WX 591 ; N questiondown ; B 71 -211 471 500 ; C 191 ; WX 868.33 ; N sterling ; B 70 -8 753 708 ; C 192 ; WX 865.33 ; N Agrave ; B 22 0 755 899 ; C 193 ; WX 865.33 ; N Aacute ; B 22 0 755 899 ; C 194 ; WX 865.33 ; N Acircumflex ; B 22 0 755 894 ; C 195 ; WX 865.33 ; N Atilde ; B 22 0 777 894 ; C 196 ; WX 865.33 ; N Adieresis ; B 22 0 763 894 ; C 197 ; WX 865.33 ; N Aring ; B 22 0 755 870 ; C 198 ; WX 1022.56 ; N AE ; B 23 0 1022 686 ; C 199 ; WX 826.44 ; N Ccedilla ; B 132 -189 877 703 ; C 200 ; WX 756.5 ; N Egrave ; B 14 0 754 899 ; C 201 ; WX 756.5 ; N Eacute ; B 14 0 754 899 ; C 202 ; WX 756.5 ; N Ecircumflex ; B 14 0 754 894 ; C 203 ; WX 756.5 ; N Edieresis ; B 14 0 754 894 ; C 204 ; WX 471.56 ; N Igrave ; B 7 0 537 899 ; C 205 ; WX 471.56 ; N Iacute ; B 7 0 551 899 ; C 206 ; WX 471.56 ; N Icircumflex ; B 7 0 537 894 ; C 207 ; WX 471.56 ; N Idieresis ; B 7 0 566 894 ; C 208 ; WX 875.33 ; N Eth ; B 14 0 834 686 ; C 209 ; WX 895.89 ; N Ntilde ; B 14 0 953 894 ; C 210 ; WX 854.78 ; N Ograve ; B 129 -17 834 899 ; C 211 ; WX 854.78 ; N Oacute ; B 129 -17 834 899 ; C 212 ; WX 854.78 ; N Ocircumflex ; B 129 -17 834 894 ; C 213 ; WX 854.78 ; N Otilde ; B 129 -17 834 894 ; C 214 ; WX 854.78 ; N Odieresis ; B 129 -17 834 894 ; C 215 ; WX 1140.28 ; N OE ; B 130 -17 1139 703 ; C 216 ; WX 885.33 ; N Oslash ; B 130 -69 863 755 ; C 217 ; WX 880.61 ; N Ugrave ; B 168 -17 938 899 ; C 218 ; WX 880.61 ; N Uacute ; B 168 -17 938 899 ; C 219 ; WX 880.61 ; N Ucircumflex ; B 168 -17 938 894 ; C 220 ; WX 880.61 ; N Udieresis ; B 168 -17 938 894 ; C 221 ; WX 865.33 ; N Yacute ; B 161 0 934 899 ; C 222 ; WX 728.17 ; N Thorn ; B 14 0 688 686 ; C 223 ; WX 1238.61 ; N Germandbls ; B 58 -17 1261 703 ; C 224 ; WX 591 ; N agrave ; B 73 -8 596 658 ; C 225 ; WX 591 ; N aacute ; B 73 -8 596 658 ; C 226 ; WX 591 ; N acircumflex ; B 73 -8 596 653 ; C 227 ; WX 591 ; N atilde ; B 73 -8 596 694 ; C 228 ; WX 591 ; N adieresis ; B 73 -8 596 652 ; C 229 ; WX 591 ; N aring ; B 73 -8 596 670 ; C 230 ; WX 826.44 ; N ae ; B 56 -8 797 452 ; C 231 ; WX 532.11 ; N ccedilla ; B 74 -189 505 452 ; C 232 ; WX 532.11 ; N egrave ; B 77 -8 505 658 ; C 233 ; WX 532.11 ; N eacute ; B 77 -8 505 658 ; C 234 ; WX 532.11 ; N ecircumflex ; B 77 -8 518 653 ; C 235 ; WX 532.11 ; N edieresis ; B 77 -8 555 652 ; C 236 ; WX 355.44 ; N igrave ; B 44 -8 360 658 ; C 237 ; WX 355.44 ; N iacute ; B 44 -8 451 658 ; C 238 ; WX 355.44 ; N icircumflex ; B 44 -8 387 653 ; C 239 ; WX 355.44 ; N idieresis ; B 44 -8 466 652 ; C 240 ; WX 591 ; N eth ; B 75 -8 582 694 ; C 241 ; WX 649.83 ; N ntilde ; B 44 -8 655 694 ; C 242 ; WX 591 ; N ograve ; B 75 -8 566 658 ; C 243 ; WX 591 ; N oacute ; B 75 -8 569 658 ; C 244 ; WX 591 ; N ocircumflex ; B 75 -8 566 653 ; C 245 ; WX 591 ; N otilde ; B 75 -8 609 694 ; C 246 ; WX 591 ; N odieresis ; B 75 -8 584 652 ; C 247 ; WX 826.44 ; N oe ; B 73 -14 797 458 ; C 248 ; WX 591 ; N oslash ; B 44 -116 596 561 ; C 249 ; WX 620.39 ; N ugrave ; B 44 -8 625 658 ; C 250 ; WX 620.39 ; N uacute ; B 44 -8 625 658 ; C 251 ; WX 620.39 ; N ucircumflex ; B 44 -8 625 653 ; C 252 ; WX 620.39 ; N udieresis ; B 44 -8 625 652 ; C 253 ; WX 561.56 ; N yacute ; B 44 -202 566 658 ; C 254 ; WX 591 ; N thorn ; B -24 -194 560 694 ; C 255 ; WX 664.83 ; N germandbls ; B -43 -202 660 702 ; EndCharMetrics StartKernData StartKernPairs 2061 KPX A C -29.44 KPX A Cacute -29.44 KPX A Ccaron -29.44 KPX A G -29.44 KPX A Gbreve -29.44 KPX A O -29.44 KPX A Oacute -29.44 KPX A Ocircumflex -29.44 KPX A Odieresis -29.44 KPX A Ograve -29.44 KPX A Ohungarumlaut -29.44 KPX A Oslash -29.44 KPX A Otilde -29.44 KPX A Q -29.44 KPX A T -88.31 KPX A Tcaron -88.31 KPX A Tcedilla -88.31 KPX A U -29.44 KPX A Uacute -29.44 KPX A Ucircumflex -29.44 KPX A Udieresis -29.44 KPX A Ugrave -29.44 KPX A Uhungarumlaut -29.44 KPX A Uring -29.44 KPX A V -117.75 KPX A W -117.75 KPX A Y -88.31 KPX A Ydieresis -88.31 KPX A a -58.87 KPX A aacute -58.87 KPX A acircumflex -58.87 KPX A acircumflex -58.87 KPX A adieresis -58.87 KPX A ae -58.87 KPX A agrave -58.87 KPX A aogonek -58.87 KPX A aring -58.87 KPX A atilde -58.87 KPX A b -29.44 KPX A c -58.87 KPX A cacute -58.87 KPX A cacute -58.87 KPX A ccaron -58.87 KPX A ccedilla -58.87 KPX A d -58.87 KPX A dbar -58.87 KPX A e -58.87 KPX A eacute -58.87 KPX A ecaron -58.87 KPX A ecircumflex -58.87 KPX A edieresis -58.87 KPX A egrave -58.87 KPX A eogonek -58.87 KPX A g -58.87 KPX A gbreve -58.87 KPX A h -29.44 KPX A i -29.44 KPX A iacute -29.44 KPX A k -29.44 KPX A l -29.44 KPX A lacute -29.44 KPX A lquoteright -29.44 KPX A m -29.44 KPX A n -29.44 KPX A o -58.87 KPX A oacute -58.87 KPX A ocircumflex -58.87 KPX A odieresis -58.87 KPX A oe -58.87 KPX A ograve -58.87 KPX A ohungarumlaut -58.87 KPX A oslash -58.87 KPX A otilde -58.87 KPX A q -58.87 KPX A r -29.44 KPX A t -29.44 KPX A tcedilla -29.44 KPX A tquoteright -29.44 KPX A u -29.44 KPX A uacute -29.44 KPX A ucircumflex -29.44 KPX A udieresis -29.44 KPX A ugrave -29.44 KPX A uhungarumlaut -29.44 KPX A uring -29.44 KPX A v -29.44 KPX A w -29.44 KPX Aacute C -29.44 KPX Aacute Cacute -29.44 KPX Aacute Ccaron -29.44 KPX Aacute G -29.44 KPX Aacute Gbreve -29.44 KPX Aacute O -29.44 KPX Aacute Oacute -29.44 KPX Aacute Ocircumflex -29.44 KPX Aacute Odieresis -29.44 KPX Aacute Ograve -29.44 KPX Aacute Ohungarumlaut -29.44 KPX Aacute Oslash -29.44 KPX Aacute Otilde -29.44 KPX Aacute Q -29.44 KPX Aacute T -88.31 KPX Aacute Tcaron -88.31 KPX Aacute Tcedilla -88.31 KPX Aacute U -29.44 KPX Aacute Uacute -29.44 KPX Aacute Ucircumflex -29.44 KPX Aacute Udieresis -29.44 KPX Aacute Ugrave -29.44 KPX Aacute Uhungarumlaut -29.44 KPX Aacute Uring -29.44 KPX Aacute V -117.75 KPX Aacute W -117.75 KPX Aacute Y -88.31 KPX Aacute Ydieresis -88.31 KPX Aacute a -58.87 KPX Aacute aacute -58.87 KPX Aacute acircumflex -58.87 KPX Aacute acircumflex -58.87 KPX Aacute adieresis -58.87 KPX Aacute ae -58.87 KPX Aacute agrave -58.87 KPX Aacute aogonek -58.87 KPX Aacute aring -58.87 KPX Aacute atilde -58.87 KPX Aacute b -29.44 KPX Aacute c -58.87 KPX Aacute cacute -58.87 KPX Aacute cacute -58.87 KPX Aacute ccaron -58.87 KPX Aacute ccedilla -58.87 KPX Aacute d -58.87 KPX Aacute dbar -58.87 KPX Aacute e -58.87 KPX Aacute eacute -58.87 KPX Aacute ecaron -58.87 KPX Aacute ecircumflex -58.87 KPX Aacute edieresis -58.87 KPX Aacute egrave -58.87 KPX Aacute eogonek -58.87 KPX Aacute g -58.87 KPX Aacute gbreve -58.87 KPX Aacute h -29.44 KPX Aacute i -29.44 KPX Aacute iacute -29.44 KPX Aacute k -29.44 KPX Aacute l -29.44 KPX Aacute lacute -29.44 KPX Aacute lquoteright -29.44 KPX Aacute m -29.44 KPX Aacute n -29.44 KPX Aacute o -58.87 KPX Aacute oacute -58.87 KPX Aacute ocircumflex -58.87 KPX Aacute odieresis -58.87 KPX Aacute oe -58.87 KPX Aacute ograve -58.87 KPX Aacute ohungarumlaut -58.87 KPX Aacute oslash -58.87 KPX Aacute otilde -58.87 KPX Aacute q -58.87 KPX Aacute r -29.44 KPX Aacute t -29.44 KPX Aacute tcedilla -29.44 KPX Aacute tquoteright -29.44 KPX Aacute u -29.44 KPX Aacute uacute -29.44 KPX Aacute ucircumflex -29.44 KPX Aacute udieresis -29.44 KPX Aacute ugrave -29.44 KPX Aacute uhungarumlaut -29.44 KPX Aacute uring -29.44 KPX Aacute v -29.44 KPX Aacute w -29.44 KPX Abreve C -29.44 KPX Abreve Cacute -29.44 KPX Abreve Ccaron -29.44 KPX Abreve G -29.44 KPX Abreve Gbreve -29.44 KPX Abreve O -29.44 KPX Abreve Oacute -29.44 KPX Abreve Ocircumflex -29.44 KPX Abreve Odieresis -29.44 KPX Abreve Ograve -29.44 KPX Abreve Ohungarumlaut -29.44 KPX Abreve Oslash -29.44 KPX Abreve Otilde -29.44 KPX Abreve Q -29.44 KPX Abreve T -88.31 KPX Abreve Tcaron -88.31 KPX Abreve Tcedilla -88.31 KPX Abreve U -29.44 KPX Abreve Uacute -29.44 KPX Abreve Ucircumflex -29.44 KPX Abreve Udieresis -29.44 KPX Abreve Ugrave -29.44 KPX Abreve Uhungarumlaut -29.44 KPX Abreve Uring -29.44 KPX Abreve V -117.75 KPX Abreve W -117.75 KPX Abreve Y -88.31 KPX Abreve Ydieresis -88.31 KPX Abreve a -58.87 KPX Abreve aacute -58.87 KPX Abreve acircumflex -58.87 KPX Abreve acircumflex -58.87 KPX Abreve adieresis -58.87 KPX Abreve ae -58.87 KPX Abreve agrave -58.87 KPX Abreve aogonek -58.87 KPX Abreve aring -58.87 KPX Abreve atilde -58.87 KPX Abreve b -29.44 KPX Abreve c -58.87 KPX Abreve cacute -58.87 KPX Abreve cacute -58.87 KPX Abreve ccaron -58.87 KPX Abreve ccedilla -58.87 KPX Abreve d -58.87 KPX Abreve dbar -58.87 KPX Abreve e -58.87 KPX Abreve eacute -58.87 KPX Abreve ecaron -58.87 KPX Abreve ecircumflex -58.87 KPX Abreve edieresis -58.87 KPX Abreve egrave -58.87 KPX Abreve eogonek -58.87 KPX Abreve g -58.87 KPX Abreve gbreve -58.87 KPX Abreve h -29.44 KPX Abreve i -29.44 KPX Abreve iacute -29.44 KPX Abreve k -29.44 KPX Abreve l -29.44 KPX Abreve lacute -29.44 KPX Abreve lquoteright -29.44 KPX Abreve m -29.44 KPX Abreve n -29.44 KPX Abreve o -58.87 KPX Abreve oacute -58.87 KPX Abreve ocircumflex -58.87 KPX Abreve odieresis -58.87 KPX Abreve oe -58.87 KPX Abreve ograve -58.87 KPX Abreve ohungarumlaut -58.87 KPX Abreve oslash -58.87 KPX Abreve otilde -58.87 KPX Abreve q -58.87 KPX Abreve r -29.44 KPX Abreve t -29.44 KPX Abreve tcedilla -29.44 KPX Abreve tquoteright -29.44 KPX Abreve u -29.44 KPX Abreve uacute -29.44 KPX Abreve ucircumflex -29.44 KPX Abreve udieresis -29.44 KPX Abreve ugrave -29.44 KPX Abreve uhungarumlaut -29.44 KPX Abreve uring -29.44 KPX Abreve v -29.44 KPX Abreve w -29.44 KPX Acircumflex C -29.44 KPX Acircumflex Cacute -29.44 KPX Acircumflex Ccaron -29.44 KPX Acircumflex G -29.44 KPX Acircumflex Gbreve -29.44 KPX Acircumflex O -29.44 KPX Acircumflex Oacute -29.44 KPX Acircumflex Ocircumflex -29.44 KPX Acircumflex Odieresis -29.44 KPX Acircumflex Ograve -29.44 KPX Acircumflex Ohungarumlaut -29.44 KPX Acircumflex Oslash -29.44 KPX Acircumflex Otilde -29.44 KPX Acircumflex Q -29.44 KPX Acircumflex T -88.31 KPX Acircumflex Tcaron -88.31 KPX Acircumflex Tcedilla -88.31 KPX Acircumflex U -29.44 KPX Acircumflex Uacute -29.44 KPX Acircumflex Ucircumflex -29.44 KPX Acircumflex Udieresis -29.44 KPX Acircumflex Ugrave -29.44 KPX Acircumflex Uhungarumlaut -29.44 KPX Acircumflex Uring -29.44 KPX Acircumflex V -117.75 KPX Acircumflex W -117.75 KPX Acircumflex Y -88.31 KPX Acircumflex Ydieresis -88.31 KPX Acircumflex a -58.87 KPX Acircumflex aacute -58.87 KPX Acircumflex acircumflex -58.87 KPX Acircumflex acircumflex -58.87 KPX Acircumflex adieresis -58.87 KPX Acircumflex ae -58.87 KPX Acircumflex agrave -58.87 KPX Acircumflex aogonek -58.87 KPX Acircumflex aring -58.87 KPX Acircumflex atilde -58.87 KPX Acircumflex b -29.44 KPX Acircumflex c -58.87 KPX Acircumflex cacute -58.87 KPX Acircumflex cacute -58.87 KPX Acircumflex ccaron -58.87 KPX Acircumflex ccedilla -58.87 KPX Acircumflex d -58.87 KPX Acircumflex dbar -58.87 KPX Acircumflex e -58.87 KPX Acircumflex eacute -58.87 KPX Acircumflex ecaron -58.87 KPX Acircumflex ecircumflex -58.87 KPX Acircumflex edieresis -58.87 KPX Acircumflex egrave -58.87 KPX Acircumflex eogonek -58.87 KPX Acircumflex g -58.87 KPX Acircumflex gbreve -58.87 KPX Acircumflex h -29.44 KPX Acircumflex i -29.44 KPX Acircumflex iacute -29.44 KPX Acircumflex k -29.44 KPX Acircumflex l -29.44 KPX Acircumflex lacute -29.44 KPX Acircumflex lquoteright -29.44 KPX Acircumflex m -29.44 KPX Acircumflex n -29.44 KPX Acircumflex o -58.87 KPX Acircumflex oacute -58.87 KPX Acircumflex ocircumflex -58.87 KPX Acircumflex odieresis -58.87 KPX Acircumflex oe -58.87 KPX Acircumflex ograve -58.87 KPX Acircumflex ohungarumlaut -58.87 KPX Acircumflex oslash -58.87 KPX Acircumflex otilde -58.87 KPX Acircumflex q -58.87 KPX Acircumflex r -29.44 KPX Acircumflex t -29.44 KPX Acircumflex tcedilla -29.44 KPX Acircumflex tquoteright -29.44 KPX Acircumflex u -29.44 KPX Acircumflex uacute -29.44 KPX Acircumflex ucircumflex -29.44 KPX Acircumflex udieresis -29.44 KPX Acircumflex ugrave -29.44 KPX Acircumflex uhungarumlaut -29.44 KPX Acircumflex uring -29.44 KPX Acircumflex v -29.44 KPX Acircumflex w -29.44 KPX Adieresis C -29.44 KPX Adieresis Cacute -29.44 KPX Adieresis Ccaron -29.44 KPX Adieresis G -29.44 KPX Adieresis Gbreve -29.44 KPX Adieresis O -29.44 KPX Adieresis Oacute -29.44 KPX Adieresis Ocircumflex -29.44 KPX Adieresis Odieresis -29.44 KPX Adieresis Ograve -29.44 KPX Adieresis Ohungarumlaut -29.44 KPX Adieresis Oslash -29.44 KPX Adieresis Otilde -29.44 KPX Adieresis Q -29.44 KPX Adieresis T -88.31 KPX Adieresis Tcaron -88.31 KPX Adieresis Tcedilla -88.31 KPX Adieresis U -29.44 KPX Adieresis Uacute -29.44 KPX Adieresis Ucircumflex -29.44 KPX Adieresis Udieresis -29.44 KPX Adieresis Ugrave -29.44 KPX Adieresis Uhungarumlaut -29.44 KPX Adieresis Uring -29.44 KPX Adieresis V -117.75 KPX Adieresis W -117.75 KPX Adieresis Y -88.31 KPX Adieresis Ydieresis -88.31 KPX Adieresis a -58.87 KPX Adieresis aacute -58.87 KPX Adieresis acircumflex -58.87 KPX Adieresis acircumflex -58.87 KPX Adieresis adieresis -58.87 KPX Adieresis ae -58.87 KPX Adieresis agrave -58.87 KPX Adieresis aogonek -58.87 KPX Adieresis aring -58.87 KPX Adieresis atilde -58.87 KPX Adieresis b -29.44 KPX Adieresis c -58.87 KPX Adieresis cacute -58.87 KPX Adieresis cacute -58.87 KPX Adieresis ccaron -58.87 KPX Adieresis ccedilla -58.87 KPX Adieresis d -58.87 KPX Adieresis dbar -58.87 KPX Adieresis e -58.87 KPX Adieresis eacute -58.87 KPX Adieresis ecaron -58.87 KPX Adieresis ecircumflex -58.87 KPX Adieresis edieresis -58.87 KPX Adieresis egrave -58.87 KPX Adieresis eogonek -58.87 KPX Adieresis g -58.87 KPX Adieresis gbreve -58.87 KPX Adieresis h -29.44 KPX Adieresis i -29.44 KPX Adieresis iacute -29.44 KPX Adieresis k -29.44 KPX Adieresis l -29.44 KPX Adieresis lacute -29.44 KPX Adieresis lquoteright -29.44 KPX Adieresis m -29.44 KPX Adieresis n -29.44 KPX Adieresis o -58.87 KPX Adieresis oacute -58.87 KPX Adieresis ocircumflex -58.87 KPX Adieresis odieresis -58.87 KPX Adieresis oe -58.87 KPX Adieresis ograve -58.87 KPX Adieresis ohungarumlaut -58.87 KPX Adieresis oslash -58.87 KPX Adieresis otilde -58.87 KPX Adieresis q -58.87 KPX Adieresis r -29.44 KPX Adieresis t -29.44 KPX Adieresis tcedilla -29.44 KPX Adieresis tquoteright -29.44 KPX Adieresis u -29.44 KPX Adieresis uacute -29.44 KPX Adieresis ucircumflex -29.44 KPX Adieresis udieresis -29.44 KPX Adieresis ugrave -29.44 KPX Adieresis uhungarumlaut -29.44 KPX Adieresis uring -29.44 KPX Adieresis v -29.44 KPX Adieresis w -29.44 KPX Agrave C -29.44 KPX Agrave Cacute -29.44 KPX Agrave Ccaron -29.44 KPX Agrave G -29.44 KPX Agrave Gbreve -29.44 KPX Agrave O -29.44 KPX Agrave Oacute -29.44 KPX Agrave Ocircumflex -29.44 KPX Agrave Odieresis -29.44 KPX Agrave Ograve -29.44 KPX Agrave Ohungarumlaut -29.44 KPX Agrave Oslash -29.44 KPX Agrave Otilde -29.44 KPX Agrave Q -29.44 KPX Agrave T -88.31 KPX Agrave Tcaron -88.31 KPX Agrave Tcedilla -88.31 KPX Agrave U -29.44 KPX Agrave Uacute -29.44 KPX Agrave Ucircumflex -29.44 KPX Agrave Udieresis -29.44 KPX Agrave Ugrave -29.44 KPX Agrave Uhungarumlaut -29.44 KPX Agrave Uring -29.44 KPX Agrave V -117.75 KPX Agrave W -117.75 KPX Agrave Y -88.31 KPX Agrave Ydieresis -88.31 KPX Agrave a -58.87 KPX Agrave aacute -58.87 KPX Agrave acircumflex -58.87 KPX Agrave acircumflex -58.87 KPX Agrave adieresis -58.87 KPX Agrave ae -58.87 KPX Agrave agrave -58.87 KPX Agrave aogonek -58.87 KPX Agrave aring -58.87 KPX Agrave atilde -58.87 KPX Agrave b -29.44 KPX Agrave c -58.87 KPX Agrave cacute -58.87 KPX Agrave cacute -58.87 KPX Agrave ccaron -58.87 KPX Agrave ccedilla -58.87 KPX Agrave d -58.87 KPX Agrave dbar -58.87 KPX Agrave e -58.87 KPX Agrave eacute -58.87 KPX Agrave ecaron -58.87 KPX Agrave ecircumflex -58.87 KPX Agrave edieresis -58.87 KPX Agrave egrave -58.87 KPX Agrave eogonek -58.87 KPX Agrave g -58.87 KPX Agrave gbreve -58.87 KPX Agrave h -29.44 KPX Agrave i -29.44 KPX Agrave iacute -29.44 KPX Agrave k -29.44 KPX Agrave l -29.44 KPX Agrave lacute -29.44 KPX Agrave lquoteright -29.44 KPX Agrave m -29.44 KPX Agrave n -29.44 KPX Agrave o -58.87 KPX Agrave oacute -58.87 KPX Agrave ocircumflex -58.87 KPX Agrave odieresis -58.87 KPX Agrave oe -58.87 KPX Agrave ograve -58.87 KPX Agrave ohungarumlaut -58.87 KPX Agrave oslash -58.87 KPX Agrave otilde -58.87 KPX Agrave q -58.87 KPX Agrave r -29.44 KPX Agrave t -29.44 KPX Agrave tcedilla -29.44 KPX Agrave tquoteright -29.44 KPX Agrave u -29.44 KPX Agrave uacute -29.44 KPX Agrave ucircumflex -29.44 KPX Agrave udieresis -29.44 KPX Agrave ugrave -29.44 KPX Agrave uhungarumlaut -29.44 KPX Agrave uring -29.44 KPX Agrave v -29.44 KPX Agrave w -29.44 KPX Aogonek C -29.44 KPX Aogonek Cacute -29.44 KPX Aogonek Ccaron -29.44 KPX Aogonek G -29.44 KPX Aogonek Gbreve -29.44 KPX Aogonek O -29.44 KPX Aogonek Oacute -29.44 KPX Aogonek Ocircumflex -29.44 KPX Aogonek Odieresis -29.44 KPX Aogonek Ograve -29.44 KPX Aogonek Ohungarumlaut -29.44 KPX Aogonek Oslash -29.44 KPX Aogonek Otilde -29.44 KPX Aogonek Q -29.44 KPX Aogonek T -88.31 KPX Aogonek Tcaron -88.31 KPX Aogonek Tcedilla -88.31 KPX Aogonek U -29.44 KPX Aogonek Uacute -29.44 KPX Aogonek Ucircumflex -29.44 KPX Aogonek Udieresis -29.44 KPX Aogonek Ugrave -29.44 KPX Aogonek Uhungarumlaut -29.44 KPX Aogonek Uring -29.44 KPX Aogonek V -117.75 KPX Aogonek W -117.75 KPX Aogonek Y -88.31 KPX Aogonek Ydieresis -88.31 KPX Aogonek a -58.87 KPX Aogonek aacute -58.87 KPX Aogonek acircumflex -58.87 KPX Aogonek acircumflex -58.87 KPX Aogonek adieresis -58.87 KPX Aogonek ae -58.87 KPX Aogonek agrave -58.87 KPX Aogonek aogonek -58.87 KPX Aogonek aring -58.87 KPX Aogonek atilde -58.87 KPX Aogonek b -29.44 KPX Aogonek c -58.87 KPX Aogonek cacute -58.87 KPX Aogonek cacute -58.87 KPX Aogonek ccaron -58.87 KPX Aogonek ccedilla -58.87 KPX Aogonek d -58.87 KPX Aogonek dbar -58.87 KPX Aogonek e -58.87 KPX Aogonek eacute -58.87 KPX Aogonek ecaron -58.87 KPX Aogonek ecircumflex -58.87 KPX Aogonek edieresis -58.87 KPX Aogonek egrave -58.87 KPX Aogonek eogonek -58.87 KPX Aogonek g -58.87 KPX Aogonek gbreve -58.87 KPX Aogonek h -29.44 KPX Aogonek i -29.44 KPX Aogonek iacute -29.44 KPX Aogonek k -29.44 KPX Aogonek l -29.44 KPX Aogonek lacute -29.44 KPX Aogonek lquoteright -29.44 KPX Aogonek m -29.44 KPX Aogonek n -29.44 KPX Aogonek o -58.87 KPX Aogonek oacute -58.87 KPX Aogonek ocircumflex -58.87 KPX Aogonek odieresis -58.87 KPX Aogonek oe -58.87 KPX Aogonek ograve -58.87 KPX Aogonek ohungarumlaut -58.87 KPX Aogonek oslash -58.87 KPX Aogonek otilde -58.87 KPX Aogonek q -58.87 KPX Aogonek r -29.44 KPX Aogonek t -29.44 KPX Aogonek tcedilla -29.44 KPX Aogonek tquoteright -29.44 KPX Aogonek u -29.44 KPX Aogonek uacute -29.44 KPX Aogonek ucircumflex -29.44 KPX Aogonek udieresis -29.44 KPX Aogonek ugrave -29.44 KPX Aogonek uhungarumlaut -29.44 KPX Aogonek uring -29.44 KPX Aogonek v -29.44 KPX Aogonek w -29.44 KPX Aring C -29.44 KPX Aring Cacute -29.44 KPX Aring Ccaron -29.44 KPX Aring G -29.44 KPX Aring Gbreve -29.44 KPX Aring O -29.44 KPX Aring Oacute -29.44 KPX Aring Ocircumflex -29.44 KPX Aring Odieresis -29.44 KPX Aring Ograve -29.44 KPX Aring Ohungarumlaut -29.44 KPX Aring Oslash -29.44 KPX Aring Otilde -29.44 KPX Aring Q -29.44 KPX Aring T -88.31 KPX Aring Tcaron -88.31 KPX Aring Tcedilla -88.31 KPX Aring U -29.44 KPX Aring Uacute -29.44 KPX Aring Ucircumflex -29.44 KPX Aring Udieresis -29.44 KPX Aring Ugrave -29.44 KPX Aring Uhungarumlaut -29.44 KPX Aring Uring -29.44 KPX Aring V -117.75 KPX Aring W -117.75 KPX Aring Y -88.31 KPX Aring Ydieresis -88.31 KPX Aring a -58.87 KPX Aring aacute -58.87 KPX Aring acircumflex -58.87 KPX Aring acircumflex -58.87 KPX Aring adieresis -58.87 KPX Aring ae -58.87 KPX Aring agrave -58.87 KPX Aring aogonek -58.87 KPX Aring aring -58.87 KPX Aring atilde -58.87 KPX Aring b -29.44 KPX Aring c -58.87 KPX Aring cacute -58.87 KPX Aring cacute -58.87 KPX Aring ccaron -58.87 KPX Aring ccedilla -58.87 KPX Aring d -58.87 KPX Aring dbar -58.87 KPX Aring e -58.87 KPX Aring eacute -58.87 KPX Aring ecaron -58.87 KPX Aring ecircumflex -58.87 KPX Aring edieresis -58.87 KPX Aring egrave -58.87 KPX Aring eogonek -58.87 KPX Aring g -58.87 KPX Aring gbreve -58.87 KPX Aring h -29.44 KPX Aring i -29.44 KPX Aring iacute -29.44 KPX Aring k -29.44 KPX Aring l -29.44 KPX Aring lacute -29.44 KPX Aring lquoteright -29.44 KPX Aring m -29.44 KPX Aring n -29.44 KPX Aring o -58.87 KPX Aring oacute -58.87 KPX Aring ocircumflex -58.87 KPX Aring odieresis -58.87 KPX Aring oe -58.87 KPX Aring ograve -58.87 KPX Aring ohungarumlaut -58.87 KPX Aring oslash -58.87 KPX Aring otilde -58.87 KPX Aring q -58.87 KPX Aring r -29.44 KPX Aring t -29.44 KPX Aring tcedilla -29.44 KPX Aring tquoteright -29.44 KPX Aring u -29.44 KPX Aring uacute -29.44 KPX Aring ucircumflex -29.44 KPX Aring udieresis -29.44 KPX Aring ugrave -29.44 KPX Aring uhungarumlaut -29.44 KPX Aring uring -29.44 KPX Aring v -29.44 KPX Aring w -29.44 KPX Atilde C -29.44 KPX Atilde Cacute -29.44 KPX Atilde Ccaron -29.44 KPX Atilde G -29.44 KPX Atilde Gbreve -29.44 KPX Atilde O -29.44 KPX Atilde Oacute -29.44 KPX Atilde Ocircumflex -29.44 KPX Atilde Odieresis -29.44 KPX Atilde Ograve -29.44 KPX Atilde Ohungarumlaut -29.44 KPX Atilde Oslash -29.44 KPX Atilde Otilde -29.44 KPX Atilde Q -29.44 KPX Atilde T -88.31 KPX Atilde Tcaron -88.31 KPX Atilde Tcedilla -88.31 KPX Atilde U -29.44 KPX Atilde Uacute -29.44 KPX Atilde Ucircumflex -29.44 KPX Atilde Udieresis -29.44 KPX Atilde Ugrave -29.44 KPX Atilde Uhungarumlaut -29.44 KPX Atilde Uring -29.44 KPX Atilde V -117.75 KPX Atilde W -117.75 KPX Atilde Y -88.31 KPX Atilde Ydieresis -88.31 KPX Atilde a -58.87 KPX Atilde aacute -58.87 KPX Atilde acircumflex -58.87 KPX Atilde acircumflex -58.87 KPX Atilde adieresis -58.87 KPX Atilde ae -58.87 KPX Atilde agrave -58.87 KPX Atilde aogonek -58.87 KPX Atilde aring -58.87 KPX Atilde atilde -58.87 KPX Atilde b -29.44 KPX Atilde c -58.87 KPX Atilde cacute -58.87 KPX Atilde cacute -58.87 KPX Atilde ccaron -58.87 KPX Atilde ccedilla -58.87 KPX Atilde d -58.87 KPX Atilde dbar -58.87 KPX Atilde e -58.87 KPX Atilde eacute -58.87 KPX Atilde ecaron -58.87 KPX Atilde ecircumflex -58.87 KPX Atilde edieresis -58.87 KPX Atilde egrave -58.87 KPX Atilde eogonek -58.87 KPX Atilde g -58.87 KPX Atilde gbreve -58.87 KPX Atilde h -29.44 KPX Atilde i -29.44 KPX Atilde iacute -29.44 KPX Atilde k -29.44 KPX Atilde l -29.44 KPX Atilde lacute -29.44 KPX Atilde lquoteright -29.44 KPX Atilde m -29.44 KPX Atilde n -29.44 KPX Atilde o -58.87 KPX Atilde oacute -58.87 KPX Atilde ocircumflex -58.87 KPX Atilde odieresis -58.87 KPX Atilde oe -58.87 KPX Atilde ograve -58.87 KPX Atilde ohungarumlaut -58.87 KPX Atilde oslash -58.87 KPX Atilde otilde -58.87 KPX Atilde q -58.87 KPX Atilde r -29.44 KPX Atilde t -29.44 KPX Atilde tcedilla -29.44 KPX Atilde tquoteright -29.44 KPX Atilde u -29.44 KPX Atilde uacute -29.44 KPX Atilde ucircumflex -29.44 KPX Atilde udieresis -29.44 KPX Atilde ugrave -29.44 KPX Atilde uhungarumlaut -29.44 KPX Atilde uring -29.44 KPX Atilde v -29.44 KPX Atilde w -29.44 KPX D A -29.44 KPX D Aacute -29.44 KPX D Abreve -29.44 KPX D Acircumflex -29.44 KPX D Adieresis -29.44 KPX D Agrave -29.44 KPX D Aogonek -29.44 KPX D Aring -29.44 KPX D Atilde -29.44 KPX D V -29.44 KPX D W -29.44 KPX D X -29.44 KPX D Y -29.44 KPX D Yacute -29.44 KPX Dcaron A -29.44 KPX Dcaron Aacute -29.44 KPX Dcaron Abreve -29.44 KPX Dcaron Acircumflex -29.44 KPX Dcaron Adieresis -29.44 KPX Dcaron Agrave -29.44 KPX Dcaron Aogonek -29.44 KPX Dcaron Aring -29.44 KPX Dcaron Atilde -29.44 KPX Dcaron V -29.44 KPX Dcaron W -29.44 KPX Dcaron X -29.44 KPX Dcaron Y -29.44 KPX Dcaron Yacute -29.44 KPX F A -117.75 KPX F Aacute -117.75 KPX F Abreve -117.75 KPX F Acircumflex -117.75 KPX F Adieresis -117.75 KPX F Agrave -117.75 KPX F Aogonek -117.75 KPX F Aring -117.75 KPX F Atilde -117.75 KPX F C -29.44 KPX F Cacute -29.44 KPX F Ccaron -29.44 KPX F G -29.44 KPX F Gbreve -29.44 KPX F O -29.44 KPX F Oacute -29.44 KPX F Ocircumflex -29.44 KPX F Odieresis -29.44 KPX F Ograve -29.44 KPX F Ohungarumlaut -29.44 KPX F Oslash -29.44 KPX F Otilde -29.44 KPX F Q -29.44 KPX F a -88.31 KPX F aogonek -88.31 KPX F e -88.31 KPX F eogonek -88.31 KPX F o -88.31 KPX F r -88.31 KPX F u -88.31 KPX K C -29.44 KPX K Cacute -29.44 KPX K Ccaron -29.44 KPX K G -29.44 KPX K Gbreve -29.44 KPX K O -29.44 KPX K Oacute -29.44 KPX K Ocircumflex -29.44 KPX K Odieresis -29.44 KPX K Ograve -29.44 KPX K Ohungarumlaut -29.44 KPX K Oslash -29.44 KPX K Otilde -29.44 KPX K Q -29.44 KPX L T -88.31 KPX L Tcaron -88.31 KPX L Tcedilla -88.31 KPX L V -117.75 KPX L W -117.75 KPX L Y -88.31 KPX L Ydieresis -88.31 KPX L a -58.87 KPX L aacute -58.87 KPX L acircumflex -58.87 KPX L acircumflex -58.87 KPX L adieresis -58.87 KPX L ae -58.87 KPX L agrave -58.87 KPX L aogonek -58.87 KPX L aring -58.87 KPX L atilde -58.87 KPX L c -58.87 KPX L cacute -58.87 KPX L cacute -58.87 KPX L ccaron -58.87 KPX L ccedilla -58.87 KPX L d -58.87 KPX L dbar -58.87 KPX L e -58.87 KPX L eacute -58.87 KPX L ecaron -58.87 KPX L ecircumflex -58.87 KPX L edieresis -58.87 KPX L egrave -58.87 KPX L eogonek -58.87 KPX L g -58.87 KPX L gbreve -58.87 KPX L o -58.87 KPX L oacute -58.87 KPX L ocircumflex -58.87 KPX L odieresis -58.87 KPX L oe -58.87 KPX L ograve -58.87 KPX L ohungarumlaut -58.87 KPX L oslash -58.87 KPX L otilde -58.87 KPX L q -58.87 KPX O A -29.44 KPX O Aacute -29.44 KPX O Abreve -29.44 KPX O Acircumflex -29.44 KPX O Adieresis -29.44 KPX O Agrave -29.44 KPX O Aogonek -29.44 KPX O Aring -29.44 KPX O Atilde -29.44 KPX O V -29.44 KPX O W -29.44 KPX O X -29.44 KPX O Y -29.44 KPX O Yacute -29.44 KPX Oacute A -29.44 KPX Oacute Aacute -29.44 KPX Oacute Abreve -29.44 KPX Oacute Acircumflex -29.44 KPX Oacute Adieresis -29.44 KPX Oacute Agrave -29.44 KPX Oacute Aogonek -29.44 KPX Oacute Aring -29.44 KPX Oacute Atilde -29.44 KPX Oacute V -29.44 KPX Oacute W -29.44 KPX Oacute X -29.44 KPX Oacute Y -29.44 KPX Oacute Yacute -29.44 KPX Ocircumflex A -29.44 KPX Ocircumflex Aacute -29.44 KPX Ocircumflex Abreve -29.44 KPX Ocircumflex Acircumflex -29.44 KPX Ocircumflex Adieresis -29.44 KPX Ocircumflex Agrave -29.44 KPX Ocircumflex Aogonek -29.44 KPX Ocircumflex Aring -29.44 KPX Ocircumflex Atilde -29.44 KPX Ocircumflex V -29.44 KPX Ocircumflex W -29.44 KPX Ocircumflex X -29.44 KPX Ocircumflex Y -29.44 KPX Ocircumflex Yacute -29.44 KPX Odieresis A -29.44 KPX Odieresis Aacute -29.44 KPX Odieresis Abreve -29.44 KPX Odieresis Acircumflex -29.44 KPX Odieresis Adieresis -29.44 KPX Odieresis Agrave -29.44 KPX Odieresis Aogonek -29.44 KPX Odieresis Aring -29.44 KPX Odieresis Atilde -29.44 KPX Odieresis V -29.44 KPX Odieresis W -29.44 KPX Odieresis X -29.44 KPX Odieresis Y -29.44 KPX Odieresis Yacute -29.44 KPX Ograve A -29.44 KPX Ograve Aacute -29.44 KPX Ograve Abreve -29.44 KPX Ograve Acircumflex -29.44 KPX Ograve Adieresis -29.44 KPX Ograve Agrave -29.44 KPX Ograve Aogonek -29.44 KPX Ograve Aring -29.44 KPX Ograve Atilde -29.44 KPX Ograve V -29.44 KPX Ograve W -29.44 KPX Ograve X -29.44 KPX Ograve Y -29.44 KPX Ograve Yacute -29.44 KPX Ohungarumlaut A -29.44 KPX Ohungarumlaut Aacute -29.44 KPX Ohungarumlaut Abreve -29.44 KPX Ohungarumlaut Acircumflex -29.44 KPX Ohungarumlaut Adieresis -29.44 KPX Ohungarumlaut Agrave -29.44 KPX Ohungarumlaut Aogonek -29.44 KPX Ohungarumlaut Aring -29.44 KPX Ohungarumlaut Atilde -29.44 KPX Ohungarumlaut V -29.44 KPX Ohungarumlaut W -29.44 KPX Ohungarumlaut X -29.44 KPX Ohungarumlaut Y -29.44 KPX Ohungarumlaut Yacute -29.44 KPX Oslash A -29.44 KPX Oslash Aacute -29.44 KPX Oslash Abreve -29.44 KPX Oslash Acircumflex -29.44 KPX Oslash Adieresis -29.44 KPX Oslash Agrave -29.44 KPX Oslash Aogonek -29.44 KPX Oslash Aring -29.44 KPX Oslash Atilde -29.44 KPX Oslash V -29.44 KPX Oslash W -29.44 KPX Oslash X -29.44 KPX Oslash Y -29.44 KPX Oslash Yacute -29.44 KPX Otilde A -29.44 KPX Otilde Aacute -29.44 KPX Otilde Abreve -29.44 KPX Otilde Acircumflex -29.44 KPX Otilde Adieresis -29.44 KPX Otilde Agrave -29.44 KPX Otilde Aogonek -29.44 KPX Otilde Aring -29.44 KPX Otilde Atilde -29.44 KPX Otilde V -29.44 KPX Otilde W -29.44 KPX Otilde X -29.44 KPX Otilde Y -29.44 KPX Otilde Yacute -29.44 KPX P A -88.31 KPX P Aacute -88.31 KPX P Abreve -88.31 KPX P Acircumflex -88.31 KPX P Adieresis -88.31 KPX P Agrave -88.31 KPX P Aogonek -88.31 KPX P Aring -88.31 KPX P Atilde -88.31 KPX R C -29.44 KPX R Cacute -29.44 KPX R Ccaron -29.44 KPX R G -29.44 KPX R Gbreve -29.44 KPX R O -29.44 KPX R Oacute -29.44 KPX R Ocircumflex -29.44 KPX R Odieresis -29.44 KPX R Ograve -29.44 KPX R Ohungarumlaut -29.44 KPX R Oslash -29.44 KPX R Otilde -29.44 KPX R Q -29.44 KPX R T -88.31 KPX R Tcaron -88.31 KPX R Tcedilla -88.31 KPX R U -29.44 KPX R Uacute -29.44 KPX R Ucircumflex -29.44 KPX R Udieresis -29.44 KPX R Ugrave -29.44 KPX R Uhungarumlaut -29.44 KPX R Uring -29.44 KPX R V -117.75 KPX R W -117.75 KPX R Y -88.31 KPX R Ydieresis -88.31 KPX R a -58.87 KPX R aacute -58.87 KPX R acircumflex -58.87 KPX R acircumflex -58.87 KPX R adieresis -58.87 KPX R ae -58.87 KPX R agrave -58.87 KPX R aogonek -58.87 KPX R aring -58.87 KPX R atilde -58.87 KPX R b -29.44 KPX R c -58.87 KPX R cacute -58.87 KPX R cacute -58.87 KPX R ccaron -58.87 KPX R ccedilla -58.87 KPX R d -58.87 KPX R dbar -58.87 KPX R e -58.87 KPX R eacute -58.87 KPX R ecaron -58.87 KPX R ecircumflex -58.87 KPX R edieresis -58.87 KPX R egrave -58.87 KPX R eogonek -58.87 KPX R g -58.87 KPX R gbreve -58.87 KPX R h -29.44 KPX R i -29.44 KPX R iacute -29.44 KPX R k -29.44 KPX R l -29.44 KPX R lacute -29.44 KPX R lquoteright -29.44 KPX R m -29.44 KPX R n -29.44 KPX R o -58.87 KPX R oacute -58.87 KPX R ocircumflex -58.87 KPX R odieresis -58.87 KPX R oe -58.87 KPX R ograve -58.87 KPX R ohungarumlaut -58.87 KPX R oslash -58.87 KPX R otilde -58.87 KPX R q -58.87 KPX R r -29.44 KPX R t -29.44 KPX R tcedilla -29.44 KPX R tquoteright -29.44 KPX R u -29.44 KPX R uacute -29.44 KPX R ucircumflex -29.44 KPX R udieresis -29.44 KPX R ugrave -29.44 KPX R uhungarumlaut -29.44 KPX R uring -29.44 KPX R v -29.44 KPX R w -29.44 KPX Racute C -29.44 KPX Racute Cacute -29.44 KPX Racute Ccaron -29.44 KPX Racute G -29.44 KPX Racute Gbreve -29.44 KPX Racute O -29.44 KPX Racute Oacute -29.44 KPX Racute Ocircumflex -29.44 KPX Racute Odieresis -29.44 KPX Racute Ograve -29.44 KPX Racute Ohungarumlaut -29.44 KPX Racute Oslash -29.44 KPX Racute Otilde -29.44 KPX Racute Q -29.44 KPX Racute T -88.31 KPX Racute Tcaron -88.31 KPX Racute Tcedilla -88.31 KPX Racute U -29.44 KPX Racute Uacute -29.44 KPX Racute Ucircumflex -29.44 KPX Racute Udieresis -29.44 KPX Racute Ugrave -29.44 KPX Racute Uhungarumlaut -29.44 KPX Racute Uring -29.44 KPX Racute V -117.75 KPX Racute W -117.75 KPX Racute Y -88.31 KPX Racute Ydieresis -88.31 KPX Racute a -58.87 KPX Racute aacute -58.87 KPX Racute acircumflex -58.87 KPX Racute acircumflex -58.87 KPX Racute adieresis -58.87 KPX Racute ae -58.87 KPX Racute agrave -58.87 KPX Racute aogonek -58.87 KPX Racute aring -58.87 KPX Racute atilde -58.87 KPX Racute b -29.44 KPX Racute c -58.87 KPX Racute cacute -58.87 KPX Racute cacute -58.87 KPX Racute ccaron -58.87 KPX Racute ccedilla -58.87 KPX Racute d -58.87 KPX Racute dbar -58.87 KPX Racute e -58.87 KPX Racute eacute -58.87 KPX Racute ecaron -58.87 KPX Racute ecircumflex -58.87 KPX Racute edieresis -58.87 KPX Racute egrave -58.87 KPX Racute eogonek -58.87 KPX Racute g -58.87 KPX Racute gbreve -58.87 KPX Racute h -29.44 KPX Racute i -29.44 KPX Racute iacute -29.44 KPX Racute k -29.44 KPX Racute l -29.44 KPX Racute lacute -29.44 KPX Racute lquoteright -29.44 KPX Racute m -29.44 KPX Racute n -29.44 KPX Racute o -58.87 KPX Racute oacute -58.87 KPX Racute ocircumflex -58.87 KPX Racute odieresis -58.87 KPX Racute oe -58.87 KPX Racute ograve -58.87 KPX Racute ohungarumlaut -58.87 KPX Racute oslash -58.87 KPX Racute otilde -58.87 KPX Racute q -58.87 KPX Racute r -29.44 KPX Racute t -29.44 KPX Racute tcedilla -29.44 KPX Racute tquoteright -29.44 KPX Racute u -29.44 KPX Racute uacute -29.44 KPX Racute ucircumflex -29.44 KPX Racute udieresis -29.44 KPX Racute ugrave -29.44 KPX Racute uhungarumlaut -29.44 KPX Racute uring -29.44 KPX Racute v -29.44 KPX Racute w -29.44 KPX T A -88.31 KPX T Aacute -88.31 KPX T Abreve -88.31 KPX T Acircumflex -88.31 KPX T Adieresis -88.31 KPX T Agrave -88.31 KPX T Aogonek -88.31 KPX T Aring -88.31 KPX T Atilde -88.31 KPX T a -88.31 KPX T e -88.31 KPX T o -88.31 KPX T r -88.31 KPX T u -88.31 KPX T y -88.31 KPX Tcaron A -88.31 KPX Tcaron Aacute -88.31 KPX Tcaron Abreve -88.31 KPX Tcaron Acircumflex -88.31 KPX Tcaron Adieresis -88.31 KPX Tcaron Agrave -88.31 KPX Tcaron Aogonek -88.31 KPX Tcaron Aring -88.31 KPX Tcaron Atilde -88.31 KPX Tcaron a -88.31 KPX Tcaron e -88.31 KPX Tcaron o -88.31 KPX Tcaron r -88.31 KPX Tcaron u -88.31 KPX Tcaron y -88.31 KPX Tcedilla A -88.31 KPX Tcedilla Aacute -88.31 KPX Tcedilla Abreve -88.31 KPX Tcedilla Acircumflex -88.31 KPX Tcedilla Adieresis -88.31 KPX Tcedilla Agrave -88.31 KPX Tcedilla Aogonek -88.31 KPX Tcedilla Aring -88.31 KPX Tcedilla Atilde -88.31 KPX Tcedilla a -88.31 KPX Tcedilla e -88.31 KPX Tcedilla o -88.31 KPX Tcedilla r -88.31 KPX Tcedilla u -88.31 KPX Tcedilla y -88.31 KPX V A -117.75 KPX V Aacute -117.75 KPX V Abreve -117.75 KPX V Acircumflex -117.75 KPX V Adieresis -117.75 KPX V Agrave -117.75 KPX V Aogonek -117.75 KPX V Aring -117.75 KPX V Atilde -117.75 KPX V C -29.44 KPX V Cacute -29.44 KPX V Ccaron -29.44 KPX V G -29.44 KPX V Gbreve -29.44 KPX V O -29.44 KPX V Oacute -29.44 KPX V Ocircumflex -29.44 KPX V Odieresis -29.44 KPX V Ograve -29.44 KPX V Ohungarumlaut -29.44 KPX V Oslash -29.44 KPX V Otilde -29.44 KPX V Q -29.44 KPX V a -88.31 KPX V aogonek -88.31 KPX V e -88.31 KPX V eogonek -88.31 KPX V o -88.31 KPX V r -88.31 KPX V u -88.31 KPX W A -88.31 KPX W Aacute -88.31 KPX W Abreve -88.31 KPX W Acircumflex -88.31 KPX W Adieresis -88.31 KPX W Agrave -88.31 KPX W Aogonek -88.31 KPX W Aring -88.31 KPX W Atilde -88.31 KPX X C -29.44 KPX X Cacute -29.44 KPX X Ccaron -29.44 KPX X G -29.44 KPX X Gbreve -29.44 KPX X O -29.44 KPX X Oacute -29.44 KPX X Ocircumflex -29.44 KPX X Odieresis -29.44 KPX X Ograve -29.44 KPX X Ohungarumlaut -29.44 KPX X Oslash -29.44 KPX X Otilde -29.44 KPX X Q -29.44 KPX Y A -88.31 KPX Y Aacute -88.31 KPX Y Abreve -88.31 KPX Y Acircumflex -88.31 KPX Y Adieresis -88.31 KPX Y Agrave -88.31 KPX Y Aogonek -88.31 KPX Y Aring -88.31 KPX Y Atilde -88.31 KPX Y a -88.31 KPX Y e -88.31 KPX Y o -88.31 KPX Y r -88.31 KPX Y u -88.31 KPX Yacute A -88.31 KPX Yacute Aacute -88.31 KPX Yacute Abreve -88.31 KPX Yacute Acircumflex -88.31 KPX Yacute Adieresis -88.31 KPX Yacute Agrave -88.31 KPX Yacute Aogonek -88.31 KPX Yacute Aring -88.31 KPX Yacute Atilde -88.31 KPX Yacute a -88.31 KPX Yacute e -88.31 KPX Yacute o -88.31 KPX Yacute r -88.31 KPX Yacute u -88.31 KPX b a -58.87 KPX b aacute -58.87 KPX b acircumflex -58.87 KPX b acircumflex -58.87 KPX b adieresis -58.87 KPX b ae -58.87 KPX b agrave -58.87 KPX b aogonek -58.87 KPX b aring -58.87 KPX b atilde -58.87 KPX b c -58.87 KPX b cacute -58.87 KPX b cacute -58.87 KPX b ccaron -58.87 KPX b ccedilla -58.87 KPX b d -58.87 KPX b dbar -58.87 KPX b e -58.87 KPX b eacute -58.87 KPX b ecaron -58.87 KPX b ecircumflex -58.87 KPX b edieresis -58.87 KPX b egrave -58.87 KPX b eogonek -58.87 KPX b g -58.87 KPX b gbreve -58.87 KPX b o -58.87 KPX b oacute -58.87 KPX b ocircumflex -58.87 KPX b odieresis -58.87 KPX b oe -58.87 KPX b ograve -58.87 KPX b ohungarumlaut -58.87 KPX b oslash -58.87 KPX b otilde -58.87 KPX b q -58.87 KPX c a -58.87 KPX c aacute -58.87 KPX c acircumflex -58.87 KPX c acircumflex -58.87 KPX c adieresis -58.87 KPX c ae -58.87 KPX c agrave -58.87 KPX c aogonek -58.87 KPX c aring -58.87 KPX c atilde -58.87 KPX c c -58.87 KPX c cacute -58.87 KPX c cacute -58.87 KPX c ccaron -58.87 KPX c ccedilla -58.87 KPX c d -58.87 KPX c dbar -58.87 KPX c e -58.87 KPX c eacute -58.87 KPX c ecaron -58.87 KPX c ecircumflex -58.87 KPX c edieresis -58.87 KPX c egrave -58.87 KPX c eogonek -58.87 KPX c g -58.87 KPX c gbreve -58.87 KPX c o -58.87 KPX c oacute -58.87 KPX c ocircumflex -58.87 KPX c odieresis -58.87 KPX c oe -58.87 KPX c ograve -58.87 KPX c ohungarumlaut -58.87 KPX c oslash -58.87 KPX c otilde -58.87 KPX c q -58.87 KPX cacute a -58.87 KPX cacute aacute -58.87 KPX cacute acircumflex -58.87 KPX cacute acircumflex -58.87 KPX cacute adieresis -58.87 KPX cacute ae -58.87 KPX cacute agrave -58.87 KPX cacute aogonek -58.87 KPX cacute aring -58.87 KPX cacute atilde -58.87 KPX cacute c -58.87 KPX cacute cacute -58.87 KPX cacute cacute -58.87 KPX cacute ccaron -58.87 KPX cacute ccedilla -58.87 KPX cacute d -58.87 KPX cacute dbar -58.87 KPX cacute e -58.87 KPX cacute eacute -58.87 KPX cacute ecaron -58.87 KPX cacute ecircumflex -58.87 KPX cacute edieresis -58.87 KPX cacute egrave -58.87 KPX cacute eogonek -58.87 KPX cacute g -58.87 KPX cacute gbreve -58.87 KPX cacute o -58.87 KPX cacute oacute -58.87 KPX cacute ocircumflex -58.87 KPX cacute odieresis -58.87 KPX cacute oe -58.87 KPX cacute ograve -58.87 KPX cacute ohungarumlaut -58.87 KPX cacute oslash -58.87 KPX cacute otilde -58.87 KPX cacute q -58.87 KPX ccaron a -58.87 KPX ccaron aacute -58.87 KPX ccaron acircumflex -58.87 KPX ccaron acircumflex -58.87 KPX ccaron adieresis -58.87 KPX ccaron ae -58.87 KPX ccaron agrave -58.87 KPX ccaron aogonek -58.87 KPX ccaron aring -58.87 KPX ccaron atilde -58.87 KPX ccaron c -58.87 KPX ccaron cacute -58.87 KPX ccaron cacute -58.87 KPX ccaron ccaron -58.87 KPX ccaron ccedilla -58.87 KPX ccaron d -58.87 KPX ccaron dbar -58.87 KPX ccaron e -58.87 KPX ccaron eacute -58.87 KPX ccaron ecaron -58.87 KPX ccaron ecircumflex -58.87 KPX ccaron edieresis -58.87 KPX ccaron egrave -58.87 KPX ccaron eogonek -58.87 KPX ccaron g -58.87 KPX ccaron gbreve -58.87 KPX ccaron o -58.87 KPX ccaron oacute -58.87 KPX ccaron ocircumflex -58.87 KPX ccaron odieresis -58.87 KPX ccaron oe -58.87 KPX ccaron ograve -58.87 KPX ccaron ohungarumlaut -58.87 KPX ccaron oslash -58.87 KPX ccaron otilde -58.87 KPX ccaron q -58.87 KPX d l 58.87 KPX d lacute 58.87 KPX d lquoteright 58.87 KPX e a -58.87 KPX e aacute -58.87 KPX e acircumflex -58.87 KPX e acircumflex -58.87 KPX e adieresis -58.87 KPX e ae -58.87 KPX e agrave -58.87 KPX e aogonek -58.87 KPX e aring -58.87 KPX e atilde -58.87 KPX e c -58.87 KPX e cacute -58.87 KPX e cacute -58.87 KPX e ccaron -58.87 KPX e ccedilla -58.87 KPX e d -58.87 KPX e dbar -58.87 KPX e e -58.87 KPX e eacute -58.87 KPX e ecaron -58.87 KPX e ecircumflex -58.87 KPX e edieresis -58.87 KPX e egrave -58.87 KPX e eogonek -58.87 KPX e g -58.87 KPX e gbreve -58.87 KPX e o -58.87 KPX e oacute -58.87 KPX e ocircumflex -58.87 KPX e odieresis -58.87 KPX e oe -58.87 KPX e ograve -58.87 KPX e ohungarumlaut -58.87 KPX e oslash -58.87 KPX e otilde -58.87 KPX e q -58.87 KPX eacute a -58.87 KPX eacute aacute -58.87 KPX eacute acircumflex -58.87 KPX eacute acircumflex -58.87 KPX eacute adieresis -58.87 KPX eacute ae -58.87 KPX eacute agrave -58.87 KPX eacute aogonek -58.87 KPX eacute aring -58.87 KPX eacute atilde -58.87 KPX eacute c -58.87 KPX eacute cacute -58.87 KPX eacute cacute -58.87 KPX eacute ccaron -58.87 KPX eacute ccedilla -58.87 KPX eacute d -58.87 KPX eacute dbar -58.87 KPX eacute e -58.87 KPX eacute eacute -58.87 KPX eacute ecaron -58.87 KPX eacute ecircumflex -58.87 KPX eacute edieresis -58.87 KPX eacute egrave -58.87 KPX eacute eogonek -58.87 KPX eacute g -58.87 KPX eacute gbreve -58.87 KPX eacute o -58.87 KPX eacute oacute -58.87 KPX eacute ocircumflex -58.87 KPX eacute odieresis -58.87 KPX eacute oe -58.87 KPX eacute ograve -58.87 KPX eacute ohungarumlaut -58.87 KPX eacute oslash -58.87 KPX eacute otilde -58.87 KPX eacute q -58.87 KPX ecaron a -58.87 KPX ecaron aacute -58.87 KPX ecaron acircumflex -58.87 KPX ecaron acircumflex -58.87 KPX ecaron adieresis -58.87 KPX ecaron ae -58.87 KPX ecaron agrave -58.87 KPX ecaron aogonek -58.87 KPX ecaron aring -58.87 KPX ecaron atilde -58.87 KPX ecaron c -58.87 KPX ecaron cacute -58.87 KPX ecaron cacute -58.87 KPX ecaron ccaron -58.87 KPX ecaron ccedilla -58.87 KPX ecaron d -58.87 KPX ecaron dbar -58.87 KPX ecaron e -58.87 KPX ecaron eacute -58.87 KPX ecaron ecaron -58.87 KPX ecaron ecircumflex -58.87 KPX ecaron edieresis -58.87 KPX ecaron egrave -58.87 KPX ecaron eogonek -58.87 KPX ecaron g -58.87 KPX ecaron gbreve -58.87 KPX ecaron o -58.87 KPX ecaron oacute -58.87 KPX ecaron ocircumflex -58.87 KPX ecaron odieresis -58.87 KPX ecaron oe -58.87 KPX ecaron ograve -58.87 KPX ecaron ohungarumlaut -58.87 KPX ecaron oslash -58.87 KPX ecaron otilde -58.87 KPX ecaron q -58.87 KPX ecircumflex a -58.87 KPX ecircumflex aacute -58.87 KPX ecircumflex acircumflex -58.87 KPX ecircumflex acircumflex -58.87 KPX ecircumflex adieresis -58.87 KPX ecircumflex ae -58.87 KPX ecircumflex agrave -58.87 KPX ecircumflex aogonek -58.87 KPX ecircumflex aring -58.87 KPX ecircumflex atilde -58.87 KPX ecircumflex c -58.87 KPX ecircumflex cacute -58.87 KPX ecircumflex cacute -58.87 KPX ecircumflex ccaron -58.87 KPX ecircumflex ccedilla -58.87 KPX ecircumflex d -58.87 KPX ecircumflex dbar -58.87 KPX ecircumflex e -58.87 KPX ecircumflex eacute -58.87 KPX ecircumflex ecaron -58.87 KPX ecircumflex ecircumflex -58.87 KPX ecircumflex edieresis -58.87 KPX ecircumflex egrave -58.87 KPX ecircumflex eogonek -58.87 KPX ecircumflex g -58.87 KPX ecircumflex gbreve -58.87 KPX ecircumflex o -58.87 KPX ecircumflex oacute -58.87 KPX ecircumflex ocircumflex -58.87 KPX ecircumflex odieresis -58.87 KPX ecircumflex oe -58.87 KPX ecircumflex ograve -58.87 KPX ecircumflex ohungarumlaut -58.87 KPX ecircumflex oslash -58.87 KPX ecircumflex otilde -58.87 KPX ecircumflex q -58.87 KPX edieresis a -58.87 KPX edieresis aacute -58.87 KPX edieresis acircumflex -58.87 KPX edieresis acircumflex -58.87 KPX edieresis adieresis -58.87 KPX edieresis ae -58.87 KPX edieresis agrave -58.87 KPX edieresis aogonek -58.87 KPX edieresis aring -58.87 KPX edieresis atilde -58.87 KPX edieresis c -58.87 KPX edieresis cacute -58.87 KPX edieresis cacute -58.87 KPX edieresis ccaron -58.87 KPX edieresis ccedilla -58.87 KPX edieresis d -58.87 KPX edieresis dbar -58.87 KPX edieresis e -58.87 KPX edieresis eacute -58.87 KPX edieresis ecaron -58.87 KPX edieresis ecircumflex -58.87 KPX edieresis edieresis -58.87 KPX edieresis egrave -58.87 KPX edieresis eogonek -58.87 KPX edieresis g -58.87 KPX edieresis gbreve -58.87 KPX edieresis o -58.87 KPX edieresis oacute -58.87 KPX edieresis ocircumflex -58.87 KPX edieresis odieresis -58.87 KPX edieresis oe -58.87 KPX edieresis ograve -58.87 KPX edieresis ohungarumlaut -58.87 KPX edieresis oslash -58.87 KPX edieresis otilde -58.87 KPX edieresis q -58.87 KPX egrave a -58.87 KPX egrave aacute -58.87 KPX egrave acircumflex -58.87 KPX egrave acircumflex -58.87 KPX egrave adieresis -58.87 KPX egrave ae -58.87 KPX egrave agrave -58.87 KPX egrave aogonek -58.87 KPX egrave aring -58.87 KPX egrave atilde -58.87 KPX egrave c -58.87 KPX egrave cacute -58.87 KPX egrave cacute -58.87 KPX egrave ccaron -58.87 KPX egrave ccedilla -58.87 KPX egrave d -58.87 KPX egrave dbar -58.87 KPX egrave e -58.87 KPX egrave eacute -58.87 KPX egrave ecaron -58.87 KPX egrave ecircumflex -58.87 KPX egrave edieresis -58.87 KPX egrave egrave -58.87 KPX egrave eogonek -58.87 KPX egrave g -58.87 KPX egrave gbreve -58.87 KPX egrave o -58.87 KPX egrave oacute -58.87 KPX egrave ocircumflex -58.87 KPX egrave odieresis -58.87 KPX egrave oe -58.87 KPX egrave ograve -58.87 KPX egrave ohungarumlaut -58.87 KPX egrave oslash -58.87 KPX egrave otilde -58.87 KPX egrave q -58.87 KPX eogonek a -58.87 KPX eogonek aacute -58.87 KPX eogonek acircumflex -58.87 KPX eogonek acircumflex -58.87 KPX eogonek adieresis -58.87 KPX eogonek ae -58.87 KPX eogonek agrave -58.87 KPX eogonek aogonek -58.87 KPX eogonek aring -58.87 KPX eogonek atilde -58.87 KPX eogonek c -58.87 KPX eogonek cacute -58.87 KPX eogonek cacute -58.87 KPX eogonek ccaron -58.87 KPX eogonek ccedilla -58.87 KPX eogonek d -58.87 KPX eogonek dbar -58.87 KPX eogonek e -58.87 KPX eogonek eacute -58.87 KPX eogonek ecaron -58.87 KPX eogonek ecircumflex -58.87 KPX eogonek edieresis -58.87 KPX eogonek egrave -58.87 KPX eogonek eogonek -58.87 KPX eogonek g -58.87 KPX eogonek gbreve -58.87 KPX eogonek o -58.87 KPX eogonek oacute -58.87 KPX eogonek ocircumflex -58.87 KPX eogonek odieresis -58.87 KPX eogonek oe -58.87 KPX eogonek ograve -58.87 KPX eogonek ohungarumlaut -58.87 KPX eogonek oslash -58.87 KPX eogonek otilde -58.87 KPX eogonek q -58.87 KPX f bracketright 106.64 KPX f exclam 106.64 KPX f parenright 106.64 KPX f question 106.64 KPX f quoteright 106.64 KPX ff bracketright 106.64 KPX ff exclam 106.64 KPX ff parenright 106.64 KPX ff question 106.64 KPX ff quoteright 106.64 KPX l l 58.87 KPX l lacute 58.87 KPX l lquoteright 58.87 KPX n quoteright -117.75 KPX o a -58.87 KPX o aacute -58.87 KPX o acircumflex -58.87 KPX o acircumflex -58.87 KPX o adieresis -58.87 KPX o ae -58.87 KPX o agrave -58.87 KPX o aogonek -58.87 KPX o aring -58.87 KPX o atilde -58.87 KPX o c -58.87 KPX o cacute -58.87 KPX o cacute -58.87 KPX o ccaron -58.87 KPX o ccedilla -58.87 KPX o d -58.87 KPX o dbar -58.87 KPX o e -58.87 KPX o eacute -58.87 KPX o ecaron -58.87 KPX o ecircumflex -58.87 KPX o edieresis -58.87 KPX o egrave -58.87 KPX o eogonek -58.87 KPX o g -58.87 KPX o gbreve -58.87 KPX o o -58.87 KPX o oacute -58.87 KPX o ocircumflex -58.87 KPX o odieresis -58.87 KPX o oe -58.87 KPX o ograve -58.87 KPX o ohungarumlaut -58.87 KPX o oslash -58.87 KPX o otilde -58.87 KPX o q -58.87 KPX oacute a -58.87 KPX oacute aacute -58.87 KPX oacute acircumflex -58.87 KPX oacute acircumflex -58.87 KPX oacute adieresis -58.87 KPX oacute ae -58.87 KPX oacute agrave -58.87 KPX oacute aogonek -58.87 KPX oacute aring -58.87 KPX oacute atilde -58.87 KPX oacute c -58.87 KPX oacute cacute -58.87 KPX oacute cacute -58.87 KPX oacute ccaron -58.87 KPX oacute ccedilla -58.87 KPX oacute d -58.87 KPX oacute dbar -58.87 KPX oacute e -58.87 KPX oacute eacute -58.87 KPX oacute ecaron -58.87 KPX oacute ecircumflex -58.87 KPX oacute edieresis -58.87 KPX oacute egrave -58.87 KPX oacute eogonek -58.87 KPX oacute g -58.87 KPX oacute gbreve -58.87 KPX oacute o -58.87 KPX oacute oacute -58.87 KPX oacute ocircumflex -58.87 KPX oacute odieresis -58.87 KPX oacute oe -58.87 KPX oacute ograve -58.87 KPX oacute ohungarumlaut -58.87 KPX oacute oslash -58.87 KPX oacute otilde -58.87 KPX oacute q -58.87 KPX ocircumflex a -58.87 KPX ocircumflex aacute -58.87 KPX ocircumflex acircumflex -58.87 KPX ocircumflex acircumflex -58.87 KPX ocircumflex adieresis -58.87 KPX ocircumflex ae -58.87 KPX ocircumflex agrave -58.87 KPX ocircumflex aogonek -58.87 KPX ocircumflex aring -58.87 KPX ocircumflex atilde -58.87 KPX ocircumflex c -58.87 KPX ocircumflex cacute -58.87 KPX ocircumflex cacute -58.87 KPX ocircumflex ccaron -58.87 KPX ocircumflex ccedilla -58.87 KPX ocircumflex d -58.87 KPX ocircumflex dbar -58.87 KPX ocircumflex e -58.87 KPX ocircumflex eacute -58.87 KPX ocircumflex ecaron -58.87 KPX ocircumflex ecircumflex -58.87 KPX ocircumflex edieresis -58.87 KPX ocircumflex egrave -58.87 KPX ocircumflex eogonek -58.87 KPX ocircumflex g -58.87 KPX ocircumflex gbreve -58.87 KPX ocircumflex o -58.87 KPX ocircumflex oacute -58.87 KPX ocircumflex ocircumflex -58.87 KPX ocircumflex odieresis -58.87 KPX ocircumflex oe -58.87 KPX ocircumflex ograve -58.87 KPX ocircumflex ohungarumlaut -58.87 KPX ocircumflex oslash -58.87 KPX ocircumflex otilde -58.87 KPX ocircumflex q -58.87 KPX odieresis a -58.87 KPX odieresis aacute -58.87 KPX odieresis acircumflex -58.87 KPX odieresis acircumflex -58.87 KPX odieresis adieresis -58.87 KPX odieresis ae -58.87 KPX odieresis agrave -58.87 KPX odieresis aogonek -58.87 KPX odieresis aring -58.87 KPX odieresis atilde -58.87 KPX odieresis c -58.87 KPX odieresis cacute -58.87 KPX odieresis cacute -58.87 KPX odieresis ccaron -58.87 KPX odieresis ccedilla -58.87 KPX odieresis d -58.87 KPX odieresis dbar -58.87 KPX odieresis e -58.87 KPX odieresis eacute -58.87 KPX odieresis ecaron -58.87 KPX odieresis ecircumflex -58.87 KPX odieresis edieresis -58.87 KPX odieresis egrave -58.87 KPX odieresis eogonek -58.87 KPX odieresis g -58.87 KPX odieresis gbreve -58.87 KPX odieresis o -58.87 KPX odieresis oacute -58.87 KPX odieresis ocircumflex -58.87 KPX odieresis odieresis -58.87 KPX odieresis oe -58.87 KPX odieresis ograve -58.87 KPX odieresis ohungarumlaut -58.87 KPX odieresis oslash -58.87 KPX odieresis otilde -58.87 KPX odieresis q -58.87 KPX ograve a -58.87 KPX ograve aacute -58.87 KPX ograve acircumflex -58.87 KPX ograve acircumflex -58.87 KPX ograve adieresis -58.87 KPX ograve ae -58.87 KPX ograve agrave -58.87 KPX ograve aogonek -58.87 KPX ograve aring -58.87 KPX ograve atilde -58.87 KPX ograve c -58.87 KPX ograve cacute -58.87 KPX ograve cacute -58.87 KPX ograve ccaron -58.87 KPX ograve ccedilla -58.87 KPX ograve d -58.87 KPX ograve dbar -58.87 KPX ograve e -58.87 KPX ograve eacute -58.87 KPX ograve ecaron -58.87 KPX ograve ecircumflex -58.87 KPX ograve edieresis -58.87 KPX ograve egrave -58.87 KPX ograve eogonek -58.87 KPX ograve g -58.87 KPX ograve gbreve -58.87 KPX ograve o -58.87 KPX ograve oacute -58.87 KPX ograve ocircumflex -58.87 KPX ograve odieresis -58.87 KPX ograve oe -58.87 KPX ograve ograve -58.87 KPX ograve ohungarumlaut -58.87 KPX ograve oslash -58.87 KPX ograve otilde -58.87 KPX ograve q -58.87 KPX otilde a -58.87 KPX otilde aacute -58.87 KPX otilde acircumflex -58.87 KPX otilde acircumflex -58.87 KPX otilde adieresis -58.87 KPX otilde ae -58.87 KPX otilde agrave -58.87 KPX otilde aogonek -58.87 KPX otilde aring -58.87 KPX otilde atilde -58.87 KPX otilde c -58.87 KPX otilde cacute -58.87 KPX otilde cacute -58.87 KPX otilde ccaron -58.87 KPX otilde ccedilla -58.87 KPX otilde d -58.87 KPX otilde dbar -58.87 KPX otilde e -58.87 KPX otilde eacute -58.87 KPX otilde ecaron -58.87 KPX otilde ecircumflex -58.87 KPX otilde edieresis -58.87 KPX otilde egrave -58.87 KPX otilde eogonek -58.87 KPX otilde g -58.87 KPX otilde gbreve -58.87 KPX otilde o -58.87 KPX otilde oacute -58.87 KPX otilde ocircumflex -58.87 KPX otilde odieresis -58.87 KPX otilde oe -58.87 KPX otilde ograve -58.87 KPX otilde ohungarumlaut -58.87 KPX otilde oslash -58.87 KPX otilde otilde -58.87 KPX otilde q -58.87 KPX p a -58.87 KPX p aacute -58.87 KPX p acircumflex -58.87 KPX p acircumflex -58.87 KPX p adieresis -58.87 KPX p ae -58.87 KPX p agrave -58.87 KPX p aogonek -58.87 KPX p aring -58.87 KPX p atilde -58.87 KPX p c -58.87 KPX p cacute -58.87 KPX p cacute -58.87 KPX p ccaron -58.87 KPX p ccedilla -58.87 KPX p d -58.87 KPX p dbar -58.87 KPX p e -58.87 KPX p eacute -58.87 KPX p ecaron -58.87 KPX p ecircumflex -58.87 KPX p edieresis -58.87 KPX p egrave -58.87 KPX p eogonek -58.87 KPX p g -58.87 KPX p gbreve -58.87 KPX p o -58.87 KPX p oacute -58.87 KPX p ocircumflex -58.87 KPX p odieresis -58.87 KPX p oe -58.87 KPX p ograve -58.87 KPX p ohungarumlaut -58.87 KPX p oslash -58.87 KPX p otilde -58.87 KPX p q -58.87 KPX quoteright exclam 117.75 KPX quoteright question 117.75 KPX r a -58.87 KPX r aacute -58.87 KPX r acircumflex -58.87 KPX r acircumflex -58.87 KPX r adieresis -58.87 KPX r ae -58.87 KPX r agrave -58.87 KPX r aogonek -58.87 KPX r aring -58.87 KPX r atilde -58.87 KPX r c -58.87 KPX r cacute -58.87 KPX r cacute -58.87 KPX r ccaron -58.87 KPX r ccedilla -58.87 KPX r d -58.87 KPX r dbar -58.87 KPX r e -58.87 KPX r eacute -58.87 KPX r ecaron -58.87 KPX r ecircumflex -58.87 KPX r edieresis -58.87 KPX r egrave -58.87 KPX r eogonek -58.87 KPX r g -58.87 KPX r gbreve -58.87 KPX r o -58.87 KPX r oacute -58.87 KPX r ocircumflex -58.87 KPX r odieresis -58.87 KPX r oe -58.87 KPX r ograve -58.87 KPX r ohungarumlaut -58.87 KPX r oslash -58.87 KPX r otilde -58.87 KPX r q -58.87 KPX thorn a -58.87 KPX thorn aacute -58.87 KPX thorn acircumflex -58.87 KPX thorn acircumflex -58.87 KPX thorn adieresis -58.87 KPX thorn ae -58.87 KPX thorn agrave -58.87 KPX thorn aogonek -58.87 KPX thorn aring -58.87 KPX thorn atilde -58.87 KPX thorn c -58.87 KPX thorn cacute -58.87 KPX thorn cacute -58.87 KPX thorn ccaron -58.87 KPX thorn ccedilla -58.87 KPX thorn d -58.87 KPX thorn dbar -58.87 KPX thorn e -58.87 KPX thorn eacute -58.87 KPX thorn ecaron -58.87 KPX thorn ecircumflex -58.87 KPX thorn edieresis -58.87 KPX thorn egrave -58.87 KPX thorn eogonek -58.87 KPX thorn g -58.87 KPX thorn gbreve -58.87 KPX thorn o -58.87 KPX thorn oacute -58.87 KPX thorn ocircumflex -58.87 KPX thorn odieresis -58.87 KPX thorn oe -58.87 KPX thorn ograve -58.87 KPX thorn ohungarumlaut -58.87 KPX thorn oslash -58.87 KPX thorn otilde -58.87 KPX thorn q -58.87 KPX w l 58.87 KPX w lacute 58.87 KPX w lquoteright 58.87 EndKernPairs EndKernData EndFontMetrics xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/afm/bchb.afm0000664000175000017500000005217211742726711022741 0ustar uwabamiuwabamiStartFontMetrics 2.0 Comment Bitstream AFM Data Comment Copyright 1987-1990 as an unpublished work by Bitstream Inc., Cambridge, MA. Comment All rights reserved Comment Confidential and proprietary to Bitstream Inc. Comment Bitstream is a registered trademark of Bitstream Inc. Comment bitsClassification Transitional 801 Comment bitsFontID 0632 Comment bitsManufacturingDate Tue Nov 6 02:14:13 1990 Comment bitsLayoutName clayout.adobe.text228.new Comment UniqueID 15530632 FontName CharterBT-Bold FullName Bitstream Charter Bold FamilyName Bitstream Charter Weight Bold ItalicAngle 0.00 IsFixedPitch false FontBBox -166 -237 1263 963 UnderlinePosition -109 UnderlineThickness 91 Version 1.0 [UFO] Notice Copyright 1987-1990 as an unpublished work by Bitstream Inc. All rights reserved. Confidential. EncodingScheme AdobeStandardEncoding CapHeight 672 XHeight 488 Ascender 740 Descender -219 StartCharMetrics 228 C 32 ; WX 291 ; N space ; B 0 0 0 0 ; C 33 ; WX 340 ; N exclam ; B 94 -8 247 685 ; C 34 ; WX 339 ; N quotedbl ; B 40 418 299 715 ; C 35 ; WX 736 ; N numbersign ; B 56 -24 675 710 ; C 36 ; WX 581 ; N dollar ; B 61 -102 533 742 ; C 37 ; WX 888 ; N percent ; B 36 -12 863 683 ; C 38 ; WX 741 ; N ampersand ; B 52 -12 725 684 ; C 39 ; WX 255 ; N quoteright ; B 47 395 220 698 ; C 40 ; WX 428 ; N parenleft ; B 90 -142 387 718 ; C 41 ; WX 428 ; N parenright ; B 37 -142 330 718 ; C 42 ; WX 500 ; N asterisk ; B 53 338 447 718 ; C 43 ; WX 833 ; N plus ; B 124 0 710 597 ; C 44 ; WX 289 ; N comma ; B 30 -176 221 129 ; C 45 ; WX 326 ; N hyphen ; B 36 191 291 291 ; C 46 ; WX 289 ; N period ; B 65 -8 224 151 ; C 47 ; WX 491 ; N slash ; B -28 -93 472 672 ; C 48 ; WX 581 ; N zero ; B 39 -12 549 683 ; C 49 ; WX 581 ; N one ; B 108 0 495 681 ; C 50 ; WX 581 ; N two ; B 48 0 533 684 ; C 51 ; WX 581 ; N three ; B 42 -11 523 682 ; C 52 ; WX 581 ; N four ; B 25 -32 566 677 ; C 53 ; WX 581 ; N five ; B 54 -10 525 672 ; C 54 ; WX 581 ; N six ; B 46 -13 554 714 ; C 55 ; WX 581 ; N seven ; B 75 -34 556 672 ; C 56 ; WX 581 ; N eight ; B 41 -16 540 685 ; C 57 ; WX 581 ; N nine ; B 42 -54 546 683 ; C 58 ; WX 340 ; N colon ; B 94 -8 252 489 ; C 59 ; WX 340 ; N semicolon ; B 67 -176 255 489 ; C 60 ; WX 833 ; N less ; B 128 22 704 574 ; C 61 ; WX 833 ; N equal ; B 124 156 710 440 ; C 62 ; WX 833 ; N greater ; B 129 22 704 574 ; C 63 ; WX 487 ; N question ; B 35 -8 437 684 ; C 64 ; WX 917 ; N at ; B 74 -154 854 693 ; C 65 ; WX 651 ; N A ; B -12 0 670 678 ; C 66 ; WX 628 ; N B ; B 28 0 590 672 ; C 67 ; WX 638 ; N C ; B 40 -13 602 683 ; C 68 ; WX 716 ; N D ; B 28 0 682 672 ; C 69 ; WX 596 ; N E ; B 28 0 566 672 ; C 70 ; WX 552 ; N F ; B 25 0 529 672 ; C 71 ; WX 710 ; N G ; B 40 -12 691 683 ; C 72 ; WX 760 ; N H ; B 30 0 734 672 ; C 73 ; WX 354 ; N I ; B 29 0 329 672 ; C 74 ; WX 465 ; N J ; B 11 -13 465 672 ; C 75 ; WX 650 ; N K ; B 29 0 672 672 ; C 76 ; WX 543 ; N L ; B 27 0 533 672 ; C 77 ; WX 883 ; N M ; B 24 0 863 672 ; C 78 ; WX 727 ; N N ; B 24 0 711 672 ; C 79 ; WX 752 ; N O ; B 40 -17 718 687 ; C 80 ; WX 587 ; N P ; B 24 0 569 672 ; C 81 ; WX 752 ; N Q ; B 39 -179 720 687 ; C 82 ; WX 671 ; N R ; B 30 -7 692 672 ; C 83 ; WX 568 ; N S ; B 58 -12 517 683 ; C 84 ; WX 603 ; N T ; B 15 0 594 672 ; C 85 ; WX 705 ; N U ; B 20 -13 695 672 ; C 86 ; WX 635 ; N V ; B -21 -3 661 672 ; C 87 ; WX 946 ; N W ; B 1 0 945 672 ; C 88 ; WX 637 ; N X ; B -1 0 644 672 ; C 89 ; WX 610 ; N Y ; B -11 0 627 672 ; C 90 ; WX 592 ; N Z ; B 44 0 550 672 ; C 91 ; WX 443 ; N bracketleft ; B 135 -133 406 709 ; C 92 ; WX 491 ; N backslash ; B -8 -93 486 672 ; C 93 ; WX 443 ; N bracketright ; B 42 -133 312 709 ; C 94 ; WX 1000 ; N asciicircum ; B 201 437 798 714 ; C 95 ; WX 500 ; N underscore ; B 0 -237 500 -152 ; C 96 ; WX 255 ; N quoteleft ; B 49 395 222 699 ; C 97 ; WX 544 ; N a ; B 40 -10 535 500 ; C 98 ; WX 577 ; N b ; B 9 -2 547 740 ; C 99 ; WX 476 ; N c ; B 34 -8 464 498 ; C 100 ; WX 596 ; N d ; B 36 -10 577 740 ; C 101 ; WX 524 ; N e ; B 37 -9 493 501 ; C 102 ; WX 341 ; N f ; B 30 0 412 744 ; C 103 ; WX 551 ; N g ; B 33 -218 555 498 ; C 104 ; WX 597 ; N h ; B 16 0 586 740 ; C 105 ; WX 305 ; N i ; B 29 0 293 724 ; C 106 ; WX 297 ; N j ; B -80 -215 242 724 ; C 107 ; WX 553 ; N k ; B 17 0 572 740 ; C 108 ; WX 304 ; N l ; B 22 0 292 740 ; C 109 ; WX 892 ; N m ; B 30 0 883 500 ; C 110 ; WX 605 ; N n ; B 27 0 594 499 ; C 111 ; WX 577 ; N o ; B 36 -9 547 499 ; C 112 ; WX 591 ; N p ; B 21 -219 560 500 ; C 113 ; WX 575 ; N q ; B 37 -218 572 499 ; C 114 ; WX 421 ; N r ; B 24 0 421 498 ; C 115 ; WX 447 ; N s ; B 40 -11 411 500 ; C 116 ; WX 358 ; N t ; B 18 -5 357 599 ; C 117 ; WX 600 ; N u ; B 22 -10 583 499 ; C 118 ; WX 513 ; N v ; B -7 0 535 488 ; C 119 ; WX 799 ; N w ; B -1 0 811 488 ; C 120 ; WX 531 ; N x ; B 11 0 532 488 ; C 121 ; WX 515 ; N y ; B -5 -219 537 486 ; C 122 ; WX 495 ; N z ; B 45 0 466 486 ; C 123 ; WX 493 ; N braceleft ; B 46 -134 421 705 ; C 124 ; WX 500 ; N bar ; B 207 -237 294 764 ; C 125 ; WX 493 ; N braceright ; B 62 -134 438 705 ; C 126 ; WX 833 ; N asciitilde ; B 86 212 747 384 ; C 161 ; WX 340 ; N exclamdown ; B 93 -8 246 685 ; C 162 ; WX 581 ; N cent ; B 58 -103 504 612 ; C 163 ; WX 581 ; N sterling ; B 42 0 540 680 ; C 164 ; WX 167 ; N fraction ; B -166 -1 333 672 ; C 165 ; WX 595 ; N yen ; B -7 0 604 672 ; C 166 ; WX 581 ; N florin ; B 12 -149 535 683 ; C 167 ; WX 500 ; N section ; B 45 -142 455 720 ; C 168 ; WX 606 ; N currency ; B 36 166 571 699 ; C 169 ; WX 175 ; N quotesingle ; B 40 418 135 715 ; C 170 ; WX 475 ; N quotedblleft ; B 49 395 443 699 ; C 171 ; WX 449 ; N guillemotleft ; B 34 53 404 427 ; C 172 ; WX 255 ; N guilsinglleft ; B 34 53 207 427 ; C 173 ; WX 255 ; N guilsinglright ; B 37 53 211 427 ; C 174 ; WX 622 ; N fi ; B 30 0 605 745 ; C 175 ; WX 627 ; N fl ; B 30 0 616 746 ; C 177 ; WX 500 ; N endash ; B 0 195 500 286 ; C 178 ; WX 500 ; N dagger ; B 17 -130 484 718 ; C 179 ; WX 500 ; N daggerdbl ; B 17 -132 484 718 ; C 180 ; WX 289 ; N periodcentered ; B 65 256 224 415 ; C 182 ; WX 491 ; N paragraph ; B 18 -79 458 672 ; C 183 ; WX 590 ; N bullet ; B 150 227 439 516 ; C 184 ; WX 255 ; N quotesinglbase ; B 32 -174 205 130 ; C 185 ; WX 475 ; N quotedblbase ; B 35 -174 429 130 ; C 186 ; WX 475 ; N quotedblright ; B 47 395 441 698 ; C 187 ; WX 449 ; N guillemotright ; B 42 53 412 427 ; C 188 ; WX 1000 ; N ellipsis ; B 87 -8 914 151 ; C 189 ; WX 1287 ; N perthousand ; B 36 -12 1263 683 ; C 191 ; WX 487 ; N questiondown ; B 37 -8 440 684 ; C 193 ; WX 500 ; N grave ; B 85 551 307 742 ; C 194 ; WX 500 ; N acute ; B 205 551 428 742 ; C 195 ; WX 500 ; N circumflex ; B 96 551 404 742 ; C 196 ; WX 500 ; N tilde ; B 87 570 411 723 ; C 197 ; WX 500 ; N macron ; B 85 603 417 676 ; C 198 ; WX 500 ; N breve ; B 98 567 403 719 ; C 199 ; WX 500 ; N dotaccent ; B 185 578 316 713 ; C 200 ; WX 500 ; N dieresis ; B 83 578 417 710 ; C 202 ; WX 500 ; N ring ; B 131 546 369 784 ; C 203 ; WX 500 ; N cedilla ; B 171 -230 374 0 ; C 205 ; WX 500 ; N hungarumlaut ; B 107 551 490 742 ; C 206 ; WX 500 ; N ogonek ; B 176 -225 336 0 ; C 207 ; WX 500 ; N caron ; B 96 551 404 742 ; C 208 ; WX 1000 ; N emdash ; B 0 195 1000 286 ; C 225 ; WX 890 ; N AE ; B -59 0 863 672 ; C 227 ; WX 408 ; N ordfeminine ; B 30 323 402 681 ; C 232 ; WX 543 ; N Lslash ; B 9 0 533 672 ; C 233 ; WX 752 ; N Oslash ; B 40 -83 718 754 ; C 234 ; WX 1010 ; N OE ; B 39 -11 980 682 ; C 235 ; WX 433 ; N ordmasculine ; B 27 324 411 680 ; C 241 ; WX 768 ; N ae ; B 40 -10 735 500 ; C 245 ; WX 305 ; N dotlessi ; B 29 0 293 497 ; C 248 ; WX 304 ; N lslash ; B -3 0 328 740 ; C 249 ; WX 577 ; N oslash ; B 37 -83 548 571 ; C 250 ; WX 861 ; N oe ; B 37 -9 827 500 ; C 251 ; WX 642 ; N germandbls ; B 18 -9 622 743 ; C -1 ; WX 651 ; N Aacute ; B -12 0 670 930 ; C -1 ; WX 651 ; N Acircumflex ; B -12 0 670 930 ; C -1 ; WX 651 ; N Adieresis ; B -12 0 670 898 ; C -1 ; WX 651 ; N Agrave ; B -12 0 670 930 ; C -1 ; WX 651 ; N Aring ; B -12 0 670 963 ; C -1 ; WX 651 ; N Atilde ; B -12 0 670 911 ; C -1 ; WX 638 ; N Ccedilla ; B 40 -230 602 683 ; C -1 ; WX 596 ; N Eacute ; B 28 0 566 930 ; C -1 ; WX 596 ; N Ecircumflex ; B 28 0 566 930 ; C -1 ; WX 596 ; N Edieresis ; B 28 0 566 898 ; C -1 ; WX 596 ; N Egrave ; B 28 0 566 930 ; C -1 ; WX 354 ; N Iacute ; B 29 0 355 930 ; C -1 ; WX 354 ; N Icircumflex ; B 23 0 331 930 ; C -1 ; WX 354 ; N Idieresis ; B 10 0 344 898 ; C -1 ; WX 354 ; N Igrave ; B 12 0 329 930 ; C -1 ; WX 727 ; N Ntilde ; B 24 0 711 911 ; C -1 ; WX 752 ; N Oacute ; B 40 -17 718 930 ; C -1 ; WX 752 ; N Ocircumflex ; B 40 -17 718 930 ; C -1 ; WX 752 ; N Odieresis ; B 40 -17 718 898 ; C -1 ; WX 752 ; N Ograve ; B 40 -17 718 930 ; C -1 ; WX 752 ; N Otilde ; B 40 -17 718 911 ; C -1 ; WX 568 ; N Scaron ; B 58 -12 517 930 ; C -1 ; WX 705 ; N Uacute ; B 20 -13 695 930 ; C -1 ; WX 705 ; N Ucircumflex ; B 20 -13 695 930 ; C -1 ; WX 705 ; N Udieresis ; B 20 -13 695 898 ; C -1 ; WX 705 ; N Ugrave ; B 20 -13 695 930 ; C -1 ; WX 610 ; N Ydieresis ; B -11 0 627 898 ; C -1 ; WX 592 ; N Zcaron ; B 44 0 550 930 ; C -1 ; WX 544 ; N aacute ; B 40 -10 535 742 ; C -1 ; WX 544 ; N acircumflex ; B 40 -10 535 742 ; C -1 ; WX 544 ; N adieresis ; B 40 -10 535 710 ; C -1 ; WX 544 ; N agrave ; B 40 -10 535 742 ; C -1 ; WX 544 ; N aring ; B 40 -10 535 784 ; C -1 ; WX 544 ; N atilde ; B 40 -10 535 723 ; C -1 ; WX 476 ; N ccedilla ; B 34 -230 464 498 ; C -1 ; WX 524 ; N eacute ; B 37 -9 493 742 ; C -1 ; WX 524 ; N ecircumflex ; B 37 -9 493 742 ; C -1 ; WX 524 ; N edieresis ; B 37 -9 493 710 ; C -1 ; WX 524 ; N egrave ; B 37 -9 493 742 ; C -1 ; WX 305 ; N iacute ; B 29 0 331 742 ; C -1 ; WX 305 ; N icircumflex ; B -2 0 307 742 ; C -1 ; WX 305 ; N idieresis ; B -15 0 320 710 ; C -1 ; WX 305 ; N igrave ; B -13 0 293 742 ; C -1 ; WX 605 ; N ntilde ; B 27 0 594 723 ; C -1 ; WX 577 ; N oacute ; B 36 -9 547 742 ; C -1 ; WX 577 ; N ocircumflex ; B 36 -9 547 742 ; C -1 ; WX 577 ; N odieresis ; B 36 -9 547 710 ; C -1 ; WX 577 ; N ograve ; B 36 -9 547 742 ; C -1 ; WX 577 ; N otilde ; B 36 -9 547 723 ; C -1 ; WX 447 ; N scaron ; B 40 -11 411 742 ; C -1 ; WX 600 ; N uacute ; B 22 -10 583 742 ; C -1 ; WX 600 ; N ucircumflex ; B 22 -10 583 742 ; C -1 ; WX 600 ; N udieresis ; B 22 -10 583 710 ; C -1 ; WX 600 ; N ugrave ; B 22 -10 583 742 ; C -1 ; WX 515 ; N ydieresis ; B -5 -219 537 710 ; C -1 ; WX 495 ; N zcaron ; B 45 0 466 742 ; C -1 ; WX 800 ; N trademark ; B 111 398 710 662 ; C -1 ; WX 876 ; N copyright ; B 61 -50 825 730 ; C -1 ; WX 833 ; N logicalnot ; B 124 175 710 421 ; C -1 ; WX 876 ; N registered ; B 61 -50 825 730 ; C -1 ; WX 833 ; N minus ; B 124 256 710 340 ; C -1 ; WX 716 ; N Eth ; B 15 0 682 672 ; C -1 ; WX 587 ; N Thorn ; B 32 0 572 672 ; C -1 ; WX 610 ; N Yacute ; B -11 0 627 930 ; C -1 ; WX 500 ; N brokenbar ; B 207 -172 294 699 ; C -1 ; WX 329 ; N degree ; B 20 424 309 713 ; C -1 ; WX 833 ; N divide ; B 124 45 710 551 ; C -1 ; WX 569 ; N eth ; B 34 -10 540 744 ; C -1 ; WX 578 ; N mu ; B -53 -206 546 433 ; C -1 ; WX 833 ; N multiply ; B 139 16 704 581 ; C -1 ; WX 899 ; N onehalf ; B 68 -1 869 677 ; C -1 ; WX 899 ; N onequarter ; B 68 -18 890 677 ; C -1 ; WX 383 ; N onesuperior ; B 71 268 327 677 ; C -1 ; WX 833 ; N plusminus ; B 124 7 710 590 ; C -1 ; WX 591 ; N thorn ; B 20 -219 562 740 ; C -1 ; WX 899 ; N threequarters ; B 26 -18 890 678 ; C -1 ; WX 383 ; N threesuperior ; B 27 261 346 678 ; C -1 ; WX 383 ; N twosuperior ; B 31 268 352 679 ; C -1 ; WX 515 ; N yacute ; B -5 -219 537 742 ; EndCharMetrics StartKernData StartKernPairs 361 KPX hyphen T -37 KPX hyphen V -56 KPX hyphen W -56 KPX hyphen X -37 KPX hyphen Y -74 KPX A quoteright -130 KPX A T -111 KPX A U -23 KPX A V -56 KPX A W -42 KPX A Y -42 KPX A f -19 KPX A t -19 KPX A v -32 KPX A w -46 KPX A y -23 KPX A fi -19 KPX A fl -19 KPX A quotedblright -130 KPX B hyphen 37 KPX B C 19 KPX B G 19 KPX B O 19 KPX B S 19 KPX B V -37 KPX B W -19 KPX B Y -19 KPX B Oslash 19 KPX B OE 19 KPX C quoteright 37 KPX C hyphen 23 KPX C A -19 KPX C S 19 KPX C quotedblright 37 KPX C Aring -19 KPX D hyphen 37 KPX D A -19 KPX D V -19 KPX D Y -19 KPX D Aring -19 KPX F comma -190 KPX F hyphen -74 KPX F period -190 KPX F colon -37 KPX F semicolon -37 KPX F A -97 KPX F a -79 KPX F e -65 KPX F i -19 KPX F o -46 KPX F r -37 KPX F u -37 KPX F y -37 KPX F quotesinglbase -56 KPX F quotedblbase -56 KPX F ae -79 KPX F oslash -46 KPX F oe -46 KPX F Aring -97 KPX G hyphen 19 KPX G T -19 KPX G W -19 KPX G Y -23 KPX J A -37 KPX J Aring -37 KPX K hyphen -37 KPX K A -23 KPX K C -28 KPX K O -28 KPX K U -37 KPX K W -37 KPX K Y -28 KPX K a 19 KPX K e -37 KPX K o -37 KPX K u -19 KPX K y -102 KPX K quotesinglbase 37 KPX K quotedblbase 37 KPX K Oslash -28 KPX K OE -28 KPX K ae 19 KPX K oslash -37 KPX K oe -37 KPX K Aring -23 KPX L quoteright -167 KPX L T -83 KPX L U -19 KPX L V -120 KPX L W -88 KPX L Y -102 KPX L quoteleft -74 KPX L a 19 KPX L e 19 KPX L o 19 KPX L y -56 KPX L quotedblleft -74 KPX L quotesinglbase 19 KPX L quotedblbase 19 KPX L quotedblright -167 KPX L ae 19 KPX L oslash 19 KPX L oe 19 KPX O comma -60 KPX O hyphen 37 KPX O period -60 KPX O V -19 KPX O X -19 KPX P comma -259 KPX P hyphen -93 KPX P period -259 KPX P colon -37 KPX P semicolon -37 KPX P A -93 KPX P U -19 KPX P a -37 KPX P e -37 KPX P o -32 KPX P quotesinglbase -93 KPX P quotedblbase -93 KPX P ae -37 KPX P oslash -32 KPX P oe -32 KPX P Aring -93 KPX Q quoteright 19 KPX Q hyphen 37 KPX Q quotedblright 19 KPX R quoteright -37 KPX R colon -19 KPX R semicolon -19 KPX R T -37 KPX R V -56 KPX R W -42 KPX R Y -51 KPX R quoteleft -37 KPX R e -37 KPX R o -37 KPX R u -37 KPX R y -46 KPX R quotedblleft -37 KPX R quotesinglbase 37 KPX R quotedblbase 37 KPX R quotedblright -37 KPX R oslash -37 KPX R oe -37 KPX T quoteright 19 KPX T comma -148 KPX T hyphen -130 KPX T period -148 KPX T colon -37 KPX T semicolon -37 KPX T A -111 KPX T T 19 KPX T quoteleft 37 KPX T a -97 KPX T c -97 KPX T e -97 KPX T i -19 KPX T o -97 KPX T r -74 KPX T s -74 KPX T u -111 KPX T w -74 KPX T y -93 KPX T quotedblleft 37 KPX T guillemotleft -37 KPX T guilsinglleft -37 KPX T quotedblright 19 KPX T ae -97 KPX T oslash -97 KPX T oe -97 KPX T Aring -111 KPX U A -32 KPX U J -28 KPX U Aring -32 KPX V quoteright 37 KPX V comma -222 KPX V hyphen -93 KPX V period -222 KPX V colon -102 KPX V semicolon -102 KPX V A -79 KPX V O -19 KPX V a -111 KPX V e -106 KPX V i -28 KPX V o -93 KPX V u -65 KPX V y -65 KPX V quotesinglbase -74 KPX V quotedblbase -74 KPX V quotedblright 37 KPX V Oslash -19 KPX V OE -19 KPX V ae -111 KPX V oslash -93 KPX V oe -93 KPX V Aring -79 KPX W quoteright 19 KPX W comma -176 KPX W hyphen -74 KPX W period -176 KPX W colon -88 KPX W semicolon -88 KPX W A -60 KPX W a -88 KPX W e -83 KPX W i -37 KPX W o -88 KPX W r -65 KPX W u -60 KPX W y -42 KPX W quotesinglbase -37 KPX W quotedblbase -37 KPX W quotedblright 19 KPX W ae -88 KPX W oslash -88 KPX W oe -88 KPX W Aring -60 KPX X hyphen -37 KPX X A -19 KPX X C -19 KPX X O -19 KPX X e -37 KPX X quotesinglbase 19 KPX X quotedblbase 19 KPX X Oslash -19 KPX X OE -19 KPX X Aring -19 KPX Y quoteright 28 KPX Y comma -130 KPX Y hyphen -130 KPX Y period -130 KPX Y colon -125 KPX Y semicolon -125 KPX Y A -60 KPX Y C -19 KPX Y a -116 KPX Y e -125 KPX Y i -37 KPX Y o -116 KPX Y u -88 KPX Y guillemotleft -56 KPX Y guilsinglleft -56 KPX Y quotesinglbase -37 KPX Y quotedblbase -37 KPX Y quotedblright 28 KPX Y ae -116 KPX Y oslash -116 KPX Y oe -116 KPX Y Aring -60 KPX quoteleft A -130 KPX quoteleft J -148 KPX quoteleft V 56 KPX quoteleft W 37 KPX quoteleft X 37 KPX quoteleft Y 37 KPX quoteleft v 28 KPX quoteleft w 19 KPX quoteleft y 19 KPX quoteleft AE -111 KPX quoteleft Aring -130 KPX f quoteright 74 KPX f comma -37 KPX f hyphen -19 KPX f period -37 KPX f quoteleft 37 KPX f quotedblleft 37 KPX f quotedblright 74 KPX r comma -111 KPX r period -111 KPX r quotesinglbase -37 KPX r quotedblbase -37 KPX v quoteright 28 KPX v comma -120 KPX v period -120 KPX v quotedblright 28 KPX w quoteright 19 KPX w comma -120 KPX w period -120 KPX w quoteleft 19 KPX w quotedblleft 19 KPX w quotesinglbase -37 KPX w quotedblbase -37 KPX w quotedblright 19 KPX x e -19 KPX x o -19 KPX x oslash -19 KPX x oe -19 KPX y comma -134 KPX y period -134 KPX y quoteleft 19 KPX y quotedblleft 19 KPX quotedblleft A -130 KPX quotedblleft J -148 KPX quotedblleft V 56 KPX quotedblleft W 37 KPX quotedblleft X 37 KPX quotedblleft Y 37 KPX quotedblleft v 28 KPX quotedblleft w 19 KPX quotedblleft y 19 KPX quotedblleft AE -111 KPX quotedblleft Aring -130 KPX guilsinglright Y -56 KPX quotesinglbase A 19 KPX quotesinglbase V -37 KPX quotesinglbase X 19 KPX quotesinglbase Y -19 KPX quotesinglbase AE 74 KPX quotesinglbase Aring 19 KPX quotedblbase A 19 KPX quotedblbase V -37 KPX quotedblbase X 19 KPX quotedblbase Y -19 KPX quotedblbase AE 74 KPX quotedblbase Aring 19 KPX guillemotright Y -56 KPX AE hyphen 19 KPX Lslash quoteright -167 KPX Lslash T -83 KPX Lslash U -19 KPX Lslash V -120 KPX Lslash W -88 KPX Lslash Y -102 KPX Lslash quoteleft -74 KPX Lslash a 19 KPX Lslash e 19 KPX Lslash o 19 KPX Lslash y -56 KPX Lslash quotedblleft -74 KPX Lslash quotesinglbase 19 KPX Lslash quotedblbase 19 KPX Lslash quotedblright -167 KPX Lslash ae 19 KPX Lslash oslash 19 KPX Lslash oe 19 KPX Oslash comma -60 KPX Oslash hyphen 37 KPX Oslash period -60 KPX Oslash V -19 KPX Oslash X -19 KPX Aring quoteright -130 KPX Aring T -111 KPX Aring U -23 KPX Aring V -56 KPX Aring W -42 KPX Aring Y -42 KPX Aring f -19 KPX Aring t -19 KPX Aring v -32 KPX Aring w -46 KPX Aring y -23 KPX Aring fi -19 KPX Aring fl -19 KPX Aring quotedblright -130 KPX Eth hyphen 37 KPX Eth A -19 KPX Eth V -19 KPX Eth Y -19 KPX Eth Aring -19 EndKernPairs StartTrackKern 3 TrackKern -1 6 0.10 144 -2.09 TrackKern -2 6 0.05 144 -4.02 TrackKern -3 6 0.00 144 -5.96 EndTrackKern EndKernData EndFontMetrics xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/afm/bchbi.afm0000664000175000017500000005312311742726711023107 0ustar uwabamiuwabamiStartFontMetrics 2.0 Comment Bitstream AFM Data Comment Copyright 1987-1990 as an unpublished work by Bitstream Inc., Cambridge, MA. Comment All rights reserved Comment Confidential and proprietary to Bitstream Inc. Comment Bitstream is a registered trademark of Bitstream Inc. Comment bitsClassification Transitional 801 Comment bitsFontID 0633 Comment bitsManufacturingDate Tue Nov 6 02:16:48 1990 Comment bitsLayoutName clayout.adobe.text228.new Comment UniqueID 15530633 FontName CharterBT-BoldItalic FullName Bitstream Charter Bold Italic FamilyName Bitstream Charter Weight Bold ItalicAngle 11.0000 IsFixedPitch false FontBBox -190 -237 1243 972 UnderlinePosition -109 UnderlineThickness 91 Version 1.0 [UFO] Notice Copyright 1987-1990 as an unpublished work by Bitstream Inc. All rights reserved. Confidential. EncodingScheme AdobeStandardEncoding CapHeight 672 XHeight 495 Ascender 736 Descender -218 StartCharMetrics 228 C 32 ; WX 293 ; N space ; B 0 0 0 0 ; C 33 ; WX 340 ; N exclam ; B 43 -8 295 685 ; C 34 ; WX 339 ; N quotedbl ; B 40 418 299 715 ; C 35 ; WX 751 ; N numbersign ; B 56 -24 689 710 ; C 36 ; WX 586 ; N dollar ; B 24 -105 544 745 ; C 37 ; WX 898 ; N percent ; B 54 -12 846 683 ; C 38 ; WX 730 ; N ampersand ; B 19 -13 698 685 ; C 39 ; WX 261 ; N quoteright ; B 63 395 269 699 ; C 40 ; WX 420 ; N parenleft ; B 66 -142 459 718 ; C 41 ; WX 420 ; N parenright ; B -62 -142 331 718 ; C 42 ; WX 500 ; N asterisk ; B 96 338 490 718 ; C 43 ; WX 833 ; N plus ; B 124 0 710 597 ; C 44 ; WX 292 ; N comma ; B -57 -176 168 130 ; C 45 ; WX 320 ; N hyphen ; B 9 191 282 291 ; C 46 ; WX 294 ; N period ; B 22 -6 175 149 ; C 47 ; WX 481 ; N slash ; B -119 -93 525 672 ; C 48 ; WX 586 ; N zero ; B 29 -13 556 684 ; C 49 ; WX 586 ; N one ; B 79 0 438 681 ; C 50 ; WX 586 ; N two ; B -4 0 531 683 ; C 51 ; WX 586 ; N three ; B 11 -11 540 683 ; C 52 ; WX 586 ; N four ; B -2 -33 551 677 ; C 53 ; WX 586 ; N five ; B 19 -10 552 672 ; C 54 ; WX 586 ; N six ; B 31 -12 532 719 ; C 55 ; WX 586 ; N seven ; B 74 -34 612 672 ; C 56 ; WX 586 ; N eight ; B 24 -18 549 686 ; C 57 ; WX 586 ; N nine ; B 47 -58 558 684 ; C 58 ; WX 346 ; N colon ; B 49 -6 263 487 ; C 59 ; WX 346 ; N semicolon ; B -25 -176 263 487 ; C 60 ; WX 833 ; N less ; B 128 22 704 574 ; C 61 ; WX 833 ; N equal ; B 124 156 710 440 ; C 62 ; WX 833 ; N greater ; B 129 22 704 574 ; C 63 ; WX 492 ; N question ; B 74 -8 471 684 ; C 64 ; WX 936 ; N at ; B 76 -154 871 693 ; C 65 ; WX 634 ; N A ; B -68 0 613 678 ; C 66 ; WX 628 ; N B ; B -24 0 580 672 ; C 67 ; WX 625 ; N C ; B 36 -13 637 684 ; C 68 ; WX 702 ; N D ; B -26 0 661 672 ; C 69 ; WX 581 ; N E ; B -22 0 580 672 ; C 70 ; WX 539 ; N F ; B -23 0 570 671 ; C 71 ; WX 693 ; N G ; B 38 -12 671 685 ; C 72 ; WX 747 ; N H ; B -25 0 768 672 ; C 73 ; WX 353 ; N I ; B -21 0 370 672 ; C 74 ; WX 474 ; N J ; B -46 -14 497 672 ; C 75 ; WX 653 ; N K ; B -26 -7 695 672 ; C 76 ; WX 529 ; N L ; B -26 0 489 672 ; C 77 ; WX 894 ; N M ; B -25 0 913 672 ; C 78 ; WX 712 ; N N ; B -27 0 744 672 ; C 79 ; WX 729 ; N O ; B 37 -14 690 684 ; C 80 ; WX 581 ; N P ; B -24 0 583 672 ; C 81 ; WX 729 ; N Q ; B 36 -165 705 684 ; C 82 ; WX 645 ; N R ; B -22 -7 632 671 ; C 83 ; WX 553 ; N S ; B 23 -8 509 684 ; C 84 ; WX 584 ; N T ; B 37 0 628 672 ; C 85 ; WX 701 ; N U ; B 71 -13 735 672 ; C 86 ; WX 617 ; N V ; B 26 -3 677 672 ; C 87 ; WX 921 ; N W ; B 43 0 963 672 ; C 88 ; WX 608 ; N X ; B -66 0 658 672 ; C 89 ; WX 586 ; N Y ; B 26 0 656 672 ; C 90 ; WX 572 ; N Z ; B -18 0 581 672 ; C 91 ; WX 449 ; N bracketleft ; B 51 -133 472 709 ; C 92 ; WX 481 ; N backslash ; B 21 -93 505 672 ; C 93 ; WX 449 ; N bracketright ; B -43 -133 379 709 ; C 94 ; WX 1000 ; N asciicircum ; B 201 437 798 714 ; C 95 ; WX 500 ; N underscore ; B 0 -237 500 -152 ; C 96 ; WX 261 ; N quoteleft ; B 76 395 282 699 ; C 97 ; WX 572 ; N a ; B 18 -9 548 494 ; C 98 ; WX 556 ; N b ; B 26 -9 508 736 ; C 99 ; WX 437 ; N c ; B 15 -11 410 493 ; C 100 ; WX 579 ; N d ; B 21 -9 558 736 ; C 101 ; WX 464 ; N e ; B 18 -10 431 491 ; C 102 ; WX 325 ; N f ; B -155 -214 447 733 ; C 103 ; WX 517 ; N g ; B -31 -218 528 492 ; C 104 ; WX 595 ; N h ; B 20 -7 561 736 ; C 105 ; WX 318 ; N i ; B 28 -7 294 725 ; C 106 ; WX 297 ; N j ; B -146 -215 285 724 ; C 107 ; WX 559 ; N k ; B 22 -8 544 736 ; C 108 ; WX 307 ; N l ; B 34 -9 280 736 ; C 109 ; WX 883 ; N m ; B 32 -7 852 494 ; C 110 ; WX 600 ; N n ; B 26 -7 569 494 ; C 111 ; WX 550 ; N o ; B 18 -11 501 493 ; C 112 ; WX 565 ; N p ; B -64 -218 519 494 ; C 113 ; WX 562 ; N q ; B 23 -218 516 496 ; C 114 ; WX 449 ; N r ; B 26 0 451 494 ; C 115 ; WX 403 ; N s ; B -12 -10 363 494 ; C 116 ; WX 366 ; N t ; B 39 -8 370 601 ; C 117 ; WX 599 ; N u ; B 28 -10 572 489 ; C 118 ; WX 492 ; N v ; B -8 -1 472 495 ; C 119 ; WX 768 ; N w ; B -2 0 741 495 ; C 120 ; WX 510 ; N x ; B -38 -7 512 495 ; C 121 ; WX 494 ; N y ; B -79 -216 514 494 ; C 122 ; WX 465 ; N z ; B -20 -14 461 503 ; C 123 ; WX 487 ; N braceleft ; B 47 -134 430 705 ; C 124 ; WX 500 ; N bar ; B 207 -237 294 764 ; C 125 ; WX 487 ; N braceright ; B 58 -134 441 705 ; C 126 ; WX 833 ; N asciitilde ; B 86 212 747 384 ; C 161 ; WX 340 ; N exclamdown ; B 42 -8 294 685 ; C 162 ; WX 586 ; N cent ; B 45 -104 535 610 ; C 163 ; WX 586 ; N sterling ; B -12 0 562 677 ; C 164 ; WX 167 ; N fraction ; B -190 0 353 672 ; C 165 ; WX 601 ; N yen ; B 9 0 652 668 ; C 166 ; WX 586 ; N florin ; B -63 -149 586 683 ; C 167 ; WX 500 ; N section ; B -11 -142 490 720 ; C 168 ; WX 606 ; N currency ; B 36 166 571 699 ; C 169 ; WX 175 ; N quotesingle ; B 40 418 135 715 ; C 170 ; WX 481 ; N quotedblleft ; B 77 395 504 699 ; C 171 ; WX 450 ; N guillemotleft ; B 10 54 429 425 ; C 172 ; WX 266 ; N guilsinglleft ; B 10 54 228 425 ; C 173 ; WX 266 ; N guilsinglright ; B -13 54 205 425 ; C 174 ; WX 621 ; N fi ; B -154 -214 600 735 ; C 175 ; WX 629 ; N fl ; B -154 -214 603 736 ; C 177 ; WX 500 ; N endash ; B -26 195 498 286 ; C 178 ; WX 500 ; N dagger ; B 44 -130 511 718 ; C 179 ; WX 500 ; N daggerdbl ; B -25 -132 511 718 ; C 180 ; WX 292 ; N periodcentered ; B 70 258 223 413 ; C 182 ; WX 492 ; N paragraph ; B 18 -79 467 672 ; C 183 ; WX 590 ; N bullet ; B 150 227 439 516 ; C 184 ; WX 261 ; N quotesinglbase ; B -54 -174 151 130 ; C 185 ; WX 481 ; N quotedblbase ; B -51 -174 375 130 ; C 186 ; WX 481 ; N quotedblright ; B 64 395 490 699 ; C 187 ; WX 450 ; N guillemotright ; B -13 54 406 425 ; C 188 ; WX 1000 ; N ellipsis ; B 41 -6 862 149 ; C 189 ; WX 1291 ; N perthousand ; B 54 -12 1243 683 ; C 191 ; WX 492 ; N questiondown ; B 6 -8 400 684 ; C 193 ; WX 500 ; N grave ; B 164 551 349 742 ; C 194 ; WX 500 ; N acute ; B 247 551 506 742 ; C 195 ; WX 500 ; N circumflex ; B 137 551 446 742 ; C 196 ; WX 500 ; N tilde ; B 132 570 486 723 ; C 197 ; WX 500 ; N macron ; B 137 607 482 675 ; C 198 ; WX 500 ; N breve ; B 167 567 477 719 ; C 199 ; WX 500 ; N dotaccent ; B 237 576 370 713 ; C 200 ; WX 500 ; N dieresis ; B 137 578 472 711 ; C 202 ; WX 500 ; N ring ; B 199 551 428 780 ; C 203 ; WX 500 ; N cedilla ; B 58 -230 279 0 ; C 205 ; WX 500 ; N hungarumlaut ; B 150 551 578 742 ; C 206 ; WX 500 ; N ogonek ; B 83 -225 243 0 ; C 207 ; WX 500 ; N caron ; B 174 551 483 742 ; C 208 ; WX 1000 ; N emdash ; B -22 195 1000 286 ; C 225 ; WX 894 ; N AE ; B -103 0 896 672 ; C 227 ; WX 429 ; N ordfeminine ; B 13 318 411 671 ; C 232 ; WX 529 ; N Lslash ; B -26 0 489 672 ; C 233 ; WX 729 ; N Oslash ; B 37 -82 691 751 ; C 234 ; WX 1003 ; N OE ; B 37 -13 999 684 ; C 235 ; WX 413 ; N ordmasculine ; B 13 317 376 671 ; C 241 ; WX 719 ; N ae ; B 4 -9 684 494 ; C 245 ; WX 318 ; N dotlessi ; B 28 -7 294 494 ; C 248 ; WX 307 ; N lslash ; B -17 -9 331 736 ; C 249 ; WX 550 ; N oslash ; B 19 -87 501 568 ; C 250 ; WX 795 ; N oe ; B 20 -10 759 494 ; C 251 ; WX 622 ; N germandbls ; B -161 -214 572 738 ; C -1 ; WX 634 ; N Aacute ; B -68 0 613 928 ; C -1 ; WX 634 ; N Acircumflex ; B -68 0 613 928 ; C -1 ; WX 634 ; N Adieresis ; B -68 0 613 897 ; C -1 ; WX 634 ; N Agrave ; B -68 0 613 928 ; C -1 ; WX 634 ; N Aring ; B -68 0 613 972 ; C -1 ; WX 634 ; N Atilde ; B -68 0 613 909 ; C -1 ; WX 625 ; N Ccedilla ; B 36 -230 637 684 ; C -1 ; WX 581 ; N Eacute ; B -22 0 580 928 ; C -1 ; WX 581 ; N Ecircumflex ; B -22 0 580 928 ; C -1 ; WX 581 ; N Edieresis ; B -22 0 580 897 ; C -1 ; WX 581 ; N Egrave ; B -22 0 580 928 ; C -1 ; WX 353 ; N Iacute ; B -21 0 448 928 ; C -1 ; WX 353 ; N Icircumflex ; B -21 0 388 928 ; C -1 ; WX 353 ; N Idieresis ; B -21 0 414 897 ; C -1 ; WX 353 ; N Igrave ; B -21 0 370 928 ; C -1 ; WX 712 ; N Ntilde ; B -27 0 744 909 ; C -1 ; WX 729 ; N Oacute ; B 37 -14 690 928 ; C -1 ; WX 729 ; N Ocircumflex ; B 37 -14 690 928 ; C -1 ; WX 729 ; N Odieresis ; B 37 -14 690 897 ; C -1 ; WX 729 ; N Ograve ; B 37 -14 690 928 ; C -1 ; WX 729 ; N Otilde ; B 37 -14 690 909 ; C -1 ; WX 553 ; N Scaron ; B 23 -8 525 928 ; C -1 ; WX 701 ; N Uacute ; B 71 -13 735 928 ; C -1 ; WX 701 ; N Ucircumflex ; B 71 -13 735 928 ; C -1 ; WX 701 ; N Udieresis ; B 71 -13 735 897 ; C -1 ; WX 701 ; N Ugrave ; B 71 -13 735 928 ; C -1 ; WX 586 ; N Ydieresis ; B 26 0 656 897 ; C -1 ; WX 572 ; N Zcaron ; B -18 0 581 928 ; C -1 ; WX 572 ; N aacute ; B 18 -9 548 742 ; C -1 ; WX 572 ; N acircumflex ; B 18 -9 548 742 ; C -1 ; WX 572 ; N adieresis ; B 18 -9 548 711 ; C -1 ; WX 572 ; N agrave ; B 18 -9 548 742 ; C -1 ; WX 572 ; N aring ; B 18 -9 548 774 ; C -1 ; WX 572 ; N atilde ; B 18 -9 548 723 ; C -1 ; WX 437 ; N ccedilla ; B 15 -230 410 493 ; C -1 ; WX 464 ; N eacute ; B 18 -10 488 742 ; C -1 ; WX 464 ; N ecircumflex ; B 18 -10 431 742 ; C -1 ; WX 464 ; N edieresis ; B 18 -10 454 711 ; C -1 ; WX 464 ; N egrave ; B 18 -10 431 742 ; C -1 ; WX 318 ; N iacute ; B 28 -7 398 742 ; C -1 ; WX 318 ; N icircumflex ; B 28 -7 338 742 ; C -1 ; WX 318 ; N idieresis ; B 28 -7 364 711 ; C -1 ; WX 318 ; N igrave ; B 28 -7 294 742 ; C -1 ; WX 600 ; N ntilde ; B 26 -7 569 723 ; C -1 ; WX 550 ; N oacute ; B 18 -11 531 742 ; C -1 ; WX 550 ; N ocircumflex ; B 18 -11 501 742 ; C -1 ; WX 550 ; N odieresis ; B 18 -11 501 711 ; C -1 ; WX 550 ; N ograve ; B 18 -11 501 742 ; C -1 ; WX 550 ; N otilde ; B 18 -11 511 723 ; C -1 ; WX 403 ; N scaron ; B -12 -10 435 742 ; C -1 ; WX 599 ; N uacute ; B 28 -10 572 742 ; C -1 ; WX 599 ; N ucircumflex ; B 28 -10 572 742 ; C -1 ; WX 599 ; N udieresis ; B 28 -10 572 711 ; C -1 ; WX 599 ; N ugrave ; B 28 -10 572 742 ; C -1 ; WX 494 ; N ydieresis ; B -79 -216 514 711 ; C -1 ; WX 465 ; N zcaron ; B -20 -14 466 742 ; C -1 ; WX 817 ; N trademark ; B 113 398 724 663 ; C -1 ; WX 894 ; N copyright ; B 62 -50 842 730 ; C -1 ; WX 833 ; N logicalnot ; B 124 175 710 421 ; C -1 ; WX 894 ; N registered ; B 62 -50 842 730 ; C -1 ; WX 833 ; N minus ; B 124 256 710 340 ; C -1 ; WX 702 ; N Eth ; B -25 0 661 672 ; C -1 ; WX 576 ; N Thorn ; B -26 0 553 666 ; C -1 ; WX 586 ; N Yacute ; B 26 0 656 928 ; C -1 ; WX 500 ; N brokenbar ; B 207 -172 294 699 ; C -1 ; WX 329 ; N degree ; B 20 424 309 713 ; C -1 ; WX 833 ; N divide ; B 124 45 710 551 ; C -1 ; WX 561 ; N eth ; B 25 -12 524 740 ; C -1 ; WX 578 ; N mu ; B -53 -206 546 433 ; C -1 ; WX 833 ; N multiply ; B 139 16 704 581 ; C -1 ; WX 905 ; N onehalf ; B 49 0 871 677 ; C -1 ; WX 905 ; N onequarter ; B 49 -19 884 677 ; C -1 ; WX 387 ; N onesuperior ; B 52 268 289 677 ; C -1 ; WX 833 ; N plusminus ; B 124 7 710 590 ; C -1 ; WX 565 ; N thorn ; B -64 -218 519 736 ; C -1 ; WX 905 ; N threequarters ; B 6 -19 884 678 ; C -1 ; WX 387 ; N threesuperior ; B 7 261 357 679 ; C -1 ; WX 387 ; N twosuperior ; B -3 268 351 679 ; C -1 ; WX 494 ; N yacute ; B -79 -216 514 742 ; EndCharMetrics StartKernData StartKernPairs 378 KPX hyphen T -37 KPX hyphen V -56 KPX hyphen W -56 KPX hyphen X -37 KPX hyphen Y -74 KPX A quoteright -130 KPX A colon 19 KPX A semicolon 19 KPX A S 19 KPX A T -37 KPX A U -23 KPX A V -56 KPX A W -42 KPX A Y -42 KPX A y -19 KPX A quotedblright -130 KPX B hyphen 56 KPX B S 19 KPX B V -19 KPX B W -19 KPX B Y -19 KPX C quoteright 37 KPX C hyphen 23 KPX C S 19 KPX C quotedblright 37 KPX D hyphen 37 KPX D A -19 KPX D V -19 KPX D W -19 KPX D Y -28 KPX D Aring -19 KPX F comma -167 KPX F hyphen -56 KPX F period -167 KPX F colon -37 KPX F semicolon -37 KPX F A -32 KPX F a -60 KPX F e -65 KPX F i -19 KPX F o -46 KPX F r -19 KPX F u -19 KPX F quotesinglbase -37 KPX F quotedblbase -37 KPX F ae -60 KPX F oslash -46 KPX F oe -46 KPX F Aring -32 KPX G hyphen 19 KPX J A -23 KPX J Aring -23 KPX K hyphen -37 KPX K A -23 KPX K C -28 KPX K O -28 KPX K U -37 KPX K W -42 KPX K Y -32 KPX K a -19 KPX K e -19 KPX K o -37 KPX K u -19 KPX K y -83 KPX K quotesinglbase 56 KPX K quotedblbase 56 KPX K Oslash -28 KPX K OE -28 KPX K ae -19 KPX K oslash -37 KPX K oe -37 KPX K Aring -23 KPX L quoteright -185 KPX L hyphen 56 KPX L A 19 KPX L O -19 KPX L T -74 KPX L U -37 KPX L V -102 KPX L W -88 KPX L Y -88 KPX L quoteleft -56 KPX L u -19 KPX L y -74 KPX L quotedblleft -56 KPX L quotesinglbase 19 KPX L quotedblbase 19 KPX L quotedblright -185 KPX L Oslash -19 KPX L OE -19 KPX L Aring 19 KPX O comma -37 KPX O hyphen 19 KPX O period -37 KPX O V -19 KPX O X -19 KPX O Y -19 KPX P comma -250 KPX P hyphen -56 KPX P period -250 KPX P colon -19 KPX P semicolon -19 KPX P A -74 KPX P U -19 KPX P W -19 KPX P Y -19 KPX P a -37 KPX P e -37 KPX P i 19 KPX P n 19 KPX P o -32 KPX P r 19 KPX P u 19 KPX P y 19 KPX P quotesinglbase -93 KPX P quotedblbase -93 KPX P ae -37 KPX P oslash -32 KPX P oe -32 KPX P Aring -74 KPX Q quoteright 19 KPX Q hyphen 19 KPX Q quotesinglbase 56 KPX Q quotedblbase 56 KPX Q quotedblright 19 KPX R quoteright -37 KPX R comma 19 KPX R hyphen -19 KPX R period 19 KPX R C -19 KPX R T -19 KPX R V -19 KPX R W -23 KPX R Y -37 KPX R quoteleft -19 KPX R e -19 KPX R o -19 KPX R quotedblleft -19 KPX R quotesinglbase 56 KPX R quotedblbase 56 KPX R quotedblright -37 KPX R oslash -19 KPX R oe -19 KPX S A 19 KPX S G 19 KPX S O 19 KPX S Q 19 KPX S S -19 KPX S Oslash 19 KPX S OE 19 KPX S Aring 19 KPX T comma -148 KPX T hyphen -130 KPX T period -148 KPX T colon -37 KPX T semicolon -37 KPX T A -56 KPX T T 19 KPX T a -116 KPX T c -97 KPX T e -97 KPX T i -19 KPX T o -97 KPX T r -56 KPX T s -93 KPX T u -93 KPX T w -93 KPX T y -74 KPX T guillemotleft -37 KPX T guilsinglleft -37 KPX T quotesinglbase -19 KPX T quotedblbase -19 KPX T ae -116 KPX T oslash -97 KPX T oe -97 KPX T Aring -56 KPX U A -28 KPX U J -19 KPX U Z -19 KPX U Aring -28 KPX V comma -185 KPX V hyphen -56 KPX V period -185 KPX V colon -93 KPX V semicolon -93 KPX V A -97 KPX V O -19 KPX V a -93 KPX V e -93 KPX V i -28 KPX V o -60 KPX V u -32 KPX V y -28 KPX V quotesinglbase -37 KPX V quotedblbase -37 KPX V Oslash -19 KPX V OE -19 KPX V ae -93 KPX V oslash -60 KPX V oe -60 KPX V Aring -97 KPX W comma -134 KPX W hyphen -37 KPX W period -134 KPX W colon -28 KPX W semicolon -28 KPX W A -28 KPX W a -69 KPX W e -93 KPX W i -19 KPX W o -69 KPX W r -28 KPX W u -28 KPX W y -23 KPX W quotesinglbase -37 KPX W quotedblbase -37 KPX W ae -69 KPX W oslash -69 KPX W oe -69 KPX W Aring -28 KPX X hyphen -19 KPX X A -19 KPX X e -37 KPX X guilsinglright 19 KPX X quotesinglbase 37 KPX X quotedblbase 37 KPX X guillemotright 19 KPX X Aring -19 KPX Y quoteright 19 KPX Y comma -130 KPX Y hyphen -111 KPX Y period -130 KPX Y colon -106 KPX Y semicolon -106 KPX Y A -46 KPX Y a -116 KPX Y e -116 KPX Y i -19 KPX Y o -97 KPX Y u -56 KPX Y guillemotleft -37 KPX Y guilsinglleft -37 KPX Y quotesinglbase -19 KPX Y quotedblbase -19 KPX Y quotedblright 19 KPX Y ae -116 KPX Y oslash -97 KPX Y oe -97 KPX Y Aring -46 KPX Z hyphen 37 KPX quoteleft A -130 KPX quoteleft J -130 KPX quoteleft T 19 KPX quoteleft V 56 KPX quoteleft W 37 KPX quoteleft X 37 KPX quoteleft Y 56 KPX quoteleft AE -148 KPX quoteleft Aring -130 KPX f quoteright 93 KPX f comma -83 KPX f hyphen -19 KPX f period -83 KPX f quoteleft 37 KPX f quotedblleft 37 KPX f quotedblright 93 KPX r comma -130 KPX r hyphen -19 KPX r period -130 KPX r g -19 KPX r h -19 KPX v comma -46 KPX v hyphen 37 KPX v period -46 KPX w comma -56 KPX w hyphen 19 KPX w period -56 KPX y comma -60 KPX y hyphen 19 KPX y period -60 KPX quotedblleft A -130 KPX quotedblleft J -130 KPX quotedblleft T 19 KPX quotedblleft V 56 KPX quotedblleft W 37 KPX quotedblleft X 37 KPX quotedblleft Y 56 KPX quotedblleft AE -148 KPX quotedblleft Aring -130 KPX quotesinglbase A 37 KPX quotesinglbase C -37 KPX quotesinglbase D 19 KPX quotesinglbase F 19 KPX quotesinglbase G -19 KPX quotesinglbase H 19 KPX quotesinglbase J 19 KPX quotesinglbase T -37 KPX quotesinglbase V -56 KPX quotesinglbase W -37 KPX quotesinglbase X 37 KPX quotesinglbase Y -37 KPX quotesinglbase f 37 KPX quotesinglbase v -37 KPX quotesinglbase w -37 KPX quotesinglbase fi 37 KPX quotesinglbase fl 37 KPX quotesinglbase AE 74 KPX quotesinglbase germandbls 37 KPX quotesinglbase Aring 37 KPX quotesinglbase Eth 19 KPX quotedblbase A 37 KPX quotedblbase C -37 KPX quotedblbase D 19 KPX quotedblbase F 19 KPX quotedblbase G -19 KPX quotedblbase H 19 KPX quotedblbase J 19 KPX quotedblbase T -37 KPX quotedblbase V -56 KPX quotedblbase W -37 KPX quotedblbase X 37 KPX quotedblbase Y -37 KPX quotedblbase f 37 KPX quotedblbase v -37 KPX quotedblbase w -37 KPX quotedblbase fi 37 KPX quotedblbase fl 37 KPX quotedblbase AE 74 KPX quotedblbase germandbls 37 KPX quotedblbase Aring 37 KPX quotedblbase Eth 19 KPX AE hyphen 19 KPX Lslash quoteright -185 KPX Lslash hyphen 56 KPX Lslash A 19 KPX Lslash O -19 KPX Lslash T -74 KPX Lslash U -37 KPX Lslash V -102 KPX Lslash W -88 KPX Lslash Y -88 KPX Lslash quoteleft -56 KPX Lslash u -19 KPX Lslash y -74 KPX Lslash quotedblleft -56 KPX Lslash quotesinglbase 19 KPX Lslash quotedblbase 19 KPX Lslash quotedblright -185 KPX Lslash Oslash -19 KPX Lslash OE -19 KPX Lslash Aring 19 KPX Oslash comma -37 KPX Oslash hyphen 19 KPX Oslash period -37 KPX Oslash V -19 KPX Oslash X -19 KPX Oslash Y -19 KPX Aring quoteright -130 KPX Aring colon 19 KPX Aring semicolon 19 KPX Aring S 19 KPX Aring T -37 KPX Aring U -23 KPX Aring V -56 KPX Aring W -42 KPX Aring Y -42 KPX Aring y -19 KPX Aring quotedblright -130 KPX Eth hyphen 37 KPX Eth A -19 KPX Eth V -19 KPX Eth W -19 KPX Eth Y -28 KPX Eth Aring -19 KPX Thorn quoteright -37 KPX Thorn comma -148 KPX Thorn period -148 KPX Thorn quotedblright -37 EndKernPairs StartTrackKern 3 TrackKern -1 6 0.10 144 -2.09 TrackKern -2 6 0.05 144 -4.02 TrackKern -3 6 0.00 144 -5.96 EndTrackKern EndKernData EndFontMetrics xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Fonts/afm/eufm10.afm0000664000175000017500000001132611742726711023134 0ustar uwabamiuwabamiStartFontMetrics 2.0 FontName eufm10 FullName eufm10 FamilyName eufm10 Weight Medium ItalicAngle 0.000000 IsFixedPitch false UnderlinePosition -133 UnderlineThickness 20 Version 1.2/19-Jan-95 FontBBox -26, -224, 1054, 740 Notice Copyright \(C\) 1994, 1995, Basil K. Malyshev. All Rights Reserved.\nBaKoMa Fonts Collection, Level-C. EncodingScheme FontSpecific CapHeight 666 XHeight 472 Descender -212 Ascender 610 StartCharMetrics 94 C 0 ; WX 497.5 ; N dadv ; B 75 -33 430 683 ; C 1 ; WX 498.28 ; N dalt ; B 35 -30 432 616 ; C 2 ; WX 333.28 ; N fnos ; B 29 -216 339 680 ; C 3 ; WX 329.22 ; N falt ; B 28 -224 318 679 ; C 4 ; WX 503.44 ; N galt ; B 51 -214 449 471 ; C 5 ; WX 333 ; N kalt ; B 25 -20 315 687 ; C 6 ; WX 334.11 ; N talt ; B 29 -21 347 578 ; C 7 ; WX 500.72 ; N ualt ; B 10 -22 515 475 ; C 18 ; WX 214.72 ; N quoteleft ; B 45 410 159 708 ; C 19 ; WX 214.72 ; N quoteright ; B 49 394 163 692 ; C 33 ; WX 295.72 ; N exclam ; B 90 -12 203 690 ; C 38 ; WX 737.83 ; N ampersand ; B 49 -12 734 698 ; C 39 ; WX 212 ; N quotesingle ; B 68 436 134 695 ; C 40 ; WX 388.67 ; N parenleft ; B 113 -186 293 737 ; C 41 ; WX 388.67 ; N parenright ; B 89 -187 276 735 ; C 42 ; WX 277.67 ; N asterisk ; B 33 449 234 692 ; C 43 ; WX 756.22 ; N plus ; B 47 -83 709 598 ; C 44 ; WX 277.67 ; N comma ; B 100 -192 215 107 ; C 45 ; WX 756.22 ; N minus ; B 46 236 706 275 ; C 46 ; WX 277.67 ; N period ; B 88 -15 201 102 ; C 47 ; WX 501.83 ; N slash ; B 34 -182 466 722 ; C 48 ; WX 501.83 ; N zero ; B 41 -13 456 493 ; C 49 ; WX 501.83 ; N one ; B 47 -2 460 468 ; C 50 ; WX 501.83 ; N two ; B 59 1 485 474 ; C 51 ; WX 501.83 ; N three ; B 38 -182 430 474 ; C 52 ; WX 501.83 ; N four ; B 10 -191 482 476 ; C 53 ; WX 501.83 ; N five ; B 47 -184 440 458 ; C 54 ; WX 501.83 ; N six ; B 45 -13 471 700 ; C 55 ; WX 501.83 ; N seven ; B 37 -181 498 468 ; C 56 ; WX 501.83 ; N eight ; B 40 -10 461 705 ; C 57 ; WX 501.83 ; N nine ; B 27 -182 467 469 ; C 58 ; WX 216.06 ; N colon ; B 49 -12 168 457 ; C 59 ; WX 216.06 ; N semicolon ; B 47 -190 179 458 ; C 61 ; WX 756.22 ; N equal ; B 54 132 725 368 ; C 63 ; WX 362.44 ; N question ; B 46 -11 358 693 ; C 65 ; WX 717.61 ; N A ; B 22 -27 708 697 ; C 66 ; WX 884 ; N B ; B 48 -27 820 691 ; C 67 ; WX 612.56 ; N C ; B 59 -24 607 685 ; C 68 ; WX 831.56 ; N D ; B 27 -27 745 686 ; C 69 ; WX 662.78 ; N E ; B 86 -24 634 685 ; C 70 ; WX 611.17 ; N F ; B 11 -154 612 686 ; C 71 ; WX 785.39 ; N G ; B 65 -27 710 691 ; C 72 ; WX 720.28 ; N H ; B 1 -133 644 666 ; C 73 ; WX 554.5 ; N I ; B 30 -27 533 686 ; C 74 ; WX 552.33 ; N J ; B -10 -139 522 686 ; C 75 ; WX 668.44 ; N K ; B 16 -27 682 681 ; C 76 ; WX 666 ; N L ; B 32 -26 644 686 ; C 77 ; WX 1049.56 ; N M ; B 27 -27 1048 692 ; C 78 ; WX 832.11 ; N N ; B 27 -25 825 686 ; C 79 ; WX 827 ; N O ; B 11 -27 745 729 ; C 80 ; WX 827.5 ; N P ; B 27 -219 804 692 ; C 81 ; WX 827 ; N Q ; B 11 -69 782 729 ; C 82 ; WX 828.06 ; N R ; B 27 -27 824 686 ; C 83 ; WX 828.61 ; N S ; B 66 -27 756 692 ; C 84 ; WX 669 ; N T ; B 33 -27 676 702 ; C 85 ; WX 645.78 ; N U ; B -26 -27 665 697 ; C 86 ; WX 831.33 ; N V ; B 27 -27 825 686 ; C 87 ; WX 1046 ; N W ; B 32 -28 1054 686 ; C 88 ; WX 719.22 ; N X ; B 27 -27 709 688 ; C 89 ; WX 832.94 ; N Y ; B 27 -218 740 686 ; C 90 ; WX 602 ; N Z ; B 11 -139 532 729 ; C 91 ; WX 277.67 ; N bracketleft ; B 117 -130 278 740 ; C 93 ; WX 277.67 ; N bracketright ; B -3 -132 161 738 ; C 94 ; WX 499.67 ; N asciicircum ; B 0 452 495 734 ; C 97 ; WX 500.44 ; N a ; B 65 -36 497 471 ; C 98 ; WX 513.17 ; N b ; B 87 -31 442 685 ; C 99 ; WX 389.44 ; N c ; B 72 -29 359 466 ; C 100 ; WX 498.56 ; N d ; B 13 -33 428 610 ; C 101 ; WX 400.56 ; N e ; B 70 -31 364 467 ; C 102 ; WX 326.28 ; N f ; B 30 -220 324 681 ; C 103 ; WX 503.72 ; N g ; B 16 -209 455 470 ; C 104 ; WX 521.28 ; N h ; B 76 -206 434 689 ; C 105 ; WX 279 ; N i ; B 14 -21 268 674 ; C 106 ; WX 280.89 ; N j ; B -9 -208 196 673 ; C 107 ; WX 389.44 ; N k ; B 24 -26 362 689 ; C 108 ; WX 279.56 ; N l ; B 98 -20 277 685 ; C 109 ; WX 766.78 ; N m ; B 7 -26 752 475 ; C 110 ; WX 526.67 ; N n ; B 17 -23 513 475 ; C 111 ; WX 488.83 ; N o ; B 67 -28 412 481 ; C 112 ; WX 500.44 ; N p ; B 12 -212 430 542 ; C 113 ; WX 489.11 ; N q ; B 59 -219 418 479 ; C 114 ; WX 389.17 ; N r ; B 15 -21 387 474 ; C 115 ; WX 442.67 ; N s ; B -18 -30 407 478 ; C 116 ; WX 333 ; N t ; B 26 -21 349 640 ; C 117 ; WX 517.22 ; N u ; B 8 -23 513 474 ; C 118 ; WX 511.78 ; N v ; B 55 -28 434 530 ; C 119 ; WX 773.5 ; N w ; B 45 -28 688 532 ; C 120 ; WX 388.67 ; N x ; B 10 -188 363 472 ; C 121 ; WX 498.83 ; N y ; B 45 -219 431 528 ; C 122 ; WX 390.56 ; N z ; B -7 -214 314 471 ; C 125 ; WX 214.72 ; N quotedbl ; B 8 432 196 695 ; C 127 ; WX 378.11 ; N onealt ; B 54 -10 254 703 ; C -1 ; WX 333.33 ; N hardspace ; B 333 0 334 0 ; C -1 ; WX 333.33 ; N space ; B 333 0 334 0 ; EndCharMetrics EndFontMetrics xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/type1afm/0000775000175000017500000000000011742726711021241 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/type1afm/.dependencies0000664000175000017500000000005511742726711023670 0ustar uwabamiuwabamitype1afm.lo: type1afm.c ../lib/t1lib/t1lib.h xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/type1afm/type1afm.c0000664000175000017500000000776011742726711023145 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: type1afm.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2002-11-27 ----- Description: This file is part of t1lib. The program type1afm extracts metrics information from Type 1 font files and dumps it to afm files. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2002. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #include #include /* Note: We include t1lib.h from lib/t1lib. That way the objectfile does only need to be rebuild when the header itself changes and not each time the library has been recompiled */ #include "../lib/t1lib/t1lib.h" void printusage( void); int main(int argc, char *argv[]) { int i, j, result; int rasterflags=0; if (argc==1){ printusage(); return(0); } /* If we want to log anything, then log all */ T1_SetLogLevel(T1LOG_DEBUG); /* Check whether logfile is requested */ if (strcmp( argv[1], "-l")==0){ if (argc==2){ printusage(); return(0); } j=2; if ((T1_InitLib( LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE)==NULL)){ fprintf(stderr, "Initialization of t1lib failed\n"); return(1); } } else{ j=1; if ((T1_InitLib( NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE)==NULL)){ fprintf(stderr, "Initialization of t1lib failed\n"); return(1); } } /* First, build font data base */ for (i=j; i [ ...]\n"); fprintf(stdout, "\n"); fprintf(stdout, "Generate afm-file from Adobe Type 1 font file (T1lib-%s)!\n", T1_GetLibIdent()); fprintf(stdout, "Options: -l Write a log-file t1lib.log\n"); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/type1afm/Makefile.in0000664000175000017500000000424711742726711023315 0ustar uwabamiuwabami# Makefile.in # # This file is part of the t1lib-package! See documentation and Readme files # of the t1lib-package for copyright restrictions. # # Targets provided: # all (default) # install # uninstall # clean # # Author: Rainer Menzner (Rainer.Menzner@web.de) # Date: 02/19/1997 # Last modified: 2006-11-05 # # Modified by H.Kakugawa to use libtool LIBTOOL = ../libtool SHELL = /bin/sh CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ OPTIONS = @OPTIONS@ X_LIBS = @X_LIBS@ TOPSRC = @top_srcdir@ XPM_LIB = -lXpm XLIB = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@ LDFLAGS = @LDFLAGS@ LDLIBS = @LDLIBS@ AR = ar rc RANLIB = @RANLIB@ RM = rm -f X_CFLAGS = @X_CFLAGS@ YACC = @YACC@ LEX = @LEX@ LEXLIB = @LEXLIB@ ALLCFLAGS = $(CFLAGS) SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(ALLCFLAGS)' 'OPTIONS=$(OPTIONS)' @SET_MAKE@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @top_srcdir@/ac-tools/mkinstalldirs prefix = @prefix@ exec_prefix = @exec_prefix@ includedir = @includedir@ bindir = @bindir@ datadir = @datadir@ libdir = @libdir@ mandir = @mandir@/man1 manext = .1 no_x = @no_x@ # targets to build MAIN_TARGET = @MAIN_TARGET@ OBJS = \ type1afm.lo SRCS = \ type1afm.c T1LIB = ../lib/libt1.la all: type1afm type1afm: $(OBJS) ../lib/t1lib.h $(LIBTOOL) --mode=link \ $(CC) -o type1afm $(LDFLAGS) $(OBJS) $(T1LIB) $(LDLIBS) .SUFFIXES: .lo .c.lo: $(LIBTOOL) --mode=compile \ $(CC) -c $(CPPFLAGS) $(CFLAGS) $< .PHONY: clean dependencies: dummy gcc -MM *.c | sed 's/\.o:/.lo:/g' > .dependencies clean: dummy $(RM) type1afm *.o *.lo .libs/* *~ \#*\# *.log *.bak -rmdir .libs install: dummy $(MKINSTALLDIRS) $(DESTDIR)$(bindir) $(LIBTOOL) --mode=install \ $(INSTALL_PROGRAM) type1afm $(DESTDIR)$(bindir)/type1afm uninstall: dummy $(LIBTOOL) --mode=uninstall \ $(RM) $(DESTDIR)$(bindir)/type1afm dummy: # Dependencies of object files include .dependencies xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Makefile.in0000664000175000017500000000707011742726711021564 0ustar uwabamiuwabami# Makefile.in # # This file is part of the t1lib-package! See documentation and Readme files # of the t1lib-package for copyright restrictions. # # Targets provided: # all (default) # install # uninstall # without_doc # clean # distclean # t1python-all # t1python-clean # # Author: Rainer Menzner (Rainer.Menzner@web.de) # Date: 04/06/1997 # Last modified: 2005-05-01 # SHELL = /bin/sh CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ OPTIONS = @OPTIONS@ X_LIBS = @X_LIBS@ TOPSRC = @top_srcdir@ XPM_LIB = -lXpm XLIB = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@ LDFLAGS = @LDFLAGS@ LDLIBS = @LDLIBS@ AR = ar rc RANLIB = @RANLIB@ RM = rm -f X_CFLAGS = @X_CFLAGS@ YACC = @YACC@ LEX = @LEX@ LEXLIB = @LEXLIB@ ALLCFLAGS = $(CFLAGS) $(X_CFLAGS) SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(ALLCFLAGS)' 'OPTIONS=$(OPTIONS)' @SET_MAKE@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @top_srcdir@/ac-tools/mkinstalldirs prefix = @prefix@ exec_prefix = @exec_prefix@ includedir = @includedir@ bindir = @bindir@ datadir = @datadir@ libdir = @libdir@ mandir = @mandir@/man1 manext = .1 no_x = @no_x@ t1lib_version = @T1LIB_VERSION@ t1lib_revision = @T1LIB_REVISION@ t1lib_patchlevel = @T1LIB_PATCHLEVEL@ # Main target to build MAIN_TARGET = @MAIN_TARGET@ COMMONSUBDIRS = lib \ type1afm \ examples DOCSUBDIRS = doc # Drop xglyph from targets if we do not have X11 XSUBDIRS = @XSUBDIRS@ ALLSUBDIRS = $(COMMONSUBDIRS) $(XSUBDIRS) DUMMYSUBDIRS = XXXX all: $(DUMMYSUBDIRS) $(DOCSUBDIRS) without_doc: $(DUMMYSUBDIRS) # warning the following target does only work with gcc and is no # official target. It generates .dependencies files and changes # the suffixes from .o to .lo. dependencies: dummy for i in $(ALLSUBDIRS); do \ (cd $$i; make dependencies ) || exit 1; \ done $(DOCSUBDIRS): dummy for i in $(DOCSUBDIRS); do \ (cd $$i; $(SUBMAKE) ) || exit 1; \ done $(DUMMYSUBDIRS): dummy for i in $(ALLSUBDIRS); do \ (cd $$i; $(SUBMAKE) ) || exit 1; \ done install: dummy for i in $(ALLSUBDIRS) $(DOCSUBDIRS); do \ (cd $$i; $(MAKE) install) || exit 1; \ done uninstall: dummy for i in $(ALLSUBDIRS) $(DOCSUBDIRS); do \ (cd $$i; $(MAKE) uninstall) || exit 1; \ done $(RM) -Rf $(datadir)/t1lib-$(t1lib_version).$(t1lib_revision) .PHONY: uninstall .PHONY: install .PHONY: clean clean: dummy for i in $(ALLSUBDIRS); do \ (cd $$i; $(MAKE) clean) || exit 1; \ done for i in $(DOCSUBDIRS); do \ (cd $$i; $(MAKE) clean) || exit 1; \ done # In order not to delete the t1python Makefile, we have to remove the # Makefile's one at a time: distclean: clean $(RM) *~ $(RM) config.cache config.log config.status $(RM) Makefile $(RM) lib/Makefile $(RM) lib/type1/Makefile $(RM) lib/t1lib/Makefile $(RM) lib/t1lib/sysconf.h $(RM) type1afm/Makefile $(RM) examples/Makefile $(RM) xglyph/Makefile $(RM) doc/Makefile $(RM) libtool # The following two targets are for building and cleaning the python- # interface contributed by Fred L. Drake, Jr. They are completely # independent from the other t1lib-targets. t1python-all: (cd t1python; $(MAKE); $(MAKE)) t1python-clean: (cd t1python; $(MAKE) clean) dummy: xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/0000775000175000017500000000000011742726711020261 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/0000775000175000017500000000000011742726711021323 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/fontfcn.c0000664000175000017500000012620711742726711023134 0ustar uwabamiuwabami/* $XConsortium: fontfcn.c,v 1.8 92/03/27 18:15:45 eswu Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ #include #include #include #include "t1imager.h" #include "util.h" #include "fontfcn.h" #include "fontmisc.h" #include "paths_rmz.h" #include "../t1lib/parseAFM.h" #include "../t1lib/t1types.h" #include "../t1lib/t1extern.h" #include "../t1lib/t1misc.h" #include "../t1lib/t1base.h" #include "../t1lib/t1finfo.h" /* Note: The argument decodeonly is used to make Type1Char() decode only such that later certain characterictics of the pass can be queried (here, information about the parts of a seac). */ extern xobject Type1Char(psfont *env, struct XYspace *S, psobj *charstrP, psobj *subrsP, psobj *osubrsP, struct blues_struct *bluesP, int *modeP, char *name, float strokewidth, int decodeonly); extern xobject Type1Line(psfont *env, struct XYspace *S, float line_position, float line_thickness, float line_length, float strokewidth); extern int T1int_Type1QuerySEAC( unsigned char* base, unsigned char* accent); void objFormatName(psobj *objP, int length, char *valueP); extern void T1io_reset( void); #define BEZIERTYPE 0x10+0x02 #define LINETYPE 0x10+0x00 #define MOVETYPE 0x10+0x05 #if 1 struct region { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = REGIONTYPE */ struct fractpoint origin; /* beginning handle: X,Y origin of region */ struct fractpoint ending; /* ending handle: X,Y change after painting region */ pel xmin,ymin; /* minimum X,Y of region */ pel xmax,ymax; /* mat1_mum X,Y of region */ struct edgelist *anchor; /* list of edges that bound the region */ struct picture *thresholded; /* region defined by thresholded picture*/ /* Note that the ending handle and the bounding box values are stored relative to 'origin'. The above elements describe a region. The following elements are scratchpad areas used while the region is being built: */ fractpel lastdy; /* direction of last segment */ fractpel firstx,firsty; /* starting point of current edge */ fractpel edgexmin,edgexmax; /* x extent of current edge */ struct edgelist *lastedge,*firstedge; /* last and first edges in subpath */ pel *edge; /* pointer to array of X values for edge */ fractpel edgeYstop; /* Y value where 'edges' array ends */ int (*newedgefcn)(); /* function to use when building a new edge */ struct strokeinfo *strokeinfo; /* scratchpad info during stroking only */ } ; struct edgelist { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = EDGETYPE */ struct edgelist *link; /* pointer to next in linked list */ struct edgelist *subpath; /* informational link for "same subpath" */ pel xmin,xmax; /* range of edge in X */ pel ymin,ymax; /* range of edge in Y */ pel *xvalues; /* pointer to ymax-ymin X values */ }; #endif /***================================================================***/ /* GLOBALS */ /***================================================================***/ static char CurCharName[257]=""; static char BaseCharName[257]=""; char CurFontName[MAXPATHLEN+1]; char *CurFontEnv; char *vm_base = NULL; static char notdef[]=".notdef"; /* the following is inserted by RMz for VM checking and reallocating: */ char *vm_used = NULL; extern int vm_init_count; extern int vm_init_amount; static psfont *FontP = NULL; psfont TheCurrentFont; /***================================================================***/ /* SearchDict - look for name */ /* - compare for match on len and string */ /* return 0 - not found. */ /* return n - nth element in dictionary. */ /***================================================================***/ int SearchDictName(dictP,keyP) psdict *dictP; psobj *keyP; { int i,n; n = dictP[0].key.len; for (i=1;i<=n;i++) { /* scan the intire dictionary */ if ( (dictP[i].key.len == keyP->len ) && (strncmp(dictP[i].key.data.valueP, keyP->data.valueP, keyP->len) == 0 ) ) return(i); } return(0); } /***================================================================***/ /* assignment of &TheCurrentFont removed by RMz: */ boolean initFont() { if (!(vm_init())) return(FALSE); vm_base = vm_next_byte(); strcpy(CurFontName, ""); /* iniitialize to none */ FontP->vm_start = vm_next_byte(); FontP->FontFileName.len = 0; FontP->FontFileName.data.valueP = CurFontName; return(TRUE); } /***================================================================***/ int resetFont(env) char *env; { vm_next = FontP->vm_start; vm_free = vm_size - ( vm_next - vm_base); FontP->Subrs.len = 0; FontP->Subrs.data.stringP = NULL; FontP->CharStringsP = NULL; FontP->Private = NULL; FontP->fontInfoP = NULL; FontP->BluesP = NULL; /* This will load the font into the FontP */ strncpy(CurFontName,env, MAXPATHLEN); CurFontName[MAXPATHLEN] = '\0'; FontP->FontFileName.len = strlen(CurFontName); FontP->FontFileName.data.nameP = CurFontName; T1io_reset(); return(0); } /***================================================================***/ /* Read font used to attempt to load the font and, upon failure, try a second time with twice as much memory. Unfortunately, if it's a really complex font, simply using 2*vm_size may be insufficient. I've modified it so that the program will try progressively larger amounts of memory until it really runs out or the font loads successfully. (ndw) */ int readFont(env) char *env; { int rcode; /* int memscale = 2; */ /* initially, try twice just like we used to ... */ /* restore the virtual memory and eliminate old font */ resetFont(env); /* This will load the font into the FontP */ rcode = scan_font(FontP); return(rcode); } static int isCompositeChar( int FontID, char *charname) { int i; FontInfo *pAFMData; if (pFontBase->pFontArray[FontID].pAFMData==NULL) { /* No AFM data present */ return( -1); } pAFMData=pFontBase->pFontArray[FontID].pAFMData; for ( i=0; inumOfComps; i++) { if (strcmp( pAFMData->ccd[i].ccName, charname)==0) return( i); } return( -1); } /* dump a description of path elements to stdout */ static T1_PATHPOINT getDisplacement( struct segment *path) { register struct segment *ipath; register struct beziersegment *ibpath; T1_PATHPOINT point={0,0}; /* Step through the path list */ ipath=(struct segment *)path; do { if (ipath->type==LINETYPE) { point.x+=ipath->dest.x; point.y+=ipath->dest.y; } else if (ipath->type==MOVETYPE) { point.x+=ipath->dest.x; point.y+=ipath->dest.y; } else if (ipath->type==BEZIERTYPE) { ibpath=(struct beziersegment *)ipath; point.x+=ibpath->dest.x; point.y+=ibpath->dest.y; } ipath=ipath->link; } while (ipath!=NULL); return( point); } /***================================================================***/ /* RMz: instead of code, which is a character pointer to the name of the character, we use "ev" which is a pointer to a desired encoding vector (or NULL if font-internal encoding should be used) and "index" as an index into the desired encoding vector! The user thus has the opportunity of supplying whatever encoding he wants. Font_Ptr is the pointer to the local psfont-structure. */ xobject fontfcnB(int FontID, int modflag, struct XYspace *S, char **ev, unsigned char index, int *mode, psfont *Font_Ptr, int do_raster, float strokewidth) { psobj *charnameP; /* points to psobj that is name of character*/ FontInfo *pAFMData=NULL; int i=-1; int j=0; int numPieces=1; int N; T1_PATHPOINT currdisp; int basechar; psdict *CharStringsDictP; /* dictionary with char strings */ psobj CodeName; /* used to store the translation of the name*/ psobj *SubrsArrayP; psobj *theStringP; int localmode=0; struct segment *charpath=NULL; /* the path for this character */ struct segment *tmppath1=NULL; struct segment *tmppath2=NULL; struct segment *tmppath3=NULL; struct segment *tmppath4=NULL; /* set the global font pointer to the address of already allocated structure and setup pointers*/ FontP=Font_Ptr; CharStringsDictP = FontP->CharStringsP; SubrsArrayP = &(FontP->Subrs); charnameP = &CodeName; if (ev==NULL){ /* font-internal encoding should be used */ charnameP->len = FontP->fontInfoP[ENCODING].value.data.arrayP[index].len; charnameP->data.stringP = (unsigned char *) FontP->fontInfoP[ENCODING].value.data.arrayP[index].data.arrayP; } else{ /* some user-supplied encoding is to be used */ charnameP->len = strlen(ev[index]); charnameP->data.stringP = (unsigned char *) ev[index]; } strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* search the chars string for this charname as key */ basechar = SearchDictName(CharStringsDictP,charnameP); if (basechar<=0) { /* Check first, whether a char in question is a composite char */ if ((i=isCompositeChar( FontID, CurCharName))>-1) { /* i is now the index of the composite char definitions (starting at 0). At this point it is clear that AFM-info must be present -> fetch first component of composite char. */ pAFMData=pFontBase->pFontArray[FontID].pAFMData; charnameP->len=strlen( pAFMData->ccd[i].pieces[0].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[0].pccName; numPieces=pAFMData->ccd[i].numOfPieces; if ((basechar=SearchDictName(CharStringsDictP,charnameP))<=0) { /* this is bad, AFM-file and font file do not match. This will most probably lead to errors or inconsistencies later. However, we substitute .notdef and inform the user via logfile and T1_errno. */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[0].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_COMPOSITE_CHAR; } } } if (basechar<=0) { /* This means the requested char is unknown or the base char of a composite is not found -> we substitute .notdef */ charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; basechar = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* Font must be completely damaged if it doesn't define a .notdef */ if (basechar<=0) { *mode=FF_PARSE_ERROR; return(NULL); } } /* if (basechar<=0) */ /* basechar is now the index of the base character in the CharStrings dictionary */ /* we provide the Type1Char() procedure with the name of the character to rasterize for debugging purposes */ strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* get CharString and character path */ theStringP = &(CharStringsDictP[basechar].value); tmppath2 = (struct segment *) Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName,strokewidth,0); /* if Type1Char reported an error, then return */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) return(NULL); /* Defer rastering to later, we first have to handle the composite symbols */ for (j=1; jlen=strlen( pAFMData->ccd[i].pieces[j].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[j].pccName; /* get CharString definition */ if ((N=SearchDictName(CharStringsDictP,charnameP))<=0) { /* handling of errors, see comments above ... */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[j].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; N = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* damaged Font */ if (N<=0) { *mode=FF_PARSE_ERROR; if (charpath!=NULL) { KillPath( charpath); } return(NULL); } } theStringP = &(CharStringsDictP[N].value); tmppath1=(struct segment *)ILoc(S, pAFMData->ccd[i].pieces[j].deltax, pAFMData->ccd[i].pieces[j].deltay); strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; charpath=(struct segment *)Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName,strokewidth,0); /* return if Type1Char reports an error */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) return(NULL); /* get escapement of current symbol */ currdisp=getDisplacement( charpath); /* concat displacement and symbol path */ charpath=(struct segment *)Join(tmppath1,charpath); /* for composite symbols we have to step back the char escapement. this is, in order to be able to use accents that cause a non zero displacement of the current point! We further have to step back the displacement from composite char data. */ tmppath1=(struct segment *)t1_PathSegment( MOVETYPE, -currdisp.x, -currdisp.y); tmppath3=(struct segment *)ILoc(S, -pAFMData->ccd[i].pieces[j].deltax, -pAFMData->ccd[i].pieces[j].deltay); tmppath3=(struct segment *)Join(tmppath1,tmppath3); /* create path, or, respectively, append to existing path */ if (tmppath4==NULL) { tmppath4=(struct segment *)Join(charpath,tmppath3); } else { charpath=(struct segment *)Join(charpath,tmppath3); tmppath4=(struct segment *)Join(tmppath4,charpath); } } /* concat composite symbols and base char */ if (tmppath4==NULL) { /* no previous composite symbols */ charpath=tmppath2; /* a simple char */ } else { charpath=(struct segment *)Join(tmppath4,tmppath2); } if (do_raster) { /* fill with winding rule unless path was requested */ if (*mode != FF_PATH) { charpath = (struct segment *)Interior(charpath,WINDINGRULE+CONTINUITY); } } if (*mode==0) *mode=localmode; return((xobject) charpath); } /***================================================================***/ /* fontfcnA(env, mode) */ /* */ /* env is a pointer to a string that contains the fontname. */ /* */ /* 1) initialize the font - global indicates it has been done */ /* 2) load the font */ /* */ /* This function has been modified by RMz. It now takes a pointer which already contains the address of a valid type1 font structure as the third argument. The value of this pointer is first handed to FontP so that most other routines may be used without changes */ #define MAXTRIAL 4 /***================================================================***/ Bool fontfcnA(env,mode,Font_Ptr) char *env; int *mode; psfont *Font_Ptr; { int i, result; /* set the global font pointer to the address of already allocated structure */ FontP=Font_Ptr; InitImager(); /* Read the font program. */ for (i=1; ifontInfoP; objFormatName(&nameObj,strlen(infoName),infoName); N = SearchDictName(dictP,&nameObj); /* if found */ if ( N > 0 ) { *rcodeP = 0; switch (dictP[N].value.type) { case OBJ_ARRAY: valueP = dictP[N].value.data.arrayP; if (strcmp(infoName,"FontMatrix") == 0) { /* 6 elments, return them as floats */ for (i=0;i<6;i++) { if (valueP->type == OBJ_INTEGER ) ((float *)infoValue)[i] = valueP->data.integer; else ((float *)infoValue)[i] = valueP->data.real; valueP++; } } if (strcmp(infoName,"FontBBox") == 0) { /* 4 elments for Bounding Box. all integers */ for (i=0;i<4;i++) { ((int *)infoValue)[i] = valueP->data.integer; valueP++; } break; case OBJ_INTEGER: case OBJ_BOOLEAN: *((int *)infoValue) = dictP[N].value.data.integer; break; case OBJ_REAL: *((float *)infoValue) = dictP[N].value.data.real; break; case OBJ_NAME: case OBJ_STRING: *((char **)infoValue) = dictP[N].value.data.valueP; break; default: *rcodeP = 1; break; } } } else *rcodeP = 1; } /***================================================================***/ /* RMz: instead of code, which is a character pointer to the name of the character, we use "ev" which is a pointer to a desired encoding vector (or NULL if font-internal encoding should be used) and "index" as an index into the desired encoding vector! The user thus has the opportunity of supplying whatever encoding he wants. Font_Ptr is the pointer to the local psfont-structure. */ xobject fontfcnB_string( int FontID, int modflag, struct XYspace *S, char **ev, unsigned char *string, int no_chars, int *mode, psfont *Font_Ptr, int *kern_pairs, long spacewidth, int do_raster, float strokewidth) { psobj *charnameP; /* points to psobj that is name of character*/ FontInfo *pAFMData=NULL; int i=-1; int j=0; int k=0; long acc_width=0; int numPieces=1; int N; T1_PATHPOINT currdisp; int basechar; psdict *CharStringsDictP; /* dictionary with char strings */ psobj CodeName; /* used to store the translation of the name*/ psobj *SubrsArrayP; psobj *theStringP; int localmode=0; struct segment *charpath=NULL; /* the path for this character */ struct segment *tmppath1=NULL; struct segment *tmppath2=NULL; struct segment *tmppath3=NULL; struct segment *tmppath4=NULL; struct segment *tmppath5=NULL; /* set the global font pointer to the address of already allocated structure and setup pointers*/ FontP=Font_Ptr; CharStringsDictP = FontP->CharStringsP; SubrsArrayP = &(FontP->Subrs); charnameP = &CodeName; /* In the following for-loop, all characters are processed, one after the other. Between them, the amount of kerning is inserted. The number of path variables used is somewhat numerous. We use the follwing conventions: charpath: the overall path of the string. tmppath5: the overall path of one component (possibly a composite symbol) tmppath2: the path of a simple char or base char of a composite tmppath4: the path of all "accents" of a composite symbol */ for (k=0; klen = FontP->fontInfoP[ENCODING].value.data.arrayP[string[k]].len; charnameP->data.stringP = (unsigned char *) FontP->fontInfoP[ENCODING].value.data.arrayP[string[k]].data.arrayP; } else { /* some user-supplied encoding is to be used */ charnameP = &CodeName; charnameP->len = strlen(ev[string[k]]); charnameP->data.stringP = (unsigned char*) ev[string[k]]; } /* Spacing is to be under users control: => if space is the charname, don't raster it. Rather, generate a horizontal movement of spacewidth: */ if (strcmp((char *)charnameP->data.stringP, "space")==0){ tmppath5=(struct segment *)ILoc(S, spacewidth,0); acc_width += spacewidth; } else { /* here a character or composite character is to be constructed */ strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* search the CharString for this charname as key */ basechar = SearchDictName(CharStringsDictP,charnameP); if (basechar<=0) { /* Check first, whether a char in question is a composite char */ if ((i=isCompositeChar( FontID, CurCharName))>-1) { /* i is now the index of the composite char definitions (starting at 0). At this point it is clear that AFM-info must be present -> fetch first component of composite char. */ pAFMData=pFontBase->pFontArray[FontID].pAFMData; charnameP->len=strlen( pAFMData->ccd[i].pieces[0].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[0].pccName; numPieces=pAFMData->ccd[i].numOfPieces; if ((basechar=SearchDictName(CharStringsDictP,charnameP))<=0) { /* this is bad, AFM-file and font file do not match. This will most probably lead to errors or inconsistencies later. However, we substitute .notdef and inform the user via logfile and T1_errno. */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[0].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_COMPOSITE_CHAR; } } } if (basechar<=0) { /* This means the requested char is unknown or the base char of a composite is not found -> we substitute .notdef */ charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; basechar = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* Font must be completely damaged if it doesn't define a .notdef */ if (basechar<=0) { *mode=FF_PARSE_ERROR; return(NULL); } } /* if (basechar<=0) */ /* basechar is now the index of the base character in the CharStrings dictionary */ /* we provide the Type1Char() procedure with the name of the character to rasterize for debugging purposes */ strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* get CharString and character path */ theStringP = &(CharStringsDictP[basechar].value); tmppath2 = (struct segment *) Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName,strokewidth,0); strcpy( BaseCharName, CurCharName); /* if Type1Char reports an error, clean up and return */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) { if (charpath!=NULL) { KillPath( charpath); } if (tmppath1!=NULL) { KillPath( tmppath1); } if (tmppath2!=NULL) { KillPath( tmppath2); } if (tmppath3!=NULL) { KillPath( tmppath3); } if (tmppath4!=NULL) { KillPath( tmppath4); } if (tmppath5!=NULL) { KillPath( tmppath5); } return(NULL); } /* Defer rastering to later, we first have to handle the composite symbols */ for (j=1; jlen=strlen( pAFMData->ccd[i].pieces[j].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[j].pccName; /* get CharString definition */ if ((N=SearchDictName(CharStringsDictP,charnameP))<=0) { /* handling of errors, see comments above ... */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[j].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; N = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* an undefined .notdef is fatal -> clean up and return */ if (N<=0) { *mode=FF_PARSE_ERROR; if (charpath!=NULL) { KillPath( charpath); } if (tmppath1!=NULL) { KillPath( tmppath1); } if (tmppath2!=NULL) { KillPath( tmppath2); } if (tmppath3!=NULL) { KillPath( tmppath3); } if (tmppath4!=NULL) { KillPath( tmppath4); } if (tmppath5!=NULL) { KillPath( tmppath5); } return(NULL); } } theStringP = &(CharStringsDictP[N].value); tmppath1=(struct segment *)ILoc(S, pAFMData->ccd[i].pieces[j].deltax, pAFMData->ccd[i].pieces[j].deltay); strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; tmppath5=(struct segment *)Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName,strokewidth,0); /* return if Type1Char reports an error */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) return(NULL); /* get escapement of current symbol */ currdisp=getDisplacement( tmppath5); /* concat displacement and symbol path */ tmppath5=(struct segment *)Join(tmppath1,tmppath5); /* for composite symbols we have to step back the char escapement. this is, in order to be able to use accents that cause a non zero displacement of the current point! We further have to step back the displacement from composite char data. */ tmppath1=(struct segment *)t1_PathSegment( MOVETYPE, -currdisp.x, -currdisp.y); tmppath3=(struct segment *)ILoc(S, -pAFMData->ccd[i].pieces[j].deltax, -pAFMData->ccd[i].pieces[j].deltay); tmppath3=(struct segment *)Join(tmppath1,tmppath3); /* create path, or, respectively, append to existing path */ if (tmppath4==NULL) { tmppath4=(struct segment *)Join(tmppath5,tmppath3); } else { tmppath5=(struct segment *)Join(tmppath5,tmppath3); tmppath4=(struct segment *)Join(tmppath4,tmppath5); } } /* concat composite symbols and base char. We use tmppath5 to store the path of the resulting (possibly composite) character. */ if (tmppath4==NULL) { /* no previous composite symbols */ tmppath5=tmppath2; /* a simple char */ } else { tmppath5=(struct segment *)Join(tmppath4,tmppath2); } /* Accumulate displacement, but be careful: In case of composite characters, we have to take the escapement of the base char only into account, because accents do not cause spacing. The path is constructed in a way that this automatically matches. */ if (numPieces>1) { /* composite character */ acc_width +=pFontBase->pFontArray[FontID].pAFMData->ccd[-(pFontBase->pFontArray[FontID].pEncMap[string[k]]+1)].wx; } else { /* ordinary character */ acc_width +=pFontBase->pFontArray[FontID].pAFMData->cmi[pFontBase->pFontArray[FontID].pEncMap[string[k]]-1].wx; } } /* else (if (char==space) */ /* character path is now stored in tmppath5. It may be a composite character. Insert kerning amount, if it is not the last character of the string. */ if (kpFontArray[FontID].UndrLnPos, pFontBase->pFontArray[FontID].UndrLnThick, (float) acc_width,strokewidth); charpath=(struct segment *)Join(charpath,tmppath2); } if (modflag & T1_OVERLINE){ tmppath2=(struct segment *)Type1Line(FontP,S, pFontBase->pFontArray[FontID].OvrLnPos, pFontBase->pFontArray[FontID].OvrLnThick, (float) acc_width,strokewidth); charpath=(struct segment *)Join(charpath,tmppath2); } if (modflag & T1_OVERSTRIKE){ tmppath2=(struct segment *)Type1Line(FontP,S, pFontBase->pFontArray[FontID].OvrStrkPos, pFontBase->pFontArray[FontID].OvrStrkThick, (float) acc_width,strokewidth); charpath=(struct segment *)Join(charpath,tmppath2); } /* printf("charpath->type: %x\n",charpath->type); printf("path1->type: %x\n",path1->type); printf("path2->type: %x\n",path2->type); */ /* if Type1Char reported an error, then return */ if ( *mode == FF_PARSE_ERROR) return(NULL); if ( *mode == FF_PATH_ERROR) return(NULL); if (do_raster) { /* fill with winding rule unless path was requested */ if (*mode != FF_PATH) { charpath = (struct segment *) Interior((path) charpath,WINDINGRULE+CONTINUITY); } } if (*mode==0) *mode=localmode; return((path)charpath); } /* This special variant is for generating character bitmaps from charactername */ xobject fontfcnB_ByName( int FontID, int modflag, struct XYspace *S, unsigned char *charname, int *mode, psfont *Font_Ptr, int do_raster) { psobj *charnameP; /* points to psobj that is name of character*/ FontInfo *pAFMData=NULL; int i=-1; int j=0; int numPieces=1; int N; T1_PATHPOINT currdisp; int basechar; psdict *CharStringsDictP; /* dictionary with char strings */ psobj CodeName; /* used to store the translation of the name*/ psobj *SubrsArrayP; psobj *theStringP; int localmode=0; struct segment *charpath=NULL; /* the path for this character */ struct segment *tmppath1=NULL; struct segment *tmppath2=NULL; struct segment *tmppath3=NULL; struct segment *tmppath4=NULL; /* set the global font pointer to the address of already allocated structure and setup pointers*/ FontP=Font_Ptr; CharStringsDictP = FontP->CharStringsP; SubrsArrayP = &(FontP->Subrs); charnameP = &CodeName; charnameP->len = strlen((char*)charname); charnameP->data.stringP = charname; strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* search the chars string for this charname as key */ basechar = SearchDictName(CharStringsDictP,charnameP); if (basechar<=0) { /* Check first, whether a char in question is a composite char */ if ((i=isCompositeChar( FontID, CurCharName))>-1) { /* i is now the index of the composite char definitions (starting at 0). At this point it is clear that AFM-info must be present -> fetch first component of composite char. */ pAFMData=pFontBase->pFontArray[FontID].pAFMData; charnameP->len=strlen( pAFMData->ccd[i].pieces[0].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[0].pccName; numPieces=pAFMData->ccd[i].numOfPieces; if ((basechar=SearchDictName(CharStringsDictP,charnameP))<=0) { /* this is bad, AFM-file and font file do not match. This will most probably lead to errors or inconsistencies later. However, we substitute .notdef and inform the user via logfile and T1_errno. */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[0].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_COMPOSITE_CHAR; } } } if (basechar<=0) { /* This means the requested char is unknown or the base char of a composite is not found -> we substitute .notdef */ charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; basechar = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* Font must be completely damaged if it doesn't define a .notdef */ if (basechar<=0) { *mode=FF_PARSE_ERROR; return(NULL); } } /* if (basechar<=0) */ /* basechar is now the index of the base character in the CharStrings dictionary */ /* we provide the Type1Char() procedure with the name of the character to rasterize for debugging purposes */ strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* get CharString and character path */ theStringP = &(CharStringsDictP[basechar].value); tmppath2 = (struct segment *) Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName, 0.0f, 0); /* if Type1Char reported an error, then return */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) return(NULL); /* Defer rastering to later, we first have to handle the composite symbols */ for (j=1; jlen=strlen( pAFMData->ccd[i].pieces[j].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[j].pccName; /* get CharString definition */ if ((N=SearchDictName(CharStringsDictP,charnameP))<=0) { /* handling of errors, see comments above ... */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[j].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; N = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* damaged Font */ if (N<=0) { *mode=FF_PARSE_ERROR; if (charpath!=NULL) { KillPath( charpath); } return(NULL); } } theStringP = &(CharStringsDictP[N].value); tmppath1=(struct segment *)ILoc(S, pAFMData->ccd[i].pieces[j].deltax, pAFMData->ccd[i].pieces[j].deltay); strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; charpath=(struct segment *)Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName,0.0f,0); /* return if Type1Char reports an error */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) return(NULL); /* get escapement of current symbol */ currdisp=getDisplacement( charpath); /* concat displacement and symbol path */ charpath=(struct segment *)Join(tmppath1,charpath); /* for composite symbols we have to step back the char escapement. this is, in order to be able to use accents that cause a non zero displacement of the current point! We further have to step back the displacement from composite char data. */ tmppath1=(struct segment *)t1_PathSegment( MOVETYPE, -currdisp.x, -currdisp.y); tmppath3=(struct segment *)ILoc(S, -pAFMData->ccd[i].pieces[j].deltax, -pAFMData->ccd[i].pieces[j].deltay); tmppath3=(struct segment *)Join(tmppath1,tmppath3); /* create path, or, respectively, append to existing path */ if (tmppath4==NULL) { tmppath4=(struct segment *)Join(charpath,tmppath3); } else { charpath=(struct segment *)Join(charpath,tmppath3); tmppath4=(struct segment *)Join(tmppath4,charpath); } } /* concat composite symbols and base char */ if (tmppath4==NULL) { /* no previous composite symbols */ charpath=tmppath2; /* a simple char */ } else { charpath=(struct segment *)Join(tmppath4,tmppath2); } if (do_raster) { /* fill with winding rule unless path was requested */ if (*mode != FF_PATH) { charpath = (struct segment *)Interior(charpath,WINDINGRULE+CONTINUITY); } } if (*mode==0) *mode=localmode; return((xobject) charpath); } xobject fontfcnRect( float width, float height, struct XYspace* S, int *mode, int do_raster, float strokewidth) { struct segment *charpath = NULL; /* the path for this character (rectangle) */ charpath = (struct segment *) Type1Line( NULL, S, 0.5f * height, /* position */ height, /* thickness */ -width, /* width */ strokewidth /* strokewidth */ ); if (do_raster) { /* fill with winding rule unless path was requested */ if (*mode != FF_PATH) { charpath = (struct segment *)Interior(charpath,WINDINGRULE+CONTINUITY); } } return((xobject) charpath); } /* T1int_QuerySEAC(): Query for Type of character definition of index "index". Returns: 0 if charstring for currenc[index] not defined 1 if charstring defines a self-containing character 2 if charstring references other definition by means of the SEAC directive. */ int T1int_QuerySEAC( int FontID, unsigned char index, unsigned char* basepiece, unsigned char* accpiece ) { psobj *charnameP; /* points to psobj that is name of character*/ int thischar; int mode = 0; psdict *CharStringsDictP; /* dictionary with char strings */ psobj CodeName; /* used to store the translation of the name*/ psobj *SubrsArrayP; psobj *theStringP; char **ev; struct XYspace *S; struct segment *path=NULL; /* the path for this character */ /* set the global font pointer to the address of already allocated structure and setup pointers*/ FontP=pFontBase->pFontArray[FontID].pType1Data; CharStringsDictP = FontP->CharStringsP; SubrsArrayP = &(FontP->Subrs); charnameP = &CodeName; /* get encoding */ ev=pFontBase->pFontArray[FontID].pFontEnc; if (ev==NULL){ /* font-internal encoding should be used */ charnameP->len = FontP->fontInfoP[ENCODING].value.data.arrayP[index].len; charnameP->data.stringP = (unsigned char *) FontP->fontInfoP[ENCODING].value.data.arrayP[index].data.arrayP; } else{ /* some user-supplied encoding is to be used */ charnameP->len = strlen(ev[index]); charnameP->data.stringP = (unsigned char *) ev[index]; } strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* search the chars string for this charname as key */ thischar = SearchDictName(CharStringsDictP,charnameP); /* thischar is now the index of the base character in the CharStrings dictionary */ if ( thischar <= 0 ) { /* CharString not defined, return */ return 0; } /* Setup NULL-space, not needed when paths aren't created */ S = NULL; /* we provide the Type1Char() procedure with the name of the character to rasterize for debugging purposes */ strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* get CharString and character path */ theStringP = &(CharStringsDictP[thischar].value); path = (struct segment *) Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,&mode,CurCharName,0, 1); /* if Type1Char reported an error, then return */ if ( mode == FF_PARSE_ERROR || mode==FF_PATH_ERROR) { return -1; } if ( T1int_Type1QuerySEAC( basepiece, accpiece) > 0 ) { return 2; } return 1; } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/t1hdigit.h0000664000175000017500000000344611742726711023220 0ustar uwabamiuwabami/* $XConsortium: t1hdigit.h,v 1.2 91/10/10 11:19:31 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Indicators for special characters in the p_hdigit.h tables */ #define HERROR (0xfe) #define HWHITE_SPACE (0xfd) #define HRIGHT_ANGLE (0xfc) #define LAST_HDIGIT (0xf0) /* Declarations for the tables */ #define HighHexP (HighHex+1) extern unsigned char HighHex[]; #define LowHexP (LowHex+1) extern unsigned char LowHex[]; xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/t1io.c0000664000175000017500000004211411742726711022345 0ustar uwabamiuwabami/* $XConsortium: t1io.c,v 1.4 91/10/10 11:19:41 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * * Author: Carol H. Thompson IBM Almaden Research Center */ /******************************************************************* * I/O package for Type 1 font reading ********************************************************************/ #ifndef STATIC #define STATIC static #endif #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include #include #include "t1stdio.h" #include "t1hdigit.h" /* we define this to switch to decrypt-debugging mode. The stream of decrypted bytes will be written to stdout! This contains binary charstring data */ /* #define DEBUG_DECRYPTION */ /* #define DEBUG_PFB_BLOCKS */ /* Constants and variables used in the decryption */ #define c1 ((unsigned short)52845) #define c2 ((unsigned short)22719) static unsigned short r; static int asc, Decrypt; static int extrach; static int haveextrach; static int starthex80=0; static long pfbblocklen=0; static long accu=0; static unsigned long bytecnt=0; static int eexec_startOK=0; static int eexec_endOK=0; static int in_eexec=0; /* Our single FILE structure and buffer for this package */ STATIC F_FILE TheFile; STATIC unsigned char TheBuffer[F_BUFSIZ]; /* Our routines */ F_FILE *T1Open(), *T1eexec(); int T1Close(F_FILE *); int T1Read(), T1Getc(F_FILE *), T1Ungetc(int,F_FILE *); void T1io_reset(void); STATIC int T1Decrypt(), T1Fill(); /* -------------------------------------------------------------- */ /*ARGSUSED*/ F_FILE *T1Open(fn, mode) char *fn; /* Pointer to filename */ char *mode; /* Pointer to open mode string */ { F_FILE *of = &TheFile; char c; Decrypt = 0; eexec_startOK=0; eexec_endOK=0; #ifndef O_BINARY # define O_BINARY 0x0 #endif /* We know we are only reading */ if ((of->fd=open(fn, O_RDONLY | O_BINARY)) < 0) return NULL; /* We check for pfa/pfb file */ if (read( of->fd, &c, 1)!=1) { close( of->fd); return(NULL); } else if (c==(char)0x80){ starthex80=1; } lseek( of->fd, 0, SEEK_SET); /* Initialize the buffer information of our file descriptor */ of->b_base = TheBuffer; of->b_size = F_BUFSIZ; of->b_ptr = NULL; of->b_cnt = 0; of->flags = 0; of->error = 0; haveextrach = 0; return &TheFile; } /* end Open */ /* -------------------------------------------------------------- */ int T1Getc(f) /* Read one character */ F_FILE *f; /* Stream descriptor */ { if (f->b_base == NULL) return EOF; /* already closed */ if (f->flags & UNGOTTENC) { /* there is an ungotten c */ f->flags &= ~UNGOTTENC; return (int) f->ungotc; } if (f->b_cnt == 0) /* Buffer needs to be (re)filled */ f->b_cnt = T1Fill(f); if (f->b_cnt > 0) return (f->b_cnt--, (int) *(f->b_ptr++)); else { f->flags |= FIOEOF; return EOF; } } /* end Getc */ /* This function is added by RMz: T1Gets(): Read a line of the file and save it to string. At most, (size-1) bytes are read. The user *must* ensure (by making size large enough) that "eexec" does not get split between two calls because in this case, eexec-decryption does not set in. ------------------------------------------------------------ */ int T1Gets(char *string, int size, F_FILE *f) /* Read a line */ { int i=0; char *eexecP; if (string == NULL) { return( i); } if (f->b_base == NULL) return( i); /* already closed */ if (size<2) /* no bytes to be read. For size = 1 we only had room for the \0-character. */ return( i); if (f->flags & UNGOTTENC) { /* there is an ungotten c */ f->flags &= ~UNGOTTENC; string[i++]=f->ungotc; size--; } size--; /* we have to leave room for one \0-character */ while ( size>0) { if (f->b_cnt == 0) { /* Buffer needs to be (re)filled */ f->b_cnt = T1Fill(f); } if (f->b_cnt == 0) { /* no more bytes available. Put \0-char and return. */ if ( i==0) { /* we did not already store one single char to string */ f->flags |= FIOEOF; return( i); } else { f->flags |= FIOEOF; string[i]='\0'; return( i); } } /* do not skip white space as required by Adobe spec, because I have found fonts where the first encrypted byte was of white space type. */ if ( (eexec_startOK==1) && (eexec_endOK==1)) { T1eexec( f); eexec_startOK=0; eexec_endOK=0; in_eexec=1; /* we are now in the encrypted portion. */ } string[i]=*(f->b_ptr); /* Check whether eexec appears in the string just setup */ if ( (Decrypt==0) && ((eexecP=strstr( string, "eexec"))!=NULL) ) { /* if eexec is an isolated token, start decryption */ if ( (eexec_startOK==1) && (isspace( (int)string[i])!=0) ) { eexec_endOK=1; } if ( (eexec_startOK==0) && (isspace( (int)string[i-5])!=0) ) { eexec_startOK=1; } } i++; /* Under UNIX, '\n' is the accepted newline. For pfb-files it is also common to use '\r' as the newline indicator. I have, however, never seen a pfb-file which uses the sequence '\r''\n' as a newline indicator, as known from DOS. So we don't take care for this case and simply map both single characters \r and \n into \n. Of course, this can only be done in the ASCII section of the font. 2002-10-26: Well, life life is teaching me better: There *are* fonts out there, ASCII encoded pfa's, that use the crappy DOSian 0x0d 0x0a sequence as line separation. In order to make it still work, we absorb the byte 0x0a. Failure to do so result in decryption failure. The workaround is implemented T1eexec(): */ if ( *(f->b_ptr)=='\n' || *(f->b_ptr)=='\r') { if (in_eexec==0) string[i-1]='\n'; string[i]='\0'; f->b_cnt--; f->b_ptr++; return( i); } f->b_cnt--; f->b_ptr++; size--; } /* end of while (size>0) */ string[i]='\0'; /* finish string */ return( i); } /* end of T1Gets() */ int T1GetDecrypt( void) { return( in_eexec); } /* Return the optional contents after the final cleartomark token. There might appear some PostScript code which is not important for t1lib, but which becomes important if subsetted fonts are embedded in PostScript files. */ int T1GetTrailer(char *string, int size, F_FILE *f) { unsigned long off_save; char *buf; char *ctmP; int i=0, j; int datasize; int len; datasize=size; off_save=lseek( f->fd, 0, SEEK_CUR); if ((buf=(char *)malloc( size+1))==NULL ) { return( -1); } lseek( f->fd, -size, SEEK_END); read(f->fd, buf, size); buf[size]='\0'; /* to be ablo perform a strstr() on this memory */ i=datasize; j=datasize-11; /* length of "cleartomark" plus terminating white space or newline */ while ((j--)>-1) { if ((unsigned char)buf[i]==0x80) { datasize=i; /* we skip the segment marker of pfb-files */ } if ((ctmP=strstr( &(buf[j]), "cleartomark"))!=NULL) { /* buf[i-1] now is the first character after cleartomark. Advance now to the next non white character of EOF. */ len = datasize - i; while ( (isspace( (int)(buf[i-1])) != 0) && (i < datasize) ) { ++i; } memcpy( string, &(buf[i-1]), len); string[len]='\0'; lseek( f->fd, off_save, SEEK_SET); free( buf); return len; } i--; } lseek( f->fd, off_save, SEEK_SET); free( buf); return( -1); } unsigned long T1GetFileSize( F_FILE *f) { unsigned long off_save; unsigned long filesize; off_save=lseek( f->fd, 0, SEEK_CUR); filesize=lseek( f->fd, 0, SEEK_END); lseek( f->fd, off_save, SEEK_SET); return( filesize); } /* -------------------------------------------------------------- */ int T1Ungetc(c, f) /* Put back one character */ int c; F_FILE *f; /* Stream descriptor */ { if (c != EOF) { f->ungotc = c; f->flags |= UNGOTTENC; /* set flag */ f->flags &= ~FIOEOF; /* reset EOF */ } return c; } /* end Ungetc */ /* -------------------------------------------------------------- */ int T1Read(buffP, size, n, f) /* Read n items into caller's buffer */ char *buffP; /* Buffer to be filled */ int size; /* Size of each item */ int n; /* Number of items to read */ F_FILE *f; /* Stream descriptor */ { int bytelen, cnt, i; F_char *p = (F_char *)buffP; int icnt; /* Number of characters to read */ if (f->b_base == NULL) return 0; /* closed */ icnt = (size!=1)?n*size:n; /* Number of bytes we want */ if (f->flags & UNGOTTENC) { /* there is an ungotten c */ f->flags &= ~UNGOTTENC; *(p++) = f->ungotc; icnt--; bytelen = 1; } else bytelen = 0; while (icnt > 0) { /* First use any bytes we have buffered in the stream buffer */ if ((cnt=f->b_cnt) > 0) { if (cnt > icnt) cnt = icnt; for (i=0; ib_ptr++); f->b_cnt -= cnt; icnt -= cnt; bytelen += cnt; } if ((icnt == 0) || (f->flags & FIOEOF)) break; f->b_cnt = T1Fill(f); } return ((size!=1)?bytelen/size:bytelen); } /* end Read */ /* -------------------------------------------------------------- */ int T1Close(f) /* Close the file */ F_FILE *f; /* Stream descriptor */ { if (f->b_base == NULL) return 0; /* already closed */ f->b_base = NULL; /* no valid stream */ return close(f->fd); } /* end Close */ /* -------------------------------------------------------------- */ F_FILE *T1eexec(f) /* Initialization */ F_FILE *f; /* Stream descriptor */ { int i; int H; unsigned char *p; int testchar; unsigned char randomP[8]; r = 55665; /* initial key */ asc = 1; /* indicate ASCII form */ #ifdef DEBUG_DECRYPTION printf("T1eexec(1): first 20 bytes=%.20s, b_cnt=%d\n", f->b_ptr, f->b_cnt); #endif /* As the very first action we check the first byte against 0x0a. This mmight happen in context with the T1gets() function for pfa files that use DOSian linefeed style. If that character appears here, we absorb it (see also T1Gets()!). */ if ( ( testchar = T1Getc( f)) != 0x0a ) T1Ungetc( testchar, f); /* Consume the 4 random bytes, determining if we are also to ASCIIDecodeHex as we process our input. (See pages 63-64 of the Adobe Type 1 Font Format book.) */ /* Skipping over initial white space chars has been removed since it could lead to unprocessable pfb-fonts if accindentally the first cipher text byte was of the class HWHITE_SPACE. Instead, we just read ahead, this should suffice for any Type 1 font program. (RMz, 08/02/1998) */ /* If ASCII, the next 7 chars are guaranteed consecutive */ randomP[0] = getc(f); /* store first non white space char */ fread(randomP+1, 1, 3, f); /* read 3 more, for a total of 4 */ /* store first four chars */ for (i=0,p=randomP; i<4; i++) { /* Check 4 valid ASCIIEncode chars */ if (HighHexP[*p++] > LAST_HDIGIT) { /* non-ASCII byte */ asc = 0; break; } } if (asc) { /* ASCII form, convert first eight bytes to binary */ fread(randomP+4, 1, 4, f); /* Need four more */ for (i=0,p=randomP; i<4; i++) { /* Convert */ H = HighHexP[*p++]; randomP[i] = H | LowHexP[*p++]; } } /* Adjust our key */ for (i=0,p=randomP; i<4; i++) { r = (*p++ + r) * c1 + c2; } /* Decrypt the remaining buffered bytes */ f->b_cnt = T1Decrypt(f->b_ptr, f->b_cnt); Decrypt = 1; #ifdef DEBUG_DECRYPTION printf("T1eexec(2): first 120 bytes=%.120s, b_cnt=%d\n", f->b_ptr, f->b_cnt); #endif return (feof(f))?NULL:f; } /* end eexec */ /* -------------------------------------------------------------- */ STATIC int T1Decrypt(p, len) unsigned char *p; int len; { int n; int H=0, L=0; unsigned char *inp = p; unsigned char *tblP; #ifdef DEBUG_DECRYPTION printf("T1_Decrypt(): called with len=%d\n",len); #endif if (asc) { if (haveextrach) { H = extrach; tblP = LowHexP; } else tblP = HighHexP; for (n=0; len>0; len--) { L = tblP[*inp++]; #ifdef DEBUG_DECRYPTION printf("L=0x%X, %d, inp=%c (%d)\n", L,L, *(inp-1), *(inp-1)); #endif if (L == HWHITE_SPACE) { #ifdef DEBUG_DECRYPTION printf("continue\n"); #endif continue; } if (L > LAST_HDIGIT) { #ifdef DEBUG_DECRYPTION printf("L=0x%X, --> break\n", L); #endif break; } if (tblP == HighHexP) { /* Got first hexit value */ H = L; tblP = LowHexP; } else { /* Got second hexit value; compute value and store it */ n++; tblP = HighHexP; H |= L; /* H is an int, 0 <= H <= 255, so all of this will work */ *p++ = H ^ (r >> 8); r = (H + r) * c1 + c2; } } if (tblP != HighHexP) { /* We had an odd number of hexits */ extrach = H; haveextrach = 1; } else haveextrach = 0; #ifdef DEBUG_DECRYPTION printf("T1_Decrypt(): Decrypted %d bytes\n",n); #endif return n; } else { for (n = len; n>0; n--) { H = *inp++; *p++ = H ^ (r >> 8); r = (H + r) * c1 + c2; } return len; } } /* end Decrypt */ /* -------------------------------------------------------------- */ /* This function has been adapted to support pfb-files with multiple data segments */ STATIC int T1Fill(f) /* Refill stream buffer */ F_FILE *f; /* Stream descriptor */ { int rc,i; static unsigned char hdr_buf[6]; if (starthex80){ /* we have a pfb-file -> be aware of pfb-blocks */ if ( pfbblocklen-accu >= F_BUFSIZ){ /* fill the buffer */ rc = read(f->fd, f->b_base, F_BUFSIZ); bytecnt+=rc; accu +=rc; } else{ if (pfbblocklen-accu>0){ /* read the remaining of the pfb-block ... */ rc = read(f->fd, f->b_base, pfbblocklen-accu); bytecnt +=rc; accu +=rc; /* ... and examine the next header */ i=read(f->fd, hdr_buf, 6); bytecnt +=i; pfbblocklen=0; pfbblocklen += hdr_buf[2]&0xFF ; pfbblocklen += (hdr_buf[3] & 0xFF) <<8; pfbblocklen += (hdr_buf[4] & 0xFF) <<16; pfbblocklen += (hdr_buf[5] & 0xFF) <<24; #ifdef DEBUG_PFB_BLOCKS printf("t1io: New segment, length=%d, type=%d\n", pfbblocklen, hdr_buf[1]); #endif accu=0; } else{ /* We are at the beginning of a new block -> examine header */ i=read(f->fd, hdr_buf, 6); pfbblocklen=0; pfbblocklen += hdr_buf[2]&0xFF ; pfbblocklen += (hdr_buf[3] & 0xFF) <<8; pfbblocklen += (hdr_buf[4] & 0xFF) <<16; pfbblocklen += (hdr_buf[5] & 0xFF) <<24; #ifdef DEBUG_PFB_BLOCKS printf("t1io: New segment, length=%d, type=%d\n", pfbblocklen, hdr_buf[1]); #endif accu=0; /* header read, now fill the buffer */ if (pfbblocklen-accu >= F_BUFSIZ){ rc = read(f->fd, f->b_base, F_BUFSIZ); accu +=rc; } else{ /* we have the unusual case that the pfb-block size is shorter than F_BUFSIZ -> Read this block only */ rc = read(f->fd, f->b_base, pfbblocklen); accu +=rc; } } } } else{ /* We have a pfa-file -> read straight ahead and fill buffer */ rc = read(f->fd, f->b_base, F_BUFSIZ); } /* propagate any error or eof to current file */ if (rc <= 0) { if (rc == 0) /* means EOF */ f->flags |= FIOEOF; else { f->error = (short)-rc; f->flags |= FIOERROR; rc = 0; } } f->b_ptr = f->b_base; #ifdef DEBUG_DECRYPTION printf("T1_Fill(): read %d bytes\n", rc); #endif if (Decrypt){ rc = T1Decrypt(f->b_base, rc); #ifdef DEBUG_DECRYPTION printf("T1_Fill(): decrypted %d bytes\n", rc); #endif } return rc; } /* end Fill */ void T1io_reset(void) { pfbblocklen=0; accu=0; starthex80=0; eexec_startOK=0; eexec_endOK=0; in_eexec=0; } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/paths_rmz.h0000664000175000017500000002130511742726711023504 0ustar uwabamiuwabami/* $XConsortium: paths.h,v 1.2 91/10/10 11:18:50 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #include "types.h" #define XOBJ_COMMON char type; unsigned char flag; short references; #include "spaces_rmz.h" /* #define Loc(S,x,y) t1_Loc(S,(DOUBLE)x,(DOUBLE)y) #define ILoc(S,x,y) t1_ILoc(S,x,y) #define Line(P) t1_Line(P) #define Join(p1,p2) t1_Join(p1,p2) #define ClosePath(p) t1_ClosePath(p,0) #define CloseLastSubPath(p) t1_ClosePath(p,1) #define Conic(B,C,s) t1_Conic(B,C,(DOUBLE)s) #define RoundConic(M,C,r) t1_RoundConic(M,C,(DOUBLE)r) #define ArcP3(S,P2,P3) t1_ArcP3(S,P2,P3) #define ArcCA(S,C,d) t1_ArcCA(S,C,(DOUBLE)d) #define Bezier(B,C,D) t1_Bezier(B,C,D) #define Hint(S,r,w,o,h,a,d,l) t1_Hint(S,r,w,o,h,a,d,l) #define Reverse(p) t1_Reverse(p) #define ReverseSubPaths(p) t1_ReverseSubPaths(p) #define AddLoc(p1,p2) t1_Join(p1,p2) #define SubLoc(p1,p2) t1_SubLoc(p1,p2) #define DropSegment(p) t1_DropSegment(p) #define HeadSegment(p) t1_HeadSegment(p) #define QueryLoc(P,S,x,y) t1_QueryLoc(P,S,x,y) #define QueryPath(p,t,B,C,D,r) t1_QueryPath(p,t,B,C,D,r) #define QueryBounds(p,S,x1,y1,x2,y2) t1_QueryBounds(p,S,x1,y1,x2,y2) */ /* struct segment *t1_Loc(); struct segment *t1_ILoc(); struct segment *t1_Line(); struct segment *t1_Join(); struct segment *t1_ClosePath(); struct conicsegment *t1_Conic(); struct conicsegment *t1_RoundConic(); struct conicsegment *t1_ArcP3(); struct conicsegment *t1_ArcCA(); struct beziersegment *t1_Bezier(); struct hintsegment *t1_Hint(); struct segment *t1_Reverse(); struct segment *t1_ReverseSubPaths(); struct segment *t1_SubLoc(); struct segment *t1_DropSegment(); struct segment *t1_HeadSegment(); void t1_QueryLoc(); void t1_QueryPath(); void t1_QueryBounds(); */ /*END SHARED*/ /*SHARED*/ #define CopyPath(p) t1_CopyPath(p) #define KillPath(p) t1_KillPath(p) #define PathTransform(p,m) t1_PathXform(p,m) #define PathDelta(p,pt) t1_PathDelta(p,pt) #define BoundingBox(h,w) t1_BoundingBox(h,w) #define PathSegment(t,x,y) t1_PathSegment(t,(fractpel)x,(fractpel)y) #define JoinSegment(b,t,x,y,a) t1_JoinSegment(b,t,(fractpel)x,(fractpel)y,a) #define Hypoteneuse(dx,dy) t1_Hypoteneuse(dx,dy) #define BoxPath(S,h,w) t1_BoxPath(S,h,w) struct segment *t1_CopyPath(); /* duplicate a path */ void t1_KillPath(); /* destroy a path */ struct segment *t1_PathXform(); /* transform a path arbitrarily */ void t1_PathDelta(); /* calculate the ending point of a path */ struct segment *t1_PathSegment(); /* produce a MOVE or LINE segment */ struct segment *t1_JoinSegment(); /* join a MOVE or LINE segment to a path */ DOUBLE t1_Hypoteneuse(); /* returns the length of a line */ struct segment *t1_BoxPath(); /* returns a rectangular path */ /*END SHARED*/ /*SHARED*/ #define ConsumePath(p) MAKECONSUME(p,KillPath(p)) #define UniquePath(p) MAKEUNIQUE(p,CopyPath(p)) /*END SHARED*/ /*SHARED*/ struct segment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ unsigned char size; /* size of the structure */ unsigned char context; /* index to device context */ struct segment *link; /* pointer to next structure in linked list */ struct segment *last; /* pointer to last structure in list */ struct fractpoint dest; /* relative ending location of path segment */ } ; #define ISCLOSED(flag) ((flag)&0x80) /* subpath is closed */ #define LASTCLOSED(flag) ((flag)&0x40) /* last segment in closed subpath */ /* NOTE: The ISCLOSED flag is set on the MOVETYPE segment before the subpath proper; the LASTCLOSED flag is set on the last segment (LINETYPE) in the subpath We define the ISPATHANCHOR predicate to test that a path handle passed by the user is valid: */ #define ISPATHANCHOR(p) (ISPATHTYPE(p->type)&&p->last!=NULL) /* For performance reasons, a user's "location" object is identical to a path whose only segment is a move segment. We define a predicate to test for this case. See also :hdref refid=location.. */ #define ISLOCATION(p) ((p)->type == MOVETYPE && (p)->link == NULL) /*END SHARED*/ /*SHARED*/ struct conicsegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = CONICTYPE */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ struct segment *link; /* as with any 'segment' type */ struct segment *last; /* as with any 'segment' type */ struct fractpoint dest; /* Ending point (C point) */ struct fractpoint M; /* "midpoint" of conic explained above */ float roundness; /* explained above */ } ; /*END SHARED*/ /*SHARED*/ struct beziersegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = BEZIERTYPE */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ struct segment *link; /* as with any 'segment' type */ struct segment *last; /* as with any 'segment' type */ struct fractpoint dest; /* ending point (D) */ struct fractpoint B; /* control point B */ struct fractpoint C; /* control point C */ } ; /*END SHARED*/ /*SHARED*/ struct hintsegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = HINTTYPE */ unsigned char size; /* size of the structure */ unsigned char context; /* device context */ struct segment *link; /* pointer to next structure in linked list */ struct segment *last; /* pointer to last structure in list */ struct fractpoint dest; /* ALWAYS 0,0 */ struct fractpoint ref; struct fractpoint width; char orientation; char hinttype; char adjusttype; char direction; int label; } ; /*END SHARED*/ /*SHARED*/ /* CONCAT links the 'p2' path chain on the end of the 'p1' chain. (This macro is also used by the STROKES module.) */ #define CONCAT(p1, p2) { \ (struct segment *)(p1)->last->link = (struct segment *)p2; \ (struct segment *)(p1)->last = p2->last; \ (struct segment *)(p2)->last = NULL; } /*END SHARED*/ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/cluts.h0000664000175000017500000000307311742726711022631 0ustar uwabamiuwabami/* $XConsortium: cluts.h,v 1.2 91/10/10 11:17:54 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* STUB */ #define KillCLUT(T) #define CopyCLUT(T) T #define UniqueCLUT(T) xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/curves.c0000664000175000017500000001672311742726711023007 0ustar uwabamiuwabami/* $XConsortium: curves.c,v 1.3 91/10/10 11:17:56 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 */ /* All Rights Reserved */ /* License to use, copy, modify, and distribute this software */ /* and its documentation for any purpose and without fee is */ /* hereby granted, provided that licensee provides a license to */ /* IBM, Corp. to use, copy, modify, and distribute derivative */ /* works and their documentation for any purpose and without */ /* fee, that the above copyright notice appear in all copies */ /* and that both that copyright notice and this permission */ /* notice appear in supporting documentation, and that the name */ /* of IBM not be used in advertising or publicity pertaining to */ /* distribution of the software without specific, written prior */ /* permission. */ /* IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES */ /* OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT */ /* LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, */ /* FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF */ /* THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND */ /* PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT */ /* OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF */ /* THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES */ /* THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN */ /* NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR */ /* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING */ /* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF */ /* CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT */ /* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS */ /* SOFTWARE. */ /* :h1.CURVES Module - Stepping Beziers This module is responsible for "rasterizing" third order curves. That is, it changes the high level curve specification into a list of pels that that curve travels through. :h3.Include Files Include files needed: */ #include "types.h" #include "objects.h" #include "spaces.h" #include "paths.h" #include "regions.h" #include "curves.h" #include "lines.h" #include "arith.h" /* :h3.Functions Provided to Other Modules External entry points: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Note that "stepping" and "flattening" are so similiar that they use the same routine. When the "region" parameter is NULL, that is a flag that we are flattening instead of stepping. */ /* :h2.Bezier Third Order Curves */ /* :h3.The "bezierinfo" Structure This structure is used to store information used when we subdivide Bezier curves. */ struct bezierinfo { struct region *region; /* the region being built or NULL */ struct fractpoint last; /* not used yet; maybe could save some work */ struct fractpoint origin; /* the origin of the bezier */ } ; /* Checking for termination of the subdivision process: This is the stupidest test in the world, just check if the coordinatewise distance from an end control point to the next control point is less than one half pel. If so, we must be done. This returns 1 if the subdivision is terminated and 0 if you still need to subdivide. */ int BezierTerminationTest(xa,ya,xb,yb,xc,yc,xd,yd) fractpel xa,ya,xb,yb,xc,yc,xd,yd; { fractpel dmax; dmax = TYPE1_ABS(xa - xb); dmax = TYPE1_MAX(dmax,TYPE1_ABS(ya - yb)); dmax = TYPE1_MAX(dmax,TYPE1_ABS(xd - xc)); dmax = TYPE1_MAX(dmax,TYPE1_ABS(yd - yc)); if(dmax > FPHALF) return(0); /* not done yet */ else return(1); /* done */ } /* :h3.StepBezierRecurse() - The Recursive Logic in StepBezier() The recursion involves dividing the control polygon into two smaller control polygons by finding the midpoints of the lines. This idea is described in any graphics text book and its simplicity is what caused Bezier to define his curves as he did. If the input region 'R' is NULL, the result is a path that is the 'flattened' curve; otherwise StepBezier returns nothing special. */ static struct segment *StepBezierRecurse(I,xA,yA,xB,yB,xC,yC,xD,yD) struct bezierinfo *I; /* Region under construction or NULL */ fractpel xA,yA; /* A control point */ fractpel xB,yB; /* B control point */ fractpel xC,yC; /* C control point */ fractpel xD,yD; /* D control point */ { if (BezierTerminationTest(xA,yA,xB,yB,xC,yC,xD,yD)) { if (I->region == NULL) return(PathSegment(LINETYPE, xD - xA, yD - yA)); else StepLine(I->region, I->origin.x + xA, I->origin.y + yA, I->origin.x + xD, I->origin.y + yD); } else { fractpel xAB,yAB; fractpel xBC,yBC; fractpel xCD,yCD; fractpel xABC,yABC; fractpel xBCD,yBCD; fractpel xABCD,yABCD; xAB = xA + xB; yAB = yA + yB; xBC = xB + xC; yBC = yB + yC; xCD = xC + xD; yCD = yC + yD; xABC = xAB + xBC; yABC = yAB + yBC; xBCD = xBC + xCD; yBCD = yBC + yCD; xABCD = xABC + xBCD; yABCD = yABC + yBCD; xAB >>= 1; yAB >>= 1; xBC >>= 1; yBC >>= 1; xCD >>= 1; yCD >>= 1; xABC >>= 2; yABC >>= 2; xBCD >>= 2; yBCD >>= 2; xABCD >>= 3; yABCD >>= 3; if (I->region == NULL) { return( Join( StepBezierRecurse(I, xA, yA, xAB, yAB, xABC, yABC, xABCD, yABCD), StepBezierRecurse(I, xABCD, yABCD, xBCD, yBCD, xCD, yCD, xD, yD) ) ); } else { StepBezierRecurse(I, xA, yA, xAB, yAB, xABC, yABC, xABCD, yABCD); StepBezierRecurse(I, xABCD, yABCD, xBCD, yBCD, xCD, yCD, xD, yD); } } /*NOTREACHED*/ /* To make ANSI-C-comnpiler happy (RMz): */ return(0); } /* :h3.TOOBIG() - Macro to Test if a Coordinate is Too Big to Bezier SubDivide Normally Intermediate values in the Bezier subdivision are 8 times bigger than the starting values. If this overflows, a 'long', we are in trouble: */ #define BITS (sizeof(LONG)*8) #define HIGHTEST(p) (((p)>>(BITS-4)) != 0) /* includes sign bit */ #define TOOBIG(xy) ((xy < 0) ? HIGHTEST(-xy) : HIGHTEST(xy)) /* :h3.StepBezier() - Produce Run Ends for a Bezier Curve This is the entry point called from outside the module. */ struct segment *StepBezier(R, xA, yA, xB, yB, xC, yC, xD, yD) struct region *R; /* Region under construction or NULL */ fractpel xA,yA; /* A control point */ fractpel xB,yB; /* B control point */ fractpel xC,yC; /* C control point */ fractpel xD,yD; /* D control point */ { struct bezierinfo Info; Info.region = R; Info.origin.x = xA; Info.origin.y = yA; xB -= xA; xC -= xA; xD -= xA; yB -= yA; yC -= yA; yD -= yA; if ( TOOBIG(xB) || TOOBIG(yB) || TOOBIG(xC) || TOOBIG(yC) || TOOBIG(xD) || TOOBIG(yD) ) abort("Beziers this big not yet supported", 3); return(StepBezierRecurse(&Info, (fractpel) 0, (fractpel) 0, xB, yB, xC, yC, xD, yD)); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/fontmisc.h0000664000175000017500000000344111742726711023320 0ustar uwabamiuwabami/* * $XConsortium: fontmisc.h,v 1.5 91/05/12 16:15:48 rws Exp $ * * Copyright 1991 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, MIT X Consortium */ #ifndef _FONTMISC_H_ #define _FONTMISC_H_ #ifdef XSERVER #include "Xfuncs.h" #endif typedef unsigned char *pointer; /* To suppress gcc-warning (11/25/97, RMz) */ #ifndef T1DELETE_C typedef int Bool; #endif #ifndef X_PROTOCOL typedef unsigned long Atom; typedef unsigned long XID; #endif #ifndef LSBFirst #define LSBFirst 0 #define MSBFirst 1 #endif #ifndef None #define None 0l #endif #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif extern char *NameForAtom (); #define lowbit(x) ((x) & (~(x) + 1)) #define assert(x) #endif /* _FONTMISC_H_ */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/objects.c0000664000175000017500000012127211742726711023125 0ustar uwabamiuwabami/* $XConsortium: objects.c,v 1.5 92/03/20 15:56:06 eswu Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* OBJECTS CWEB V0025 ******** */ /* :h1.OBJECTS Module - TYPE1IMAGER Objects Common Routines This module defines and implements the C structures that represent objects in the TYPE1IMAGER. All common routines for manipulating these objects are defined in this module. Specific routines for specific objects are defined in the modules that deal with that object type. &author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) :h3.Include Files The included files are: */ #define GLOBALS 1 /* see :hdref refid=debugvar. */ /* The following two includes are C standards; we include them because we use 'toupper' and the 'str'-type functions in this module. Potentially these may be defined as macros; if these ".h" files do not exist on your system it is a pretty safe bet that these are external entry points and you do do not need to include these header files. */ #include "types.h" #include #include #include #include #include /* override incorrect system functions; for example you might define a macro for "strcpy" that diverts it to "my_strcpy". */ /* moved these includes from above the */ /* was included first (it contains com- */ /* piler defines). dsr 081291 */ #include "objects.h" #include "spaces.h" #include "paths.h" #include "regions.h" #include "fonts.h" #include "pictures.h" #include "strokes.h" #include "cluts.h" static char *TypeFmt(); static int ObjectPostMortem(); /* :h3.The "pointer" Macro - Define a Generic Pointer Sadly, many compilers will give a warning message when a pointer to one structure is assigned to a pointer to another. We've even seen some that give severe errors (when the wrong pointer type is used as an initializer or returned from a function). TYPE1IMAGER has routines like Dup and Allocate that are perfectly willing to duplicate or allocate any of a number of different types of structures. How to declare them in a truely portable way? Well, there is no single good answer that I've found. You can always beg the question and "cast" everything. I find this distracting and the resulting code ugly. On the other hand, we have found at least one compiler that will accept "void *" as a generic pointer that can assigned to any other pointer type without error or warning (apparently this is also the ANSI standard). So, we define "void *" to be a generic pointer. (You might have to change this for your compiler; the "ifndef" allows the change to be made on the command line if you want.) :i1/portability assumptions/ */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Functions Provided to the TYPE1IMAGER User This module provides the following TYPE1IMAGER entry points: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Note that entry points that are intended for use external to TYPE1IMAGER begin with the characters :q/xi/. Macros are used to make the names more mnemonic. */ /* :h3.Functions Provided to Other Modules This module provides the following functions for other modules: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Note that entry points that intended for use within TYPE1IMAGER, but which must be global because they are used across module boundaries, begin with the characters :q/I_/. Macros are used to make the names more mnemonic. Entry points totally within a module use mnemonic names and are declared :hp2/static/. One of the compilers I used had a bug when static functions were passed as addresses. Thus, some functions which are logically "static" are not so declared. Note also the trick of declaring routines, like Consume(), with a variable number of arguments. To avoid the restrictions on variable numbers of arguments in the macro processor, we just replace the text 'Consume' with 'I_Consume'. */ /* :h3.Macros Provided to Other Modules This is the module where we define all the useful constants like TRUE, FALSE, and NULL, and simple expressions like TYPE1_MIN(), TYPE1_MAX(), and TYPE1_ABS(). We might as well get to it right here: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Notice that upper case is used for constant values and macro definitions. I generally follow that convention. Many more global macros are defined later in this module. */ /* :h2.Basic TYPE1IMAGER Object Structure All TYPE1IMAGER objects which are available to the user have a common header. This header is defined below: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* The following define is an attempt to centralize the definition of the common xobject data shared by structures that are derived from the generic xobject structure. For example, the structure font, defined in fonts.shr : &code. struct font { char type; char flag; int references; ... other data types & structs ... } &ecode. would now be defined as: &code. struct font { XOBJ_COMMON ... other data types & structs ... } &ecode. Thus we have a better-structured inheritance mechanism. 3-26-91 PNM */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Object Type Definitions These constants define the values which go in the 'type' field of an TYPE1IMAGER object structure: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Flag Byte Definitions Many programmers define flag bits as a mask (for example, 0x04), and test, set, and reset them as follows: &code. if ((flag & PERMANENT) != 0) flag |= PERMANENT; flag &= &inv.PERMANENT; :exmp. I favor a style where the 'if' statement can ask a question: &code. if (ISPERMANENT(flag)) flag |= ISPERMANENT(ON); flag &= &inv.ISPERMANENT(ON); :exmp. This said, we now define two bit settings of the flag byte of the object. "ISPERMANENT" will be set by the user, when he calls Permanent(). "ISIMMORTAL" will be used for compiled-in objects that we don't want the user to ever destroy. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Flag bit definitions that apply to all objects are assigned starting with the least significant (0x01) bit. Flag bit definitions specific to a certain object type are assigned starting with the most significant (0x80) bit. We hope they never meet. */ /* :h3 id=preserve.PRESERVE() Macro Occasionally an TYPE1IMAGER operator is implemented by calling other TYPE1IMAGER operators. For example, Arc2() calls Conic(). When we call more than one operator as a subroutine, we have to be careful of temporary objects. A temporary object will be consumed by the subroutine operator and then is no longer available for the caller. This can be prevented simply by bumping a temporary object's reference count. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.RefRoll() Macro to Detect References Count Rollover The following macro is designed to check for reference count rollover. A return value of TRUE means rollover has not occurred; a return value of FALSE means we cannot increment the reference count. Note also that those functions that use this macro must decrement the reference count afterwards. 3-26-91 PNM */ #define RefRoll(obj) (++(obj)->references > 0) /* :h2.TYPE1IMAGER Object Functions :h3.LONGCOPY() - Macro to Copy "long" Aligned Data Copying arbitrary bytes in C is a bit of a problem. "strcpy" can't be used, because 0 bytes are special-cased. Most environments have a routine "memcopy" or "bcopy" or "bytecopy" that copies memory containing zero bytes. Sadly, there is no standard on the name of such a routine, which makes it impossible to write truely portable code to use it. It turns out that TYPE1IMAGER, when it wants to copy data, frequently knows that both the source and destination are aligned on "long" boundaries. This allows us to copy by using "long *" pointers. This is usually very efficient on almost all processors. Frequently, it is more efficient than using general-purpose assembly language routines. So, we define a macro to do this in a portable way. "dest" and "source" must be long-aligned, and "bytes" must be a multiple of "sizeof(long)": */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Allocate() - Allocating a Memory Block Allocate returns a pointer to memory object that is a copy of the template passed (if any). In addition, extra bytes may be allocated contiguously with the object. (This may be useful for variable size objects such as edge lists. See :hdref refid=regions..) Allocate() always returns a non-immortal object, even if the template is immortal. Therefore a non-NULL template must have a "flag" byte. If the template is NULL, then 'size' bytes are cleared to all NULLs. If the template is non-NULL, a new object is allocated in memory. It therefore seems logical that its reference count field should be set to 1. So, a nun-NULL template must also have a "references" field. PNM 3-26-91 */ /* to pacify gcc we put the externals here ... */ extern struct XYspace *USER; extern jmp_buf stck_state; struct xobject *t1_Allocate(size, template, extra) /* non-ANSI; type checking was too strict */ register int size; /* number of bytes to allocate & initialize */ register struct xobject *template; /* example structure to allocate */ register int extra; /* any extra uninitialized bytes needed contiguously */ { register struct xobject *r; /* * round up 'size' and 'extra' to be an integer number of 'long's: */ size = (size + sizeof(LONG) - 1) & -sizeof(LONG); extra = (extra + sizeof(LONG) - 1) & -sizeof(LONG); if (size + extra <= 0) abort("Non-positive allocate?", 15); r = (struct xobject *) malloc(size + extra); while (r == NULL) { if (!GimeSpace()) { IfTrace1(TRUE, "malloc attempted %d bytes.\n", size + extra); abort("We have REALLY run out of memory", 16); } r = (struct xobject *) malloc(size + extra); } /* * copy the template into the new memory: */ if (template != NULL) { /* Added references count decrement if template is not permanent. This is for the case where Allocate is called by a Dupxxxx function, which was in turn called by Unique(). (PNM) */ if (!ISPERMANENT(template->flag)) --template->references; LONGCOPY(r, template, size); r->flag &= ~(ISPERMANENT(ON) | ISIMMORTAL(ON)); /* added reference field 3-2-6-91 PNM */ r->references = 1; } else { register char **p1; for (p1=(char **)r; size > 0; size -= sizeof(char *)) *p1++ = NULL; } if (MemoryDebug > 1) { register int *L; L = (int *) r; IfTrace4(TRUE, "Allocating at %p: %x %x %x\n", L, L[-1], L[0], L[1]); } return(r); } /* :h3.Free() - Frees an Allocated Object This routine makes a sanity check to make sure the "type" field of the standard object structure has not been cleared. If the object is not a standard structure, then the macro "NonObjectFree" is available that does not perform this check. In either case, the object must not be the NULL pointer. This preserves portability, as the C system Xfree() will not always accept NULL. */ void Free(obj) /* non-ANSI to avoid overly strict type checking */ register struct xobject *obj; /* structure to free */ { if (obj->type == INVALIDTYPE) abort("Free of already freed object?", 17); obj->type = INVALIDTYPE; if (MemoryDebug > 1) { register int *L; L = (int *) obj; IfTrace4(TRUE,"Freeing at %p: %x %x %x\n", L, L[-1], L[0], L[1]); } free(obj); } /* :h3.Permanent() - Makes an Object Permanent Real simple--just set a flag. Every routine that consumes its objects (which is almost every user entry) must check this flag, and not consume the object if it is set. If a temporary object is made permanent, and there is more than one reference to it, we must first Copy() it, then set the ISPERMANENT flag. Note also that the reference count must be incremented when an object is changed from temporary to permanent (see the ISUNIQUE macro). Note that the purpose of this function is to convert an object into a permanent object: If it was permanent to begin with, we do nothing; If it was temporary and unique, we set the PERMANENT flag and increment the reference count; If it was temporary and nonunique, we must make a unique Copy(), set the PERMANENT flag, and set the reference count to 2. We must also decrement the original object's reference count, because what we have done is to change one of the old temporary handles to a permanent one. 3-26-91 PNM */ struct xobject *t1_Permanent(obj) /* non-ANSI to avoid overly strict type checking */ register struct xobject *obj; /* object to be made permanent */ { IfTrace1((MustTraceCalls),"Permanent(%p)\n", obj); if ( (obj != NULL) && ( !(ISPERMANENT(obj->flag)) ) ) { /* there is a non-NULL, temporary object to be made permanent. If there are multiple references to this object, first get a new COPY(). Note also that we have to decrement the reference count if we do a Copy() here, because we are consuming the temporary argument passed, and returning a unique, permanent one. */ if ( obj->references > 1) { obj = Copy(obj); } /* now set the permanent flag, and increment the reference count, since a temporary object has now become permanent. */ obj->references++; obj->flag |= ISPERMANENT(ON); } return(obj); } /* :h3.Temporary() - Undoes the Effect of "Permanent()" This simply resets the "ISPERMANENT" flag. If a permanent object is made temporary, and there is more than one reference to it, we must first Copy() it, then reset the ISPERMANENT flag. However, if the permanent object has obly one reference, we need only decrement the reference count ( and reset the flag). Note that this function, in the case of a PERMANENT argument, basically converts the PERMANENT handle to a TEMPORARY one. Thus, in the case of a nonunique, permanent argument passed, we not only make a Copy(), we also decrement the reference count, to reflect the fact that we have lost a permanent handle and gained a temporary one. PNM 3-2-6-91 */ struct xobject *xiTemporary(obj) /* non-ANSI to avoid overly strict type checking */ register struct xobject *obj; /* object to be made permanent */ { IfTrace1((MustTraceCalls),"Temporary(%p)\n", obj); if (obj != NULL) { /* if it's already temporary, there's nothing to do. */ if ISPERMANENT(obj->flag) { /* if there are multiple references to this object, get a Copy we can safely alter. Recall that the reference count is incremented for permanent objects. Recall further that Copy returns an object with the same flag state and a reference count of 2 (for PERMANENT objects). Thus, regardless of whether or not we need to copy a permanent object, we still decrement its reference count and reset the flag. */ if (obj->references != 2 || ISIMMORTAL(obj->flag)) { /* not unique; consume handle, get a temporary Copy! */ obj = Copy(obj); } /* else decrement the reference count (since it's going from permanent to temporary) and clear the flag. */ else { obj->references--; obj->flag &= ~ISPERMANENT(ON); } } } return(obj); } /* :h3.Dup() - Duplicate an Object Dup will increment the reference count of an object, only making a Copy() if needed. Note that Dup() retains the state of the permanent flag. 3-26-91 PNM */ struct xobject *t1_Dup(obj) /* non-ANSI avoids overly strict type checking */ register struct xobject *obj; /* object to be duplicated */ { register char oldflag; /* copy of original object's flag byte */ IfTrace1((MustTraceCalls),"Dup(%p)\n", obj); if (obj == NULL) return(NULL); /* An immortal object must be Copy'ed, so that we get a mortal copy of it, since we try not to destroy immortal objects. */ if (ISIMMORTAL(obj->flag)) return(Copy(obj)); /* if incrementing the reference count doesn't cause the count to wrap, simply return the object with the count bumped. Note that the RefRoll macro increments the count to perform the rollover check, so we must decrement the count. */ if (RefRoll(obj)) return(obj); /* that didn't work out, so put the count back and call Copy(). */ --obj->references; oldflag = obj->flag; obj = Copy(obj); if (ISPERMANENT(oldflag)) obj = Permanent(obj); return(obj); } /* :h3.Copy() - Make a New Copy of an Object This is the generic Copy() where the object type is unknown. There are specific Copyxxx functions for known object types. Copy will create a NEW temporary object, and WILL NOT simply bump the reference count. Sometimes duplicating an object is just as simple as Allocating with it as a template. But other objects are complicated linked lists. So, we let each module provide us a routine (or macro) that duplicates the objects it knows about. */ struct xobject *t1_Copy(obj) register struct xobject *obj; /* object to be Copy'ed */ { if (obj == NULL) return(NULL); if (ISPATHTYPE(obj->type)) obj = (struct xobject *) CopyPath((struct segment *)obj); else switch (obj->type) { case SPACETYPE: obj = (struct xobject *) CopySpace(obj); break; case FONTTYPE: obj = (struct xobject *) CopyFont(obj); break; case REGIONTYPE: obj = (struct xobject *) CopyRegion(obj); break; case PICTURETYPE: obj = (struct xobject *) CopyPicture(obj); break; case LINESTYLETYPE: obj = (struct xobject *) CopyLineStyle(obj); break; case STROKEPATHTYPE: obj = (struct xobject *) CopyStrokePath(obj); break; case CLUTTYPE: obj = (struct xobject *) CopyCLUT(obj); break; default: return(ArgErr("Copy: invalid object", obj, NULL)); } return(obj); } /* :h3.Destroy() - Destroys an Object This can get complicated. Just like with Copy(), we let the experts handle it. */ struct xobject *Destroy(obj) /* non-ANSI avoids overly strict type checking */ register struct xobject *obj; /* object to be destroyed */ { IfTrace1((MustTraceCalls),"Destroy(%p)\n", obj); if (obj == NULL) return(NULL); if (ISIMMORTAL(obj->flag)) { IfTrace1(TRUE,"Destroy of immortal object %p ignored\n", obj); return(NULL); } if (ISPATHTYPE(obj->type)) KillPath((struct segment *)obj); else { switch (obj->type) { case REGIONTYPE: KillRegion(obj); break; case SPACETYPE: KillSpace(obj); break; case LINESTYLETYPE: KillLineStyle(obj); break; case FONTTYPE: KillFont(obj); break; case PICTURETYPE: /* KillPicture macro removed from sources (RMz, 2001-04-01) KillPicture(obj); */ break; case STROKEPATHTYPE: KillStrokePath(obj); break; case CLUTTYPE: KillCLUT(obj); break; default: return(ArgErr("Destroy: invalid object", obj, NULL)); } } return(NULL); } /* :h2.Generally Useful Macros :h3.FOLLOWING() - Macro to Point to the Data Following a Structure There are several places in TYPE1IMAGER where we will allocate variable data that belongs to a structure immediately after that structure. This is a performance technique, because it reduces the number of trips we have to take through Xalloc() and Xfree(). It turns out C has a very convenient way to point past a structure--if 'p' is a pointer to a structure, 'p+1' is a pointer to the data after it. This behavior of C is somewhat startling and somewhat hard to follow, if you are not used to it, so we define a macro to point to the data following a structure: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.TYPECHECK() - Verify the Type of an Argument This macro tests the type of an argument. If the test fails, it consumes any other arguments as necessary and causes the imbedding routine to return the value 'whenBAD'. Note that the consumeables list should be an argument list itself, for example (0) or (2,A,B). See :hdref refid=consume. below. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.ARGCHECK() - Perform an Arbitrary Check on an Argument This macro is a generalization of TYPECHECK to take an arbitrary predicate. If the error occurs (i.e., the predicate is true), the arbitrary message 'msg' is returned. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.TYPENULLCHECK() - Extension of TYPECHECK() for NULL arguments Many routines allow NULLs to be passed as arguments. 'whenBAD' will be returned in this case, too. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.MAKECONSUME() - Create a "Consume"-type Macro Consuming an object means destroying it if it is not permanent. This logic is so common to all the routines, that it is immortalized in this macro. For example, ConsumePath(p) can be simply defined as MAKECONSUME(p,KillPath(p)). In effect, this macro operates on a meta-level. :i1/consuming objects/ */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.MAKEUNIQUE() - Create a "Unique"-type Macro Many routines are written to modify their arguments in place. Thus, they want to insure that they duplicate an object if it is permanent. This is called making an object "unique". For example, UniquePath(p) can be simply defined as MAKEUNIQUE(p,DupPath(p)). :i1/unique objects/ */ /*SHARED LINE(S) ORIGINATED HERE*/ /* An object is unique (and directly alterable) if there is only one reference to it, and it is not permanent (in which case we increment the reference count, so we don't have to check the permanent bit). 3-26-91 PNM Note the rules for making a unique object: &drawing. IF (obj->references = 1) return(obj); ELSE (references > 1) IF (ISPERMANENT(obj->flag)) return(Dupxxx(obj)); ELSE (nonunique, temporary object!) obj->references--; return(Dupxxx(obj)); &edrawing. If we must make a Copy of a nonunique, temporary object, we decrement reference count of the original object! */ /* :h3.Unique() - Make a Unique Object Here is a generic 'Unique' function if the object type is not known. Why didn't we build it with the MAKEUNIQUE macro, you ask? Well, we used to, but there is at least one damn compiler in the world that raises errors if the types of an "(a) ? b : c" expression do not match. Also, when we changed Dup() to retain the permanent/temporary flag, we wanted to make sure "Unique" always returned a temporary object. Note that we cannot use Dup() to create a copy of the object in question, because Dup() may simply bump the reference count, and not return a unique copy to us. That is why we use t1_Copy(). The purpose of this function is to make sure we have a copy of an object that we can safely alter: :ol. :li.If we have a unique, temporary object, we simply return the argument. :li.If we have a nonunique, temporary object, we have to make a new copy of it, and decrement the reference count of the original object, to reflect the fact that we traded temporary handles. :li.If we have a permanent object, we make a temporary copy of it, but we do not decrement the reference count of the original permanent object, because permanent objects, by definition, are persistent. 3-2-6-91 PNM :eol. */ struct xobject *t1_Unique(obj) struct xobject *obj; { /* if the original object is not already unique, make a unique copy...Note also that if the object was not permanent, we must consume the old handle! 3-26-91 PNM NOTE : consumption of the old handle moved to Allocate. 4-18-91 */ if (!obj || obj->references == 1) return(obj); obj = Copy(obj); /* and make sure we return a temporary object ! */ if (ISPERMANENT(obj->flag)) { obj->flag &= ~ISPERMANENT(ON); obj->references--; } return(obj); } /* :h2.Initialization, Error, and Debug Routines :h3 id=debugvar.Declarations for Debug Purposes We declare all the debug flags here. Some link editors make the not unreasonable restriction that only one module may declare and initialize global variables; all the rest must declare the variable 'extern'. This is logical, but is somewhat awkward to implement with C include files. We solve the problem by temporarily making the name 'extern' a null name if GLOBALS is defined. (GLOBALS is only defined in this OBJECTS module.) Since 'externs' can't be initialized, we have to handle that with #defines too. :i1/GLOBALS (&#define.)/ */ /*SHARED LINE(S) ORIGINATED HERE*/ static char *ErrorMessage = NULL; /* :h3.Pragmatics() - Set/Reset Debug Flags We provide a controlled way for the TYPE1IMAGER user to set and reset our debugging and tracing: */ void Pragmatics(username, value) char *username; /* name of the flag */ int value; /* value to set it to */ { register char *p; /* temporary loop variable */ #define NAMESIZE 40 char name[NAMESIZE]; /* buffer to store my copy of 'username' */ if (strlen(username) >= NAMESIZE) abort("Pragmatics name too large", 18); strcpy(name, username); for (p = name; *p != '\0'; p++) *p = toupper(*p); if (!strcmp(name, "ALL")) MustTraceCalls = InternalTrace = /* MustCrash = */ LineIOTrace = value; else if (!strcmp(name, "LINEIOTRACE")) LineIOTrace = value; else if (!strcmp(name, "TRACECALLS")) MustTraceCalls = value; else if (!strcmp(name, "CHECKARGS")) MustCheckArgs = value; else if (!strcmp(name, "PROCESSHINTS")) ProcessHints = value; else if (!strcmp(name, "SAVEFONTPATHS")) SaveFontPaths = value; else if (!strcmp(name, "CRASTERCOMPRESSIONTYPE")) CRASTERCompressionType = value; else if (!strcmp(name, "CRASHONUSERERROR")) MustCrash = value; else if (!strcmp(name, "DEBUG")) StrokeDebug = SpaceDebug = PathDebug = ConicDebug = LineDebug = RegionDebug = MemoryDebug = FontDebug = HintDebug = ImageDebug = OffPageDebug = value; else if (!strcmp(name, "CONICDEBUG")) ConicDebug = value; else if (!strcmp(name, "LINEDEBUG")) LineDebug = value; else if (!strcmp(name, "REGIONDEBUG")) RegionDebug = value; else if (!strcmp(name, "PATHDEBUG")) PathDebug = value; else if (!strcmp(name, "SPACEDEBUG")) SpaceDebug = value; else if (!strcmp(name, "STROKEDEBUG")) StrokeDebug = value; else if (!strcmp(name, "MEMORYDEBUG")) MemoryDebug = value; else if (!strcmp(name, "FONTDEBUG")) FontDebug = value; else if (!strcmp(name, "HINTDEBUG")) HintDebug = value; else if (!strcmp(name, "IMAGEDEBUG")) ImageDebug = value; else if (!strcmp(name, "OFFPAGEDEBUG")) OffPageDebug = value; #ifdef MC68000 /* The following pragmatics flag turns on or off instruction histograming for performance analysis. It is only defined in the Delta card environment. */ else if (!strcmp(name, "PROFILE")) { if (value) StartProfile(); else StopProfile(); } #endif /* GimeSpace() is define as false ... */ /* else if (!strcmp(name, "FLUSHCACHE")) { while (GimeSpace()) { ; } } */ else if (!strcmp(name, "CACHEDCHARS")) CachedChars = (value <= 0) ? 1 : value; else if (!strcmp(name, "CACHEDFONTS")) CachedFonts = (value <= 0) ? 1 : value; else if (!strcmp(name, "CACHEBLIMIT")) CacheBLimit = value; else if (!strcmp(name, "CONTINUITY")) Continuity = value; else { printf("Pragmatics flag = '%s'\n", name); ArgErr("Pragmatics: flag not known", NULL, NULL); } return; } /* :h3.Consume() - Consume a List of Arguments This general purpose routine is provided in the case where the object type(s) to be consumed are unknown or not yet verified, and/or it is not known whether the object is permanent. If the type of the argument is known, it is faster to directly consume that type, for example, ConsumeRegion() or ConsumePath(). Furthermore, if it is already known that the object is temporary, it is faster to just kill it rather than consume it, for example, KillSpace(). */ void Consume(n, obj1, obj2, obj3) /* non-ANSI avoids overly strict type checking */ int n; struct xobject *obj1,*obj2,*obj3; { switch(n) { case 0: return; case 1: if (obj1 != NULL && !ISPERMANENT(obj1->flag)) Destroy(obj1); return; case 2: if (obj1 != NULL && !ISPERMANENT(obj1->flag)) Destroy(obj1); if (obj2 != NULL && !ISPERMANENT(obj2->flag)) Destroy(obj2); return; case 3: if (obj1 != NULL && !ISPERMANENT(obj1->flag)) Destroy(obj1); if (obj2 != NULL && !ISPERMANENT(obj2->flag)) Destroy(obj2); if (obj3 != NULL && !ISPERMANENT(obj3->flag)) Destroy(obj3); return; default: abort("Consume: too many objects", 19); } } /* :h3.TypeErr() - Handles "Invalid Object Type" Errors */ struct xobject *TypeErr(name, obj, expect, ret) /* non-ANSI avoids overly strict type checking */ char *name; /* Name of routine (for error message) */ struct xobject *obj; /* Object in error */ int expect; /* type expected */ struct xobject *ret; /* object to return to caller */ { static char typemsg[80]; if (MustCrash) LineIOTrace = TRUE; sprintf(typemsg, "Wrong object type in %s; expected %s, found %s.\n", name, TypeFmt(expect), TypeFmt(obj->type)); IfTrace0(TRUE,typemsg); ObjectPostMortem(obj); if (MustCrash) abort("Terminating because of CrashOnUserError...", 20); else ErrorMessage = typemsg; /* changed ISPERMANENT to ret->references > 1 3-26-91 PNM */ if (ret != NULL && (ret->references > 1)) ret = Dup(ret); return(ret); } /* :h4.TypeFmt() - Returns Pointer to English Name of Object Type This is a subroutine of TypeErr(). */ static char *TypeFmt(type) int type; /* type field */ { char *r; if (ISPATHTYPE(type)) if (type == TEXTTYPE) r = "path or region (from TextPath)"; else r = "path"; else { switch (type) { case INVALIDTYPE: r = "INVALID (previously consumed?)"; break; case REGIONTYPE: r = "region"; break; case SPACETYPE: r = "XYspace"; break; case LINESTYLETYPE: r = "linestyle"; break; case FONTTYPE: r = "font"; break; case PICTURETYPE: r = "picture"; break; case STROKEPATHTYPE: r = "path (from StrokePath)"; break; default: r = "UNKNOWN"; break; } } return(r); } /* :h4.ObjectPostMortem() - Prints as Much as We Can About a Bad Object This is a subroutine of TypeErr() and ArgErr(). */ /*ARGSUSED*/ static int ObjectPostMortem(obj) /* non-ANSI avoids overly strict type checking */ register struct xobject *obj; { Pragmatics("Debug", 10); IfTrace2(TRUE,"Bad object is of %s type %p\n", TypeFmt(obj->type), obj); IfTrace0((obj == (struct xobject *) USER), "Suspect that InitImager() was omitted.\n"); Pragmatics("Debug", 0); /* We return a value to make ANSI-compiler happy */ return(0); } /* :h3.ArgErr() - Invalid Argument Passed to a Routine A common routine to report argument errors. It is usually called is returned to the caller in case MustCrash is FALSE and ArgErr returns to its caller. */ struct xobject *ArgErr(string, obj, ret) /* non-ANSI avoids overly strict type checking */ char *string; /* description of error */ struct xobject *obj; /* object, if any, that was in error */ struct xobject *ret; /* object returned to caller or NULL */ { if (MustCrash) LineIOTrace = TRUE; IfTrace1(TRUE,"ARGUMENT ERROR-- %s.\n", string); if (obj != NULL) ObjectPostMortem(obj); if (MustCrash) abort("Terminating because of CrashOnUserError...", 21); else ErrorMessage = string; return(ret); } /* :h3.abort() - Crash Due to Error We divide by zero, and if that doesn't work, call exit(), the results of which is system dependent (and thus is part of the Hourglass required environment). */ /* RMz: We now do a longjmp in order to be able to recover from the error */ /*ARGSUSED*/ void abort(string, no) char *string; int no; { LineIOTrace = TRUE; TraceClose(); longjmp( stck_state, no); } /* By RMz: Return the abort string to t1lib! */ char *t1_get_abort_message( int number) { static char *err_msgs[]={ "DLdiv: dividend too large", /* 1 */ "divide algorithm error", /* 2 */ "Beziers this big not yet supported", /* 3 */ "ComputeHint: invalid orientation", /* 4 */ "ComputeHint: invalid hinttype", /* 5 */ "ComputeHint: invalid orientation", /* 6 */ "ProcessHint: invalid label", /* 7 */ "ProcessHint: label is not in use", /* 8 */ "ProcessHint: invalid label", /* 9 */ "ProcessHint: invalid adjusttype", /* 10 */ "bad subpath chain", /* 11 */ "ImpliedHorizontalLine: why ask?", /* 12 */ "disjoint subpath?", /* 13 */ "unable to fix subpath break?", /* 14 */ "Non-positive allocate?", /* 15 */ "We have REALLY run out of memory", /* 16 */ "Free of already freed object?", /* 17 */ "Pragmatics name too large", /* 18 */ "Consume: too many objects", /* 19 */ "Terminating because of CrashOnUserError...", /* 20 */ "Terminating because of CrashOnUserError...", /* 21 */ "Fundamental TYPE1IMAGER assumptions invalid in this port", /* 22 */ "Reverse: bad path segment", /* 23 */ "UnClose: no LASTCLOSED", /* 24 */ "PathTransform: invalid segment", /* 25 */ "QueryPath: unknown segment", /* 26 */ "QueryBounds: unknown type", /* 27 */ "KillRegion: negative reference count", /* 28 */ "newedge: height not positive", /* 29 */ "Interior: path type error", /* 30 */ "Unwind: uneven edges", /* 31 */ "negative sized edge?", /* 32 */ "splitedge: above top of list", /* 33 */ "splitedge: would be null", /* 34 */ "null splitedge", /* 35 */ "vertjoin not disjoint", /* 36 */ "SwathUnion: 0 height swath?", /* 37 */ "discard(): ran off end", /* 38 */ "UnJumble: unpaired edge?", /* 39 */ "Tighten: existing edge bound was bad", /* 40 */ "Tighten: existing region bound was bad", /* 41 */ "EDGE ERROR: non EDGETYPE in list", /* 42 */ "EDGE ERROR: overlapping swaths", /* 43 */ "Context: QueryDeviceState didn't work", /* 44 */ "QueryDeviceState returned invalid orientation", /* 45 */ "Context: out of them", /* 46 */ "MatrixInvert: can't", /* 47 */ "xiStub called", /* 48 */ "Illegal access type1 abort() message" /* 49 */ }; /* no is valid from 1 to 48 */ if ( (number<1)||(number>48)) number=49; return( err_msgs[number-1]); } /* :h3.REAL Miscellaneous Stuff :h4.ErrorMsg() - Return the User an Error Message */ char *ErrorMsg() { register char *r; r = ErrorMessage; ErrorMessage = NULL; return(r); } /* :h4.InitImager() - Initialize TYPE1IMAGER We check that a short is 16 bits and a long 32 bits; we have made those assumptions elsewhere in the code. (This is almost a C standard, anyway.) Note that TYPE1IMAGER makes no assumptions about the size of an 'int'! :i1/portability assumptions/ */ void InitImager() { /* Check to see if we have been using our own malloc. If so,*/ /* Undef malloc so that we can get to the system call. */ /* All other calls to malloc are defined to Xalloc. */ if (sizeof(SHORT) != 2 || sizeof(LONG) != 4) abort("Fundamental TYPE1IMAGER assumptions invalid in this port", 22); InitSpaces(); InitFonts(); InitFiles(); /* In some environments, constants and/or exception handling need to be */ LibInit(); } /* :h4.TermImager() - Terminate TYPE1IMAGER This only makes sense in a server environment; true TYPE1IMAGER needs do nothing. */ void TermImager() { return; } /* :h4.reportusage() - A Stub to Get a Clean Link with Portable PMP */ void reportusage( void) { return; } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/scanfont.c0000664000175000017500000012675211742726711023317 0ustar uwabamiuwabami/* $XConsortium: scanfont.c,v 1.9 92/07/07 17:14:56 gildea Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ #include #include #include "t1stdio.h" #include "util.h" #include "token.h" #include "fontfcn.h" #include "blues.h" #include "../t1lib/t1misc.h" /* #define DEBUG_SCANFONT */ static int rc; static boolean InPrivateDict; static boolean WantFontInfo; static boolean TwoSubrs; static psobj inputFile; static psobj filterFile; static psobj *inputP; extern int T1Getc(F_FILE * ); extern int T1Ungetc( int,F_FILE *); extern int SearchDictName( psdict *dictP, psobj *keyP); extern void T1io_setblocklen( long len); /* functions from util.c */ extern void objFormatInteger(psobj *objP, int value); extern void objFormatReal(psobj *objP, float value); extern void objFormatBoolean(psobj *objP, boolean value); extern void objFormatEncoding( psobj *objP, int length, psobj *valueP); extern void objFormatArray( psobj *objP, int length, psobj *valueP); extern void objFormatString( psobj *objP, int length, char *valueP); extern void objFormatName( psobj *objP, int length, char *valueP); extern void objFormatFile( psobj *objP, FILE *valueP); /**********************************************************************/ /* Init_BuiltInEncoding() */ /* */ /* Initializes the StandardEncoding. */ /* */ /**********************************************************************/ typedef struct /* Builtin Standard Encoding */ { int index; char *name; } EncodingTable; char not_def[]=".notdef"; static EncodingTable StdEnc[] = { {040 , "space"}, {041 , "exclam"}, {042 , "quotedbl"}, {043 , "numbersign"}, {044 , "dollar"}, {045 , "percent"}, {046 , "ampersand"}, {047 , "quoteright"}, {050 , "parenleft"}, {051 , "parenright"}, {052 , "asterisk"}, {053 , "plus"}, {054 , "comma"}, {055 , "hyphen"}, {056 , "period"}, {057 , "slash"}, {060 , "zero"}, {061 , "one"}, {062 , "two"}, {063 , "three"}, {064 , "four"}, {065 , "five"}, {066 , "six"}, {067 , "seven"}, {070 , "eight"}, {071 , "nine"}, {072 , "colon"}, {073 , "semicolon"}, {074 , "less"}, {075 , "equal"}, {076 , "greater"}, {077 , "question"}, {0100 , "at"}, {0101 , "A"}, {0102 , "B"}, {0103 , "C"}, {0104 , "D"}, {0105 , "E"}, {0106 , "F"}, {0107 , "G"}, {0110 , "H"}, {0111 , "I"}, {0112 , "J"}, {0113 , "K"}, {0114 , "L"}, {0115 , "M"}, {0116 , "N"}, {0117 , "O"}, {0120 , "P"}, {0121 , "Q"}, {0122 , "R"}, {0123 , "S"}, {0124 , "T"}, {0125 , "U"}, {0126 , "V"}, {0127 , "W"}, {0130 , "X"}, {0131 , "Y"}, {0132 , "Z"}, {0133 , "bracketleft"}, {0134 , "backslash"}, {0135 , "bracketright"}, {0136 , "asciicircum"}, {0137 , "underscore"}, {0140 , "quoteleft"}, {0141 , "a"}, {0142 , "b"}, {0143 , "c"}, {0144 , "d"}, {0145 , "e"}, {0146 , "f"}, {0147 , "g"}, {0150 , "h"}, {0151 , "i"}, {0152 , "j"}, {0153 , "k"}, {0154 , "l"}, {0155 , "m"}, {0156 , "n"}, {0157 , "o"}, {0160 , "p"}, {0161 , "q"}, {0162 , "r"}, {0163 , "s"}, {0164 , "t"}, {0165 , "u"}, {0166 , "v"}, {0167 , "w"}, {0170 , "x"}, {0171 , "y"}, {0172 , "z"}, {0173 , "braceleft"}, {0174 , "bar"}, {0175 , "braceright"}, {0176 , "asciitilde"}, {0241 , "exclamdown"}, {0242 , "cent"}, {0243 , "sterling"}, {0244 , "fraction"}, {0245 , "yen"}, {0246 , "florin"}, {0247 , "section"}, {0250 , "currency"}, {0251 , "quotesingle"}, {0252 , "quotedblleft"}, {0253 , "guillemotleft"}, {0254 , "guilsinglleft"}, {0255 , "guilsinglright"}, {0256 , "fi"}, {0257 , "fl"}, {0261 , "endash"}, {0262 , "dagger"}, {0263 , "daggerdbl"}, {0264 , "periodcentered"}, {0266 , "paragraph"}, {0267 , "bullet"}, {0270 , "quotesinglbase"}, {0271 , "quotedblbase"}, {0272 , "quotedblright"}, {0273 , "guillemotright"}, {0274 , "ellipsis"}, {0275 , "perthousand"}, {0277 , "questiondown"}, {0301 , "grave"}, {0302 , "acute"}, {0303 , "circumflex"}, {0304 , "tilde"}, {0305 , "macron"}, {0306 , "breve"}, {0307 , "dotaccent"}, {0310 , "dieresis"}, {0312 , "ring"}, {0313 , "cedilla"}, {0315 , "hungarumlaut"}, {0316 , "ogonek"}, {0317 , "caron"}, {0320 , "emdash"}, {0341 , "AE"}, {0343 , "ordfeminine"}, {0350 , "Lslash"}, {0351 , "Oslash"}, {0352 , "OE"}, {0353 , "ordmasculine"}, {0361 , "ae"}, {0365 , "dotlessi"}, {0370 , "lslash"}, {0371 , "oslash"}, {0372 , "oe"}, {0373 , "germandbls"}, { 0, 0 } }; /* Encodings changed from static to global since they must be accessible by T1_LoadFont() when reallocating memory. */ psobj *StdEncArrayP = NULL; static psobj *MakeEncodingArrayP(encodingTable) EncodingTable *encodingTable; { int i; psobj *encodingArrayP; encodingArrayP = (psobj *)malloc(256*(sizeof(psobj))); if (!encodingArrayP) return NULL; /* initialize everything to .notdef */ for (i=0; i<256;i++) objFormatName(&(encodingArrayP[i]),7, not_def); for (i=0; encodingTable[i].name; i++) { objFormatName(&(encodingArrayP[encodingTable[i].index]), strlen(encodingTable[i].name), encodingTable[i].name); } return(encodingArrayP); } boolean Init_BuiltInEncoding() { if ( StdEncArrayP != NULL) { /* Note: We should not run into this case because multiple initialization should be caught by T1_InitLib(). */ return FALSE; } StdEncArrayP = MakeEncodingArrayP(StdEnc); if (StdEncArrayP==NULL) return( FALSE); else return( TRUE); } /********************************************************************/ /***================================================================***/ static int getNextValue(valueType) int valueType; { scan_token(inputP); if (tokenType != valueType) { return(SCAN_ERROR); } return(SCAN_OK); } /***================================================================***/ /* This routine will set the global rc if there is an error */ /***================================================================***/ static int getInt() { scan_token(inputP); if (tokenType != TOKEN_INTEGER) { rc = SCAN_ERROR; return(0); } else { return( tokenValue.integer); } } /***================================================================***/ /* * See Sec 10.3 of ``Adobe Type 1 Font Format'' v1.1, * for parsing Encoding. */ static int getEncoding(arrayP) psobj *arrayP; { scan_token(inputP); if ((tokenType == TOKEN_NAME) && ((tokenLength==16) && (!strncmp(tokenStartP,"StandardEncoding",16))) ) { /* Adobe Standard Encoding */ if (tokenLength == 16) arrayP->data.valueP = (char *) StdEncArrayP; else return(SCAN_ERROR); arrayP->len = 256; return(SCAN_OK); } else if ( (tokenType == TOKEN_LEFT_BRACE) || (tokenType == TOKEN_LEFT_BRACKET) ) { /* Array of literal names */ psobj *objP; int i; objP = (psobj *)vm_alloc(256*(sizeof(psobj))); if (!(objP)) return(SCAN_OUT_OF_MEMORY); arrayP->data.valueP = (char *) objP; arrayP->len = 256; for (i=0; i<256; i++, objP++) { scan_token(inputP); if (tokenType != TOKEN_LITERAL_NAME) return(SCAN_ERROR); if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); objFormatName(objP,tokenLength,tokenStartP); } scan_token(inputP); if ( (tokenType == TOKEN_RIGHT_BRACE) || (tokenType == TOKEN_RIGHT_BRACKET) ) return(SCAN_OK); } else { /* Must be sequences of ``dup put" */ psobj *objP; int i; objP = (psobj *)vm_alloc(256*(sizeof(psobj))); if (!(objP)) return(SCAN_OUT_OF_MEMORY); arrayP->data.valueP = (char *) objP; arrayP->len = 256; for (i=0; i<256; i++) objFormatName(objP + i, 7, not_def); while (TRUE) { scan_token(inputP); switch (tokenType) { case TOKEN_NAME: if (tokenLength == 3) { if (strncmp(tokenStartP,"dup",3) == 0) { /* get */ scan_token(inputP); if (tokenType != TOKEN_INTEGER || tokenValue.integer < 0 || tokenValue.integer > 255) return (SCAN_ERROR); i = tokenValue.integer; /* get */ scan_token(inputP); if (tokenType != TOKEN_LITERAL_NAME) return(SCAN_ERROR); if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); objFormatName(objP + i,tokenLength,tokenStartP); /* get "put" */ scan_token(inputP); if (tokenType != TOKEN_NAME) return(SCAN_ERROR); } else if (strncmp(tokenStartP,"def",3) == 0) return (SCAN_OK); } break; case TOKEN_EOF: case TOKEN_NONE: case TOKEN_INVALID: return (SCAN_ERROR); } } } return (SCAN_ERROR); } /***================================================================***/ static int getArray(arrayP) psobj *arrayP; { int N; /* count the items in the array */ psobj *objP; scan_token(inputP); if ( (tokenType != TOKEN_LEFT_BRACE) && (tokenType != TOKEN_LEFT_BRACKET) ) { return(SCAN_ERROR); } /* format the array in memory, save pointer to the beginning */ arrayP->data.valueP = tokenStartP; /* loop, picking up next object, until right BRACE or BRACKET */ N = 0; do { scan_token(inputP); if ( (tokenType == TOKEN_RIGHT_BRACE) || (tokenType == TOKEN_RIGHT_BRACKET) ) { /* save then number of items in the array */ arrayP->len = N; return(SCAN_OK); } /* allocate the space for the object */ objP = (psobj *)vm_alloc(sizeof(psobj)); if (!(objP)) return(SCAN_OUT_OF_MEMORY); /* array is an array of numbers, (real or integer) */ if (tokenType == TOKEN_REAL) { objFormatReal(objP, tokenValue.real); } else if (tokenType == TOKEN_INTEGER) { objFormatInteger(objP, tokenValue.integer); } else return(SCAN_ERROR); N++; } while ( 1>0 ); /* NOTREACHED*/ } /***================================================================***/ /* is not needed */ /* static int getName(nameP) char *nameP; { do { scan_token(inputP); if (tokenType <= TOKEN_NONE) { if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); return(SCAN_ERROR); } } while ((tokenType != TOKEN_NAME) || (0 != strncmp(tokenStartP,nameP,strlen(nameP))) ); return(SCAN_OK); } */ /***================================================================***/ static int getNbytes(N) int N; { int I; if (N > vm_free_bytes()) { if (!vm_init()) return(SCAN_OUT_OF_MEMORY); } tokenStartP = vm_next_byte(); I = fread(tokenStartP,1,N,inputP->data.fileP); if ( I != N ) return(SCAN_FILE_EOF); return(SCAN_OK); } /***================================================================***/ /* getLiteralName(nameObjP) */ /* scan for next literal. */ /* if we encounter the name 'end' then terminate and say ok. */ /* It means that the CharStrings does not have as many characters */ /* as the dictionary said it would and that is ok. */ /***================================================================***/ static int getLiteralName(nameObjP) psobj *nameObjP; { do { scan_token(inputP); if (tokenType <= TOKEN_NONE) { if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); return(SCAN_ERROR); } if (tokenType == TOKEN_NAME) { if (0 == strncmp(tokenStartP,"end",3) ) { return(SCAN_END); } } } while (tokenType != TOKEN_LITERAL_NAME) ; nameObjP->len = tokenLength; /* allocate all the names in the CharStrings Structure */ if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); nameObjP->data.valueP = tokenStartP; /* found */ return(SCAN_OK); } /***================================================================***/ /* * BuildSubrs routine */ /***================================================================***/ static int BuildSubrs(FontP) psfont *FontP; { int N; /* number of values in Subrs */ int I; /* index into Subrs */ int i; /* loop thru Subrs */ int J; /* length of Subrs entry */ psobj *arrayP; /* next token should be a positive int */ /* note: rc is set by getInt. */ N = getInt(); if (rc) return(rc); if (N < 0 ) return(SCAN_ERROR); /* if we already have a Subrs, then skip the second one */ /* The second one is for hiresolution devices. */ if (FontP->Subrs.data.arrayP != NULL) { TwoSubrs = TRUE; /* process all the Subrs, but do not update anything */ /* can not just skip them because of the binary data */ for (i=0;iSubrs.len = N; FontP->Subrs.data.arrayP = arrayP; /* get N values for Subrs */ for (i=0;iCharStringsP = dictP; dictP[0].key.len = N; /* get N values for CharStrings */ for (i=1;i<=N;i++) { /* look for next literal name */ rc = getLiteralName(&(dictP[i].key)); /* If rc=SCAN_END, the end of file has been reached. This means there were less than N charstrings. This is perfectly valid. */ if (rc) return(rc); /* get 1 integer */ J = getInt(); if (rc) return(rc); /* if next token was not an Int */ if (J<0) return (SCAN_ERROR); dictP[i].value.len = J; /* get the next token, it should be RD or -|, either is ok */ rc = getNextValue(TOKEN_NAME); if ( rc != SCAN_OK ) return(rc); rc = getNbytes(J); if (rc == SCAN_OK) { dictP[i].value.data.valueP = tokenStartP; if ( !(vm_alloc(J)) ) return(SCAN_OUT_OF_MEMORY); } else { return(rc); } } return(SCAN_OK); } /***================================================================***/ /***================================================================***/ /* * BuildFontInfo Dictionary */ /***================================================================***/ static int BuildFontInfo(fontP) psfont *fontP; { psdict *dictP; /* allocate the private dictionary */ dictP = (psdict *)vm_alloc(20*sizeof(psdict)); if (!(dictP)) return(SCAN_OUT_OF_MEMORY); fontP->fontInfoP = dictP; fontP->fontInfoP[0].key.len = 17; /* number of actual entries */ objFormatName(&(dictP[FONTNAME].key),8,"FontName"); objFormatName(&(dictP[FONTNAME].value),0,NULL); objFormatName(&(dictP[PAINTTYPE].key),9,"PaintType"); objFormatInteger(&(dictP[PAINTTYPE].value),0); objFormatName(&(dictP[FONTTYPENUM].key),8,"FontType"); objFormatInteger(&(dictP[FONTTYPENUM].value),0); objFormatName(&(dictP[FONTMATRIX].key),10,"FontMatrix"); objFormatArray(&(dictP[FONTMATRIX].value),0,NULL); objFormatName(&(dictP[FONTBBOX].key),8,"FontBBox"); objFormatArray(&(dictP[FONTBBOX].value),0,NULL); objFormatName(&(dictP[ENCODING].key),8,"Encoding"); objFormatEncoding(&(dictP[ENCODING].value),0,NULL); objFormatName(&(dictP[UNIQUEID].key),8,"UniqueID"); objFormatInteger(&(dictP[UNIQUEID].value),0); objFormatName(&(dictP[STROKEWIDTH].key),11,"StrokeWidth"); objFormatReal(&(dictP[STROKEWIDTH].value),0.0); objFormatName(&(dictP[VERSION].key),7,"version"); objFormatString(&(dictP[VERSION].value),0,NULL); objFormatName(&(dictP[NOTICE].key),6,"Notice"); objFormatString(&(dictP[NOTICE].value),0,NULL); objFormatName(&(dictP[FULLNAME].key),8,"FullName"); objFormatString(&(dictP[FULLNAME].value),0,NULL); objFormatName(&(dictP[FAMILYNAME].key),10,"FamilyName"); objFormatString(&(dictP[FAMILYNAME].value),0,NULL); objFormatName(&(dictP[WEIGHT].key),6,"Weight"); objFormatString(&(dictP[WEIGHT].value),0,NULL); objFormatName(&(dictP[ITALICANGLE].key),11,"ItalicAngle"); objFormatReal(&(dictP[ITALICANGLE].value),0.0); objFormatName(&(dictP[ISFIXEDPITCH].key),12,"isFixedPitch"); objFormatBoolean(&(dictP[ISFIXEDPITCH].value),FALSE); objFormatName(&(dictP[UNDERLINEPOSITION].key),17,"UnderlinePosition"); objFormatReal(&(dictP[UNDERLINEPOSITION].value),0.0); objFormatName(&(dictP[UNDERLINETHICKNESS].key),18,"UnderlineThickness"); objFormatReal(&(dictP[UNDERLINETHICKNESS].value),0.0); return(SCAN_OK); } /***================================================================***/ /* * BuildPrivate Dictionary */ /* "LenIV" corrected to be "lenIV", otherwise fonts with some specific lenIV value could not be decrypted. (RMz, Author of t1lib, 06/03/1998)*/ /***================================================================***/ static int BuildPrivate(fontP) psfont *fontP; { psdict *Private; /* allocate the private dictionary */ Private = (psdict *)vm_alloc(20*sizeof(psdict)); if (!(Private)) return(SCAN_OUT_OF_MEMORY); fontP->Private = Private; fontP->Private[0].key.len = 16; /* number of actual entries */ objFormatName(&(Private[BLUEVALUES].key),10,"BlueValues"); objFormatArray(&(Private[BLUEVALUES].value),0,NULL); objFormatName(&(Private[OTHERBLUES].key),10,"OtherBlues"); objFormatArray(&(Private[OTHERBLUES].value),0,NULL); objFormatName(&(Private[FAMILYBLUES].key),11,"FamilyBlues"); objFormatArray(&(Private[FAMILYBLUES].value),0,NULL); objFormatName(&(Private[FAMILYOTHERBLUES].key),16,"FamilyOtherBlues"); objFormatArray(&(Private[FAMILYOTHERBLUES].value),0,NULL); objFormatName(&(Private[BLUESCALE].key),9,"BlueScale"); objFormatReal(&(Private[BLUESCALE].value),DEFAULTBLUESCALE); objFormatName(&(Private[BLUESHIFT].key),9,"BlueShift"); objFormatInteger(&(Private[BLUESHIFT].value),DEFAULTBLUESHIFT); objFormatName(&(Private[BLUEFUZZ].key),8,"BlueFuzz"); objFormatInteger(&(Private[BLUEFUZZ].value),DEFAULTBLUEFUZZ); objFormatName(&(Private[STDHW].key),5,"StdHW"); objFormatArray(&(Private[STDHW].value),0,NULL); objFormatName(&(Private[STDVW].key),5,"StdVW"); objFormatArray(&(Private[STDVW].value),0,NULL); objFormatName(&(Private[STEMSNAPH].key),9,"StemSnapH"); objFormatArray(&(Private[STEMSNAPH].value),0,NULL); objFormatName(&(Private[STEMSNAPV].key),9,"StemSnapV"); objFormatArray(&(Private[STEMSNAPV].value),0,NULL); objFormatName(&(Private[FORCEBOLD].key),9,"ForceBold"); objFormatBoolean(&(Private[FORCEBOLD].value),DEFAULTFORCEBOLD); objFormatName(&(Private[LANGUAGEGROUP].key),13,"LanguageGroup"); objFormatInteger(&(Private[LANGUAGEGROUP].value),DEFAULTLANGUAGEGROUP); objFormatName(&(Private[LENIV].key),5,"lenIV"); objFormatInteger(&(Private[LENIV].value),DEFAULTLENIV); objFormatName(&(Private[RNDSTEMUP].key),9,"RndStemUp"); objFormatBoolean(&(Private[RNDSTEMUP].value),DEFAULTRNDSTEMUP); objFormatName(&(Private[EXPANSIONFACTOR].key),9,"ExpansionFactor"); objFormatReal(&(Private[EXPANSIONFACTOR].value), DEFAULTEXPANSIONFACTOR); return(SCAN_OK); } /***================================================================***/ /**********************************************************************/ /* GetType1Blues(fontP) */ /* */ /* Routine to support font-level hints. */ /* */ /* Gets all the Blues information from the Private dictionary */ /* for the font. */ /* */ /* */ /**********************************************************************/ static int GetType1Blues(fontP) psfont *fontP; { psdict *PrivateDictP; /* the Private dict relating to hints */ struct blues_struct *blues; /* ptr for the blues struct we will allocate */ int i; psobj *HintEntryP; /* get the Private dictionary pointer */ PrivateDictP = fontP->Private; /* allocate the memory for the blues structure */ blues = (struct blues_struct *) vm_alloc(sizeof(struct blues_struct)); if (!blues) return(SCAN_OUT_OF_MEMORY); /* Make fontP's blues ptr point to this newly allocated structure. */ fontP->BluesP = blues; /* fill in the BlueValues array */ HintEntryP = &(PrivateDictP[BLUEVALUES].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numBlueValues = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMBLUEVALUES) { blues->numBlueValues = NUMBLUEVALUES; } else blues->numBlueValues = HintEntryP->len; for (i = 0; i<= blues->numBlueValues-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->BlueValues[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->BlueValues[i] = HintEntryP->data.arrayP[i].data.real; else blues->BlueValues[i] = 0; } } /* fill in the OtherBlues array */ HintEntryP = &(PrivateDictP[OTHERBLUES].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numOtherBlues = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMOTHERBLUES) { blues->numOtherBlues = NUMOTHERBLUES; } else blues->numOtherBlues = HintEntryP->len; for (i = 0; i<= blues->numOtherBlues-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->OtherBlues[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->OtherBlues[i] = HintEntryP->data.arrayP[i].data.real; else blues->OtherBlues[i] = 0; } } /* fill in the FamilyBlues array */ HintEntryP = &(PrivateDictP[FAMILYBLUES].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numFamilyBlues = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMFAMILYBLUES) { blues->numFamilyBlues = NUMFAMILYBLUES; } else blues->numFamilyBlues = HintEntryP->len; for (i = 0; i<= blues->numFamilyBlues-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->FamilyBlues[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->FamilyBlues[i] = HintEntryP->data.arrayP[i].data.real; else blues->FamilyBlues[i] = 0; } } /* fill in the FamilyOtherBlues array */ HintEntryP = &(PrivateDictP[FAMILYOTHERBLUES].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numFamilyOtherBlues = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMFAMILYOTHERBLUES) { blues->numFamilyOtherBlues = NUMFAMILYOTHERBLUES; } else blues->numFamilyOtherBlues = HintEntryP->len; for (i = 0; i<= blues->numFamilyOtherBlues-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->FamilyOtherBlues[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->FamilyOtherBlues[i] = HintEntryP->data.arrayP[i].data.real; else blues->FamilyOtherBlues[i] = 0; } } /* fill in the StemSnapH array */ HintEntryP = &(PrivateDictP[STEMSNAPH].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numStemSnapH = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMSTEMSNAPH) { blues->numStemSnapH = NUMSTEMSNAPH; } else blues->numStemSnapH = HintEntryP->len; for (i = 0; i<= blues->numStemSnapH-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->StemSnapH[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->StemSnapH[i] = HintEntryP->data.arrayP[i].data.real; else blues->StemSnapH[i] = 0; } } /* fill in the StemSnapV array */ HintEntryP = &(PrivateDictP[STEMSNAPV].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numStemSnapV = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMSTEMSNAPV) { blues->numStemSnapV = NUMSTEMSNAPV; } else blues->numStemSnapV = HintEntryP->len; for (i = 0; i<= blues->numStemSnapV-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->StemSnapV[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->StemSnapV[i] = HintEntryP->data.arrayP[i].data.real; else blues->StemSnapV[i] = 0; } } /* fill in the StdVW array */ HintEntryP = &(PrivateDictP[STDVW].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) /* a value of zero signifies no entry */ blues->StdVW = 0.0; else { if (HintEntryP->len > NUMSTDVW) { } if (objPIsInteger(&HintEntryP->data.arrayP[0])) blues->StdVW = HintEntryP->data.arrayP[0].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[0])) blues->StdVW = HintEntryP->data.arrayP[0].data.real; else blues->StdVW = 0.0; } /* fill in the StdHW array */ HintEntryP = &(PrivateDictP[STDHW].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) /* a value of zero signifies no entry */ blues->StdHW = 0; else { if (HintEntryP->len > NUMSTDHW) { } if (objPIsInteger(&HintEntryP->data.arrayP[0])) blues->StdHW = HintEntryP->data.arrayP[0].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[0])) blues->StdHW = HintEntryP->data.arrayP[0].data.real; else blues->StdHW = 0; } /* get the ptr to the BlueScale entry */ HintEntryP = &(PrivateDictP[BLUESCALE].value); /* put the BlueScale in the blues structure */ if (objPIsInteger(HintEntryP)) /* Must be integer! */ blues->BlueScale = HintEntryP->data.integer; else if (objPIsReal(HintEntryP)) /* Error? */ blues->BlueScale = HintEntryP->data.real; else blues->BlueScale = DEFAULTBLUESCALE; /* get the ptr to the BlueShift entry */ HintEntryP = &(PrivateDictP[BLUESHIFT].value); if (objPIsInteger(HintEntryP)) /* Must be integer! */ blues->BlueShift = HintEntryP->data.integer; else if (objPIsReal(HintEntryP)) /* Error? */ blues->BlueShift = HintEntryP->data.real; else blues->BlueShift = DEFAULTBLUESHIFT; /* get the ptr to the BlueFuzz entry */ HintEntryP = &(PrivateDictP[BLUEFUZZ].value); if (objPIsInteger(HintEntryP)) /* Must be integer! */ blues->BlueFuzz = HintEntryP->data.integer; else if (objPIsReal(HintEntryP)) /* Error? */ blues->BlueFuzz = HintEntryP->data.real; else blues->BlueFuzz = DEFAULTBLUEFUZZ; /* get the ptr to the ForceBold entry */ HintEntryP = &(PrivateDictP[FORCEBOLD].value); if (objPIsBoolean(HintEntryP)) /* Must be integer! */ blues->ForceBold = HintEntryP->data.boolean; else blues->ForceBold = DEFAULTFORCEBOLD; /* get the ptr to the LanguageGroup entry */ HintEntryP = &(PrivateDictP[LANGUAGEGROUP].value); if (objPIsInteger(HintEntryP)) /* Must be integer! */ blues->LanguageGroup = HintEntryP->data.integer; else blues->LanguageGroup = DEFAULTLANGUAGEGROUP; /* get the ptr to the RndStemUp entry */ HintEntryP = &(PrivateDictP[RNDSTEMUP].value); if (objPIsBoolean(HintEntryP)) /* Must be integer! */ blues->RndStemUp = HintEntryP->data.boolean; else blues->RndStemUp = DEFAULTRNDSTEMUP; /* get the ptr to the lenIV entry */ HintEntryP = &(PrivateDictP[LENIV].value); if (objPIsInteger(HintEntryP)) {/* Must be integer! */ blues->lenIV = HintEntryP->data.integer; } else{ blues->lenIV = DEFAULTLENIV; } /* get the ptr to the ExpansionFactor entry */ HintEntryP = &(PrivateDictP[EXPANSIONFACTOR].value); if (objPIsInteger(HintEntryP)) blues->ExpansionFactor = HintEntryP->data.integer; else if (objPIsReal(HintEntryP)) blues->ExpansionFactor = HintEntryP->data.real; else blues->ExpansionFactor = DEFAULTEXPANSIONFACTOR; return(SCAN_OK); } /**********************************************************************/ /* GetType1CharString(fontP,code) */ /* */ /* Look up code in the standard encoding vector and return */ /* the charstring associated with the character name. */ /* */ /* fontP is the psfont structure. */ /* */ /* Returns a psobj (string) */ /**********************************************************************/ psobj *GetType1CharString(fontP, code) psfont *fontP; unsigned char code; { int N; /* the 'Nth' entry in the CharStrings */ psobj *charnameP; /* points to psobj that is name of character*/ psdict *CharStringsDictP; /* dictionary with char strings */ psobj *theStringP; /* the definition for the code */ if (StdEncArrayP == NULL) { return(NULL); } /* use the code to index into the standard encoding vector */ charnameP = &(StdEncArrayP[code]); /* test if the encoding array points to a name */ if (!(objPIsName(charnameP)) ) { return(NULL); } /* Now that we have the character name out of the standardencoding */ /* get the character definition out of the current font */ CharStringsDictP = fontP->CharStringsP; /* search the chars string for this charname as key */ N = SearchDictName(CharStringsDictP,charnameP); if (N<=0) { return(NULL); } /* OK, the nth item is the psobj that is the string for this char */ theStringP = &(CharStringsDictP[N].value); return(theStringP); } /***================================================================***/ /* * FindDictValue */ /***================================================================***/ static int FindDictValue(dictP) psdict *dictP; { psobj LitName; int N; int V; /* we have just scanned a token and it is a literal name */ /* need to check if that name is in Private dictionary */ objFormatName(&LitName,tokenLength,tokenStartP); /* is it in the dictP */ N = SearchDictName(dictP,&LitName); /* if found */ if ( N > 0 ) { /* what type */ switch (dictP[N].value.type) { case OBJ_ENCODING: V = getEncoding(&(dictP[N].value)); if ( V != SCAN_OK ) return(V); break; case OBJ_ARRAY: V = getArray(&(dictP[N].value)); if ( V != SCAN_OK ) return(V); break; case OBJ_INTEGER: /* next value in integer */ dictP[N].value.data.integer = getInt(); if (rc) return(rc); /* if next token was not an Int */ break; case OBJ_REAL: /* next value must be real or int, store as a real */ scan_token(inputP); if (tokenType == TOKEN_REAL) { dictP[N].value.data.real = tokenValue.real; } else if (tokenType == TOKEN_INTEGER) { dictP[N].value.data.real = tokenValue.integer; } else return(SCAN_ERROR); break; case OBJ_NAME: V = getNextValue(TOKEN_LITERAL_NAME); if ( V != SCAN_OK ) return(V); if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); objFormatName(&(dictP[N].value),tokenLength,tokenStartP); break; case OBJ_STRING: V = getNextValue(TOKEN_STRING); if ( V != SCAN_OK ) return(V); if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); objFormatString(&(dictP[N].value),tokenLength,tokenStartP); break; case OBJ_BOOLEAN: scan_token(inputP); if (tokenType != TOKEN_NAME) { return(SCAN_ERROR); } if (0 == strncmp(tokenStartP,"true",4) ) { dictP[N].value.data.boolean =TRUE; } else if (0 == strncmp(tokenStartP,"false",5) ) { dictP[N].value.data.boolean =FALSE; } else return(SCAN_ERROR); break; default: return(SCAN_ERROR); break; } } /* Name is not in dictionary. That is ok. */ return(SCAN_OK); } /***================================================================***/ /* * ------------------------------------------------------------------- * Scan the next token and convert it into an object * Result is placed on the Operand Stack as next object * ------------------------------------------------------------------- */ int scan_font(FontP) psfont *FontP; { char filename[MAXPATHLEN+1]; FILE *fileP; char *nameP; int namelen; /* copy the filename and remove leading or trailing blanks */ /* point to name and search for leading blanks */ nameP= FontP->FontFileName.data.nameP; namelen = FontP->FontFileName.len; while (nameP[0] == ' ') { nameP++; namelen--; } /* now remove any trailing blanks */ while ((namelen>0) && ( nameP[namelen-1] == ' ')) { namelen--; } if ( namelen >= MAXPATHLEN ) { /* Hopefully, this will lead to a file open error */ namelen = MAXPATHLEN; } strncpy(filename,nameP,namelen); filename[namelen] = '\0'; /* file name is now constructed */ inputFile.data.fileP = NULL; filterFile.data.fileP = NULL; inputP = &inputFile; if ((fileP = fopen(filename,"rb"))!=NULL) { objFormatFile(inputP,fileP); } else { return(SCAN_FILE_OPEN_ERROR); }; WantFontInfo = TRUE; InPrivateDict = FALSE; TwoSubrs = FALSE; rc = BuildFontInfo(FontP); #ifdef DEBUG_SCANFONT printf("BuildFontInfo(): retval=%d\n", rc); #endif if (rc != 0) return(rc); /* Assume everything will be OK */ rc = 0; /* Loop until complete font is read */ do { /* Scan the next token */ scan_token(inputP); /* ==> tokenLength, tokenTooLong, tokenType, and tokenValue are */ /* now set */ switch (tokenType) { case TOKEN_EOF: case TOKEN_NONE: case TOKEN_INVALID: /* in this case we are done */ if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); rc = SCAN_ERROR; break; case TOKEN_LITERAL_NAME: /* Look up the name */ tokenStartP[tokenLength] = '\0'; /* At this point we check for the font not being a Multiple Master Font. If it is, we return an error. However, we restrict searching for forbidden keywords to FontInfo, in order not to make assumptions about internal PostScript routine names. (RMz, 2004-11-27) */ if ( !InPrivateDict ) { if (strncmp(tokenStartP, "BlendAxisTypes", 14)==0){ rc=SCAN_MMFONT; break; } } if (InPrivateDict ) { if (0== strncmp(tokenStartP,"Subrs",5) ) { rc = BuildSubrs(FontP); #ifdef DEBUG_SCANFONT printf("BuildSubrs(): retval=%d\n", rc); #endif break; } if (0== strncmp(tokenStartP,"CharStrings",11) ) { rc = BuildCharStrings(FontP); #ifdef DEBUG_SCANFONT printf("BuildCharstrings(): retval=%d\n", rc); #endif if ( (rc == SCAN_OK) ||(rc == SCAN_END) ) { fclose(inputP->data.fileP); /* Build the Blues Structure */ rc = GetType1Blues(FontP); #ifdef DEBUG_SCANFONT printf("GetType1Blues(): retval=%d\n", rc); #endif /* whatever the return code, return it */ /* all the work is done. This is the normal exit.*/ return(rc); } break; } rc = FindDictValue(FontP->Private); /* we are not going to report errors */ /* Sometimes the font file may test a value such as */ /* testing to see if the font is alreadly loaded with */ /* same UniqueID. We would faile on /UniqueID get */ /* because we are expecting a int to follow UniqueID*/ /* If the correct object type does not follow a Name*/ /* then we will skip over it without reporting error*/ rc = SCAN_OK; break; } /* end of reading Private dictionary */ else if (0== strncmp(tokenStartP,"Private",7) ) { InPrivateDict = TRUE; rc = BuildPrivate(FontP); break; } else if (WantFontInfo) { rc = FindDictValue(FontP->fontInfoP); /* we are not going to report errors */ rc = SCAN_OK; break; } break; case TOKEN_NAME: if (0 == strncmp(tokenStartP,"eexec",5) ) { /* We check for the pfb-headers in I/O-module */ filterFile.data.fileP = T1eexec(inputP->data.fileP); if (filterFile.data.fileP == NULL) { fclose(inputFile.data.fileP); /* SCAN_FILE_OPEN_ERROR replaced because at this point a portion of the file has already been read successfully. We hence have encountered a premature end of file (2002-08-17, RMz). */ return SCAN_FILE_EOF; } inputP = &filterFile; WantFontInfo = FALSE; } break; } } while (rc ==0); fclose(inputP->data.fileP); if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); return(rc); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/t1imager.h0000664000175000017500000001057411742726711023214 0ustar uwabamiuwabami/* $XConsortium: t1imager.h,v 1.5 92/03/20 14:36:05 keith Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include "types.h" #include "fontmisc.h" typedef pointer xobject; typedef pointer location; typedef pointer path; typedef pointer region; /* typedef pointer XYspace; */ #ifndef NOEXTERNS /* The following are the user entry locations to TYPE1IMAGER */ extern path t1_Bezier(); extern path t1_ClosePath(); extern xobject t1_Destroy(); extern xobject t1_Dup(); extern char *t1_ErrorMsg(); extern void t1_InitImager(); extern region t1_Interior(); extern location t1_ILoc(); extern xobject t1_Join(); extern path t1_Line(); extern xobject t1_Permanent(); extern path t1_Phantom(); extern location t1_Loc(); extern xobject t1_Scale(); extern xobject t1_Snap(); extern location t1_SubLoc(); extern xobject t1_Temporary(); #endif #ifndef NULL #define NULL 0 #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /* Here are some TYPE1IMAGER functions that are defined in terms of others: */ #define t1_AddLoc(p1,p2) t1_Join(p1,p2) #ifndef NONAMES /* Define the simple form of all the subroutine names: */ #define AddLoc(p1,p2) t1_AddLoc(p1,p2) #define Bezier(B,C,D) t1_Bezier(B,C,D) #define ClosePath(p) t1_ClosePath(p,0) #define Complement(area) t1_Complement(area) #define Destroy(o) t1_Destroy(o) #define Dup(o) t1_Dup(o) #define ErrorMsg() t1_ErrorMsg() #define HeadSegment(p) t1_HeadSegment(p) #define InitImager() t1_InitImager() #define Interior(p,rule) t1_Interior(p,rule) #define ILoc(S,x,y) t1_ILoc(S,x,y) #define Join(p1,p2) t1_Join(p1,p2) #define Line(P) t1_Line(P) #define Permanent(o) t1_Permanent(o) #define Phantom(o) t1_Phantom(o) #define Loc(S,x,y) t1_Loc(S,(DOUBLE)x,(DOUBLE)y) #define Scale(o,sx,sy) t1_Scale(o,(DOUBLE)sx,(DOUBLE)sy) #define Snap(o) t1_Snap(o) #define SubLoc(a,b) t1_SubLoc(a,b) #define Temporary(o) t1_Temporary(o) #define TermImager() t1_TermImager() #define Transform(o,cxx,cyx,cxy,cyy) t1_Transform(o,(DOUBLE)cxx,(DOUBLE)cyx,\ (DOUBLE)cxy,(DOUBLE)cyy) #endif #define WINDINGRULE -2 #define EVENODDRULE -3 #define CONTINUITY 0x80 /* can be added to above rules; e.g. WINDINGRULE+CONTINUITY */ /* Stroke() line style constants: */ /* Coordinate space constants: */ /* #define IDENTITY t1_Identity extern XYspace *IDENTITY; */ /* Generic null object definition: */ #define NULLOBJECT ((xobject)NULL) /* Null path definition: */ #define NULLPATH NULLOBJECT /* Full page and null region definition: */ #ifndef NOEXTERNS extern region *t1_Infinity; #endif #define NULLREGION NULLOBJECT #define FF_PARSE_ERROR 2 /* Previously 5 */ #define FF_PATH_ERROR 1 /* Changed from FF_PATH */ #define FF_PATH 33 /* Some arbitrary value */ extern pointer xiStub(); xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/t1intf.h0000664000175000017500000000311611742726711022702 0ustar uwabamiuwabami/* $XConsortium: t1intf.h,v 1.2 91/10/10 11:19:39 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #define FIRSTCOL 0 struct type1font { CharInfoPtr pDefault; CharInfoRec glyphs[256-FIRSTCOL]; }; xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/README.RMz0000664000175000017500000000075011742726711022714 0ustar uwabamiuwabamiDear Folks, this directory basically contains the Type 1 rasterizer code, donated to the X11-project by IBM and afterwards modified by Piet Tutelaers for his ps2pk-package. But there are several files modified by myself. Thus the state of this directory is not an official one and subject to further changes! Before version 0.6 of t1lib I have cleaned the sources, removed the X11-dummy function and made the sources more ANSI-C compliant. (03/09/1998, RMz) xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/t1stub.c0000664000175000017500000000331711742726711022715 0ustar uwabamiuwabami/* $XConsortium: t1stub.c,v 1.3 92/03/20 15:58:40 eswu Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include #include "objects.h" /* get #define for abort() */ int xiStub( void) { printf("xiStub called\n"); abort("xiStub called", 48); return(0); } void t1_DumpText( void) { xiStub(); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/README0000664000175000017500000000235011742726711022203 0ustar uwabamiuwabamiThis directory contains a rasterizer for "Type 1" (PostScript) format outline fonts. It was donated by IBM for the R5 contrib tape and has been maintained since then by the MIT X Consortium. This version is compatible with X11R5 public patch 13. To be used, this rasterizer must be bound into the X server and the font server. It is most convenient to do this if this directory is moved into the 'mit' directory tree (i.e., mit/font/lib/font/Type1, a peer of the 'Speedo' directory). Of course, mit/font/lib/font/Imakefile must be made aware of its new subdirectory and the objects in it. In any case, you must ensure that the library mit/font/lib/font/libfont.a contains this code. In addition, the rasterizer must be "registered" with X. The source in mit/fonts/lib/font/fontfile/renderers.c, specifically the routine FontFileRegisterFontFileFunctions(), must be modified to add the line: Type1RegisterFontFileFunctions(); after the call to "SpeedoRegisterFontFileFunctions". Some Type 1 fonts have been donated; see, for example, the directory contrib/fonts/scaled/Type1. In order to use them, they must be in the font path, either by combining them in some existing font object directory, or adding a new font directory to the path. xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/arith.c0000664000175000017500000003344711742726711022611 0ustar uwabamiuwabami/* $XConsortium: arith.c,v 1.2 91/10/10 11:14:06 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* ARITH CWEB V0006 ******** */ /* :h1.ARITH Module - Portable Module for Multiple Precision Fixed Point Arithmetic This module provides division and multiplication of 64-bit fixed point numbers. (To be more precise, the module works on numbers that take two 'longs' to store. That is almost always equivalent to saying 64-bit numbers.) Note: it is frequently easy and desirable to recode these functions in assembly language for the particular processor being used, because assembly language, unlike C, will have 64-bit multiply products and 64-bit dividends. This module is offered as a portable version. &author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) and Sten F. Andler :h3.Include Files The included files are: */ #include #include "types.h" #include "objects.h" #include "spaces.h" #include "arith.h" /* :h3. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Reference for all algorithms: Donald E. Knuth, "The Art of Computer Programming, Volume 2, Semi-Numerical Algorithms," Addison-Wesley Co., Massachusetts, 1969, pp. 229-279. Knuth talks about a 'digit' being an arbitrary sized unit and a number being a sequence of digits. We'll take a digit to be a 'short'. The following assumption must be valid for these algorithms to work: :ol. :li.A 'long' is two 'short's. :eol. The following code is INDEPENDENT of: :ol. :li.The actual size of a short. :li.Whether shorts and longs are stored most significant byte first or least significant byte first. :eol. SHORTSIZE is the number of bits in a short; LONGSIZE is the number of bits in a long; MAXSHORT is the maximum unsigned short: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* ASSEMBLE concatenates two shorts to form a long: */ #define ASSEMBLE(hi,lo) ((((ULONG)hi)<>SHORTSIZE) #define LOWDIGIT(u) ((u)&MAXSHORT) /* SIGNBITON tests the high order bit of a long 'w': */ #define SIGNBITON(w) (((LONG)w)<0) /*SHARED LINE(S) ORIGINATED HERE*/ /* :h2.Double Long Arithmetic :h3.DLmult() - Multiply Two Longs to Yield a Double Long The two multiplicands must be positive. */ void DLmult(product, u, v) register doublelong *product; register ULONG u; register ULONG v; { register ULONG u1, u2; /* the digits of u */ register ULONG v1, v2; /* the digits of v */ register unsigned int w1, w2, w3, w4; /* the digits of w */ register ULONG t; /* temporary variable */ /* printf("DLmult(? ?, %x, %x)\n", u, v); */ u1 = HIGHDIGIT(u); u2 = LOWDIGIT(u); v1 = HIGHDIGIT(v); v2 = LOWDIGIT(v); if (v2 == 0) w4 = w3 = w2 = 0; else { t = u2 * v2; w4 = LOWDIGIT(t); t = u1 * v2 + HIGHDIGIT(t); w3 = LOWDIGIT(t); w2 = HIGHDIGIT(t); } if (v1 == 0) w1 = 0; else { t = u2 * v1 + w3; w3 = LOWDIGIT(t); t = u1 * v1 + w2 + HIGHDIGIT(t); w2 = LOWDIGIT(t); w1 = HIGHDIGIT(t); } product->high = ASSEMBLE(w1, w2); product->low = ASSEMBLE(w3, w4); } /* :h2.DLdiv() - Divide Two Longs by One Long, Yielding Two Longs Both the dividend and the divisor must be positive. */ void DLdiv(quotient, divisor) doublelong *quotient; /* also where dividend is, originally */ ULONG divisor; { register ULONG u1u2 = quotient->high; register ULONG u3u4 = quotient->low; register LONG u3; /* single digit of dividend */ register int v1,v2; /* divisor in registers */ register LONG t; /* signed copy of u1u2 */ register int qhat; /* guess at the quotient digit */ register ULONG q3q4; /* low two digits of quotient */ register int shift; /* holds the shift value for normalizing */ register int j; /* loop variable */ /* printf("DLdiv(%x %x, %x)\n", quotient->high, quotient->low, divisor); */ /* * Knuth's algorithm works if the dividend is smaller than the * divisor. We can get to that state quickly: */ if (u1u2 >= divisor) { quotient->high = u1u2 / divisor; u1u2 %= divisor; } else quotient->high = 0; if (divisor <= MAXSHORT) { /* * This is the case where the divisor is contained in one * 'short'. It is worthwhile making this fast: */ u1u2 = ASSEMBLE(u1u2, HIGHDIGIT(u3u4)); q3q4 = u1u2 / divisor; u1u2 %= divisor; u1u2 = ASSEMBLE(u1u2, LOWDIGIT(u3u4)); quotient->low = ASSEMBLE(q3q4, u1u2 / divisor); return; } /* * At this point the divisor is a true 'long' so we must use * Knuth's algorithm. * * Step D1: Normalize divisor and dividend (this makes our 'qhat' * guesses more accurate): */ for (shift=0; !SIGNBITON(divisor); shift++, divisor <<= 1) { ; } shift--; divisor >>= 1; if ((u1u2 >> (LONGSIZE - shift)) != 0 && shift != 0) abort("DLdiv: dividend too large", 1); u1u2 = (u1u2 << shift) + ((shift == 0) ? 0 : u3u4 >> (LONGSIZE - shift)); u3u4 <<= shift; /* * Step D2: Begin Loop through digits, dividing u1,u2,u3 by v1,v2, * then shifting U left by 1 digit: */ v1 = HIGHDIGIT(divisor); v2 = LOWDIGIT(divisor); q3q4 = 0; u3 = HIGHDIGIT(u3u4); for (j=0; j < 2; j++) { /* * Step D3: make a guess (qhat) at the next quotient denominator: */ qhat = (HIGHDIGIT(u1u2) == v1) ? MAXSHORT : u1u2 / v1; /* * At this point Knuth would have us further refine our * guess, since we know qhat is too big if * * v2 * qhat > ASSEMBLE(u1u2 % v, u3) * * That would make sense if u1u2 % v was easy to find, as it * would be in assembly language. I ignore this step, and * repeat step D6 if qhat is too big. */ /* * Step D4: Multiply v1,v2 times qhat and subtract it from * u1,u2,u3: */ u3 -= qhat * v2; /* * The high digit of u3 now contains the "borrow" for the * rest of the substraction from u1,u2. * Sometimes we can lose the sign bit with the above. * If so, we have to force the high digit negative: */ t = HIGHDIGIT(u3); if (t > 0) t |= -1 << SHORTSIZE; t += u1u2 - qhat * v1; /* printf("..>divide step qhat=%x t=%x u3=%x u1u2=%x v1=%x v2=%x\n", qhat, t, u3, u1u2, v1, v2); */ while (t < 0) { /* Test is Step D5. */ /* * D6: Oops, qhat was too big. Add back in v1,v2 and * decrease qhat by 1: */ u3 = LOWDIGIT(u3) + v2; t += HIGHDIGIT(u3) + v1; qhat--; /* printf("..>>qhat correction t=%x u3=%x qhat=%x\n", t, u3, qhat); */ } /* * Step D7: shift U left one digit and loop: */ u1u2 = t; if (HIGHDIGIT(u1u2) != 0) abort("divide algorithm error", 2); u1u2 = ASSEMBLE(u1u2, LOWDIGIT(u3)); u3 = LOWDIGIT(u3u4); q3q4 = ASSEMBLE(q3q4, qhat); } quotient->low = q3q4; /* printf("DLdiv returns %x %x\n", quotient->high, quotient->low); */ return; } /* :h3.DLadd() - Add Two Double Longs In this case, the doublelongs may be signed. The algorithm takes the piecewise sum of the high and low longs, with the possibility that the high should be incremented if there is a carry out of the low. How to tell if there is a carry? Alex Harbury suggested that if the sum of the lows is less than the max of the lows, there must have been a carry. Conversely, if there was a carry, the sum of the lows must be less than the max of the lows. So, the test is "if and only if". */ void DLadd(u, v) doublelong *u; /* u = u + v */ doublelong *v; { register ULONG lowmax = TYPE1_MAX(u->low, v->low); /* printf("DLadd(%x %x, %x %x)\n", u->high, u->low, v->high, v->low); */ u->high += v->high; u->low += v->low; if (lowmax > u->low) u->high++; } /* :h3.DLsub() - Subtract Two Double Longs Testing for a borrow is even easier. If the v.low is greater than u.low, there must be a borrow. */ void DLsub(u, v) doublelong *u; /* u = u - v */ doublelong *v; { /* printf("DLsub(%x %x, %x %x)\n", u->high, u->low, v->high, v->low);*/ u->high -= v->high; if (v->low > u->low) u->high--; u->low -= v->low; } /* :h3.DLrightshift() - Macro to Shift Double Long Right by N */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h2.Fractional Pel Arithmetic */ /* :h3.FPmult() - Multiply Two Fractional Pel Values This funtion first calculates w = u * v to "doublelong" precision. It then shifts w right by FRACTBITS bits, and checks that no overflow will occur when the resulting value is passed back as a fractpel. */ fractpel FPmult(u, v) register fractpel u,v; { doublelong w; register int negative = FALSE; /* sign flag */ int maxshort = MAXSHORT; /* To avoid that overflow warning (RMz) */ if ((u == 0) || (v == 0)) return (0); if (u < 0) {u = -u; negative = TRUE;} if (v < 0) {v = -v; negative = !negative;} if (u == TOFRACTPEL(1)) return ((negative) ? -v : v); if (v == TOFRACTPEL(1)) return ((negative) ? -u : u); DLmult(&w, u, v); DLrightshift(w, FRACTBITS); if (w.high != 0 || SIGNBITON(w.low)) { IfTrace2(TRUE,"FPmult: overflow, %dx%d\n", u, v); w.low = TOFRACTPEL(maxshort); } return ((negative) ? -w.low : w.low); } /* :h3.FPdiv() - Divide Two Fractional Pel Values These values may be signed. The function returns the quotient. */ fractpel FPdiv(dividend, divisor) register fractpel dividend; register fractpel divisor; { doublelong w; /* result will be built here */ int negative = FALSE; /* flag for sign bit */ int maxshort = MAXSHORT; /* To avoid that overflow warning (RMz) */ if (dividend < 0) { dividend = -dividend; negative = TRUE; } if (divisor < 0) { divisor = -divisor; negative = !negative; } w.low = dividend << FRACTBITS; w.high = dividend >> (LONGSIZE - FRACTBITS); DLdiv(&w, divisor); if (w.high != 0 || SIGNBITON(w.low)) { IfTrace2(TRUE,"FPdiv: overflow, %d/%d\n", dividend, divisor); w.low = TOFRACTPEL(maxshort); } return( (negative) ? -w.low : w.low); } /* :h3.FPstarslash() - Multiply then Divide Borrowing a chapter from the language Forth, it is useful to define an operator that first multiplies by one constant then divides by another, keeping the intermediate result in extended precision. */ fractpel FPstarslash(a, b, c) register fractpel a,b,c; /* result = a * b / c */ { doublelong w; /* result will be built here */ int negative = FALSE; int maxshort = MAXSHORT; /* To avoid that overflow warning (RMz) */ if (a < 0) { a = -a; negative = TRUE; } if (b < 0) { b = -b; negative = !negative; } if (c < 0) { c = -c; negative = !negative; } DLmult(&w, a, b); DLdiv(&w, c); if (w.high != 0 || SIGNBITON(w.low)) { IfTrace3(TRUE,"FPstarslash: overflow, %d*%d/%d\n", a, b, c); w.low = TOFRACTPEL(maxshort); } return((negative) ? -w.low : w.low); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/fontfile.h0000664000175000017500000000606311742726711023307 0ustar uwabamiuwabami/* * $XConsortium: fontfile.h,v 1.1 91/05/11 09:11:58 rws Exp $ * * Copyright 1991 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, MIT X Consortium */ #ifndef _FONTFILE_H_ #define _FONTFILE_H_ typedef struct _FontEntry *FontEntryPtr; typedef struct _FontTable *FontTablePtr; typedef struct _FontName *FontNamePtr; typedef struct _FontScaled *FontScaledPtr; typedef struct _FontScalableExtra *FontScalableExtraPtr; typedef struct _FontScalableEntry *FontScalableEntryPtr; typedef struct _FontScaleAliasEntry *FontScaleAliasEntryPtr; typedef struct _FontBitmapEntry *FontBitmapEntryPtr; typedef struct _FontAliasEntry *FontAliasEntryPtr; typedef struct _FontBCEntry *FontBCEntryPtr; typedef struct _FontDirectory *FontDirectoryPtr; typedef struct _FontRenderer *FontRendererPtr; #define NullFontEntry ((FontEntryPtr) 0) #define NullFontTable ((FontTablePtr) 0) #define NullFontName ((FontNamePtr) 0) #define NullFontScaled ((FontScaled) 0) #define NullFontScalableExtra ((FontScalableExtra) 0) #define NullFontscalableEntry ((FontScalableEntry) 0) #define NullFontScaleAliasEntry ((FontScaleAliasEntry) 0) #define NullFontBitmapEntry ((FontBitmapEntry) 0) #define NullFontAliasEntry ((FontAliasEntry) 0) #define NullFontBCEntry ((FontBCEntry) 0) #define NullFontDirectory ((FontDirectoryPtr) 0) #define NullFontRenderer ((FontRendererPtr) 0) #define FONT_ENTRY_SCALABLE 0 #define FONT_ENTRY_SCALE_ALIAS 1 #define FONT_ENTRY_BITMAP 2 #define FONT_ENTRY_ALIAS 3 #define FONT_ENTRY_BC 4 #define MAXFONTNAMELEN 1024 #define MAXFONTFILENAMELEN 1024 #define FontDirFile "fonts.dir" #define FontAliasFile "fonts.alias" #define FontScalableFile "fonts.scale" extern FontEntryPtr FontFileFindNameInDir (); extern FontDirectoryPtr FontFileMakeDir (); extern FontRendererPtr FontFileMatchRenderer (); extern char *SaveString (); extern FontScaledPtr FontFileFindScaledInstance (); #endif /* _FONTFILE_H_ */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/blues.h0000664000175000017500000000752611742726711022620 0ustar uwabamiuwabami/* $XConsortium: blues.h,v 1.2 91/10/10 11:17:52 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * Portions Copyright (c) 1990 Adobe Systems Incorporated. * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark or Adobe * not be used in advertising or publicity pertaining to distribution of * the software without specific, written prior permission. * * IBM, LEXMARK, AND ADOBE PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY * WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE * ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING * ANY DUTY TO SUPPORT OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY * PORTION OF THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM, * LEXMARK, OR ADOBE) ASSUMES THE ENTIRE COST OF ALL SERVICING, REPAIR AND * CORRECTION. IN NO EVENT SHALL IBM, LEXMARK, OR ADOBE BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "types.h" extern psobj *GetType1CharString(); #define TOPLEFT 1 #define BOTTOMRIGHT 2 #define NUMBLUEVALUES 14 #define NUMOTHERBLUES 10 #define NUMFAMILYBLUES 14 #define NUMFAMILYOTHERBLUES 10 #define NUMSTEMSNAPH 12 #define NUMSTEMSNAPV 12 #define NUMSTDHW 1 #define NUMSTDVW 1 #define DEFAULTBOLDSTEMWIDTH 2.0 #define MAXALIGNMENTZONES ((NUMBLUEVALUES+NUMOTHERBLUES)/2) #define DEFAULTBLUESCALE 0.039625 #define DEFAULTBLUESHIFT 7 #define DEFAULTBLUEFUZZ 1 #define DEFAULTSTDHW 0 #define DEFAULTSTDVW 0 #define DEFAULTFORCEBOLD FALSE #define DEFAULTLANGUAGEGROUP 0 #define DEFAULTRNDSTEMUP FALSE #define DEFAULTLENIV 4 #define DEFAULTEXPANSIONFACTOR 0.06 /* see Type 1 Font Format book for explanations of these values */ /* Note that we're currently doing nothing for minfeature and password. */ struct blues_struct { struct blues_struct *next; /* ptr to next Blues structure in list */ int numBlueValues; /* # of BlueValues in following array */ int BlueValues[NUMBLUEVALUES]; int numOtherBlues; /* # of OtherBlues values in following array */ int OtherBlues[NUMOTHERBLUES]; int numFamilyBlues; /* # of FamilyBlues values in following array */ int FamilyBlues[NUMFAMILYBLUES]; int numFamilyOtherBlues; /* # of FamilyOtherBlues values in */ int FamilyOtherBlues[NUMFAMILYOTHERBLUES]; /* this array */ DOUBLE BlueScale; int BlueShift; int BlueFuzz; DOUBLE StdHW; DOUBLE StdVW; int numStemSnapH; /* # of StemSnapH values in following array */ DOUBLE StemSnapH[NUMSTEMSNAPH]; int numStemSnapV; /* # of StemSnapV values in following array */ DOUBLE StemSnapV[NUMSTEMSNAPV]; int ForceBold; int LanguageGroup; int RndStemUp; int lenIV; DOUBLE ExpansionFactor; }; /* the alignment zone structure -- somewhat similar to the stem structure */ /* see Adobe Type1 Font Format book about the terms used in this structure */ struct alignmentzone { int topzone; /* TRUE if a topzone, FALSE if a bottom zone */ DOUBLE bottomy, topy; /* interval of this alignment zone */ }; xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/spaces.c0000664000175000017500000010162011742726711022745 0ustar uwabamiuwabami/* $XConsortium: spaces.c,v 1.4 91/10/10 11:19:16 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* SPACES CWEB V0021 ******** */ /* :h1 id=spaces.SPACES Module - Handles Coordinate Spaces This module is responsible for handling the TYPE1IMAGER "XYspace" object. &author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) :h3.Include Files */ #include #include #include #include "types.h" #include "objects.h" #include "spaces.h" #include "paths.h" #include "pictures.h" #include "fonts.h" #include "arith.h" #include "trig.h" static int FindFfcn(); static int FindIfcn(); /* :h3.Entry Points Provided to the TYPE1IMAGER User */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Entry Points Provided to Other Modules */ /* In addition, other modules call the SPACES module through function vectors in the "XYspace" structure. The entry points accessed that way are "FConvert()", "IConvert()", and "ForceFloat()". */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Macros and Typedefs Provided to Other Modules :h4.Duplicating and Killing Spaces Destroying XYspaces is so simple we can do it with a macro: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* On the other hand, duplicating XYspaces is slightly more difficult because of the need to keep a unique ID in the space, see :hdref refid=dupspace.. :h4.Fixed Point Pel Representation We represent pel positions with fixed point numbers. This does NOT mean integer, but truly means fixed point, with a certain number of binary digits (FRACTBITS) representing the fractional part of the pel. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h2.Data Structures for Coordinate Spaces and Points */ /* :h3 id=matrix.Matrices TYPE1IMAGER uses 2x2 transformation matrices. We'll use C notation for such a matrix (M[2][2]), the first index being rows, the second columns. */ /* :h3.The "doublematrix" Structure We frequently find it desirable to store both a matrix and its inverse. We store these in a "doublematrix" structure. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.The "XYspace" Structure The XYspace structure represents the XYspace object. */ /*SHARED LINE(S) ORIGINATED HERE*/ #define RESERVED 10 /* 'n' IDs are reserved for invalid & immortal spaces */ /* */ #define NEXTID ((SpaceID < RESERVED) ? (SpaceID = RESERVED) : ++SpaceID) static unsigned int SpaceID = 1; struct XYspace *CopySpace(S) register struct XYspace *S; { S = (struct XYspace *)Allocate(sizeof(struct XYspace), S, 0); S->ID = NEXTID; return(S); } /* :h3.The "fractpoint" Structure A fractional point is just a "fractpel" x and y: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Lazy Evaluation of Matrix Inverses Calculating the inverse of a matrix is somewhat involved, and we usually do not need them. So, we flag whether or not the space has the inverse already calculated: */ #define HASINVERSE(flag) ((flag)&0x80) /* The following macro forces a space to have an inverse: */ #define CoerceInverse(S) if (!HASINVERSE((S)->flag)) { \ MatrixInvert((S)->tofract.normal, (S)->tofract.inverse); (S)->flag |= HASINVERSE(ON); } /* :h3.IDENTITY Space IDENTITY space is (logically) the space corresponding to the identity transformation matrix. However, since all our transformation matrices have a common FRACTFLOAT scale factor to convert to 'fractpel's, that is actually what we store in 'tofract' matrix of IDENTITY: */ static struct XYspace identity = { SPACETYPE, ISPERMANENT(ON) + ISIMMORTAL(ON) + HASINVERSE(ON), 2, /* added 3-26-91 PNM */ NULL, NULL, NULL, NULL, NULL, NULL, INVALIDID + 1, 0, {{{FRACTFLOAT, 0.0}, {0.0, FRACTFLOAT}}, {{1.0/FRACTFLOAT, 0.0}, {0.0, 1.0/FRACTFLOAT}}}, {{0, 0}, {0, 0}} }; struct XYspace *IDENTITY = &identity; /* */ #define MAXCONTEXTS 16 static struct doublematrix contexts[MAXCONTEXTS]; #ifdef notdef static int nextcontext = 1; /*SHARED LINE(S) ORIGINATED HERE*/ #if __STDC__ #define pointer void * #else #define pointer char * #endif /* :h3.FindDeviceContext() - Find the Context Given a Device This routine, given a device, returns the index of the device's transformation matrix in the context array. If it cannot find it, it will allocate a new array entry and fill it out. */ static int FindDeviceContext(device) pointer device; /* device token */ { DOUBLE M[2][2]; /* temporary matrix */ float Xres,Yres; /* device resolution */ int orient = -1; /* device orientation */ int rc = -1; /* return code for QueryDeviceState */ if (rc != 0) /* we only bother with this check once */ abort("Context: QueryDeviceState didn't work", 44); M[0][0] = M[1][0] = M[0][1] = M[1][1] = 0.0; switch (orient) { case 0: M[0][0] = Xres; M[1][1] = -Yres; break; case 1: M[1][0] = Yres; M[0][1] = Xres; break; case 2: M[0][0] = -Xres; M[1][1] = Yres; break; case 3: M[1][0] = -Yres; M[0][1] = -Xres; break; default: abort("QueryDeviceState returned invalid orientation", 45); } return(FindContext(M)); } /* :h3.FindContext() - Find the Context Given a Matrix This routine, given a matrix, returns the index of that matrix matrix in the context array. If it cannot find it, it will allocate a new array entry and fill it out. */ int FindContext(M) DOUBLE M[2][2]; /* array to search for */ { register int i; /* loop variable for search */ for (i=0; i < nextcontext; i++) if (M[0][0] == contexts[i].normal[0][0] && M[1][0] == contexts[i].normal[1][0] && M[0][1] == contexts[i].normal[0][1] && M[1][1] == contexts[i].normal[1][1]) break; if (i >= nextcontext) { if (i >= MAXCONTEXTS) abort("Context: out of them", 46); LONGCOPY(contexts[i].normal, M, sizeof(contexts[i].normal)); MatrixInvert(M, contexts[i].inverse); nextcontext++; } return(i); } /* :h3.Context() - Create a Coordinate Space for a Device This user operator is implemented by first finding the device context array index, then transforming IDENTITY space to create an appropriate cooridnate space. */ struct XYspace *Context(device, units) pointer device; /* device token */ DOUBLE units; /* multiples of one inch */ { DOUBLE M[2][2]; /* device transformation matrix */ register int n; /* will hold device context number */ register struct XYspace *S; /* XYspace constructed */ IfTrace2((MustTraceCalls),"Context(%x, %f)\n", device, &units); ARGCHECK((device == NULL), "Context of NULLDEVICE not allowed", NULL, IDENTITY, (0), struct XYspace *); ARGCHECK((units == 0.0), "Context: bad units", NULL, IDENTITY, (0), struct XYspace *); n = FindDeviceContext(device); LONGCOPY(M, contexts[n].normal, sizeof(M)); M[0][0] *= units; M[0][1] *= units; M[1][0] *= units; M[1][1] *= units; S = (struct XYspace *)Xform(IDENTITY, M); S->context = n; return(S); } #endif /* :h3.ConsiderContext() - Adjust a Matrix to Take Out Device Transform Remember, we have :f/x times U times D/ and :f/M/ and and we want :f/x times U times M times D/. An easy way to do this is to calculate :f/D sup <-1> times M times D/, because: :formula. x times U times D times D sup <-1> times M times D = x times U times M times D :formula. So this subroutine, given an :f/M/and an object, finds the :f/D/ for that object and modifies :f/M/ so it is :f/D sup <-1> times M times D/. */ static void ConsiderContext(obj, M) register struct xobject *obj; /* object to be transformed */ register DOUBLE M[2][2]; /* matrix (may be changed) */ { register int context=0; /* index in contexts array */ if (obj == NULL) return; if (ISPATHTYPE(obj->type)) { struct segment *path = (struct segment *) obj; context = path->context; } else if (obj->type == SPACETYPE) { struct XYspace *S = (struct XYspace *) obj; context = S->context; } else if (obj->type == PICTURETYPE) { } else context = NULLCONTEXT; if (context != NULLCONTEXT) { MatrixMultiply(contexts[context].inverse, M, M); MatrixMultiply(M, contexts[context].normal, M); } } /* :h2.Conversion from User's X,Y to "fractpel" X,Y When the user is building paths (lines, moves, curves, etc.) he passes the control points (x,y) for the paths together with an XYspace. We must convert from the user's (x,y) to our internal representation which is in pels (fractpels, actually). This involves transforming the user's (x,y) under the coordinate space transformation. It is important that we do this quickly. So, we store pointers to different conversion functions right in the XYspace structure. This allows us to have simpler special case functions for the more commonly encountered types of transformations. :h3.Convert(), IConvert(), and ForceFloat() - Called Through "XYspace" Structure These are functions that fit in the "convert" and "iconvert" function pointers in the XYspace structure. They call the "xconvert", "yconvert", "ixconvert", and "iyconvert" as appropriate to actually do the work. These secondary routines come in many flavors to handle different special cases as quickly as possible. */ int FXYConvert(pt, S, x, y) register struct fractpoint *pt; /* point to set */ register struct XYspace *S; /* relevant coordinate space */ register DOUBLE x,y; /* user's coordinates of point */ { pt->x = (*S->xconvert)(S->tofract.normal[0][0], S->tofract.normal[1][0], x, y); pt->y = (*S->yconvert)(S->tofract.normal[0][1], S->tofract.normal[1][1], x, y); return(0); } int IXYConvert(pt, S, x, y) register struct fractpoint *pt; /* point to set */ register struct XYspace *S; /* relevant coordinate space */ register LONG x,y; /* user's coordinates of point */ { pt->x = (*S->ixconvert)(S->itofract[0][0], S->itofract[1][0], x, y); pt->y = (*S->iyconvert)(S->itofract[0][1], S->itofract[1][1], x, y); return(0); } /* ForceFloat is a substitute for IConvert(), when we just do not have enough significant digits in the coefficients to get high enough precision in the answer with fixed point arithmetic. So, we force the integers to floats, and do the arithmetic all with floats: */ int ForceFloat(pt, S, x, y) register struct fractpoint *pt; /* point to set */ register struct XYspace *S; /* relevant coordinate space */ register LONG x,y; /* user's coordinates of point */ { (*S->convert)(pt, S, (DOUBLE) x, (DOUBLE) y); return(0); } /* :h3.FXYboth(), FXonly(), FYonly() - Floating Point Conversion These are the routines we use when the user has given us floating point numbers for x and y. FXYboth() is the general purpose routine; FXonly() and FYonly() are special cases when one of the coefficients is 0.0. */ fractpel FXYboth(cx, cy, x, y) register DOUBLE cx,cy; /* x and y coefficients */ register DOUBLE x,y; /* user x,y */ { register DOUBLE r; /* temporary float */ r = x * cx + y * cy; return((fractpel) r); } /*ARGSUSED*/ fractpel FXonly(cx, cy, x, y) register DOUBLE cx,cy; /* x and y coefficients */ register DOUBLE x,y; /* user x,y */ { register DOUBLE r; /* temporary float */ r = x * cx; return((fractpel) r); } /*ARGSUSED*/ fractpel FYonly(cx, cy, x, y) register DOUBLE cx,cy; /* x and y coefficients */ register DOUBLE x,y; /* user x,y */ { register DOUBLE r; /* temporary float */ r = y * cy; return((fractpel) r); } /* :h3.IXYboth(), IXonly(), IYonly() - Simple Integer Conversion These are the routines we use when the user has given us integers for x and y, and the coefficients have enough significant digits to provide precise answers with only "long" (32 bit?) multiplication. IXYboth() is the general purpose routine; IXonly() and IYonly() are special cases when one of the coefficients is 0. */ fractpel IXYboth(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return(x * cx + y * cy); } /*ARGSUSED*/ fractpel IXonly(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return(x * cx); } /*ARGSUSED*/ fractpel IYonly(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return(y * cy); } /* :h3.FPXYboth(), FPXonly(), FPYonly() - More Involved Integer Conversion These are the routines we use when the user has given us integers for x and y, but the coefficients do not have enough significant digits to provide precise answers with only "long" (32 bit?) multiplication. We have increased the number of significant bits in the coefficients by FRACTBITS; therefore we must use "double long" (64 bit?) multiplication by calling FPmult(). FPXYboth() is the general purpose routine; FPXonly() and FPYonly() are special cases when one of the coefficients is 0. Note that it is perfectly possible for us to calculate X with the "FP" method and Y with the "I" method, or vice versa. It all depends on how the functions in the XYspace structure are filled out. */ fractpel FPXYboth(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return( FPmult(x, cx) + FPmult(y, cy) ); } /*ARGSUSED*/ fractpel FPXonly(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return( FPmult(x, cx) ); } /*ARGSUSED*/ fractpel FPYonly(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return( FPmult(y, cy) ); } /* :h3.FillOutFcns() - Determine the Appropriate Functions to Use for Conversion This function fills out the "convert" and "iconvert" function pointers in an XYspace structure, and also fills the "helper" functions that actually do the work. */ static void FillOutFcns(S) register struct XYspace *S; /* functions will be set in this structure */ { S->convert = FXYConvert; S->iconvert = IXYConvert; FindFfcn(S->tofract.normal[0][0], S->tofract.normal[1][0], &S->xconvert); FindFfcn(S->tofract.normal[0][1], S->tofract.normal[1][1], &S->yconvert); FindIfcn(S->tofract.normal[0][0], S->tofract.normal[1][0], &S->itofract[0][0], &S->itofract[1][0], &S->ixconvert); FindIfcn(S->tofract.normal[0][1], S->tofract.normal[1][1], &S->itofract[0][1], &S->itofract[1][1], &S->iyconvert); if (S->ixconvert == NULL || S->iyconvert == NULL) S->iconvert = ForceFloat; } /* :h4.FindFfcn() - Subroutine of FillOutFcns() to Fill Out Floating Functions This function tests for the special case of one of the coefficients being zero: */ static int FindFfcn(cx, cy, fcnP) register DOUBLE cx,cy; /* x and y coefficients */ register fractpel (**fcnP)(); /* pointer to function to set */ { if (cx == 0.0) *fcnP = FYonly; else if (cy == 0.0) *fcnP = FXonly; else *fcnP = FXYboth; return(0); } /* :h4.FindIfcn() - Subroutine of FillOutFcns() to Fill Out Integer Functions There are two types of integer functions, the 'I' type and the 'FP' type. We use the I type functions when we are satisfied with simple integer arithmetic. We used the FP functions when we feel we need higher precision (but still fixed point) arithmetic. If all else fails, we store a NULL indicating that this we should do the conversion in floating point. */ static int FindIfcn(cx, cy, icxP, icyP, fcnP) register DOUBLE cx,cy; /* x and y coefficients */ register fractpel *icxP,*icyP; /* fixed point coefficients to set */ register fractpel (**fcnP)(); /* pointer to function to set */ { register fractpel imax; /* maximum of cx and cy */ *icxP = cx; *icyP = cy; if (cx != (float) (*icxP) || cy != (float) (*icyP)) { /* At this point we know our integer approximations of the coefficients are not exact. However, we will still use them if the maximum coefficient will not fit in a 'fractpel'. Of course, we have little choice at that point, but we haven't lost that much precision by staying with integer arithmetic. We have enough significant digits so that any error we introduce is less than one part in 2:sup/16/. */ imax = TYPE1_MAX(TYPE1_ABS(*icxP), TYPE1_ABS(*icyP)); if (imax < (fractpel) (1<<(FRACTBITS-1)) ) { /* At this point we know our integer approximations just do not have enough significant digits for accuracy. We will add FRACTBITS significant digits to the coefficients (by multiplying them by 1<x; y = pt->y; *xp = S->tofract.inverse[0][0] * x + S->tofract.inverse[1][0] * y; *yp = S->tofract.inverse[0][1] * x + S->tofract.inverse[1][1] * y; } /* :h2.Transformations */ /* :h3 id=xform.Xform() - Transform Object in X and Y TYPE1IMAGER wants transformations of objects like paths to be identical to transformations of spaces. For example, if you scale a line(1,1) by 10 it should yield the same result as generating the line(1,1) in a coordinate space that has been scaled by 10. We handle fonts by storing the accumulated transform, for example, SR (accumulating on the right). Then when we map the font through space TD, for example, we multiply the accumulated font transform on the left by the space transform on the right, yielding SRTD in this case. We will get the same result if we did S, then R, then T on the space and mapping an unmodified font through that space. */ struct xobject *t1_Xform(obj, M) register struct xobject *obj; /* object to transform */ register DOUBLE M[2][2]; /* transformation matrix */ { if (obj == NULL) return(NULL); if (obj->type == FONTTYPE) { register struct font *F = (struct font *) obj; F = UniqueFont(F); return((struct xobject*)F); } if (obj->type == PICTURETYPE) { /* In the case of a picture, we choose both to update the picture's transformation matrix and keep the handles up to date. */ register struct picture *P = (struct picture *) obj; register struct segment *handles; /* temporary path to transform handles */ P = UniquePicture(P); handles = PathSegment(LINETYPE, P->origin.x, P->origin.y); handles = Join(handles, PathSegment(LINETYPE, P->ending.x, P->ending.y) ); handles = (struct segment *)Xform((struct xobject *) handles, M); P->origin = handles->dest; P->ending = handles->link->dest; KillPath(handles); return((struct xobject *)P); } if (ISPATHTYPE(obj->type)) { struct XYspace pseudo; /* local temporary space */ PseudoSpace(&pseudo, M); return((struct xobject *) PathTransform(obj, &pseudo)); } if (obj->type == SPACETYPE) { register struct XYspace *S = (struct XYspace *) obj; /* replaced ISPERMANENT(S->flag) with S->references > 1 3-26-91 PNM */ if (S->references > 1) S = CopySpace(S); else S->ID = NEXTID; MatrixMultiply(S->tofract.normal, M, S->tofract.normal); /* * mark inverted matrix invalid: */ S->flag &= ~HASINVERSE(ON); FillOutFcns(S); return((struct xobject *) S); } return(ArgErr("Untransformable object", obj, obj)); } /* :h3.Transform() - Transform an Object This is the external user's entry point. */ struct xobject *t1_Transform(obj, cxx, cyx, cxy, cyy) struct xobject *obj; DOUBLE cxx,cyx,cxy,cyy; /* 2x2 transform matrix elements in row order */ { DOUBLE M[2][2]; IfTrace1((MustTraceCalls),"Transform(%p,", obj); IfTrace4((MustTraceCalls)," %f %f %f %f)\n", cxx, cyx, cxy, cyy); M[0][0] = cxx; M[0][1] = cyx; M[1][0] = cxy; M[1][1] = cyy; ConsiderContext(obj, M); return(Xform(obj, M)); } /* :h3.Scale() - Special Case of Transform() This is a user operator. */ struct xobject *t1_Scale(obj, sx, sy) struct xobject *obj; /* object to scale */ DOUBLE sx,sy; /* scale factors in x and y */ { DOUBLE M[2][2]; IfTrace3((MustTraceCalls),"Scale(%p, %f, %f)\n", obj, sx, sy); M[0][0] = sx; M[1][1] = sy; M[1][0] = M[0][1] = 0.0; ConsiderContext(obj, M); return(Xform(obj, M)); } /* :h3 id=rotate.Rotate() - Special Case of Transform() We special-case different settings of 'degrees' for performance and accuracy within the DegreeSin() and DegreeCos() routines themselves. */ #ifdef notdef struct xobject *xiRotate(obj, degrees) struct xobject *obj; /* object to be transformed */ DOUBLE degrees; /* degrees of COUNTER-clockwise rotation */ { DOUBLE M[2][2]; IfTrace2((MustTraceCalls),"Rotate(%z, %f)\n", obj, °rees); M[0][0] = M[1][1] = DegreeCos(degrees); M[1][0] = - (M[0][1] = DegreeSin(degrees)); ConsiderContext(obj, M); return(Xform(obj, M)); } #endif /* :h3.PseudoSpace() - Build a Coordinate Space from a Matrix Since we have built all this optimized code that, given an (x,y) and a coordinate space, yield transformed (x,y), it seems a shame not to use the same logic when we need to multiply an (x,y) by an arbitrary matrix that is not (initially) part of a coordinate space. This subroutine takes the arbitrary matrix and builds a coordinate space, with all its nifty function pointers. */ void PseudoSpace(S, M) struct XYspace *S; /* coordinate space structure to fill out */ DOUBLE M[2][2]; /* matrix that will become 'tofract.normal' */ { S->type = SPACETYPE; S->flag = ISPERMANENT(ON) + ISIMMORTAL(ON); S->references = 2; /* 3-26-91 added PNM */ S->tofract.normal[0][0] = M[0][0]; S->tofract.normal[1][0] = M[1][0]; S->tofract.normal[0][1] = M[0][1]; S->tofract.normal[1][1] = M[1][1]; FillOutFcns(S); } /* :h2 id=matrixa.Matrix Arithmetic Following the convention in Newman and Sproull, :hp1/Interactive Computer Graphics/, matrices are organized: :xmp. | cxx cyx | | cxy cyy | :exmp. A point is horizontal, for example: :xmp. [ x y ] :exmp. This means that: :formula/x prime = cxx times x + cxy times y/ :formula/y prime = cyx times x + cyy times y/ I've seen the other convention, where transform matrices are transposed, equally often in the literature. */ /* :h3.MatrixMultiply() - Implements Multiplication of Two Matrices Implements matrix multiplication, A * B = C. To remind myself, matrix multiplication goes rows of A times columns of B. The output matrix may be the same as one of the input matrices. */ void MatrixMultiply(A, B, C) register DOUBLE A[2][2],B[2][2]; /* input matrices */ register DOUBLE C[2][2]; /* output matrix */ { register DOUBLE txx,txy,tyx,tyy; txx = A[0][0] * B[0][0] + A[0][1] * B[1][0]; txy = A[1][0] * B[0][0] + A[1][1] * B[1][0]; tyx = A[0][0] * B[0][1] + A[0][1] * B[1][1]; tyy = A[1][0] * B[0][1] + A[1][1] * B[1][1]; C[0][0] = txx; C[1][0] = txy; C[0][1] = tyx; C[1][1] = tyy; } /* :h3.MatrixInvert() - Invert a Matrix My reference for matrix inversion was :hp1/Elementary Linear Algebra/ by Paul C. Shields, Worth Publishers, Inc., 1968. */ void MatrixInvert(M, Mprime) DOUBLE M[2][2]; /* input matrix */ DOUBLE Mprime[2][2]; /* output inverted matrix */ { register DOUBLE D; /* determinant of matrix M */ register DOUBLE txx,txy,tyx,tyy; txx = M[0][0]; txy = M[1][0]; tyx = M[0][1]; tyy = M[1][1]; D = M[1][1] * M[0][0] - M[1][0] * M[0][1]; if (D == 0.0) abort("MatrixInvert: can't", 47); Mprime[0][0] = tyy / D; Mprime[1][0] = -txy / D; Mprime[0][1] = -tyx / D; Mprime[1][1] = txx / D; } /* :h2.Initialization, Queries, and Debug */ /* :h3.InitSpaces() - Initialize Constant Spaces For compatibility, we initialize a coordinate space called USER which maps 72nds of an inch to pels on the default device. */ struct XYspace *USER = &identity; void InitSpaces() { /* extern char *DEFAULTDEVICE; */ IDENTITY->type = SPACETYPE; FillOutFcns(IDENTITY); contexts[NULLCONTEXT].normal[1][0] = contexts[NULLCONTEXT].normal[0][1] = contexts[NULLCONTEXT].inverse[1][0] = contexts[NULLCONTEXT].inverse[0][1] = 0.0; contexts[NULLCONTEXT].normal[0][0] = contexts[NULLCONTEXT].normal[1][1] = contexts[NULLCONTEXT].inverse[0][0] = contexts[NULLCONTEXT].inverse[1][1] = 1.0; USER->flag |= ISIMMORTAL(ON); CoerceInverse(USER); } /* :h3.QuerySpace() - Returns the Transformation Matrix of a Space Since the tofract matrix of an XYspace includes the scale factor necessary to produce fractpel results (i.e., FRACTFLOAT), this must be taken out before we return the matrix to the user. Fortunately, this is simple: just multiply by the inverse of IDENTITY! */ void QuerySpace(S, cxxP, cyxP, cxyP, cyyP) register struct XYspace *S; /* space asked about */ register DOUBLE *cxxP,*cyxP,*cxyP,*cyyP; /* where to put answer */ { DOUBLE M[2][2]; /* temp matrix to build user's answer */ if (S->type != SPACETYPE) { ArgErr("QuerySpace: not a space", S, NULL); return; } MatrixMultiply(S->tofract.normal, IDENTITY->tofract.inverse, M); *cxxP = M[0][0]; *cxyP = M[1][0]; *cyxP = M[0][1]; *cyyP = M[1][1]; } /* :h3.FormatFP() - Format a Fixed Point Pel We format the pel as "dddd.XXXX", where XX's are hexidecimal digits, and the dd's are decimal digits. This might be a little confusing mixing hexidecimal and decimal like that, but it is convenient to use for debug. We make sure we have N (FRACTBITS/4) digits past the decimal point. */ #define FRACTMASK ((1<> FRACTBITS, s); } /* :h3.DumpSpace() - Display a Coordinate Space */ /*ARGSUSED*/ void DumpSpace(S) register struct XYspace *S; { IfTrace4(TRUE,"--Coordinate space at %p,ID=%d,convert=%p,iconvert=%p\n", S, S->ID, S->convert, S->iconvert); IfTrace2(TRUE," | %12.3f %12.3f |", S->tofract.normal[0][0], S->tofract.normal[0][1]); IfTrace2(TRUE," [ %d %d ]\n", S->itofract[0][0], S->itofract[0][1]); IfTrace2(TRUE," | %12.3f %12.3f |", S->tofract.normal[1][0], S->tofract.normal[1][1]); IfTrace2(TRUE," [ %d %d ]\n", S->itofract[1][0], S->itofract[1][1]); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/regions.h0000664000175000017500000002117111742726711023144 0ustar uwabamiuwabami/* $XConsortium: regions.h,v 1.2 91/10/10 11:19:06 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #define Interior(p,rule) t1_Interior(p,rule) #define Union(a1,a2) t1_Union(a1,a2) #define Intersect(a1,a2) t1_Intersect(a1,a2) #define Complement(area) t1_Complement(area) #define Overlap(a1,a2) t1_OverLap(a1,a2) struct region *t1_Interior(struct segment *,int); /* returns the interior of a closed path */ struct region *t1_Union(); /* set union of paths or regions */ struct region *t1_Intersect(); /* set intersection of regions */ struct region *t1_Complement(); /* complement of a region */ int t1_Overlap(); /* returns a Boolean; TRUE if regions overlap */ /*END SHARED*/ /*SHARED*/ #define ChangeDirection(type,R,x,y,dy,x2,y2) t1_ChangeDirection(type,R,x,y,dy,x2,y2) void t1_ChangeDirection(); /* called when we change direction in Y */ #define CD_FIRST -1 /* enumeration of ChangeDirection type */ #define CD_CONTINUE 0 /* enumeration of ChangeDirection type */ #define CD_LAST 1 /* enumeration of ChangeDirection type */ #define MoreWorkArea(R,x1,y1,x2,y2) t1_MoreWorkArea(R,x1,y1,x2,y2) #define KillRegion(area) t1_KillRegion(area) #define CopyRegion(area) t1_CopyRegion(area) #define BoxClip(R,xmin,ymin,xmax,ymax) t1_BoxClip(R,xmin,ymin,xmax,ymax) #define SortSwath(a,p,f) t1_SortSwath(a,p,f) #define SwathUnion(b,e) t1_SwathUnion(b,e) #define RegionBounds(r) t1_RegionBounds(r) #define CoerceRegion(p) t1_CoerceRegion(p) #define MoveEdges(R,dx,dy) t1_MoveEdges(R,dx,dy) #define UnJumble(R) t1_UnJumble(R) void t1_MoreWorkArea(); /* get longer edge list for stepping */ struct region *t1_CopyRegion(); /* duplicate a region */ void t1_KillRegion(); /* destroy a region */ struct region *t1_BoxClip(); /* clip a region to a rectangle */ struct edgelist *t1_SortSwath(); /* sort edges onto growing edge list */ struct edgelist *t1_SwathUnion(); /* 'union' two edges into a swath */ struct segment *t1_RegionBounds(); /* returns bounding box of a region */ struct region *t1_CoerceRegion(); /* force text to become a true region */ void t1_MoveEdges(); /* moves the edge values in a region */ void t1_UnJumble(); /* sort the edges and reset the jumbled flag */ /*END SHARED*/ /*SHARED*/ #define GOING_TO(R, x1, y1, x2, y2, dy) { \ if (dy < 0) { \ if (R->lastdy >= 0) \ ChangeDirection(CD_CONTINUE, R, x1, y1, dy, x2, y2); \ if (y2 < R->edgeYstop) \ MoreWorkArea(R, x1, y1, x2, y2); \ } \ else if (dy > 0) { \ if (R->lastdy <= 0) \ ChangeDirection(CD_CONTINUE, R, x1, y1, dy, x2, y2); \ if (y2 > R->edgeYstop) \ MoreWorkArea(R, x1, y1, x2, y2); \ } \ else /* dy == 0 */ ChangeDirection(CD_CONTINUE, R, x1, y1, dy, x2, y2); \ if (x2 < R->edgexmin) R->edgexmin = x2; \ else if (x2 > R->edgexmax) R->edgexmax = x2; \ } #define MINPEL (-1<<(8*sizeof(pel)-1)) /* smallest value fitting in a pel */ #define MAXPEL ((1<<(8*sizeof(pel)-1))-1)/* largest value fitting in a pel */ /* The "Unique"-type macro is different (unique?) for regions, because some regions structures are shared among several objects, and might have to be made unique for that reason (i.e., references > 1). */ #define ConsumeRegion(R) MAKECONSUME(R,KillRegion(R)) #define UniqueRegion(R) MAKEUNIQUE(R,CopyRegion(R)) /*END SHARED*/ /*SHARED*/ struct region { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = REGIONTYPE */ struct fractpoint origin; /* beginning handle: X,Y origin of region */ struct fractpoint ending; /* ending handle: X,Y change after painting region */ pel xmin,ymin; /* minimum X,Y of region */ pel xmax,ymax; /* mat1_mum X,Y of region */ struct edgelist *anchor; /* list of edges that bound the region */ struct picture *thresholded; /* region defined by thresholded picture*/ /* Note that the ending handle and the bounding box values are stored relative to 'origin'. The above elements describe a region. The following elements are scratchpad areas used while the region is being built: */ fractpel lastdy; /* direction of last segment */ fractpel firstx,firsty; /* starting point of current edge */ fractpel edgexmin,edgexmax; /* x extent of current edge */ struct edgelist *lastedge,*firstedge; /* last and first edges in subpath */ pel *edge; /* pointer to array of X values for edge */ fractpel edgeYstop; /* Y value where 'edges' array ends */ int (*newedgefcn)(); /* function to use when building a new edge */ struct strokeinfo *strokeinfo; /* scratchpad info during stroking only */ } ; /* The ISCOMPLEMENT flag indicates the region is reversed--it is the "outside" of the nominal region. */ #define ISCOMPLEMENT(flag) ((flag)&0x80) /* The ISJUMBLED flag indicates the region is not sorted top-to-bottom. */ #define ISJUMBLED(flag) ((flag)&0x40) /* The ISINFINITE flag allows a quick check for an INFINITE region, which is frequently intersected. */ #define ISINFINITE(flag) ((flag)&0x20) /*END SHARED*/ /*SHARED*/ #define ISRECTANGULAR(flag) ((flag)&0x08) /*END SHARED*/ /*SHARED*/ #define EmptyRegion t1_EmptyRegion /*END SHARED*/ /*SHARED*/ struct edgelist { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = EDGETYPE */ struct edgelist *link; /* pointer to next in linked list */ struct edgelist *subpath; /* informational link for "same subpath" */ pel xmin,xmax; /* range of edge in X */ pel ymin,ymax; /* range of edge in Y */ pel *xvalues; /* pointer to ymax-ymin X values */ fractpel fpx1; /* Added by RMz, author of t1lib, 2002-08-15. */ fractpel fpy1; /* This produces a little memory overhead, but */ fractpel fpx2; /* gives the opportunity to take more */ fractpel fpy2; /* intelligent decisions in ApplyContinuity(). */ } ; /* The end of the list is marked by either "link" being NULL, or by ymin == ymax. See :hdref refid=discard.. We define the VALIDEDGE predicate to test for the opposite of these conditions: */ #define VALIDEDGE(p) ((p)!=NULL&&(p)->ymin<(p)->ymax) /*END SHARED*/ /*SHARED*/ #define ISDOWN(f) ((f)&0x80) #define ISAMBIGUOUS(f) ((f)&0x40) /*END SHARED*/ /*SHARED*/ /* Interior() rule enumerations: */ #define WINDINGRULE -2 #define EVENODDRULE -3 #define CONTINUITY 0x80 /* can be added to above rules; e.g. WINDINGRULE+CONTINUITY */ /*END SHARED*/ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/.dependencies0000664000175000017500000000262211742726711023754 0ustar uwabamiuwabamiarith.lo: arith.c types.h objects.h spaces.h arith.h bstring.lo: bstring.c curves.lo: curves.c types.h objects.h spaces.h paths.h regions.h \ curves.h lines.h arith.h fontfcn.lo: fontfcn.c t1imager.h types.h fontmisc.h util.h fontfcn.h \ paths_rmz.h spaces_rmz.h ../t1lib/parseAFM.h ../t1lib/t1types.h \ ../t1lib/sysconf.h ../t1lib/t1extern.h ../t1lib/t1misc.h \ ../t1lib/t1base.h ../t1lib/t1finfo.h hints.lo: hints.c types.h objects.h spaces.h paths.h regions.h hints.h lines.lo: lines.c types.h objects.h spaces.h paths.h regions.h lines.h objects.lo: objects.c types.h objects.h spaces.h paths.h regions.h \ fonts.h pictures.h strokes.h cluts.h paths.lo: paths.c types.h objects.h spaces.h paths.h regions.h fonts.h \ pictures.h strokes.h trig.h regions.lo: regions.c types.h objects.h spaces.h paths.h regions.h \ curves.h lines.h pictures.h fonts.h hints.h strokes.h scanfont.lo: scanfont.c t1stdio.h types.h util.h token.h fontfcn.h \ blues.h ../t1lib/t1misc.h spaces.lo: spaces.c types.h objects.h spaces.h paths.h pictures.h \ fonts.h arith.h trig.h t1io.lo: t1io.c t1stdio.h types.h t1hdigit.h t1snap.lo: t1snap.c objects.h types.h spaces.h paths.h t1stub.lo: t1stub.c objects.h types.h token.lo: token.c types.h t1stdio.h util.h digit.h token.h tokst.h \ hdigit.h type1.lo: type1.c types.h objects.h spaces.h paths.h fonts.h pictures.h \ util.h fontfcn.h blues.h util.lo: util.c types.h util.h fontmisc.h xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/font.h0000664000175000017500000000653311742726711022451 0ustar uwabamiuwabami/* $XConsortium: font.h,v 1.8 91/07/19 21:03:49 rws Exp $ */ /*********************************************************** Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, and the Massachusetts Institute of Technology, Cambridge, Massachusetts. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the names of Digital or MIT not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ /* $NCDId: @(#)font.h,v 1.7 1991/06/24 17:00:23 lemke Exp $ */ #ifndef FONT_H #define FONT_H #ifndef BitmapFormatByteOrderMask #include "fsmasks.h" #endif /* data structures */ typedef struct _Font *FontPtr; typedef struct _FontInfo *FontInfoPtr; typedef struct _FontProp *FontPropPtr; typedef struct _ExtentInfo *ExtentInfoPtr; typedef struct _FontPathElement *FontPathElementPtr; typedef struct _CharInfo *CharInfoPtr; typedef struct _FontNames *FontNamesPtr; typedef struct _FontResolution *FontResolutionPtr; #define NullCharInfo ((CharInfoPtr) 0) #define NullFont ((FontPtr) 0) #define NullFontInfo ((FontInfoPtr) 0) /* draw direction */ #define LeftToRight 0 #define RightToLeft 1 #define BottomToTop 2 #define TopToBottom 3 typedef int DrawDirection; #define NO_SUCH_CHAR -1 #define FontAliasType 0x1000 #define AllocError 80 #define StillWorking 81 #define FontNameAlias 82 #define BadFontName 83 #define Suspended 84 #define Successful 85 #define BadFontPath 86 #define BadCharRange 87 #define BadFontFormat 88 #define FPEResetFailed 89 /* for when an FPE reset won't work */ /* OpenFont flags */ #define FontLoadInfo 0x0001 #define FontLoadProps 0x0002 #define FontLoadMetrics 0x0004 #define FontLoadBitmaps 0x0008 #define FontLoadAll 0x000f #define FontOpenSync 0x0010 /* Query flags */ #define LoadAll 0x1 #define FinishRamge 0x2 #define EightBitFont 0x4 #define SixteenBitFont 0x8 typedef char *closure; extern int StartListFontsWithInfo( /* client, length, pattern, maxNames */ ); extern int ListFonts( /* client, length, pattern, maxNames */ ); extern FontNamesPtr MakeFontNamesRecord( /* size */ ); extern void FreeFontNames(); extern int AddFontNamesName(); extern int FontToFSError(); extern FontResolutionPtr GetClientResolution(); typedef struct _FontPatternCache *FontPatternCachePtr; extern FontPatternCachePtr MakeFontPatternCache (); extern void FreeFontPatternCache (); extern void EmtpyFontPatternCache (); extern void CacheFontPattern (); extern FontPtr FindCachedFontPattern (); extern void RemoveCachedFontPattern (); #endif /* FONT_H */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/fontxlfd.h0000664000175000017500000000323211742726711023320 0ustar uwabamiuwabami/* * $XConsortium: fontxlfd.h,v 1.1 91/05/11 09:12:07 rws Exp $ * * Copyright 1990 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, MIT X Consortium */ #ifndef _FONTXLFD_H_ #define _FONTXLFD_H_ typedef struct _FontScalable { int pixel, point, x, y, width; } FontScalableRec, *FontScalablePtr; extern Bool FontParseXLFDName(); #define FONT_XLFD_REPLACE_NONE 0 #define FONT_XLFD_REPLACE_STAR 1 #define FONT_XLFD_REPLACE_ZERO 2 #define FONT_XLFD_REPLACE_VALUE 3 #endif /* _FONTXLFD_H_ */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/curves.h0000664000175000017500000000404211742726711023003 0ustar uwabamiuwabami/* $XConsortium: curves.h,v 1.2 91/10/10 11:17:59 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #define StepConic(R,xA,yA,xB,yB,xC,yC,r) t1_StepConic(R,xA,yA,xB,yB,xC,yC,r) #define StepBezier(R,xA,yA,xB,yB,xC,yC,xD,yD) t1_StepBezier(R,xA,yA,xB,yB,xC,yC,xD,yD) #define FlattenConic(xM,yM,xC,yC,r) t1_StepConic(NULL,(fractpel)0,(fractpel)0,xM,yM,xC,yC,r) #define FlattenBezier(xB,yB,xC,yC,xD,yD) t1_StepBezier(NULL,(fractpel)0,(fractpel)0,xB,yB,xC,yC,xD,yD) struct segment *t1_StepConic(); struct segment *t1_StepBezier(); /*END SHARED*/ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/fonts.h0000664000175000017500000000354511742726711022634 0ustar uwabamiuwabami/* $XConsortium: fonts.h,v 1.2 91/10/10 11:18:09 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* STUB */ #define CopyFont(f) f #define UniqueFont(f) f #define KillFont(f) #define KillText(t) #define CopyText(t) t #define I_DumpText(t) #define CoerceText(t) t #define TextDelta(t,pt) #define XformText(p,s) #define GimeSpace() FALSE #define LibInit() #define InitFonts() #define InitFiles() #define TraceClose() #define FF_PARSE_ERROR -1 xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/t1stdio.h0000664000175000017500000000601611742726711023066 0ustar uwabamiuwabami/* $XConsortium: t1stdio.h,v 1.4 91/10/10 11:19:49 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* T1IO FILE structure and related stuff */ #include "types.h" #undef getc #undef fclose #undef ungetc #undef fgetc #undef fread #undef feof #undef ferror #undef FILE #define FILE F_FILE typedef unsigned char F_char; typedef struct F_FILE { F_char *b_base; /* Pointer to beginning of buffer */ LONG b_size; /* Size of the buffer */ F_char *b_ptr; /* Pointer to next char in buffer */ LONG b_cnt; /* Number of chars remaining in buffer */ F_char flags; /* other flags; != 0 means getc must call fgetc */ F_char ungotc; /* Place for ungotten char; flag set if present */ short error; /* error status */ int fd; /* underlying file descriptor */ } F_FILE; /* defines for flags */ #define UNGOTTENC (0x01) #define FIOEOF (0x80) #define FIOERROR (0x40) #ifndef NULL #define NULL 0 /* null pointer */ #endif #ifndef EOF #define EOF (-1) /* end of file */ #endif #define F_BUFSIZ (512) #define getc(f) \ ( \ ( ((f)->b_cnt > 0) && ((f)->flags == 0) ) ? \ ( (f)->b_cnt--, (unsigned int)*( (f)->b_ptr++ ) ) : \ T1Getc(f) \ ) extern FILE *T1Open(), *T1eexec(); extern int T1Close(F_FILE *), T1Ungetc(int,F_FILE *), T1Read(); #define fclose(f) T1Close(f) #define fopen(name,mode) T1Open(name,mode) #define ungetc(c,f) T1Ungetc(c,f) #define fgetc(f) T1Getc(f) #define fread(bufP,size,n,f) T1Read(bufP,size,n,f) #define feof(f) (((f)->flags & FIOEOF) && ((f)->b_cnt==0)) #define ferror(f) (((f)->flags & FIOERROR)?(f)->error:0) xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/ffilest.h0000664000175000017500000001030211742726711023124 0ustar uwabamiuwabami/* * $XConsortium: fontfilest.h,v 1.3 91/07/16 20:15:16 keith Exp $ * * Copyright 1991 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, MIT X Consortium */ #ifndef _FONTFILEST_H_ #define _FONTFILEST_H_ #ifdef XSERVER #include #else #include "types.h" #include "Xstuff.h" #endif #include "fontmisc.h" #include "fontstruct.h" #include "fontfile.h" #include "fontxlfd.h" typedef struct _FontName { char *name; short length; short ndashes; } FontNameRec; typedef struct _FontScaled { FontScalableRec vals; FontEntryPtr bitmap; FontPtr pFont; } FontScaledRec; typedef struct _FontScalableExtra { FontScalableRec defaults; int numScaled; int sizeScaled; FontScaledPtr scaled; pointer private; } FontScalableExtraRec; typedef struct _FontScalableEntry { FontRendererPtr renderer; char *fileName; FontScalableExtraPtr extra; } FontScalableEntryRec; /* * This "can't" work yet - the returned alias string must be permanent, * but this layer would need to generate the appropriate name from the * resolved scalable + the XLFD values passed in. XXX */ typedef struct _FontScaleAliasEntry { char *resolved; } FontScaleAliasEntryRec; typedef struct _FontBitmapEntry { FontRendererPtr renderer; char *fileName; FontPtr pFont; } FontBitmapEntryRec; typedef struct _FontAliasEntry { char *resolved; } FontAliasEntryRec; typedef struct _FontBCEntry { FontScalableRec vals; FontEntryPtr entry; } FontBCEntryRec; typedef struct _FontEntry { FontNameRec name; int type; union _FontEntryParts { FontScalableEntryRec scalable; FontBitmapEntryRec bitmap; FontAliasEntryRec alias; FontBCEntryRec bc; } u; } FontEntryRec; typedef struct _FontTable { int used; int size; FontEntryPtr entries; Bool sorted; } FontTableRec; typedef struct _FontDirectory { char *directory; ULONG dir_mtime; ULONG alias_mtime; FontTableRec scalable; FontTableRec nonScalable; } FontDirectoryRec; typedef struct _FontRenderer { char *fileSuffix; int fileSuffixLen; int (*OpenBitmap)(/* fpe, pFont, flags, entry, fileName, format, fmask */); int (*OpenScalable)(/* fpe, pFont, flags, entry, fileName, vals, format, fmask */); int (*GetInfoBitmap)(/* fpe, pFontInfo, entry, fileName */); int (*GetInfoScalable)(/* fpe, pFontInfo, entry, fileName, vals */); int number; } FontRendererRec; typedef struct _FontRenders { int number; FontRendererPtr *renderers; } FontRenderersRec, *FontRenderersPtr; typedef struct _BitmapInstance { FontScalableRec vals; FontBitmapEntryPtr bitmap; } BitmapInstanceRec, *BitmapInstancePtr; typedef struct _BitmapScalablePrivate { int numInstances; BitmapInstancePtr instances; } BitmapScalablePrivateRec, *BitmapScalablePrivatePtr; typedef struct _BitmapSources { FontPathElementPtr *fpe; int size; int count; } BitmapSourcesRec, *BitmapSourcesPtr; extern BitmapSourcesRec FontFileBitmapSources; #endif /* _FONTFILEST_H_ */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/tokst.h0000664000175000017500000007231011742726711022643 0ustar uwabamiuwabami/* $XConsortium: tokst.h,v 1.2 91/10/10 11:20:00 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* -------------------------------------- */ /* --- MACHINE GENERATED, DO NOT EDIT --- */ /* -------------------------------------- */ #ifndef TOKST #define TOKST 1 /* * State Index Tables -- * * These tables map the input character to the * proper entry in the Class Action Table. * There is one table for each state. * */ #define s0 (si0+2) static unsigned char si0[258] = { 0x10,0x11, 0x02,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x02,0x02,0x0F,0x0F,0x02,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x02,0x0F,0x0F,0x0F,0x0F,0x03,0x0F,0x0F,0x05,0x0B,0x0F,0x0D,0x0F,0x0D,0x0E,0x04, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0F,0x0F,0x08,0x0F,0x0C,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,0x07,0x0F,0x0A,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,0x06,0x0F,0x09,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F }; #define s1 (si1+2) static unsigned char si1[258] = { 0x14,0x15, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x12, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13 }; #define s2 (si2+2) static unsigned char si2[258] = { 0x1B,0x1C, 0x16,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x16,0x16,0x1A,0x1A,0x16,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x16,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x1A,0x17,0x17,0x1A,0x1A,0x1A,0x1A,0x19,0x17, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1A,0x1A,0x17,0x1A,0x17,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x17,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x17,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A }; #define s3 (si3+2) static unsigned char si3[258] = { 0x23,0x24, 0x1D,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1D,0x1D,0x22,0x22,0x1D,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x1D,0x22,0x22,0x20,0x22,0x1E,0x22,0x22,0x1E,0x1E,0x22,0x22,0x22,0x22,0x1F,0x1E, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22, 0x22,0x22,0x22,0x22,0x22,0x21,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x21,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22 }; #define s4 (si4+2) static unsigned char si4[258] = { 0x29,0x2A, 0x25,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x25,0x25,0x28,0x28,0x25,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x25,0x28,0x28,0x28,0x28,0x26,0x28,0x28,0x26,0x26,0x28,0x28,0x28,0x28,0x28,0x26, 0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x28,0x26,0x28,0x26,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x28,0x26,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x28,0x26,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28 }; #define s5 (si5+2) static unsigned char si5[258] = { 0x30,0x31, 0x2B,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2B,0x2B,0x2F,0x2F,0x2B,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2B,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2F,0x2C,0x2C,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C, 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F }; #define s6 (si6+2) static unsigned char si6[258] = { 0x36,0x37, 0x32,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x32,0x32,0x35,0x35,0x32,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x32,0x35,0x35,0x35,0x35,0x33,0x35,0x35,0x33,0x33,0x35,0x35,0x35,0x35,0x35,0x33, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35, 0x35,0x35,0x35,0x35,0x35,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35 }; #define s7 (si7+2) static unsigned char si7[258] = { 0x3D,0x3E, 0x38,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x38,0x38,0x3C,0x3C,0x38,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x38,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x3C,0x39,0x39,0x3C,0x3A,0x3C,0x3A,0x3C,0x39, 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3C,0x3C,0x39,0x3C,0x39,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x39,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x39,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C }; #define s8 (si8+2) static unsigned char si8[258] = { 0x43,0x44, 0x3F,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3F,0x3F,0x42,0x42,0x3F,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x3F,0x42,0x42,0x42,0x42,0x40,0x42,0x42,0x40,0x40,0x42,0x42,0x42,0x42,0x42,0x40, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x42,0x42,0x40,0x42,0x40,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x42,0x40,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x42,0x40,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42 }; #define s9 (si9+2) static unsigned char si9[258] = { 0x48,0x49, 0x45,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x45,0x45,0x47,0x47,0x45,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x45,0x47,0x47,0x47,0x47,0x46,0x47,0x47,0x46,0x46,0x47,0x47,0x47,0x47,0x47,0x46, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47 }; #define s10 (si10+2) static unsigned char si10[258] = { 0x4E,0x4F, 0x4A,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4A,0x4A,0x4D,0x4D,0x4A,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4A,0x4D,0x4D,0x4D,0x4D,0x4B,0x4D,0x4D,0x4B,0x4B,0x4D,0x4D,0x4D,0x4D,0x4D,0x4B, 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4D,0x4D,0x4B,0x4D,0x4B,0x4D, 0x4D,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C, 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4B,0x4D,0x4B,0x4D,0x4D, 0x4D,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C, 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4B,0x4D,0x4B,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D }; #define s11 (si11+2) static unsigned char si11[258] = { 0x53,0x54, 0x50,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x50,0x50,0x52,0x52,0x50,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x50,0x52,0x52,0x52,0x52,0x51,0x52,0x52,0x51,0x51,0x52,0x52,0x52,0x52,0x52,0x51, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52 }; /* * Class Action Table -- * * The entries in the Class Action Table indicate the * action routine to be called, and the next state to * enter, for each relevant character class in each. * state. There are several entries for each state. * */ static int AAH_NAME(); static int BREAK_SIGNAL(); static int HEX_STRING(); static int IMMED_NAME(); static int INTEGER(); static int LEFT_BRACE(); static int LEFT_BRACKET(); static int LITERAL_NAME(); static int NAME(); static int NO_TOKEN(); static int OOPS_NAME(); static int RADIX_NUMBER(); static int REAL(); static int RIGHT_ANGLE(); static int RIGHT_BRACE(); static int RIGHT_BRACKET(); static int RIGHT_PAREN(); static int STRING(); static int add_1st_decpt(); static int add_1st_digits(); static int add_char(); static int add_decpt(); static int add_digits(); static int add_e_sign(); static int add_exponent(); static int add_fraction(); static int add_r_digits(); static int add_radix(); static int add_sign(); static int next_char(); static int skip_comment(); static int skip_space(); static struct cat { int (*actionRoutineP)(); unsigned char *nextStateP; } classActionTable[] = { /* s0: Classify initial character */ /* 00 ALPHA */ {NAME, s0}, /* executable name */ /* 01 DIGIT */ {add_1st_digits, s3}, /* number? */ /* 02 WHITE_SPACE */ {skip_space, s0}, /* skip white space */ /* 03 PERCENT */ {skip_comment, s0}, /* comment? */ /* 04 SLASH */ {next_char, s1}, /* literal or imm name */ /* 05 LEFT_PAREN */ {STRING, s0}, /* string */ /* 06 LEFT_BRACE */ {LEFT_BRACE, s0}, /* begin procedure body */ /* 07 LEFT_BRACKET */ {LEFT_BRACKET, s0}, /* begin array */ /* 08 LEFT_ANGLE */ {HEX_STRING, s0}, /* hex string? */ /* 09 RIGHT_BRACE */ {RIGHT_BRACE, s0}, /* end procedure body */ /* 0A RIGHT_BRACKET */ {RIGHT_BRACKET, s0}, /* end array */ /* 0B RIGHT_PAREN */ {RIGHT_PAREN, s0}, /* unmatched right paren */ /* 0C RIGHT_ANGLE */ {RIGHT_ANGLE, s0}, /* unmatched right angle */ /* 0D SIGN */ {add_sign, s2}, /* signed number? */ /* 0E DECIMAL_POINT */ {add_1st_decpt, s4}, /* real number? */ /* 0F ANY */ {NAME, s0}, /* executable name */ /* 10 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 11 EOF */ {NO_TOKEN, s0}, /* no token found */ /* s1: Further classify a '/' */ /* 12 SLASH */ {IMMED_NAME, s0}, /* immediate name */ /* 13 ANY */ {LITERAL_NAME, s0}, /* literal name */ /* 14 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 15 EOF */ {OOPS_NAME, s0}, /* isolated sign */ /* s2: sign */ /* 16 WHITE_SPACE */ {OOPS_NAME, s0}, /* isolated sign */ /* 17 SPECIAL */ {OOPS_NAME, s0}, /* isolated sign */ /* 18 DIGIT */ {add_digits, s3}, /* number? */ /* 19 DECIMAL_POINT */ {add_decpt, s4}, /* real number? */ /* 1A ANY */ {NAME, s0}, /* executable name */ /* 1B BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 1C EOF */ {OOPS_NAME, s0}, /* isolated sign */ /* s3: sign? digit+ */ /* 1D WHITE_SPACE */ {INTEGER, s0}, /* n-digit integer */ /* 1E SPECIAL */ {INTEGER, s0}, /* n-digit integer */ /* 1F DECIMAL_POINT */ {add_char, s5}, /* real number? */ /* 20 POUND */ {add_radix, s10}, /* radix number? */ /* 21 eE */ {add_char, s7}, /* real with exponent? */ /* 22 ANY */ {AAH_NAME, s0}, /* executable name */ /* 23 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 24 EOF */ {INTEGER, s0}, /* n-digit integer */ /* s4: sign? . */ /* 25 WHITE_SPACE */ {OOPS_NAME, s0}, /* isolated +. or -. */ /* 26 SPECIAL */ {OOPS_NAME, s0}, /* isolated +. or -. */ /* 27 DIGIT */ {add_fraction, s6}, /* number? */ /* 28 ANY */ {NAME, s0}, /* executable name */ /* 29 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 2A EOF */ {OOPS_NAME, s0}, /* isolated +. or -. */ /* s5: sign? digit+ . */ /* 2B WHITE_SPACE */ {REAL, s0}, /* real with fraction */ /* 2C SPECIAL */ {REAL, s0}, /* real with fraction */ /* 2D eE */ {add_char, s7}, /* real with exponent? */ /* 2E DIGIT */ {add_fraction, s6}, /* number? */ /* 2F ANY */ {AAH_NAME, s0}, /* executable name */ /* 30 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 31 EOF */ {REAL, s0}, /* real with fraction */ /* s6: sign? (digit+ . digit+) | (. digit+) */ /* 32 WHITE_SPACE */ {REAL, s0}, /* real with fraction */ /* 33 SPECIAL */ {REAL, s0}, /* real with fraction */ /* 34 eE */ {add_char, s7}, /* real with exponent? */ /* 35 ANY */ {AAH_NAME, s0}, /* executable name */ /* 36 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 37 EOF */ {REAL, s0}, /* real with fraction */ /* s7: sign? ((digit+ (. digit*)?) | (. digit+)) Ee */ /* 38 WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid real number */ /* 39 SPECIAL */ {OOPS_NAME, s0}, /* invalid real number */ /* 3A SIGN */ {add_e_sign, s8}, /* real w signed exponent? */ /* 3B DIGIT */ {add_exponent, s9}, /* real w exponent ? */ /* 3C ANY */ {AAH_NAME, s0}, /* executable name */ /* 3D BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 3E EOF */ {OOPS_NAME, s0}, /* invalid real number */ /* s8: sign? (digit+ (. digit*)? | (digit* . digit+) Ee sign */ /* 3F WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid real number */ /* 40 SPECIAL */ {OOPS_NAME, s0}, /* invalid real number */ /* 41 DIGIT */ {add_exponent, s9}, /* real w exponent? */ /* 42 ANY */ {AAH_NAME, s0}, /* executable name */ /* 43 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 44 EOF */ {OOPS_NAME, s0}, /* invalid real number */ /* s9: sign? (digit+ (. digit*)? | (digit* . digit+) Ee sign? digit+ */ /* 45 WHITE_SPACE */ {REAL, s0}, /* real w exponent */ /* 46 SPECIAL */ {REAL, s0}, /* real w exponent */ /* 47 ANY */ {AAH_NAME, s0}, /* executable name */ /* 48 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 49 EOF */ {REAL, s0}, /* real w exponent */ /* s10: digit+ # */ /* 4A WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid radix number */ /* 4B SPECIAL */ {OOPS_NAME, s0}, /* invalid radix number */ /* 4C R_DIGIT */ {add_r_digits, s11}, /* radix number? */ /* 4D ANY */ {AAH_NAME, s0}, /* executable name */ /* 4E BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 4F EOF */ {OOPS_NAME, s0}, /* invalid radix number */ /* s11: digit+ # r_digit+ */ /* 50 WHITE_SPACE */ {RADIX_NUMBER, s0}, /* radix number */ /* 51 SPECIAL */ {RADIX_NUMBER, s0}, /* radix number */ /* 52 ANY */ {AAH_NAME, s0}, /* executable name */ /* 53 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 54 EOF */ {RADIX_NUMBER, s0} /* radix number */ }; /* * Character Classification Tables -- * * The entries in the Character Classification Tables * map character codes to character classes. The * tables contains one entry per code. The bits in * each entry indicate which classes the character * code belongs to. * * The macros 'isInCLASS(ch)' generate code to test * whether 'ch' is a character in 'CLASS'. * */ /* Membership macros for classes defined in table 1 ... */ #define isRADIX_DIGIT(c) ((isInP1[c] & 0x80) != 0) #define isHEX_DIGIT(c) ((isInP1[c] & 0x40) != 0) #define isDECIMAL_DIGIT(c) ((isInP1[c] & 0x10) != 0) #define isOCTAL_DIGIT(c) ((isInP1[c] & 0x20) != 0) /* Membership macros for classes defined in table 2 ... */ #define isWHITE_SPACE(c) ((isInP2[c] & 0x80) != 0) #define isCOMMENT(c) ((isInP2[c] & 0x40) != 0) #define isNAME(c) ((isInP2[c] & 0x20) != 0) #define isSTRING_SPECIAL(c) ((isInP2[c] & 0x10) != 0) #define isNUMBER_ENDER(c) ((isInP2[c] & 0x08) != 0) #define isInP1 (isInT1+2) static unsigned char isInT1[258] = { 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xF0,0xF0,0xF0,0xF0,0xF0,0xD0,0xD0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,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 }; #define isInP2 (isInT2+2) static unsigned char isInT2[258] = { 0x18,0x18, 0xC8,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xC8,0x88,0x60,0x60,0x98,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0xC8,0x60,0x60,0x60,0x60,0x48,0x60,0x60,0x58,0x58,0x60,0x60,0x60,0x60,0x60,0x48, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x60,0x48,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x70,0x48,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x60,0x48,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60 }; #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/hints.c0000664000175000017500000007756011742726711022633 0ustar uwabamiuwabami/* $XConsortium: hints.c,v 1.4 91/10/10 11:18:13 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* HINTS CWEB V0006 ******** */ /* :h1.HINTS Module - Processing Rasterization Hints &author. Sten F. Andler; continuity by Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) and Duaine W. Pryor, Jr. :h3.Include Files The included files are: */ #include #include "types.h" #include "objects.h" #include "spaces.h" #include "paths.h" #include "regions.h" #include "hints.h" /* :h3.Functions Provided to the TYPE1IMAGER User None. */ /* :h3.Functions Provided to Other Modules This module provides the following entry point to other modules: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Macros Provided to Other Modules None. */ /* :h2.InitHints() - Initialize hint data structure */ #define MAXLABEL 20 static struct { int inuse; int computed; struct fractpoint hint; } oldHint[MAXLABEL]; #define ODD(x) (((int)(x)) & 01) #define FPFLOOR(fp) TOFRACTPEL((fp) >> FRACTBITS) #define FPROUND(fp) FPFLOOR((fp) + FPHALF) void InitHints() { int i; for (i = 0; i < MAXLABEL; i++) { oldHint[i].inuse = FALSE; oldHint[i].computed = FALSE; } } /* :h3.CloseHints(hintP) - Reverse hints that are still open */ void CloseHints(hintP) struct fractpoint *hintP; { int i; for (i = 0; i < MAXLABEL; i++) { if (oldHint[i].inuse) { hintP->x -= oldHint[i].hint.x; hintP->y -= oldHint[i].hint.y; oldHint[i].inuse = FALSE; IfTrace3((HintDebug > 1)," Hint %d was open, hint=(%d,%d)\n", i, hintP->x, hintP->y); } } } /* :h3.ComputeHint(hP, currX, currY, hintP) - Compute the value of a hint */ static void ComputeHint(hP, currX, currY, hintP) struct hintsegment *hP; fractpel currX, currY; struct fractpoint *hintP; { fractpel currRef=0, currWidth=0; int idealWidth; fractpel hintValue=0; char orientation; /* By construction, width is never zero. Therefore we can use the width value to determine if the hint has been rotated by a multiple of 90 degrees. */ if (hP->width.y == 0) { orientation = 'v'; /* vertical */ IfTrace0((HintDebug > 0)," vertical hint\n"); } else if (hP->width.x == 0) { orientation = 'h'; /* horizontal */ IfTrace0((HintDebug > 0)," horizontal hint\n"); } else { IfTrace0((HintDebug > 0)," hint not vertical or horizontal\n"); hintP->x = hintP->y = 0; return; } /* Compute currRef and currWidth with a unit of 1 pel */ if (orientation == 'v') /* vertical */ { currRef = hP->ref.x + currX; currWidth = TYPE1_ABS(hP->width.x); } else if (orientation == 'h') /* horizontal */ { currRef = hP->ref.y + currY; currWidth = TYPE1_ABS(hP->width.y); } else /* error */ { abort("ComputeHint: invalid orientation", 4); } IfTrace4((HintDebug > 1), " currX=%d, currY=%d, currRef=%d, currWidth=%d\n", currX, currY, currRef, currWidth); if ((hP->hinttype == 'b') /* Bar or stem */ || (hP->hinttype == 's')) /* Serif */ { idealWidth = NEARESTPEL(currWidth); if (idealWidth == 0) idealWidth = 1; if (ODD(idealWidth)) /* Is ideal width odd? */ { /* center "ref" over pel */ hintValue = FPFLOOR(currRef) + FPHALF - currRef; } else { /* align "ref" on pel boundary */ hintValue = FPROUND(currRef) - currRef; } if (HintDebug > 2) { IfTrace1(TRUE," idealWidth=%d, ", idealWidth); } } else if (hP->hinttype == 'c') /* Curve extrema */ { /* align "ref" on pel boundary */ hintValue = FPROUND(currRef) - currRef; } else /* error */ { abort("ComputeHint: invalid hinttype", 5); } IfTrace1((HintDebug > 1)," hintValue=%d", hintValue); if (orientation == 'v') /* vertical */ { hintP->x = hintValue; hintP->y = 0; } else if (orientation == 'h') /* horizontal */ { hintP->x = 0; hintP->y = hintValue; } else /* error */ { abort("ComputeHint: invalid orientation", 6); } } /* :h3.ProcessHint(hP, currX, currY, hintP) - Process a rasterization hint */ void ProcessHint(hP, currX, currY, hintP) struct hintsegment *hP; fractpel currX, currY; struct fractpoint *hintP; { struct fractpoint thisHint; IfTrace4((HintDebug > 1)," ref=(%d,%d), width=(%d,%d)", hP->ref.x, hP->ref.y, hP->width.x, hP->width.y); IfTrace4((HintDebug > 1),", %c %c %c %c", hP->orientation, hP->hinttype, hP->adjusttype, hP->direction); IfTrace1((HintDebug > 1),", label=%d\n", hP->label); if ((hP->adjusttype == 'm') /* Move */ || (hP->adjusttype == 'a')) /* Adjust */ { /* Look up hint in oldHint table */ if ((hP->label >= 0) && (hP->label < MAXLABEL)) { if (oldHint[hP->label].computed) /* Use old hint value if already computed */ { thisHint.x = oldHint[hP->label].hint.x; thisHint.y = oldHint[hP->label].hint.y; oldHint[hP->label].inuse = TRUE; } else /* Compute new value for hint and store it for future use */ { ComputeHint(hP, currX, currY, &thisHint); oldHint[hP->label].hint.x = thisHint.x; oldHint[hP->label].hint.y = thisHint.y; oldHint[hP->label].inuse = TRUE; oldHint[hP->label].computed = TRUE; } } else /* error */ { abort("ProcessHint: invalid label", 7); } } else if (hP->adjusttype == 'r') /* Reverse */ { /* Use the inverse of the existing hint value to reverse hint */ if ((hP->label >= 0) && (hP->label < MAXLABEL)) { if (oldHint[hP->label].inuse) { thisHint.x = -oldHint[hP->label].hint.x; thisHint.y = -oldHint[hP->label].hint.y; oldHint[hP->label].inuse = FALSE; } else /* error */ { abort("ProcessHint: label is not in use", 8); } } else /* error */ { abort("ProcessHint: invalid label", 9); } } else /* error */ { abort("ProcessHint: invalid adjusttype", 10); } IfTrace3((HintDebug > 1)," label=%d, thisHint=(%d,%d)\n", hP->label, thisHint.x, thisHint.y); hintP->x += thisHint.x; hintP->y += thisHint.y; IfTrace2((HintDebug > 1)," hint=(%d,%d)\n", hintP->x, hintP->y); } /* :h2 id=subpath.Navigation Through Edge Lists For continuity checking purposes, we need to navigate through edge lists by the "subpath" chains and answer questions about edges. The subpath chain links together edges that were part of the same subpath (no intervening move segments) when the interior of the path was calculated. Here we use the term "edge" to mean every edge list that was created in between changes of direction. The subpath chains are singly-linked circular chains. For the convenience of building them, they direction of the list (from edge to edge) is the reverse of the order in which they were built. Within any single edge, the subpath chain goes from top-to-bottom. (There might be a violation of this because of the way the user started the first chain; see :hdref refid=fixsubp..). :h3.ISTOP() and ISBOTTOM() - Flag Bits for Edge Lists at the Top and Bottom of Their SubPaths */ #define ISTOP(flag) ((flag)&0x20) #define ISBOTTOM(flag) ((flag)&0x10) /* :h3.ISLEFT() - Flag Bit for Left Edges */ #define ISLEFT(flag) ((flag)&0x08) /* :h3.XofY() - Macro to Find X Value at Given Y This macro can only be used if it is known that the Y is within the given edgelist's ymin and ymax. */ #define XofY(edge, y) edge->xvalues[y - edge->ymin] /* :h3.findXofY() - Like XofY(), Except not Restricted If the Y is out of bounds of the given edgelist, this macro will call SearchXofY to search the edge's subpath chain for the correct Y range. If the Y value is off the edge, MINPEL is returned. */ #define findXofY(edge, y) ((y < edge->ymin || y >= edge->ymax) ? SearchXofY(edge, y) : XofY(edge, y)) /* :h4.SearchXofY() - Routine Called by FindXofY() for Difficult Cases The concept of this routine is to follow the subpath chain to find the edge just below (i.e., next in chain) or just above (i.e., immediately before in chain. It is assumed that the Y value is no more than one off of the edge's range; XofY() could be replace by FindXofY() to call ourselves recursively if this were not true. */ static pel SearchXofY(edge, y) register struct edgelist *edge; /* represents edge */ register pel y; /* 'y' value to find edge for */ { register struct edgelist *e; /* loop variable */ if (y < edge->ymin) { if (ISTOP(edge->flag)) { return(MINPEL); } for (e = edge->subpath; e->subpath != edge; e = e->subpath) { ; } if (e->ymax == edge->ymin) { return(XofY(e, y)); } } else if (y >= edge->ymax) { if (ISBOTTOM(edge->flag)) { return(MINPEL); } e = edge->subpath; if (e->ymin == edge->ymax) { return(XofY(e, y)); } } else { return(XofY(edge, y)); } abort("bad subpath chain", 11); /*NOTREACHED*/ /* To make ANSI-C-compiler happy: */ return(y); } /* :h3.ISBREAK() Macro - Tests if an Edge List is at a "Break" The subpath chains are organized top to bottom. When the bottom of a given edge is reached, the subpath chain points to the top of the next edge. We call this a "break" in the chain. The following macro is the simple test for the break condition: */ #define ISBREAK(top,bot) (top->ymax != bot->ymin) /* :h3.ImpliedHorizontalLine() - Tests for Horizontal Connectivity This function returns true if two edges are connected horizontally. They are connected horizontally if they are consecutive in the subpath, and either we are at the bottom and the first edge is going down or we are at the top and the first edge is going up. */ #define BLACKABOVE -1 #define BLACKBELOW +1 #define NONE 0 static int ImpliedHorizontalLine(e1, e2, y) register struct edgelist *e1,*e2; /* two edges to check */ register int y; /* y where they might be connected */ { register struct edgelist *e3,*e4; if (ISDOWN(e1->flag) == ISDOWN(e2->flag)) return(NONE); /* can't be consecutive unless different directions */ /* Now we check for consecutiveness: Can we get from 'e1' to 'e2' with only one intervening break? Can we get from 'e2' to 'e1' with only one intervening break? 'e3' will be as far as we can get after 'e1'; 'e4' will be has far as we can get after 'e2': */ for (e3 = e1; !ISBREAK(e3, e3->subpath); e3 = e3->subpath) { ; } for (e3 = e3->subpath; e3 != e2; e3 = e3->subpath) if (ISBREAK(e3, e3->subpath)) break; for (e4 = e2; !ISBREAK(e4, e4->subpath); e4 = e4->subpath) { ; } for (e4 = e4->subpath; e4 != e1; e4 = e4->subpath) if (ISBREAK(e4, e4->subpath)) break; /* If the edges are mutually consecutive, we must have horizontal lines both top and bottom: */ if (e3 == e2 && e4 == e1) return(TRUE); /* If the edges are not consecutive either way, no horizontal lines are possible: */ if (e3 != e2 && e4 != e1) return(NONE); /* Now let's swap 'e1' and 'e2' if necessary to enforce the rule that 'e2' follows 'e1'. Remember that subpath chains go in the opposite direction from the way the subpaths were built; this led to the simplest way do build them. */ if (e4 != e1) { e2 = e1; e1 = e3; /* remember e3 == e2, this just swaps 'e1' and 'e2' */ } /* Now we have everything to return the answer: */ if (ISTOP(e1->flag) && y == e1->ymin) return(ISDOWN(e2->flag)); else if (ISBOTTOM(e1->flag) && y == e1->ymax) return(!ISDOWN(e2->flag)); else abort("ImpliedHorizontalLine: why ask?", 12); /*NOTREACHED*/ /* To make ANSI-C-compiler happy */ return(0); } /* :h3 id=fixsubp.FixSubPaths() - Must be Called to Organize Subpath Chains The region-building code in Interior(), in particular splitedge(), maintains the rule that sub-paths are linked top-to-bottom except at breaks. However, it is possible that there may be a "false break" because the user started the subpath in the middle of an edge (and went in the "wrong" direction from there, up instead of down). This routine finds and fixes false breaks. Also, this routine sets the ISTOP and ISBOTTOM flags in the edge lists. */ static void FixSubPaths(R) register struct region *R; /* anchor of region */ { register struct edgelist *e; /* fast loop variable */ register struct edgelist *edge; /* current edge in region */ register struct edgelist *next; /* next in subpath after 'edge' */ register struct edgelist *break1; /* first break after 'next' */ register struct edgelist *break2=NULL; /* last break before 'edge' */ register struct edgelist *prev; /* previous edge for fixing links */ int left = TRUE; for (edge = R->anchor; edge != NULL; edge = edge->link) { if (left) edge->flag |= ISLEFT(ON); left = !left; next = edge->subpath; if (!ISBREAK(edge, next)) continue; if (edge->ymax < next->ymin) abort("disjoint subpath?", 13); /* 'edge' now contains an edgelist at the bottom of an edge, and 'next' contains the next subsequent edgelist in the subpath, which must be at the top. We refer to this a "break" in the subpath. */ next->flag |= ISTOP(ON); edge->flag |= ISBOTTOM(ON); if (ISDOWN(edge->flag) != ISDOWN(next->flag)) continue; /* We are now in the unusual case; both edges are going in the same direction so this must be a "false break" due to the way that the user created the path. We'll have to fix it. */ for (break1 = next; !ISBREAK(break1, break1->subpath); break1 = break1->subpath) { ; } for (e = break1->subpath; e != edge; e = e->subpath) if (ISBREAK(e, e->subpath)) break2 = e; /* Now we've set up 'break1' and 'break2'. I've found the following diagram invaluable. 'break1' is the first break after 'next'. 'break2' is the LAST break before 'edge'. &drawing. next +------+ +---->+------+ +--->| >-----+ | | >-----+ | | | | | | | | | +-------------+ | +-------------+ | | |break1| | | | | | +->| >-------+ +->| >-----+ | | | | | | | | | +-------------+ | +------+ | | | | +----------------+ | | | | | +------+ | +->| >-----+ | +->| >-----+ | | | | | | | | | +-------------+ | +-------------+ | | | | | | |edge | | | |break2| | +->| >-----+ | +->| >-----+ | | | | | | | | | | | | | | | | | | | | | | | | | +------+ | | +------+ | | | | | +---------------+ +---------------+ &edrawing. We want to fix this situation by having 'edge' point to where 'break1' now points, and having 'break1' point to where 'break2' now points. Finally, 'break2' should point to 'next'. Also, we observe that 'break1' can't be a bottom, and is also not a top unless it is the same as 'next': */ edge->subpath = break1->subpath; break1->subpath = break2->subpath; if (ISBREAK(break1, break1->subpath)) abort("unable to fix subpath break?", 14); break2->subpath = next; break1->flag &= ~ISBOTTOM(ON); if (break1 != next) break1->flag &= ~ISTOP(ON); } /* This region might contain "ambiguous" edges; edges exactly equal to edge->link. Due to the random dynamics of where they get sorted into the list, they can yield false crossings, where the edges appear to cross. This confuses our continuity logic no end. Since we can swap them without changing the region, we do. */ for (edge = R->anchor, prev = NULL; VALIDEDGE(edge); prev = edge, edge = prev->link) { if (! ISAMBIGUOUS(edge->flag)) { continue; } next = edge->subpath; while (ISAMBIGUOUS(next->flag) && next != edge) { next = next->subpath; } /* We've finally found a non-ambiguous edge; we make sure it is left/right compatible with 'edge': */ if ( (ISLEFT(edge->flag) == ISLEFT(next->flag) && ISDOWN(edge->flag) == ISDOWN(next->flag) ) || (ISLEFT(edge->flag) != ISLEFT(next->flag) && ISDOWN(edge->flag) != ISDOWN(next->flag) ) ) { continue; } /* Incompatible, we will swap 'edge' and the following edge in the list. You may think that there must be a next edge in this swath. So did I. No! If there is a totally ambiguous inner loop, for example, we could get all the way to the outside without resolving ambiguity. */ next = edge->link; /* note new meaning of 'next' */ if (next == NULL || edge->ymin != next->ymin) { continue; } /* printf(" Swap: \n"); printf(" Edge=0x%x, ymin=%d, ymax=%d, xmin=%d, xmax=%d, fpx1=%ld, fpx2=%ld\n", edge, edge->ymin, edge->ymax, edge->xmin, edge->xmax, edge->fpx1, edge->fpx2); printf(" Link=0x%x, ymin=%d, ymax=%d, xmin=%d, xmax=%d, fpx1=%ld, fpx2=%ld\n", next, next->ymin, next->ymax, next->xmin, next->xmax, next->fpx1, next->fpx2); printf(" Edge=0x%x (amb=%d), x[ymin]=%d, x[ymax]=%d, px1=%ld, px2=%ld\n", edge, ISAMBIGUOUS(edge->flag), edge->xvalues[0], edge->xvalues[edge->ymax - edge->ymin], edge->fpx1>>FRACTBITS, edge->fpx2>>FRACTBITS); printf(" Link=0x%x (amb=%d), x[ymin]=%d, x[ymax]=%d, px1=%ld, px2=%ld\n", next, ISAMBIGUOUS(next->flag), next->xvalues[0], next->xvalues[next->ymax - next->ymin], next->fpx1>>FRACTBITS, next->fpx2>>FRACTBITS); */ /* Check ambiguity also for link edge (RMz) */ if ( !ISAMBIGUOUS(next->flag) ) { continue; } if (prev == NULL) R->anchor = next; else prev->link = next; edge->link = next->link; next->link = edge; edge->flag ^= ISLEFT(ON); edge->flag &= ~ISAMBIGUOUS(ON); next->flag ^= ISLEFT(ON); next->flag &= ~ISAMBIGUOUS(ON); edge = next; } } /* :h3.DumpSubPaths() A debug tool. */ static struct edgelist *before(); /* subroutine of DumpSubPaths */ static void DumpSubPaths(anchor) struct edgelist *anchor; { register struct edgelist *edge,*e,*e2; pel y; for (edge = anchor; VALIDEDGE(edge); edge = edge->link) { if (ISPERMANENT(edge->flag)) continue; IfTrace0(TRUE, "BEGIN Subpath\n"); for (e2 = edge; !ISPERMANENT(e2->flag);) { if (ISDOWN(e2->flag)) { IfTrace1(TRUE, ". Downgoing edge's top at %p\n", e2); for (e = e2;; e = e->subpath) { IfTrace4(TRUE, ". . [%5d] %5d @ %p[%x]\n", e->ymin, *e->xvalues, e, e->flag); for (y=e->ymin+1; y < e->ymax; y++) IfTrace2(TRUE, ". . [%5d] %5d \"\n", y, e->xvalues[y-e->ymin]); e->flag |= ISPERMANENT(ON); if (ISBREAK(e, e->subpath)) break; } } else { IfTrace1(TRUE, ". Upgoing edge's top at %p\n", e2); for (e = e2; !ISBREAK(e, e->subpath); e = e->subpath) { ; } for (;; e=before(e)) { IfTrace4(TRUE, ". . [%5d] %5d @ %p[%x]\n", e->ymax-1, e->xvalues[e->ymax-1-e->ymin], e, e->flag); for (y=e->ymax-2; y >= e->ymin; y--) IfTrace2(TRUE, ". . [%5d] %5d \"\n", y, e->xvalues[y-e->ymin]); e->flag |= ISPERMANENT(ON); if (e == e2) break; } } do { e2 = before(e2); } while (!ISBREAK(before(e2), e2)); } } } static struct edgelist *before(e) struct edgelist *e; { struct edgelist *r; for (r = e->subpath; r->subpath != e; r = r->subpath) { ; } return(r); } /* :h2.Fixing Region Continuity Problems Small regions may become disconnected when their connecting segments are less than a pel wide. This may be correct in some applications, but in many (especially small font characters), it is more pleasing to keep connectivity. ApplyContinuity() (invoked by +CONTINUITY on the Interior() fill rule) fixes connection breaks. The resulting region is geometrically less accurate, but may be more pleasing to the eye. */ /* Here are some macros which we will need: */ #define IsValidPel(j) (j!=MINPEL) /* :h3.writeXofY() - Stuffs an X Value Into an "edgelist" writeXofY writes an x value into an edge at position 'y'. It must update the edge's xmin and xmax. If there is a possibility that this new x might exceed the region's bounds, updating those are the responsibility of the caller. */ static void writeXofY(e, y, x) struct edgelist *e; /* relevant edgelist */ int y; /* y value */ int x; /* new x value */ { if (e->xmin > x) e->xmin = x; if (e->xmax < x) e->xmax = x; e->xvalues[y - e->ymin] = x; } /*-------------------------------------------------------------------------*/ /* the following three macros tell us whether we are at a birth point, a */ /* death point, or simply in the middle of the character */ /*-------------------------------------------------------------------------*/ #define WeAreAtTop(e,i) (ISTOP(e->flag) && e->ymin == i) #define WeAreAtBottom(e,i) (ISBOTTOM(e->flag) && e->ymax-1 == i) #define WeAreInMiddle(e,i) \ ((!ISTOP(e->flag) && !ISBOTTOM(e->flag))||(i < e->ymax-1 && i > e->ymin)) /* The following macro tests if two "edgelist" structures are in the same swath: */ #define SAMESWATH(e1,e2) (e1->ymin == e2->ymin) /* :h3.CollapseWhiteRun() - Subroutine of ApplyContinuity() When we have a white run with an implied horizontal line above or below it, we better have black on the other side of this line. This function both tests to see if black is there, and adjusts the end points (collapses) the white run as necessary if it is not. The goal is to collapse the white run as little as possible. */ static void CollapseWhiteRun(anchor, yblack, left, right, ywhite) struct edgelist *anchor; /* anchor of edge list */ pel yblack; /* y of (hopefully) black run above or below */ struct edgelist *left; /* edgelist at left of WHITE run */ struct edgelist *right; /* edgelist at right of WHITE run */ pel ywhite; /* y location of white run */ { struct edgelist *edge; struct edgelist *swathstart = anchor; register pel x; if (XofY(left, ywhite) >= XofY(right, ywhite)) return; /* Find the swath with 'yblack'. If we don't find it, completely collapse the white run and return: */ while (VALIDEDGE(swathstart)) { if (yblack < swathstart->ymin) { writeXofY(left, ywhite, XofY(right, ywhite)); return; } if (yblack < swathstart->ymax) break; swathstart = swathstart->link->link; } if(!VALIDEDGE(swathstart)) { writeXofY(left, ywhite, XofY(right, ywhite)); return; } /* Now we are in the swath that contains 'y', the reference line above or below that we are trying to maintain continuity with. If black in this line begins in the middle of our white run, we must collapse the white run from the left to that point. If black ends in the middle of our white run, we must collapse the white run from the right to that point. */ for (edge = swathstart; VALIDEDGE(edge); edge = edge->link) { if (!SAMESWATH(swathstart,edge)) break; if( XofY(edge, yblack) > XofY(left, ywhite)) { if (ISLEFT(edge->flag)) { x = XofY(edge, yblack); if (XofY(right, ywhite) < x) x = XofY(right, ywhite); writeXofY(left, ywhite, x); } else { x = XofY(edge, yblack); while (edge->link != NULL && SAMESWATH(edge, edge->link) && x >= XofY(edge->link, yblack) ) { edge = edge->link->link; x = XofY(edge, yblack); } if (x < XofY(right, ywhite)) writeXofY(right, ywhite, x); return; } } } writeXofY(left, ywhite, XofY(right, ywhite)); } /* :h3.ApplyContinuity() - Fix False Breaks in a Region This is the externally visible routine called from the REGIONS module when the +CONTINUITY flag is on the Interior() fill rule. */ void ApplyContinuity(R) struct region *R; { struct edgelist *left; struct edgelist *right; struct edgelist *edge,*e2; pel rightXabove,rightXbelow,leftXabove,leftXbelow; pel leftX,rightX; int i; long edgecnt = 0; fractpel xavrg = 0; LONG newcenter,abovecenter,belowcenter; FixSubPaths(R); if ( RegionDebug >= 3) DumpSubPaths(R->anchor); left = R->anchor; /* loop through and do all of the easy checking. ( no tops or bottoms) */ while(VALIDEDGE(left)) { right = left->link; for(i=left->ymin;iymax;++i) { leftX = findXofY(left,i); rightX = findXofY(right,i); leftXbelow = findXofY(left,i+1); rightXbelow = findXofY(right,i+1); if(rightX <= leftX) { /* then, we have a break in a near vertical line */ leftXabove = findXofY(left,i-1); rightXabove = findXofY(right,i-1); /* Check above current scanline */ if ( IsValidPel(leftXabove) && IsValidPel(rightXabove) ) { abovecenter = leftXabove + rightXabove; } else { /* We are at the top. We can assume that the current edge list is just started --> Inspect the stored start fractpel values in order to decide about to which side to extend. --> Compute arithmetic average between left and right edge at high resolution */ xavrg = ((left->fpx1 + right->fpx1) >> 1); /* round down to get left (not nearest!) and get right edge by adding one pel. */ leftXabove = (xavrg >> FRACTBITS); rightXabove = leftXabove + 1; abovecenter = leftXabove + rightXabove; belowcenter = leftXabove + rightXabove; } /* Check below current scanline */ if ( IsValidPel(leftXbelow) && IsValidPel(rightXbelow) ) { belowcenter = leftXbelow + rightXbelow; } else { /* We are at the bottom. We can assume that the current edge list terminates here --> Inspect the stored end fractpel values in order to decide about to which side to extend. --> Compute arithmetic average between left and right edge at high resolution */ xavrg = ((left->fpx2 + right->fpx2) >> 1); /* round down to get left (not nearest!) and get right edge by adding one pel. */ leftXbelow = (xavrg >> FRACTBITS); rightXbelow = leftXbelow + 1; abovecenter = leftXbelow + rightXbelow; belowcenter = leftXbelow + rightXbelow; } newcenter = abovecenter + belowcenter; if( newcenter > 4*leftX ) { rightX = rightX + 1; writeXofY(right,i,rightX); } else if( newcenter < 4*leftX) { leftX = leftX - 1; writeXofY(left,i,leftX); } else { rightX = rightX + 1; writeXofY(right,i,rightX); } if ( rightX > R->xmax ) { R->xmax = rightX; } if ( leftX < R->xmin ) { R->xmin = leftX; } } if( !WeAreAtBottom(left,i) && (leftXbelow>=rightX)) { /* then we have a break in a near horizontal line in the middle */ writeXofY(right,i,leftXbelow); } if( !WeAreAtBottom(right,i) && (leftX >=rightXbelow)) { /* then we have a break in a near horizontal line in the middle */ writeXofY(left,i,rightXbelow); } } left = right->link; ++edgecnt; } /* There may be "implied horizontal lines" between edges that have implications for continuity. This loop looks for white runs that have implied horizontal lines on the top or bottom, and calls CollapseWhiteRuns to check and fix any continuity problems from them. */ for (edge = R->anchor; VALIDEDGE(edge); edge = edge->link) { if ((!ISTOP(edge->flag) && !ISBOTTOM(edge->flag)) || ISLEFT(edge->flag)) continue; /* at some future date we may want left edge logic here too */ for (e2 = edge->link; VALIDEDGE(e2) && SAMESWATH(edge,e2); e2 = e2->link) { if (ISTOP(e2->flag) && ISTOP(edge->flag) && NONE != ImpliedHorizontalLine(edge,e2,edge->ymin)) { if (ISLEFT(e2->flag)) CollapseWhiteRun(R->anchor, edge->ymin-1, edge, e2, edge->ymin); } if (ISBOTTOM(e2->flag) && ISBOTTOM(edge->flag) && NONE != ImpliedHorizontalLine(edge,e2, edge->ymax)) { if (ISLEFT(e2->flag)) CollapseWhiteRun(R->anchor, edge->ymax, edge, e2, edge->ymax-1); } } } } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/spaces.h0000664000175000017500000001352711742726711022762 0ustar uwabamiuwabami/* $XConsortium: spaces.h,v 1.3 91/10/10 11:19:22 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #include "types.h" #define USER t1_User #define IDENTITY t1_Identity #define Context(d,u) t1_Context(d,u) #define Transform(o,f1,f2,f3,f4) t1_Transform(o,f1,f2,f3,f4) #define Rotate(o,d) t1_Rotate(o,d) #define Scale(o,sx,sy) t1_Scale(o,sx,sy) #define QuerySpace(S,f1,f2,f3,f4) t1_QuerySpace(S,f1,f2,f3,f4) #define Warp(s1,o,s2) t1_Warp(s1,o,s2) struct XYspace *t1_Context(); /* creates a coordinate space for a device */ struct xobject *t1_Transform(); /* transform an object */ struct xobject *t1_Rotate(); /* rotate an object */ struct xobject *t1_Scale(); /* scale an object */ struct xobject *t1_Warp(); /* transform like delta of two spaces */ void t1_QuerySpace(); /* returns coordinate space matrix */ /*END SHARED*/ /*SHARED*/ #define DeviceResolution t1_DeviceResolution #define InitSpaces() t1_InitSpaces() #define CopySpace(s) t1_CopySpace(s) #define Xform(o,M) t1_Xform(o,M) #define UnConvert(S,pt,xp,yp) t1_UnConvert(S,pt,xp,yp) #define MatrixMultiply(A,B,C) t1_MMultiply(A,B,C) #define MatrixInvert(A,B) t1_MInvert(A,B) #define PseudoSpace(S,M) t1_PseudoSpace(S,M) #define FindContext(M) t1_FindContext(M) void t1_InitSpaces(); /* initialize pre-defined coordinate spaces */ struct XYspace *t1_CopySpace(); /* duplicate a coordinate space */ struct xobject *t1_Xform(); /* transform object by matrix */ void t1_UnConvert(); /* return user coordinates from device coordinates */ void t1_MMultiply(); /* multiply two matrices */ void t1_MInvert(); /* invert a matrix */ void t1_PseudoSpace(); /* force a coordinate space from a matrix */ int t1_FindContext(); /* return the "context" represented by a matrix */ /*END SHARED*/ /*SHARED*/ /* #define KillSpace(s) Free(s) Note - redefined KillSpace() to check references ! 3-26-91 PNM */ #define KillSpace(s) if ( (--(s->references) == 0) ||\ ( (s->references == 1) && ISPERMANENT(s->flag) ) )\ Free(s) #define ConsumeSpace(s) MAKECONSUME(s,KillSpace(s)) #define UniqueSpace(s) MAKEUNIQUE(s,CopySpace(s)) /*END SHARED*/ /*SHARED*/ typedef SHORT pel; /* integer pel locations */ typedef LONG fractpel; /* fractional pel locations */ #define FRACTBITS 16 /* number of fractional bits in 'fractpel' */ /* We define the following macros to convert from 'fractpel' to 'pel' and vice versa: */ #define TOFRACTPEL(p) (((fractpel)p)<>FRACTBITS) #define FRACTFLOAT (DOUBLE)(1L<> N) + (((ULONG) dl.high) << (LONGSIZE - N)); \ dl.high >>= N; \ } /*END SHARED*/ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/lines.c0000664000175000017500000001313311742726711022602 0ustar uwabamiuwabami/* $XConsortium: lines.c,v 1.2 91/10/10 11:18:21 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* LINES CWEB V0003 ******** */ /* :h1.LINES Module - Rasterizing Lines &author. Duaine W. Pryor, Jr. and Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) :h3.Include Files The included files are: */ #include #include "types.h" #include "objects.h" #include "spaces.h" #include "paths.h" #include "regions.h" #include "lines.h" /* :h3.Functions Provided to the TYPE1IMAGER User None. */ /* :h3.Functions Provided to Other Modules This module provides the following entry point to other modules: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Macros Provided to Other Modules None. */ /* :h2.StepLine() - Produces Run Ends for a Line After Checks The main work is done by Bresenham(); here we just perform checks and get the line so that its Y direction is always increasing: */ void StepLine(R, x1, y1, x2, y2) register struct region *R; /* region being built */ register fractpel x1,y1; /* starting point */ register fractpel x2,y2; /* ending point */ { register fractpel dy; IfTrace4((LineDebug > 0), ".....StepLine: (%d,%d) to (%d,%d)\n", x1, y1, x2, y2); dy = y2 - y1; /* We execute the "GOING_TO" macro to call back the REGIONS module, if necessary (like if the Y direction of the edge has changed): */ GOING_TO(R, x1, y1, x2, y2, dy); if (dy == 0) return; if (dy < 0) Bresenham(R->edge, x2, y2, x1, y1); else Bresenham(R->edge, x1, y1, x2, y2); return; } /* :h3.Bresenham() - Actually Produces Run Ends This routine runs a Bresenham line-stepping algorithm. See, for example, Newman and Sproul, :hp1/Principles of Interactive Computer Graphics/, pp. 25-27. When we enter this, we are guaranteed that dy is positive. We'd like to work in 8 bit precision, so we'll define some macros and constants to let us do that: */ #define PREC 8 /* we'll keep fraction pels in 8 bit precision */ /* RoundFP() rounds down by 'b' bits: */ #define RoundFP(xy,b) (((xy)+(1<<((b)-1)))>>(b)) /* TruncFP() truncates down by 'b' bits: */ #define TruncFP(xy,b) ((xy)>>(b)) void Bresenham(edgeP,x1,y1,x2,y2) register pel *edgeP; /* pointer to top of list (y == 0) */ register fractpel x1,y1; /* starting point on line */ register fractpel x2,y2; /* ending point on the line (down) */ { register LONG dx,dy; /* change in x and y, in my own precision */ register LONG x,y; /* integer pel starting point */ register int count; /* integer pel delta y */ register LONG d; /* the Bresenham algorithm error term */ x1 = TruncFP(x1, FRACTBITS-PREC); y1 = TruncFP(y1, FRACTBITS-PREC); x2 = TruncFP(x2, FRACTBITS-PREC); y2 = TruncFP(y2, FRACTBITS-PREC); dx = x2 - x1; dy = y2 - y1; /* Find the starting x and y integer pel coordinates: */ x = RoundFP(x1,PREC); y = RoundFP(y1,PREC); edgeP += y; count = RoundFP(y2,PREC) - y; /*------------------------------------------------------------------*/ /* Force dx to be positive so that dfy will be negative */ /* this means that vertical moves will decrease d */ /*------------------------------------------------------------------*/ if (dx<0) { dx = -dx; #define P PREC d=(dy*(x1-(x<>P; #undef P while(--count >= 0 ) { while(d<0) { --x; d += dy; } *(edgeP++) = x; d -= dx; } } else /* positive dx */ { if ( dx == 0 ) { while(--count >= 0 ) { *(edgeP++) = x; } return; } #define P PREC d = (dy*((x<>P; #undef P while(--count >= 0 ) { while(d<0) { ++x; d += dy; } *(edgeP++) = x; d -= dx; } } } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/util.h0000664000175000017500000001715111742726711022456 0ustar uwabamiuwabami/* $XConsortium: util.h,v 1.3 92/03/26 16:42:29 eswu Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #ifndef UTIL_H #define UTIL_H #include "types.h" #ifndef boolean typedef int boolean; #endif #ifndef TRUE #define TRUE (1) #endif #ifndef FALSE #define FALSE (0) #endif /***================================================================***/ /* Portable definitions for 2's complement machines. * NOTE: These really should be based on PostScript types, * for example, sizeof(ps_integer), or sizeof(ps_unsigned) */ #define MAX_ULONG (~(ULONG)(0)) /* This code is portable, assuming K&R C and 2's complement arithmetic */ #define MAX_INTEGER \ ((LONG)((((ULONG) 1)<<(sizeof(ULONG)*8-1))-1)) #define MIN_INTEGER ((-MAX_INTEGER)-1) #define MAX_ARRAY_CNT (65535) #define MAX_DICT_CNT (65535) #define MAX_STRING_LEN (65535) #define MAX_NAME_LEN (128) /* this is the size of memory allocated for reading fonts */ #define VM_SIZE (50*1024) /***================================================================***/ #ifndef TYPE1_MIN #define TYPE1_MIN(a,b) (((a)<(b)) ? a : b ) #endif /***================================================================***/ /* Routines for managing virtual memory */ /***================================================================***/ extern boolean vm_init(); extern LONG vm_free; extern LONG vm_size; extern char *vm_next; extern char *vm_alloc(); /***================================================================***/ /* Macros for managing virtual memory */ /***================================================================***/ #define vm_next_byte() (vm_next) #define vm_free_bytes() (vm_free) #define vm_avail(B) (B <= vm_free) /***================================================================***/ /* Types of PostScript objects */ /***================================================================***/ #define OBJ_INTEGER (0) #define OBJ_REAL (1) #define OBJ_BOOLEAN (2) #define OBJ_ARRAY (3) #define OBJ_STRING (4) #define OBJ_NAME (5) #define OBJ_FILE (6) #define OBJ_ENCODING (7) /***================================================================***/ /* Value of PostScript objects */ /***================================================================***/ typedef union ps_value { char *valueP; /* value pointer for unspecified type */ int value; /* value for unspecified type */ int integer; /* when type is OBJ_INTEGER */ float real; /* when type is OBJ_REAL */ int boolean; /* when type is OBJ_BOOLEAN */ struct ps_obj *arrayP; /* when type is OBJ_ARRAY */ unsigned char *stringP; /* when type is OBJ_STRING */ char *nameP; /* when type is OBJ_NAME */ FILE *fileP; /* when type is OBJ_FILE */ } psvalue; /***================================================================***/ /* Definition of a PostScript object */ /***================================================================***/ typedef struct ps_obj { char type; char unused; unsigned short len; union ps_value data; } psobj; /***================================================================***/ /* Definition of a PostScript Dictionary Entry */ /***================================================================***/ typedef struct ps_dict { psobj key; psobj value; } psdict; /***================================================================***/ /* Macros for testing type of PostScript objects */ /***================================================================***/ #define objIsInteger(o) ((o).type == OBJ_INTEGER) #define objIsReal(o) ((o).type == OBJ_REAL) #define objIsBoolean(o) ((o).type == OBJ_BOOLEAN) #define objIsArray(o) ((o).type == OBJ_ARRAY) #define objIsString(o) ((o).type == OBJ_STRING) #define objIsName(o) ((o).type == OBJ_NAME) #define objIsFile(o) ((o).type == OBJ_FILE) /***================================================================***/ /* Macros for setting type of PostScript objects */ /***================================================================***/ #define objSetInteger(o) ((o).type = OBJ_INTEGER) #define objSetReal(o) ((o).type = OBJ_REAL) #define objSetBoolean(o) ((o).type = OBJ_BOOLEAN) #define objSetArray(o) ((o).type = OBJ_ARRAY) #define objSetString(o) ((o).type = OBJ_STRING) #define objSetName(o) ((o).type = OBJ_NAME) #define objSetFile(o) ((o).type = OBJ_FILE) /***================================================================***/ /* Macros for testing type of PostScript objects (pointer access) */ /***================================================================***/ #define objPIsInteger(o) ((o)->type == OBJ_INTEGER) #define objPIsReal(o) ((o)->type == OBJ_REAL) #define objPIsBoolean(o) ((o)->type == OBJ_BOOLEAN) #define objPIsArray(o) ((o)->type == OBJ_ARRAY) #define objPIsString(o) ((o)->type == OBJ_STRING) #define objPIsName(o) ((o)->type == OBJ_NAME) #define objPIsFile(o) ((o)->type == OBJ_FILE) /***================================================================***/ /* Macros for setting type of PostScript objects (pointer access) */ /***================================================================***/ #define objPSetInteger(o) ((o)->type = OBJ_INTEGER) #define objPSetReal(o) ((o)->type = OBJ_REAL) #define objPSetBoolean(o) ((o)->type = OBJ_BOOLEAN) #define objPSetArray(o) ((o)->type = OBJ_ARRAY) #define objPSetString(o) ((o)->type = OBJ_STRING) #define objPSetName(o) ((o)->type = OBJ_NAME) #define objPSetFile(o) ((o)->type = OBJ_FILE) /***================================================================***/ /* Entry point for Type1Char to get entry from CharStrings */ /***================================================================***/ extern psobj *GetType1CharString(); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/type1.c0000664000175000017500000046143611742726711022547 0ustar uwabamiuwabami/* $XConsortium: type1.c,v 1.5 91/10/10 11:20:06 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * Portions Copyright (c) 1990 Adobe Systems Incorporated. * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark or Adobe * not be used in advertising or publicity pertaining to distribution of * the software without specific, written prior permission. * * IBM, LEXMARK, AND ADOBE PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY * WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE * ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING * ANY DUTY TO SUPPORT OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY * PORTION OF THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM, * LEXMARK, OR ADOBE) ASSUMES THE ENTIRE COST OF ALL SERVICING, REPAIR AND * CORRECTION. IN NO EVENT SHALL IBM, LEXMARK, OR ADOBE BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /*********************************************************************/ /* */ /* Type 1 module - Converting fonts in Adobe Type 1 Font Format */ /* to scaled and hinted paths for rasterization. */ /* Files: type1.c, type1.h, and blues.h. */ /* */ /* Authors: Sten F. Andler, IBM Almaden Research Center */ /* (Type 1 interpreter, stem & flex hints) */ /* */ /* Patrick A. Casey, Lexmark International, Inc. */ /* (Font level hints & stem hints) */ /* */ /*********************************************************************/ /* Write debug info into a PostScript file? */ /* #define DUMPDEBUGPATH */ /* If Dumping a debug path, should we dump both character and outline path? Warning: Do never enable this, unless, your name is Rainer Menzner and you know what you are doing! */ /* #define DUMPDEBUGPATHBOTH */ /* Generate a bunch of stderr output to understand and debug the generation of outline surrounding curves */ /* #define DEBUG_OUTLINE_SURROUNDING */ #define SUBPATH_CLOSED 1 #define SUBPATH_OPEN 0 /******************/ /* Include Files: */ /******************/ #include "types.h" #include /* a system-dependent include, usually */ #include #include #include "objects.h" #include "spaces.h" #include "paths.h" #include "fonts.h" /* understands about TEXTTYPEs */ #include "pictures.h" /* understands about handles */ typedef struct xobject xobject; #include "util.h" /* PostScript objects */ #include "fontfcn.h" #include "blues.h" /* Blues structure for font-level hints */ /* Considerations about hinting (2002-07-11, RMz (Author of t1lib)) It turns out that the hinting code as used until now produces some artifacts in which may show up in suboptimal bitmaps. I have therefore redesigned the algorithm. It is generally a bad idea to hint every point that falls into a stem hint. The idea is to hint only points for which at least one of the two neighboring curve/line segments is aligned with the stem in question. For curves, we are speaking about the tangent line, that is, the line defined by (p1-p2) or (p3-p4). For vertical stems this means, that only points which are connected exactly into vertical direction are hinted. That is, the dx of the respective curve vanishes. For horizontal stems, accordingly, dy must vanish at least on one hand side of the point in order to be considered as a stem. Unfortunately this principle requires information about both sides of the neighborhood of the point in question. In other words, it is not possible to define a segment completely until the next segment has been inspected. The idea thus is not compatible with the code in this file. Furthermore, if certain points of a character outline are hinted according to the stem hint info from the charstring, the non-hinted points may not be left untouched. This would lead to very strong artifacts at small sizes, especially if characters are defined in terms of curves. This is predominantly the case for ComputerModern, for example. To conclude, it is best to build a point list from the character description adjust the non-hinted points after hinting has been completely finished. Another rule we should state is We can work around this by not directly connecting the path segments at the end of the lineto/curveto's, but rather deferring this to the beginning of the next path constructing function. It's not great but it should work. The functions that produce segments are 1) RMoveTo() 2) RLineto() 3) RRCurveTo() 4) DoClosePath() Their code is moved into the switch statement of the new function handleCurrentSegment(). This function is called when a new segment generating operation has been decoded from the charstring. At this point a serious decision about how to hint the points is possible. ... */ /* The following struct is used to record points that define a path in absolute charspace coordinates. x and y describe the location and hinted, if greater 0, indicates that this point has been hinted. Bit 0 (0x1) indicates vertically adjusted and Bit 1 (0x2) indicates horizontally adjusted. If hinted == -1, this point is not to be hinted at all. This, for example, is the case for a a (H)SBW command. The member type can be one of PPOINT_SBW --> initial path point as setup by (H)SBW PPOINT_MOVE --> point that finishes a MOVE segment PPOINT_LINE --> point that finishes a LINE segment PPOINT_BEZIER_B --> second point of a BEZIER segment PPOINT_BEZIER_C --> third point of a BEZIER segment PPOINT_BEZIER_D --> fourth point of a BEZIER segment PPOINT_CLOSEPATH --> a ClosePath command PPOINT_ENDCHAR --> an EndChar command PPOINT_SEAC --> a Standard Encoding Accented Char command PPOINT_NONE --> an invalid entry Note: BEZIER_B and BEZIER_C points generally cannot be flagged as being hinted because are off-curve points. */ typedef struct { double x; /* x-coordinate */ double y; /* y-coordinate */ double ax; /* adjusted x-coordinate */ double ay; /* adjusted y-coordinate */ double dxpr; /* x-shift in right path due to incoming segment (previous) */ double dypr; /* y-shift in right path due to incoming segment (previous) */ double dxnr; /* x-shift in right path due to outgoing segment (next) */ double dynr; /* y-shift in right path due to incoming segment (next) */ double dxir; /* x-shift in right path resulting from prologation of the linkend tangents (intersect) */ double dyir; /* y-shift in right path resulting from prologation of the linkend tangents (intersect) */ double dist2prev; /* distance to the previous point in path (used only for stroking) */ double dist2next; /* distance to the next point in path (used only for stroking) */ enum { PPOINT_SBW, PPOINT_MOVE, PPOINT_LINE, PPOINT_BEZIER_B, PPOINT_BEZIER_C, PPOINT_BEZIER_D, PPOINT_CLOSEPATH, PPOINT_ENDCHAR, PPOINT_SEAC, PPOINT_NONE } type; /* type of path point */ signed char hinted; /* is this point hinted? */ unsigned char shape; /* is the outline concave or convex or straight at this point? This flag is only relevant for onCurve points in the context of stroking! */ } PPOINT; #define CURVE_NONE 0x00 #define CURVE_STRAIGHT 0x01 #define CURVE_CONVEX 0x02 #define CURVE_CONCAVE 0x03 #ifdef DEBUG_OUTLINE_SURROUNDING static char* pptypes[] = { "PPOINT_SBW", "PPOINT_MOVE", "PPOINT_LINE", "PPOINT_BEZIER_B", "PPOINT_BEZIER_C", "PPOINT_BEZIER_D", "PPOINT_CLOSEPATH", "PPOINT_ENDCHAR", "PPOINT_SEAC" }; static char* ppshapes[] = { "SHAPE_OFFCURVE", "SHAPE_STRAIGHT", "SHAPE_CONVEX", "SHAPE_CONCAVE" }; #endif /* The PPOINT structs are organized in an array which is allocated in chunks of 256 entries. A new point is allocated by a call to nextPPoint and returns the index in the array of the newly allocated point. */ static PPOINT* ppoints = NULL; static long numppoints = 0; static long numppointchunks = 0; static int closepathatfirst = 0; static long nextPPoint( void) { ++numppoints; /* Check whether to reallocate */ if ( numppoints > (numppointchunks * 256) ) { ++numppointchunks; ppoints = (PPOINT*) realloc( ppoints, (numppointchunks * 256) * sizeof( PPOINT)); } /* return the current index */ return numppoints-1; } static void createFillPath( void); static void createStrokePath( double strokewidth, int subpathclosed); static void createClosedStrokeSubPath( long startind, long stopind, double strokewidth, int subpathclosed); static long computeDistances( long startind, long stopind, int subpathclosed); static void transformOnCurvePathPoint( double strokewidth, long prevind, long currind, long lastind); static void transformOffCurvePathPoint( double strokewidth, long currind); /* values for flag: INTERSECT_PREVIOUS: only take previous path segment into account. INTERSECT_NEXT: only take next path segment into account. INTERSECT_BOTH: do a real intersection */ #define INTERSECT_PREVIOUS -1 #define INTERSECT_NEXT 1 #define INTERSECT_BOTH 0 static void intersectRight( long index, double halfwidth, long flag); /* values for orientation: PATH_LEFT: we are constructing the left path. PATH_RIGHT: we are constructing the right path. */ #define PATH_LEFT 1 #define PATH_RIGHT 0 /* values for position: PATH_START: current point starts the current path (use next-values). PATH_END: current point ends the current path (use prev-values). */ #define PATH_START 0 #define PATH_END 1 static void linkNode( long index, int position, int orientation); static long handleNonSubPathSegments( long pindex); static void handleCurrentSegment( long pindex); static void adjustBezier( long pindex); static double size; static double scxx, scyx, scxy, scyy; static double up; #ifdef DUMPDEBUGPATH static FILE* psfile = NULL; static void PSDumpProlog( FILE* fp); static void PSDumpEpilog( FILE* fp); #endif /* variables for querying SEAC from external */ static int isseac = 0; static unsigned char seacbase = 0; static unsigned char seacaccent = 0; /**********************************/ /* Type1 Constants and Structures */ /**********************************/ #define MAXSTACK 24 /* Adobe Type1 limit */ #define MAXCALLSTACK 10 /* Adobe Type1 limit */ #define MAXPSFAKESTACK 32 /* Max depth of fake PostScript stack (local) */ #define MAXSTRLEN 512 /* Max length of a Type 1 string (local) */ #define MAXLABEL 256 /* Maximum number of new hints */ #define MAXSTEMS 512 /* Maximum number of VSTEM and HSTEM hints */ #define EPS 0.001 /* Small number for comparisons */ /************************************/ /* Adobe Type 1 CharString commands */ /************************************/ #define HSTEM 1 #define VSTEM 3 #define VMOVETO 4 #define RLINETO 5 #define HLINETO 6 #define VLINETO 7 #define RRCURVETO 8 #define CLOSEPATH 9 #define CALLSUBR 10 #define RETURN 11 #define ESCAPE 12 #define HSBW 13 #define ENDCHAR 14 #define RMOVETO 21 #define HMOVETO 22 #define VHCURVETO 30 #define HVCURVETO 31 /* The following charstring code appears in some old Adobe font files in space and .notdef character and does not seems to do anything useful aside from taking two args from the stack. We allow this command and ignore it. The source code of ghostscript states that this command is obsolete *and* undocumented. This code may also appear in an Escape-sequence! */ #define UNKNOWN_15 15 /*******************************************/ /* Adobe Type 1 CharString Escape commands */ /*******************************************/ #define DOTSECTION 0 #define VSTEM3 1 #define HSTEM3 2 #define SEAC 6 #define SBW 7 #define DIV 12 #define CALLOTHERSUBR 16 #define POP 17 #define SETCURRENTPOINT 33 /* Note: We use routines from libm because in the original macro definitions, the evaluation order of tmpx is undefined by C-standard! */ #define USE_MATHLIB_ROUTINES #ifdef USE_MATHLIB_ROUTINES #define FABS(x) (fabs (x)) #define CEIL(x) ((LONG) ceil (x)) #define FLOOR(x) ((LONG) floor (x)) #else /*****************/ /* Useful macros */ /*****************/ static DOUBLE tmpx; /* Store macro argument in tmpx to avoid re-evaluation */ static LONG tmpi; /* Store converted value in tmpi to avoid re-evaluation */ #define FABS(x) (((tmpx = (x)) < 0.0) ? -tmpx : tmpx) #define CEIL(x) (((tmpi = (LONG) (tmpx = (x))) < tmpx) ? ++tmpi : tmpi) #define FLOOR(x) (((tmpi = (LONG) (tmpx = (x))) > tmpx) ? --tmpi : tmpi) #endif #define ROUND(x) FLOOR((x) + 0.5) #define ODD(x) (((int)(x)) & 01) #define CC IfTrace1(TRUE, "Char \"%s\": ", currentchar) /* To make some compiler happy we have to care about return types! */ #define Errori {errflag = TRUE; return 0;} /* integer */ #define Errord {errflag = TRUE; return 0.0;} /* double */ #define Errorv {errflag = TRUE; return;} /* void */ #define Error0i(errmsg) { CC; IfTrace0(TRUE, errmsg); Errori;} #define Error0d(errmsg) { CC; IfTrace0(TRUE, errmsg); Errord;} #define Error0v(errmsg) { CC; IfTrace0(TRUE, errmsg); Errorv;} #define Error1i(errmsg,arg) { CC; IfTrace1(TRUE, errmsg, arg); Errori;} #define Error1d(errmsg,arg) { CC; IfTrace1(TRUE, errmsg, arg); Errord;} #define Error1v(errmsg,arg) { CC; IfTrace1(TRUE, errmsg, arg); Errorv;} /********************/ /* global variables */ /********************/ struct stem { /* representation of a STEM hint */ int vertical; /* TRUE if vertical, FALSE otherwise */ DOUBLE x, dx; /* interval of vertical stem */ DOUBLE y, dy; /* interval of horizontal stem */ DOUBLE alx, aldx; /* interval of grid-aligned vertical stem */ DOUBLE aly, aldy; /* interval of grid-aligned horizontal stem */ double lbhintval; /* adjustment value for left or bottom hint */ double rthintval; /* adjustment value for right ir top hint */ }; /******************************************************/ /* Subroutines and statics for the Type1Char routines */ /******************************************************/ static int strindex; /* index into PostScript string being interpreted */ static double currx, curry; /* accumulated x and y values */ static double hcurrx, hcurry; /* accumulated values with hinting */ struct callstackentry { psobj *currstrP; /* current CharStringP */ int currindex; /* current strindex */ unsigned short currkey; /* current decryption key */ }; static DOUBLE Stack[MAXSTACK]; static int Top; static struct callstackentry CallStack[MAXCALLSTACK]; static int CallTop; static DOUBLE PSFakeStack[MAXPSFAKESTACK]; static int PSFakeTop; extern struct XYspace *IDENTITY; static DOUBLE escapementX, escapementY; static DOUBLE sidebearingX, sidebearingY; static DOUBLE accentoffsetX, accentoffsetY; static struct segment *path; /* path of basechar */ static struct segment *apath; /* pass of accent char */ static int errflag; /*************************************************/ /* Global variables to hold Type1Char parameters */ /*************************************************/ static char *Environment; static char *currentchar; static struct XYspace *CharSpace; static psobj *CharStringP, *SubrsP, *OtherSubrsP; static int *ModeP; /************************/ /* Forward declarations */ /************************/ static DOUBLE Div(); static DOUBLE PSFakePop(); static int DoCommand(); static int Escape(); static int HStem(); static int VStem(); static int RLineTo(); static int RRCurveTo(); static int DoClosePath(); static int CallSubr(); static int Return(); static int EndChar(); static int RMoveTo(); static int DotSection(); static int Seac(); static int Sbw(); static int CallOtherSubr(); static int SetCurrentPoint(); /******************************************************/ /* statics for Font level hints (Blues) (see blues.h) */ /******************************************************/ static struct blues_struct *blues; /* the blues structure */ static struct alignmentzone alignmentzones[MAXALIGNMENTZONES]; int numalignmentzones; /* total number of alignment zones */ /****************************************************************/ /* Subroutines for the Font level hints (Alignment zones, etc.) */ /****************************************************************/ /* Flags to control the rasterizer */ #define T1_IGNORE_FORCEBOLD 0x0001 #define T1_IGNORE_FAMILYALIGNMENT 0x0002 #define T1_IGNORE_HINTING 0x0004 #define T1_DEBUG_LINE 0x0100 #define T1_DEBUG_REGION 0x0200 #define T1_DEBUG_PATH 0x0400 #define T1_DEBUG_FONT 0x0800 #define T1_DEBUG_HINT 0x1000 int T1_Type1OperatorFlags; /* for manipulation from t1lib */ static void SetRasterFlags( void) { if (T1_Type1OperatorFlags & T1_IGNORE_HINTING) ProcessHints=0; else ProcessHints=1; if ( T1_Type1OperatorFlags & T1_DEBUG_LINE) LineDebug=1; else LineDebug=0; if ( T1_Type1OperatorFlags & T1_DEBUG_REGION) RegionDebug=1; else RegionDebug=0; if ( T1_Type1OperatorFlags & T1_DEBUG_PATH) PathDebug=1; else PathDebug=0; if ( T1_Type1OperatorFlags & T1_DEBUG_FONT) FontDebug=1; else FontDebug=0; if ( T1_Type1OperatorFlags & T1_DEBUG_HINT) HintDebug=1; else HintDebug=0; return; } /******************************************/ /* Fill in the alignment zone structures. */ /******************************************/ static int ComputeAlignmentZones() { int i; DOUBLE dummy, bluezonepixels, familyzonepixels; struct segment *p; numalignmentzones = 0; /* initialize total # of zones */ /* Remarks by RMz (Author of t1lib): The handling of substitution of the BlueValues by the FamilyBlues and correspondingly for the OtherBlues and FamilyOtherBlues is not clearly documented. These are the problems: 1) Does the number of FamilyBlues entries need to be identical to that of BlueValues? 2) Obviously, the order of the alignment zones in the BlueValues and the FamilyBlues need not be same (see TimesBold.pfa) 3) Is it wise/recommended to make the substitution on a per alignment-zone level or global, i.e., if once then for all zones? 4) The principle found below, checking the delta-height of an alignment-zone and making a decision based on this is incorrect. The decision has to be done according to absolute pixel values at which a feature would be rendered with the BlueValues and the FamilyBlues respectively. To conclude, it seems better to disable the Family-feature until these things are well-known/defined. */ /* do the BlueValues zones */ for (i = 0; i < blues->numBlueValues; i +=2, ++numalignmentzones) { /* the 0th & 1st numbers in BlueValues are for a bottom zone */ /* the rest are topzones */ if (i == 0) /* bottom zone */ alignmentzones[numalignmentzones].topzone = FALSE; else /* top zone */ alignmentzones[numalignmentzones].topzone = TRUE; /* Check FamilyAlignment suppression */ if ( (T1_Type1OperatorFlags & T1_IGNORE_FAMILYALIGNMENT)==0) { if (i < blues->numFamilyBlues) { /* we must consider FamilyBlues */ p = ILoc(CharSpace,0,blues->BlueValues[i] - blues->BlueValues[i+1]); QueryLoc(p, IDENTITY, &dummy, &bluezonepixels); Destroy(p); p = ILoc(CharSpace,0,blues->FamilyBlues[i] - blues->FamilyBlues[i+1]); QueryLoc(p, IDENTITY, &dummy, &familyzonepixels); Destroy(p); /* is the difference in size of the zones less than 1 pixel? */ if (FABS(bluezonepixels - familyzonepixels) < 1.0) { /* use the Family zones */ alignmentzones[numalignmentzones].bottomy = blues->FamilyBlues[i]; alignmentzones[numalignmentzones].topy = blues->FamilyBlues[i+1]; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { if ( alignmentzones[numalignmentzones].topzone == TRUE ) fprintf( psfile, "%f %f t1topzone\n", (blues->FamilyBlues[i])*up, (blues->BlueValues[i+1])*up); else fprintf( psfile, "%f %f t1bottomzone\n", (blues->FamilyBlues[i])*up, (blues->BlueValues[i+1])*up); } #endif continue; } } } /* use this font's Blue zones */ alignmentzones[numalignmentzones].bottomy = blues->BlueValues[i]; alignmentzones[numalignmentzones].topy = blues->BlueValues[i+1]; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { if ( alignmentzones[numalignmentzones].topzone == TRUE ) fprintf( psfile, "%f %f t1topzone\n", (blues->BlueValues[i])*up, (blues->BlueValues[i+1])*up); else fprintf( psfile, "%f %f t1bottomzone\n", (blues->BlueValues[i])*up, (blues->BlueValues[i+1])*up); } #endif } /* do the OtherBlues zones */ for (i = 0; i < blues->numOtherBlues; i +=2, ++numalignmentzones) { /* all of the OtherBlues zones are bottom zones */ alignmentzones[numalignmentzones].topzone = FALSE; /* Check FamilyAlignment suppression */ if ( (T1_Type1OperatorFlags & T1_IGNORE_FAMILYALIGNMENT)==0) { if (i < blues->numFamilyOtherBlues) {/* consider FamilyOtherBlues */ p = ILoc(CharSpace,0,blues->OtherBlues[i] - blues->OtherBlues[i+1]); QueryLoc(p, IDENTITY, &dummy, &bluezonepixels); Destroy(p); p = ILoc(CharSpace,0,blues->FamilyOtherBlues[i] - blues->FamilyOtherBlues[i+1]); QueryLoc(p, IDENTITY, &dummy, &familyzonepixels); Destroy(p); /* is the difference in size of the zones less than 1 pixel? */ if (FABS(bluezonepixels - familyzonepixels) < 1.0) { /* use the Family zones */ alignmentzones[numalignmentzones].bottomy = blues->FamilyOtherBlues[i]; alignmentzones[numalignmentzones].topy = blues->FamilyOtherBlues[i+1]; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { fprintf( psfile, "%f %f t1bottomzone\n", (blues->FamilyOtherBlues[i])*up, (blues->FamilyOtherBlues[i+1])*up); } #endif continue; } } } /* use this font's Blue zones (as opposed to the Family Blues */ alignmentzones[numalignmentzones].bottomy = blues->OtherBlues[i]; alignmentzones[numalignmentzones].topy = blues->OtherBlues[i+1]; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { fprintf( psfile, "%f %f t1bottomzone\n", (blues->OtherBlues[i])*up, (blues->OtherBlues[i+1])*up); } #endif } return(0); } /**********************************************************************/ /* Subroutines and statics for handling of the VSTEM and HSTEM hints. */ /**********************************************************************/ int InDotSection; /* DotSection flag */ struct stem stems[MAXSTEMS]; /* All STEM hints */ int numstems; /* Number of STEM hints */ int currstartstem; /* The current starting stem. */ int oldvert, oldhor; /* Remember hint in effect */ int oldhorhalf, oldverthalf; /* Remember which half of the stem */ DOUBLE wsoffsetX, wsoffsetY; /* White space offset - for VSTEM3,HSTEM3 */ int wsset; /* Flag for whether we've set wsoffsetX,Y */ static int InitStems() /* Initialize the STEM hint data structures */ { InDotSection = FALSE; currstartstem = numstems = 0; oldvert = oldhor = -1; return(0); } /*******************************************************************/ /* Compute the dislocation that a stemhint should cause for points */ /* inside the stem. */ /*******************************************************************/ static int ComputeStem(stemno) int stemno; { int verticalondevice, idealwidth; DOUBLE stemstart, stemwidth; struct segment *p; int i; DOUBLE stembottom, stemtop, flatposition; DOUBLE Xpixels, Ypixels; DOUBLE unitpixels, onepixel; int suppressovershoot, enforceovershoot; DOUBLE stemshift, flatpospixels, overshoot; DOUBLE widthdiff; /* Number of character space units to adjust width */ DOUBLE lbhintvalue, rthintvalue; DOUBLE cxx, cyx, cxy, cyy; /* Transformation matrix */ int rotated; /* TRUE if character is on the side, FALSE if upright */ /************************************************/ /* DETERMINE ORIENTATION OF CHARACTER ON DEVICE */ /************************************************/ QuerySpace(CharSpace, &cxx, &cyx, &cxy, &cyy); /* Transformation matrix */ if (FABS(cxx) < 0.00001 || FABS(cyy) < 0.00001) rotated = TRUE; /* Char is on side (90 or 270 degrees), possibly oblique. */ else if (FABS(cyx) < 0.00001 || FABS(cxy) < 0.00001) rotated = FALSE; /* Char is upright (0 or 180 degrees), possibly oblique. */ else { stems[stemno].lbhintval = 0.0; /* Char is at non-axial angle, ignore hints. */ stems[stemno].rthintval = 0.0; ProcessHints = 0; return(0); } /* Determine orientation of stem */ if (stems[stemno].vertical) { verticalondevice = !rotated; stemstart = stems[stemno].x; stemwidth = stems[stemno].dx; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1vstem\n", stemstart*up, stemwidth*up); #endif } else { verticalondevice = rotated; stemstart = stems[stemno].y; stemwidth = stems[stemno].dy; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1hstem\n", stemstart*up, stemwidth*up); #endif } /* Determine how many pixels (non-negative) correspond to 1 character space unit (unitpixels), and how many character space units (non-negative) correspond to one pixel (onepixel). */ if (stems[stemno].vertical) p = ILoc(CharSpace, 1, 0); else p = ILoc(CharSpace, 0, 1); QueryLoc(p, IDENTITY, &Xpixels, &Ypixels); Destroy(p); if (verticalondevice) unitpixels = FABS(Xpixels); else unitpixels = FABS(Ypixels); onepixel = 1.0 / unitpixels; /**********************/ /* ADJUST STEM WIDTHS */ /**********************/ widthdiff = 0.0; /* Find standard stem with smallest width difference from this stem */ if (stems[stemno].vertical) { /* vertical stem */ if (blues->StdVW != 0) /* there is an entry for StdVW */ widthdiff = blues->StdVW - stemwidth; for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */ if (FABS(blues->StemSnapV[i] - stemwidth) < FABS(widthdiff)) /* this standard width is the best match so far for this stem */ widthdiff = blues->StemSnapV[i] - stemwidth; } } else { /* horizontal stem */ if (blues->StdHW != 0) /* there is an entry for StdHW */ widthdiff = blues->StdHW - stemwidth; for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */ if (FABS(blues->StemSnapH[i] - stemwidth) < FABS(widthdiff)) /* this standard width is the best match so far for this stem */ widthdiff = blues->StemSnapH[i] - stemwidth; } } /* Only expand or contract stems if they differ by less than 1 pixel from the closest standard width, otherwise make the width difference = 0. */ if (FABS(widthdiff) > onepixel) widthdiff = 0.0; /* Expand or contract stem to the nearest integral number of pixels. */ idealwidth = ROUND((stemwidth + widthdiff) * unitpixels); /* Ensure that all stems are at least one pixel wide. */ if (idealwidth == 0) idealwidth = 1; /* Apply ForceBold to vertical stems. */ if (blues->ForceBold && stems[stemno].vertical && ((T1_Type1OperatorFlags & T1_IGNORE_FORCEBOLD)==0)) /* Force this vertical stem to be at least DEFAULTBOLDSTEMWIDTH wide. */ if (idealwidth < DEFAULTBOLDSTEMWIDTH) idealwidth = DEFAULTBOLDSTEMWIDTH; /* Now compute the number of character space units necessary */ widthdiff = idealwidth * onepixel - stemwidth; /*********************************************************************/ /* ALIGNMENT ZONES AND OVERSHOOT SUPPRESSION - HORIZONTAL STEMS ONLY */ /*********************************************************************/ stemshift = 0.0; if ( !stems[stemno].vertical ) { /* Get bottom and top boundaries of the stem. */ stembottom = stemstart; stemtop = stemstart + stemwidth; /* Find out if this stem intersects an alignment zone (the BlueFuzz */ /* entry in the Private dictionary specifies the number of character */ /* units to extend (in both directions) the effect of an alignment */ /* zone on a horizontal stem. The default value of BlueFuzz is 1. */ for (i = 0; i < numalignmentzones; ++i) { if (alignmentzones[i].topzone) { if (stemtop >= alignmentzones[i].bottomy && stemtop <= alignmentzones[i].topy + blues->BlueFuzz) { break; /* We found a top-zone */ } } else { if (stembottom <= alignmentzones[i].topy && stembottom >= alignmentzones[i].bottomy - blues->BlueFuzz) { break; /* We found a bottom-zone */ } } } if (i < numalignmentzones) { /* We found an intersecting zone (number i). */ suppressovershoot = FALSE; enforceovershoot = FALSE; /* When 1 character space unit is rendered smaller than BlueScale device units (pixels), we must SUPPRESS overshoots. Otherwise, if the top (or bottom) of this stem is more than BlueShift character space units away from the flat position, we must ENFORCE overshoot. */ if (unitpixels < blues->BlueScale){ suppressovershoot = TRUE; } else{ if (alignmentzones[i].topzone){ if (stemtop >= alignmentzones[i].bottomy + blues->BlueShift){ enforceovershoot = TRUE; } } else if (stembottom <= alignmentzones[i].topy - blues->BlueShift){ enforceovershoot = TRUE; } } /*************************************************/ /* ALIGN THE FLAT POSITION OF THE ALIGNMENT ZONE */ /*************************************************/ /* Compute the position of the alignment zone's flat position in device space and the amount of shift needed to align it on a pixel boundary. Move all stems this amount. */ if (alignmentzones[i].topzone) flatposition = alignmentzones[i].bottomy; else flatposition = alignmentzones[i].topy; /* Find the flat position in pixels */ flatpospixels = flatposition * unitpixels; /* Find the stem shift necessary to align the flat position on a pixel boundary, and use this shift for all stems */ stemshift = (ROUND(flatpospixels) - flatpospixels) * onepixel; /************************************************/ /* HANDLE OVERSHOOT ENFORCEMENT AND SUPPRESSION */ /************************************************/ /* Compute overshoot amount (non-negative) */ if (alignmentzones[i].topzone) overshoot = stemtop - flatposition; else overshoot = flatposition - stembottom; if (overshoot > 0.0) { /* ENFORCE overshoot by shifting the entire stem (if necessary) so that it falls at least one pixel beyond the flat position. */ if (enforceovershoot){ if (overshoot < onepixel){ if (alignmentzones[i].topzone) stemshift += onepixel - overshoot; else stemshift -= onepixel - overshoot; } } /* SUPPRESS overshoot by aligning the stem to the alignment zone's flat position. */ if (suppressovershoot){ if (alignmentzones[i].topzone) stemshift -= overshoot; else stemshift += overshoot; } } /************************************************************/ /* COMPUTE HINT VALUES FOR EACH SIDE OF THE HORIZONTAL STEM */ /************************************************************/ /* If the stem was aligned by a topzone, we expand or contract the stem only at the bottom - since the stem top was aligned by the zone. If the stem was aligned by a bottomzone, we expand or contract the stem only at the top - since the stem bottom was aligned by the zone. */ if (alignmentzones[i].topzone) { lbhintvalue = stemshift - widthdiff; /* bottom */ rthintvalue = stemshift; /* top */ } else { lbhintvalue = stemshift; /* bottom */ rthintvalue = stemshift + widthdiff; /* top */ } stems[stemno].lbhintval = lbhintvalue; stems[stemno].rthintval = rthintvalue; /* store grid-aligned stems values */ stems[stemno].aly = stemstart + lbhintvalue; stems[stemno].aldy = stemwidth + widthdiff; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1alignedhstem\n", (stems[stemno].aly)*up, (stems[stemno].aldy)*up); #endif return(0); } /* endif (i < numalignmentzones) */ /* We didn't find any alignment zones intersecting this stem, so proceed with normal stem alignment below. */ } /* endif (!stems[stemno].vertical) */ /* Align stem with pixel boundaries on device */ stemstart = stemstart - widthdiff / 2; stemshift = ROUND(stemstart * unitpixels) * onepixel - stemstart; /* Adjust the boundaries of the stem */ lbhintvalue = stemshift - widthdiff / 2; /* left or bottom */ rthintvalue = stemshift + widthdiff / 2; /* right or top */ if (stems[stemno].vertical) { stems[stemno].lbhintval = lbhintvalue; stems[stemno].rthintval = rthintvalue; /* store grid-aligned stem values */ stems[stemno].alx = stemstart + stemshift; stems[stemno].aldx = stemwidth + widthdiff; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1alignedvstem\n", (stems[stemno].alx)*up, (stems[stemno].aldx)*up); #endif } else { stems[stemno].lbhintval = lbhintvalue; stems[stemno].rthintval = rthintvalue; /* store grid-aligned stem values */ stems[stemno].aly = stemstart + stemshift; stems[stemno].aldy = stemwidth + widthdiff; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1alignedhstem\n", (stems[stemno].aly)*up, (stems[stemno].aldy)*up); #endif } return(0); } #define LEFT 1 #define RIGHT 2 #define BOTTOM 3 #define TOP 4 /***********************************************************************/ /* Find the vertical and horizontal stems that the current point */ /* (x, y) may be involved in. At most one horizontal and one vertical */ /* stem can apply to a single point, since there are no overlaps */ /* allowed. */ /* The point list updated by this function. */ /* Hints are ignored inside a DotSection. */ /***********************************************************************/ static void FindStems( double x, double y, double dx, double dy, double nextdx, double nextdy) { int i; int newvert, newhor; int newhorhalf, newverthalf; /* The following values will be used to decide whether a curve crosses or touches a stem in an aligned manner or not */ double dtana = 0.0; /* tangent of pre-delta against horizontal line */ double dtanb = 0.0; /* tangent of pre-delta against vertical line */ double nextdtana = 0.0; /* tangent of post-delta against horizontal line */ double nextdtanb = 0.0; /* tangent of post-delta against vertical line */ /* setup default hinted position */ ppoints[numppoints-1].ax = ppoints[numppoints-1].x; ppoints[numppoints-1].ay = ppoints[numppoints-1].y; if ( ppoints[numppoints-1].hinted == -1 ) /* point is not to be hinted! */ return; else ppoints[numppoints-1].hinted = 0; if ( InDotSection ) return; if ( ProcessHints == 0 ) { return; } /* setup (absolute) tangent values and define limits that indicate nearly horizontal or nearly vertical alignment */ #define NEARLYVERTICAL 0.2 /* This corresponds to about 11.3 degress deviation */ #define NEARLYHORIZONTAL 0.2 /* from the ideal direction. */ if ( dy != 0 ) { dtana = dx/dy; if ( dtanb < 0.0 ) dtana = -dtana; } else dtana = NEARLYHORIZONTAL; if ( dx != 0 ) { dtanb = dy/dx; if ( dtanb < 0.0 ) dtanb = -dtanb; } else dtanb = NEARLYVERTICAL; if ( nextdy != 0 ) { nextdtana = nextdx/nextdy; if ( nextdtana < 0.0 ) nextdtana = -nextdtana; } else nextdtana = NEARLYHORIZONTAL; if ( nextdx != 0 ) { nextdtanb = nextdy/nextdx; if ( nextdtanb < 0.0 ) nextdtanb = -nextdtanb; } else nextdtanb = NEARLYVERTICAL; newvert = newhor = -1; newhorhalf = newverthalf = -1; for (i = currstartstem; i < numstems; i++) { if (stems[i].vertical) { /* VSTEM hint */ /* OK, stem is crossed in an aligned way */ if ( (dtana <= NEARLYVERTICAL) || (nextdtana <= NEARLYVERTICAL)) { if ((x >= stems[i].x ) && (x <= stems[i].x+stems[i].dx )) { newvert = i; if (x < stems[i].x+stems[i].dx / 2) newverthalf = LEFT; else newverthalf = RIGHT; } } } else { /* HSTEM hint */ if ( (dtanb <= NEARLYHORIZONTAL) || (nextdtanb <= NEARLYHORIZONTAL)) { /* OK, stem is crossed in an aligned way */ if ((y >= stems[i].y ) && (y <= stems[i].y+stems[i].dy )) { newhor = i; if (y < stems[i].y+stems[i].dy / 2) newhorhalf = BOTTOM; else newhorhalf = TOP; } } } } if ( newvert != -1 ) { /* mark the latest point in the point list to be v-hinted! */ if ( newverthalf == LEFT ) { /* left hint */ ppoints[numppoints-1].ax += stems[newvert].lbhintval; } else { /* right hint */ ppoints[numppoints-1].ax += stems[newvert].rthintval; } ppoints[numppoints-1].hinted |= 0x01; } if ( newhor != -1 ) { /* mark the latest point in the point list to be h-hinted! */ if ( newhorhalf == BOTTOM ) { /* bottom hint */ ppoints[numppoints-1].ay += stems[newhor].lbhintval; } else { /* top hint */ ppoints[numppoints-1].ay += stems[newhor].rthintval; } ppoints[numppoints-1].hinted |= 0x02; } return; } /* Type 1 internal functions */ static int ClearStack() { Top = -1; return(0); } static int Push(Num) DOUBLE Num; { if (++Top < MAXSTACK) Stack[Top] = Num; else Error0i("Push: Stack full\n"); return(0); } static int ClearCallStack() { CallTop = -1; return(0); } static int PushCall(CurrStrP, CurrIndex, CurrKey) psobj *CurrStrP; int CurrIndex; unsigned short CurrKey; { if (++CallTop < MAXCALLSTACK) { CallStack[CallTop].currstrP = CurrStrP; /* save CharString pointer */ CallStack[CallTop].currindex = CurrIndex; /* save CharString index */ CallStack[CallTop].currkey = CurrKey; /* save decryption key */ } else Error0i("PushCall: Stack full\n"); return(0); } static int PopCall(CurrStrPP, CurrIndexP, CurrKeyP) psobj **CurrStrPP; int *CurrIndexP; unsigned short *CurrKeyP; { if (CallTop >= 0) { *CurrStrPP = CallStack[CallTop].currstrP; /* restore CharString pointer */ *CurrIndexP = CallStack[CallTop].currindex; /* restore CharString index */ *CurrKeyP = CallStack[CallTop--].currkey; /* restore decryption key */ } else Error0i("PopCall: Stack empty\n"); return(0); } static int ClearPSFakeStack() { PSFakeTop = -1; return(0); } /* PSFakePush: Pushes a number onto the fake PostScript stack */ static int PSFakePush(Num) DOUBLE Num; { if (++PSFakeTop < MAXPSFAKESTACK) PSFakeStack[PSFakeTop] = Num; else Error0i("PSFakePush: Stack full\n"); return(0); } /* PSFakePop: Removes a number from the top of the fake PostScript stack */ static DOUBLE PSFakePop () { if (PSFakeTop >= 0) return(PSFakeStack[PSFakeTop--]); else Error0d("PSFakePop : Stack empty\n"); /*NOTREACHED*/ } /***********************************************************************/ /* Center a stem on the pixel grid -- used by HStem3 and VStem3 */ /***********************************************************************/ static struct segment *CenterStem(edge1, edge2) DOUBLE edge1; DOUBLE edge2; { int idealwidth, verticalondevice; DOUBLE leftx, lefty, rightx, righty, center, width; DOUBLE widthx, widthy; DOUBLE shift, shiftx, shifty; DOUBLE Xpixels, Ypixels; struct segment *p; p = Loc(CharSpace, edge1, 0.0); QueryLoc(p, IDENTITY, &leftx, &lefty); p = Join(p, Loc(CharSpace, edge2, 0.0)); QueryLoc(p, IDENTITY, &rightx, &righty); Destroy(p); widthx = FABS(rightx - leftx); widthy = FABS(righty - lefty); if (widthy <= EPS) { /* verticalondevice hint */ verticalondevice = TRUE; center = (rightx + leftx) / 2.0; width = widthx; } else if (widthx <= EPS) { /* horizontal hint */ verticalondevice = FALSE; center = (righty + lefty) / 2.0; width = widthy; } else { /* neither horizontal nor verticalondevice and not oblique */ return (NULL); } idealwidth = ROUND(width); if (idealwidth == 0) idealwidth = 1; if (ODD(idealwidth)) { /* is ideal width odd? */ /* center stem over pixel */ shift = FLOOR(center) + 0.5 - center; } else { /* align stem on pixel boundary */ shift = ROUND(center) - center; } if (verticalondevice) { shiftx = shift; shifty = 0.0; } else { shifty = shift; shiftx = 0.0; } p = Loc(IDENTITY, shiftx, shifty); QueryLoc(p, CharSpace, &Xpixels, &Ypixels); wsoffsetX = Xpixels; wsoffsetY = Ypixels; currx += wsoffsetX; curry += wsoffsetY; return (p); } /*----------------------------------------------------------------------- Decrypt - From Adobe Type 1 book page 63, with some modifications -----------------------------------------------------------------------*/ #define KEY 4330 /* Initial key (seed) for CharStrings decryption */ #define C1 52845 /* Multiplier for pseudo-random number generator */ #define C2 22719 /* Constant for pseudo-random number generator */ static unsigned short r; /* Pseudo-random sequence of keys */ static unsigned char Decrypt(cipher) unsigned char cipher; { unsigned char plain; plain = cipher ^ (r >> 8); r = (cipher + r) * C1 + C2; return plain; } /* Get the next byte from the codestring being interpreted */ static int DoRead(CodeP) int *CodeP; { if (strindex >= CharStringP->len) return(FALSE); /* end of string */ /* We handle the non-documented Adobe convention to use lenIV=-1 to suppress charstring encryption. */ if (blues->lenIV==-1) { *CodeP = (unsigned char) CharStringP->data.stringP[strindex++]; } else { *CodeP = Decrypt((unsigned char) CharStringP->data.stringP[strindex++]); } return(TRUE); } /* Strip blues->lenIV bytes from CharString and update encryption key */ /* (the lenIV entry in the Private dictionary specifies the number of */ /* random bytes at the beginning of each CharString; default is 4) */ static void StartDecrypt() { int Code; r = KEY; /* Initial key (seed) for CharStrings decryption */ for (strindex = 0; strindex < blues->lenIV;){ if (!DoRead(&Code)) /* Read a byte and update decryption key */ Error0v("StartDecrypt: Premature end of CharString\n"); } } #undef DecodeDebug static int Decode(Code) int Code; { int Code1, Code2, Code3, Code4; if (Code <= 31){ /* Code is [0,31] */ #ifdef DecodeDebug fprintf(stderr, "Decode: Code=%d -> Command\n", Code); #endif DoCommand(Code); } else if (Code <= 246){ /* Code is [32,246] */ #ifdef DecodeDebug fprintf(stderr, "Decode: Code=%d -> number=%f\n", Code, (DOUBLE)(Code-139)); #endif Push((DOUBLE)(Code - 139)); } else if (Code <= 250) { /* Code is [247,250] */ if (!DoRead(&Code2)) goto ended; #ifdef DecodeDebug fprintf(stderr, "Decode: Code=%d next Code=%d -> number=%f\n", Code, Code2, (DOUBLE)(((Code - 247) << 8) + Code2 + 108)); #endif Push((DOUBLE)(((Code - 247) << 8) + Code2 + 108)); } else if (Code <= 254) { /* Code is [251,254] */ if (!DoRead(&Code2)) goto ended; #ifdef DecodeDebug fprintf(stderr, "Decode: Code=%d, next Code=%d -> number=%f\n", Code, Code2, (DOUBLE)( -((Code - 251) << 8) - Code2 - 108)); #endif Push((DOUBLE)( -((Code - 251) << 8) - Code2 - 108)); } else { /* Code is 255 */ if (!DoRead(&Code1)) goto ended; if (!DoRead(&Code2)) goto ended; if (!DoRead(&Code3)) goto ended; if (!DoRead(&Code4)) goto ended; #ifdef DecodeDebug fprintf(stderr, "Decode: Code=255, Code1=%d, Code2=%d, Code3=%d, Code4=%d -> number=%f\n", Code1, Code2, Code3, Code4, (DOUBLE)((((((Code1<<8) + Code2)<<8) + Code3)<<8) + Code4)); #endif Push((DOUBLE)((((((Code1<<8) + Code2)<<8) + Code3)<<8) + Code4)); } return(0); ended: Error0i("Decode: Premature end of Type 1 CharString"); } #undef DoCommandDebug /* Interpret a command code */ static int DoCommand(Code) int Code; { switch(Code) { case HSTEM: /* |- y dy HSTEM |- */ #ifdef DoCommandDebug printf("DoCommand: HStem\n"); #endif /* Vertical range of a horizontal stem zone */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); HStem(Stack[0], Stack[1]); ClearStack(); break; case VSTEM: /* |- x dx VSTEM |- */ #ifdef DoCommandDebug printf("DoCommand: VStem\n"); #endif /* Horizontal range of a vertical stem zone */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); VStem(Stack[0], Stack[1]); ClearStack(); break; case VMOVETO: /* |- dy VMOVETO |- */ #ifdef DoCommandDebug printf("DoCommand: VMoveto\n"); #endif /* Vertical MOVETO, equivalent to 0 dy RMOVETO */ if (Top < 0) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RMoveTo(0.0, Stack[0]); ClearStack(); break; case RLINETO: /* |- dx dy RLINETO |- */ #ifdef DoCommandDebug printf("DoCommand: RLineto\n"); #endif /* Like RLINETO in PostScript */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RLineTo(Stack[0], Stack[1]); ClearStack(); break; case HLINETO: /* |- dx HLINETO |- */ #ifdef DoCommandDebug printf("DoCommand: HLineto\n"); #endif /* Horizontal LINETO, equivalent to dx 0 RLINETO */ if (Top < 0) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RLineTo(Stack[0], 0.0); ClearStack(); break; case VLINETO: /* |- dy VLINETO |- */ #ifdef DoCommandDebug printf("DoCommand: VLineto\n"); #endif /* Vertical LINETO, equivalent to 0 dy RLINETO */ if (Top < 0) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RLineTo(0.0, Stack[0]); ClearStack(); break; case RRCURVETO: #ifdef DoCommandDebug printf("DoCommand: RRCurveto\n"); #endif /* |- dx1 dy1 dx2 dy2 dx3 dy3 RRCURVETO |- */ /* Relative RCURVETO, equivalent to dx1 dy1 */ /* (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) */ /* (dy1+dy2+dy3) RCURVETO in PostScript */ if (Top < 5) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RRCurveTo(Stack[0], Stack[1], Stack[2], Stack[3], Stack[4], Stack[5]); ClearStack(); break; case CLOSEPATH: /* - CLOSEPATH |- */ #ifdef DoCommandDebug printf("DoCommand: ClosePath\n"); #endif /* Closes a subpath without repositioning the */ /* current point */ DoClosePath(); ClearStack(); break; case CALLSUBR: /* subr# CALLSUBR - */ #ifdef DoCommandDebug printf("DoCommand: CallSubr\n"); #endif /* Calls a CharString subroutine with index */ /* subr# from the Subrs array */ if (Top < 0) Error1i("DoCommand: Stack low\n (Code=%d)", Code); CallSubr((int)Stack[Top--]); break; case RETURN: /* - RETURN - */ #ifdef DoCommandDebug printf("DoCommand: Return\n"); #endif /* Returns from a Subrs array CharString */ /* subroutine called with CALLSUBR */ Return(); break; case ESCAPE: /* ESCAPE to two-byte command code */ #ifdef DoCommandDebug printf("DoCommand: Escape to 2 Byte Code (Code=%d)\n", Code); #endif if (!DoRead(&Code)) Error0i("DoCommand: ESCAPE is last byte\n"); Escape(Code); break; case HSBW: /* |- sbx wx HSBW |- */ #ifdef DoCommandDebug printf("DoCommand: HSBW\n"); #endif /* Set the left sidebearing point to (sbx,0), */ /* set the character width vector to (wx,0). */ /* Equivalent to sbx 0 wx 0 SBW. Space */ /* character should have sbx = 0 */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); Sbw(Stack[0], 0.0, Stack[1], 0.0); ClearStack(); break; case ENDCHAR: /* - ENDCHAR |- */ #ifdef DoCommandDebug printf("DoCommand: EndChar\n"); #endif /* Finishes a CharString outline */ EndChar(); ClearStack(); break; case RMOVETO: /* |- dx dy RMOVETO |- */ #ifdef DoCommandDebug printf("DoCommand: RMoveto\n"); #endif /* Behaves like RMOVETO in PostScript */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RMoveTo(Stack[0], Stack[1]); ClearStack(); break; case HMOVETO: /* |- dx HMOVETO |- */ #ifdef DoCommandDebug printf("DoCommand: HMovetoUnassigned\n"); #endif /* Horizontal MOVETO. Equivalent to dx 0 RMOVETO */ if (Top < 0) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RMoveTo(Stack[0], 0.0); ClearStack(); break; case VHCURVETO: /* |- dy1 dx2 dy2 dx3 VHCURVETO |- */ #ifdef DoCommandDebug printf("DoCommand: VHCurveto\n"); #endif /* Vertical-Horizontal CURVETO, equivalent to */ /* 0 dy1 dx2 dy2 dx3 0 RRCURVETO */ if (Top < 3) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RRCurveTo(0.0, Stack[0], Stack[1], Stack[2], Stack[3], 0.0); ClearStack(); break; case HVCURVETO: /* |- dx1 dx2 dy2 dy3 HVCURVETO |- */ #ifdef DoCommandDebug printf("DoCommand: HCurveto\n"); #endif /* Horizontal-Vertical CURVETO, equivalent to */ /* dx1 0 dx2 dy2 0 dy3 RRCURVETO */ if (Top < 3) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RRCurveTo(Stack[0], 0.0, Stack[1], Stack[2], 0.0, Stack[3]); ClearStack(); break; case UNKNOWN_15: if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); ClearStack(); break; default: /* Unassigned command code */ #ifdef DoCommandDebug printf("DoCommand: Unassigned\n"); #endif ClearStack(); Error1i("DoCommand: Unassigned code %d\n", Code); } return(0); } static int Escape(Code) int Code; { int i, Num; struct segment *p; switch(Code) { case DOTSECTION: /* - DOTSECTION |- */ /* Brackets an outline section for the dots in */ /* letters such as "i", "j", and "!". */ DotSection(); ClearStack(); break; case VSTEM3: /* |- x0 dx0 x1 dx1 x2 dx2 VSTEM3 |- */ /* Declares the horizontal ranges of three */ /* vertical stem zones between x0 and x0+dx0, */ /* x1 and x1+dx1, and x2 and x2+dx2. */ if (Top < 5) Error1i("DoCommand: Stack low (Code=%d)\n", Code); if (!wsset && ProcessHints) { /* Shift the whole character so that the middle stem is centered. */ p = CenterStem(Stack[2] + sidebearingX, Stack[3]); path = Join(path, p); wsset = 1; } VStem(Stack[0], Stack[1]); VStem(Stack[2], Stack[3]); VStem(Stack[4], Stack[5]); ClearStack(); break; case HSTEM3: /* |- y0 dy0 y1 dy1 y2 dy2 HSTEM3 |- */ /* Declares the vertical ranges of three hori- */ /* zontal stem zones between y0 and y0+dy0, */ /* y1 and y1+dy1, and y2 and y2+dy2. */ if (Top < 5) Error1i("DoCommand: Stack low (Code=%d)\n", Code); HStem(Stack[0], Stack[1]); HStem(Stack[2], Stack[3]); HStem(Stack[4], Stack[5]); ClearStack(); break; case SEAC: /* |- asb adx ady bchar achar SEAC |- */ /* Standard Encoding Accented Character. */ if (Top < 4) Error1i("DoCommand: Stack low (Code=%d)\n", Code); Seac(Stack[0], Stack[1], Stack[2], (unsigned char) Stack[3], (unsigned char) Stack[4]); ClearStack(); break; case SBW: /* |- sbx sby wx wy SBW |- */ /* Set the left sidebearing point to (sbx,sby), */ /* set the character width vector to (wx,wy). */ if (Top < 3) Error1i("DoCommand: Stack low (Code=%d)\n", Code); Sbw(Stack[0], Stack[1], Stack[2], Stack[3]); ClearStack(); break; case DIV: /* num1 num2 DIV quotient */ /* Behaves like DIV in the PostScript language */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); Stack[Top-1] = Div(Stack[Top-1], Stack[Top]); Top--; break; case CALLOTHERSUBR: /* arg1 ... argn n othersubr# CALLOTHERSUBR - */ /* Make calls on the PostScript interpreter */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); Num = Stack[Top-1]; if (Top < Num+1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); for (i = 0; i < Num; i++) PSFakePush(Stack[Top - i - 2]); Top -= Num + 2; CallOtherSubr((int)Stack[Top + Num + 2]); break; case POP: /* - POP number */ /* Removes a number from the top of the */ /* PostScript interpreter stack and pushes it */ /* onto the Type 1 BuildChar operand stack */ Push(PSFakePop()); break; case SETCURRENTPOINT: /* |- x y SETCURRENTPOINT |- */ /* Sets the current point to (x,y) in absolute */ /* character space coordinates without per- */ /* forming a CharString MOVETO command */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); SetCurrentPoint(Stack[0], Stack[1]); ClearStack(); break; case UNKNOWN_15: if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); ClearStack(); break; default: /* Unassigned escape code command */ ClearStack(); Error1i("Escape: Unassigned code %d\n", Code); } return(0); } /* |- y dy HSTEM |- */ /* Declares the vertical range of a horizontal stem zone */ /* between coordinates y and y + dy */ /* y is relative to the left sidebearing point */ static int HStem(y, dy) DOUBLE y, dy; { IfTrace2((FontDebug), "Hstem %f %f\n", y, dy); if (ProcessHints) { if (numstems >= MAXSTEMS) Error0i("HStem: Too many hints\n"); if (dy < 0.0) {y += dy; dy = -dy;} stems[numstems].vertical = FALSE; stems[numstems].x = 0.0; stems[numstems].y = sidebearingY + y + wsoffsetY; stems[numstems].dx = 0.0; stems[numstems].dy = dy; ComputeStem(numstems); numstems++; } return(0); } /* |- x dx VSTEM |- */ /* Declares the horizontal range of a vertical stem zone */ /* between coordinates x and x + dx */ /* x is relative to the left sidebearing point */ static int VStem(x, dx) DOUBLE x, dx; { IfTrace2((FontDebug), "Vstem %f %f\n", x, dx); if (ProcessHints) { if (numstems >= MAXSTEMS) Error0i("VStem: Too many hints\n"); if (dx < 0.0) {x += dx; dx = -dx;} stems[numstems].vertical = TRUE; stems[numstems].x = sidebearingX + x + wsoffsetX; stems[numstems].y = 0.0; stems[numstems].dx = dx; stems[numstems].dy = 0.0; ComputeStem(numstems); numstems++; } return(0); } /* |- dx dy RLINETO |- */ /* Behaves like RLINETO in PostScript */ static int RLineTo(dx, dy) DOUBLE dx, dy; { long pindex = 0; /* compute hinting for previous segment! */ FindStems( currx, curry, currx-ppoints[numppoints-2].x, curry-ppoints[numppoints-2].y, dx, dy); /* Allocate a new path point and pre-setup data */ pindex = nextPPoint(); ppoints[pindex].x = currx + dx; ppoints[pindex].y = curry + dy; ppoints[pindex].ax = ppoints[pindex].x; ppoints[pindex].ay = ppoints[pindex].y; ppoints[pindex].type = PPOINT_LINE; ppoints[pindex].hinted = 0; /* update ideal position */ currx += dx; curry += dy; return(0); } /* |- dx1 dy1 dx2 dy2 dx3 dy3 RRCURVETO |- */ /* Relative RCURVETO, equivalent to dx1 dy1 */ /* (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) */ /* (dy1+dy2+dy3) RCURVETO in PostScript */ static int RRCurveTo(dx1, dy1, dx2, dy2, dx3, dy3) DOUBLE dx1, dy1, dx2, dy2, dx3, dy3; { long pindex = 0; /* compute hinting for previous point! */ FindStems( currx, curry, currx-ppoints[numppoints-2].x, curry-ppoints[numppoints-2].y, dx1, dy1); /* Allocate three new path points and pre-setup data */ pindex = nextPPoint(); ppoints[pindex].x = currx + dx1; ppoints[pindex].y = curry + dy1; ppoints[pindex].ax = ppoints[pindex].x; ppoints[pindex].ay = ppoints[pindex].y; ppoints[pindex].type = PPOINT_BEZIER_B; ppoints[pindex].hinted = 0; /* update ideal position */ currx += dx1; curry += dy1; /* compute hinting for previous point! */ FindStems( currx, curry, currx-ppoints[numppoints-2].x, curry-ppoints[numppoints-2].y, dx2, dy2); pindex = nextPPoint(); ppoints[pindex].x = currx + dx2; ppoints[pindex].y = curry + dy2; ppoints[pindex].ax = ppoints[pindex].x; ppoints[pindex].ay = ppoints[pindex].y; ppoints[pindex].type = PPOINT_BEZIER_C; ppoints[pindex].hinted = 0; /* update ideal position */ currx += dx2; curry += dy2; /* compute hinting for previous point! */ FindStems( currx, curry, currx-ppoints[numppoints-2].x, curry-ppoints[numppoints-2].y, dx3, dy3); pindex = nextPPoint(); ppoints[pindex].x = currx + dx3; ppoints[pindex].y = curry + dy3; ppoints[pindex].ax = ppoints[pindex].x; ppoints[pindex].ay = ppoints[pindex].y; ppoints[pindex].type = PPOINT_BEZIER_D; ppoints[pindex].hinted = 0; /* update ideal position */ currx += dx3; curry += dy3; return(0); } /* - CLOSEPATH |- */ /* Closes a subpath WITHOUT repositioning the */ /* current point */ static int DoClosePath() { long pindex = 0; long i = 0; long tmpind; double deltax = 0.0; double deltay = 0.0; /* If this ClosePath command together with the starting point of this path completes to a segment aligned to a stem, we would miss hinting for this point. --> Check and explicitly care for this! */ /* 1. Step back in the point list to the last moveto-point */ i = numppoints - 1; while ( (i > 0) && (ppoints[i].type != PPOINT_MOVE ) ) { --i; } /* 2. Re-hint starting point and hint current point */ if ( ppoints[i].type == PPOINT_MOVE) { deltax = ppoints[i].x - ppoints[numppoints-1].x; deltay = ppoints[i].y - ppoints[numppoints-1].y; /* save nummppoints and reset to move point */ tmpind = numppoints; numppoints = i + 1; /* re-hint starting point of current subpath (uses the value of numppoints!) */ FindStems( ppoints[i].x, ppoints[i].y, deltax, deltay, ppoints[i+1].x-ppoints[i].x, ppoints[i+1].y-ppoints[i].y); /* restore numppoints and setup hinting for current point */ numppoints = tmpind; FindStems( currx, curry, currx-ppoints[numppoints-2].x, curry-ppoints[numppoints-2].y, deltax, deltay); } /* Allocate a new path point and pre-setup data */ pindex = nextPPoint(); ppoints[pindex].x = currx; ppoints[pindex].y = curry; ppoints[pindex].ax = ppoints[pindex-1].x; ppoints[pindex].ay = ppoints[pindex-1].y; ppoints[pindex].type = PPOINT_CLOSEPATH; ppoints[pindex].hinted = 0; return(0); } /* subr# CALLSUBR - */ /* Calls a CharString subroutine with index */ /* subr# from the Subrs array */ static int CallSubr(subrno) int subrno; { IfTrace2((FontDebug), "CallSubr %d (CallStackSize=%d)\n", subrno, CallTop); if ((subrno < 0) || (subrno >= SubrsP->len)) Error0i("CallSubr: subrno out of range\n"); PushCall(CharStringP, strindex, r); CharStringP = &SubrsP->data.arrayP[subrno]; StartDecrypt(); return(0); } /* - RETURN - */ /* Returns from a Subrs array CharString */ /* subroutine called with CALLSUBR */ static int Return() { IfTrace0((FontDebug), "Return\n"); PopCall(&CharStringP, &strindex, &r); return(0); } /* - ENDCHAR |- */ /* Finishes a CharString outline */ /* Executes SETCHACHEDEVICE using a bounding box */ /* it computes directly from the character outline */ /* and using the width information acquired from a previous */ /* HSBW or SBW. It then calls a special version of FILL */ /* or STROKE depending on the value of PaintType in the */ /* font dictionary */ static int EndChar() { long pindex = 0; IfTrace0((FontDebug), "EndChar\n"); /* There is no need to compute and set bounding box for the cache, since XIMAGER does that on the fly. */ /* Allocate a new path point and pre-setup data. Note: For this special case, we use the variables that usually store hinted coordinates for the escapement of the character. It is required in handleCurrentSegment(). */ pindex = nextPPoint(); ppoints[pindex].x = currx; ppoints[pindex].y = curry; ppoints[pindex].ax = escapementX; ppoints[pindex].ay = escapementY; ppoints[pindex].type = PPOINT_ENDCHAR; ppoints[pindex].hinted = -1; return(0); } /* |- dx dy RMOVETO |- */ /* Behaves like RMOVETO in PostScript */ static int RMoveTo(dx,dy) DOUBLE dx,dy; { long pindex = 0; /* Compute hinting for this path point! */ if ( numppoints == 1 ) { /* Since RMoveTo for this case starts a new path segment (flex-constructs have already been handled), the current point is hinted here only taking the next point into account, but not the previous. Later on, in DoClosePath(), we'll step back to this point and the position might be rehinted. */ FindStems( currx, curry, 0, 0, dx, dy); } else { FindStems( currx, curry, ppoints[numppoints-2].x, ppoints[numppoints-2].y, dx, dy); } /* Allocate a new path point and pre-setup data */ pindex = nextPPoint(); ppoints[pindex].x = currx + dx; ppoints[pindex].y = curry + dy; ppoints[pindex].ax = ppoints[pindex].x; ppoints[pindex].ay = ppoints[pindex].y; ppoints[pindex].type = PPOINT_MOVE; ppoints[pindex].hinted = 0; /* update ideal position */ currx += dx; curry += dy; return 0; } /* - DOTSECTION |- */ /* Brackets an outline section for the dots in */ /* letters such as "i", "j", and "!". */ static int DotSection() { IfTrace0((FontDebug), "DotSection\n"); InDotSection = !InDotSection; return(0); } /* |- asb adx ady bchar achar SEAC |- */ /* Standard Encoding Accented Character. */ static int Seac(asb, adx, ady, bchar, achar) DOUBLE asb, adx, ady; unsigned char bchar, achar; { int Code; long pindex = 0; isseac = 1; seacaccent = achar; seacbase = bchar; IfTrace4((FontDebug), "SEAC %f %f %f %d ", asb, adx, ady, bchar); IfTrace1((FontDebug), "%d\n", achar); /* Move adx - asb, ady over and up from base char's sbpoint. */ /* (We use adx - asb to counteract the accents sb shift.) */ /* The variables accentoffsetX/Y modify sidebearingX/Y in Sbw(). */ /* Note that these incorporate the base character's sidebearing shift by */ /* using the current sidebearingX, Y values. */ accentoffsetX = adx - asb; accentoffsetY = ady; /* Set path = NULL to avoid complaints from Sbw(). */ path = NULL; /* Go find the CharString for the accent's code via an upcall */ CharStringP = GetType1CharString(Environment, achar); if (CharStringP == NULL) { Error1i("Invalid accent ('%03o) in SEAC\n", achar); } StartDecrypt(); ClearStack(); ClearPSFakeStack(); ClearCallStack(); for (;;) { if (!DoRead(&Code)) break; Decode(Code); if (errflag) return(0); } /* Allocate a new path point. Data in this case is not relevant in handleSegment(), we merely insert a snap() in order to return to origin of the accent char. */ pindex = nextPPoint(); ppoints[pindex].x = accentoffsetX; ppoints[pindex].y = accentoffsetY; ppoints[pindex].ax = accentoffsetX; ppoints[pindex].ay = accentoffsetY; ppoints[pindex].type = PPOINT_SEAC; ppoints[pindex].hinted = 0; /* We must reset these to null now. */ accentoffsetX = accentoffsetY = 0; /* go find the CharString for the base char's code via an upcall */ CharStringP = GetType1CharString(Environment, bchar); StartDecrypt(); ClearStack(); ClearPSFakeStack(); ClearCallStack(); InitStems(); for (;;) { if (!DoRead(&Code)) break; Decode(Code); if (errflag) return(0); } return(0); } /* |- sbx sby wx wy SBW |- */ /* Set the left sidebearing point to (sbx,sby), */ /* set the character width vector to (wx,wy). */ static int Sbw(sbx, sby, wx, wy) DOUBLE sbx, sby, wx, wy; { long pindex = 0; IfTrace4((FontDebug), "SBW %f %f %f %f\n", sbx, sby, wx, wy); escapementX = wx; /* Character width vector */ escapementY = wy; /* Sidebearing values are sbx, sby args, plus accent offset from Seac(). */ sidebearingX = sbx + accentoffsetX; sidebearingY = sby + accentoffsetY; currx = sidebearingX; curry = sidebearingY; /* path = Join(path, Loc(CharSpace, sidebearingX, sidebearingY)); if (ProcessHints) { hcurrx = sidebearingX; hcurry = sidebearingY; } */ /* Allocate a path point and setup. Note: In this special case, we store the char escapement in the members ax and ay. They are required in handleCurrentSegment(). Hinting is not required for SBW, anyhow! */ pindex = nextPPoint(); ppoints[pindex].x = currx; ppoints[pindex].y = curry; ppoints[pindex].ax = wx; ppoints[pindex].ay = wy; ppoints[pindex].type = PPOINT_SBW; ppoints[pindex].hinted = -1; /* indicate that point is not to be hinted */ return(0); } /* num1 num2 DIV quotient */ /* Behaves like DIV in the PostScript language */ static DOUBLE Div(num1, num2) DOUBLE num1, num2; { IfTrace2((FontDebug), "Div %f %f\n", num1, num2); return(num1 / num2); } /* The following four subroutines (FlxProc, FlxProc1, FlxProc2, and HintReplace) are C versions of the OtherSubrs Programs, which were were published in the Adobe Type 1 Font Format book. The Flex outline fragment is described by c1: (x0, y0) = c3: (x0, yshrink(y0)) or (xshrink(x0), y0) " (x1, y1) = " (x1, yshrink(y1)) or (xshrink(x1), y1) " (x2, y2) - reference point c2: (x0, y0) = c4: (x0, yshrink(y0)) or (xshrink(x0), y0) " (x1, y1) = " (x1, yshrink(y1)) or (xshrink(x1), y1) " (x2, y2) = " (x2, y2), rightmost endpoint c3: (x0, y0) - control point, 1st Bezier curve " (x1, y1) - control point, -"- " (x2, y2) - end point, -"- c4: (x0, y0) - control point, 2nd Bezier curve " (x1, y1) - control point, -"- " (x2, y2) - end point, -"- ep: (epY, epX) - final endpoint (should be same as c4: (x2, y2)) idmin - minimum Flex height (1/100 pixel) at which to render curves */ #define dtransform(dxusr,dyusr,dxdev,dydev) { \ register struct segment *point = Loc(CharSpace, dxusr, dyusr); \ QueryLoc(point, IDENTITY, dxdev, dydev); \ Destroy(point); \ } #define itransform(xdev,ydev,xusr,yusr) { \ register struct segment *point = Loc(IDENTITY, xdev, ydev); \ QueryLoc(point, CharSpace, xusr, yusr); \ Destroy(point); \ } #define transform(xusr,yusr,xdev,ydev) dtransform(xusr,yusr,xdev,ydev) #define PaintType (0) #define xshrink(x) ((x - c4x2) * shrink +c4x2) #define yshrink(y) ((y - c4y2) * shrink +c4y2) #define PickCoords(flag) \ if (flag) { /* Pick "shrunk" coordinates */ \ x0 = c1x0; y0 = c1y0; \ x1 = c1x1; y1 = c1y1; \ x2 = c1x2; y2 = c1y2; \ x3 = c2x0; y3 = c2y0; \ x4 = c2x1; y4 = c2y1; \ x5 = c2x2; y5 = c2y2; \ } else { /* Pick original coordinates */ \ x0 = c3x0; y0 = c3y0; \ x1 = c3x1; y1 = c3y1; \ x2 = c3x2; y2 = c3y2; \ x3 = c4x0; y3 = c4y0; \ x4 = c4x1; y4 = c4y1; \ x5 = c4x2; y5 = c4y2; \ } /* FlxProc() = OtherSubrs[0]; Main part of Flex */ /* Calling sequence: 'idmin epX epY 3 0 callothersubr' */ /* Computes Flex values, and renders the Flex path, */ /* and returns (leaves) ending coordinates on stack */ static void FlxProc(c1x2, c1y2, c3x0, c3y0, c3x1, c3y1, c3x2, c3y2, c4x0, c4y0, c4x1, c4y1, c4x2, c4y2, epY, epX, idmin) DOUBLE c1x2, c1y2; DOUBLE c3x0, c3y0, c3x1, c3y1, c3x2, c3y2; DOUBLE c4x0, c4y0, c4x1, c4y1, c4x2, c4y2; DOUBLE epX, epY; int idmin; { DOUBLE dmin; DOUBLE c1x0, c1y0, c1x1, c1y1; DOUBLE c2x0, c2y0, c2x1, c2y1, c2x2, c2y2; char yflag; DOUBLE x0, y0, x1, y1, x2, y2, x3, y3, x4, y4, x5, y5; DOUBLE cxx, cyx, cxy, cyy; /* Transformation matrix */ int flipXY; DOUBLE x, y; DOUBLE erosion = 1; /* Device parameter */ /* Erosion may have different value specified in 'internaldict' */ DOUBLE shrink; DOUBLE dX, dY; char erode; DOUBLE eShift; DOUBLE cx, cy; DOUBLE ex, ey; /* Our PPOINT list now contains 7 moveto commands which are about to be consumed by the Flex mechanism. --> Remove these seven elements (their values already reside on the PSFakeStack!) and approriately restore the current accumulated position. */ numppoints -= 7; currx = ppoints[numppoints-1].x; curry = ppoints[numppoints-1].y; if (ProcessHints) { dmin = TYPE1_ABS(idmin) / 100.0; /* Minimum Flex height in pixels */ c2x2 = c4x2; c2y2 = c4y2; /* Point c2 = c4 */ yflag = FABS(c1y2 - c3y2) > FABS(c1x2 - c3x2); /* Flex horizontal? */ QuerySpace(CharSpace, &cxx, &cyx, &cxy, &cyy); /* Transformation matrix */ if (FABS(cxx) < 0.00001 || FABS(cyy) < 0.00001) flipXY = -1; /* Char on side */ else if (FABS(cyx) < 0.00001 || FABS(cxy) < 0.00001) flipXY = 1; /* Char upright */ else flipXY = 0; /* Char at angle */ if (yflag) { /* Flex horizontal */ if (flipXY == 0 || c3y2 == c4y2) { /* Char at angle or Flex height = 0 */ PickCoords(FALSE); /* Pick original control points */ } else { shrink = FABS((c1y2 - c4y2) / (c3y2 - c4y2)); /* Slope */ c1x0 = c3x0; c1y0 = yshrink(c3y0); c1x1 = c3x1; c1y1 = yshrink(c3y1); c2x0 = c4x0; c2y0 = yshrink(c4y0); c2x1 = c4x1; c2y1 = yshrink(c4y1); dtransform(0.0, ROUND(c3y2-c1y2), &x, &y); /* Flex height in pixels */ dY = FABS((flipXY == 1) ? y : x); PickCoords(dY < dmin); /* If Flex small, pick 'shrunk' control points */ if (FABS(y2 - c1y2) > 0.001) { /* Flex 'non-zero'? */ transform(c1x2, c1y2, &x, &y); if (flipXY == 1) { cx = x; cy = y; } else { cx = y; cy = x; } dtransform(0.0, ROUND(y2-c1y2), &x, &y); dY = (flipXY == 1) ? y : x; if (ROUND(dY) != 0) dY = ROUND(dY); else dY = (dY < 0) ? -1 : 1; erode = PaintType != 2 && erosion >= 0.5; if (erode) cy -= 0.5; ey = cy + dY; ey = CEIL(ey) - ey + FLOOR(ey); if (erode) ey += 0.5; if (flipXY == 1) { itransform(cx, ey, &x, &y); } else { itransform(ey, cx, &x, &y); } eShift = y - y2; y1 += eShift; y2 += eShift; y3 += eShift; } } } else { /* Flex vertical */ if (flipXY == 0 || c3x2 == c4x2) { /* Char at angle or Flex height = 0 */ PickCoords(FALSE); /* Pick original control points */ } else { shrink = FABS((c1x2 - c4x2) / (c3x2 - c4x2)); /* Slope */ c1x0 = xshrink(c3x0); c1y0 = c3y0; c1x1 = xshrink(c3x1); c1y1 = c3y1; c2x0 = xshrink(c4x0); c2y0 = c4y0; c2x1 = xshrink(c4x1); c2y1 = c4y1; dtransform(ROUND(c3x2 - c1x2), 0.0, &x, &y); /* Flex height in pixels */ dX = FABS((flipXY == -1) ? y : x); PickCoords(dX < dmin); /* If Flex small, pick 'shrunk' control points */ if (FABS(x2 - c1x2) > 0.001) { transform(c1x2, c1y2, &x, &y); if (flipXY == -1) { cx = y; cy = x; } else { cx = x; cy = y; } dtransform(ROUND(x2-c1x2), 0.0, &x, &y); dX = (flipXY == -1) ? y : x; if (ROUND(dX) != 0) dX = ROUND(dX); else dX = (dX < 0) ? -1 : 1; erode = PaintType != 2 && erosion >= 0.5; if (erode) cx -= 0.5; ex = cx + dX; ex = CEIL(ex) - ex + FLOOR(ex); if (erode) ex += 0.5; if (flipXY == -1) { itransform(cy, ex, &x, &y); } else { itransform(ex, cy, &x, &y); } eShift = x - x2; x1 += eShift; x2 += eShift; x3 += eShift; } } } if (x2 == x5 || y2 == y5) { RLineTo( x5 - currx, y5 - curry); \ } else { RRCurveTo( x0 - currx, y0 - curry, x1 - x0, y1 - y0, x2 - x1, y2 - y1); RRCurveTo( x3 - currx, y3 - curry, x4 - x3, y4 - y3, x5 - x4, y5 - y4); } } else { /* ProcessHints is off */ PickCoords(FALSE); /* Pick original control points */ RRCurveTo( x0 - currx, y0 - curry, x1 - x0, y1 - y0, x2 - x1, y2 - y1); RRCurveTo( x3 - currx, y3 - curry, x4 - x3, y4 - y3, x5 - x4, y5 - y4); } PSFakePush(epY); PSFakePush(epX); } /* FlxProc1() = OtherSubrs[1]; Part of Flex */ /* Calling sequence: '0 1 callothersubr' */ /* Saves and clears path, then restores currentpoint */ static void FlxProc1() { /* Since we are now building the path point list, there's nothing to do here! */ return; } /* FlxProc2() = OtherSubrs[2]; Part of Flex */ /* Calling sequence: '0 2 callothersubr' */ /* Returns currentpoint on stack */ static void FlxProc2() { /* Push CurrentPoint on fake PostScript stack */ PSFakePush( ppoints[numppoints-1].x); PSFakePush( ppoints[numppoints-1].y); } /* HintReplace() = OtherSubrs[3]; Hint Replacement */ /* Calling sequence: 'subr# 1 3 callothersubr pop callsubr' */ /* Reinitializes stem hint structure */ static void HintReplace() { /* Effectively retire the current stems, but keep them around for */ /* revhint use in case we are in a stem when we replace hints. */ currstartstem = numstems; /* 'subr#' is left on PostScript stack (for 'pop callsubr') */ } /* arg1 ... argn n othersubr# CALLOTHERSUBR - */ /* Make calls on the PostScript interpreter (or call equivalent C code) */ /* NOTE: The n arguments have been pushed on the fake PostScript stack */ static int CallOtherSubr(othersubrno) int othersubrno; { IfTrace1((FontDebug), "CallOtherSubr %d\n", othersubrno); switch(othersubrno) { case 0: /* OtherSubrs[0]; Main part of Flex */ if (PSFakeTop < 16) Error0i("CallOtherSubr: PSFakeStack low"); ClearPSFakeStack(); FlxProc( PSFakeStack[0], PSFakeStack[1], PSFakeStack[2], PSFakeStack[3], PSFakeStack[4], PSFakeStack[5], PSFakeStack[6], PSFakeStack[7], PSFakeStack[8], PSFakeStack[9], PSFakeStack[10], PSFakeStack[11], PSFakeStack[12], PSFakeStack[13], PSFakeStack[14], PSFakeStack[15], (int) PSFakeStack[16] ); break; case 1: /* OtherSubrs[1]; Part of Flex */ FlxProc1(); break; case 2: /* OtherSubrs[2]; Part of Flex */ FlxProc2(); break; case 3: /* OtherSubrs[3]; Hint Replacement */ HintReplace(); break; case 12: /* OtherSubrs[12]: Counter Control Hinting */ /* We do nothing, because later OtherSubrs[13] will remove data from the PS-stack */ break; case 13: /* We pop all elements from PSFakeStack. They may either have been left from previous calls to OtherSubr #12 or have been pushed for this call */ ClearPSFakeStack(); break; default: { /* call OtherSubrs[4] or higher if PostScript is present */ } } return(0); } /* |- x y SETCURRENTPOINT |- */ /* Sets the current point to (x,y) in absolute */ /* character space coordinates without per- */ /* forming a CharString MOVETO command */ static int SetCurrentPoint(x, y) DOUBLE x, y; { IfTrace2((FontDebug), "SetCurrentPoint %f %f\n", x, y); currx = x; curry = y; return(0); } /* The Type1Char routine for use by PostScript. */ /************************************************/ struct xobject *Type1Char(psfont *env, struct XYspace *S, psobj *charstrP, psobj *subrsP, psobj *osubrsP, struct blues_struct *bluesP, int *modeP, char *charname, float strokewidth, int decodeonly) { int Code; long i = 0; double xp, yp; #ifdef DUMPDEBUGPATH char fnbuf[128]; #endif struct segment* p; /* Reset SEAC querying variables */ isseac = 0; seacbase = 0; seacaccent = 0; /* Reset point list */ ppoints = NULL; numppoints = 0; numppointchunks = 0; /* disable hinting for stroking */ if ( strokewidth != 0.0f ) ProcessHints = 0; if ( env->fontInfoP[PAINTTYPE].value.data.integer == 1 ) ProcessHints = 0; path = NULL; apath = NULL; errflag = FALSE; if ( S == NULL ) { S=(struct XYspace *) IDENTITY; } /* Make parameters available to all Type1 routines */ currentchar=charname; Environment = (char *)env; CharSpace = S; /* used when creating path elements */ CharStringP = charstrP; SubrsP = subrsP; OtherSubrsP = osubrsP; ModeP = modeP; blues = bluesP; if ( decodeonly == 0 ) { QuerySpace( S, &scxx, &scyx, &scxy, &scyy); /* Transformation matrix */ p = ILoc( S, 1, 0); QueryLoc(p, IDENTITY, &xp, &yp); up = FABS(xp); size = scxx * 1000.0; #ifdef DUMPDEBUGPATH sprintf( fnbuf, "t1dump_%s_%f.eps", charname, size); psfile = fopen( fnbuf, "wb"); if ( psfile != NULL ) { PSDumpProlog( psfile); fprintf( psfile, "T1LibDict begin\n\ngsave\n%f t1SetupSize\nt1PreparePage\n", size); } #endif } /* compute the alignment zones */ SetRasterFlags(); ComputeAlignmentZones(); StartDecrypt(); ClearStack(); ClearPSFakeStack(); ClearCallStack(); InitStems(); /* reset variables */ currx = curry = 0.0; hcurrx = hcurry = 0.0; escapementX = escapementY = 0; sidebearingX = sidebearingY = 0; accentoffsetX = accentoffsetY = 0; wsoffsetX = wsoffsetY = 0; /* No shift to preserve whitspace. */ wsset = 0; /* wsoffsetX,Y haven't been set yet. */ for (;;) { if (!DoRead(&Code)) break; Decode(Code); if (errflag) break; } if ( decodeonly != 0 ) { /* OK, character description is now on stack, finish ... */ return NULL; } /* We now have a point list in absolute charspace coordinates. Adjust non-hinted points to suppress hinting artifacts and generate path. */ for ( i=0; ifontInfoP[PAINTTYPE].value.data.integer == 0 ) { /* For this special debug case, we generate both a filled and a stroked path!. */ createStrokePath( strokewidth, SUBPATH_CLOSED); createFillPath(); } else if ( env->fontInfoP[PAINTTYPE].value.data.integer == 1 ) { /* PaintType = 1 indicates stroked font. If strokewidth is 0.0f, we stroke using the font's internal strokewidth. Otherwise, the user supplied value is used. */ if ( strokewidth != 0.0f ) createStrokePath( strokewidth, SUBPATH_OPEN); else createStrokePath( env->fontInfoP[STROKEWIDTH].value.data.real, SUBPATH_OPEN); } #else if ( env->fontInfoP[PAINTTYPE].value.data.integer == 0 ) { /* PaintType = 0 indicates filled font. Hence, a strokewidth value other than 0.0 indicates the character is to be stroked instead of to be filled. */ if ( strokewidth != 0.0f ) createStrokePath( strokewidth, SUBPATH_CLOSED); else createFillPath(); } else if ( env->fontInfoP[PAINTTYPE].value.data.integer == 1 ) { /* PaintType = 1 indicates stroked font. If strokewidth is 0.0f, we stroke using the font's internal strokewidth. Otherwise, the user supplied value is used. */ if ( strokewidth != 0.0f ) createStrokePath( strokewidth, SUBPATH_OPEN); else createStrokePath( env->fontInfoP[STROKEWIDTH].value.data.real, SUBPATH_OPEN); } #endif /* check and handle accented char */ if ( apath != NULL ) { path = Join( apath, path); } /* Report a possible error: */ *modeP=errflag; /* Clean up if an error has occurred */ if (errflag) { if (path != NULL) { Destroy(path); /* Reclaim storage */ path = NULL; /* Indicate that character could not be built */ } } #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { PSDumpEpilog( psfile); fclose( psfile); psfile = 0; } #endif /* Cleanup ppoints */ if ( ppoints != NULL ) { free( ppoints); ppoints = NULL; numppoints = 0; } return((struct xobject *) path); } /* We add a function to implement underlining in Type1-Routines. */ struct xobject *Type1Line(psfont *env, struct XYspace *S, float line_position, float line_thickness, float line_length, float strokewidth) { /* Reset point list */ ppoints = NULL; numppoints = 0; numppointchunks = 0; path = NULL; apath = NULL; errflag = FALSE; /* Make parameters available to all Type1 routines */ Environment = (char *)env; CharSpace = S; /* used when creating path elements */ currx = curry = 0; escapementX = escapementY = 0; sidebearingX = sidebearingY = 0; /* We have to initialize the stems-structures because the lineto commands refer to them! */ SetRasterFlags(); InitStems(); /* Draw Character */ Sbw(-1.0*line_length, 0.0, 0.0, 0.0); RMoveTo( 0.0, (double) (line_position+0.5*line_thickness)); RLineTo( 0.0, (double) -line_thickness); RLineTo( (double) line_length, 0.0); RLineTo( 0.0, (double) line_thickness); DoClosePath(); EndChar(); /* Create path */ if ( strokewidth != 0.0f ) createStrokePath( strokewidth, SUBPATH_CLOSED); else createFillPath(); /* Cleanup ppoints */ if ( ppoints != NULL ) { free( ppoints); ppoints = NULL; } return((struct xobject *)path); } /* Adjust the points of a given cubic Bezier Spline so that the geometric relation of points B and C to A and D remain qualitatively the same. This reduces hinting artifacts at low resolutions. */ static void adjustBezier( long pindex) { double deltax = 0.0; /* x distance between point A and D */ double deltay = 0.0; /* y distance between point A and D */ double adeltax = 0.0; /* x distance between hinted point A and D */ double adeltay = 0.0; /* y distance between hinted point A and D */ deltax = ppoints[pindex].x - ppoints[pindex-3].x; deltay = ppoints[pindex].y - ppoints[pindex-3].y; adeltax = ppoints[pindex].ax - ppoints[pindex-3].ax; adeltay = ppoints[pindex].ay - ppoints[pindex-3].ay; if ( deltax == 0 || deltay == 0 ) return; ppoints[pindex-1].ax = ppoints[pindex-3].ax + (adeltax / deltax * (ppoints[pindex-1].x - ppoints[pindex-3].x)); ppoints[pindex-1].ay = ppoints[pindex-3].ay + (adeltay / deltay * (ppoints[pindex-1].y - ppoints[pindex-3].y)); ppoints[pindex-2].ax = ppoints[pindex-3].ax + (adeltax / deltax * (ppoints[pindex-2].x - ppoints[pindex-3].x)); ppoints[pindex-2].ay = ppoints[pindex-3].ay + (adeltay / deltay * (ppoints[pindex-2].y - ppoints[pindex-3].y)); return; } /* This function actually generates path segments. It is called after all hinting and adjustments have been performed. */ static void handleCurrentSegment( long pindex) { struct segment* B; struct segment* C; struct segment* D; struct segment* tmpseg; double dx1; double dy1; double dx2; double dy2; double dx3; double dy3; double adx1; double ady1; double adx2; double ady2; double adx3; double ady3; /* handle the different segment types in a switch-statement */ switch ( ppoints[pindex].type ) { case PPOINT_MOVE: /* handle a move segment */ dx1 = ppoints[pindex].x - ppoints[pindex-1].x; dy1 = ppoints[pindex].y - ppoints[pindex-1].y; adx1 = ppoints[pindex].ax - ppoints[pindex-1].ax; ady1 = ppoints[pindex].ay - ppoints[pindex-1].ay; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1rmoveto %% pindex = %ld\n", dx1*up, dy1*up, pindex); #endif if ( ProcessHints ) { IfTrace2((FontDebug), "RMoveTo(h) %f %f\n", adx1, ady1); B = Loc(CharSpace, adx1, ady1); #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { fprintf( psfile, "%f %f t1hintedrmoveto %% pindex = %ld\n", adx1*up, ady1*up, pindex); } #endif } else { IfTrace2((FontDebug), "RMoveTo %f %f\n", dx1, dy1); B = Loc(CharSpace, dx1, dy1); } path = Join(path, B); break; case PPOINT_LINE: /* handle a line segment */ dx1 = ppoints[pindex].x - ppoints[pindex-1].x; dy1 = ppoints[pindex].y - ppoints[pindex-1].y; adx1 = ppoints[pindex].ax - ppoints[pindex-1].ax; ady1 = ppoints[pindex].ay - ppoints[pindex-1].ay; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1rlineto %% pindex = %ld\n", dx1*up, dy1*up, pindex); #endif if ( ProcessHints ) { IfTrace2((FontDebug), "RLineTo(h) %f %f\n", adx1, ady1); B = Loc(CharSpace, adx1, ady1); #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { fprintf( psfile, "%f %f t1hintedrlineto %% pindex = %ld\n", adx1*up, ady1*up, pindex); } #endif } else { IfTrace2((FontDebug), "RLineTo %f %f\n", dx1, dy1); B = Loc(CharSpace, dx1, dy1); } path = Join(path, Line(B)); break; case PPOINT_BEZIER_B: /* handle a bezier segment (given by this and the following points) */ dx1 = ppoints[pindex].x - ppoints[pindex-1].x; dy1 = ppoints[pindex].y - ppoints[pindex-1].y; adx1 = ppoints[pindex].ax - ppoints[pindex-1].ax; ady1 = ppoints[pindex].ay - ppoints[pindex-1].ay; dx2 = ppoints[pindex+1].x - ppoints[pindex].x; dy2 = ppoints[pindex+1].y - ppoints[pindex].y; adx2 = ppoints[pindex+1].ax - ppoints[pindex].ax; ady2 = ppoints[pindex+1].ay - ppoints[pindex].ay; dx3 = ppoints[pindex+2].x - ppoints[pindex+1].x; dy3 = ppoints[pindex+2].y - ppoints[pindex+1].y; adx3 = ppoints[pindex+2].ax - ppoints[pindex+1].ax; ady3 = ppoints[pindex+2].ay - ppoints[pindex+1].ay; #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f %f %f %f %f t1rrcurveto %% pindex = %ld\n", dx1*up, dy1*up, dx2*up, dy2*up, dx3*up, dy3*up, pindex); #endif if (ProcessHints) { IfTrace4((FontDebug), "RRCurveTo %f %f %f %f ", adx1, ady1, adx2, ady2); IfTrace2((FontDebug), "%f %f\n", adx3, ady3); B = Loc(CharSpace, adx1, ady1); C = Loc(CharSpace, adx2, ady2); D = Loc(CharSpace, adx3, ady3); #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { fprintf( psfile, "%f %f %f %f %f %f t1hintedrrcurveto %% pindex = %ld\n", adx1*up, ady1*up, adx2*up, ady2*up, adx3*up, ady3*up, pindex); } #endif } else { IfTrace4((FontDebug), "RRCurveTo %f %f %f %f ", dx1, dy1, dx2, dy2); IfTrace2((FontDebug), "%f %f\n", dx3, dy3); B = Loc(CharSpace, dx1, dy1); C = Loc(CharSpace, dx2, dy2); D = Loc(CharSpace, dx3, dy3); } /* Since XIMAGER is not completely relative, */ /* we need to add up the delta values */ C = Join(C, (struct segment *)Dup(B)); D = Join(D, (struct segment *)Dup(C)); path = Join(path, (struct segment *)Bezier(B, C, D)); break; case PPOINT_SBW: #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f %f %f t1sbw %% pindex = %ld\n", ppoints[pindex].x*up, ppoints[pindex].y*up, /* sidebearings */ ppoints[pindex].ax*up, ppoints[pindex].ay*up, /* escapements */ pindex ); #endif path = Join(path, Loc(CharSpace, ppoints[pindex].x, ppoints[pindex].y)); break; case PPOINT_CLOSEPATH: IfTrace0((FontDebug), "DoClosePath\n"); #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { fprintf( psfile, "t1closepath %% pindex = %ld\n", pindex); if ( ProcessHints ) fprintf( psfile, "t1hintedclosepath %% pindex = %ld\n", pindex); } #endif tmpseg = Phantom(path); path = ClosePath(path); path = Join(Snap(path), tmpseg); break; case PPOINT_ENDCHAR: /* Perform a Closepath just in case the command was left out */ path = ClosePath(path); /* Set character width / escapement. It is stored in the vars for hinted coordinates. */ path = Join(Snap(path), Loc(CharSpace, ppoints[pindex].ax, ppoints[pindex].ay)); #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "t1FinishPage\ngrestore %% pindex = %ld\n", pindex); #endif break; case PPOINT_SEAC: /* return to origin of accent */ apath = Snap(path); /* reset path to NULL */ path = NULL; break; default: /* We must be at the beginning of the path, that is, there is nothing to do! */ ; } return; } #ifdef DUMPDEBUGPATH static void PSDumpProlog( FILE* fp) { #include "t1chardump" } static void PSDumpEpilog( FILE* fp) { fputs( "\nend\n", fp); } #endif /* #ifdef DUMPDEBUGPATH */ /* Take the accumulated path point list and construct the path that is to be filled. */ static void createFillPath( void) { long i; for ( i=0; i stroked font */ if ( i == startind ) { intersectRight( i, 0.5*strokewidth, INTERSECT_NEXT); } else if ( i == lastind ) { intersectRight( i, 0.5*strokewidth, INTERSECT_PREVIOUS); } else { intersectRight( i, 0.5*strokewidth, INTERSECT_BOTH); } } else { intersectRight( i, 0.5*strokewidth, INTERSECT_BOTH); } #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "\nCurrent PathPoint: PP %ld (%s): (%f,%f), shape=%s;\n", i, pptypes[ppoints[i].type], ppoints[i].x, ppoints[i].y, ppshapes[ppoints[i].shape]); fprintf( stderr, " RightPath: prev (%f,%f); next (%f,%f); res (%f,%f)\n", ppoints[i].x+ppoints[i].dxpr, ppoints[i].y+ppoints[i].dypr, ppoints[i].x+ppoints[i].dxnr, ppoints[i].y+ppoints[i].dynr, ppoints[i].x+ppoints[i].dxir, ppoints[i].y+ppoints[i].dyir); fprintf( stderr, " LeftPath: prev (%f,%f); next (%f,%f); res (%f,%f)\n\n", ppoints[i].x-ppoints[i].dxpr, ppoints[i].y-ppoints[i].dypr, ppoints[i].x-ppoints[i].dxnr, ppoints[i].y-ppoints[i].dynr, ppoints[i].x-ppoints[i].dxir, ppoints[i].y-ppoints[i].dyir); #endif break; case PPOINT_LINE: transformOnCurvePathPoint( strokewidth, iprev, i, inext); if ( subpathclosed == 0 ) { /* open subpath --> stroked font */ if ( i == startind ) intersectRight( i, 0.5*strokewidth, INTERSECT_NEXT); else if ( i == lastind ) intersectRight( i, 0.5*strokewidth, INTERSECT_PREVIOUS); else intersectRight( i, 0.5*strokewidth, INTERSECT_BOTH); } else { intersectRight( i, 0.5*strokewidth, INTERSECT_BOTH); } #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "\nCurrent PathPoint: PP %ld (%s): (%f,%f), shape=%s;\n", i, pptypes[ppoints[i].type], ppoints[i].x, ppoints[i].y, ppshapes[ppoints[i].shape]); fprintf( stderr, " RightPath: prev (%f,%f); next (%f,%f); res (%f,%f)\n", ppoints[i].x+ppoints[i].dxpr, ppoints[i].y+ppoints[i].dypr, ppoints[i].x+ppoints[i].dxnr, ppoints[i].y+ppoints[i].dynr, ppoints[i].x+ppoints[i].dxir, ppoints[i].y+ppoints[i].dyir); fprintf( stderr, " LeftPath: prev (%f,%f); next (%f,%f); res (%f,%f)\n\n", ppoints[i].x-ppoints[i].dxpr, ppoints[i].y-ppoints[i].dypr, ppoints[i].x-ppoints[i].dxnr, ppoints[i].y-ppoints[i].dynr, ppoints[i].x-ppoints[i].dxir, ppoints[i].y-ppoints[i].dyir); #endif break; case PPOINT_BEZIER_B: break; case PPOINT_BEZIER_C: break; case PPOINT_BEZIER_D: transformOnCurvePathPoint( strokewidth, iprev, i, inext); if ( subpathclosed == 0 ) { /* open subpath --> stroked font */ if ( i == startind ) intersectRight( i, 0.5*strokewidth, INTERSECT_NEXT); else if ( i == lastind ) intersectRight( i, 0.5*strokewidth, INTERSECT_PREVIOUS); else intersectRight( i, 0.5*strokewidth, INTERSECT_BOTH); } else { intersectRight( i, 0.5*strokewidth, INTERSECT_BOTH); } #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "\nCurrent PathPoint: PP %ld (%s): (%f,%f), shape=%s;\n", i, pptypes[ppoints[i].type], ppoints[i].x, ppoints[i].y, ppshapes[ppoints[i].shape]); fprintf( stderr, " RightPath: prev (%f,%f); next (%f,%f); res (%f,%f)\n", ppoints[i].x+ppoints[i].dxpr, ppoints[i].y+ppoints[i].dypr, ppoints[i].x+ppoints[i].dxnr, ppoints[i].y+ppoints[i].dynr, ppoints[i].x+ppoints[i].dxir, ppoints[i].y+ppoints[i].dyir); fprintf( stderr, " LeftPath: prev (%f,%f); next (%f,%f); res (%f,%f)\n\n", ppoints[i].x-ppoints[i].dxpr, ppoints[i].y-ppoints[i].dypr, ppoints[i].x-ppoints[i].dxnr, ppoints[i].y-ppoints[i].dynr, ppoints[i].x-ppoints[i].dxir, ppoints[i].y-ppoints[i].dyir); #endif /* transform the preceding two offCurve points */ transformOffCurvePathPoint( strokewidth, i-2); break; case PPOINT_CLOSEPATH: break; default: break; } ++i; } /* copy the shift values from starting point to ending points that have not yet been handled */ for ( ; i<=stopind; i++) { ppoints[i].dxpr = ppoints[startind].dxpr; ppoints[i].dypr = ppoints[startind].dypr; ppoints[i].dxnr = ppoints[startind].dxnr; ppoints[i].dynr = ppoints[startind].dynr; ppoints[i].dxir = ppoints[startind].dxir; ppoints[i].dyir = ppoints[startind].dyir; ppoints[i].dist2prev = ppoints[startind].dist2prev; ppoints[i].dist2next = ppoints[startind].dist2next; if ( ppoints[i].type == PPOINT_BEZIER_D ) { transformOffCurvePathPoint( strokewidth, i-2); } ppoints[i].shape = ppoints[startind].shape; } #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "\nTransformation of PathPoints finished. Starting to construct paths ...\n\n"); #endif /* We now have computed the resulting shift values for each path point of the current subpath's right path. The values for the left path follow by negation. The path is still to be build! */ /******************************************************************************** ******************************************************************************** ***** ***** Construction of right path ***** ******************************************************************************** ********************************************************************************/ /* The leading move segment is treated separately. First check from which point the leading Moveto was called. This is safe even in cases where multiple moveto appear in a series. */ i = startind; while ( ppoints[i].type == PPOINT_MOVE ) --i; dx1 = ppoints[startind].x - (ppoints[i].x); dy1 = ppoints[startind].y - (ppoints[i].y); /* If the first node in the subpath is not concave, we may directly jump to the intersection right path point. Otherwise, we remain at the onCurve point because later, prolongation will happen. */ if ( ppoints[startind].shape != CURVE_CONCAVE ) { dx1 += ppoints[startind].dxir; dy1 += ppoints[startind].dyir; } #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1srmoveto %% pindex = %ld\n", dx1*up, dy1*up, startind); #endif B = Loc(CharSpace, dx1, dy1); path = Join(path, B); /* Now, handle the remaining path in a loop */ for ( i=startind+1; i<=stopind; ) { switch ( ppoints[i].type ) { case PPOINT_LINE: /* handle a line segment */ /* 1. Check and handle starting node */ linkNode( i-1, PATH_START, PATH_RIGHT); /* 2. Draw ideal isolated line segment */ #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "RP: Line from point %ld to %ld\n", i-1, i); #endif dx1 = ppoints[i].x + ppoints[i].dxpr - (ppoints[i-1].x + ppoints[i-1].dxnr); dy1 = ppoints[i].y + ppoints[i].dypr - (ppoints[i-1].y + ppoints[i-1].dynr); #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1srlineto %% pindex = %ld\n", dx1*up, dy1*up, i); #endif B = Loc(CharSpace, dx1, dy1); path = Join(path, Line(B)); /* 3. Check and handle ending node */ linkNode( i, PATH_END, PATH_RIGHT); break; case PPOINT_BEZIER_B: break; case PPOINT_BEZIER_C: break; case PPOINT_BEZIER_D: /* handle a bezier segment (given by this and the previous 3 path points)! */ /* 1. Check and handle starting node */ linkNode( i-3, PATH_START, PATH_RIGHT); /* 2. Draw curve based on ideal point locations */ #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "RP: Curve from PP %ld to PP %ld to PP %ld to PP %ld\n", i-3, i-2, i-1, i); #endif dx1 = ppoints[i-2].x + ppoints[i-2].dxir - (ppoints[i-3].x + ppoints[i-3].dxnr); dy1 = ppoints[i-2].y + ppoints[i-2].dyir - (ppoints[i-3].y + ppoints[i-3].dynr); dx2 = ppoints[i-1].x + ppoints[i-1].dxir - (ppoints[i-2].x + ppoints[i-2].dxir); dy2 = ppoints[i-1].y + ppoints[i-1].dyir - (ppoints[i-2].y + ppoints[i-2].dyir); dx3 = ppoints[i].x + ppoints[i].dxpr - (ppoints[i-1].x + ppoints[i-1].dxir); dy3 = ppoints[i].y + ppoints[i].dypr - (ppoints[i-1].y + ppoints[i-1].dyir); #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f %f %f %f %f t1srrcurveto %% pindex = %ld\n", dx1*up, dy1*up, dx2*up, dy2*up, dx3*up, dy3*up, i); #endif IfTrace4((FontDebug), "RRCurveTo %f %f %f %f ", dx1, dy1, dx2, dy2); IfTrace2((FontDebug), "%f %f\n", dx3, dy3); B = Loc(CharSpace, dx1, dy1); C = Loc(CharSpace, dx2, dy2); D = Loc(CharSpace, dx3, dy3); C = Join(C, (struct segment *)Dup(B)); D = Join(D, (struct segment *)Dup(C)); path = Join(path, (struct segment *)Bezier(B, C, D)); /* 3. Check and handle starting node */ linkNode( i, PATH_END, PATH_RIGHT); break; case PPOINT_CLOSEPATH: #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "RP: ClosePath command ignored\n"); #endif break; default: break; } ++i; } /******************************************************************************** ******************************************************************************** ***** ***** Close right path ***** ******************************************************************************** ********************************************************************************/ if ( subpathclosed != 0 ) { /* We are stroking an outline font to be filled */ if ( closepathatfirst == 0 ) { /* Because of the concavity issue, we may not simply use the closepath operator here. Instead we have to manage a possible prolongation manually if the closepath would cause a line segment. */ /* 1. Check and handle starting node */ linkNode( lastind, PATH_START, PATH_RIGHT); /* 2. Draw ideal isolated line segment */ dx1 = ppoints[startind].x + ppoints[startind].dxpr - (ppoints[lastind].x + ppoints[lastind].dxnr); dy1 = ppoints[startind].y + ppoints[startind].dypr - (ppoints[lastind].y + ppoints[lastind].dynr); #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1srlineto %% pindex = %ld\n", dx1*up, dy1*up, startind); #endif B = Loc(CharSpace, dx1, dy1); path = Join(path, Line(B)); /* 3. Check and handle ending node */ linkNode( startind, PATH_END, PATH_RIGHT); } /* if ( closepathatfirst == 0) */ /* Now close path formally. Anyhow, this won't cause a line segment! */ #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { fprintf( psfile, "t1sclosepath %% Right Path finished, stepping to Left Path\n"); } #endif tmpseg = Phantom(path); path = ClosePath(path); path = Join(Snap(path), tmpseg); /******************************************************************************** ******************************************************************************** ***** ***** Stepping to beginning of left path ***** ******************************************************************************** ********************************************************************************/ /* If curve is concave at the subpath's starting point, the location is onCurve and the left path is convex, there. Conversely, if the curve is convex, the location is at the right intersection point and the left path will be concave so that the initial location must be onCurve. Hence, for both cases, we have to translate back once the intersection shift. If the curve is straight at the starting point, we directly jump from the right intersection point ot he left intersection point. */ if ( (ppoints[startind].shape == CURVE_CONCAVE) || (ppoints[startind].shape == CURVE_CONVEX) ) { dx1 = - ppoints[startind].dxir; dy1 = - ppoints[startind].dyir; } else { dx1 = - 2.0 * ppoints[startind].dxir; dy1 = - 2.0 * ppoints[startind].dyir; } #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1srmoveto %% pindex = %ld\n", dx1*up, dy1*up, startind); #endif B = Loc(CharSpace, dx1, dy1); path = Join(path, B); } /* if ( subpathclose != 0 */ else { /* We have a stroked font. In this case, a line segment has to be drawn */ if ( (ppoints[stopind].shape == CURVE_CONCAVE) || (ppoints[stopind].shape == CURVE_CONVEX) ) { dx1 = - ppoints[stopind].dxir; dy1 = - ppoints[stopind].dyir; } else { dx1 = - 2.0 * ppoints[stopind].dxir; dy1 = - 2.0 * ppoints[stopind].dyir; } #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1srlineto %% pindex = %ld\n", dx1*up, dy1*up, stopind); #endif B = Loc(CharSpace, dx1, dy1); path = Join(path, Line(B)); } /******************************************************************************** ******************************************************************************** ***** ***** Construction of left path ***** ******************************************************************************** ********************************************************************************/ /* Create left path. This is somewhat more complicated, because the order/direction has to be exchanged. */ #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "Constructing LeftPath: stopind=%ld, lastind=%ld, closepathatfirst=%d\n", stopind, lastind, closepathatfirst); #endif for ( i=stopind; i>=startind; ) { if ( subpathclosed != 0 ) { /* closed subpath --> filled font */ if ( i == stopind ) { ip = startind; if ( (closepathatfirst != 0) ) type = ppoints[ip].type; else type = PPOINT_NONE; } else if ( i == startind ) { ip = startind + 1; type = ppoints[ip].type; } else { ip = i + 1; type = ppoints[ip].type; } } else { /* open subpath --> stroked font */ type = ppoints[i].type; in = i - 1; } /* Step through path in inverted direction. Note: - ip is the index of the starting point, i the index of the ending point of the current segment. - If the path point is flagged "concave", then this reverts into "convex" in the left path and vice versa! - there is an index shift of 1 between closed and open subpaths. */ switch ( type ) { case PPOINT_MOVE: break; case PPOINT_LINE: /* handle a line segment */ if ( subpathclosed != 0 ) { segendind = i; segstartind = ip; } else { segstartind = i; segendind = in; } /* 1. Check and handle starting node */ linkNode( segstartind, PATH_START, PATH_LEFT); /* 2. Draw ideal isolated line segment */ #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "LP: Line from point %ld to %ld\n", segstartind, segendind); #endif dx1 = ppoints[segendind].x - ppoints[segendind].dxnr - (ppoints[segstartind].x - ppoints[segstartind].dxpr); dy1 = ppoints[segendind].y - ppoints[segendind].dynr - (ppoints[segstartind].y - ppoints[segstartind].dypr); #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1srlineto %% pindex = %ld\n", dx1*up, dy1*up, segendind); #endif B = Loc(CharSpace, dx1, dy1); path = Join(path, Line(B)); /* 3. Check and handle ending node */ linkNode( segendind, PATH_END, PATH_LEFT); break; case PPOINT_BEZIER_B: break; case PPOINT_BEZIER_C: break; case PPOINT_BEZIER_D: /* handle a bezier segment (given by this and the previous 3 path points)! For bezier segments, we may not simply apply the intersection of previous and next candidate because that would damage the curve's layout. Instead, in cases where the candidate produced by intersection is not identical to the ideal point, we prolongate and link the distance with a line segment. */ /* 1. Check and handle starting node */ linkNode( ip, PATH_START, PATH_LEFT); /* 2. Draw ideal curve segment */ #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "LP: Curve from PP %ld to PP %ld to PP %ld to PP %ld\n", ip, ip-1, ip-2, ip-3); #endif /* Use ideal point locations for curve at starting and ending point: */ dx1 = ppoints[ip-1].x - ppoints[ip-1].dxir - (ppoints[ip].x - ppoints[ip].dxpr); dy1 = ppoints[ip-1].y - ppoints[ip-1].dyir - (ppoints[ip].y - ppoints[ip].dypr); dx2 = ppoints[ip-2].x - ppoints[ip-2].dxir - (ppoints[ip-1].x - ppoints[ip-1].dxir); dy2 = ppoints[ip-2].y - ppoints[ip-2].dyir - (ppoints[ip-1].y - ppoints[ip-1].dyir); dx3 = ppoints[ip-3].x - ppoints[ip-3].dxnr - (ppoints[ip-2].x - ppoints[ip-2].dxir); dy3 = ppoints[ip-3].y - ppoints[ip-3].dynr - (ppoints[ip-2].y - ppoints[ip-2].dyir); #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f %f %f %f %f t1srrcurveto %% pindex = %ld\n", dx1*up, dy1*up, dx2*up, dy2*up, dx3*up, dy3*up, i); #endif IfTrace4((FontDebug), "RRCurveTo %f %f %f %f ", dx1, dy1, dx2, dy2); IfTrace2((FontDebug), "%f %f\n", dx3, dy3); B = Loc(CharSpace, dx1, dy1); C = Loc(CharSpace, dx2, dy2); D = Loc(CharSpace, dx3, dy3); C = Join(C, (struct segment *)Dup(B)); D = Join(D, (struct segment *)Dup(C)); path = Join(path, (struct segment *)Bezier(B, C, D)); /* 3. Check and handle ending node */ linkNode( ip-3, PATH_END, PATH_LEFT); break; case PPOINT_CLOSEPATH: /* Handle a ClosePath segment, if it had caused a line segment. Hence, actually, we handle a line segment here. */ if ( closepathatfirst == 1 ) { /* ignore this command */ break; } /* 1. Check and handle starting node */ linkNode( startind, PATH_START, PATH_LEFT); /* 2. Draw ideal isolated line segment */ #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "LP: Inverted ClosePath from point %ld to %ld\n", startind, lastind); #endif if ( subpathclosed != 0 ) { dx1 = ppoints[lastind].x - ppoints[lastind].dxnr - (ppoints[startind].x - ppoints[startind].dxpr); dy1 = ppoints[lastind].y - ppoints[lastind].dynr - (ppoints[startind].y - ppoints[startind].dypr); } else { dx1 = -(ppoints[i].x - ppoints[i].dxnr - (ppoints[ip].x - ppoints[ip].dxpr)); dy1 = -(ppoints[i].y - ppoints[i].dynr - (ppoints[ip].y - ppoints[ip].dypr)); } #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { if ( subpathclosed != 0 ) { fprintf( psfile, "%f %f t1srlineto %% (Inverted ClosePath, subpathclosed=1) pindex = %ld\n", dx1*up, dy1*up, lastind); } else { fprintf( psfile, "%f %f t1srlineto %% (Inverted ClosePath, subpathclosed=0) pindex = %ld\n", dx1*up, dy1*up, i); } } #endif B = Loc(CharSpace, dx1, dy1); path = Join(path, Line(B)); /* 3. Check and handle ending node */ linkNode( lastind, PATH_END, PATH_LEFT); break; default: break; } --i; } #ifdef DUMPDEBUGPATH if ( psfile != NULL ) { fprintf( psfile, "t1sclosepath\n"); } #endif tmpseg = Phantom(path); path = ClosePath(path); path = Join(Snap(path), tmpseg); /******************************************************************************** ******************************************************************************** ***** ***** Move to final position ***** ******************************************************************************** ********************************************************************************/ /* Step to back to starting point of this subpath. If closepathatfirst==0, the final closepath caused a line segment. In this case, we first have to step back that segment and proceed from this point. */ if ( ppoints[startind].shape == CURVE_CONVEX ) { /* In this case, left path is concave and the current location is at the onCurve point */ dx1 = 0.0; dy1 = 0.0; } else { /* OK, it seems to be the intersection point */ dx1 = ppoints[startind].dxir; dy1 = ppoints[startind].dyir; } /* We are now onCurve. If necessary step to the point where the closepath appeared. */ if ( closepathatfirst == 0 ) { dx1 += ppoints[lastind].x - ppoints[startind].x; dy1 += ppoints[lastind].y - ppoints[startind].y; } #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1srmoveto %% pindex = %ld\n", dx1*up, dy1*up, lastind); #endif B = Loc(CharSpace, dx1, dy1); path = Join(path, B); return; } /* Compute distance from OnCurve-points to their neighbouring points, fill in the respective entries dist2prev and dist2next in the ppoints[] structures and return the index of the last point in the current subpath which has a location different from the starting point of the subpath. */ static long computeDistances( long startind, long stopind, int subpathclosed) { long lastind = 0; double dx = 0.0; double dy = 0.0; long i = 0; int neighboured = 0; /* Handle first point as a special case */ /* distance to previous point. First, get index of previous point. */ lastind = stopind; if ( subpathclosed != 0 ) { if ( (ppoints[startind].x == ppoints[stopind].x) && (ppoints[startind].y == ppoints[stopind].y) ) { while ( (ppoints[lastind].x == ppoints[stopind].x) && (ppoints[lastind].y == ppoints[stopind].y)) --lastind; } else { lastind = stopind - 1; } } #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "computeDistance(): startind=%ld stopind=%ld, lastind=%ld, start.x=%f, start.y=%f, last.x=%f, last.y=%f\n", startind, stopind, lastind, ppoints[startind].x, ppoints[startind].y, ppoints[lastind].x, ppoints[lastind].y); #endif dx = ppoints[startind].x - ppoints[lastind].x; dy = ppoints[startind].y - ppoints[lastind].y; ppoints[startind].dist2prev = sqrt( dx*dx + dy*dy ); /* distance to next point */ dx = ppoints[startind+1].x - ppoints[startind].x; dy = ppoints[startind+1].y - ppoints[startind].y; ppoints[startind].dist2next = sqrt( dx*dx + dy*dy ); #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "Pre: Distance at point %ld: Prev=%f Next=%f\n", startind, ppoints[startind].dist2prev, ppoints[startind].dist2next); #endif for ( i = startind+1; i < lastind; i++ ) { if ( (ppoints[i].type == PPOINT_MOVE) || (ppoints[i].type == PPOINT_LINE) || (ppoints[i].type == PPOINT_BEZIER_D) ) { if ( neighboured ) { ppoints[i].dist2prev = ppoints[i-1].dist2next; } else { /* distance to previous point */ dx = ppoints[i].x - ppoints[i-1].x; dy = ppoints[i].y - ppoints[i-1].y; /* Take care of degenerated curves */ if ( (dx == 0.0) && (dy == 0.0) ) { dx = ppoints[i].x - ppoints[i-2].x; dy = ppoints[i].y - ppoints[i-2].y; if ( (dx == 0.0) && (dy == 0.0) ) { dx = ppoints[i].x - ppoints[i-3].x; dy = ppoints[i].y - ppoints[i-3].y; } } ppoints[i].dist2prev = sqrt( dx*dx + dy*dy ); } /* distance to next point */ dx = ppoints[i+1].x - ppoints[i].x; dy = ppoints[i+1].y - ppoints[i].y; /* Take care of degenerated curves */ if ( (dx == 0.0) && (dy == 0.0) ) { dx = ppoints[i+2].x - ppoints[i].x; dy = ppoints[i+2].y - ppoints[i].y; if ( (dx == 0.0) && (dy == 0.0) ) { dx = ppoints[i+3].x - ppoints[i].x; dy = ppoints[i+3].y - ppoints[i].y; } } ppoints[i].dist2next = sqrt( dx*dx + dy*dy ); neighboured = 1; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " Distance at point %ld: Prev=%f Next=%f\n", i, ppoints[i].dist2prev, ppoints[i].dist2next); #endif } else { neighboured = 0; } } /* We still have to handle the last point */ /* distance to previous point */ dx = ppoints[lastind].x - ppoints[lastind-1].x; dy = ppoints[lastind].y - ppoints[lastind-1].y; /* Take care of degenerated curves */ if ( (dx == 0.0) && (dy == 0.0) ) { dx = ppoints[lastind].x - ppoints[lastind-2].x; dy = ppoints[lastind].y - ppoints[lastind-2].y; if ( (dx == 0.0) && (dy == 0.0) ) { dx = ppoints[lastind].x - ppoints[lastind-3].x; dy = ppoints[lastind].y - ppoints[lastind-3].y; } } ppoints[lastind].dist2prev = sqrt( dx*dx + dy*dy ); /* distance to next point */ ppoints[lastind].dist2next = ppoints[startind].dist2prev; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "End: Distance at point %ld: Prev=%f Next=%f\n", lastind, ppoints[lastind].dist2prev, ppoints[lastind].dist2next); #endif return lastind; } /* */ static long handleNonSubPathSegments( long pindex) { /* handle the different segment types in a switch-statement */ switch ( ppoints[pindex].type ) { case PPOINT_SBW: #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f %f %f t1sbw %% pindex = %ld\n", ppoints[pindex].x*up, ppoints[pindex].y*up, /* sidebearings */ ppoints[pindex].ax*up, ppoints[pindex].ay*up, /* escapements */ pindex ); #endif path = Join(path, Loc(CharSpace, ppoints[pindex].x, ppoints[pindex].y)); return 1; break; case PPOINT_ENDCHAR: /* Perform a Closepath just in case the command was left out */ path = ClosePath(path); /* Set character width / escapement. It is stored in the vars for hinted coordinates. */ path = Join(Snap(path), Loc(CharSpace, ppoints[pindex].ax, ppoints[pindex].ay)); #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fputs( "t1FinishPage\n", psfile); #endif return 1; break; case PPOINT_SEAC: /* return to origin of accent */ apath = Snap(path); /* reset path to NULL */ path = NULL; return 1; break; default: /* not handled, return 0! */ ; } return 0; } /* Transform a path point according to the path's incoming angle, the path's outgoing angle and the parameter strokewidth. The computation is based on simple geometric considerations and makes use of the distance from the current point to the previous point and the next point respectively. Generally, each link to a path point induces its own candidate by simply widening the respective link orthogonally to strokewidth/2. This yields two displacement vectors (dx,dy) for the link from the previous point to the point under consideration (dxp, dyp) and and for the link from the current point to the next point (dxn, dyn). Later on, the two candidates are used to compute the resulting displacement as the intersection of the prolongated lines from before and behind the current point. Additionally, check whether the curve is concave or convex at this point. This is required for prolongation in the context of stroking. */ static void transformOnCurvePathPoint( double strokewidth, long prevind, long currind, long nextind) { double distxp; double distyp; double distxn; double distyn; double det; /* distxp = (ppoints[currind].y - ppoints[prevind].y); distyp = -(ppoints[currind].x - ppoints[prevind].x); distxn = (ppoints[nextind].y - ppoints[currind].y); distyn = -(ppoints[nextind].x - ppoints[currind].x); ppoints[currind].dxpr = distxp * strokewidth * 0.5 / ppoints[currind].dist2prev; ppoints[currind].dypr = distyp * strokewidth * 0.5 / ppoints[currind].dist2prev; ppoints[currind].dxnr = distxn * strokewidth * 0.5 / ppoints[currind].dist2next; ppoints[currind].dynr = distyn * strokewidth * 0.5 / ppoints[currind].dist2next; */ /* Note: When computing transformations of OnCurve points, we consider two special cases: 1) The OnCurve beginning or end point is equal to the neighboring control point of a Bezier-Segment. 2) This holds for beginning *and* end point. In this case the curve degenerates to a straight lines. Although this is deprecated by Adobe, fonts that use such constructions exist (e.g.m lower case 'n' of Univers 55). However, we do not care for segments that do not any escapement at all! */ distxp = (ppoints[currind].y - ppoints[prevind].y); distyp = -(ppoints[currind].x - ppoints[prevind].x); if ( (distxp == 0.0) && (distyp == 0.0) ) { distxp = (ppoints[currind].y - ppoints[prevind-1].y); distyp = -(ppoints[currind].x - ppoints[prevind-1].x); if ( (distxp == 0.0) && (distyp == 0.0) ) { distxp = (ppoints[currind].y - ppoints[prevind-2].y); distyp = -(ppoints[currind].x - ppoints[prevind-2].x); } } ppoints[currind].dxpr = distxp * strokewidth * 0.5 / ppoints[currind].dist2prev; ppoints[currind].dypr = distyp * strokewidth * 0.5 / ppoints[currind].dist2prev; distxn = (ppoints[nextind].y - ppoints[currind].y); distyn = -(ppoints[nextind].x - ppoints[currind].x); if ( (distxn == 0.0) && (distyn == 0.0) ) { distxn = (ppoints[nextind+1].y - ppoints[currind].y); distyn = -(ppoints[nextind+1].x - ppoints[currind].x); if ( (distxn == 0.0) && (distyn == 0.0) ) { distxn = (ppoints[nextind+2].y - ppoints[currind].y); distyn = -(ppoints[nextind+2].x - ppoints[currind].x); } } ppoints[currind].dxnr = distxn * strokewidth * 0.5 / ppoints[currind].dist2next; ppoints[currind].dynr = distyn * strokewidth * 0.5 / ppoints[currind].dist2next; /* Consider determinant of the two tangent vectors at this node in order to decide whether the curve is convex or cancave at this point. */ if ( (det = ((distxp * distyn) - (distxn * distyp))) < 0.0 ) { /* curve turns to the right */ ppoints[currind].shape = CURVE_CONCAVE; } else if ( det > 0.0 ) { /* curve turns to the left */ ppoints[currind].shape = CURVE_CONVEX; } else { /* curve is straight */ ppoints[currind].shape = CURVE_STRAIGHT; } return; } /* Compute a displacement for offCurve points, that is, for Bezier B and C points. This computation is not as simple as it might appear at a first glance and, depending on the actual curve parameters and the parameter strokewidth, it might be necessary to subdivide the curve. My mathematical background is not actually reliable in this context but it seems that in particular the angle that the curve runs through is important in this context. Since the Adobe Type 1 recommendations on font design include a rule which states that curves' end points should be located at extreme values, and consequently, that the angle of a curve segment should not be larger than 90 degrees, I have decided not to implement curve subdivision. This might lead to some deviations if fonts do not adhere to the Adobe recommendations. Anyways, I have never seen such fonts. This function is called for Bezier_B points and computes displacements for the B and C points at once. Fortunately, index cycling cannot happen here. When computing the B' C' off-curve points, special care against numerical instability is required. We assume that at least one of the two points can be computed in a stable way. The new Bezier B' and C' points can be considered as four degrees of freedom and we have to find 4 equations to be able to compute them. 1) We require the tangents slope at point A' to be identical to the slope at the point A of the ideally thin mathematical curve. 2) The same holds for the tangents slope at point D' with respect to point D. 3) We compute the following points P1: Equally subdivides the line A - B P2: Equally subdivides the line B - C P3: Equally subdivides the line C - D P4: Equally subdivides the line P1 - P2 P5: Equally subdivides the line P1 - P3 P6: Equally subdivides the line P4 - P5 This latter point is part of the curve and, moreover, the line P4 - P5 is tangent to the curve at that point. From this point, we compute a displacement for P6, orthogonally to the curve at that point and with length strokewidth/2. The resulting point is part of the delimiting path that makes up the thick curve. 4) We require that the tangent's slope at P6' equals the tangents slope at P6. Then, under certain further constraints as mentioned above, we compute the points B' and C' making use of the points A' and D' which have been transformed as onCurve points. By definition, for offCurve points, there is only one candidate. */ static void transformOffCurvePathPoint( double strokewidth, long currind) { double dtmp; double diameter; double dx; double dy; /* points defining the curve */ double pax; double pay; double pbx; double pby; double pcx; double pcy; double pdx; double pdy; /* auxiliary points from iterative Bezier construction */ double p1x; double p1y; double p2x; double p2y; double p3x; double p3y; double p4x; double p4y; double p5x; double p5y; double p6x; double p6y; /* already displaced / shifted onCurve points and the ones we are going to compute. */ double paxs; double pays; double pbxs; double pbys; double pcxs; double pcys; double pdxs; double pdys; /* The normal vector on the curve at t=1/2 */ double nabs; double nx; double ny; /* some variables for computations at point B' */ double bloc1x; double bloc1y; double bdir1x; double bdir1y; double bloc2x; double bloc2y; double bdir2x; double bdir2y; double bdet; double binvdet; double binvdir1x; double binvdir1y; /**/ double binvdir2x; double binvdir2y; /**/ double bmu; double bnu; /**/ /* some variables for computations at point C' */ double cloc1x; double cloc1y; double cdir1x; double cdir1y; double cloc2x; double cloc2y; double cdir2x; double cdir2y; double cdet; double cinvdet; double cinvdir1x; double cinvdir1y; /**/ double cinvdir2x; double cinvdir2y; /**/ double cmu; double cnu; /**/ diameter = strokewidth * 0.5; pax = ppoints[currind-1].x; pay = ppoints[currind-1].y; pbx = ppoints[currind].x; pby = ppoints[currind].y; pcx = ppoints[currind+1].x; pcy = ppoints[currind+1].y; pdx = ppoints[currind+2].x; pdy = ppoints[currind+2].y; p1x = (pax + pbx) * 0.5; p1y = (pay + pby) * 0.5; p2x = (pbx + pcx) * 0.5; p2y = (pby + pcy) * 0.5; p3x = (pcx + pdx) * 0.5; p3y = (pcy + pdy) * 0.5; p4x = (p1x + p2x) * 0.5; p4y = (p1y + p2y) * 0.5; p5x = (p2x + p3x) * 0.5; p5y = (p2y + p3y) * 0.5; p6x = (p4x + p5x) * 0.5; p6y = (p4y + p5y) * 0.5; /* We start by computing the shift of the onCurve points. It is not possible to use dxr / dyr of the ppoints-stucture entries. These values have been computed by intersection of both links to a path point. Here we need the ideal points of the thick isolated curve segment. We are aware that for Bezier splines, control point and OnCurve point might be identical! */ dx = (ppoints[currind].y - ppoints[currind-1].y) * strokewidth * 0.5 / ppoints[currind-1].dist2next; dy = - (ppoints[currind].x - ppoints[currind-1].x) * strokewidth * 0.5 / ppoints[currind-1].dist2next; if ( (dx == 0.0) && (dy == 0.0) ) { /* Bezier_A and Bezier_B are identical */ dx = (ppoints[currind+1].y - ppoints[currind-1].y) * strokewidth * 0.5 / ppoints[currind-1].dist2next; dy = - (ppoints[currind+1].x - ppoints[currind-1].x) * strokewidth * 0.5 / ppoints[currind-1].dist2next; } paxs = ppoints[currind-1].x + dx; pays = ppoints[currind-1].y + dy; dx = (ppoints[currind+2].y - ppoints[currind+1].y) * strokewidth * 0.5 / ppoints[currind+2].dist2prev; dy = - (ppoints[currind+2].x - ppoints[currind+1].x) * strokewidth * 0.5 / ppoints[currind+2].dist2prev; if ( (dx == 0.0) && (dy == 0.0) ) { /* Bezier_C and Bezier_D are identical */ dx = (ppoints[currind+2].y - ppoints[currind].y) * strokewidth * 0.5 / ppoints[currind+2].dist2prev; dy = - (ppoints[currind+2].x - ppoints[currind].x) * strokewidth * 0.5 / ppoints[currind+2].dist2prev; } pdxs = ppoints[currind+2].x + dx; pdys = ppoints[currind+2].y + dy; /* Next, we compute the right side normal vector at the curve point t=1/2, that is, at P6. */ nabs = diameter / sqrt(((p5x - p4x) * (p5x - p4x)) + ((p5y - p4y) * (p5y - p4y))); nx = (p5y - p4y) * nabs; ny = (p4x - p5x) * nabs; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "transformOffCurvePathPoint():\n"); fprintf( stderr, " A=(%f,%f), B=(%f,%f), C=(%f,%f), D=(%f,%f)\n", pax, pay, pbx, pby, pcx, pcy, pdx, pdy); fprintf( stderr, " PathInfo: Curve from PP %ld ... PP %ld ... PP %ld ... PP %ld. StrokeWidth=%f.\n", currind-1, currind, currind+1, currind+2, strokewidth); /* fprintf( stderr, "/xa %f def\n/ya %f def\n/xb %f def\n/yb %f def\n/xc %f def\n/yc %f def\n/xd %f def\n/yd %f def\n", pax, pay, pbx, pby, pcx, pcy, pdx, pdy); */ fprintf( stderr, " As=(%f,%f), Ds=(%f,%f)\n", paxs, pays, pdxs, pdys); fprintf( stderr, " p6=(%f,%f)\n", p6x, p6y); fprintf( stderr, " nx=%f, ny=%f, nabs=%f\n", nx, ny, nabs); fprintf( stderr, " p6s=(%f,%f)\n", p6x+nx, p6y+ny); #endif /* Compute two lines whose intersection will define point B' */ bloc1x = (4.0 * (nx + p6x) - (2 * paxs) + pdxs) / 3.0; bloc1y = (4.0 * (ny + p6y) - (2 * pays) + pdys) / 3.0; bdir1x = pcx + pdx - pax - pbx; bdir1y = pcy + pdy - pay - pby; bloc2x = paxs; bloc2y = pays; bdir2x = pbx - pax; bdir2y = pby - pay; bdet = (bdir2x * bdir1y) - (bdir2y * bdir1x); #define DET_QUOTIENT_UPPER_THRESHOLD (1.05) #define DET_QUOTIENT_LOWER_THRESHOLD (1.0/DET_QUOTIENT_UPPER_THRESHOLD) /* Life has shown, that the "reliability" of the determinant has to be ensured. Otherwise, serious distortions might be introduced. In order to ensure numerical stability, we do not only check whether the detrminant is about zero, but we also check whether the two partial expressions that are subtracted when computing the determinant are of about the same size. If this is the case, we explicitly reset the determinant and eventually compute this off-curve point based on the other off-curve point later. */ if ( (bdir2x != 0.0) && (bdir1y != 0.0) ) { dtmp = (bdir2y*bdir1x)/(bdir2x*bdir1y); if ( (DET_QUOTIENT_LOWER_THRESHOLD < dtmp) && (DET_QUOTIENT_UPPER_THRESHOLD > dtmp) ) { /* Determinant appears to be unreliable, reset it exactly to zero. */ bdet = 0.0; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " Warning: Determinant quotient check for bdet failed: dtmp=%16.16f, lower limit=%f, upper limit=%f.\n --> Determinant does not seem to be stable, resetting to zero.\n", dtmp, DET_QUOTIENT_LOWER_THRESHOLD, DET_QUOTIENT_UPPER_THRESHOLD); #endif } } else if ( (bdir2y != 0.0) && (bdir1x != 0.0) ) { dtmp = (bdir2x*bdir1y)/(bdir2y*bdir1x); if ( (DET_QUOTIENT_LOWER_THRESHOLD < dtmp) && (DET_QUOTIENT_UPPER_THRESHOLD > dtmp) ) { /* Determinant appears to be unreliable, reset it exactly to zero. */ bdet = 0.0; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " Warning: Determinant quotient check for bdet failed: dtmp=%16.16f, lower limit=%f, upper limit=%f.\n --> Determinant does not seem to be stable, resetting to zero.\n", dtmp, DET_QUOTIENT_LOWER_THRESHOLD, DET_QUOTIENT_UPPER_THRESHOLD); #endif } } #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " bloc1x=%f, bloc1y=%f, bloc2x,=%f bloc2y=%f\n", bloc1x, bloc1y, bloc2x, bloc2y); fprintf( stderr, " bdir1x=%f, bdir1y=%f, bdir2x,=%f bdir2y=%f\n", bdir1x, bdir1y, bdir2x, bdir2y); #endif /* Switch if determinant is zero; we then actually have a straight line */ if ( fabs(bdet) < 0.001 ) { pbxs = pbx + nx; pbys = pby + ny; bmu = 0.0; bnu = 0.0; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " Warning: Determinant check for bdet failed: bdet=%16.16f. Computing Bs based on normal vector, resetting bmu, bnu.\n", bdet); #endif } else { /* Calculate required part of inverse matrix */ binvdet = 1.0 / bdet; binvdir2x = bdir1y * binvdet; binvdir2y = - bdir2y * binvdet; /**/ binvdir1x = - bdir1x * binvdet; binvdir1y = bdir2x * binvdet; /**/ /* Calculate coefficient that describes intersection */ bmu = (binvdir2x * (bloc1x - bloc2x)) + (binvdir1x * (bloc1y - bloc2y)); bnu = (binvdir2y * (bloc1x - bloc2x)) + (binvdir1y * (bloc1y - bloc2y)); /**/ /* Calculate B' */ pbxs = bloc2x + (bmu * bdir2x); pbys = bloc2y + (bmu * bdir2y); } /* Compute two lines whose intersection will define point C' */ cloc1x = (4.0 * (nx + p6x) - (2 * pdxs) + paxs) / 3.0; cloc1y = (4.0 * (ny + p6y) - (2 * pdys) + pays) / 3.0; cdir1x = bdir1x; cdir1y = bdir1y; cloc2x = pdxs; cloc2y = pdys; cdir2x = pcx - pdx; cdir2y = pcy - pdy; cdet = (cdir2x * cdir1y) - (cdir2y * cdir1x); /* Life has shown, that the "reliability" of the determinant has to be ensured. Otherwise, serious distortions might be introduced. In order to ensure numerical stability, we do not only check whether the detrminant is about zero, but we also check whether the two partial expressions that are subtracted when computing the determinant are of about the same size. If this is the case, we explicitly reset the determinant and eventually compute this off-curve point based on the other off-curve point later. */ if ( (cdir2x != 0.0) && (cdir1y != 0.0) ) { dtmp = (cdir2y*cdir1x)/(cdir2x*cdir1y); if ( (DET_QUOTIENT_LOWER_THRESHOLD < dtmp) && (DET_QUOTIENT_UPPER_THRESHOLD > dtmp) ) { /* Determinant appears to be unreliable, reset it exactly to zero. */ cdet = 0.0; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " Warning: Determinant quotient check for cdet failed: dtmp=%16.16f, lower limit=%f, upper limit=%f.\n --> Determinant does not seem to be stable, resetting to zero.\n", dtmp, DET_QUOTIENT_LOWER_THRESHOLD, DET_QUOTIENT_UPPER_THRESHOLD); #endif } } else if ( (cdir2y != 0.0) && (cdir1x != 0.0) ) { dtmp = (cdir2x*cdir1y)/(cdir2y*cdir1x); if ( (DET_QUOTIENT_LOWER_THRESHOLD < dtmp) && (DET_QUOTIENT_UPPER_THRESHOLD > dtmp) ) { /* Determinant appears to be unreliable, reset it exactly to zero. */ cdet = 0.0; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " Warning: Determinant quotient check for cdet failed: dtmp=%16.16f, lower limit=%f, upper limit=%f.\n --> Determinant does not seem to be stable, resetting to zero.\n", dtmp, DET_QUOTIENT_LOWER_THRESHOLD, DET_QUOTIENT_UPPER_THRESHOLD); #endif } } #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " cloc1x=%f, cloc1y=%f, cloc2x,=%f cloc2y=%f\n", cloc1x, cloc1y, cloc2x, cloc2y); fprintf( stderr, " cdir1x=%f, cdir1y=%f, cdir2x,=%f cdir2y=%f\n", cdir1x, cdir1y, cdir2x, cdir2y); #endif /* Switch if determinant is zero; we then actually have a straight line */ if ( fabs( cdet) < 0.001 ) { pcxs = pcx + nx; pcys = pcy + ny; cmu = 0.0; cnu = 0.0; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " Warning: Determinant check for cdet failed: cdet=%16.16f. Computing Cs based on normal vector, resetting cmu, cnu.\n", cdet); #endif } else { /* Calculate required part of inverse matrix */ cinvdet = 1.0 / cdet; cinvdir2x = cdir1y * cinvdet; cinvdir2y = - cdir2y * cinvdet; /**/ cinvdir1x = - cdir1x * cinvdet; cinvdir1y = cdir2x * cinvdet; /**/ /* Calculate coefficient that describes intersection */ cmu = (cinvdir2x * (cloc1x - cloc2x)) + (cinvdir1x * (cloc1y - cloc2y)); cnu = (cinvdir2y * (cloc1x - cloc2x)) + (cinvdir1y * (cloc1y - cloc2y)); /**/ /* Calculate C' */ pcxs = cloc2x + (cmu * cdir2x); pcys = cloc2y + (cmu * cdir2y); } #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " bdet=%f, cdet=%f, bmu=%f, bnu=%f, cmu=%f, cnu=%f\n", bdet, cdet, bmu, bnu, cmu, cnu); #endif /* Analyse coefficients and decide on numerical stability. If suggesting, overwrite, using another relation. Here, we assume that at least the solution at *one* end of the curve is stable. */ if ( fabs(bmu) < 0.1 ) { pbxs = ((8 * (nx + p6x) - paxs - pdxs) / 3.0) - pcxs; pbys = ((8 * (ny + p6y) - pays - pdys) / 3.0) - pcys; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " Warning: Coefficient check for bmu failed: bmu=%16.16f. Computing Bs based on Cs.\n", bmu); #endif } if ( fabs(cmu) < 0.1 ) { pcxs = ((8 * (nx + p6x) - paxs - pdxs) / 3.0) - pbxs; pcys = ((8 * (ny + p6y) - pays - pdys) / 3.0) - pbys; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " Warning: Coefficient check for cmu failed: cmu=%16.16f. Computing Cs based on Bs.\n", cmu); #endif } /* Store the resulting displacement values in the ppoints-struct so they can be used for path construction. We use the "intersect" member because in this case nothing is related to "previous" or "next".*/ #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, " pbx=%f, pbxs=%f, bxshift=%f, pby=%f, pbys=%f, byshift=%f\n", pbx, pbxs, pbxs-pbx, pby, pbys, pbys-pby); fprintf( stderr, " pcx=%f, pcxs=%f, cxshift=%f, pcy=%f, pcys=%f, cyshift=%f\n", pcx, pcxs, pcxs-pcx, pcy, pcys, pcys-pcy); fprintf( stderr, " Summary: A =(%f,%f), B =(%f,%f), C =(%f,%f), D =(%f,%f)\n", pax, pay, pbx, pby, pcx, pcy, pdx, pdy); fprintf( stderr, " As=(%f,%f), Bs=(%f,%f), Cs=(%f,%f), Ds=(%f,%f)\n\n", paxs, pays, pbxs, pbys, pcxs, pcys, pdxs, pdys); #endif ppoints[currind].dxir = pbxs - pbx; ppoints[currind].dyir = pbys - pby; ppoints[currind+1].dxir = pcxs - pcx; ppoints[currind+1].dyir = pcys - pcy; return; } static void intersectRight( long index, double halfwidth, long flag) { double r2 = 0.0; double det = 0.0; double dxprev; double dyprev; double dxnext; double dynext; /* In order to determine the intersection between the two prolongations at the path point under consideration, we use the Hesse Normal Form, multiplied with r. dx * x + dy * y + r^2 = 0 Here, r is the distance from the origin, that is, from the path point under consideration. */ /* Check for start and ending of non-closed paths */ if ( flag == INTERSECT_PREVIOUS ) { ppoints[index].dxir = ppoints[index].dxpr; ppoints[index].dyir = ppoints[index].dypr; /* Correct shape to be "straight" at ending point! */ ppoints[index].shape = CURVE_STRAIGHT; return; } if ( flag == INTERSECT_NEXT ) { ppoints[index].dxir = ppoints[index].dxnr; ppoints[index].dyir = ppoints[index].dynr; /* Correct shape to be "straight" at starting point! */ ppoints[index].shape = CURVE_STRAIGHT; return; } /* OK, we actually compute an intersection */ dxprev = ppoints[index].dxpr; dyprev = ppoints[index].dypr; dxnext = ppoints[index].dxnr; dynext = ppoints[index].dynr; /* Compute distance square */ r2 = halfwidth * halfwidth; /* Check the determinant. If it is zero, the two lines are parallel and also must touch at atleast one location, so that there are an infinite number of solutions. In this case, we compute the average position and are done. */ if ( fabs( (det = ((dyprev * dxnext) - (dynext * dxprev))) ) < 0.00001 ) { ppoints[index].dxir = 0.5 * (dxprev + dxnext); ppoints[index].dyir = 0.5 * (dyprev + dynext); #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "intersectRight(0):\n dxprev=%f, dxnext=%f, dxres=%f,\n dyprev=%f, dynext=%f, dyres=%f,\n det=%16.16f\n", dxprev, dxnext, ppoints[index].dxir, dyprev, dynext, ppoints[index].dyir, det); fprintf( stderr, " --> Computation based on averaging [dxprev,dyprev] and [dxnext,dynext]\n"); fprintf( stderr, " Right intersection point shift: (%f,%f), absolute shift length: %f.\n\n", ppoints[index].dxir, ppoints[index].dyir, sqrt(ppoints[index].dxir*ppoints[index].dxir + ppoints[index].dyir*ppoints[index].dyir)); #endif return; } /* OK, there seems to be a unique solution, compute it */ if ( dxprev != 0.0 ) { ppoints[index].dyir = r2 * (dxnext - dxprev) / det; ppoints[index].dxir = (r2 - (dyprev * ppoints[index].dyir)) / dxprev; /* - ? */ #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "intersectRight(1):\n dxprev=%f, dxnext=%f, dxres=%f,\n dyprev=%f, dynext=%f, dyres=%f,\n det=%16.16f\n", dxprev, dxnext, ppoints[index].dxir, dyprev, dynext, ppoints[index].dyir, det); fprintf( stderr, " --> Computation based on previous path point.\n"); fprintf( stderr, " Right intersection point shift: (%f,%f), absolute shift length: %f.\n\n", ppoints[index].dxir, ppoints[index].dyir, sqrt(ppoints[index].dxir*ppoints[index].dxir + ppoints[index].dyir*ppoints[index].dyir)); #endif } else { ppoints[index].dyir = -r2 * (dxprev - dxnext) / det; ppoints[index].dxir = (r2 - (dynext * ppoints[index].dyir)) / dxnext; /* - ? */ #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "intersectRight(2):\n dxprev=%f, dxnext=%f, dxres=%f,\n dyprev=%f, dynext=%f, dyres=%f,\n det=%16.16f\n", dxprev, dxnext, ppoints[index].dxir, dyprev, dynext, ppoints[index].dyir, det); fprintf( stderr, " --> Computation based on next path point.\n"); fprintf( stderr, " Right intersection point shift: (%f,%f), absolute shift length: %f.\n\n", ppoints[index].dxir, ppoints[index].dyir, sqrt(ppoints[index].dxir*ppoints[index].dxir + ppoints[index].dyir*ppoints[index].dyir)); #endif } return; } /* linkNode(): Insert prolongation lines at nodes. */ static void linkNode( long index, int position, int orientation) { struct segment* B; double dx = 0.0; double dy = 0.0; if ( orientation == PATH_RIGHT ) { /* We are constructing the right hand side path */ if ( position == PATH_START ) { /* We are starting a new segment. Link from current point to ideally next-shifted point of segment. */ if ( ppoints[index].shape == CURVE_CONCAVE ) { /* prolongate from original curve point to ideally next-shifted point */ dx = ppoints[index].dxnr; dy = ppoints[index].dynr; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "RP: Concave at PP %ld. Prolongation from onCurve to ideal: (%f,%f)\n", index, dx, dy); #endif } else if ( ppoints[index].shape == CURVE_CONVEX ) { /* prolongate from intersecion point to ideally next-shifted point */ dx = ppoints[index].dxnr - ppoints[index].dxir; dy = ppoints[index].dynr - ppoints[index].dyir; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "RP: Convex at PP %ld. Prolongation from intersection to ideal: (%f,%f)\n", index, dx, dy); #endif } } else if ( position == PATH_END ) { /* We are ending the current segment. Link from ideally prev-shifted point to the appropriate ending point. */ if ( ppoints[index].shape == CURVE_CONCAVE ) { /* prolongate from ideally prev-shifted point to original curve point. */ dx = - ppoints[index].dxpr; dy = - ppoints[index].dypr; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "RP: Concave at PP %ld. Prolongation from ideal to onCurve: (%f,%f)\n", index, dx, dy); #endif } else if ( ppoints[index].shape == CURVE_CONVEX ) { /* prolongate from ideally prev-shifted point to intersection point. */ dx = ppoints[index].dxir - ppoints[index].dxpr; dy = ppoints[index].dyir - ppoints[index].dypr; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "RP: Convex at PP %ld. Prolongation from ideal to intersection: (%f,%f)\n", index, dx, dy); #endif } } /* if ( PATH_END ) */ } /* if ( PATH_RIGHT ) */ else if ( orientation == PATH_LEFT ) { /* We are constructing the left hand side path. Some notions have to be reverted (e.g. concavity vs. convexity and next vs. previous)! */ if ( position == PATH_START ) { /* We are starting a new segment. Link from current point to ideally next-shifted point of segment. */ if ( ppoints[index].shape == CURVE_CONVEX ) { /* prolongate from original curve point to ideally next-shifted point. Remember: next --> prev! */ dx = - (ppoints[index].dxpr); dy = - (ppoints[index].dypr); #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "LP: Concave at PP %ld. Prolongation from onCurve to ideal: (%f,%f)\n", index, dx, dy); #endif } else if ( ppoints[index].shape == CURVE_CONCAVE ) { /* prolongate from intersecion point to ideally next-shifted point */ dx = - (ppoints[index].dxpr - ppoints[index].dxir); dy = - (ppoints[index].dypr - ppoints[index].dyir); #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "LP: Convex at PP %ld. Prolongation from intersection to ideal: (%f,%f)\n", index, dx, dy); #endif } }/* if ( PATH_START ) */ else if ( position == PATH_END ) { /* We are ending the current segment. Link from ideally prev-shifted point to the appropriate ending point. */ if ( ppoints[index].shape == CURVE_CONVEX ) { /* prolongate from ideally prev-shifted point to original curve point. */ dx = ppoints[index].dxnr; dy = ppoints[index].dynr; #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "LP: Concave at PP %ld. Prolongation from ideal to onCurve: (%f,%f)\n", index, dx, dy); #endif } else if ( ppoints[index].shape == CURVE_CONCAVE ) { /* prolongate from ideally prev-shifted point to intersection point. */ dx = - (ppoints[index].dxir - ppoints[index].dxnr); dy = - (ppoints[index].dyir - ppoints[index].dynr); #ifdef DEBUG_OUTLINE_SURROUNDING fprintf( stderr, "LP: Convex at PP %ld. Prolongation from ideal to intersection: (%f,%f)\n", index, dx, dy); #endif } } /* if ( PATH_END ) */ } /* if ( PATH_LEFT ) */ if ( (dx != 0.0) || (dy != 0.0) ) { #ifdef DUMPDEBUGPATH if ( psfile != NULL ) fprintf( psfile, "%f %f t1sprolongate %% pindex = %ld\n", dx*up, dy*up, index); #endif B = Loc( CharSpace, dx, dy); path = Join(path, Line(B)); } return; } int T1int_Type1QuerySEAC( unsigned char* base, unsigned char* accent) { if ( isseac == 0 ) { return 0; } *base = seacbase; *accent = seacaccent; return isseac; } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/regions.c0000664000175000017500000016521011742726711023142 0ustar uwabamiuwabami/* $XConsortium: regions.c,v 1.4 91/10/10 11:18:57 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* REGIONS CWEB V0023 LOTS */ /* :h1 id=regions.REGIONS Module - Regions Operator Handler This module is responsible for creating and manipulating regions. &author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) :h3.Include Files The included files are: */ #include #include #include "types.h" #include "objects.h" #include "spaces.h" #include "paths.h" #include "regions.h" #include "curves.h" #include "lines.h" #include "pictures.h" #include "fonts.h" #include "hints.h" #include "strokes.h" /* to pick up 'DoStroke' */ static int Unwind(); static int newfilledge(); static struct edgelist *splitedge(); static int vertjoin(); static int touches(); static int crosses(); static int edgemin(); static int edgemax(); static int discard(); static int edgecheck(); static struct edgelist *NewEdge(); struct edgelist *swathxsort(); /* 'SortSwath' function */ extern struct XYspace *IDENTITY; /* :h3.Functions Provided to the TYPE1IMAGER User This module provides the following TYPE1IMAGER entry points: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Functions Provided to Other Modules This module provides the following entry points to other modules: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Macros Provided to Other Modules :h4.GOING_TO() - Macro Predicate Needed for Changing Direction, Etc. The actual generation of run end lists (edge boundaries) is left to the low level rasterizing modules, LINES and CURVES. There are some global region-type questions that occur when doing a low-level rasterization: :ol. :li.Did we just change direction in Y and therefore need to start a new edge? :li.Did we run out of allocated edge space? :li.Do the minimum or maximum X values for the current edge need updating? :eol. In general the REGIONS is not smart enough to answer those questions itself. (For example, determining if and when a curve changes direction may need detailed curve knowledge.) Yet, this must be done efficiently. We provide a macro "GOING_TO" where the invoker tells us where it is heading for (x2,y2), plus where it is now (x1,y1), plus the current region under construction, and the macro answers the questions above. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h2.Data Structures Used to Represent Regions :h3.The "region" Structure The region structure is an anchor for a linked list of "edgelist" structures (see :hdref refid=edgelist..). It also summarizes the information in the edgelist structures (for example, the bounding box of the region). And, it contains scratch areas used during the creation of a region. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* The ISOPTIMIZED flag tells us if we've put a permanent region in 'optimal' form. */ #define ISOPTIMIZED(flag) ((flag)&0x10) /* The ISRECTANGULAR flag tells us if a region is a rectangle. We don't always notice rectangles--if this flag is set, the region definitely is a rectangle, but some rectangular regions will not have the flag set. The flag is used to optimize some paths. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h4."INFINITY" - A Constant Region Structure of Infinite Extent Infinity is the complement of a null area: Note - removed the refcount = 1 init, replaced with references = 2 3-26-91 PNM */ static struct region infinity = { REGIONTYPE, ISCOMPLEMENT(ON)+ISINFINITE(ON)+ISPERMANENT(ON)+ISIMMORTAL(ON), 2, {0, 0}, {0, 0}, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, 0, NULL, NULL }; /* we rename INFINITY to T1_INFINITY. Anyhow it is currently not used */ struct region *T1_INFINITY = &infinity; /* :h4."EmptyRegion" - A Region Structure with Zero Area This structure is used to initialize the region to be built in Interior(): Note - replaced refcount = 1 init with references = 2 3-26-91 PNM */ /*SHARED LINE(S) ORIGINATED HERE*/ struct region EmptyRegion = { REGIONTYPE, ISPERMANENT(ON)+ISIMMORTAL(ON), 2, {0, 0}, {0, 0}, MAXPEL, MAXPEL, MINPEL, MINPEL, NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, 0, NULL, NULL }; /* :h3 id=edgelist.The "edgelist" Structure Regions are represented by a linked list of 'edgelist' structures. When a region is complete, the structures are paired, one for the left and one for the right edge. While a region is being built, this rule may be violated temporarily. An 'edgelist' structure contains the X values for a given span of Y values. The (X,Y) pairs define an edge. We use the crack and edge coordinate system, so that integer values of X and Y go between pels. The edge is defined between the minimum Y and maximum Y. The linked list is kept sorted from top to bottom, that is, in increasing y. Also, if 'e1' is an edgelist structure and 'e2' is the next one in the list, they must have exactly the same ymin,ymax values or be totally disjoint. These two requirements mean that if e2's ymin is less than e1's ymax, it must be exactly equal to e1's ymin. A sublist of structures with identical ymin and ymax values is called a 'swath'. In addition, edgelist structures are separately linked together based on what subpath originally created them; each subpath is kept as a separate circular linked list. This information is ignored unless continuity checking is invoked. See :hdref refid=subpath. for a complete description of this. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* The "edgelist" structure follows the convention of TYPE1IMAGER user objects, having a type field and a flag field as the first two elements. However, the user never sees "edgelist" structures directly; he is given handles to "region" structures only. By having a type field, we can use the "copy" feature of Allocate() to duplicate edge lists quickly. We also define two flag bits for this structure. The ISDOWN bit is set if the edge is going in the direction of increasing Y. The ISAMBIGUOUS bit is set if the edge is identical to its neighbor (edge->link); such edges may be "left" when they should be "right", or vice versa, unnecessarily confusing the continuity checking logic. The FixSubPaths() routine in HINTS will swap ambiguous edges if that avoids crossing edges; see :hdref refid=fixsubp.. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.KillRegion() - Destroys a Region KillRegion nominally just decrements the reference count to that region. If the reference count becomes 0, all memory associated with it is freed. We just follow the linked list, freeing as we go, then kill any associated (thresholded) picture. Note - added conditional return based on references 3-26-91 PNM */ void KillRegion(area) register struct region *area; /* area to free */ { register struct edgelist *p; /* loop variable */ register struct edgelist *next; /* loop variable */ if (area->references < 0) abort("KillRegion: negative reference count", 28); if ( (--(area->references) > 1) || ( (area->references == 1) && !ISPERMANENT(area->flag) ) ) return; for (p=area->anchor; p != NULL; p=next) { next = p->link; Free(p); } /* KillPicture-macro removed from sources (RMz, 2001-04-01) if (area->thresholded != NULL) KillPicture(area->thresholded); */ Free(area); } /* :h3.CopyRegion() - Makes a Copy of a Region */ struct region *CopyRegion(area) register struct region *area; /* region to duplicate */ { register struct region *r; /* output region built here */ register struct edgelist *last=NULL; /* loop variable */ register struct edgelist *p,*newp; /* loop variables */ r = (struct region *)Allocate(sizeof(struct region), area, 0); r->anchor = NULL; for (p=area->anchor; VALIDEDGE(p); p=p->link) { newp = NewEdge(p->xmin, p->xmax, p->ymin, p->ymax, p->xvalues, ISDOWN(p->flag)); newp->fpx1 = p->fpx1; newp->fpx2 = p->fpx2; newp->fpy1 = p->fpy1; newp->fpy2 = p->fpy2; if (r->anchor == NULL) r->anchor = last = newp; else last->link = newp; last = newp; } if (area->thresholded != NULL) /* replaced DupPicture with Dup() 3-26-91 PNM */ r->thresholded = (struct picture *)Dup(area->thresholded); return(r); } /* :h4.NewEdge() - Allocates and Returns a New "edgelist" Structure We allocate space for the X values contiguously with the 'edgelist' structure that locates them. That way, we only have to free the edgelist structure to free all memory associated with it. Damn clever, huh? */ static struct edgelist *NewEdge(xmin, xmax, ymin, ymax, xvalues, isdown) pel xmin,xmax; /* X extent of edge */ pel ymin,ymax; /* Y extent of edge */ pel *xvalues; /* list of X values for entire edge */ int isdown; /* flag: TRUE means edge progresses downward */ { static struct edgelist template = { EDGETYPE, 0, 1, NULL, NULL, 0, 0, 0, 0, NULL }; register struct edgelist *r; /* returned structure */ register int iy; /* ymin adjusted for 'long' alignment purposes */ IfTrace2((RegionDebug),"....new edge: ymin=%d, ymax=%d ", (LONG)ymin, (LONG) ymax); if (ymin >= ymax) abort("newedge: height not positive", 29); /* We are going to copy the xvalues into a newly allocated area. It helps performance if the values are all "long" aligned. We can test if the xvalues are long aligned by ANDing the address with the (sizeof(long) - 1)--if non zero, the xvalues are not aligned well. We set 'iy' to the ymin value that would give us good alignment: */ iy = ymin - (((unsigned long) xvalues) & (sizeof(LONG) - 1)) / sizeof(pel); r = (struct edgelist *)Allocate(sizeof(struct edgelist), &template, (ymax - iy) * sizeof(pel)); if (isdown) r->flag = ISDOWN(ON); r->xmin = xmin; r->xmax = xmax; r->ymin = ymin; r->ymax = ymax; r->xvalues = (pel *) FOLLOWING(r); if (ymin != iy) { r->xvalues += ymin - iy; xvalues -= ymin - iy; } /* We must round up (ymax - iy) so we get the ceiling of the number of longs. The destination must be able to hold these extra bytes because Allocate() makes everything it allocates be in multiples of longs. */ LONGCOPY(&r[1], xvalues, (ymax - iy) * sizeof(pel) + sizeof(LONG) - 1); IfTrace1((RegionDebug),"result=%p\n", r); return(r); } /* :h2.Building Regions :h3.Interior() - Iterate Through a Path, Building a Region This routine is the workhorse driver routine that iterates through a path, calling the appropriate stepping routines to actually produce the run end "edgelist" structures. :ol. :li."Interior" calls StepLine or StepConic or StepBezier as appropriate to produce run ends. :li.Occasionally these routines will notice a change in Y direction and will call ChangeDirection (through the GOING_TO macro); this is a call back to the REGIONS module. :li.ChangeDirection will call whatever function is in the region structure; for Interior, this function is 'newfilledge'. :li.Newfilledge will call NewEdge to create a new edgelist structure, then, call SortSwath to sort it onto the linked list being built at the region "anchor". :eol. By making the function called by ChangeDirection be a parameter of the region, we allow the same ChangeDirection logic to be used by stroking. */ /*SHARED LINE(S) ORIGINATED HERE*/ struct region *Interior(p, fillrule) register struct segment *p; /* take interior of this path */ register int fillrule; /* rule to follow if path crosses itself */ { register fractpel x,y; /* keeps ending point of path segment */ fractpel lastx,lasty; /* previous x,y from path segment before */ register struct region *R; /* region I will build */ register struct segment *nextP; /* next segment of path */ char tempflag; /* flag; is path temporary? */ char Cflag; /* flag; should we apply continuity? */ IfTrace2((MustTraceCalls),". INTERIOR(%p, %d)\n", p, (LONG) fillrule); if (p == NULL) return(NULL); /* Establish the 'Cflag' continuity flag based on user's fill rule and our own 'Continuity' pragmatic (0: never do continuity, 1: do what user asked, >1: do it regardless). */ if (fillrule > 0) { Cflag = Continuity > 0; fillrule -= CONTINUITY; } else Cflag = Continuity > 1; ARGCHECK((fillrule != WINDINGRULE && fillrule != EVENODDRULE), "Interior: bad fill rule", NULL, NULL, (1,p), struct region *); if (p->type == TEXTTYPE) /* if (fillrule != EVENODDRULE) else */ return((struct region *)UniquePath(p)); if (p->type == STROKEPATHTYPE){ if (fillrule == WINDINGRULE) return((struct region *)DoStroke(p)); else p = CoercePath(p); } R = (struct region *)Allocate(sizeof(struct region), &EmptyRegion, 0); ARGCHECK(!ISPATHANCHOR(p), "Interior: bad path", p, R, (0), struct region *); ARGCHECK((p->type != MOVETYPE), "Interior: path not closed", p, R, (0), struct region *); /* changed definition from !ISPERMANENT to references <= 1 3-26-91 PNM */ tempflag = (p->references <= 1); /* only first segment in path is so marked */ if (!ISPERMANENT(p->flag)) p->references -= 1; R->newedgefcn = newfilledge; /* Believe it or not, "R" is now completely initialized. We are counting on the copy of template to get other fields the way we want them, namely :ol. :li.anchor = NULL :li.xmin, ymin, xmax, ymax, to minimum and maximum values respectively. :eol. Anchor = NULL is very important to ChangeDirection. See :hdref refid=CD.. To minimize problems of "wrapping" in our pel arithmetic, we keep an origin of the region which is the first move. Hopefully, that keeps numbers within plus or minus 32K pels. */ R->origin.x = 0/*TOFRACTPEL(NEARESTPEL(p->dest.x))*/; R->origin.y = 0/*TOFRACTPEL(NEARESTPEL(p->dest.y))*/; lastx = - R->origin.x; lasty = - R->origin.y; /* ChangeDirection initializes other important fields in R, such as lastdy, edge, edgeYstop, edgexmin, and edgexmax. The first segment is a MOVETYPE, so it will be called first. */ /* Note: Hinting is completely performed in charspace coordinates in the Type 1 module. Therefore, I have removed the code to handle hint segments. (2002-08-11) */ while (p != NULL) { x = lastx + p->dest.x; y = lasty + p->dest.y; nextP = p->link; switch(p->type) { case LINETYPE: StepLine(R, lastx, lasty, x, y); break; case CONICTYPE: /* 2nd order Beziers not implemented! */ break; case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) p; StepBezier(R, lastx, lasty, lastx + bp->B.x, lasty + bp->B.y, lastx + bp->C.x, lasty + bp->C.y, x, y); } break; case MOVETYPE: /* At this point we have encountered a MOVE segment. This breaks the path, making it disjoint. */ if (p->last == NULL) /* i.e., not first in path */ ChangeDirection(CD_LAST, R, lastx, lasty, (fractpel) 0, (fractpel) 0, (fractpel) 0); ChangeDirection(CD_FIRST, R, x, y, (fractpel) 0, (fractpel) 0, (fractpel) 0); /* We'll just double check for closure here. We forgive an appended MOVETYPE at the end of the path, if it isn't closed: */ if (!ISCLOSED(p->flag) && p->link != NULL) return((struct region *)ArgErr("Fill: sub-path not closed", p, NULL)); break; default: abort("Interior: path type error", 30); } /* We're done with this segment. Advance to the next path segment in the list, freeing this one if necessary: */ lastx = x; lasty = y; if (tempflag) Free(p); p = nextP; } ChangeDirection(CD_LAST, R, lastx, lasty, (fractpel) 0, (fractpel) 0, (fractpel) 0); R->ending.x = lastx; R->ending.y = lasty; /* Finally, clean up the region's based on the user's 'fillrule' request: */ if (Cflag) ApplyContinuity(R); if (fillrule == WINDINGRULE) Unwind(R->anchor); return R; } /* :h4.Unwind() - Discards Edges That Fail the Winding Rule Test The winding rule says that upward going edges should be paired with downward going edges only, and vice versa. So, if two upward edges or two downward edges are nominally left/right pairs, Unwind() should discard the second one. Everything should balance; we should discard an even number of edges; of course, we abort if we don't. */ static int Unwind(area) register struct edgelist *area; /* input area modified in place */ { register struct edgelist *last=NULL,*next; /* struct before and after current one */ register int y; /* ymin of current swath */ register int count,newcount; /* winding count registers */ IfTrace1((RegionDebug>0),"...Unwind(%p)\n", area); while (VALIDEDGE(area)) { count = 0; y = area->ymin; do { next = area->link; if (ISDOWN(area->flag)) newcount = count + 1; else newcount = count - 1; if (count == 0 || newcount == 0) last = area; else discard(last, next); count = newcount; area = next; } while (area != NULL && area->ymin == y); if (count != 0) abort("Unwind: uneven edges", 31); } /* We retunr a value for ANSI-C-compiler */ return(0); } /* :h3."workedge" Array This is a statically allocated array where edges are built before being copied into more permanent storage by NewEdge(). */ #ifndef MAXEDGE #define MAXEDGE 1000 #endif static pel workedge[MAXEDGE]; static pel *currentworkarea = workedge; static pel currentsize = MAXEDGE; /* :h3 id=cd.ChangeDirection() - Called When Y Direction Changes The rasterizing routines call this entry point when they detect a change in Y. We then build the current edge and sort it into emerging edgelist at 'anchor' by calling whatever "newedgefcn" is appropriate. */ void ChangeDirection(type, R, x, y, dy, x2, y2) int type; /* CD_FIRST, CD_CONTINUE, or CD_LAST */ register struct region *R; /* region in which we are changing direction */ fractpel x,y; /* current beginning x,y */ fractpel dy; /* direction and magnitude of change in y */ { register fractpel ymin,ymax; /* minimum and maximum Y since last call */ register fractpel x_at_ymin,x_at_ymax; /* their respective X's */ register pel iy; /* nearest integer pel to 'y' */ register pel idy; /* nearest integer pel to 'dy' */ register int ydiff; /* allowed Y difference in 'currentworkarea' */ IfTrace4((RegionDebug>0),"Change Y direction (%d) from (%d,%d), dy=%d\n", (LONG) type, x, y, dy); if (type != CD_FIRST) { if (R->lastdy > 0) { ymin = R->firsty; x_at_ymin = R->firstx; ymax = y; x_at_ymax = x; } else { ymin = y; x_at_ymin = x; ymax = R->firsty; x_at_ymax = R->firstx; } if (ymax < ymin) abort("negative sized edge?", 32); (*R->newedgefcn)(R, R->edgexmin, R->edgexmax, ymin, ymax, R->lastdy > 0, x_at_ymin, x_at_ymax, x, y, x2, y2); } R->firsty = y; R->firstx = x; R->lastdy = dy; iy = NEARESTPEL(y); idy = NEARESTPEL(dy); if (currentworkarea != workedge && idy < MAXEDGE && idy > -MAXEDGE) { NonObjectFree(currentworkarea); currentworkarea = workedge; currentsize = MAXEDGE; } ydiff = currentsize - 1; if (dy > 0) { R->edge = ¤tworkarea[-iy]; R->edgeYstop = TOFRACTPEL(ydiff + iy) + FPHALF; } else { R->edge = ¤tworkarea[ydiff - iy]; R->edgeYstop = TOFRACTPEL(iy - ydiff) - FPHALF; } R->edgexmax = R->edgexmin = x; /* If this is the end of a subpath, we complete the subpath circular chain: */ if (type == CD_LAST && R->lastedge != NULL) { register struct edgelist *e = R->firstedge; while (e->subpath != NULL) e = e->subpath; e->subpath = R->lastedge; R->lastedge = R->firstedge = NULL; } } /* :h3 id=newfill.newfilledge() - Called When We Have a New Edge While Filling This is the prototypical "newedge" function passed to "Rasterize" and stored in "newedgefcn" in the region being built. If the edge is non-null, we sort it onto the list of edges we are building at "anchor". This function also has to keep the bounding box of the region up to date. */ static int newfilledge(R, xmin, xmax, ymin, ymax, isdown, x1, y1, x2, y2) register struct region *R; /* region being built */ fractpel xmin,xmax; /* X range of this edge */ fractpel ymin,ymax; /* Y range of this edge */ int isdown; /* flag: TRUE means edge goes down, else up */ fractpel x1; fractpel y1; fractpel x2; fractpel y2; { register pel pelxmin,pelymin,pelxmax,pelymax; /* pel versions of bounds */ register struct edgelist *edge; /* newly created edge */ pelymin = NEARESTPEL(ymin); pelymax = NEARESTPEL(ymax); if (pelymin == pelymax) return(0); pelxmin = NEARESTPEL(xmin); pelxmax = NEARESTPEL(xmax); if (pelxmin < R->xmin) R->xmin = pelxmin; if (pelxmax > R->xmax) R->xmax = pelxmax; if (pelymin < R->ymin) R->ymin = pelymin; if (pelymax > R->ymax) R->ymax = pelymax; edge = NewEdge(pelxmin, pelxmax, pelymin, pelymax, &R->edge[pelymin], isdown); /* Save maximum and minimum values of edge in order to be able to use them in ApplyContinity. */ edge->fpx1 = x1; edge->fpy1 = y1; edge->fpx2 = x2; edge->fpy2 = y2; edge->subpath = R->lastedge; R->lastedge = edge; if (R->firstedge == NULL) R->firstedge = edge; R->anchor = SortSwath(R->anchor, edge, swathxsort); /* { struct region* r = (struct region*) R; struct edgelist* el = (struct edgelist*) (r->anchor); while ( el != 0 ) { long i = 0; short int* spl; short int* spr; int xl; int xr; printf( "Region after Sort (NE=%ld) : ymin=%d, ymax=%d, xmin=%d, xmax=%d\n", callcount, el->ymin, el->ymax, el->xmin, el->xmax); for ( i=0; i<((el->ymax)-(el->ymin)); i++ ) { spl = el->xvalues; if ( el->link != NULL ) { spr = el->link->xvalues; xl = spl[i]; xr = spr[i]; printf( "Region after Sort (NE=%ld): y=%ld xleft=%d, xright=%d\n", callcount, el->ymin + i, xl, xr); } else { printf( "Region after Sort (NE=%ld): y=%ld xval=%d\n", callcount, el->ymin + i, spl[i]); } } if ( el->link != 0 ) el = el->link->link; else break; } } ++callcount; */ return 0; } /* :h2.Sorting Edges :h3.SortSwath() - Vertically Sort an Edge into a Region This routine sorts an edge or a pair of edges into a growing region, so that the region maintains its top-to-bottom, left-to-right form. The rules for sorting horizontally may vary depending on what you are doing, but the rules for vertical sorting are always the same. This routine is passed an argument that is a function that will perform the horizontal sort on demand (for example, swathxsort() or SwathUnion()). This is a recursive routine. A new edge (or edge pair) may overlap the list I am building in strange and wonderful ways. Edges may cross. When this happens, my strategy is to split the incoming edge (or the growing list) in two at that point, execute the actual sort on the top part of the split, and recursively call myself to figure out exactly where the bottom part belongs. */ #define TOP(e) ((e)->ymin) /* the top of an edge (for readability */ #define BOTTOM(e) ((e)->ymax) /* the bottom of an edge (for readability */ struct edgelist *SortSwath(anchor, edge, swathfcn) struct edgelist *anchor; /* list being built */ register struct edgelist *edge; /* incoming edge or pair of edges */ struct edgelist *(*swathfcn)(); /* horizontal sorter */ { register struct edgelist *before,*after; struct edgelist base; if (RegionDebug > 0) { if (RegionDebug > 2) { IfTrace3(TRUE,"SortSwath(anchor=%p, edge=%p, fcn=%p)\n", anchor, edge, swathfcn); } else { IfTrace3(TRUE,"SortSwath(anchor=%p, edge=%p, fcn=%p)\n", anchor, edge, swathfcn); } } if (anchor == NULL) return(edge); before = &base; before->ymin = before->ymax = MINPEL; before->link = after = anchor; /* If the incoming edge is above the current list, we connect the current list to the bottom of the incoming edge. One slight complication is if the incoming edge overlaps into the current list. Then, we first split the incoming edge in two at the point of overlap and recursively call ourselves to sort the bottom of the split into the current list: */ if (TOP(edge) < TOP(after)) { if (BOTTOM(edge) > TOP(after)) { after = SortSwath(after, splitedge(edge, TOP(after)), swathfcn); } vertjoin(edge, after); return(edge); } /* At this point the top of edge is not higher than the top of the list, which we keep in 'after'. We move the 'after' point down the list, until the top of the edge occurs in the swath beginning with 'after'. If the bottom of 'after' is below the bottom of the edge, we have to split the 'after' swath into two parts, at the bottom of the edge. If the bottom of 'after' is above the bottom of the swath, */ while (VALIDEDGE(after)) { if (TOP(after) == TOP(edge)) { if (BOTTOM(after) > BOTTOM(edge)) vertjoin(after, splitedge(after, BOTTOM(edge))); else if (BOTTOM(after) < BOTTOM(edge)) { after = SortSwath(after, splitedge(edge, BOTTOM(after)), swathfcn); } break; } else if (TOP(after) > TOP(edge)) { IfTrace0((BOTTOM(edge) < TOP(after) && RegionDebug > 0), "SortSwath: disjoint edges\n"); if (BOTTOM(edge) > TOP(after)) { after = SortSwath(after, splitedge(edge, TOP(after)), swathfcn); } break; } else if (BOTTOM(after) > TOP(edge)) vertjoin(after, splitedge(after, TOP(edge))); before = after; after = after->link; } /* At this point 'edge' exactly corresponds in height to the current swath pointed to by 'after'. */ if (after != NULL && TOP(after) == TOP(edge)) { before = (*swathfcn)(before, edge); after = before->link; } /* At this point 'after' contains all the edges after 'edge', and 'before' contains all the edges before. Whew! A simple matter now of adding 'edge' to the linked list in its rightful place: */ before->link = edge; if (RegionDebug > 1) { IfTrace3(TRUE,"SortSwath: in between %p and %p are %p", before, after, edge); while (edge->link != NULL) { edge = edge->link; IfTrace1(TRUE," and %p", edge); } IfTrace0(TRUE,"\n"); } else for (; edge->link != NULL; edge = edge->link) { ; } edge->link = after; return base.link; } /* :h3.splitedge() - Split an Edge or Swath in Two at a Given Y Value This function returns the edge or swath beginning at the Y value, and is guaranteed not to change the address of the old swath while splitting it. */ static struct edgelist *splitedge(list, y) struct edgelist *list; /* area to split */ register pel y; /* Y value to split list at */ { register struct edgelist *new; /* anchor for newly built list */ register struct edgelist *last=NULL; /* end of newly built list */ register struct edgelist *r; /* temp pointer to new structure */ register struct edgelist *lastlist; /* temp pointer to last 'list' value */ IfTrace2((RegionDebug > 1),"splitedge of %p at %d ", list, (LONG) y); lastlist = new = NULL; while (list != NULL) { if (y < list->ymin) break; if (y >= list->ymax) abort("splitedge: above top of list", 33); if (y == list->ymin) abort("splitedge: would be null", 34); r = (struct edgelist *)Allocate(sizeof(struct edgelist), list, 0); /* At this point 'r' points to a copy of the single structure at 'list'. We will make 'r' be the new split 'edgelist'--the lower half. We don't bother to correct 'xmin' and 'xmax', we'll take the the pessimistic answer that results from using the old values. */ r->ymin = y; r->xvalues = list->xvalues + (y - list->ymin); /* Update the fpx values so that ApplyContinuity() will continue to work. Note that high precision is a fake, here! */ r->fpx1 = (r->xvalues[0]) << FRACTBITS; r->fpx2 = (list->xvalues[list->ymax - list->ymin - 1]) << FRACTBITS; list->fpx2 = (list->xvalues[y - list->ymin -1]) << FRACTBITS; /* Note that we do not need to allocate new memory for the X values, they can remain with the old "edgelist" structure. We do have to update that old structure so it is not as high: */ list->ymax = y; /* Insert 'r' in the subpath chain: */ r->subpath = list->subpath; list->subpath = r; /* Now attach 'r' to the list we are building at 'new', and advance 'list' to point to the next element in the old list: */ if (new == NULL) { new = r; } else last->link = r; last = r; lastlist = list; list = list->link; } /* At this point we have a new list built at 'new'. We break the old list at 'lastlist', and add the broken off part to the end of 'new'. Then, we return the caller a pointer to 'new': */ if (new == NULL) abort("null splitedge", 35); lastlist->link = NULL; last->link = list; IfTrace1((RegionDebug > 1),"yields %p\n", new); return(new); } /* :h3.vertjoin() - Join Two Disjoint Edge Lists Vertically The two edges must be disjoint vertically. */ static int vertjoin(top, bottom) register struct edgelist *top; /* uppermost region */ register struct edgelist *bottom; /* bottommost region */ { if (BOTTOM(top) > TOP(bottom)) abort("vertjoin not disjoint", 36); for (; top->link != NULL; top=top->link) { ; } top->link = bottom; return(0); } /* :h3.swathxsort() - Sorting by X Values We need to sort 'edge' into its rightful place in the swath by X value, taking care that we do not accidentally advance to the next swath while searching for the correct X value. Like all swath functions, this function returns a pointer to the edge BEFORE the given edge in the sort. */ struct edgelist *swathxsort(before0, edge) register struct edgelist *before0; /* edge before this swath */ register struct edgelist *edge; /* input edge */ { register struct edgelist *before; register struct edgelist *after; register pel y=0; before = before0; after = before->link; while (after != NULL && TOP(after) == TOP(edge)) { register pel *x1,*x2; y = TOP(edge); x1 = after->xvalues; x2 = edge->xvalues; while (y < BOTTOM(edge) && *x1 == *x2) { x1++; x2++; y++; } if (y >= BOTTOM(edge)) { edge->flag |= ISAMBIGUOUS(ON); after->flag |= ISAMBIGUOUS(ON); break; } if (*x1 >= *x2) break; before = after; after = after->link; } /* At this point, 'edge' is between 'before' and 'after'. If 'edge' didn't cross either of those other edges, we would be done. We check for crossing. If it does cross, we split the problem up by calling SortSwath recursively with the part of the edge that is below the crossing point: */ { register int h0,h; /* height of edge--number of scans */ h0 = h = BOTTOM(edge) - y; y -= TOP(edge); if (h0 <= 0) { IfTrace0((RegionDebug>0),"swathxsort: exactly equal edges\n"); return(before); } if (TOP(before) == TOP(edge)) h -= crosses(h, &before->xvalues[y], &edge->xvalues[y]); if (after != NULL && TOP(after) == TOP(edge)) h -= crosses(h, &edge->xvalues[y], &after->xvalues[y]); if (h < h0) { SortSwath(before0->link, splitedge(edge, TOP(edge) + y + h), swathxsort); } } return(before); } /* :h3.SwathUnion() - Union Two Edges by X Value We have a left and right edge that must be unioned into a growing swath. If they are totally disjoint, they are just added in. The fun comes in they overlap the existing edges. Then some edges will disappear. */ struct edgelist *SwathUnion(before0, edge) register struct edgelist *before0; /* edge before the swath */ register struct edgelist *edge; /* list of two edges to be unioned */ { register int h; /* saves height of edge */ register struct edgelist *rightedge; /* saves right edge of 'edge' */ register struct edgelist *before,*after; /* edge before and after */ int h0; /* saves initial height */ IfTrace2((RegionDebug > 1),"SwathUnion entered, before=%p, edge=%p\n", before0, edge); h0 = h = edge->ymax - edge->ymin; if (h <= 0) abort("SwathUnion: 0 height swath?", 37); before = before0; after = before->link; while (after != NULL && TOP(after) == TOP(edge)) { register struct edgelist *right; right = after->link; if (right->xvalues[0] >= edge->xvalues[0]) break; before = right; after = before->link; } /* This is the picture at this point. 'L' indicates a left hand edge, 'R' indicates the right hand edge. '<--->' indicates the degree of uncertainty as to its placement relative to other edges: :xmp atomic. before after R <---L----> R L R L R <---L---> <------R--------------------------> edge :exmp. In case the left of 'edge' touches 'before', we need to reduce the height by that amount. */ if (TOP(before) == TOP(edge)) h -= touches(h, before->xvalues, edge->xvalues); rightedge = edge->link; if (after == NULL || TOP(after) != TOP(edge) || after->xvalues[0] > rightedge->xvalues[0]) { IfTrace2((RegionDebug > 1), "SwathUnion starts disjoint: before=%p after=%p\n", before, after); /* On this side of the the above 'if', the new edge is disjoint from the existing edges in the swath. This is the picture: :xmp atomic. before after R L R L R L R L R edge :exmp. We will verify it remains disjoint for the entire height. If the situation changes somewhere down the edge, we split the edge at that point and recursively call ourselves (through 'SortSwath') to figure out the new situation: */ if (after != NULL && TOP(after) == TOP(edge)) h -= touches(h, rightedge->xvalues, after->xvalues); if (h < h0) SortSwath(before0->link, splitedge(edge, edge->ymin + h), t1_SwathUnion); /* go to "return" this edge pair; it is totally disjoint */ } else { /* At this point, at the 'else', we know that the new edge overlaps one or more pairs in the existing swath. Here is a picture of our knowledge and uncertainties: :xmp atomic. before after R L R L R L R <---L---> <---R-------------------> edge :exmp. We need to move 'after' along until it is to the right of the right of 'edge'. ('After' should always point to a left edge of a pair:) */ register struct edgelist *left; /* variable to keep left edge in */ do { left = after; after = (after->link)->link; } while (after != NULL && TOP(after) == TOP(edge) && after->xvalues[0] <= rightedge->xvalues[0]); /* At this point this is the picture: :xmp atomic. before left after R L R L R L R <---L---> <---R---> edge :exmp. We need to verify that the situation stays like this all the way down the edge. Again, if the situation changes somewhere down the edge, we split the edge at that point and recursively call ourselves (through 'SortSwath') to figure out the new situation: */ h -= crosses(h, left->xvalues, rightedge->xvalues); h -= crosses(h, edge->xvalues, ((before->link)->link)->xvalues); if (after != NULL && TOP(after) == TOP(edge)) h -= touches(h, rightedge->xvalues, after->xvalues); IfTrace3((RegionDebug > 1), "SwathUnion is overlapped until %d: before=%p after=%p\n", (LONG) TOP(edge) + h, before, after); /* OK, if we touched either of our neighbors we need to split at that point and recursively sort the split edge onto the list. One tricky part is that when we recursively sort, 'after' will change if it was not in our current swath: */ if (h < h0) { SortSwath(before0->link, splitedge(edge, edge->ymin + h), t1_SwathUnion); if (after == NULL || TOP(after) != TOP(edge)) for (after = before0->link; TOP(after) == TOP(edge); after = after->link) { ; } } /* Now we need to augment 'edge' by the left and right of the overlapped swath, and to discard all edges between before and after, because they were overlapped and have been combined with the new incoming 'edge': */ edge->xmin = TYPE1_MIN(edge->xmin, (before->link)->xmin); edge->xmax = TYPE1_MIN(edge->xmax, (before->link)->xmax); edgemin(h, edge->xvalues, (before->link)->xvalues); rightedge->xmin = TYPE1_MAX(rightedge->xmin, (left->link)->xmin); rightedge->xmax = TYPE1_MAX(rightedge->xmax, (left->link)->xmax); edgemax(h, rightedge->xvalues, (left->link)->xvalues); discard(before, after); } return(before); } /* :h3.swathrightmost() - Simply Sorts New Edge to Rightmost of Swath Like all swath functions, this function returns a pointer to the edge BEFORE the given edge in the sort. */ struct edgelist *swathrightmost(before, edge) register struct edgelist *before; /* edge before this swath */ register struct edgelist *edge; /* input edge */ { register struct edgelist *after; after = before->link; while (after != NULL && TOP(after) == TOP(edge)) { before = after; after = after->link; } return(before); } /* :h3.touches() - Returns the Remaining Height When Two Edges Touch So, it will return 0 if they never touch. Allows incredibly(?) mnemonic if (touches(...)) construct. */ static int touches(h, left, right) register int h; register pel *left,*right; { for (; h > 0; h--) if (*left++ >= *right++) break; return(h); } /* :h3.crosses() - Returns the Remaining Height When Two Edges Cross So, it will return 0 if they never cross. */ static int crosses(h, left, right) register int h; register pel *left,*right; { for (; h > 0; h--) if (*left++ > *right++) break; return(h); } /* :h3.cedgemin() - Stores the Mininum of an Edge and an X Value */ static int cedgemin(h, e1, x) register int h; register pel *e1; register pel x; { for (; --h >= 0; e1++) if (*e1 > x) *e1 = x; return(0); } /* :h3.cedgemax() - Stores the Maximum of an Edge and an X Value */ static int cedgemax(h, e1, x) register int h; register pel *e1; register pel x; { for (; --h >= 0; e1++) if (*e1 < x) *e1 = x; return(0); } /* :h3.edgemin() - Stores the Mininum of Two Edges in First Edge */ static int edgemin(h, e1, e2) register int h; register pel *e1,*e2; { for (; --h >= 0; e1++,e2++) if (*e1 > *e2) *e1 = *e2; return(0); } /* :h3.edgemax() - Stores the Maximum of Two Edges in First Edge */ static int edgemax(h, e1, e2) register int h; register pel *e1,*e2; { for (; --h >= 0; e1++,e2++) if (*e1 < *e2) *e1 = *e2; return(0); } /* :h3 id=discard.discard() - Discard All Edges Between Two Edges At first glance it would seem that we could discard an edgelist structure merely by unlinking it from the list and freeing it. You are wrong, region-breath! For performance, the X values associated with an edge are allocated contiguously with it. So, we free the X values when we free a structure. However, once an edge has been split, we are no longer sure which control block actually is part of the memory block that contains the edges. Rather than trying to decide, we play it safe and never free part of a region. So, to mark a 'edgelist' structure as discarded, we move it to the end of the list and set ymin=ymax. */ static int discard(left, right) register struct edgelist *left,*right; /* all edges between here exclusive */ /* should be discarded */ { register struct edgelist *beg,*end,*p; IfTrace2((RegionDebug > 0),"discard: l=%p, r=%p\n", left, right); beg = left->link; if (beg == right) return(0); for (p = beg; p != right; p = p->link) { if (p->link == NULL && right != NULL) abort("discard(): ran off end", 38); IfTrace1((RegionDebug > 0),"discarding %p\n", p); p->ymin = p->ymax = 32767; end = p; } /* * now put the chain beg/end at the end of right, if it is not * already there: */ if (right != NULL) { left->link = right; while (right->link != NULL) right = right->link; right->link = beg; } end->link = NULL; return(0); } /* :h2.Changing the Representation of Regions For convenience and/or performance, we sometimes like to change the way regions are represented. This does not change the object itself, just the representation, so these transformations can be made on a permanent region. */ void MoveEdges(R, dx, dy) register struct region *R; /* region to modify */ register fractpel dx,dy; /* delta X and Y to move edge list by */ { register struct edgelist *edge; /* for looping through edges */ R->origin.x += dx; R->origin.y += dy; R->ending.x += dx; R->ending.y += dy; if (R->thresholded != NULL) { R->thresholded->origin.x -= dx; R->thresholded->origin.y -= dy; } /* From now on we will deal with dx and dy as integer pel values: */ dx = NEARESTPEL(dx); dy = NEARESTPEL(dy); if (dx == 0 && dy == 0) return; R->xmin += dx; R->xmax += dx; R->ymin += dy; R->ymax += dy; for (edge = R->anchor; VALIDEDGE(edge); edge = edge->link) { edge->ymin += dy; edge->ymax += dy; if (dx != 0) { register int h; /* loop index; height of edge */ register pel *Xp; /* loop pointer to X values */ edge->xmin += dx; edge->xmax += dx; for (Xp = edge->xvalues, h = edge->ymax - edge->ymin; --h >= 0; ) *Xp++ += dx; } } } /* :h3.UnJumble() - Sort a Region Top to Bottom It is an open question whether it pays in general to do this. */ void UnJumble(region) struct region *region; /* region to sort */ { register struct edgelist *anchor; /* new lists built here */ register struct edgelist *edge; /* edge pointer for loop */ register struct edgelist *next; /* ditto */ anchor = NULL; for (edge=region->anchor; VALIDEDGE(edge); edge=next) { if (edge->link == NULL) abort("UnJumble: unpaired edge?", 39); next = edge->link->link; edge->link->link = NULL; anchor = SortSwath(anchor, edge, t1_SwathUnion); } if (edge != NULL) vertjoin(anchor, edge); region->anchor = anchor; region->flag &= ~ISJUMBLED(ON); } /* */ #undef NEED_OPTIMZEREGION #ifdef NEED_OPTIMZEREGION static int OptimizeRegion(R) struct region *R; /* region to optimize */ { register pel *xP; /* pel pointer for inner loop */ register int x; /* holds X value */ register int xmin,xmax; /* holds X range */ register int h; /* loop counter */ register struct edgelist *e; /* edgelist pointer for loop */ R->flag |= ISRECTANGULAR(ON); for (e = R->anchor; VALIDEDGE(e); e=e->link) { xmin = MAXPEL; xmax = MINPEL; for (h = e->ymax - e->ymin, xP = e->xvalues; --h >= 0;) { x = *xP++; if (x < xmin) xmin = x; if (x > xmax) xmax = x; } if (xmin != xmax || (xmin != R->xmin && xmax != R->xmax)) R->flag &= ~ISRECTANGULAR(ON); if (xmin < e->xmin || xmax > e->xmax) abort("Tighten: existing edge bound was bad", 40); if (xmin < R->xmin || xmax > R->xmax) abort("Tighten: existing region bound was bad", 41); e->xmin = xmin; e->xmax = xmax; } R->flag |= ISOPTIMIZED(ON); return(0); } #endif /* This function is not used */ /* :h2.Miscelaneous Routines :h3.MoreWorkArea() - Allocate New Space for "edge" Our strategy is to temporarily allocate an array to hold this unexpectedly large edge. ChangeDirection frees this array any time it gets a shorter 'dy'. */ /*ARGSUSED*/ void MoreWorkArea(R, x1, y1, x2, y2) struct region *R; /* region we are generating */ fractpel x1,y1; /* starting point of line */ fractpel x2,y2; /* ending point of line */ { register int idy; /* integer dy of line */ idy = NEARESTPEL(y1) - NEARESTPEL(y2); if (idy < 0) idy = - idy; /* * we must add one to the delta for the number of run ends we * need to store: */ if (++idy > currentsize) { IfTrace1((RegionDebug > 0),"Allocating edge of %d pels\n", idy); if (currentworkarea != workedge) NonObjectFree(currentworkarea); currentworkarea = (pel *)Allocate(0, NULL, idy * sizeof(pel)); currentsize = idy; } ChangeDirection(CD_CONTINUE, R, x1, y1, y2 - y1, x2, y2); } /* :h3.BoxClip() - Clip a Region to a Rectangle BoxClip also duplicates the region if it is permanent. Note the clipping box is specified in REGION coordinates, that is, in coordinates relative to the region (0,0) point */ struct region *BoxClip(R, xmin, ymin, xmax, ymax) register struct region *R; /* region to clip */ register pel xmin,ymin; /* upper left hand corner of rectangle */ register pel xmax,ymax; /* lower right hand corner */ { struct edgelist anchor; /* pretend edgelist to facilitate discards */ register struct edgelist *e,*laste; IfTrace1((OffPageDebug),"BoxClip of %p:\n", R); R = UniqueRegion(R); if (xmin > R->xmin) { IfTrace2((OffPageDebug),"BoxClip: left clip old %d new %d\n", (LONG) R->xmin, (LONG) xmin); R->xmin = xmin; } if (xmax < R->xmax) { IfTrace2((OffPageDebug),"BoxClip: right clip old %d new %d\n", (LONG) R->xmax, (LONG) xmax); R->xmax = xmax; } if (ymin > R->ymin) { IfTrace2((OffPageDebug),"BoxClip: top clip old %d new %d\n", (LONG) R->ymin, (LONG) ymin); R->ymin = ymin; } if (ymax < R->ymax) { IfTrace2((OffPageDebug),"BoxClip: bottom clip old %d new %d\n", (LONG) R->ymax, (LONG) ymax); R->ymax = ymax; } laste = &anchor; anchor.link = R->anchor; for (e = R->anchor; VALIDEDGE(e); e = e->link) { if (TOP(e) < ymin) { e->xvalues += ymin - e->ymin; e->ymin = ymin; } if (BOTTOM(e) > ymax) e->ymax = ymax; if (TOP(e) >= BOTTOM(e)) { discard(laste, e->link->link); e = laste; continue; } if (e->xmin < xmin) { cedgemax(BOTTOM(e) - TOP(e), e->xvalues, xmin); e->xmin = xmin; e->xmax = TYPE1_MAX(e->xmax, xmin); } if (e->xmax > xmax) { cedgemin(BOTTOM(e) - TOP(e), e->xvalues, xmax); e->xmin = TYPE1_MIN(e->xmin, xmax); e->xmax = xmax; } laste = e; } R->anchor = anchor.link; return(R); } #ifdef notdef /* :h3.CoerceRegion() - Force a TextPath Structure to Become a Region We also save the newly created region in the textpath structure, if the structure was permanent. Then we don't have to do this again. Why not save it all the time? Well, we certainly could, but I suspect it wouldn't pay. We would have to make this region permanent (because we couldn't have it be consumed) and this would probably require unnecessary CopyRegions in most cases. */ struct region *CoerceRegion(tp) register struct textpath *tp; /* input TEXTTYPE */ { struct segment *path; /* temporary character path */ struct region *R; /* returned region */ R = Interior(path, EVENODDRULE); return(R); } #endif /* :h3.RegionBounds() - Returns Bounding Box of a Region */ struct segment *RegionBounds(R) register struct region *R; { register struct segment *path; /* returned path */ path = BoxPath(IDENTITY, R->ymax - R->ymin, R->xmax - R->xmin); path = Join(PathSegment(MOVETYPE, R->origin.x + TOFRACTPEL(R->xmin), R->origin.y + TOFRACTPEL(R->ymin) ), path); return(path); } /* :h2.Formatting/Dump Routines for Debug :h3.DumpArea() - Display a Region */ void DumpArea(area) register struct region *area; { IfTrace1(TRUE,"Dumping area %p,", area); IfTrace4(TRUE," X %d:%d Y %d:%d;", (LONG) area->xmin, (LONG) area->xmax, (LONG) area->ymin,(LONG) area->ymax); IfTrace4(TRUE," origin=(%d,%d), ending=(%d,%d)\n", area->origin.x, area->origin.y, area->ending.x, area->ending.y); DumpEdges(area->anchor); } #define INSWATH(p, y0, y1) (p != NULL && p->ymin == y0 && p->ymax == y1) /* :h3.DumpEdges() - Display Run End Lists (Edge Lists) */ static pel RegionDebugYMin = MINPEL; static pel RegionDebugYMax = MAXPEL; void DumpEdges(edges) register struct edgelist *edges; { register struct edgelist *p,*p2; register pel ymin = MINPEL; register pel ymax = MINPEL; register int y; if (edges == NULL) { IfTrace0(TRUE," NULL area.\n"); return; } if (RegionDebug <= 1) { for (p=edges; p != NULL; p = p->link) { edgecheck(p, ymin, ymax); ymin = p->ymin; ymax = p->ymax; IfTrace3(TRUE,". at %p type=%d flag=%x", p, (LONG) p->type,(LONG) p->flag); IfTrace4(TRUE," bounding box HxW is %dx%d at (%d,%d)\n", (LONG) ymax - ymin, (LONG) p->xmax - p->xmin, (LONG) p->xmin, (LONG) ymin); } } else { for (p2=edges; p2 != NULL; ) { edgecheck(p2, ymin, ymax); ymin = p2->ymin; ymax = p2->ymax; if (RegionDebug > 3 || (ymax > RegionDebugYMin && ymin < RegionDebugYMax)) { IfTrace2 (TRUE,". Swath from %d to %d:\n", ymin, ymax); for (p=p2; INSWATH(p,ymin,ymax); p = p->link) { IfTrace4(TRUE,". . at %p[%x] range %d:%d, ", p, (LONG) p->flag, (LONG) p->xmin, (LONG)p->xmax); IfTrace1(TRUE, "subpath=%p,\n", p->subpath); } } for (y=TYPE1_MAX(ymin,RegionDebugYMin); y < TYPE1_MIN(ymax, RegionDebugYMax); y++) { IfTrace1(TRUE,". . . Y[%5d] ", (LONG) y); for (p=p2; INSWATH(p,ymin,ymax); p = p->link) IfTrace1(TRUE,"%5d ", (LONG) p->xvalues[y - ymin]); IfTrace0(TRUE,"\n"); } while (INSWATH(p2, ymin, ymax)) p2 = p2->link; } } } /* :h3.edgecheck() - For Debug, Verify that an Edge Obeys the Rules */ /*ARGSUSED*/ static int edgecheck(edge, oldmin, oldmax) struct edgelist *edge; int oldmin,oldmax; { if (edge->type != EDGETYPE) abort("EDGE ERROR: non EDGETYPE in list", 42); /* The following check is not valid if the region is jumbled so I took it out: */ /* if (edge->ymin < oldmax && edge->ymin != oldmin) abort("EDGE ERROR: overlapping swaths", 43); */ return(0); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/Makefile.in0000664000175000017500000000376511742726711023403 0ustar uwabamiuwabami# Makefile.in # # This file is part of the t1lib-package! See documentation and Readme files # of the t1lib-package for copyright restrictions. # # Targets provided: # all (default) # install # clean # # Author: Rainer Menzner (Rainer.Menzner@web.de) # Date: 04/06/1997 # Last modified: 2001-04-01 # # Modified by H.Kakugawa to use libtool LIBTOOL = ../../libtool SHELL = /bin/sh CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ OPTIONS = @OPTIONS@ X_LIBS = @X_LIBS@ TOPSRC = @top_srcdir@ XPM_LIB = -lXpm XLIB = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@ LDFLAGS = @LDFLAGS@ LDLIBS = @LDLIBS@ AR = ar rc RANLIB = @RANLIB@ RM = rm -f X_CFLAGS = @X_CFLAGS@ YACC = @YACC@ LEX = @LEX@ LEXLIB = @LEXLIB@ ALLCFLAGS = $(CFLAGS) SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(ALLCFLAGS)' 'OPTIONS=$(OPTIONS)' @SET_MAKE@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @top_srcdir@/ac-tools/mkinstalldirs prefix = @prefix@ exec_prefix = @exec_prefix@ includedir = @includedir@ bindir = @bindir@ datadir = @datadir@ libdir = @libdir@ mandir = @mandir@/man1 manext = .1 no_x = @no_x@ # targets to build: OBJS = \ arith.lo \ curves.lo \ fontfcn.lo \ hints.lo \ lines.lo \ objects.lo \ paths.lo \ regions.lo \ scanfont.lo \ spaces.lo \ t1io.lo \ t1snap.lo \ t1stub.lo \ token.lo \ type1.lo \ util.lo .SUFFIXES: .c .o .lo .c.lo: $(LIBTOOL) --mode=compile \ $(CC) -c $(CPPFLAGS) $(CFLAGS) $< .c.o: $(LIBTOOL) --mode=compile \ $(CC) -c $(CPPFLAGS) $(CFLAGS) $< all: $(OBJS) .PHONY: clean dependencies: dummy gcc -MM *.c | sed 's/\.o:/.lo:/g' > .dependencies clean: dummy -$(RM) *.lo *.o .libs/* -$(RM) *~ *.bak \#*\# -rmdir .libs install: dummy dummy: # Dependencies of object files include .dependencies xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/util.c0000664000175000017500000001172511742726711022452 0ustar uwabamiuwabami/* $XConsortium: util.c,v 1.6 92/03/26 16:42:26 eswu Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ #include "types.h" #include #include #include "util.h" #include "fontmisc.h" static char *vm_base = NULL; /* Start of virtual memory area */ char *vm_next = NULL; /* Pointer to first free byte */ LONG vm_free = 0; /* Count of free bytes */ LONG vm_size = 0; /* Total size of memory */ /* The following global variable is for detecting a trial to allocate a second chunk---not to be done with the t1lib, since a later reallocation would lead to segmentation faults! */ int vm_init_count; /* This is the amount of VM, the font is tried to be loaded in. */ int vm_init_amount; /* * Initialize memory. */ extern char *tokenMaxP; /* Pointer to end of VM we may use + 1 */ boolean vm_init() { /* Check whether it is the first piece of memory for the current font or not. If so, simulate lacking memory to indicate that the font should be tried to load with a vitual memory twice as large! */ if (vm_init_count>0){ vm_init_count++; return(FALSE); } vm_init_count++; vm_next = vm_base = (char *) calloc( vm_init_amount, sizeof(char)); if (vm_base != NULL) { vm_free = vm_init_amount; vm_size = vm_init_amount; tokenMaxP = vm_next_byte() + vm_init_amount; return(TRUE); } else return(FALSE); } char *vm_alloc(bytes) unsigned int bytes; { char *answer; /* Align returned bytes to 64-bit boundary */ bytes = (bytes + 7) & ~7; /* take space from what is left otherwise allocate another CHUNK */ if (bytes > vm_free){ if (!vm_init()) return NULL; } else{ answer = vm_next; vm_free -= bytes; vm_next += bytes; return answer; } /* Never reached, but compiler is happy: */ return NULL; } /* * Format an Integer object */ void objFormatInteger( psobj *objP, int value) { if (objP != NULL) { objP->type = OBJ_INTEGER; objP->len = 0; objP->data.integer = value; } } /* * Format a Real object */ void objFormatReal(psobj *objP, float value) { if (objP != NULL) { objP->type = OBJ_REAL; objP->len = 0; objP->data.real = value; } } /* * Format a Boolean object */ void objFormatBoolean(psobj *objP, boolean value) { if (objP != NULL) { objP->type = OBJ_BOOLEAN; objP->len = 0; objP->data.boolean = value; } } /* * Format an Encoding object */ void objFormatEncoding(psobj *objP, int length, psobj *valueP) { if (objP != NULL) { objP->type = OBJ_ENCODING; objP->len = length; objP->data.arrayP = valueP; } } /* * Format an Array object */ void objFormatArray(psobj *objP, int length, psobj *valueP) { if (objP != NULL) { objP->type = OBJ_ARRAY; objP->len = length; objP->data.arrayP = valueP; } } /* * Format a String object */ void objFormatString(psobj *objP, int length, char *valueP) { if (objP != NULL) { objP->type = OBJ_STRING; objP->len = length; objP->data.valueP = valueP; } } /* * Format a Name object */ void objFormatName( psobj *objP, int length, char *valueP) { if (objP != NULL) { objP->type = OBJ_NAME; objP->len = length; objP->data.nameP = valueP; } } /* * Format a File object */ void objFormatFile(psobj *objP, FILE *valueP) { if (objP != NULL) { objP->type = OBJ_FILE; objP->len = 0; objP->data.fileP = valueP; } } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/spaces_rmz.h0000664000175000017500000001355011742726711023646 0ustar uwabamiuwabami/* $XConsortium: spaces.h,v 1.3 91/10/10 11:19:22 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #include "types.h" #define USER t1_User #define IDENTITY t1_Identity #define Context(d,u) t1_Context(d,u) /* #define Transform(o,f1,f2,f3,f4) t1_Transform(o,f1,f2,f3,f4) */ #define Rotate(o,d) t1_Rotate(o,d) /* #define Scale(o,sx,sy) t1_Scale(o,sx,sy) */ #define QuerySpace(S,f1,f2,f3,f4) t1_QuerySpace(S,f1,f2,f3,f4) #define Warp(s1,o,s2) t1_Warp(s1,o,s2) struct XYspace *t1_Context(); /* creates a coordinate space for a device */ struct xobject *t1_Transform(); /* transform an object */ struct xobject *t1_Rotate(); /* rotate an object */ /* struct xobject *t1_Scale(); */ /* scale an object */ struct xobject *t1_Warp(); /* transform like delta of two spaces */ void t1_QuerySpace(); /* returns coordinate space matrix */ /*END SHARED*/ /*SHARED*/ #define DeviceResolution t1_DeviceResolution #define InitSpaces() t1_InitSpaces() #define CopySpace(s) t1_CopySpace(s) #define Xform(o,M) t1_Xform(o,M) #define UnConvert(S,pt,xp,yp) t1_UnConvert(S,pt,xp,yp) #define MatrixMultiply(A,B,C) t1_MMultiply(A,B,C) #define MatrixInvert(A,B) t1_MInvert(A,B) #define PseudoSpace(S,M) t1_PseudoSpace(S,M) #define FindContext(M) t1_FindContext(M) void t1_InitSpaces(); /* initialize pre-defined coordinate spaces */ struct XYspace *t1_CopySpace(); /* duplicate a coordinate space */ struct xobject *t1_Xform(); /* transform object by matrix */ void t1_UnConvert(); /* return user coordinates from device coordinates */ void t1_MMultiply(); /* multiply two matrices */ void t1_MInvert(); /* invert a matrix */ void t1_PseudoSpace(); /* force a coordinate space from a matrix */ int t1_FindContext(); /* return the "context" represented by a matrix */ /*END SHARED*/ /*SHARED*/ /* #define KillSpace(s) Free(s) Note - redefined KillSpace() to check references ! 3-26-91 PNM */ #define KillSpace(s) if ( (--(s->references) == 0) ||\ ( (s->references == 1) && ISPERMANENT(s->flag) ) )\ Free(s) #define ConsumeSpace(s) MAKECONSUME(s,KillSpace(s)) #define UniqueSpace(s) MAKEUNIQUE(s,CopySpace(s)) /*END SHARED*/ /*SHARED*/ typedef SHORT pel; /* integer pel locations */ typedef LONG fractpel; /* fractional pel locations */ #define FRACTBITS 16 /* number of fractional bits in 'fractpel' */ /* We define the following macros to convert from 'fractpel' to 'pel' and vice versa: */ #define TOFRACTPEL(p) (((fractpel)p)<>FRACTBITS) #define FRACTFLOAT (DOUBLE)(1L<type)&&p->last!=NULL) /* For performance reasons, a user's "location" object is identical to a path whose only segment is a move segment. We define a predicate to test for this case. See also :hdref refid=location.. */ #define ISLOCATION(p) ((p)->type == MOVETYPE && (p)->link == NULL) /*END SHARED*/ struct segment *t1_Loc(); /* create a location object (or "move" segment) */ struct segment *t1_ILoc(); /* integer argument version of same */ struct segment *t1_Line(); /* straight line path segment */ struct segment *t1_Join(struct segment *,struct segment *); /* join two paths or regions together */ struct segment *t1_ClosePath(); /* close a path or path set */ struct conicsegment *t1_Conic(); /* conic curve path segment */ struct conicsegment *t1_RoundConic(); /* ditto, specified another way */ struct conicsegment *t1_ArcP3(); /* circular path segment with three points */ struct conicsegment *t1_ArcCA(); /* ditto, with center point and angle */ struct beziersegment *t1_Bezier(); /* Bezier third order curve path segment */ struct hintsegment *t1_Hint(); /* produce a font 'hint' path segment */ struct segment *t1_Reverse(); /* reverse the complete order of paths */ struct segment *t1_ReverseSubPaths(); /* reverse only sub-paths; moves unchanged */ struct segment *t1_SubLoc(); /* subtract two location objects */ struct segment *t1_DropSegment(); /* Drop the first segment in a path */ struct segment *t1_HeadSegment(); /* return the first segment in a path */ void t1_QueryLoc(); /* Query location; return its (x,y) */ void t1_QueryPath(); /* Query segment at head of a path */ void t1_QueryBounds(); /* Query the bounding box of a path */ /*END SHARED*/ /*SHARED*/ #define CopyPath(p) t1_CopyPath(p) #define KillPath(p) t1_KillPath(p) #define PathTransform(p,m) t1_PathXform(p,m) #define PathDelta(p,pt) t1_PathDelta(p,pt) #define BoundingBox(h,w) t1_BoundingBox(h,w) #define PathSegment(t,x,y) t1_PathSegment(t,(fractpel)x,(fractpel)y) #define JoinSegment(b,t,x,y,a) t1_JoinSegment(b,t,(fractpel)x,(fractpel)y,a) #define Hypoteneuse(dx,dy) t1_Hypoteneuse(dx,dy) #define BoxPath(S,h,w) t1_BoxPath(S,h,w) struct segment *t1_CopyPath(struct segment *); /* duplicate a path */ void t1_KillPath(struct segment *); /* destroy a path */ struct segment *t1_PathXform(); /* transform a path arbitrarily */ void t1_PathDelta(); /* calculate the ending point of a path */ struct segment *t1_PathSegment(); /* produce a MOVE or LINE segment */ struct segment *t1_JoinSegment(); /* join a MOVE or LINE segment to a path */ DOUBLE t1_Hypoteneuse(); /* returns the length of a line */ struct segment *t1_BoxPath(); /* returns a rectangular path */ /*END SHARED*/ /*SHARED*/ #define ConsumePath(p) MAKECONSUME(p,KillPath(p)) #define UniquePath(p) MAKEUNIQUE(p,CopyPath(p)) /*END SHARED*/ /*SHARED*/ struct conicsegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = CONICTYPE */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ struct segment *link; /* as with any 'segment' type */ struct segment *last; /* as with any 'segment' type */ struct fractpoint dest; /* Ending point (C point) */ struct fractpoint M; /* "midpoint" of conic explained above */ float roundness; /* explained above */ } ; /*END SHARED*/ /*SHARED*/ struct beziersegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = BEZIERTYPE */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ struct segment *link; /* as with any 'segment' type */ struct segment *last; /* as with any 'segment' type */ struct fractpoint dest; /* ending point (D) */ struct fractpoint B; /* control point B */ struct fractpoint C; /* control point C */ } ; /*END SHARED*/ /*SHARED*/ struct hintsegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = HINTTYPE */ unsigned char size; /* size of the structure */ unsigned char context; /* device context */ struct segment *link; /* pointer to next structure in linked list */ struct segment *last; /* pointer to last structure in list */ struct fractpoint dest; /* ALWAYS 0,0 */ struct fractpoint ref; struct fractpoint width; char orientation; char hinttype; char adjusttype; char direction; int label; } ; /*END SHARED*/ /*SHARED*/ /* CONCAT links the 'p2' path chain on the end of the 'p1' chain. (This macro is also used by the STROKES module.) */ #define CONCAT(p1, p2) { \ p1->last->link = p2; /* link p2 on end of p1 */ \ p1->last = p2->last; /* last of new is last of p2 */ \ p2->last = NULL; } /* only first segment has non-NULL "last" */ /*END SHARED*/ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/fontstruct.h0000664000175000017500000001671311742726711023717 0ustar uwabamiuwabami/* $Header: fontstruct.h,v 1.10 91/07/22 15:37:41 keith Exp $ */ /*********************************************************** Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, and the Massachusetts Institute of Technology, Cambridge, Massachusetts. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the names of Digital or MIT not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. @(#)fontstruct.h 3.2 91/04/15 ******************************************************************/ #ifndef FONTSTR_H #define FONTSTR_H #ifdef XSERVER #include #else #include "Xstuff.h" #endif #include "font.h" /* * This version of the server font data strucutre is only for describing * the in memory data structure. The file structure is not necessarily a * copy of this. That is up to the compiler and the OS layer font loading * machinery. */ #define GLYPHPADOPTIONS 4 /* 1, 2, 4, or 8 */ typedef enum { Linear8Bit, TwoD8Bit, Linear16Bit, TwoD16Bit } FontEncoding; typedef struct _FontProp { long name; long value; /* assumes ATOM is not larger than INT32 */ } FontPropRec; typedef struct _FontResolution { unsigned short x_resolution; unsigned short y_resolution; unsigned short point_size; } FontResolutionRec; typedef struct _ExtentInfo { DrawDirection drawDirection; int fontAscent; int fontDescent; int overallAscent; int overallDescent; int overallWidth; int overallLeft; int overallRight; } ExtentInfoRec; typedef struct _CharInfo { xCharInfo metrics; /* info preformatted for Queries */ char *bits; /* pointer to glyph image */ } CharInfoRec; /* * Font is created at font load time. It is specific to a single encoding. * e.g. not all of the glyphs in a font may be part of a single encoding. */ typedef struct _FontInfo { unsigned short firstCol; unsigned short lastCol; unsigned short firstRow; unsigned short lastRow; unsigned short defaultCh; unsigned int noOverlap:1; unsigned int terminalFont:1; unsigned int constantMetrics:1; unsigned int constantWidth:1; unsigned int inkInside:1; unsigned int inkMetrics:1; unsigned int allExist:1; unsigned int drawDirection:2; unsigned int cachable:1; unsigned int anamorphic:1; short maxOverlap; short pad; xCharInfo maxbounds; xCharInfo minbounds; xCharInfo ink_maxbounds; xCharInfo ink_minbounds; short fontAscent; short fontDescent; int nprops; FontPropPtr props; char *isStringProp; } FontInfoRec; typedef struct _Font { int refcnt; FontInfoRec info; char bit; char byte; char glyph; char scan; fsBitmapFormat format; int (*get_glyphs) ( /* font, count, chars, encoding, count, glyphs */ ); int (*get_metrics) ( /* font, count, chars, encoding, count, glyphs */ ); int (*get_bitmaps) (/* client, font, flags, ranges, nranges, nextents, extents */ ); int (*get_extents) (/* client, font, format, flags, ranges, nranges, nglyphs, offsets, glyphs */ ); void (*unload_font) ( /* font */ ); FontPathElementPtr fpe; pointer svrPrivate; pointer fontPrivate; pointer fpePrivate; int maxPrivate; pointer *devPrivates; } FontRec; extern Bool _FontSetNewPrivate (/* pFont, n, ptr */); extern int AllocateFontPrivateIndex (); #define FontGetPrivate(pFont,n) ((n) > (pFont)->maxPrivate ? (pointer) 0 : \ (pFont)->devPrivates[n]) #define FontSetPrivate(pFont,n,ptr) ((n) > (pFont)->maxPrivate ? \ _FontSetNewPrivate (pFont, n, ptr) : \ ((((pFont)->devPrivates[n] = (ptr)) != 0) || TRUE)) typedef struct _FontNames { int nnames; int size; int *length; char **names; } FontNamesRec; /* External view of font paths */ typedef struct _FontPathElement { int name_length; char *name; int type; int refcount; pointer private; } FontPathElementRec; typedef struct _FPEFunctions { int (*name_check) ( /* name */ ); int (*init_fpe) ( /* fpe */ ); int (*reset_fpe) ( /* fpe */ ); int (*free_fpe) ( /* fpe */ ); int (*open_font) ( /* client, fpe, flags, name, namelen, format, fid, ppfont, alias */ ); int (*close_font) ( /* pfont */ ); int (*list_fonts) ( /* client, fpe, pattern, patlen, maxnames, paths */ ); int (*start_list_fonts_with_info) ( /* client, fpe, name, namelen, maxnames, data */ ); int (*list_next_font_with_info) ( /* client, fpe, name, namelen, info, num, data */ ); int (*wakeup_fpe) ( /* fpe, mask */ ); int (*client_died) ( /* client, fpe */ ); } FPEFunctionsRec, FPEFunctions; extern int InitFPETypes(); /* * Various macros for computing values based on contents of * the above structures */ #define GLYPHWIDTHPIXELS(pci) \ ((pci)->metrics.rightSideBearing - (pci)->metrics.leftSideBearing) #define GLYPHHEIGHTPIXELS(pci) \ ((pci)->metrics.ascent + (pci)->metrics.descent) #define GLYPHWIDTHBYTES(pci) (((GLYPHWIDTHPIXELS(pci))+7) >> 3) #define GLYPHWIDTHPADDED(bc) (((bc)+7) & ~0x7) #define BYTES_PER_ROW(bits, nbytes) \ ((nbytes) == 1 ? (((bits)+7)>>3) /* pad to 1 byte */ \ :(nbytes) == 2 ? ((((bits)+15)>>3)&~1) /* pad to 2 bytes */ \ :(nbytes) == 4 ? ((((bits)+31)>>3)&~3) /* pad to 4 bytes */ \ :(nbytes) == 8 ? ((((bits)+63)>>3)&~7) /* pad to 8 bytes */ \ : 0) #define BYTES_FOR_GLYPH(ci,pad) (GLYPHHEIGHTPIXELS(ci) * \ BYTES_PER_ROW(GLYPHWIDTHPIXELS(ci),pad)) /* * Macros for computing different bounding boxes for fonts; from * the font protocol */ #define FONT_MAX_ASCENT(pi) ((pi)->fontAscent > (pi)->ink_maxbounds.ascent ? \ (pi)->fontAscent : (pi)->ink_maxbounds.ascent) #define FONT_MAX_DESCENT(pi) ((pi)->fontDescent > (pi)->ink_maxbounds.descent ? \ (pi)->fontDescent : (pi)->ink_maxbounds.descent) #define FONT_MAX_HEIGHT(pi) (FONT_MAX_ASCENT(pi) + FONT_MAX_DESCENT(pi)) #define FONT_MIN_LEFT(pi) ((pi)->ink_minbounds.leftSideBearing < 0 ? \ (pi)->ink_minbounds.leftSideBearing : 0) #define FONT_MAX_RIGHT(pi) ((pi)->ink_maxbounds.rightSideBearing > \ (pi)->ink_maxbounds.characterWidth ? \ (pi)->ink_maxbounds.rightSideBearing : \ (pi)->ink_maxbounds.characterWidth) #define FONT_MAX_WIDTH(pi) (FONT_MAX_RIGHT(pi) - FONT_MIN_LEFT(pi)) #endif /* FONTSTR_H */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/objects.h0000664000175000017500000002450111742726711023127 0ustar uwabamiuwabami/* $XConsortium: objects.h,v 1.6 92/03/20 14:35:56 keith Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ /*END SHARED*/ /*SHARED*/ #include "types.h" #define Permanent(obj) t1_Permanent(obj) #define Temporary(obj) t1_Temporary(obj) #define Destroy(obj) t1_Destroy(obj) #define Dup(obj) t1_Dup(obj) #define InitImager() t1_InitImager() #define TermImager() t1_TermImager() #define Pragmatics(f,v) t1_Pragmatics(f,v) #define ErrorMsg() t1_ErrorMsg() struct xobject *t1_Permanent(); /* make an object permanent */ struct xobject *t1_Temporary(); /* make an object temporary */ struct xobject *t1_Destroy(); /* destroy an object */ struct xobject *t1_Dup(); /* duplicate an object */ void t1_InitImager(); /* initialize TYPE1IMAGER */ void t1_TermImager(); /* terminate TYPE1IMAGER */ void t1_Pragmatics(); /* set debug flags, etc. */ char *t1_ErrorMsg(); /* return last TYPE1IMAGER error message */ /*END SHARED*/ /*SHARED*/ #define abort(line,no) t1_abort(line,no) #define Allocate(n,t,s) t1_Allocate(n,t,s) #define Free(obj) t1_Free(obj) #define NonObjectFree(a) free(a) #define Consume t1_Consume #define ArgErr(s,o,r) t1_ArgErr(s,o,r) #define TypeErr(n,o,e,r) t1_TypeErr(n,o,e,r) #define Copy(obj) t1_Copy(obj) #define Unique(obj) t1_Unique(obj) void t1_abort(); /* crash; software logic error */ struct xobject *t1_Allocate(); /* allocate memory */ void t1_Free(); /* free memory */ struct xobject *t1_Unique(); /* make a unique temporary copy of an object */ struct xobject *t1_ArgErr(); /* handle argument errors */ struct xobject *t1_TypeErr(); /* handle 'bad type' argument errors */ void t1_Consume(); /* consume a variable number of arguments */ struct xobject *t1_Copy(); /* make a new copy, not reference bump PNM */ /*END SHARED*/ /*SHARED*/ #define ON (~0) /* all bits on */ #ifndef FALSE #define FALSE 0 /* handy zero value */ #endif #ifndef TRUE #define TRUE 1 /* handy non-zero value */ #endif #ifndef NULL #define NULL 0 /* The NULL pointer is system specific. (Most systems, however, use 0.) TYPE1IMAGER could have its own NULL, independent of the rest of the system, were it not for malloc(). The system call malloc() returns NULL when out of memory. :i1/portibility assumptions/ */ #endif #define TYPE1_MIN(a,b) (((a)<(b)) ? a : b) #define TYPE1_MAX(a,b) (((a)>(b)) ? a : b) #define TYPE1_ABS(a) (((a)>=0)?(a):-(a)) /*END SHARED*/ /*SHARED*/ struct xobject { char type; /* encoded type of object */ unsigned char flag; /* flag byte for temporary object characteristics */ short references; /* count of pointers to this object (plus 1 for permanent objects) PNM */ } ; /*END SHARED*/ /*SHARED*/ #define XOBJ_COMMON char type; unsigned char flag; short references; /*END SHARED*/ /*SHARED*/ #define INVALIDTYPE 0 #define FONTTYPE 1 #define REGIONTYPE 3 #define PICTURETYPE 4 #define SPACETYPE 5 #define LINESTYLETYPE 6 #define EDGETYPE 7 #define STROKEPATHTYPE 8 #define CLUTTYPE 9 #define ISPATHTYPE(type) ((type)&0x10) /* all path segments have this bit on */ #define LINETYPE (0+ISPATHTYPE(ON)) #define CONICTYPE (1+ISPATHTYPE(ON)) #define BEZIERTYPE (2+ISPATHTYPE(ON)) #define HINTTYPE (3+ISPATHTYPE(ON)) #define MOVETYPE (5+ISPATHTYPE(ON)) #define TEXTTYPE (6+ISPATHTYPE(ON)) /*END SHARED*/ /*SHARED*/ #define ISPERMANENT(flag) ((flag)&0x01) #define ISIMMORTAL(flag) ((flag)&0x02) /*END SHARED*/ /*SHARED*/ #define PRESERVE(obj) if (!ISPERMANENT((obj)->flag)) \ (obj)->references++; /*END SHARED*/ /*SHARED*/ #define LONGCOPY(dest,source,bytes) { \ register LONG *p1 = (LONG *)dest; register LONG *p2 = (LONG *)source; \ register int count = (bytes) / sizeof(LONG); \ while (--count >= 0) *p1++ = *p2++; } /*END SHARED*/ /*SHARED*/ #define FOLLOWING(p) ((p)+1) /*END SHARED*/ /*SHARED*/ #define TYPECHECK(name, obj, expect, whenBAD, consumables, rettype) { \ if (obj->type != expect) { \ (Consume)consumables; \ return((rettype)TypeErr(name, obj, expect, whenBAD)); \ } \ } /*END SHARED*/ /*SHARED*/ #define ARGCHECK(test,msg,obj,whenBAD,consumables,rettype) { \ if (test) { \ (Consume)consumables; \ return((rettype)ArgErr(msg, obj, whenBAD)); \ } \ } /*END SHARED*/ /*SHARED*/ /* Changed use of Dup() below to Temporary(Copy()) because Dup() does not necessarily return a Unique Copy anymore! 3-26-91 */ #define TYPENULLCHECK(name, obj, expect, whenBAD, consumables,rettype) \ if (obj == NULL) { \ (Consume)consumables; \ if (whenBAD != NULL && ISPERMANENT(whenBAD->flag)) \ return((rettype)Temporary(Copy(whenBAD))); \ else return((rettype)whenBAD); \ } else { \ if (obj->type != expect) { \ (Consume)consumables; \ return((rettype)TypeErr(name, obj, expect, whenBAD)); \ } \ } /*END SHARED*/ /*SHARED*/ #define MAKECONSUME(obj,stmt) { if (!ISPERMANENT(obj->flag)) stmt; } /*END SHARED*/ /*SHARED*/ #define MAKEUNIQUE(obj,stmt) ( ( (obj)->references > 1 ) ? stmt : obj ) /*END SHARED*/ /*SHARED*/ /* NDW: personally, I want to see status and error messages! */ #define IfTrace0(condition,model) \ {if (condition) printf(model);} #define IfTrace1(condition,model,arg0) \ {if (condition) printf(model,arg0);} #define IfTrace2(condition,model,arg0,arg1) \ {if (condition) printf(model,arg0,arg1);} #define IfTrace3(condition,model,arg0,arg1,arg2) \ {if (condition) printf(model,arg0,arg1,arg2);} #define IfTrace4(condition,model,arg0,arg1,arg2,arg3) \ {if (condition) printf(model,arg0,arg1,arg2,arg3);} #define IfTrace5(condition,model,arg0,arg1,arg2,arg3,arg4) \ {if (condition) printf(model,arg0,arg1,arg2,arg3,arg4);} #define IfTrace6(condition,model,arg0,arg1,arg2,arg3,arg4,arg5) \ {if (condition) printf(model,arg0,arg1,arg2,arg3,arg4,arg5);} /* NDW: patch ends */ void Trace0(); char *Trace1(),*Trace2(),*Trace3(),*Trace4(),*Trace5(),*Trace6(); #ifdef GLOBALS #define extern #define INITIALIZED(value) = value #else #define INITIALIZED(value) #endif extern char MustCheckArgs INITIALIZED(TRUE); extern char MustTraceCalls INITIALIZED(FALSE); extern char MustCrash INITIALIZED(TRUE); extern char InternalTrace INITIALIZED(TRUE); extern char LineIOTrace INITIALIZED(TRUE); extern char ProcessHints INITIALIZED(TRUE); extern char SaveFontPaths INITIALIZED(TRUE); extern short CRASTERCompressionType INITIALIZED(1); extern char ConicDebug INITIALIZED(0); extern char LineDebug INITIALIZED(0); extern char RegionDebug INITIALIZED(0); extern char PathDebug INITIALIZED(0); extern char FontDebug INITIALIZED(0); extern char SpaceDebug INITIALIZED(0); extern char StrokeDebug INITIALIZED(0); extern char MemoryDebug INITIALIZED(0); extern char HintDebug INITIALIZED(0); extern char ImageDebug INITIALIZED(0); extern char OffPageDebug INITIALIZED(0); extern short CachedChars INITIALIZED(0x7FFF); extern short CachedFonts INITIALIZED(0x7FFF); extern int CacheBLimit INITIALIZED(12500); extern char Continuity INITIALIZED(2); #ifdef extern #undef extern #endif /* We define other routines formatting parameters */ #define DumpArea(area) t1_DumpArea(area) #define DumpText(text) t1_DumpText(text) /* #define DumpPath(path) t1_DumpPath(path) */ /* commented by RMz, 1999-06-10 */ #define DumpSpace(space) t1_DumpSpace(space) #define DumpEdges(e) t1_DumpEdges(e) #define FormatFP(s,p) t1_FormatFP(s,p) void t1_DumpArea(); /* dump a region structure */ void t1_DumpText(); /* dump a textpath structure */ void T1_DumpPath(); /* dump a path list */ void t1_DumpSpace(); /* dump a coordinate space structure */ void t1_DumpEdges(); /* dump a region's edge list */ void t1_FormatFP(); /* dump a format a "fractpel" coordinate */ /*END SHARED*/ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/token.h0000664000175000017500000000571711742726711022626 0ustar uwabamiuwabami/* $XConsortium: token.h,v 1.2 91/10/10 11:19:58 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #ifndef TOKEN_H #define TOKEN_H /* Special characters */ #define CONTROL_C (3) /* Token type codes */ #define TOKEN_INVALID (-3) #define TOKEN_BREAK (-2) #define TOKEN_EOF (-1) #define TOKEN_NONE (0) #define TOKEN_LEFT_PAREN (1) #define TOKEN_RIGHT_PAREN (2) #define TOKEN_LEFT_ANGLE (3) #define TOKEN_RIGHT_ANGLE (4) #define TOKEN_LEFT_BRACE (5) #define TOKEN_RIGHT_BRACE (6) #define TOKEN_LEFT_BRACKET (7) #define TOKEN_RIGHT_BRACKET (8) #define TOKEN_NAME (9) #define TOKEN_LITERAL_NAME (10) #define TOKEN_INTEGER (11) #define TOKEN_REAL (12) #define TOKEN_RADIX_NUMBER (13) #define TOKEN_HEX_STRING (14) #define TOKEN_STRING (15) #define TOKEN_IMMED_NAME (16) /* Token routines */ extern void scan_token(); /* * ------------------------------------------------------------------------- * Globals shared -- (everyone else KEEP YOUR MITTS OFF THEM!) * ------------------------------------------------------------------------- */ /* These variables are set by the caller */ extern char *tokenStartP; /* Pointer to token buffer in VM */ extern char *tokenMaxP; /* Pointer to end of VM we may use + 1 */ /* These variables are set by P_TOKEN */ extern int tokenLength; /* Characters in token */ extern boolean tokenTooLong; /* Token too long for space available */ extern int tokenType; /* Type of token identified */ extern psvalue tokenValue; /* Token value */ #endif /* TOKEN_H */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/hdigit.h0000664000175000017500000001237211742726711022751 0ustar uwabamiuwabami/* $XConsortium: hdigit.h,v 1.2 91/10/10 11:18:11 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* -------------------------------------- */ /* --- MACHINE GENERATED, DO NOT EDIT --- */ /* -------------------------------------- */ /* ... and yet, I did it. The code would fail on ASCII-encrypted files if the lines were separated by instead of (which is typical DOSian, but appearently such files exist). Setting the 13th element in the two LUTs to HWHITE_SPACE cures the problem. (RMz (Author of t1lib), 2000-05-18) */ #ifndef HDIGIT #define HDIGIT 1 /* * Hex Digit Value Table -- * * The entries in the Digit Value Table map character codes in the set * {0-9,a-f,A-F} to their numeric values for readhexstring * (00 10...F0 for the high hex digit and 00 01...0F for the low). * The white-space and hex string termination characters are. * mapped to codes > 0xf0 to enable usage by several modules. * 2 tables are build HighHex and LowHex. * */ /* Indicators for special characters in these tables */ #define HERROR (0xfe) #define HWHITE_SPACE (0xfd) #define HRIGHT_ANGLE (0xfc) #define LAST_HDIGIT (0xf0) #define HighHexP (HighHex+1) unsigned char HighHex[257] = { 0xFF, 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFE,0xFE,0xFD,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xFE,0xFE,0xFE,0xFE,0xFC,0xFE, 0xFE,0xA0,0xB0,0xC0,0xD0,0xE0,0xF0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xA0,0xB0,0xC0,0xD0,0xE0,0xF0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE }; #define LowHexP (LowHex+1) unsigned char LowHex[257] = { 0xFF, 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFE,0xFE,0xFD,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFE,0xFE,0xFE,0xFE,0xFC,0xFE, 0xFE,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE }; #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/pictures.h0000664000175000017500000000366111742726711023340 0ustar uwabamiuwabami/* $XConsortium: pictures.h,v 1.2 91/10/10 11:18:53 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* STUB */ #define CopyPicture(p) p #define UniquePicture(p) p /* #define KillPicture(p) */ #define BegHandle(o,m) o #define EndHandle(o,m) o #define PictureBounds(P) P struct picture { struct fractpoint origin; struct fractpoint ending; }; #define Phantom(o) t1_Phantom(o) #define Snap(o) t1_Snap(o) struct segment *t1_Phantom(); struct segment *t1_Snap(); xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/types.h0000664000175000017500000000174011742726711022642 0ustar uwabamiuwabami/* * File: types.h * Purpose: define basic types so that program is portable to non 32 bits * platforms * Version: 1.0 (Dec. 1993) * Author: Piet Tutelaers */ #ifndef __TYPES__ #define __TYPES__ #if defined(WORD16) typedef unsigned short USHORT; /* 16 bits */ typedef short SHORT; /* 16 bits */ typedef long LONG; /* 32 bits */ typedef unsigned long ULONG; /* 32 bits */ typedef double DOUBLE; /* 64 bits */ #elif defined(WORD64) typedef unsigned short USHORT; /* 16 bits */ typedef short SHORT; /* 16 bits */ typedef int LONG; /* 32 bits */ typedef unsigned long ULONG; /* 32 bits */ typedef double DOUBLE; /* 64 bits */ #else /* default: WORD32 */ typedef unsigned short USHORT; /* 16 bits */ typedef short SHORT; /* 16 bits */ typedef int LONG; /* 32 bits */ typedef unsigned int ULONG; /* 32 bits */ typedef double DOUBLE; /* 64 bits */ #endif #endif /* __TYPES__ */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/digit.h0000664000175000017500000000621511742726711022600 0ustar uwabamiuwabami/* $XConsortium: digit.h,v 1.2 91/10/10 11:18:01 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* -------------------------------------- */ /* --- MACHINE GENERATED, DO NOT EDIT --- */ /* -------------------------------------- */ #ifndef DIGIT #define DIGIT 1 /* * Digit Value Table -- * * The entries in the Digit Value Table map character * codes in the set {0-9,a-z,A-Z} to their numeric * values as part of numbers of radix 2-36. * */ unsigned char digit_value[256] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF }; #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/bstring.c0000664000175000017500000000023511742726711023137 0ustar uwabamiuwabami/* * A simple memset() in case your ANSI C does not provide it */ memset(void *s, int c, int length) { char *p = s; while (length--) *(p++) = c; } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/hints.h0000664000175000017500000000412211742726711022620 0ustar uwabamiuwabami/* $XConsortium: hints.h,v 1.2 91/10/10 11:18:19 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #define InitHints() t1_InitHints() void t1_InitHints(); /* Initialize hint data structure */ #define CloseHints(hintP) t1_CloseHints(hintP) void t1_CloseHints(); /* Reverse hints that are still open */ #define ProcessHint(hP, currX, currY, hintP) t1_ProcessHint(hP, currX, currY, hintP) void t1_ProcessHint(); /* Process a rasterization hint */ #define ApplyContinuity(R) t1_ApplyContinuity(R) void t1_ApplyContinuity(); /* fix false connection breaks in a region */ /*END SHARED*/ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/trig.h0000664000175000017500000000311611742726711022442 0ustar uwabamiuwabami/* $XConsortium: trig.h,v 1.2 91/10/10 11:20:04 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /*SHARED*/ #define DegreeCos(d) xiStub() #define DegreeSin(d) xiStub() #define sqrt(d) xiStub() xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/paths.c0000664000175000017500000014524411742726711022620 0ustar uwabamiuwabami/* $XConsortium: paths.c,v 1.4 91/10/10 11:18:40 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* PATHS CWEB V0021 ******** */ /* :h1 id=paths.PATHS Module - Path Operator Handler This is the module that is responsible for building and transforming path lists. &author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) :h3.Include Files The included files are: */ #include #include /* after the system includes (dsr) */ #include "types.h" #include "objects.h" #include "spaces.h" #include "paths.h" #include "regions.h" /* understands about Union */ #include "fonts.h" /* understands about TEXTTYPEs */ #include "pictures.h" /* understands about handles */ #include "strokes.h" /* understands how to coerce stroke paths */ #include "trig.h" static int UnClose(); /* :h3.Routines Available to the TYPE1IMAGER User The PATHS routines that are made available to the outside user are: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Functions Provided to Other Modules The path routines that are made available to other TYPE1IMAGER modules are defined here: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* NOTE: because of the casts put in the macros for Loc, ArcCA, Conic, RoundConic, PathSegment, and JoinSegment, we cannot use the macro names when the functions are actually defined. We have to use the unique names with their unique first two characters. Thus, if anyone in the future ever decided to change the first two characters, it would not be enough just to change the macro (as it would for most other functions). He would have to also change the function definition. */ /* :h3.Macros Provided to Other Modules The CONCAT macro is defined here and used in the STROKES module. See :hdref refid=pathmac.. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h2.Path Segment Structures A path is represented as a linked list of the following structure: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* When 'link' is NULL, we are at the last segment in the path (surprise!). 'last' is only non-NULL on the first segment of a path, for all the other segments 'last' == NULL. We test for a non-NULL 'last' (ISPATHANCHOR predicate) when we are given an alleged path to make sure the user is not trying to pull a fast one on us. A path may be a collection of disjoint paths. Every break in the disjoint path is represented by a MOVETYPE segment. Closed paths are discussed in :hdref refid=close.. :h3.CopyPath() - Physically Duplicating a Path This simple function illustrates moving through the path linked list. Duplicating a segment just involves making a copy of it, except for text, which has some auxilliary things involved. We don't feel competent to duplicate text in this module, so we call someone who knows how (in the FONTS module). */ struct segment *CopyPath(p0) register struct segment *p0; /* path to duplicate */ { register struct segment *p,*n=NULL,*last=NULL,*anchor; for (p = p0, anchor = NULL; p != NULL; p = p->link) { ARGCHECK((!ISPATHTYPE(p->type) || (p != p0 && p->last != NULL)), "CopyPath: invalid segment", p, NULL, (0), struct segment *); if (p->type == TEXTTYPE) n = (struct segment *) CopyText(p); else n = (struct segment *)Allocate(p->size, p, 0); n->last = NULL; if (anchor == NULL) anchor = n; else last->link = n; last = n; } /* At this point we have a chain of newly allocated segments hanging off 'anchor'. We need to make sure the first segment points to the last: */ if (anchor != NULL) { n->link = NULL; anchor->last = n; } return(anchor); } /* :h3.KillPath() - Destroying a Path Destroying a path is simply a matter of freeing each segment in the linked list. Again, we let the experts handle text. */ void KillPath(p) register struct segment *p; /* path to destroy */ { register struct segment *linkp; /* temp register holding next segment*/ /* return conditional based on reference count 3-26-91 PNM */ if ( (--(p->references) > 1) || ( (p->references == 1) && !ISPERMANENT(p->flag) ) ) return; while (p != NULL) { if (!ISPATHTYPE(p->type)) { ArgErr("KillPath: bad segment", p, NULL); return; } linkp = p->link; if (p->type == TEXTTYPE) KillText(p); else Free(p); p = linkp; } } /* :h2 id=location."location" Objects The TYPE1IMAGER user creates and destroys objects of type "location". These objects locate points for the primitive path operators. We play a trick here and store these objects in the same "segment" structure used for paths, with a type field == MOVETYPE. This allows the Line() operator, for example, to be very trivial: It merely stamps its input structure as a LINETYPE and returns it to the caller--assuming, of course, the input structure was not permanent (as it usually isn't). :h3.The "movesegment" Template Structure This template is used as a generic segment structure for Allocate: */ /* added reference field 1 to temporary template below 3-26-91 PNM */ static struct segment movetemplate = { MOVETYPE, 0, 1, sizeof(struct segment), 0, NULL, NULL, {0, 0} }; /* :h3.Loc() - Create an "Invisible Line" Between (0,0) and a Point */ struct segment *t1_Loc(S, x, y) register struct XYspace *S; /* coordinate space to interpret X,Y */ DOUBLE x,y; /* destination point */ { register struct segment *r; IfTrace3((MustTraceCalls),"..Loc(S=%p, x=%f, y=%f)\n", S, x, y); r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0); TYPECHECK("Loc", S, SPACETYPE, r, (0), struct segment *); r->last = r; r->context = S->context; (*S->convert)(&r->dest, S, x, y); ConsumeSpace(S); return(r); } /* :h3.ILoc() - Loc() With Integer Arguments */ struct segment *ILoc(S, x, y) register struct XYspace *S; /* coordinate space to interpret X,Y */ register int x,y; /* destination point */ { register struct segment *r; IfTrace3((MustTraceCalls),"..ILoc(S=%p, x=%d, y=%d)\n", S, (LONG) x, (LONG) y); r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0); TYPECHECK("Loc", S, SPACETYPE, r, (0), struct segment *); r->last = r; r->context = S->context; (*S->iconvert)(&r->dest, S, (LONG) x, (LONG) y); ConsumeSpace(S); return(r); } /* :h3.SubLoc() - Vector Subtraction of Two Locition Objects This user operator subtracts two location objects, yielding a new location object that is the result. The symmetrical function AddLoc() is totally redundent with Join(), so it is not provided. */ struct segment *SubLoc(p1, p2) register struct segment *p1; register struct segment *p2; { IfTrace2((MustTraceCalls),"SubLoc(%p, %p)\n", p1, p2); ARGCHECK(!ISLOCATION(p1), "SubLoc: bad first arg", p1, NULL, (0), struct segment *); ARGCHECK(!ISLOCATION(p2), "SubLoc: bad second arg", p2, NULL, (0), struct segment *); p1 = UniquePath(p1); p1->dest.x -= p2->dest.x; p1->dest.y -= p2->dest.y; ConsumePath(p2); return(p1); } /* :h2.Straight Line Segments :h3.PathSegment() - Create a Generic Path Segment Many routines need a LINETYPE or MOVETYPE path segment, but do not want to go through the external user's interface, because, for example, they already know the "fractpel" destination of the segment and the conversion is unnecessary. PathSegment() is an internal routine provided to the rest of TYPE1IMAGER for handling these cases. */ struct segment *t1_PathSegment(type, x, y) int type; /* LINETYPE or MOVETYPE */ fractpel x,y; /* where to go to, if known */ { register struct segment *r; /* newly created segment */ r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0); r->type = type; r->last = r; /* last points to itself for singleton */ r->dest.x = x; r->dest.y = y; return(r); } /* :h3.Line() - Create a Line Segment Between (0,0) and a Point P This involves just creating and filling out a segment structure: */ struct segment *Line(P) register struct segment *P; /* relevant coordinate space */ { IfTrace1((MustTraceCalls),"..Line(%p)\n", P); ARGCHECK(!ISLOCATION(P), "Line: arg not a location", P, NULL, (0), struct segment *); P = UniquePath(P); P->type = LINETYPE; return(P); } /* :h2.Curved Path Segments We need more points to describe curves. So, the structures for curved path segments are slightly different. The first part is identical; the curved structures are larger with the extra points on the end. :h3.Bezier Segment Structure We support third order Bezier curves. They are specified with four control points A, B, C, and D. The curve starts at A with slope AB and ends at D with slope CD. The curvature at the point A is inversely related to the length |AB|, and the curvature at the point D is inversely related to the length |CD|. Point A is always point (0,0). */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Bezier() - Generate a Bezier Segment This is just a simple matter of filling out a 'beziersegment' structure: */ struct beziersegment *Bezier(B, C, D) register struct segment *B; /* second control point */ register struct segment *C; /* third control point */ register struct segment *D; /* fourth control point (ending point) */ { /* added reference field of 1 to temporary template below 3-26-91 PNM */ static struct beziersegment template = { BEZIERTYPE, 0, 1, sizeof(struct beziersegment), 0, NULL, NULL, { 0, 0 }, { 0, 0 }, { 0, 0 } }; register struct beziersegment *r; /* output segment */ IfTrace3((MustTraceCalls),"..Bezier(%p, %p, %p)\n", B, C, D); ARGCHECK(!ISLOCATION(B), "Bezier: bad B", B, NULL, (2,C,D), struct beziersegment *); ARGCHECK(!ISLOCATION(C), "Bezier: bad C", C, NULL, (2,B,D), struct beziersegment *); ARGCHECK(!ISLOCATION(D), "Bezier: bad D", D, NULL, (2,B,C), struct beziersegment *); r = (struct beziersegment *)Allocate(sizeof(struct beziersegment), &template, 0); r->last = (struct segment *) r; r->dest.x = D->dest.x; r->dest.y = D->dest.y; r->B.x = B->dest.x; r->B.y = B->dest.y; r->C.x = C->dest.x; r->C.y = C->dest.y; ConsumePath(B); ConsumePath(C); ConsumePath(D); return(r); } /* :h2.Font "Hint" Segments :h3.Hint() - A Font 'Hint' Segment This is temporary code while we experiment with hints. */ /*SHARED LINE(S) ORIGINATED HERE*/ struct hintsegment *Hint(S, ref, width, orientation, hinttype, adjusttype, direction, label) struct XYspace *S; float ref; float width; char orientation; char hinttype; char adjusttype; char direction; int label; { /* added reference field of 1 to hintsegment template below 3-26-91 PNM */ static struct hintsegment template = { HINTTYPE, 0, 1, sizeof(struct hintsegment), 0, NULL, NULL, { 0, 0 }, { 0, 0 }, { 0, 0 }, ' ', ' ', ' ', ' ', 0}; register struct hintsegment *r; r = (struct hintsegment *)Allocate(sizeof(struct hintsegment), &template, 0); r->orientation = orientation; if (width == 0.0) width = 1.0; if (orientation == 'h') { (*S->convert)(&r->ref, S, 0.0, ref); (*S->convert)(&r->width, S, 0.0, width); } else if (orientation == 'v') { (*S->convert)(&r->ref, S, ref, 0.0); (*S->convert)(&r->width, S, width, 0.0); } else return((struct hintsegment *)ArgErr("Hint: orient not 'h' or 'v'", NULL, NULL)); if (r->width.x < 0) r->width.x = - r->width.x; if (r->width.y < 0) r->width.y = - r->width.y; r->hinttype = hinttype; r->adjusttype = adjusttype; r->direction = direction; r->label = label; r->last = (struct segment *) r; ConsumeSpace(S); return(r); } /* */ /*SHARED LINE(S) ORIGINATED HERE*/ /* POP removes the first segment in a path 'p' and Frees it. 'p' is left pointing to the end of the path: */ #define POP(p) \ { register struct segment *linkp; \ linkp = p->link; \ if (linkp != NULL) \ linkp->last = p->last; \ Free(p); \ p = linkp; } /* INSERT inserts a single segment in the middle of a chain. 'b' is the segment before, 'p' the segment to be inserted, and 'a' the segment after. */ #define INSERT(b,p,a) b->link=p; p->link=a; p->last=NULL /* :h3.Join() - Join Two Objects Together If these are paths, this operator simply invokes the CONCAT macro. Why so much code then, you ask? Well we have to check for object types other than paths, and also check for certain path consistency rules. */ struct segment *Join(p1, p2) register struct segment *p1,*p2; { IfTrace2((MustTraceCalls && PathDebug > 1),"..Join(%p, %p)\n", p1, p2); IfTrace2((MustTraceCalls && PathDebug <=1),"..Join(%p, %p)\n", p1, p2); /* We start with a whole bunch of very straightforward argument tests: */ if (p2 != NULL) { if (!ISPATHTYPE(p2->type)) { if (p1 == NULL) return((struct segment *)Unique(p2)); switch (p1->type) { case REGIONTYPE: case STROKEPATHTYPE: p1 = CoercePath(p1); break; default: return((struct segment *)BegHandle(p1, p2)); } } ARGCHECK((p2->last == NULL), "Join: right arg not anchor", p2, NULL, (1,p1), struct segment *); p2 = UniquePath(p2); /* In certain circumstances, we don't have to duplicate a permanent location. (We would just end up destroying it anyway). These cases are when 'p2' begins with a move-type segment: */ if (p2->type == TEXTTYPE || p2->type == MOVETYPE) { if (p1 == NULL) return(p2); if (ISLOCATION(p1)) { p2->dest.x += p1->dest.x; p2->dest.y += p1->dest.y; ConsumePath(p1); return(p2); } } } else return((struct segment *)Unique(p1)); if (p1 != NULL) { if (!ISPATHTYPE(p1->type)) switch (p2->type) { case REGIONTYPE: case STROKEPATHTYPE: p2 = CoercePath(p2); break; default: return((struct segment *)EndHandle(p1, p2)); } ARGCHECK((p1->last == NULL), "Join: left arg not anchor", p1, NULL, (1,p2), struct segment *); p1 = UniquePath(p1); } else return(p2); /* At this point all the checking is done. We have two temporary non-null path types in 'p1' and 'p2'. If p1 ends with a MOVE, and p2 begins with a MOVE, we collapse the two MOVEs into one. We enforce the rule that there may not be two MOVEs in a row: */ if (p1->last->type == MOVETYPE && p2->type == MOVETYPE) { p1->last->flag |= p2->flag; p1->last->dest.x += p2->dest.x; p1->last->dest.y += p2->dest.y; POP(p2); if (p2 == NULL) return(p1); } /* Now we check for another silly rule. If a path has any TEXTTYPEs, then it must have only TEXTTYPEs and MOVETYPEs, and furthermore, it must begin with a TEXTTYPE. This rule makes it easy to check for the special case of text. If necessary, we will coerce TEXTTYPEs into paths so we don't mix TEXTTYPEs with normal paths. */ if (p1->type == TEXTTYPE) { if (p2->type != TEXTTYPE && !ISLOCATION(p2)) p1 = CoerceText(p1); } else { if (p2->type == TEXTTYPE) { if (ISLOCATION(p1)) { p2->dest.x += p1->dest.x; p2->dest.y += p1->dest.y; Free(p1); return(p2); } else p2 = CoerceText(p2); } } /* Thank God! Finally! It's hard to believe, but we are now able to actually do the join. This is just invoking the CONCAT macro: */ CONCAT(p1, p2); return(p1); } /* :h3.JoinSegment() - Create a Path Segment and Join It to a Known Path This internal function is quicker than a full-fledged join because it can do much less checking. */ struct segment *t1_JoinSegment(before, type, x, y, after) register struct segment *before; /* path to join before new segment */ int type; /* type of new segment (MOVETYPE or LINETYPE) */ fractpel x,y; /* x,y of new segment */ register struct segment *after; /* path to join after new segment */ { register struct segment *r; /* returned path built here */ r = PathSegment(type, x, y); if (before != NULL) { CONCAT(before, r); r = before; } else r->context = after->context; if (after != NULL) CONCAT(r, after); return(r); } /* :h2.Other Path Functions */ struct segment *t1_ClosePath(p0,lastonly) register struct segment *p0; /* path to close */ register int lastonly; /* flag deciding to close all subpaths or... */ { register struct segment *p,*last=NULL,*start; /* used in looping through path */ register fractpel x,y; /* current position in path */ register fractpel firstx=0,firsty=0; /* start position of sub path */ register struct segment *lastnonhint=NULL; /* last non-hint segment in path */ IfTrace1((MustTraceCalls),"ClosePath(%p)\n", p0); if (p0 != NULL && p0->type == TEXTTYPE) return(UniquePath(p0)); if (p0->type == STROKEPATHTYPE) return((struct segment *)Unique(p0)); /* * NOTE: a null closed path is different from a null open path * and is denoted by a closed (0,0) move segment. We make * sure this path begins and ends with a MOVETYPE: */ if (p0 == NULL || p0->type != MOVETYPE) p0 = JoinSegment(NULL, MOVETYPE, 0, 0, p0); TYPECHECK("ClosePath", p0, MOVETYPE, NULL, (0), struct segment *); if (p0->last->type != MOVETYPE) p0 = JoinSegment(p0, MOVETYPE, 0, 0, NULL); p0 = UniquePath(p0); /* We now begin a loop through the path, incrementing current 'x' and 'y'. We are searching for MOVETYPE segments (breaks in the path) that are not already closed. At each break, we insert a close segment. */ for (p = p0, x = y = 0, start = NULL; p != NULL; x += p->dest.x, y += p->dest.y, last = p, p = p->link) { if (p->type == MOVETYPE) { if (start != NULL && (lastonly?p->link==NULL:TRUE) && !(ISCLOSED(start->flag) && LASTCLOSED(last->flag))) { register struct segment *r; /* newly created */ start->flag |= ISCLOSED(ON); r = PathSegment(LINETYPE, firstx - x, firsty - y); INSERT(last, r, p); r->flag |= LASTCLOSED(ON); /*< adjust 'last' if possible for a 0,0 close >*/ { #define CLOSEFUDGE 3 /* if we are this close, let's change last segment */ if (r->dest.x != 0 || r->dest.y != 0) { if (r->dest.x <= CLOSEFUDGE && r->dest.x >= -CLOSEFUDGE && r->dest.y <= CLOSEFUDGE && r->dest.y >= -CLOSEFUDGE) { IfTrace2((PathDebug), "ClosePath forced closed by (%d,%d)\n", r->dest.x, r->dest.y); lastnonhint->dest.x += r->dest.x; lastnonhint->dest.y += r->dest.y; r->dest.x = r->dest.y = 0; } } } if (p->link != NULL) { p->dest.x += x - firstx; p->dest.y += y - firsty; x = firstx; y = firsty; } } start = p; firstx = x + p->dest.x; firsty = y + p->dest.y; } else if (p->type != HINTTYPE) lastnonhint = p; } return(p0); } /* */ /* :h2.Reversing the Direction of a Path This turned out to be more difficult than I thought at first. The trickiness was due to the fact that closed paths must remain closed, etc. We need three subroutines: */ static struct segment *SplitPath(); /* break a path at any point */ static struct segment *DropSubPath(); /* breaks a path after first sub-path */ static struct segment *ReverseSubPath(); /* reverses a single sub-path */ /* :h3.Reverse() - User Operator to Reverse a Path This operator reverses the entire path. */ struct segment *Reverse(p) register struct segment *p; /* full path to reverse */ { register struct segment *r; /* output path built here */ register struct segment *nextp; /* contains next sub-path */ IfTrace1((MustTraceCalls),"Reverse(%p)\n", p); if (p == NULL) return(NULL); ARGCHECK(!ISPATHANCHOR(p), "Reverse: invalid path", p, NULL, (0), struct segment *); if (p->type == TEXTTYPE) p = CoerceText(p); p = UniquePath(p); r = NULL; do { nextp = DropSubPath(p); p = ReverseSubPath(p); r = Join(p, r); p = nextp; } while (p != NULL); return(r); } /* :h4.ReverseSubPath() - Subroutine to Reverse a Single Sub-Path */ static struct segment *ReverseSubPath(p) register struct segment *p; /* input path */ { register struct segment *r; /* reversed path will be created here */ register struct segment *nextp; /* temporary variable used in loop */ register int wasclosed; /* flag, path was closed */ if (p == NULL) return(NULL); wasclosed = ISCLOSED(p->flag); r = NULL; do { /* First we reverse the direction of this segment and clean up its flags: */ p->dest.x = - p->dest.x; p->dest.y = - p->dest.y; p->flag &= ~(ISCLOSED(ON) | LASTCLOSED(ON)); switch (p->type) { case LINETYPE: case MOVETYPE: break; case CONICTYPE: { /* The logic of this is that the new M point (stored relative to the new beginning) is (M - C). However, C ("dest") has already been reversed So, we add "dest" instead of subtracting it: */ register struct conicsegment *cp = (struct conicsegment *) p; cp->M.x += p->dest.x; cp->M.y += p->dest.y; } break; case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) p; bp->B.x += p->dest.x; bp->B.y += p->dest.y; bp->C.x += p->dest.x; bp->C.y += p->dest.y; } break; case HINTTYPE: { register struct hintsegment *hp = (struct hintsegment *) p; hp->ref.x = -hp->ref.x; hp->ref.y = -hp->ref.y; } break; default: abort("Reverse: bad path segment", 23); } /* We need to reverse the order of segments too, so we break this segment off of the input path, and tack it on the front of the growing path in 'r': */ nextp = p->link; p->link = NULL; p->last = p; if (r != NULL) CONCAT(p,r); /* leaves result in 'p'... not what we want */ r = p; p = nextp; /* advance to next segment in input path */ } while (p != NULL); if (wasclosed) r = ClosePath(r); return(r); } /* :h4.DropSubPath() - Drops the First Sub-Path Off a Path This subroutine returns the remaining sub-path(s). While doing so, it breaks the input path after the first sub-path so that a pointer to the original path now contains the first sub-path only. */ static struct segment *DropSubPath(p0) register struct segment *p0; /* original path */ { register struct segment *p; /* returned remainder here */ for (p = p0; p->link != NULL; p = p->link) { if (p->link->type == MOVETYPE) break; } return(SplitPath(p0, p)); } static struct segment *SplitPath(anchor, before) register struct segment *anchor; register struct segment *before; { register struct segment *r; if (before == anchor->last) return(NULL); r = before->link; r->last = anchor->last; anchor->last = before; before->link = NULL; return(r); } /* :h3.ReverseSubPaths() - Reverse the Direction of Sub-paths Within a Path This user operator reverses the sub-paths in a path, but leaves the 'move' segments unchanged. It builds on top of the subroutines already established. */ struct segment *ReverseSubPaths(p) register struct segment *p; /* input path */ { register struct segment *r; /* reversed path will be created here */ register struct segment *nextp; /* temporary variable used in loop */ int wasclosed; /* flag; subpath was closed */ register struct segment *nomove; /* the part of sub-path without move segment */ struct fractpoint delta; IfTrace1((MustTraceCalls),"ReverseSubPaths(%p)\n", p); if (p == NULL) return(NULL); ARGCHECK(!ISPATHANCHOR(p), "ReverseSubPaths: invalid path", p, NULL, (0), struct segment *); if (p->type == TEXTTYPE) p = CoerceText(p); if (p->type != MOVETYPE) p = JoinSegment(NULL, MOVETYPE, 0, 0, p); p = UniquePath(p); r = NULL; for (; p != NULL;) { nextp = DropSubPath(p); wasclosed = ISCLOSED(p->flag); if (wasclosed) UnClose(p); nomove = SplitPath(p, p); r = Join(r, p); PathDelta(nomove, &delta); nomove = ReverseSubPath(nomove); p->dest.x += delta.x; p->dest.y += delta.y; if (nextp != NULL) { nextp->dest.x += delta.x; nextp->dest.y += delta.y; } if (wasclosed) { nomove = ClosePath(nomove); nextp->dest.x -= delta.x; nextp->dest.y -= delta.y; } r = Join(r, nomove); p = nextp; } return(r); } static int UnClose(p0) register struct segment *p0; { register struct segment *p; for (p=p0; p->link->link != NULL; p=p->link) { ; } if (!LASTCLOSED(p->link->flag)) abort("UnClose: no LASTCLOSED", 24); Free(SplitPath(p0, p)); p0->flag &= ~ISCLOSED(ON); return(0); } /* :h2.Transforming and Putting Handles on Paths :h3.PathTransform() - Transform a Path Transforming a path involves transforming all the points. In order that closed paths do not become "unclosed" when their relative positions are slightly changed due to loss of arithmetic precision, all point transformations are in absolute coordinates. (It might be better to reset the "absolute" coordinates every time a move segment is encountered. This would mean that we could accumulate error from subpath to subpath, but we would be less likely to make the "big error" where our fixed point arithmetic "wraps". However, I think I'll keep it this way until something happens to convince me otherwise.) The transform is described as a "space", that way we can use our old friend the "iconvert" function, which should be very efficient. */ struct segment *PathTransform(p0, S) register struct segment *p0; /* path to transform */ register struct XYspace *S; /* pseudo space to transform in */ { register struct segment *p; /* to loop through path with */ register fractpel newx,newy; /* current transformed position in path */ register fractpel oldx,oldy; /* current untransformed position in path */ register fractpel savex,savey; /* save path delta x,y */ p0 = UniquePath(p0); newx = newy = oldx = oldy = 0; for (p=p0; p != NULL; p=p->link) { savex = p->dest.x; savey = p->dest.y; (*S->iconvert)(&p->dest, S, p->dest.x + oldx, p->dest.y + oldy); p->dest.x -= newx; p->dest.y -= newy; switch (p->type) { case LINETYPE: case MOVETYPE: break; case CONICTYPE: { register struct conicsegment *cp = (struct conicsegment *) p; (*S->iconvert)(&cp->M, S, cp->M.x + oldx, cp->M.y + oldy); cp->M.x -= newx; cp->M.y -= newy; /* * Note roundness doesn't change... linear transform */ break; } case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) p; (*S->iconvert)(&bp->B, S, bp->B.x + oldx, bp->B.y + oldy); bp->B.x -= newx; bp->B.y -= newy; (*S->iconvert)(&bp->C, S, bp->C.x + oldx, bp->C.y + oldy); bp->C.x -= newx; bp->C.y -= newy; break; } case HINTTYPE: { register struct hintsegment *hp = (struct hintsegment *) p; (*S->iconvert)(&hp->ref, S, hp->ref.x + oldx, hp->ref.y + oldy); hp->ref.x -= newx; hp->ref.y -= newy; (*S->iconvert)(&hp->width, S, hp->width.x, hp->width.y); /* Note: width is not relative to origin */ break; } case TEXTTYPE: { XformText(p,S); break; } default: IfTrace1(TRUE,"path = %p\n", p); abort("PathTransform: invalid segment", 25); } oldx += savex; oldy += savey; newx += p->dest.x; newy += p->dest.y; } return(p0); } /* :h3.PathDelta() - Return a Path's Ending Point */ void PathDelta(p, pt) register struct segment *p; /* input path */ register struct fractpoint *pt; /* pointer to x,y to set */ { register fractpel x,y; /* working variables for path current point */ for (x=y=0; p != NULL; p=p->link) { x += p->dest.x; y += p->dest.y; if (p->type == TEXTTYPE) { struct fractpoint mypoint; mypoint.x = mypoint.y = 0; TextDelta(p, &mypoint); x += mypoint.x; y += mypoint.y; } } pt->x = x; pt->y = y; } /* :h3.BoundingBox() - Produce a Bounding Box Path This function is called by image code, when we know the size of the image in pels, and need to get a bounding box path that surrounds it. The starting/ending handle is in the lower right hand corner. */ struct segment *BoundingBox(h, w) register pel h,w; /* size of box */ { register struct segment *path; path = PathSegment(LINETYPE, -TOFRACTPEL(w), 0); path = JoinSegment(NULL, LINETYPE, 0, -TOFRACTPEL(h), path); path = JoinSegment(NULL, LINETYPE, TOFRACTPEL(w), 0, path); path = ClosePath(path); return(path); } /* :h2.Querying Locations and Paths :h3.QueryLoc() - Return the X,Y of a Locition */ void QueryLoc(P, S, xP, yP) register struct segment *P; /* location to query, not consumed */ register struct XYspace *S; /* XY space to return coordinates in */ register DOUBLE *xP,*yP; /* coordinates returned here */ { IfTrace4((MustTraceCalls),"QueryLoc(P=%p, S=%p, (%f, %f))\n", P, S, *xP, *yP); if (!ISLOCATION(P)) { ArgErr("QueryLoc: first arg not a location", P, NULL); return; } if (S->type != SPACETYPE) { ArgErr("QueryLoc: second arg not a space", S, NULL); return; } UnConvert(S, &P->dest, xP, yP); } /* :h3.QueryPath() - Find Out the Type of Segment at the Head of a Path This is a very simple routine that looks at the first segment of a path and tells the caller what it is, as well as returning the control point(s) of the path segment. Different path segments have different number of control points. If the caller knows that the segment is a move segment, for example, he only needs to pass pointers to return one control point. */ void QueryPath(path, typeP, Bp, Cp, Dp, fP) register struct segment *path; /* path to check */ register int *typeP; /* return the type of path here */ register struct segment **Bp; /* return location of first point */ register struct segment **Cp; /* return location of second point */ register struct segment **Dp; /* return location of third point */ register DOUBLE *fP; /* return Conic sharpness */ { register int coerced = FALSE; /* did I coerce a text path? */ IfTrace3((MustTraceCalls), "QueryPath(%p, %p, %p, ...)\n", path, typeP, Bp); if (path == NULL) { *typeP = -1; return; } if (!ISPATHANCHOR(path)) { ArgErr("QueryPath: arg not a valid path", path, NULL); } if (path->type == TEXTTYPE) { path = CoerceText(path); coerced = TRUE; } switch (path->type) { case MOVETYPE: *typeP = 0; *Bp = PathSegment(MOVETYPE, path->dest.x, path->dest.y); break; case LINETYPE: *typeP = (LASTCLOSED(path->flag)) ? 4 : 1; *Bp = PathSegment(MOVETYPE, path->dest.x, path->dest.y); break; case CONICTYPE: { register struct conicsegment *cp = (struct conicsegment *) path; *typeP = 2; *Bp = PathSegment(MOVETYPE, cp->M.x, cp->M.y); *Cp = PathSegment(MOVETYPE, cp->dest.x, cp->dest.y); *fP = cp->roundness; } break; case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) path; *typeP = 3; *Bp = PathSegment(MOVETYPE, bp->B.x, bp->B.y); *Cp = PathSegment(MOVETYPE, bp->C.x, bp->C.y); *Dp = PathSegment(MOVETYPE, bp->dest.x, bp->dest.y); } break; case HINTTYPE: *typeP = 5; break; default: abort("QueryPath: unknown segment", 26); } if (coerced) KillPath(path); } /* :h3.QueryBounds() - Return the Bounding Box of a Path Returns the bounding box by setting the user's variables. */ void QueryBounds(p0, S, xminP, yminP, xmaxP, ymaxP) register struct segment *p0; /* object to check for bound */ struct XYspace *S; /* coordinate space of returned values */ DOUBLE *xminP,*yminP; /* lower left hand corner (set by routine) */ DOUBLE *xmaxP,*ymaxP; /* upper right hand corner (set by routine) */ { register struct segment *path; /* loop variable for path segments */ register fractpel lastx,lasty; /* loop variables: previous endingpoint */ register fractpel x,y; /* loop variables: current ending point */ struct fractpoint min; /* registers to keep lower left hand corner */ struct fractpoint max; /* registers to keep upper right hand corner */ int coerced = FALSE; /* we have coerced the path from another object */ DOUBLE x1,y1,x2,y2,x3,y3,x4,y4; /* corners of rectangle in space X */ IfTrace2((MustTraceCalls), "QueryBounds(%p, %p,", p0, S); IfTrace4((MustTraceCalls), " %p, %p, %p, %p)\n", xminP, yminP, xmaxP, ymaxP); if (S->type != SPACETYPE) { ArgErr("QueryBounds: bad XYspace", S, NULL); return; } min.x = min.y = max.x = max.y = 0; if (p0 != NULL) { if (!ISPATHANCHOR(p0)) { switch(p0->type) { case STROKEPATHTYPE: /* replaced DupStrokePath() with Dup() 3-26-91 PNM */ p0 = (struct segment *) DoStroke(Dup(p0)); /* no break here, we have a region in p0 */ case REGIONTYPE: p0 = RegionBounds(p0); break; case PICTURETYPE: p0 = PictureBounds(p0); break; default: ArgErr("QueryBounds: bad object", p0, NULL); return; } coerced = TRUE; } if (p0->type == TEXTTYPE) { /* replaced CopyPath() with Dup() 3-26-91 PNM */ p0 = (struct segment *)CoerceText(Dup(p0)); /* there are faster ways */ coerced = TRUE; } if (p0->type == MOVETYPE) { min.x = max.x = p0->dest.x; min.y = max.y = p0->dest.y; } } lastx = lasty = 0; for (path = p0; path != NULL; path = path->link) { x = lastx + path->dest.x; y = lasty + path->dest.y; switch (path->type) { case LINETYPE: break; case CONICTYPE: { register struct conicsegment *cp = (struct conicsegment *) path; register fractpel Mx = lastx + cp->M.x; register fractpel My = lasty + cp->M.y; register fractpel deltax = 0.5 * cp->roundness * cp->dest.x; register fractpel deltay = 0.5 * cp->roundness * cp->dest.y; register fractpel Px = Mx - deltax; register fractpel Py = My - deltay; register fractpel Qx = Mx + deltax; register fractpel Qy = My + deltay; if (Mx < min.x) min.x = Mx; else if (Mx > max.x) max.x = Mx; if (My < min.y) min.y = My; else if (My > max.y) max.y = My; if (Px < min.x) min.x = Px; else if (Px > max.x) max.x = Px; if (Py < min.y) min.y = Py; else if (Py > max.y) max.y = Py; if (Qx < min.x) min.x = Qx; else if (Qx > max.x) max.x = Qx; if (Qy < min.y) min.y = Qy; else if (Qy > max.y) max.y = Qy; } break; case MOVETYPE: /* * We can't risk adding trailing Moves to the * bounding box: */ if (path->link == NULL) goto done; /* God forgive me */ break; case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) path; register fractpel Bx = lastx + bp->B.x; register fractpel By = lasty + bp->B.y; register fractpel Cx = lastx + bp->C.x; register fractpel Cy = lasty + bp->C.y; if (Bx < min.x) min.x = Bx; else if (Bx > max.x) max.x = Bx; if (By < min.y) min.y = By; else if (By > max.y) max.y = By; if (Cx < min.x) min.x = Cx; else if (Cx > max.x) max.x = Cx; if (Cy < min.y) min.y = Cy; else if (Cy > max.y) max.y = Cy; } break; case HINTTYPE: break; default: abort("QueryBounds: unknown type", 27); } if (x < min.x) min.x = x; else if (x > max.x) max.x = x; if (y < min.y) min.y = y; else if (y > max.y) max.y = y; lastx = x; lasty = y; } done: UnConvert(S, &min, &x1, &y1); UnConvert(S, &max, &x4, &y4); x = min.x; min.x = max.x; max.x = x; UnConvert(S, &min, &x2, &y2); UnConvert(S, &max, &x3, &y3); *xminP = *xmaxP = x1; if (x2 < *xminP) *xminP = x2; else if (x2 > *xmaxP) *xmaxP = x2; if (x3 < *xminP) *xminP = x3; else if (x3 > *xmaxP) *xmaxP = x3; if (x4 < *xminP) *xminP = x4; else if (x4 > *xmaxP) *xmaxP = x4; *yminP = *ymaxP = y1; if (y2 < *yminP) *yminP = y2; else if (y2 > *ymaxP) *ymaxP = y2; if (y3 < *yminP) *yminP = y3; else if (y3 > *ymaxP) *ymaxP = y3; if (y4 < *yminP) *yminP = y4; else if (y4 > *ymaxP) *ymaxP = y4; if (coerced) Destroy(p0); } /* :h3.BoxPath() */ struct segment *BoxPath(S, h, w) struct XYspace *S; int h,w; { struct segment *path; path = Join( Line(ILoc(S, w, 0)), Line(ILoc(S, 0, h)) ); path = JoinSegment(path, LINETYPE, -path->dest.x, -path->dest.y, NULL); return(ClosePath(path)); } /* :h3.DropSegment() - Drop the First Segment in a Path This routine takes the path and returns a new path that is one segment shorter. It can be used in conjunction with QueryPath(), for example, to ask about an entire path. */ struct segment *DropSegment(path) register struct segment *path; { IfTrace1((MustTraceCalls),"DropSegment(%p)\n", path); if (path != NULL && path->type == STROKEPATHTYPE) path = CoercePath(path); ARGCHECK((path == NULL || !ISPATHANCHOR(path)), "DropSegment: arg not a non-null path", path, path, (0), struct segment *); if (path->type == TEXTTYPE) path = CoerceText(path); path = UniquePath(path); POP(path); return(path); } /* :h3.HeadSegment() - Return the First Segment in a Path This routine takes the path and returns a new path consists of the first segment only. */ struct segment *HeadSegment(path) register struct segment *path; /* input path */ { IfTrace1((MustTraceCalls),"HeadSegment(%p)\n", path); if (path == NULL) return(NULL); if (path->type == STROKEPATHTYPE) path = CoercePath(path); ARGCHECK(!ISPATHANCHOR(path), "HeadSegment: arg not a path", path, path, (0), struct segment *); if (path->type == TEXTTYPE) path = CoerceText(path); path = UniquePath(path); if (path->link != NULL) KillPath(path->link); path->link = NULL; path->last = path; return(path); } /* :h2.Path Debug Routines :h3.DumpPath() - Display a Path on the Trace File removed by RMz, 1999-06-07 */ /* void DumpPath(p) register struct segment *p; { register fractpel x,y; register fractpel lastx,lasty; DOUBLE roundness; IfTrace1(TRUE,"Dumping path, anchor=%p:\n", p); lastx = lasty = 0; for (;p != NULL; p=p->link) { IfTrace0(TRUE,". "); x = p->dest.x; y = p->dest.y; switch (p->type) { case LINETYPE: IfTrace1(TRUE,". line<%x> to", (LONG) p->flag); IfTrace4(TRUE," (%d,%d), delta=(%d,%d)", x + lastx, y + lasty, x, y); break; case MOVETYPE: IfTrace1(TRUE,"MOVE<%x> to", (LONG) p->flag); IfTrace4(TRUE,"(%d,%d), delta=(%d,%d)", x + lastx, y + lasty, x, y); break; case CONICTYPE: { register struct conicsegment *cp = (struct conicsegment *) p; roundness = cp->roundness; IfTrace2(TRUE, ". conic to (%d,%d),", x + lastx, y + lasty); IfTrace3(TRUE," M=(%d,%d), r=%p", cp->M.x + lastx, cp->M.y + lasty, &roundness); } break; case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) p; IfTrace4(TRUE,". bezier to (%d,%d), B=(%d,%d)", x + lastx, y + lasty, bp->B.x + lastx, bp->B.y + lasty); IfTrace2(TRUE, ", C=(%d,%d)", bp->C.x + lastx, bp->C.y + lasty); } break; case HINTTYPE: { register struct hintsegment *hp = (struct hintsegment *) p; IfTrace4(TRUE,". hint ref=(%d,%d), width=(%d,%d)", hp->ref.x + lastx, hp->ref.y + lasty, hp->width.x, hp->width.y); IfTrace4(TRUE, ", %c %c %c %c", hp->orientation, hp->hinttype, hp->adjusttype, hp->direction); IfTrace1(TRUE, ", %d", (LONG) hp->label); } break; case TEXTTYPE: DumpText(p); break; default: IfTrace0(TRUE, "bad path segment?"); } IfTrace1(TRUE," at %p\n", p); lastx += x; lasty += y; } } */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/t1chardump0000664000175000017500000005102011742726711023314 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1chardump ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2003-03-02 ----- Description: This file is part of the t1-library. It contains code responsible for dumping outline data to a PostScript file (used only for debugging. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2003. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ fputs( "\ %!PS-Adobe-2.0 EPSF-1.2\n\ %%Creator: t1lib\n\ %%Title: Type1Char Character Dump\n\ %%Pages: 1\n\ %%PageOrder: Ascend\n\ %%BoundingBox: 0 0 596 842\n\ %%DocumentPaperSizes: a4\n\ %%EndComments\n\ %!\n\ /T1LibDict 100 dict def \n\ T1LibDict begin\n\ % Setup the size from the type1 module\n\ /t1SetupSize {\n\ /size exch def\n\ } def\n\ \n\ % Prepare the page. Compute scales and fill the charspace unit square\n\ % background\n\ /t1PreparePage {\n\ \n\ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\ %\n\ % Start of Customizable Section\n\ %\n\ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\ \n\ % Setup a standard linewidth\n\ /t1dumpstdlinewidth 1.0 def\n\ % Setup a scale for drawing direction arrows\n\ /arrowscale 3.0 def\n\ \n\ % Should we draw the device pixel grid? (1=yes, otherwise no)\n\ /t1drawgrid 1 def\n\ % Should we draw stems? (1=yes, otherwise no)\n\ /t1drawstems 1 def\n\ % Should we draw alignment zones? (1=yes, otherwise no)\n\ /t1drawzones 1 def\n\ % Should we fill the charspace unit square? (1=yes, otherwise no)\n\ /t1fillunitsquare 1 def\n\ % Should we fill the device page? (1=yes, otherwise no)\n\ /t1fillpage 1 def\n\ % Should we show path segment On-Curve points? (1=yes, otherwise no)\n\ /t1showoncurvepoints 1 def\n\ % Should we show path segment Off Curve points? (1=yes, otherwise no)\n\ /t1showoffcurvepoints 1 def\n\ % Should we show Bezier tangets and their defining points? (1=yes, otherwise no)\n\ /t1showbeziertangents 1 def\n\ \n\ % Define a few colors\n\ /t1linecolor { 0.0 0.0 0.0 } def\n\ /t1hlinecolor { 1.0 0.0 0.0 } def\n\ /t1slinecolor { 1.0 1.0 1.0 } def\n\ /t1movecolor { 0.0 0.0 0.0 } def\n\ /t1hmovecolor { 1.0 0.0 0.0 } def\n\ /t1smovecolor { 1.0 1.0 1.0 } def\n\ /t1curvecolor { 0.0 0.0 0.0 } def\n\ /t1hcurvecolor { 1.0 0.0 0.0 } def\n\ /t1scurvecolor { 0.0 0.0 1.0 } def\n\ /t1sprolongatecolor { 1.0 0.0 1.0 } def\n\ /t1stemcolor { 0.0 0.0 1.0 } def\n\ /t1alignedstemcolor { 1.0 0.0 1.0 } def\n\ /t1bottomzonecolor { 1.0 1.0 0.0 } def\n\ /t1topzonecolor { 1.0 1.0 0.0 } def\n\ /t1arrowcolor { 0.0 0.0 0.0 } def\n\ /t1harrowcolor { 1.0 0.0 0.0 } def\n\ /t1sarrowcolor { 0.0 0.0 1.0 } def\n\ /t1sbwcolor { 0.0 0.0 0.0 } def\n\ /t1closepathcolor { 0.0 0.0 0.0 } def\n\ /t1hclosepathcolor { 1.0 0.0 0.0 } def\n\ /t1sclosepathcolor { 0.0 0.0 1.0 } def\n\ /t1pagecolor { 0.7 0.7 0.7 } def\n\ /t1unitsquarecolor { 0.4 0.4 0.4 } def\n\ /t1gridcolor { 0.0 0.0 0.0 } def\n\ \n\ % Line scale relative to the standard linewidth /t1linescale 0.4 def\n\ /t1hlinescale 0.4 def\n\ /t1slinescale 0.4 def\n\ /t1movescale 0.4 def\n\ /t1hmovescale 0.4 def\n\ /t1smovescale 0.4 def\n\ /t1curvescale 0.4 def\n\ /t1hcurvescale 0.4 def\n\ /t1scurvescale 0.4 def\n\ /t1curvetangentscale 0.5 def\n\ /t1sprolongatescale 0.4 def\n\ /t1stemscale 0.5 def\n\ /t1alignedstemscale 0.5 def\n\ /t1bottomzonescale 0.5 def\n\ /t1topzonescale 0.5 def\n\ /t1closepathscale 0.4 def\n\ /t1hclosepathscale 0.4 def\n\ /t1sclosepathscale 0.4 def\n\ /t1gridscale 0.5 def\n\ \n\ % Line dash specifications (stems and zones are not configurable!) /t1linedash { [] 0 } def\n\ /t1hlinedash { [] 0 } def\n\ /t1slinedash { [] 0 } def\n\ /t1movedash { [2 2] 0 } def\n\ /t1hmovedash { [2 2] 0 } def\n\ /t1smovedash { [2 2] 0 } def\n\ /t1curvedash { [] 0 } def\n\ /t1hcurvedash { [] 0 } def\n\ /t1scurvedash { [] 0 } def\n\ /t1sprolongatedash { [1 1] 0 }def\n\ /t1closepathdash { [] 0 } def\n\ /t1hclosepathdash { [] 0 } def\n\ /t1sclosepathdash { [] 0 } def\n\ /t1griddash { [3 3] 0 } def\n\ \n\ % Define a clipping rectangle ROI (in charspace coordinates)\n\ /t1ROIxmin -200 def\n\ /t1ROIxmax 1200 def\n\ /t1ROIymin -500 def\n\ /t1ROIymax 1200 def\n\ \n\ % Device values (in bp). These must match the Bounding Box Statement!\n\ /xmindev 0 neg def\n\ /xmaxdev 596 def\n\ /ymindev 0 neg def\n\ /ymaxdev 842 def\n\ /dxdev 1 def\n\ /dydev 1 def\n\ \n\ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\ %\n\ % End of Customizable Section\n\ %\n\ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\ \n\ % logical pixel values\n\ /xminpixel t1ROIxmin 1000.0 div size mul def\n\ /xmaxpixel t1ROIxmax 1000.0 div size mul def\n\ /yminpixel t1ROIymin 1000.0 div size mul def\n\ /ymaxpixel t1ROIymax 1000.0 div size mul def\n\ /dxpixel 1 def\n\ /dypixel 1 def\n\ \n\ % compute scales and set minimum scale\n\ /scalex xmaxdev xmindev sub xmaxpixel xminpixel sub div def\n\ /scaley ymaxdev ymindev sub ymaxpixel yminpixel sub div def\n\ scalex scaley gt { /scale scaley def } { /scale scalex def } ifelse\n\ \n\ % Fill device page\n\ xmindev ymindev moveto\n\ xmaxdev 0 rlineto\n\ 0 ymaxdev rlineto\n\ xmaxdev neg 0 rlineto\n\ 0 ymaxdev neg rlineto\n\ closepath\n\ clip\n\ t1fillpage 1 eq\n\ {\n\ t1pagecolor setrgbcolor\n\ fill\n\ } if\n\ \n\ % reassign device values\n\ /xmindev xminpixel scale mul def\n\ /xmaxdev xmaxpixel scale mul def\n\ /ymindev yminpixel scale mul def\n\ /ymaxdev ymaxpixel scale mul def\n\ /dxdev dxpixel scale mul def\n\ /dydev dypixel scale mul def\n\ \n\ % translate coordinate system \n\ xminpixel scale mul neg yminpixel scale mul neg translate\n\ \n\ % Fill unit square of charspace coordinate system \n\ t1fillunitsquare 1 eq\n\ {\n\ t1unitsquarecolor setrgbcolor\n\ 0 0 moveto\n\ size scale mul 0 rlineto\n\ 0 size scale mul rlineto\n\ size scale mul neg 0 rlineto\n\ 0 size scale mul neg rlineto\n\ closepath fill\n\ } if\n\ } def\n\ \n\ /t1FinishPage {\n\ t1drawgrid 1 eq\n\ {\n\ t1gridcolor setrgbcolor\n\ t1gridscale setlinewidth\n\ t1griddash setdash\n\ % draw grid and align to the point (0,0)\n\ 0 dxdev xmaxdev {\n\ /xval exch def\n\ xval ymindev moveto\n\ xval ymaxdev lineto\n\ stroke\n\ } for\n\ 0 dxdev neg xmindev {\n\ /xval exch def\n\ xval ymindev moveto\n\ xval ymaxdev lineto\n\ stroke\n\ } for\n\ 0 dydev ymaxdev {\n\ /yval exch def\n\ xmindev yval moveto\n\ xmaxdev yval lineto\n\ stroke\n\ } for\n\ 0 dydev neg ymindev {\n\ /yval exch def\n\ xmindev yval moveto\n\ xmaxdev yval lineto\n\ stroke\n\ } for\n\ } if\n\ } def\n\ \n\ % Define three arrow routines available for later providing the output with directions\n\ /t1arrowhead {\n\ /tmpy exch def\n\ /tmpx exch def\n\ gsave\n\ t1arrowcolor setrgbcolor\n\ currx curry translate\n\ tmpy tmpx atan rotate\n\ newpath\n\ 0 0 moveto\n\ 0 2 arrowscale currentlinewidth neg mul mul rlineto\n\ 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto\n\ 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto\n\ closepath\n\ fill\n\ grestore\n\ tmpx\n\ tmpy\n\ } def\n\ /t1harrowhead {\n\ /tmpy exch def\n\ /tmpx exch def\n\ gsave\n\ t1harrowcolor setrgbcolor\n\ currhx currhy translate\n\ tmpy tmpx atan rotate\n\ newpath\n\ 0 0 moveto\n\ 0 2 arrowscale currentlinewidth neg mul mul rlineto\n\ 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto\n\ 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto\n\ closepath\n\ fill\n\ grestore\n\ tmpx\n\ tmpy\n\ } def\n\ /t1sarrowhead {\n\ /tmpy exch def\n\ /tmpx exch def\n\ gsave\n\ t1sarrowcolor setrgbcolor\n\ currsx currsy translate\n\ tmpy tmpx atan rotate\n\ newpath\n\ 0 0 moveto\n\ 0 2 arrowscale currentlinewidth neg mul mul rlineto\n\ 6 arrowscale currentlinewidth mul mul 2 arrowscale currentlinewidth mul mul rlineto\n\ 6 arrowscale currentlinewidth mul mul neg 2 arrowscale currentlinewidth mul mul rlineto\n\ closepath\n\ fill\n\ grestore\n\ tmpx\n\ tmpy\n\ } def\n\ \n\ /t1rlineto {\n\ /y2 exch scale mul def\n\ /x2 exch scale mul def\n\ t1linecolor setrgbcolor\n\ t1linedash setdash\n\ t1linescale t1dumpstdlinewidth mul setlinewidth\n\ t1showoncurvepoints 1 eq\n\ {\n\ newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ currx curry moveto\n\ x2 y2 rlineto\n\ stroke\n\ /currx currx x2 add def\n\ /curry curry y2 add def\n\ } def\n\ \n\ /t1srlineto {\n\ /y2 exch scale mul def\n\ /x2 exch scale mul def\n\ t1slinecolor setrgbcolor\n\ t1slinedash setdash\n\ t1slinescale t1dumpstdlinewidth mul setlinewidth\n\ t1showoncurvepoints 1 eq\n\ {\n\ newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ currsx currsy moveto\n\ x2 y2 rlineto\n\ stroke\n\ /currsx currsx x2 add def\n\ /currsy currsy y2 add def\n\ } def\n\ \n\ /t1sprolongate {\n\ /y2 exch scale mul def\n\ /x2 exch scale mul def\n\ t1sprolongatecolor setrgbcolor\n\ t1sprolongatedash setdash\n\ t1sprolongatescale t1dumpstdlinewidth mul setlinewidth\n\ t1showoncurvepoints 1 eq\n\ {\n\ newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ currsx currsy moveto\n\ x2 y2 rlineto\n\ stroke\n\ /currsx currsx x2 add def\n\ /currsy currsy y2 add def\n\ } def\n\ \n\ /t1hintedrlineto {\n\ /y2 exch scale mul def\n\ /x2 exch scale mul def\n\ t1hlinecolor setrgbcolor\n\ t1hlinedash setdash\n\ t1hlinescale t1dumpstdlinewidth mul setlinewidth\n\ t1showoncurvepoints 1 eq\n\ {\n\ newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ currhx currhy moveto\n\ x2 y2 rlineto\n\ stroke\n\ /currhx currhx x2 add def\n\ /currhy currhy y2 add def\n\ } def\n\ \n\ /t1rmoveto {\n\ /y2 exch scale mul def\n\ /x2 exch scale mul def\n\ t1movecolor setrgbcolor\n\ t1movedash setdash\n\ t1movescale t1dumpstdlinewidth mul setlinewidth\n\ t1showoncurvepoints 1 eq\n\ {\n\ newpath currx x2 add curry y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ currx curry moveto\n\ x2 y2 rlineto\n\ stroke\n\ /currx currx x2 add def\n\ /curry curry y2 add def\n\ /startx currx def\n\ /starty curry def\n\ } def\n\ \n\ /t1srmoveto {\n\ /y2 exch scale mul def\n\ /x2 exch scale mul def\n\ t1smovecolor setrgbcolor\n\ t1smovedash setdash\n\ t1smovescale t1dumpstdlinewidth mul setlinewidth\n\ t1showoncurvepoints 1 eq\n\ {\n\ newpath currsx x2 add currsy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ currsx currsy moveto\n\ x2 y2 rlineto\n\ stroke\n\ /currsx currsx x2 add def\n\ /currsy currsy y2 add def\n\ /startsx currsx def\n\ /startsy currsy def\n\ } def\n\ \n\ /t1hintedrmoveto {\n\ /y2 exch scale mul def\n\ /x2 exch scale mul def\n\ t1hmovecolor setrgbcolor\n\ t1hmovedash setdash\n\ t1hmovescale t1dumpstdlinewidth mul setlinewidth\n\ t1showoncurvepoints 1 eq\n\ {\n\ newpath currhx x2 add currhy y2 add 1.5 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ currhx currhy moveto\n\ x2 y2 rlineto\n\ stroke\n\ /currhx currhx x2 add def\n\ /currhy currhy y2 add def\n\ /starthx currhx def\n\ /starthy currhy def\n\ } def\n\ \n\ /t1rrcurveto {\n\ /y4 exch scale mul def\n\ /x4 exch scale mul def\n\ /y3 exch scale mul def\n\ /x3 exch scale mul def\n\ /y2 exch scale mul def\n\ /x2 exch scale mul def\n\ t1curvecolor setrgbcolor\n\ t1curvedash setdash\n\ t1curvescale t1dumpstdlinewidth mul setlinewidth\n\ t1showoffcurvepoints 1 eq\n\ {\n newpath currx x2 add curry y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill\n\ newpath currx x2 x3 add add curry y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ t1showoncurvepoints 1 eq\n\ {\n\ newpath currx x2 x3 x4 add add add curry y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ t1showbeziertangents 1 eq\n\ {\n\ [2 2] 0 setdash\n\ t1curvetangentscale currentlinewidth mul setlinewidth\n\ currx curry moveto\n\ currx x2 add curry y2 add lineto\n\ stroke\n\ currx x2 x3 add add curry y2 y3 add add moveto\n\ currx x2 x3 x4 add add add curry y2 y3 y4 add add add lineto\n\ stroke\n\ } if\n\ t1curvedash setdash\n\ t1curvescale t1dumpstdlinewidth mul setlinewidth\n\ currx curry moveto\n\ x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto\n\ stroke\n\ /currx currx x2 x3 x4 add add add def\n\ /curry curry y2 y3 y4 add add add def\n\ } def\n\ \n\ /t1srrcurveto {\n\ /y4 exch scale mul def\n\ /x4 exch scale mul def\n\ /y3 exch scale mul def\n\ /x3 exch scale mul def\n\ /y2 exch scale mul def\n\ /x2 exch scale mul def\n\ t1scurvecolor setrgbcolor\n\ t1scurvedash setdash\n\ t1scurvescale t1dumpstdlinewidth mul setlinewidth\n\ t1showoffcurvepoints 1 eq\n\ {\n\ newpath currsx x2 add currsy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill\n\ newpath currsx x2 x3 add add currsy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ t1showoncurvepoints 1 eq\n\ {\n\ newpath currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ t1showbeziertangents 1 eq\n\ {\n\ [2 2] 0 setdash\n\ t1curvetangentscale currentlinewidth mul setlinewidth\n\ currsx currsy moveto\n\ currsx x2 add currsy y2 add lineto\n\ stroke\n\ currsx x2 x3 add add currsy y2 y3 add add moveto\n\ currsx x2 x3 x4 add add add currsy y2 y3 y4 add add add lineto\n\ stroke\n\ } if\n\ t1scurvedash setdash\n\ t1scurvescale t1dumpstdlinewidth mul setlinewidth\n\ currsx currsy moveto\n\ x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto\n\ stroke\n\ /currsx currsx x2 x3 x4 add add add def\n\ /currsy currsy y2 y3 y4 add add add def\n\ } def\n\ \n\ /t1hintedrrcurveto {\n\ /y4 exch scale mul def\n\ /x4 exch scale mul def\n\ /y3 exch scale mul def\n\ /x3 exch scale mul def\n\ /y2 exch scale mul def\n\ /x2 exch scale mul def\n\ t1hcurvecolor setrgbcolor\n\ t1hcurvedash setdash\n\ t1hcurvescale t1dumpstdlinewidth mul setlinewidth\n\ t1showoncurvepoints 1 eq\n\ {\n\ newpath currhx x2 add currhy y2 add 1.0 currentlinewidth mul 0 360 arc closepath fill\n\ newpath currhx x2 x3 add add currhy y2 y3 add add 1.0 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ t1showoncurvepoints 1 eq\n\ {\n\ newpath currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add 1.5 currentlinewidth mul 0 360 arc closepath fill\n\ } if\n\ t1showbeziertangents 1 eq\n\ {\n\ [2 2] 0 setdash\n\ t1curvetangentscale currentlinewidth mul setlinewidth\n\ currhx currhy moveto\n\ currhx x2 add currhy y2 add lineto\n\ stroke\n\ currhx x2 x3 add add currhy y2 y3 add add moveto\n\ currhx x2 x3 x4 add add add currhy y2 y3 y4 add add add lineto\n\ stroke\n\ } if\n\ t1hcurvedash setdash\n\ t1hcurvescale t1dumpstdlinewidth mul setlinewidth\n\ currhx currhy moveto\n\ x2 y2 x2 x3 add y2 y3 add x2 x3 x4 add add y2 y3 y4 add add rcurveto\n\ stroke\n\ /currhx currhx x2 x3 x4 add add add def\n\ /currhy currhy y2 y3 y4 add add add def\n\ } def\n\ \n\ /t1sbw {\n\ /wy exch scale mul def\n\ /wx exch scale mul def\n\ /sby exch scale mul def\n\ /sbx exch scale mul def\n\ t1sbwcolor setrgbcolor\n\ newpath sbx sby 3 0 360 arc closepath fill\n\ newpath wx wy 3 0 360 arc closepath fill\n\ /currx sbx def\n\ /curry sby def\n\ /currhx sbx def\n\ /currhy sby def\n\ /currsx sbx def\n\ /currsy sby def\n\ } def\n\ \n\ /t1closepath {\n\ t1closepathdash setdash\n\ t1closepathscale t1dumpstdlinewidth mul setlinewidth\n\ t1closepathcolor setrgbcolor\n\ currx curry moveto\n\ startx starty lineto\n\ stroke\n\ } def\n\ \n\ /t1sclosepath {\n\ t1sclosepathdash setdash\n\ t1sclosepathscale t1dumpstdlinewidth mul setlinewidth\n\ t1sclosepathcolor setrgbcolor\n\ currsx currsy moveto\n\ startsx startsy lineto\n\ stroke\n\ } def\n\ \n\ /t1hintedclosepath {\n\ t1hclosepathdash setdash\n\ t1hclosepathscale t1dumpstdlinewidth mul setlinewidth\n\ t1hclosepathcolor setrgbcolor\n\ currhx currhy moveto\n\ starthx starthy lineto\n\ stroke\n\ } def\n\ \n\ /t1vstem {\n\ t1drawstems 1 eq\n\ {\n\ /stemwidth exch scale mul def\n\ /stemstart exch scale mul def\n\ t1stemscale t1dumpstdlinewidth mul setlinewidth\n\ t1stemcolor setrgbcolor\n\ [] 0 setdash\n\ stemstart ymindev moveto\n\ stemstart ymaxdev lineto\n\ stroke\n\ [2 2] 0 setdash\n\ stemwidth stemstart add ymindev moveto\n\ stemwidth stemstart add ymaxdev lineto\n\ stroke\n\ } if\n\ } def\n\ \n\ /t1alignedvstem {\n\ t1drawstems 1 eq\n\ {\n\ /stemwidth exch scale mul def\n\ /stemstart exch scale mul def\n\ t1alignedstemscale t1dumpstdlinewidth mul setlinewidth\n\ t1alignedstemcolor setrgbcolor\n\ [] 0 setdash\n\ stemstart ymindev moveto\n\ stemstart ymaxdev lineto\n\ stroke\n\ [2 2] 0 setdash\n\ stemwidth stemstart add ymindev moveto\n\ stemwidth stemstart add ymaxdev lineto\n\ stroke\n\ } if\n\ } def\n\ \n\ /t1hstem {\n\ t1drawstems 1 eq\n\ {\n\ /stemwidth exch scale mul def\n\ /stemstart exch scale mul def\n\ t1stemscale t1dumpstdlinewidth mul setlinewidth\n\ t1stemcolor setrgbcolor\n\ [] 0 setdash\n\ xmindev stemstart moveto\n\ xmaxdev stemstart lineto\n\ stroke\n\ [2 2] 0 setdash\n\ xmindev stemwidth stemstart add moveto\n\ xmaxdev stemwidth stemstart add lineto\n\ stroke\n\ } if\n\ } def\n\ \n\ /t1alignedhstem {\n\ t1drawstems 1 eq\n\ {\n\ /stemwidth exch scale mul def\n\ /stemstart exch scale mul def\n\ t1alignedstemscale t1dumpstdlinewidth mul setlinewidth\n\ t1alignedstemcolor setrgbcolor\n\ [] 0 setdash\n\ xmindev stemstart moveto\n\ xmaxdev stemstart lineto\n\ stroke\n\ [2 2] 0 setdash\n\ xmindev stemwidth stemstart add moveto\n\ xmaxdev stemwidth stemstart add lineto\n\ stroke\n\ } if\n\ } def\n\ \n\ /t1bottomzone {\n\ t1drawzones 1 eq\n\ {\n\ /bottom exch scale mul def\n\ /top exch scale mul def\n\ t1bottomzonescale t1dumpstdlinewidth mul setlinewidth\n\ t1bottomzonecolor setrgbcolor\n\ [] 0 setdash\n\ xmindev bottom moveto\n\ xmaxdev bottom lineto\n\ stroke\n\ [2 2] 0 setdash\n\ xmindev top moveto\n\ xmaxdev top lineto\n\ stroke\n\ } if\n\ } def\n\ \n\ /t1topzone {\n\ t1drawzones 1 eq\n\ {\n\ /bottom exch scale mul def\n\ /top exch scale mul def\n\ t1topzonescale t1dumpstdlinewidth mul setlinewidth\n\ t1topzonecolor setrgbcolor\n\ [2 2] 0 setdash\n\ xmindev bottom moveto\n\ xmaxdev bottom lineto\n\ stroke\n\ [] 0 setdash\n\ xmindev top moveto\n\ xmaxdev top lineto\n\ stroke\n\ } if\n\ } def\n\ \n\ end\n\ \n\ % Next follows drawing code from charstring commands:\n", fp); xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/strokes.h0000664000175000017500000000323711742726711023173 0ustar uwabamiuwabami/* $XConsortium: strokes.h,v 1.2 91/10/10 11:19:25 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /*STUB*/ #define CopyLineStyle(s) s #define CopyStrokePath(p) p #define KillStrokePath(p) #define KillLineStyle(s) #define CoercePath(sp) sp #define DoStroke(sp) sp xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/fsmasks.h0000664000175000017500000000545511742726711023154 0ustar uwabamiuwabami/* $XConsortium: fsmasks.h,v 1.2 91/05/13 16:46:16 gildea Exp $ */ /* * Copyright 1990, 1991 Network Computing Devices; * Portions Copyright 1987 by Digital Equipment Corporation and the * Massachusetts Institute of Technology * * Permission to use, copy, modify, and distribute this protoype software * and its documentation to Members and Affiliates of the MIT X Consortium * any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the names of Network Computing Devices, Digital or * MIT not be used in advertising or publicity pertaining to distribution of * the software without specific, written prior permission. * * NETWORK COMPUTING DEVICES, DIGITAL AND MIT DISCLAIM ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES, DIGITAL OR MIT BE * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * @(#)fsmasks.h 4.1 91/05/02 * */ /* * masks & values used by the font lib and the font server */ #ifndef _FSMASKS_H_ #define _FSMASKS_H_ #include "types.h" /* font format macros */ #define BitmapFormatByteOrderMask (1L << 0) #define BitmapFormatBitOrderMask (1L << 1) #define BitmapFormatImageRectMask (3L << 2) #define BitmapFormatScanlinePadMask (3L << 8) #define BitmapFormatScanlineUnitMask (3L << 12) #define BitmapFormatByteOrderLSB (0) #define BitmapFormatByteOrderMSB (1L << 0) #define BitmapFormatBitOrderLSB (0) #define BitmapFormatBitOrderMSB (1L << 1) #define BitmapFormatImageRectMin (0L << 2) #define BitmapFormatImageRectMaxWidth (1L << 2) #define BitmapFormatImageRectMax (2L << 2) #define BitmapFormatScanlinePad8 (0L << 8) #define BitmapFormatScanlinePad16 (1L << 8) #define BitmapFormatScanlinePad32 (2L << 8) #define BitmapFormatScanlinePad64 (3L << 8) #define BitmapFormatScanlineUnit8 (0L << 12) #define BitmapFormatScanlineUnit16 (1L << 12) #define BitmapFormatScanlineUnit32 (2L << 12) #define BitmapFormatScanlineUnit64 (3L << 12) #define BitmapFormatMaskByte (1L << 0) #define BitmapFormatMaskBit (1L << 1) #define BitmapFormatMaskImageRectangle (1L << 2) #define BitmapFormatMaskScanLinePad (1L << 3) #define BitmapFormatMaskScanLineUnit (1L << 4) typedef ULONG fsBitmapFormat; typedef ULONG fsBitmapFormatMask; #endif /* _FSMASKS_H_ */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/CHANGES0000664000175000017500000000723411742726711022324 0ustar uwabamiuwabamiThis are the sources as I have found them on the X11R5 distribution. In order to use them for my purpose (ps2pk: conversion tool for Type1 fonts to packed TeX fonts) a number of changes were needed (see Changelog). --Piet internet: rcpt@urc.tue.nl | Piet Tutelaers bitnet: rcpt@heitue5.BITNET | Computer Center Room RC 1.90 phone: +31 (0)40 474541 | Eindhoven University of Technology fax: +31 (0)40 434438 | P.O. Box 513, 5600 MB Eindhoven, NL Changelog (the main-line): -------------------------- 92-02: Start of ps2pk project - decoupling Type1 library from X11 (changes in t1intf.h + t1funcs.h; added Xstuff.h to replace X header files) - user definable encoding schemes (removed hardwired ISOLatin1 and Symbol encodings from t1funcs.c and replaced by encoding paramater in Type1OpenScalable) 92-03: First release 1.0 (pre-release) 92-04: - added expansion and slanting features as suggested by Lee Hetherington (changes in spaces.c, t1funcs.c) - changed t1test.c in order to test above features; added ISOLatin1 encoding vector. - README2 replaced by CHANGES (this file) - MSDOS concession (thanks to Sebastian Rahtz): renamed fontfilest.h to ffilest.h so it does not clash with fontfile.h (affects: fontfilest.h (->ffilest.h), t1funcs.c, t1info.c and t1test.c). - MSDOS concession: all file extensions .c.orig and .h.orig renamed to .crg respectivally .hrg - patch to handle /negationslash and /mapsto from LucidaMath-Symbol correctly in t1funcs.c (ILH: Lee Hetherington). 92-05: AMIGA/Aztec: - added type1.ami (contains order of objects in library) - added Makefile.ami - added bstring.c (contains a bzero()) 92-05: - fixed a reference to a NULL pointer in t1info.c - more verbose error messages in type1 library (NDW: Norman Walsh) - changed memory heuristic in type1 library from static (one chunk) into dynamic (up to a maximum of 10 chunks). This was needed for big fonts like daysrib.pfa (reported by Norman Walsh). (Changes in t1funcs.c and t1malloc.c) - added Makefile.tcc for MSDOS/Turbo C, removed Makefile.dos 92-06: - added Makefile.djg for MSDOS/GCC 386 (djgpp) - fixed bug in t1io.c so MSDOS can read its own .pfb format 92-08: - fixed alligment problem for machines with wordlength other than 32 bits (patch in util.c). Reported by J"urgen Marenda for DataGeneral AViiON (Motorola M88k machine) - The type1 library did not render Oblique fonts correctly. Erik Schenk provided a patch for this problem (patches in fontfcn.c and t1util.c). - Official X11.5 patches (Stephen Gildea 920728) merged in the type1 library version of ps2pk. These patches were available on: export.lcs.mit.edu:/pub/R5/contrib-fixes/Type1.patch - portability: index() in t1info.c replaced by strchr() 94-01: Version 1.4 (bug fix release) - types.h: added basic type definitions for non 32-bit platforms - fontfcn.c: made `virtual memory' management dynamically (reported by Norman Walsh, needed for complicated fonts) - Makefile.*: improved - original X11R5 sources no longer included (see X11R5 sources if you want to see them) - t1malloc.c removed, not longer needed. 95-11 Version 1.5 - Makefile.bcc, Makefile.djg and Makefile.wat removed in favour of Makefile.unx and Makefile.emx - bzero() dropped in favour of ANSI C's memset() - Improved cooperation between the master makefile and its depending makefiles (thanks ) xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/token.c0000664000175000017500000006666311742726711022630 0ustar uwabamiuwabami/* $XConsortium: token.c,v 1.2 91/10/10 11:19:55 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Authors: Sig Nin & Carol Thompson IBM Almaden Research Laboratory */ #include "types.h" #include "t1stdio.h" #include "util.h" #include "digit.h" #include "token.h" #include "tokst.h" #include "hdigit.h" /* * ------------------------------------------------------------------- * Globals * ------------------------------------------------------------------- */ extern int T1Getc(F_FILE * ), T1Ungetc( int,F_FILE *); /* These variables are set by the caller */ char *tokenStartP; /* Pointer to token buffer in VM */ char *tokenMaxP; /* Pointer to last byte in buffer + 1 */ /* These variables are set by TOKEN */ int tokenLength; /* Characters in token */ boolean tokenTooLong; /* Token too long for buffer */ int tokenType; /* Type of token identified */ psvalue tokenValue; /* Token value */ /* * ------------------------------------------------------------------- * Private variables * ------------------------------------------------------------------- */ static FILE *inputFileP; /* Current input file */ /* Token */ static char *tokenCharP; /* Pointer to next character in token */ /* * ------------------------------------------------------------------- * Private routines for manipulating numbers * ------------------------------------------------------------------- */ #define Exp10(e) \ ((e) == 0\ ? (DOUBLE)(1.0)\ : (-64 <= (e) && (e) <= 63\ ? Exp10T[(e)+64]\ : P10(e)\ )\ ) static DOUBLE Exp10T[128] = { 1e-64, 1e-63, 1e-62, 1e-61, 1e-60, 1e-59, 1e-58, 1e-57, 1e-56, 1e-55, 1e-54, 1e-53, 1e-52, 1e-51, 1e-50, 1e-49, 1e-48, 1e-47, 1e-46, 1e-45, 1e-44, 1e-43, 1e-42, 1e-41, 1e-40, 1e-39, 1e-38, 1e-37, 1e-36, 1e-35, 1e-34, 1e-33, 1e-32, 1e-31, 1e-30, 1e-29, 1e-28, 1e-27, 1e-26, 1e-25, 1e-24, 1e-23, 1e-22, 1e-21, 1e-20, 1e-19, 1e-18, 1e-17, 1e-16, 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, 1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39, 1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47, 1e48, 1e49, 1e50, 1e51, 1e52, 1e53, 1e54, 1e55, 1e56, 1e57, 1e58, 1e59, 1e60, 1e61, 1e62, 1e63 }; static DOUBLE P10(exponent) LONG exponent; { DOUBLE value, power; if (exponent < 0) { power = 0.1; value = (exponent & 1 ? power : 1.0); exponent = -((exponent+1) >> 1); /* portable C for -(exponent/2) */ } else { power = 10.0; value = (exponent & 1 ? power : 1.0); exponent = exponent >> 1; } while(exponent > 0) { power *= power; if (exponent & 1) value *= power; exponent >>= 1; } return(value); } /* * ------------------------------------------------------------------- * Private routines and macros for manipulating the input * ------------------------------------------------------------------- */ /* Get next character from the input -- * */ #define next_ch() (getc(inputFileP)) /* Push a character back into the input -- * * Ungetc of EOF will fail, but that's ok: the next getc will * return EOF. * * NOTE: These macros are presently written to return the character * pushed, or EOF if none was pushed. However, they are not * required to return anything in particular, and callers should * not rely on the returned value. */ #define back_ch(ch) (ungetc(ch, inputFileP)) /* Push a character back into the input if it was not white space. * If it is a carriage return (\r) then check next char for * linefeed and consume them both, otherwise put next char back. * */ #define back_ch_not_white(ch) \ (\ isWHITE_SPACE(ch)\ ? ((ch == '\r')\ ? (((ch = next_ch()) == '\n')\ ? EOF\ : back_ch(ch)\ )\ : EOF\ )\ : back_ch(ch)\ ) /* * ------------------------------------------------------------------- * Private routines and macros for manipulating the token buffer * ------------------------------------------------------------------- */ /* Add a character to the token * ---- use ONLY when you KNOW that this character will * be stored within the token buffer. */ #define save_unsafe_ch(ch) (*tokenCharP++ = ch) /* Add a character to the token, if not too long to fit */ #define save_ch(ch) \ ((tokenCharP < tokenMaxP)\ ? save_unsafe_ch(ch)\ : (tokenTooLong = TRUE)\ ) /* * ------------------------------------------------------------------- * Action Routines * * These routines all * -- take int ch as a parameter * -- return int ch if no token was recognized, DONE otherwise * -- leave the next character in the input, if returning DONE * ------------------------------------------------------------------- */ #define DONE (256) /* Get the next input character */ static int next_char(ch) int ch; { return(next_ch()); } /* Add character to token */ static int add_char(ch) int ch; { save_ch(ch); return(next_ch()); } /* ------------------------------------------------------------------- * Skip white space and comments */ /* Skip white space */ static int skip_space(ch) int ch; { do { ch = next_ch(); } while(isWHITE_SPACE(ch)); return(ch); } /* Skip comments */ static int skip_comment(ch) int ch; { do { ch = next_ch(); } while(isCOMMENT(ch)); return(ch); } /* ------------------------------------------------------------------- * Collect value elements for a number */ /* decimal integer or real number mantissa */ static int m_sign; static LONG m_value; static LONG m_scale; /* real number exponent */ static int e_sign; static LONG e_value; static LONG e_scale; /* radix number */ static LONG r_base; static LONG r_value; static LONG r_scale; static int add_sign(ch) int ch; { m_sign = ch; save_unsafe_ch(ch); return(next_ch()); } static int add_1st_digits(ch) int ch; { m_sign = '+'; return(add_digits(ch)); } static int add_digits(ch) int ch; { LONG value, p_value, scale; int digit; /* On entry, expect m_sign to be set to '+' or '-'; * ch is a decimal digit. * Expect at most one character saved at this point, * a sign. This routine will save up to 10 more * characters without checking the buffer boundary. */ value = ch - '0'; save_unsafe_ch(ch); ch = next_ch(); while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) { value = (value << 3) + (value << 1) + (ch - '0'); save_unsafe_ch(ch); ch = next_ch(); } /* Quick exit for small integers -- * |x| <= 10*((MAX_INTEGER/10)-1)+9 * |x| <= 2,147,483,639 for 32 bit integers */ if (isNUMBER_ENDER(ch)) { back_ch_not_white(ch); tokenValue.integer = (m_sign == '-' ? -value : value); tokenType = TOKEN_INTEGER; return(DONE); } /* Handle additional digits. Beyond the boundary case, * 10*(MAX_INTEGER/10) <= |number| <= MAX_INTEGER * just count the digits: the number is too large to * represent as an integer and will be returned as a real. * The mantissa of a real holds fewer bits than an integer. */ p_value = value; value = (m_sign == '-' ? -value : value); scale = 0; if (isDECIMAL_DIGIT(ch)) { /* Handle the boundary case */ if (p_value == (MAX_INTEGER/10)) { digit = ch - '0'; /* Must handle positive and negative values separately */ /* for 2's complement arithmetic */ if (value > 0) { if (digit <= MAX_INTEGER%10) value = (value << 3) + (value << 1) + digit; else ++scale; /* Too big, just count it */ } else { /* Use positive % operands for portability */ if (digit <= -(MIN_INTEGER+10)%10) value = (value << 3) + (value << 1) - digit; else ++scale; /* Too big, just count it */ } } else ++scale; /* Not boundary case, just count digit */ save_unsafe_ch(ch); ch = next_ch(); /* Continue scanning digits, but can't store them */ while(isDECIMAL_DIGIT(ch)) { ++scale; save_ch(ch); ch = next_ch(); } } /* Continue from here scanning radix integer or real */ m_value = value; m_scale = scale; /* Initialize for possible real */ e_sign = '+'; e_value = 0; e_scale = 0; return(ch); } static int add_1st_decpt(ch) int ch; { m_sign = '+'; return(add_decpt(ch)); } static int add_decpt(ch) int ch; { /* On entry, expect m_sign to be set to '+' or '-' */ m_value = 0; m_scale = 0; save_unsafe_ch(ch); return(next_ch()); } static int add_fraction(ch) int ch; { LONG value, scale; int digit; /* On entry, expect m_value and m_scale to be initialized, * and m_sign to be set to '+' or '-'. Expect m_value and m_sign * to be consistent (this is not checked). */ value = m_value; scale = m_scale; /* Scan leading zeroes */ if (value == 0) { while(ch == '0') { --scale; save_ch(ch); ch = next_ch(); } /* Scan first significant digit */ if (isDECIMAL_DIGIT(ch)) { --scale; value = ch - '0'; value = (m_sign == '-' ? -value : value); save_ch(ch); ch = next_ch(); } else /* no significant digits -- number is zero */ scale = 0; } /* value != 0 || value == 0 && !isDECIMAL_DIGIT(ch) */ /* Scan additional significant digits */ if (isDECIMAL_DIGIT(ch)) { if (value > 0) { while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) { --scale; value = (value << 3) + (value << 1) + (ch - '0'); save_ch(ch); ch = next_ch(); } /* Check boundary case */ if (isDECIMAL_DIGIT(ch) && value == (MAX_INTEGER/10)) { digit = ch - '0'; if (digit <= MAX_INTEGER%10) { --scale; value = (value << 3) + (value << 1) + digit; save_ch(ch); ch = next_ch(); } } } else { /* value < 0 */ while(isDECIMAL_DIGIT(ch) && value > -(-(MIN_INTEGER+10)/10+1)) { /* Use positive / operands for portability */ --scale; value = (value << 3) + (value << 1) - (ch - '0'); save_ch(ch); ch = next_ch(); } /* Check boundary case */ if (isDECIMAL_DIGIT(ch) && value == -(-(MIN_INTEGER+10)/10+1)) { digit = ch - '0'; if (digit <= -(MIN_INTEGER+10)%10) { /* Use positive % operands for portability */ --scale; value = (value << 3) + (value << 1) - digit; save_ch(ch); ch = next_ch(); } } } /* Additional digits can be discarded */ while(isDECIMAL_DIGIT(ch)) { save_ch(ch); ch = next_ch(); } } /* Store results */ m_value = value; m_scale = scale; /* Initialize for possible real */ e_sign = '+'; e_value = 0; e_scale = 0; return(ch); } static int add_e_sign(ch) int ch; { e_sign = ch; save_ch(ch); return(next_ch()); } static int add_exponent(ch) int ch; { LONG value, p_value; LONG scale = 0; int digit; /* On entry, expect e_sign to be set to '+' or '-' */ value = ch - '0'; save_ch(ch); ch = next_ch(); while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) { value = (value << 3) + (value << 1) + (ch - '0'); save_ch(ch); ch = next_ch(); } p_value = value; value = (e_sign == '-' ? -value : value); /* Handle additional digits. Beyond the boundary case, * 10*(MAX_INTEGER/10) <= |number| <= MAX_INTEGER * just count the digits: the number is too large to * represent as an integer. */ if (isDECIMAL_DIGIT(ch)) { /* Examine boundary case */ if (p_value == (MAX_INTEGER/10)) { digit = ch - '0'; /* Must handle positive and negative values separately */ /* for 2's complement arithmetic */ if (value > 0) { if (digit <= MAX_INTEGER%10) value = (value << 3) + (value << 1) + digit; else ++scale; /* Too big, just count it */ } else { /* Use positive % operands for portability */ if (digit <= -(MIN_INTEGER+10)%10) value = (value << 3) + (value << 1) - digit; else ++scale; /* Too big, just count it */ } } else ++scale; /* Not boundary case, just count digit */ save_ch(ch); ch = next_ch(); /* Continue scanning digits, but can't store any more */ while(isDECIMAL_DIGIT(ch)) { ++scale; save_ch(ch); ch = next_ch(); } } /* Store results */ e_value = value; e_scale = scale; return(ch); } static int add_radix(ch) int ch; { if (2 <= m_value && m_value <= 36 && m_scale == 0) { r_base = m_value; save_ch(ch); return(next_ch()); } else { /* Radix invalid, complete a name token */ return(AAH_NAME(ch)); } } static int add_r_digits(ch) int ch; { ULONG value; LONG radix, scale; int digit; /* NOTE: The syntax of a radix number allows only for * values of zero or more. The value will be stored as * a 32 bit integer, which PostScript then interprets * as signed. This means, for example, that the numbers: * * 8#37777777777 * 10#4294967295 * 16#FFFFFFFF * 36#1Z141Z3 * * are all interpreted as -1. This routine implements this * idea explicitly: it accumulates the number's value * as unsigned, then casts it to signed when done. */ /* Expect r_base to be initialized */ radix = r_base; value = 0; scale = 0; /* Scan leading zeroes */ while(ch == '0') { save_ch(ch); ch = next_ch(); } /* Handle first non-zero digit */ if ((digit=digit_value[ch]) < radix) { value = digit; save_ch(ch); ch = next_ch(); /* Add digits until boundary case reached */ while((digit=digit_value[ch]) < radix && value < (MAX_ULONG / radix)) { value = value * radix + digit; save_ch(ch); ch = next_ch(); }; /* Scan remaining digits */ if ((digit=digit_value[ch]) < radix) { /* Examine boundary case --- * radix*(MAX_ULONG/radix) <= number <= MAX_ULONG */ if (value == (MAX_ULONG/radix) && digit <= MAX_ULONG%radix) value = value * radix + digit; else ++scale; /* Continue scanning digits, but can't store them */ save_ch(ch); ch = next_ch(); while(digit_value[ch] < radix) { ++scale; save_ch(ch); ch = next_ch(); } } } /* Store result */ r_value = (LONG) value; /* result is signed */ r_scale = scale; return(ch); } /* ------------------------------------------------------------------- * Complete a number; set token type and done flag. * Put current input character back, if it is not white space. */ /* Done: Radix Number */ static int RADIX_NUMBER(ch) int ch; { back_ch_not_white(ch); if (r_scale == 0) { tokenValue.integer = r_value; tokenType = TOKEN_INTEGER; } else { tokenType = TOKEN_NAME; } return(DONE); } /* Done: Integer */ static int INTEGER(ch) int ch; { back_ch_not_white(ch); if (m_scale == 0) { tokenValue.integer = m_value; tokenType = TOKEN_INTEGER; } else { tokenValue.real = (DOUBLE)(m_value) * Exp10(m_scale); tokenType = TOKEN_REAL; } return(DONE); } /* Done: Real */ static int REAL(ch) int ch; { DOUBLE temp; back_ch_not_white(ch); /* NOTE: ignore e_scale, since e_value alone will cause * exponent overflow if e_scale > 0. */ /* HAZARD: exponent overflow of intermediate result * (e.g., in 370 floating point); this should not be a problem * with IEEE floating point. Reduce exponent overflow hazard by * combining m_scale and e_value first, if they have different signs, * or multiplying m_value and one of the other factors, if both * m_scale and e_value are negative. */ if ((m_scale >= 0 && e_value <= 0) || (m_scale <= 0 && e_value >= 0)) { tokenValue.real = (DOUBLE)(m_value) * Exp10(m_scale + e_value); } else { temp = (DOUBLE)(m_value) * Exp10(m_scale); tokenValue.real = temp * Exp10(e_value); } tokenType = TOKEN_REAL; return(DONE); } /* ------------------------------------------------------------------- * Assemble a hex string; set token type and done flag. */ /* Done: Hex String */ static int HEX_STRING(ch) int ch; { int value; while(TRUE) { /* Process odd digit */ ch = next_ch(); if (!isHEX_DIGIT(ch)) { /* Skip white space */ while(isWHITE_SPACE(ch)) ch = next_ch(); /* Check for terminator */ if (!isHEX_DIGIT(ch)) { break; } } value = digit_value[ch] << 4; /* Process even digit */ ch = next_ch(); if (!isHEX_DIGIT(ch)) { /* Skip white space */ while(isWHITE_SPACE(ch)) ch = next_ch(); /* Check for terminator */ if (!isHEX_DIGIT(ch)) { save_ch(value); break; } } save_ch(value + digit_value[ch]); } /* Classify result, based on why loop ended */ if (ch == '>') tokenType = TOKEN_HEX_STRING; else { /* save the invalid character for error reporting */ save_ch(ch); tokenType = TOKEN_INVALID; } return(DONE); } /* ------------------------------------------------------------------- * Assemble a string; set token type and done flag */ /* Save a backslash-coded character in a string -- * * Store the proper character for special cases * "\b", "\f", "\n", "\r", and "\t". * * Decode and store octal-coded character, up to * three octal digits, "\o", "\oo", and "\ooo". * * The sequence "\" is a line continuation, * so consume both without storing anything. * * The sequence "\" is an error; exit without * storing anything and let the caller handle it. * * For other characters, including the sequences * "\\", "\(", and "\)", simply store the second * character. */ static void save_digraph(ch) int ch; { int value; switch (ch) { case 'b': /* backspace */ ch = '\b'; break; case 'f': /* formfeed */ ch = '\f'; break; case 'n': /* newline */ ch = '\n'; break; case 'r': /* carriage return */ ch = '\r'; break; case 't': /* horizontal tab */ ch = '\t'; break; case '\n': /* line continuation -- consume it */ return; case '\r': /* carriage return -- consume it */ ch = next_ch(); /* look at next character, is it \n? */ if (ch == '\n') return; back_ch(ch); /* if not a line feed, then return it */ return; case EOF: /* end of file -- forget it */ return; default: /* scan up to three octal digits to get value */ if (isOCTAL_DIGIT(ch)) { value = digit_value[ch]; ch = next_ch(); if (isOCTAL_DIGIT(ch)) { value = (value << 3) + digit_value[ch]; ch = next_ch(); if (isOCTAL_DIGIT(ch)) value = (value << 3) + digit_value[ch]; else back_ch(ch); } else back_ch(ch); ch = value; } } /* Found a character to save */ save_ch(ch); } /* Done: String */ static int STRING(ch) int ch; { int nest_level = 1; tokenType = TOKEN_STRING; do { ch = next_ch(); while(!isSTRING_SPECIAL(ch)) { save_ch(ch); ch = next_ch(); }; switch (ch) { case '(': ++nest_level; save_ch(ch); break; case ')': if (--nest_level > 0) save_ch(ch); break; case '\\': save_digraph(next_ch()); break; case '\r': /* All carriage returns (\r) are turned into linefeeds (\n)*/ ch = next_ch(); /* get the next one, is it \n? */ if (ch != '\n') { /* if not, then put it back. */ back_ch(ch); } save_ch('\n'); /* in either case, save a linefeed */ break; case EOF: tokenType = TOKEN_INVALID; /* Unterminated string */ nest_level = 0; break; } } while(nest_level > 0); return(DONE); } /* ------------------------------------------------------------------- * Assemble a name; set token type and done flag. * Put current input character back, if it is not white space. */ /* Done: Name * (Safe version used to complete name tokens that * start out looking like something else). */ static int AAH_NAME(ch) int ch; { do { save_ch(ch); ch = next_ch(); } while(isNAME(ch)); back_ch_not_white(ch); tokenType = TOKEN_NAME; return(DONE); } /* Done: Name */ static int NAME(ch) int ch; { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); while(isNAME(ch)) { save_ch(ch); ch = next_ch(); } } } } } } } back_ch_not_white(ch); tokenType = TOKEN_NAME; return(DONE); } /* Done: Literal Name */ static int LITERAL_NAME(ch) int ch; { if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); while(isNAME(ch)) { save_ch(ch); ch = next_ch(); } } } } } } } back_ch_not_white(ch); tokenType = TOKEN_LITERAL_NAME; return(DONE); } /* Done: immediate Name */ static int IMMED_NAME(ch) int ch; { ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); while(isNAME(ch)) { save_ch(ch); ch = next_ch(); } } } } } } } back_ch_not_white(ch); tokenType = TOKEN_IMMED_NAME; return(DONE); } /* Done: Name found while looking for something else */ static int OOPS_NAME(ch) int ch; { back_ch_not_white(ch); tokenType = TOKEN_NAME; return(DONE); } /* ------------------------------------------------------------------- * Complete a miscellaneous token; set token type and done flag. */ /* Done: Unmatched Right Angle-Bracket */ static int RIGHT_ANGLE(ch) int ch; { tokenType = TOKEN_RIGHT_ANGLE; return(DONE); } /* Done: Unmatched Right Parenthesis */ static int RIGHT_PAREN(ch) int ch; { tokenType = TOKEN_RIGHT_PAREN; return(DONE); } /* Done: Left Brace */ static int LEFT_BRACE(ch) int ch; { tokenType = TOKEN_LEFT_BRACE; return(DONE); } /* Done: Right Brace */ static int RIGHT_BRACE(ch) int ch; { tokenType = TOKEN_RIGHT_BRACE; return(DONE); } /* Done: Left Bracket */ static int LEFT_BRACKET(ch) int ch; { save_unsafe_ch(ch); tokenType = TOKEN_LEFT_BRACKET; return(DONE); } /* Done: Right Bracket */ static int RIGHT_BRACKET(ch) int ch; { save_unsafe_ch(ch); tokenType = TOKEN_RIGHT_BRACKET; return(DONE); } /* Done: Break */ static int BREAK_SIGNAL(ch) int ch; { tokenType = TOKEN_BREAK; return(DONE); } /* Done: No Token Found */ static int NO_TOKEN(ch) int ch; { tokenType = TOKEN_EOF; return(DONE); } /* * ------------------------------------------------------------------- * scan_token -- scan one token from the input. It uses a simple * finite state machine to recognize token classes. * * The input is from a file. * * On entry -- * * inputP -> input PostScript object, a file. * tokenStartP -> buffer in VM for accumulating the token. * tokenMaxP -> last character in the token buffer * * On exit -- * * tokenLength = number of characters in the token * tokenTooLong = TRUE if the token did not fit in the buffer * tokenType = code for the type of token parsed. * tokenValue = converted value of a numeric token. * * * ------------------------------------------------------------------- */ void scan_token(inputP) psobj *inputP; { int ch; unsigned char *stateP = s0; unsigned char entry; int (*actionP)(); /* Define input source */ inputFileP = inputP->data.fileP; if (inputFileP == NULL) { tokenType = TOKEN_EOF; return; } /* Ensure enough space for most cases * (so we don't have to keep checking) * The length needs to cover the maximum number * of save_unsafe_ch() calls that might be executed. * That number is 11 (a sign and 10 decimal digits, e.g., * when scanning -2147483648), but use MAX_NAME_LEN * in case someone changes that without checking. */ if (vm_free_bytes() < (MAX_NAME_LEN)) { if (!(vm_init())) { tokenLength = 0; tokenTooLong = TRUE; tokenType = TOKEN_NONE; tokenValue.integer = 0; return; } } tokenStartP = vm_next_byte(); /* Reset token */ tokenCharP = tokenStartP; tokenTooLong = FALSE; /* Scan one token */ ch = next_ch(); do { entry = stateP[ch]; stateP = classActionTable[entry].nextStateP; actionP = classActionTable[entry].actionRoutineP; ch = (*actionP)(ch); } while(ch != DONE); /* Return results */ tokenLength = tokenCharP - tokenStartP; } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/fontfcn.h0000664000175000017500000000735211742726711023140 0ustar uwabamiuwabami/* $XConsortium: fontfcn.h,v 1.3 92/03/26 16:42:23 eswu Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Definition of a PostScript FONT */ typedef struct ps_font { char *vm_start; psobj FontFileName; psobj Subrs; psdict *CharStringsP; psdict *Private; psdict *fontInfoP; struct blues_struct *BluesP; } psfont; /***================================================================***/ /* Routines in scan_font */ /***================================================================***/ extern boolean Init_StdEnc(); extern int scan_font(); extern int GetFontInfo(); /***================================================================***/ /* Return codes from scan_font */ /***================================================================***/ #define SCAN_OK 0 #define SCAN_FILE_EOF -1 #define SCAN_ERROR -2 #define SCAN_OUT_OF_MEMORY -3 #define SCAN_FILE_OPEN_ERROR -4 #define SCAN_MMFONT -5 /* font is a Multiple Master Font */ #define SCAN_TRUE -6 #define SCAN_FALSE -7 #define SCAN_END -8 /***================================================================***/ /* Name of FontInfo fields */ /***================================================================***/ #define FONTNAME 1 #define PAINTTYPE 2 #define FONTTYPENUM 3 #define FONTMATRIX 4 #define FONTBBOX 5 #define UNIQUEID 6 #define STROKEWIDTH 7 #define VERSION 8 #define NOTICE 9 #define FULLNAME 10 #define FAMILYNAME 11 #define WEIGHT 12 #define ITALICANGLE 13 #define ISFIXEDPITCH 14 #define UNDERLINEPOSITION 15 #define UNDERLINETHICKNESS 16 #define ENCODING 17 /***================================================================***/ /* Name of Private values */ /***================================================================***/ #define BLUEVALUES 1 #define OTHERBLUES 2 #define FAMILYBLUES 3 #define FAMILYOTHERBLUES 4 #define BLUESCALE 5 #define BLUESHIFT 6 #define BLUEFUZZ 7 #define STDHW 8 #define STDVW 9 #define STEMSNAPH 10 #define STEMSNAPV 11 #define FORCEBOLD 12 #define LANGUAGEGROUP 13 #define LENIV 14 #define RNDSTEMUP 15 #define EXPANSIONFACTOR 16 xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/t1snap.c0000664000175000017500000000520511742726711022677 0ustar uwabamiuwabami/* $XConsortium: t1snap.c,v 1.3 91/10/10 11:19:47 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include "objects.h" #include "spaces.h" #include "paths.h" /* :h2.Handle Functions :h3.Phantom() - Returns a Move Segment Equivalent to Handles This is a user operator. Its new name is QueryHandle. */ struct segment *t1_Phantom(obj) register struct xobject *obj; /* object to take the Phantom of */ { struct fractpoint pt; /* handle size will built here */ if (obj == NULL) pt.x = pt.y = 0; else PathDelta(obj, &pt); return(PathSegment(MOVETYPE, pt.x, pt.y)); } /* :h3.Snap() - Force Ending Handle of Object to Origin This is a user operator. */ struct xobject *t1_Snap(p) register struct segment *p; /* path to snap */ { struct fractpoint pt; /* for finding length of path */ if (p == NULL) return(NULL); p = UniquePath(p); PathDelta(p, &pt); if (p->last->type == MOVETYPE) { p->last->dest.x -= pt.x; p->last->dest.y -= pt.y; } else p = JoinSegment(p, MOVETYPE, -pt.x, -pt.y, NULL); return((struct xobject *)p); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/type1/lines.h0000664000175000017500000000360111742726711022606 0ustar uwabamiuwabami/* $XConsortium: lines.h,v 1.2 91/10/10 11:18:23 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #define StepLine(R,x1,y1,x2,y2) t1_StepLine(R,x1,y1,x2,y2) #define Bresenham(e,x1,y1,x2,y2) t1_Bresenham(e,x1,y1,x2,y2) void t1_StepLine(); /* check for special conditions, call Bresenham */ void t1_Bresenham(); /* produce run ends for lines */ /*END SHARED*/ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib.config0000664000175000017500000000033711742726711022466 0ustar uwabamiuwabamiThis is the global configuration file for t1lib. Note that it is not of any use if not setup by the system administrator. For information on how to set up these things see the t1lib-manual. ENCODING=. AFM=. TYPE1=. xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/Makefile.in0000664000175000017500000001043011742726711022324 0ustar uwabamiuwabami# Makefile.in # # This file is part of the t1lib-package! See documentation and Readme files # of the t1lib-package for copyright restrictions. # # Targets provided: # all (default) # install # uninstall # clean # # Author: Rainer Menzner (Rainer.Menzner@web.de) # Date: 06/20/1997 # Last modified: 2006-11-05 # # Contributions by H.Kakugawa to use libtool! LIBTOOL = ../libtool SHELL = /bin/sh CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ OPTIONS = @OPTIONS@ X_LIBS = @X_LIBS@ TOPSRC = @top_srcdir@ XPM_LIB = -lXpm XLIB = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@ LDFLAGS = @LDFLAGS@ LDLIBS = @LDLIBS@ AR = ar rc RANLIB = @RANLIB@ RM = rm -f X_CFLAGS = @X_CFLAGS@ YACC = @YACC@ LEX = @LEX@ LEXLIB = @LEXLIB@ ALLCFLAGS = $(CFLAGS) INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @top_srcdir@/ac-tools/mkinstalldirs prefix = @prefix@ exec_prefix = @exec_prefix@ includedir = @includedir@ bindir = @bindir@ datadir = @datadir@ libdir = @libdir@ mandir = @mandir@/man1 manext = .1 no_x = @no_x@ t1lib_version = @T1LIB_VERSION@ t1lib_revision = @T1LIB_REVISION@ t1lib_patchlevel = @T1LIB_PATCHLEVEL@ T1_AA_TYPE16 = @T1_AA_TYPE16@ T1_AA_TYPE32 = @T1_AA_TYPE32@ T1_AA_TYPE64 = @T1_AA_TYPE64@ SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(ALLCFLAGS) $(T1_AA_TYPE16) $(T1_AA_TYPE32) $(T1_AA_TYPE64)' 'OPTIONS=$(OPTIONS)' @SET_MAKE@ # targets to build: MAIN_TARGET = @MAIN_TARGET@ MAIN_HEADER = @MAIN_HEADER@ TYPE1_OBJS = \ type1/arith.lo \ type1/curves.lo \ type1/fontfcn.lo \ type1/hints.lo \ type1/lines.lo \ type1/objects.lo \ type1/paths.lo \ type1/regions.lo \ type1/scanfont.lo \ type1/spaces.lo \ type1/t1io.lo \ type1/t1snap.lo \ type1/t1stub.lo \ type1/token.lo \ type1/type1.lo \ type1/util.lo T1LIB_OBJS = \ t1lib/t1finfo.lo \ t1lib/t1base.lo \ t1lib/t1delete.lo \ t1lib/t1enc.lo \ t1lib/t1env.lo \ t1lib/t1load.lo \ t1lib/t1set.lo \ t1lib/t1trans.lo \ t1lib/t1aaset.lo \ t1lib/t1afmtool.lo \ t1lib/t1outline.lo \ t1lib/t1subset.lo \ t1lib/parseAFM.lo T1LIBX_OBJS = @T1LIBX_OBJS@ LIBSUBDIRS = \ type1 \ t1lib all: $(MAIN_TARGET) $(TYPE1_OBJS): type1_target $(T1LIB_OBJS) $(T1LIBX_OBJS): t1lib_target type1_target: @set -e; (cd type1; $(SUBMAKE) ) || exit 1 t1lib_target: @set -e; (cd t1lib; $(SUBMAKE) ) || exit 1 libt1.la: $(TYPE1_OBJS) $(T1LIB_OBJS) $(LIBTOOL) --mode=link \ $(CC) $(LDFLAGS) -o $@ $(TYPE1_OBJS) $(T1LIB_OBJS) \ -version-info @T1LIB_LT_CURRENT@:@T1LIB_LT_REVISION@:@T1LIB_LT_AGE@ \ -lm -no-undefined -rpath $(libdir) cp t1lib/t1lib.h . libt1x.la: $(T1LIBX_OBJS) $(LIBTOOL) --mode=link \ $(CC) $(LDFLAGS) -o $@ $(T1LIBX_OBJS) \ -version-info @T1LIB_LT_CURRENT@:@T1LIB_LT_REVISION@:@T1LIB_LT_AGE@ \ libt1.la $(X_LIBS) $(XPM_LIB) $(XLIB) -no-undefined -rpath $(libdir) cp t1lib/t1libx.h . .PHONY: clean dependencies: dummy for i in $(LIBSUBDIRS); do \ (cd $$i; $(MAKE) dependencies) || exit 1; \ done clean: dummy for i in $(LIBSUBDIRS); do \ (cd $$i; $(MAKE) clean) || exit 1; \ done -$(RM) -f libt1*.la libt1*.a libt1*.so* *~ t1lib*.h .libs/* -rmdir .libs install: dummy $(MKINSTALLDIRS) $(DESTDIR)$(libdir) $(MKINSTALLDIRS) $(DESTDIR)$(includedir) $(MKINSTALLDIRS) $(DESTDIR)@T1LIB_DATA_DIR@ $(LIBTOOL) --mode=install \ $(INSTALL_DATA) $(MAIN_TARGET) $(DESTDIR)$(libdir) $(LIBTOOL) --mode=install \ $(INSTALL_DATA) $(MAIN_HEADER) $(DESTDIR)$(includedir) if (test -f $(DESTDIR)@T1LIB_DATA_DIR@/t1lib.config) \ then \ echo "Alert: Global configuration file exists, installation skipped!"; \ else \ $(LIBTOOL) --mode=install $(INSTALL_DATA) t1lib.config $(DESTDIR)@T1LIB_DATA_DIR@; \ fi; uninstall: dummy -$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/libt1.la -$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/libt1x.la -$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(includedir)/t1lib.h -$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(includedir)/t1libx.h -$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)@T1LIB_DATA_DIR@/t1lib.config dummy: xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/0000775000175000017500000000000011742726712021275 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/parseAFM.c0000664000175000017500000012753511742726711023113 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: parseAFM.c ----- Author: Adobe Systems Inc., modifications by Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2002-10-26 ----- Description: This file is part of the t1-library. It is the original parseAFM.h modified at a few points, especially for reading MSDOS-style AFM files. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2002. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ /* * (C) 1988, 1989, 1990 by Adobe Systems Incorporated. All rights reserved. * * This file may be freely copied and redistributed as long as: * 1) This entire notice continues to be included in the file, * 2) If the file has been modified in any way, a notice of such * modification is conspicuously indicated. * * PostScript, Display PostScript, and Adobe are registered trademarks of * Adobe Systems Incorporated. * * ************************************************************************ * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION, * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. * ************************************************************************ */ /* parseAFM.c * * This file is used in conjuction with the parseAFM.h header file. * This file contains several procedures that are used to parse AFM * files. It is intended to work with an application program that needs * font metric information. The program can be used as is by making a * procedure call to "parseFile" (passing in the expected parameters) * and having it fill in a data structure with the data from the * AFM file, or an application developer may wish to customize this * code. * * There is also a file, parseAFMclient.c, that is a sample application * showing how to call the "parseFile" procedure and how to use the data * after "parseFile" has returned. * * Please read the comments in parseAFM.h and parseAFMclient.c. * * History: * original: DSM Thu Oct 20 17:39:59 PDT 1988 * modified: DSM Mon Jul 3 14:17:50 PDT 1989 * - added 'storageProblem' return code * - fixed bug of not allocating extra byte for string duplication * - fixed typos * modified: DSM Tue Apr 3 11:18:34 PDT 1990 * - added free(ident) at end of parseFile routine * modified: DSM Tue Jun 19 10:16:29 PDT 1990 * - changed (width == 250) to (width = 250) in initializeArray */ #include #include #include #include /* this seems to be necessary on some SCO-systems */ #if !defined(_MSC_VER) # include #endif #include #include #include "parseAFM.h" #include "t1base.h" #include "t1misc.h" #define lineterm EOL /* line terminating character */ #define normalEOF 1 /* return code from parsing routines used only */ /* in this module */ #define Space "space" /* used in string comparison to look for the width */ /* of the space character to init the widths array */ #define False "false" /* used in string comparison to check the value of */ /* boolean keys (e.g. IsFixedPitch) */ #define MATCH(A,B) (strncmp((A),(B), MAX_NAME) == 0) /* Note: The functions token and linetoken are extended to be able to parse AFM files with DOS-style line-ends under UNIX. I don't know why AFM files which according to Adobe are explicitly intended to be used under UNIX have MSDOS-style line ends. However, we parse the tokens based on the following atoms. This should work on any system. */ #define CR '\r' /* a carriage return */ #define LF '\n' /* a linefeed, which is a newline under UNIX */ #define CTRL_Z 0x1A /* some AFM files have this characters as an end of file indicator. Who know why :) ? */ /*************************** GLOBALS ***********************/ static char *ident = NULL; /* storage buffer for keywords */ /* "shorts" for fast case statement * The values of each of these enumerated items correspond to an entry in the * table of strings defined below. Therefore, if you add a new string as * new keyword into the keyStrings table, you must also add a corresponding * parseKey AND it MUST be in the same position! * * IMPORTANT: since the sorting algorithm is a binary search, the strings of * keywords must be placed in lexicographical order, below. [Therefore, the * enumerated items are not necessarily in lexicographical order, depending * on the name chosen. BUT, they must be placed in the same position as the * corresponding key string.] The NOPE shall remain in the last position, * since it does not correspond to any key string, and it is used in the * "recognize" procedure to calculate how many possible keys there are. */ typedef enum { ASCENDER, CHARBBOX, CODE, COMPCHAR, CAPHEIGHT, CHARACTERSET, COMMENT, DESCENDER, ENCODINGSCHEME, ENDCHARMETRICS, ENDCOMPOSITES, ENDFONTMETRICS, ENDKERNDATA, ENDKERNPAIRS, ENDTRACKKERN, FAMILYNAME, FONTBBOX, FONTNAME, FULLNAME, ISFIXEDPITCH, ITALICANGLE, KERNPAIR, KERNPAIRXAMT, LIGATURE, CHARNAME, NOTICE, COMPCHARPIECE, STARTCHARMETRICS, STARTCOMPOSITES, STARTFONTMETRICS, STARTKERNDATA, STARTKERNPAIRS, STARTTRACKKERN, STDHW, STDVW, TRACKKERN, UNDERLINEPOSITION, UNDERLINETHICKNESS, VERSION, XYWIDTH, XWIDTH, WEIGHT, XHEIGHT, NOPE} PARSEKEY; /* keywords for the system: * This a table of all of the current strings that are vaild AFM keys. * Each entry can be referenced by the appropriate parseKey value (an * enumerated data type defined above). If you add a new keyword here, * a corresponding parseKey MUST be added to the enumerated data type * defined above, AND it MUST be added in the same position as the * string is in this table. * * IMPORTANT: since the sorting algorithm is a binary search, the keywords * must be placed in lexicographical order. And, NULL should remain at the * end. */ static char *keyStrings[] = { "Ascender", "B", "C", "CC", "CapHeight", "CharacterSet", "Comment", "Descender", "EncodingScheme", "EndCharMetrics", "EndComposites", "EndFontMetrics", "EndKernData", "EndKernPairs", "EndTrackKern", "FamilyName", "FontBBox", "FontName", "FullName", "IsFixedPitch", "ItalicAngle", "KP", "KPX", "L", "N", "Notice", "PCC", "StartCharMetrics", "StartComposites", "StartFontMetrics", "StartKernData", "StartKernPairs", "StartTrackKern", "StdHW", "StdVW", "TrackKern", "UnderlinePosition", "UnderlineThickness", "Version", "W", "WX", "Weight", "XHeight", NULL }; /*************************** PARSING ROUTINES **************/ #define MAX_NAME_1 MAX_NAME-1 /* check for buffer overflow */ /*************************** token *************************/ /* A "AFM File Conventions" tokenizer. That means that it will * return the next token delimited by white space. See also * the `linetoken' routine, which does a similar thing but * reads all tokens until the next end-of-line. */ static char *token(stream) FILE *stream; { int ch, idx; /* skip over white space, instead of the systems EOL-character we check explicitly for CR and LF as well as for ^Z. */ while ((ch = fgetc(stream)) == ' ' || ch == CR || ch == LF || ch == CTRL_Z || ch == ',' || ch == '\t' || ch == ';'); idx = 0; while (idx < MAX_NAME_1 && ch != EOF && ch != ' ' && ch != CR && ch != LF && ch != CTRL_Z && ch != '\t' && ch != ':' && ch != ';'){ ident[idx++] = ch; ch = fgetc(stream); } /* while */ if (ch == EOF && idx < 1) { return ((char *)NULL); } if (idx >= 1 && ch != ':' ) { ungetc(ch, stream); } if (idx < 1 ) { ident[idx++] = ch; /* single-character token */ } ident[idx] = 0; return(ident); /* returns pointer to the token */ } /* token */ /*************************** linetoken *************************/ /* "linetoken" will get read all tokens until the EOL character from * the given stream. This is used to get any arguments that can be * more than one word (like Comment lines and FullName). */ static char *linetoken(stream) FILE *stream; { int ch, idx; while ((ch = fgetc(stream)) == ' ' || ch == '\t' ); idx = 0; while (idx < MAX_NAME_1 && ch != EOF && ch != CR && ch != LF && ch != CTRL_Z) { ident[idx++] = ch; ch = fgetc(stream); } /* while */ ungetc(ch, stream); ident[idx] = 0; return(ident); /* returns pointer to the token */ } /* linetoken */ /*************************** recognize *************************/ /* This function tries to match a string to a known list of * valid AFM entries (check the keyStrings array above). * "ident" contains everything from white space through the * next space, tab, or ":" character. * * The algorithm is a standard Knuth binary search. */ static PARSEKEY recognize(ident) register char *ident; { int lower = 0, upper = (int) NOPE, midpoint=NOPE, cmpvalue; BOOL found = T1LIB_FALSE; while ((upper >= lower) && !found) { midpoint = (lower + upper)/2; if (keyStrings[midpoint] == NULL) break; cmpvalue = strncmp(ident, keyStrings[midpoint], MAX_NAME); if (cmpvalue == 0) found = T1LIB_TRUE; else if (cmpvalue < 0) upper = midpoint - 1; else lower = midpoint + 1; } /* while */ if (found) return (PARSEKEY) midpoint; else return NOPE; } /* recognize */ /************************* parseGlobals *****************************/ /* This function is called by "parseFile". It will parse the AFM File * up to the "StartCharMetrics" keyword, which essentially marks the * end of the Global Font Information and the beginning of the character * metrics information. * * If the caller of "parseFile" specified that it wanted the Global * Font Information (as defined by the "AFM File Specification" * document), then that information will be stored in the returned * data structure. * * Any Global Font Information entries that are not found in a * given file, will have the usual default initialization value * for its type (i.e. entries of type int will be 0, etc). * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static BOOL parseGlobals(fp, gfi) FILE *fp; register GlobalFontInfo *gfi; { BOOL cont = T1LIB_TRUE, save = (gfi != NULL); int error = ok; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) /* Have reached an early and unexpected EOF. */ /* Set flag and stop parsing */ { error = earlyEOF; break; /* get out of loop */ } if (!save) /* get tokens until the end of the Global Font info section */ /* without saving any of the data */ switch (recognize(keyword)) { case STARTCHARMETRICS: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; default: break; } /* switch */ else /* otherwise parse entire global font info section, */ /* saving the data */ switch(recognize(keyword)) { case STARTFONTMETRICS: keyword = token(fp); gfi->afmVersion = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->afmVersion, keyword); break; case COMMENT: /* We ignore the following keywords. They are only listed here in order to prevent from "Unknown Keyword" errors. */ case CHARACTERSET: case STDHW: case STDVW: keyword = linetoken(fp); break; case FONTNAME: keyword = linetoken(fp); gfi->fontName = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->fontName, keyword); break; case ENCODINGSCHEME: keyword = linetoken(fp); gfi->encodingScheme = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->encodingScheme, keyword); break; case FULLNAME: keyword = linetoken(fp); gfi->fullName = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->fullName, keyword); break; case FAMILYNAME: keyword = linetoken(fp); gfi->familyName = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->familyName, keyword); break; case WEIGHT: keyword = linetoken(fp); gfi->weight = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->weight, keyword); break; case ITALICANGLE: keyword = token(fp); gfi->italicAngle = atof(keyword); if (errno == ERANGE) error = parseError; break; case ISFIXEDPITCH: keyword = token(fp); if (MATCH(keyword, False)) gfi->isFixedPitch = 0; else gfi->isFixedPitch = 1; break; case UNDERLINEPOSITION: keyword = token(fp); gfi->underlinePosition = atoi(keyword); break; case UNDERLINETHICKNESS: keyword = token(fp); gfi->underlineThickness = atoi(keyword); break; case VERSION: keyword = linetoken(fp); gfi->version = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->version, keyword); break; case NOTICE: keyword = linetoken(fp); gfi->notice = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->notice, keyword); break; case FONTBBOX: keyword = token(fp); gfi->fontBBox.llx = atoi(keyword); keyword = token(fp); gfi->fontBBox.lly = atoi(keyword); keyword = token(fp); gfi->fontBBox.urx = atoi(keyword); keyword = token(fp); gfi->fontBBox.ury = atoi(keyword); break; case CAPHEIGHT: keyword = token(fp); gfi->capHeight = atoi(keyword); break; case XHEIGHT: keyword = token(fp); gfi->xHeight = atoi(keyword); break; case DESCENDER: keyword = token(fp); gfi->descender = atoi(keyword); break; case ASCENDER: keyword = token(fp); gfi->ascender = atoi(keyword); break; case STARTCHARMETRICS: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; T1_PrintLog( "parseGlobals()", "Unknown Keyword: %s", T1LOG_WARNING, keyword); break; } /* switch */ } /* while */ return(error); } /* parseGlobals */ /************************* initializeArray ************************/ /* Unmapped character codes are (at Adobe Systems) assigned the * width of the space character (if one exists) else they get the * value of 250 ems. This function initializes all entries in the * char widths array to have this value. Then any mapped character * codes will be replaced with the width of the appropriate character * when parsing the character metric section. * This function parses the Character Metrics Section looking * for a space character (by comparing character names). If found, * the width of the space character will be used to initialize the * values in the array of character widths. * * Before returning, the position of the read/write pointer of the * file is reset to be where it was upon entering this function. */ /* We comment out the following function since it is not needed in t1lib and we don't want compiler warnings */ /* static int initializeArray(fp, cwi) FILE *fp; register int *cwi; { BOOL cont = T1LIB_TRUE, found = T1LIB_FALSE; long opos = ftell(fp); int code = 0, width = 0, i = 0, error = 0; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) { error = earlyEOF; break; } switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case CODE: code = atoi(token(fp)); break; case XWIDTH: width = atoi(token(fp)); break; case CHARNAME: keyword = token(fp); if (MATCH(keyword, Space)) { cont = T1LIB_FALSE; found = T1LIB_TRUE; } break; case ENDCHARMETRICS: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; break; } } if (!found) width = 250; for (i = 0; i < 256; ++i) cwi[i] = width; fseek(fp, opos, 0); return(error); } */ /************************* parseCharWidths **************************/ /* This function is called by "parseFile". It will parse the AFM File * up to the "EndCharMetrics" keyword. It will save the character * width info (as opposed to all of the character metric information) * if requested by the caller of parseFile. Otherwise, it will just * parse through the section without saving any information. * * If data is to be saved, parseCharWidths is passed in a pointer * to an array of widths that has already been initialized by the * standard value for unmapped character codes. This function parses * the Character Metrics section only storing the width information * for the encoded characters into the array using the character code * as the index into that array. * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static int parseCharWidths(fp, cwi) FILE *fp; register int *cwi; { BOOL cont = T1LIB_TRUE, save = (cwi != NULL); int pos = 0, error = ok; register char *keyword; while (cont) { keyword = token(fp); /* Have reached an early and unexpected EOF. */ /* Set flag and stop parsing */ if (keyword == NULL) { error = earlyEOF; break; /* get out of loop */ } if (!save) /* get tokens until the end of the Char Metrics section without */ /* saving any of the data*/ switch (recognize(keyword)) { case ENDCHARMETRICS: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; default: break; } /* switch */ else /* otherwise parse entire char metrics section, saving */ /* only the char x-width info */ switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case CODE: keyword = token(fp); pos = atoi(keyword); break; case XYWIDTH: /* PROBLEM: Should be no Y-WIDTH when doing "quick & dirty" */ keyword = token(fp); keyword = token(fp); /* eat values */ error = parseError; break; case XWIDTH: keyword = token(fp); if (pos >= 0) /* ignore unmapped chars */ cwi[pos] = atoi(keyword); break; case ENDCHARMETRICS: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case CHARNAME: /* eat values (so doesn't cause parseError) */ keyword = token(fp); break; case CHARBBOX: keyword = token(fp); keyword = token(fp); keyword = token(fp); keyword = token(fp); break; case LIGATURE: keyword = token(fp); keyword = token(fp); break; case NOPE: default: error = parseError; break; } /* switch */ } /* while */ return(error); } /* parseCharWidths */ /************************* parseCharMetrics ************************/ /* This function is called by parseFile if the caller of parseFile * requested that all character metric information be saved * (as opposed to only the character width information). * * parseCharMetrics is passed in a pointer to an array of records * to hold information on a per character basis. This function * parses the Character Metrics section storing all character * metric information for the ALL characters (mapped and unmapped) * into the array. * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static int parseCharMetrics(fp, fi) FILE *fp; register FontInfo *fi; { BOOL cont = T1LIB_TRUE, firstTime = T1LIB_TRUE; int error = ok, count = 0; register CharMetricInfo *temp = fi->cmi; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) { error = earlyEOF; break; /* get out of loop */ } switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case CODE: if (count < fi->numOfChars) { if (firstTime) firstTime = T1LIB_FALSE; else temp++; temp->code = atoi(token(fp)); count++; } else { error = parseError; cont = T1LIB_FALSE; } break; case XYWIDTH: temp->wx = atoi(token(fp)); temp->wy = atoi(token(fp)); break; case XWIDTH: temp->wx = atoi(token(fp)); break; case CHARNAME: keyword = token(fp); temp->name = (char *) malloc(strlen(keyword) + 1); strcpy(temp->name, keyword); break; case CHARBBOX: temp->charBBox.llx = atoi(token(fp)); temp->charBBox.lly = atoi(token(fp)); temp->charBBox.urx = atoi(token(fp)); temp->charBBox.ury = atoi(token(fp)); break; case LIGATURE: { Ligature **tail = &(temp->ligs); Ligature *node = *tail; if (*tail != NULL) { while (node->next != NULL) node = node->next; tail = &(node->next); } *tail = (Ligature *) calloc(1, sizeof(Ligature)); keyword = token(fp); (*tail)->succ = (char *) malloc(strlen(keyword) + 1); strcpy((*tail)->succ, keyword); keyword = token(fp); (*tail)->lig = (char *) malloc(strlen(keyword) + 1); strcpy((*tail)->lig, keyword); break; } case ENDCHARMETRICS: cont = T1LIB_FALSE;; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; break; } /* switch */ } /* while */ if ((error == ok) && (count != fi->numOfChars)) error = parseError; return(error); } /* parseCharMetrics */ /************************* parseTrackKernData ***********************/ /* This function is called by "parseFile". It will parse the AFM File * up to the "EndTrackKern" or "EndKernData" keywords. It will save the * track kerning data if requested by the caller of parseFile. * * parseTrackKernData is passed in a pointer to the FontInfo record. * If data is to be saved, the FontInfo record will already contain * a valid pointer to storage for the track kerning data. * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static int parseTrackKernData(fp, fi) FILE *fp; register FontInfo *fi; { BOOL cont = T1LIB_TRUE, save = (fi->tkd != NULL); int pos = 0, error = ok, tcount = 0; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) { error = earlyEOF; break; /* get out of loop */ } if (!save) /* get tokens until the end of the Track Kerning Data */ /* section without saving any of the data */ switch(recognize(keyword)) { case ENDTRACKKERN: case ENDKERNDATA: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; default: break; } /* switch */ else /* otherwise parse entire Track Kerning Data section, */ /* saving the data */ switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case TRACKKERN: if (tcount < fi->numOfTracks) { keyword = token(fp); fi->tkd[pos].degree = atoi(keyword); keyword = token(fp); fi->tkd[pos].minPtSize = atof(keyword); if (errno == ERANGE) error = parseError; keyword = token(fp); fi->tkd[pos].minKernAmt = atof(keyword); if (errno == ERANGE) error = parseError; keyword = token(fp); fi->tkd[pos].maxPtSize = atof(keyword); if (errno == ERANGE) error = parseError; keyword = token(fp); fi->tkd[pos++].maxKernAmt = atof(keyword); if (errno == ERANGE) error = parseError; tcount++; } else { error = parseError; cont = T1LIB_FALSE; } break; case ENDTRACKKERN: case ENDKERNDATA: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; break; } /* switch */ } /* while */ if (error == ok && tcount != fi->numOfTracks) error = parseError; return(error); } /* parseTrackKernData */ /************************* parsePairKernData ************************/ /* This function is called by "parseFile". It will parse the AFM File * up to the "EndKernPairs" or "EndKernData" keywords. It will save * the pair kerning data if requested by the caller of parseFile. * * parsePairKernData is passed in a pointer to the FontInfo record. * If data is to be saved, the FontInfo record will already contain * a valid pointer to storage for the pair kerning data. * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static int parsePairKernData(fp, fi) FILE *fp; register FontInfo *fi; { BOOL cont = T1LIB_TRUE, save = (fi->pkd != NULL); int pos = 0, error = ok, pcount = 0; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) { error = earlyEOF; break; /* get out of loop */ } if (!save) /* get tokens until the end of the Pair Kerning Data */ /* section without saving any of the data */ switch(recognize(keyword)) { case ENDKERNPAIRS: case ENDKERNDATA: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; default: break; } /* switch */ else /* otherwise parse entire Pair Kerning Data section, */ /* saving the data */ switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case KERNPAIR: if (pcount < fi->numOfPairs) { keyword = token(fp); fi->pkd[pos].name1 = (char *) malloc(strlen(keyword) + 1); strcpy(fi->pkd[pos].name1, keyword); keyword = token(fp); fi->pkd[pos].name2 = (char *) malloc(strlen(keyword) + 1); strcpy(fi->pkd[pos].name2, keyword); keyword = token(fp); fi->pkd[pos].xamt = atoi(keyword); keyword = token(fp); fi->pkd[pos++].yamt = atoi(keyword); pcount++; } else { error = parseError; cont = T1LIB_FALSE; } break; case KERNPAIRXAMT: if (pcount < fi->numOfPairs) { keyword = token(fp); fi->pkd[pos].name1 = (char *) malloc(strlen(keyword) + 1); strcpy(fi->pkd[pos].name1, keyword); keyword = token(fp); fi->pkd[pos].name2 = (char *) malloc(strlen(keyword) + 1); strcpy(fi->pkd[pos].name2, keyword); keyword = token(fp); fi->pkd[pos++].xamt = atoi(keyword); pcount++; } else { error = parseError; cont = T1LIB_FALSE; } break; case ENDKERNPAIRS: case ENDKERNDATA: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; break; } /* switch */ } /* while */ if (error == ok && pcount != fi->numOfPairs) error = parseError; return(error); } /* parsePairKernData */ /************************* parseCompCharData **************************/ /* This function is called by "parseFile". It will parse the AFM File * up to the "EndComposites" keyword. It will save the composite * character data if requested by the caller of parseFile. * * parseCompCharData is passed in a pointer to the FontInfo record, and * a boolean representing if the data should be saved. * * This function will create the appropriate amount of storage for * the composite character data and store a pointer to the storage * in the FontInfo record. * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static int parseCompCharData(fp, fi) FILE *fp; register FontInfo *fi; { BOOL cont = T1LIB_TRUE, firstTime = T1LIB_TRUE, save = (fi->ccd != NULL); int pos = 0, j = 0, error = ok, ccount = 0, pcount = 0; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) /* Have reached an early and unexpected EOF. */ /* Set flag and stop parsing */ { error = earlyEOF; break; /* get out of loop */ } if (ccount > fi->numOfComps) { error = parseError; break; /* get out of loop */ } if (!save) /* get tokens until the end of the Composite Character info */ /* section without saving any of the data */ switch(recognize(keyword)) { case ENDCOMPOSITES: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; default: break; } /* switch */ else /* otherwise parse entire Composite Character info section, */ /* saving the data */ switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case COMPCHAR: if (ccount < fi->numOfComps) { keyword = token(fp); if (pcount != fi->ccd[pos].numOfPieces) error = parseError; pcount = 0; if (firstTime) firstTime = T1LIB_FALSE; else pos++; fi->ccd[pos].ccName = (char *) malloc(strlen(keyword) + 1); strcpy(fi->ccd[pos].ccName, keyword); keyword = token(fp); fi->ccd[pos].numOfPieces = atoi(keyword); fi->ccd[pos].pieces = (Pcc *) calloc(fi->ccd[pos].numOfPieces, sizeof(Pcc)); j = 0; ccount++; } else { error = parseError; cont = T1LIB_FALSE; } break; case COMPCHARPIECE: if (pcount < fi->ccd[pos].numOfPieces) { keyword = token(fp); fi->ccd[pos].pieces[j].pccName = (char *) malloc(strlen(keyword) + 1); strcpy(fi->ccd[pos].pieces[j].pccName, keyword); keyword = token(fp); fi->ccd[pos].pieces[j].deltax = atoi(keyword); keyword = token(fp); fi->ccd[pos].pieces[j++].deltay = atoi(keyword); pcount++; } else error = parseError; break; case ENDCOMPOSITES: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; break; } /* switch */ } /* while */ if (error == ok && ccount != fi->numOfComps) error = parseError; return(error); } /* parseCompCharData */ /*************************** 'PUBLIC' FUNCTION ********************/ /*************************** parseFile *****************************/ /* parseFile is the only 'public' procedure available. It is called * from an application wishing to get information from an AFM file. * The caller of this function is responsible for locating and opening * an AFM file and handling all errors associated with that task. * * parseFile expects 3 parameters: a vaild file pointer, a pointer * to a (FontInfo *) variable (for which storage will be allocated and * the data requested filled in), and a mask specifying which * data from the AFM File should be saved in the FontInfo structure. * * The file will be parsed and the requested data will be stored in * a record of type FontInfo (refer to ParseAFM.h). * * parseFile returns an error code as defined in parseAFM.h. * * The position of the read/write pointer associated with the file * pointer upon return of this function is undefined. */ /* Note: function renamed to T1lib_parseFile in order to avoid name clushes with other libraries that also use the Adobe parseAFM-package (RMz) */ int T1lib_parseFile (fp, fi, flags) FILE *fp; FontInfo **fi; FLAGS flags; { int code = ok; /* return code from each of the parsing routines */ int error = ok; /* used as the return code from this function */ register char *keyword; /* used to store a token */ /* storage data for the global variable ident */ ident = (char *) calloc(MAX_NAME, sizeof(char)); if (ident == NULL) {error = storageProblem; return(error);} (*fi) = (FontInfo *) calloc(1, sizeof(FontInfo)); if ((*fi) == NULL) {error = storageProblem; return(error);} if (flags & P_G) { (*fi)->gfi = (GlobalFontInfo *) calloc(1, sizeof(GlobalFontInfo)); if ((*fi)->gfi == NULL) {error = storageProblem; return(error);} } /* The AFM File begins with Global Font Information. This section */ /* will be parsed whether or not information should be saved. */ code = parseGlobals(fp, (*fi)->gfi); if (code < 0) error = code; /* The Global Font Information is followed by the Character Metrics */ /* section. Which procedure is used to parse this section depends on */ /* how much information should be saved. If all of the metrics info */ /* is wanted, parseCharMetrics is called. If only the character widths */ /* is wanted, parseCharWidths is called. parseCharWidths will also */ /* be called in the case that no character data is to be saved, just */ /* to parse through the section. */ if ((code != normalEOF) && (code != earlyEOF)) { (*fi)->numOfChars = atoi(token(fp)); if (flags & (P_M ^ P_W)) { (*fi)->cmi = (CharMetricInfo *) calloc((*fi)->numOfChars, sizeof(CharMetricInfo)); if ((*fi)->cmi == NULL) {error = storageProblem; return(error);} code = parseCharMetrics(fp, *fi); } else { if (flags & P_W) { (*fi)->cwi = (int *) calloc(256, sizeof(int)); if ((*fi)->cwi == NULL) { error = storageProblem; return(error); } } /* parse section regardless */ code = parseCharWidths(fp, (*fi)->cwi); } /* else */ } /* if */ if ((error != earlyEOF) && (code < 0)) error = code; /* The remaining sections of the AFM are optional. This code will */ /* look at the next keyword in the file to determine what section */ /* is next, and then allocate the appropriate amount of storage */ /* for the data (if the data is to be saved) and call the */ /* appropriate parsing routine to parse the section. */ while ((code != normalEOF) && (code != earlyEOF)) { keyword = token(fp); if (keyword == NULL) /* Have reached an early and unexpected EOF. */ /* Set flag and stop parsing */ { code = earlyEOF; break; /* get out of loop */ } switch(recognize(keyword)) { /* this case has been added for t1lib because otherwise comment line between (i.e., outside) the main sections would lead to parse errors. The Adobe spec does not seem to forbid comments at such locations (2001-05-14, RMz) */ case COMMENT: keyword = linetoken(fp); break; case STARTKERNDATA: break; case ENDKERNDATA: break; case STARTTRACKKERN: keyword = token(fp); if (flags & P_T) { (*fi)->numOfTracks = atoi(keyword); (*fi)->tkd = (TrackKernData *) calloc((*fi)->numOfTracks, sizeof(TrackKernData)); if ((*fi)->tkd == NULL) { error = storageProblem; return(error); } } /* if */ code = parseTrackKernData(fp, *fi); break; case STARTKERNPAIRS: keyword = token(fp); if (flags & P_P) { (*fi)->numOfPairs = atoi(keyword); (*fi)->pkd = (PairKernData *) calloc((*fi)->numOfPairs, sizeof(PairKernData)); if ((*fi)->pkd == NULL) { error = storageProblem; return(error); } } /* if */ code = parsePairKernData(fp, *fi); break; case STARTCOMPOSITES: keyword = token(fp); if (flags & P_C) { (*fi)->numOfComps = atoi(keyword); (*fi)->ccd = (CompCharData *) calloc((*fi)->numOfComps, sizeof(CompCharData)); if ((*fi)->ccd == NULL) { error = storageProblem; return(error); } } /* if */ code = parseCompCharData(fp, *fi); break; case ENDFONTMETRICS: code = normalEOF; break; case NOPE: default: code = parseError; break; } /* switch */ if ((error != earlyEOF) && (code < 0)) error = code; } /* while */ if ((error != earlyEOF) && (code < 0)) error = code; if (ident != NULL) { free(ident); ident = NULL; } return(error); } /* parseFile */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1finfo.h0000664000175000017500000001076111742726711023020 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1finfo.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-06-03 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1finfo.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1FINFO_C int T1_GetKerning( int FontID, char char1, char char2); int T1_GetCharWidth( int FontID, char char1); BBox T1_GetCharBBox( int FontID, char char1); float T1_GetUnderlinePosition( int FontID); float T1_GetUnderlineThickness( int FontID); float T1_GetItalicAngle( int FontID); int T1_GetIsFixedPitch( int FontID); char *T1_GetFontName( int FontID); char *T1_GetFullName( int FontID); char *T1_GetFamilyName( int FontID); char *T1_GetWeight( int FontID); char *T1_GetVersion( int FontID); char *T1_GetNotice( int FontID); char *T1_GetCharName( int FontID, char char1); int T1_QueryLigs( int FontID, char char1, char **successors, char **ligatures); int T1_GetEncodingIndex( int FontID, char *char1); int *T1_GetEncodingIndices( int FontID, char *char1); int T1_GetStringWidth( int FontID, char *string, int len, long spaceoff,int kerning); BBox T1_GetStringBBox( int FontID, char *string, int len, long spaceoff, int kerning); METRICSINFO T1_GetMetricsInfo( int FontID, char *string, int len, long spaceoff, int kerning); BBox T1_GetFontBBox( int FontID); char **T1_GetAllCharNames( int FontID); int T1_GetNoKernPairs( int FontID); static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2); int T1_GetNoCompositeChars( int FontID); int T1_QueryCompositeChar( int FontID, char char1); T1_COMP_CHAR_INFO *T1_GetCompCharData( int FontID, char char1); T1_COMP_CHAR_INFO *T1_GetCompCharDataByIndex( int FontID, int index); int T1_IsInternalChar( int FontID, char char1); #else extern int T1_GetKerning( int FontID, char char1, char char2); extern int T1_GetCharWidth( int FontID, char char1); extern BBox T1_GetCharBBox( int FontID, char char1); extern float T1_GetUnderlinePosition( int FontID); extern float T1_GetUnderlineThickness( int FontID); extern float T1_GetItalicAngle( int FontID); extern int T1_GetIsFixedPitch( int FontID); extern char *T1_GetFontName( int FontID); extern char *T1_GetFullName( int FontID); extern char *T1_GetFamilyName( int FontID); extern char *T1_GetWeight( int FontID); extern char *T1_GetVersion( int FontID); extern char *T1_GetNotice( int FontID); extern char *T1_GetCharName( int FontID, char char1); extern int T1_QueryLigs( int FontID, char char1, char **successors, char **ligatures); extern int T1_GetEncodingIndex( int FontID, char *char1); extern int *T1_GetEncodingIndices( int FontID, char *char1); extern int T1_GetStringWidth( int FontID, char *string, int len, long spaceoff,int kerning); extern BBox T1_GetStringBBox( int FontID, char *string, int len, long spaceoff, int kerning); extern METRICSINFO T1_GetMetricsInfo( int FontID, char *string, int len, long spaceoff, int kerning); extern BBox T1_GetFontBBox( int FontID); extern int T1_GetNoKernPairs( int FontID); extern char **T1_GetAllCharNames( int FontID); extern int T1_GetNoCompositeChars( int FontID); extern int T1_QueryCompositeChar( int FontID, char char1); extern T1_COMP_CHAR_INFO *T1_GetCompCharData( int FontID, char char1); extern T1_COMP_CHAR_INFO *T1_GetCompCharDataByIndex( int FontID, int index); extern int T1_IsInternalChar( int FontID, char char1); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1extern.h0000664000175000017500000000765311742726711023232 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1extern.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2005-05-16 ----- Description: This file is part of the t1-library. It contains external declarations used by the t1-library. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #include "t1misc.h" /* Following struct will allow all accesses to font data! */ extern struct FONTBASE { int t1lib_flags; /* Global library flags */ int no_fonts_ini; /* The number of fonts initially declared in Font database file. */ int no_fonts; /* The number of currently allocated fonts including logical fonts produced by T1_CopyFont() */ int no_fonts_limit; /* The maximum number of font for which is memory currently available. */ int bitmap_pad; /* The value to which bitmap-scanlines are padded */ int endian; /* 1 if little endian representation and 0 otherwise */ char **default_enc; /* The default encoding vector */ FONTPRIVATE *pFontArray; /* Points to first element of font pointer array */ } FontBase; extern struct FONTBASE *pFontBase; /* Further we need a struct where to save device dependent data such as resolution. The values in this struct may be altered using T1_SetDeviceRes(x_res,y_res). Generally, the fontsize is to be specified in BigPoints ("bp")---this is the default PostScript unit. It is 1in=72bp. */ extern struct { float x_resolution; /* Value must be specified in DPI */ float y_resolution; /* Value must be specified in DPI */ float scale_x; /* horizontal scale-value to get a matrix scaled to 1b */ float scale_y; /* vertical scale-value to get a matrix scaled to 1b */ } DeviceSpecifics; extern struct stat filestats; /* A structure where fileinfo is stored */ extern char linebuf[BUF_SIZE]; /* A buffer for reading files line by line */ extern int T1_Up; /* This one is for initialization-checking */ /* The width of AA-pixels */ extern int T1aa_bpp; /* The follwoing variable allows the primary rastering functions to check for the caller */ extern int SetFuncRequestID; /* The following variable allows to suppress rastering at 1000 bp for getting a correct bounding box for slanted characters --> should only internally be used */ extern int ForceAFMBBox; extern struct XYspace *IDENTITY; extern int errornumber; /* for debugging purposes */ extern char **T1_PFAB_ptr; extern char **T1_AFM_ptr; extern char **T1_ENC_ptr; extern char **T1_FDB_ptr; extern char **T1_FDBXLFD_ptr; /* We use a uchar buffer for error and warning messages: */ extern char err_warn_msg_buf[1024]; /* file pointer for log-file */ extern FILE *t1lib_log_file; extern int t1lib_log_level; /* The errno for t1lib */ extern int T1_errno; /* A variable for saving stack info */ extern jmp_buf stck_state; xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1delete.h0000664000175000017500000000367211742726711023164 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1delete.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-06-03 ----- Description: This file is part of the t1-library. It contains functions for setting characters and strings of characters. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1DELETE_C int T1_DeleteSize( int FontID, float size); int T1_DeleteAllSizes( int FontID); int T1_FreeGlyph( GLYPH *glyph); int T1_FreeCompCharData( T1_COMP_CHAR_INFO *cci); int T1_DeleteFont( int FontID); int FreeAFMData( FontInfo *pAFMData); #else extern int T1_DeleteSize( int FontID, float size); extern int T1_DeleteAllSizes( int FontID); extern int T1_FreeGlyph( GLYPH *glyph); extern int T1_FreeCompCharData( T1_COMP_CHAR_INFO *cci); extern int T1_DeleteFont( int FontID); extern int FreeAFMData( FontInfo *pAFMData); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1x11.h0000664000175000017500000001004511742726711022323 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1x11.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2003-01-02 ----- Description: This file is part of the t1-library. It contains definitions and declarations for t1x11.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2003. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #include #ifdef T1X11_C int T1_SetX11Params( Display *display, Visual *visual, unsigned int depth, Colormap colormap); GLYPH *T1_SetCharX( Drawable d, GC gc, int mode, int x, int y, int FontID, char charcode, float size, T1_TMATRIX *transform); GLYPH *T1_SetStringX( Drawable d, GC gc, int mode, int x, int y, int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); GLYPH *T1_SetRectX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, float size, float width, float height, T1_TMATRIX *transform); GLYPH *T1_AASetCharX( Drawable d, GC gc, int mode, int x, int y, int FontID, char charcode, float size, T1_TMATRIX *transform); GLYPH *T1_AASetStringX( Drawable d, GC gc, int mode, int x, int y, int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); GLYPH *T1_AASetRectX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, float size, float width, float height, T1_TMATRIX *transform); int T1_ComputeAAColorsX( unsigned long fg, unsigned long bg, int nolevels); int T1_GetDepthOfDrawable( Drawable drawable); void T1_LogicalPositionX( int pos_switch); #else extern Display *T1_display; extern int T1_SetX11Params( Display *display, Visual *visual, unsigned int depth, Colormap colormap); extern GLYPH *T1_SetCharX( Drawable d, GC gc, int mode, int x, int y, int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_SetStringX( Drawable d, GC gc, int mode, int x, int y, int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern GLYPH *T1_SetRectX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, float size, float width, float height, T1_TMATRIX *transform); extern GLYPH *T1_AASetCharX( Drawable d, GC gc, int mode, int x, int y, int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_AASetStringX( Drawable d, GC gc, int mode, int x, int y, int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern GLYPH *T1_AASetRectX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, float size, float width, float height, T1_TMATRIX *transform); extern int T1_ComputeAAColorsX( unsigned long fg, unsigned long bg, int nolevels); extern int T1_GetDepthOfDrawable( Drawable drawable); extern void T1_LogicalPositionX( int pos_switch); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1libx.h0000664000175000017500000000643011742726711022653 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1libx.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2003-01-02 ----- Description: This file is part of the t1-library. It must be included by the user of the t1lib. It contains function declarations for the X11 wrapper. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2003. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifndef T1LIBX_H_INCLUDED #define T1LIBX_H_INCLUDED #ifndef _XLIB_H_ #include #endif #define T1LIB_X11_SUPPORT /* For paint mode of X-rastering functions */ #define T1_OPAQUE 0x1 #define T1_TRANSPARENT 0x0 /* type definitions, needed by the user: */ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* from t1x11.c */ extern int T1_SetX11Params( Display *display, Visual *visual, unsigned int depth, Colormap colormap); extern GLYPH *T1_SetCharX( Drawable d, GC gc, int mode, int x, int y, int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_SetStringX( Drawable d, GC gc, int mode, int x, int y, int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern GLYPH *T1_SetRectX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, float size, float width, float height, T1_TMATRIX *transform); extern GLYPH *T1_AASetCharX( Drawable d, GC gc, int mode, int x, int y, int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_AASetStringX( Drawable d, GC gc, int mode, int x, int y, int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern GLYPH *T1_AASetRectX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, float size, float width, float height, T1_TMATRIX *transform); extern int T1_ComputeAAColorsX( unsigned long fg, unsigned long bg, int nolevels); extern int T1_GetDepthOfDrawable( Drawable drawable); extern void T1_LogicalPositionX( int pos_switch); extern XImage *T1_XImageFromGlyph( GLYPH *pglyph); #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif /* T1LIBX_H_INCLUDED */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1x11.c0000664000175000017500000007344011742726711022326 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1x11.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2005-05-01 ----- Description: This file is part of the t1-library. It contains functions for generating glyphs with data in X11-Pixmap format. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1X11_C #include #include #include #include #include #include #include #include #include #include #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/paths.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1set.h" #include "t1aaset.h" #include "t1load.h" #include "t1finfo.h" #include "t1misc.h" #include "t1x11.h" #include "t1base.h" #define T1GCMASK GCForeground | GCBackground /* As a fall back */ #ifndef T1_AA_TYPE16 #define T1_AA_TYPE16 short #endif #ifndef T1_AA_TYPE32 #define T1_AA_TYPE32 int #endif /* The three important X11 parameters t1lib has to deal with: */ static Display *T1_display=NULL; /* Must be accessible from t1delete.c */ static Visual *T1_visual=NULL; static Colormap T1_colormap; static unsigned int T1_depth=0; static int T1_byte_order; static int lastlevel=0; static unsigned long oldfg_n=0, oldbg_n=0, oldfg_l=0, oldbg_l=0; static unsigned long oldfg_h=0, oldbg_h=0, oldfg=0, oldbg=0; extern int T1aa_SmartOn; /* from t1aaset.c */ extern float T1aa_smartlimit1; extern float T1aa_smartlimit2; static XColor aacolors[AAMAXPLANES]; static unsigned long aapixels[AAMAXPLANES]; /* The following parameter determines whether t1lib will use logical positioning of chars and string (place the origin at specified destination-point) or absolute positioning with respect to the origin (upper left corner) of the generated bitmap/pixmap. */ static int T1_lposition=1; /* T1_SetX11Params(): Set X11-parameters which t1lib has to know in order to properly generate pixmaps from characters */ int T1_SetX11Params( Display *display, Visual *visual, unsigned int depth, Colormap colormap) { T1_display =display; T1_visual =visual; T1_depth =depth; T1_colormap =colormap; if (T1_CheckEndian()==0) T1_byte_order=0; else T1_byte_order=1; /* For bug hunting: */ if (ImageByteOrder( T1_display)==0) T1_PrintLog( "T1_SetX11Params()", "X-Server uses Little Endian data representation", T1LOG_DEBUG); else T1_PrintLog( "T1_SetX11Params()", "X-Server uses Big Endian data representation", T1LOG_DEBUG); return(0); } /* T1_SetCharX(): Generate an object of type GLYPH, i.e, a glyph with a pixmap ID instead of a pointer to a bitmap: */ GLYPH *T1_SetCharX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, char charcode, float size, T1_TMATRIX *transform) { GLYPH *pglyph; static GLYPH xglyph={NULL,{0,0,0,0,0,0},NULL,0}; int height, width; Pixmap clipmask=0; int opaque; xglyph.metrics.leftSideBearing=0; xglyph.metrics.rightSideBearing=0; xglyph.metrics.advanceX=0; xglyph.metrics.advanceY=0; xglyph.metrics.ascent=0; xglyph.metrics.descent=0; xglyph.pFontCacheInfo=NULL; opaque=mode; if ((pglyph=T1_SetChar( FontID, charcode, size, transform))==NULL){ T1_PrintLog( "T1_SetCharX()", "T1_SetChar() returned NULL-pointer!", T1LOG_WARNING); return(NULL); } /* Check for empty bitmap */ if (pglyph->bits==NULL) { xglyph=*pglyph; return( &xglyph); } width=pglyph->metrics.rightSideBearing-pglyph->metrics.leftSideBearing; height=pglyph->metrics.ascent-pglyph->metrics.descent; clipmask=XCreateBitmapFromData( T1_display, d, (char *)pglyph->bits, PAD(width, pFontBase->bitmap_pad), height ); /* Correct position */ if (T1_lposition){ x_dest += pglyph->metrics.leftSideBearing; y_dest -= pglyph->metrics.ascent; } if (opaque==0){ XSetClipMask(T1_display, gc, clipmask); XSetClipOrigin(T1_display, gc, x_dest, y_dest); } XCopyPlane( T1_display, clipmask, d, gc, 0, 0, width, height, x_dest, y_dest, 0x01); if (clipmask){ XFreePixmap( T1_display, clipmask); clipmask=0; XSetClipMask(T1_display, gc, None); XSetClipOrigin(T1_display, gc, 0, 0); } pglyph->bits=NULL; /* Since XDestroyImage() free's this also! */ xglyph.metrics.leftSideBearing=pglyph->metrics.leftSideBearing; xglyph.metrics.rightSideBearing=pglyph->metrics.rightSideBearing; xglyph.metrics.advanceX=pglyph->metrics.advanceX; xglyph.metrics.advanceY=pglyph->metrics.advanceY; xglyph.metrics.ascent=pglyph->metrics.ascent; xglyph.metrics.descent=pglyph->metrics.descent; xglyph.bpp=pglyph->bpp; return( &xglyph); } /* T1_SetStringX(...): Draw a string of characters into an X11 drawable */ GLYPH *T1_SetStringX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform) { GLYPH *pglyph; static GLYPH xglyph={NULL,{0,0,0,0,0,0},NULL,0}; int height, width; Pixmap clipmask=0; int opaque; xglyph.metrics.leftSideBearing=0; xglyph.metrics.rightSideBearing=0; xglyph.metrics.advanceX=0; xglyph.metrics.advanceY=0; xglyph.metrics.ascent=0; xglyph.metrics.descent=0; xglyph.pFontCacheInfo=NULL; opaque=mode; if ((pglyph=T1_SetString( FontID, string, len, spaceoff, modflag, size, transform))==NULL){ T1_PrintLog( "T1_SetStringX()", "T1_SetString() returned NULL-pointer!", T1LOG_WARNING); return(NULL); } /* Check for empty bitmap */ if (pglyph->bits==NULL) { xglyph=*pglyph; return( &xglyph); } width=pglyph->metrics.rightSideBearing-pglyph->metrics.leftSideBearing; height=pglyph->metrics.ascent-pglyph->metrics.descent; clipmask=XCreateBitmapFromData( T1_display, d, (char *)pglyph->bits, PAD(width, pFontBase->bitmap_pad), /* width */ height ); /* Correct position */ if (T1_lposition){ x_dest += pglyph->metrics.leftSideBearing; y_dest -= pglyph->metrics.ascent; } if (opaque==0){ XSetClipMask(T1_display, gc, clipmask); XSetClipOrigin(T1_display, gc, x_dest, y_dest); } XCopyPlane( T1_display, clipmask, d, gc, 0, 0, width, height, x_dest, y_dest, 0x01); if (clipmask){ XFreePixmap( T1_display, clipmask); clipmask=0; XSetClipMask(T1_display, gc, None); XSetClipOrigin(T1_display, gc, 0, 0); } pglyph->bits=NULL; /* Since XDestroyImage() free's this also! */ xglyph.metrics.leftSideBearing=pglyph->metrics.leftSideBearing; xglyph.metrics.rightSideBearing=pglyph->metrics.rightSideBearing; xglyph.metrics.advanceX=pglyph->metrics.advanceX; xglyph.metrics.advanceY=pglyph->metrics.advanceY; xglyph.metrics.ascent=pglyph->metrics.ascent; xglyph.metrics.descent=pglyph->metrics.descent; xglyph.bpp=pglyph->bpp; return( &xglyph); } /* T1_SetRectX(): Draw a rectangle into an x11 drawable */ GLYPH *T1_SetRectX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, float size, float rwidth, float rheight, T1_TMATRIX *transform) { GLYPH *pglyph; static GLYPH xglyph={NULL,{0,0,0,0,0,0},NULL,0}; int height, width; Pixmap clipmask=0; int opaque; xglyph.metrics.leftSideBearing=0; xglyph.metrics.rightSideBearing=0; xglyph.metrics.advanceX=0; xglyph.metrics.advanceY=0; xglyph.metrics.ascent=0; xglyph.metrics.descent=0; xglyph.pFontCacheInfo=NULL; opaque=mode; if ((pglyph=T1_SetRect( FontID, size, rwidth, rheight, transform))==NULL){ T1_PrintLog( "T1_SetRectrX()", "T1_SetRect() returned NULL-pointer!", T1LOG_WARNING); return(NULL); } /* Check for empty bitmap */ if (pglyph->bits==NULL) { xglyph=*pglyph; return( &xglyph); } width=pglyph->metrics.rightSideBearing-pglyph->metrics.leftSideBearing; height=pglyph->metrics.ascent-pglyph->metrics.descent; clipmask=XCreateBitmapFromData( T1_display, d, (char *)pglyph->bits, PAD(width, pFontBase->bitmap_pad), height ); /* Correct position */ if (T1_lposition){ x_dest += pglyph->metrics.leftSideBearing; y_dest -= pglyph->metrics.ascent; } if (opaque==0){ XSetClipMask(T1_display, gc, clipmask); XSetClipOrigin(T1_display, gc, x_dest, y_dest); } XCopyPlane( T1_display, clipmask, d, gc, 0, 0, width, height, x_dest, y_dest, 0x01); if (clipmask){ XFreePixmap( T1_display, clipmask); clipmask=0; XSetClipMask(T1_display, gc, None); XSetClipOrigin(T1_display, gc, 0, 0); } pglyph->bits=NULL; /* Since XDestroyImage() free's this also! */ xglyph.metrics.leftSideBearing=pglyph->metrics.leftSideBearing; xglyph.metrics.rightSideBearing=pglyph->metrics.rightSideBearing; xglyph.metrics.advanceX=pglyph->metrics.advanceX; xglyph.metrics.advanceY=pglyph->metrics.advanceY; xglyph.metrics.ascent=pglyph->metrics.ascent; xglyph.metrics.descent=pglyph->metrics.descent; xglyph.bpp=pglyph->bpp; return( &xglyph); } /* T1_AASetCharX(): Generate an object of type GLYPH, i.e, a glyph with a pixmap ID instead of a pointer to a bitmap: */ GLYPH *T1_AASetCharX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, char charcode, float size, T1_TMATRIX *transform) { int j, k; GLYPH *pglyph; XImage *ximage; static GLYPH xglyph={NULL,{0,0,0,0,0,0},NULL,0}; int height, width, width_pad; XGCValues xgcvalues; static unsigned long fg, bg; Pixmap clipmask=0; int clipmask_h, clipmask_v, line_off; char *clipmask_ptr; int opaque; xglyph.metrics.leftSideBearing=0; xglyph.metrics.rightSideBearing=0; xglyph.metrics.advanceX=0; xglyph.metrics.advanceY=0; xglyph.metrics.ascent=0; xglyph.metrics.descent=0; xglyph.pFontCacheInfo=NULL; opaque=mode; xglyph.bpp=T1_depth; /* In order to be able to contruct the pixmap we need to know foreground and background color as well the copy function */ XGetGCValues( T1_display, gc, T1GCMASK, &xgcvalues); fg=xgcvalues.foreground; bg=xgcvalues.background; /* At this point we must compute the colors that are needed to do antialiasing between fore- and background. The following function fills the static aacolors */ if (T1aa_SmartOn==0) j=T1_AAGetLevel(); else if (size>=T1aa_smartlimit2) j=1; else if (size>=T1aa_smartlimit1) j=2; else j=4; if ( j!=lastlevel || fg!=oldfg || bg!=oldbg ){ switch ( j){ case 1: if ( fg!=oldfg_n || bg!=oldbg_n){ oldfg_n=fg; oldbg_n=bg; /* computing colors is not necessary here */ T1_AANSetGrayValues( bg, fg); } break; case 2: if ( fg!=oldfg_l || bg!=oldbg_l){ T1_ComputeAAColorsX( fg, bg, AAMAXPLANES); /*~derekn*/ /* If fg=bg, the clipmask will be messed up; in this case */ /* we can arbitrarily change bg to get a correct clipmask. */ if (opaque == 0 && fg == bg) aapixels[0] = bg = (fg > 0) ? fg - 1 : fg + 1; oldfg_l=fg; oldbg_l=bg; T1_AASetGrayValues(aapixels[0], /* white */ aapixels[4], aapixels[8], aapixels[12], aapixels[16] ); /* black */ } break; case 4: if ( fg!=oldfg_h || bg!=oldbg_h){ T1_ComputeAAColorsX( fg, bg, AAMAXPLANES); /*~derekn*/ /* If fg=bg, the clipmask will be messed up; in this case */ /* we can arbitrarily change bg to get a correct clipmask. */ if (opaque == 0 && fg == bg) aapixels[0] = bg = (fg > 0) ? fg - 1 : fg + 1; oldfg_h=fg; oldbg_h=bg; T1_AAHSetGrayValues( aapixels); } break; } lastlevel=j; oldfg=fg; oldbg=bg; } if ((pglyph=T1_AASetChar( FontID, charcode, size, transform))==NULL){ T1_PrintLog( "T1_AASetCharX()", "T1_AASetChar() returned NULL-pointer!", T1LOG_WARNING); return(NULL); } /* Check for empty bitmap */ if (pglyph->bits==NULL) { xglyph=*pglyph; return( &xglyph); } width=pglyph->metrics.rightSideBearing-pglyph->metrics.leftSideBearing; height=pglyph->metrics.ascent-pglyph->metrics.descent; /* Correct position */ if (T1_lposition){ x_dest += pglyph->metrics.leftSideBearing; y_dest -= pglyph->metrics.ascent; } if (opaque==0){ clipmask_v=height; clipmask_h=width; width_pad=PAD(width*T1aa_bpp, pFontBase->bitmap_pad)/T1aa_bpp; clipmask_ptr=(char *)calloc((PAD(clipmask_h, 8)>>3) * clipmask_v, sizeof( char)); if (clipmask_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } /* Note: We pad the clipmask always to byte boundary */ if (pglyph->bpp==8) for ( k=0; k>3); for (j=0; jbits))[k*width_pad+j]!=bg) clipmask_ptr[line_off+(j>>3)] |= (0x01<<(j%8)); } } else if (pglyph->bpp==16) for ( k=0; k>3); for (j=0; jbits))[k*width_pad+j]!=(T1_AA_TYPE16)bg) clipmask_ptr[line_off+(j>>3)] |= (0x01<<(j%8)); } } else for ( k=0; k>3); for (j=0; jbits))[k*width_pad+j]!=(T1_AA_TYPE32)bg) clipmask_ptr[line_off+(j>>3)] |= (0x01<<(j%8)); } } clipmask=XCreateBitmapFromData( T1_display, d, (char *)clipmask_ptr, width, height ); free( clipmask_ptr); XSetClipMask(T1_display, gc, clipmask); XSetClipOrigin(T1_display, gc, x_dest, y_dest); } ximage=XCreateImage( T1_display, T1_visual, T1_depth, ZPixmap, /* XYBitmap or XYPixmap */ 0, /* No offset */ (char *)pglyph->bits, width, height, pFontBase->bitmap_pad, 0 /*PAD(width,8)/8*/ /* number of bytes per line */ ); ximage->byte_order=T1_byte_order; XPutImage(T1_display, d, gc, ximage, 0, 0, x_dest, y_dest, width, height ); XDestroyImage(ximage); if (clipmask){ XFreePixmap( T1_display, clipmask); clipmask=0; XSetClipMask(T1_display, gc, None); XSetClipOrigin(T1_display, gc, 0, 0); } pglyph->bits=NULL; /* Since XDestroyImage() free's this also! */ xglyph.metrics.leftSideBearing=pglyph->metrics.leftSideBearing; xglyph.metrics.rightSideBearing=pglyph->metrics.rightSideBearing; xglyph.metrics.advanceX=pglyph->metrics.advanceX; xglyph.metrics.advanceY=pglyph->metrics.advanceY; xglyph.metrics.ascent=pglyph->metrics.ascent; xglyph.metrics.descent=pglyph->metrics.descent; xglyph.bpp=pglyph->bpp; return( &xglyph); } /* T1_AASetStringX(...): Draw a string of characters into an X11 drawable */ GLYPH *T1_AASetStringX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform) { int j, k; GLYPH *pglyph; XImage *ximage; static GLYPH xglyph={NULL,{0,0,0,0,0,0},NULL,0}; int height, width, width_pad; XGCValues xgcvalues; static unsigned long fg, bg; Pixmap clipmask=0; int clipmask_h, clipmask_v, line_off; char *clipmask_ptr; int opaque; xglyph.metrics.leftSideBearing=0; xglyph.metrics.rightSideBearing=0; xglyph.metrics.advanceX=0; xglyph.metrics.advanceY=0; xglyph.metrics.ascent=0; xglyph.metrics.descent=0; xglyph.pFontCacheInfo=NULL; opaque=mode; /* In order to be able to contruct the pixmap we need to know foreground and background color as well the copy function */ XGetGCValues( T1_display, gc, T1GCMASK, &xgcvalues); fg=xgcvalues.foreground; bg=xgcvalues.background; xglyph.bpp=T1_depth; /* At this point we must compute the colors that are needed to do antialiasing between fore- and background. The following function fills the static aacolors */ if (T1aa_SmartOn==0) j=T1_AAGetLevel(); else if (size>=T1aa_smartlimit2) j=1; else if (size>=T1aa_smartlimit1) j=2; else j=4; if ( j!=lastlevel || fg!=oldfg || bg!=oldbg ){ switch ( j){ case 1: if ( fg!=oldfg_n || bg!=oldbg_n){ oldfg_n=fg; oldbg_n=bg; /* computing colors is not necessary here */ T1_AANSetGrayValues( bg, fg); } break; case 2: if ( fg!=oldfg_l || bg!=oldbg_l){ T1_ComputeAAColorsX( fg, bg, AAMAXPLANES); /*~derekn*/ /* If fg=bg, the clipmask will be messed up; in this case */ /* we can arbitrarily change bg to get a correct clipmask. */ if (opaque == 0 && fg == bg) aapixels[0] = bg = (fg > 0) ? fg - 1 : fg + 1; oldfg_l=fg; oldbg_l=bg; T1_AASetGrayValues(aapixels[0], /* white */ aapixels[4], aapixels[8], aapixels[12], aapixels[16] ); /* black */ } break; case 4: if ( fg!=oldfg_h || bg!=oldbg_h){ T1_ComputeAAColorsX( fg, bg, AAMAXPLANES); /*~derekn*/ /* If fg=bg, the clipmask will be messed up; in this case */ /* we can arbitrarily change bg to get a correct clipmask. */ if (opaque == 0 && fg == bg) aapixels[0] = bg = (fg > 0) ? fg - 1 : fg + 1; oldfg_h=fg; oldbg_h=bg; T1_AAHSetGrayValues( aapixels); } break; } lastlevel=j; oldfg=fg; oldbg=bg; } if ((pglyph=T1_AASetString( FontID, string, len, spaceoff, modflag, size, transform))==NULL){ T1_PrintLog( "T1_AASetStringX()", "T1_AASetString() returned NULL-pointer!", T1LOG_WARNING); return(NULL); } /* Check for empty bitmap */ if (pglyph->bits==NULL) { xglyph=*pglyph; return( &xglyph); } width=pglyph->metrics.rightSideBearing-pglyph->metrics.leftSideBearing; height=pglyph->metrics.ascent-pglyph->metrics.descent; /* Correct position */ if (T1_lposition){ x_dest += pglyph->metrics.leftSideBearing; y_dest -= pglyph->metrics.ascent; } if (opaque==0){ clipmask_v=height; clipmask_h=width; width_pad=PAD(width*T1aa_bpp, pFontBase->bitmap_pad)/T1aa_bpp; clipmask_ptr=(char *)calloc((PAD(clipmask_h, 8)>>3) * clipmask_v, sizeof( char)); if (clipmask_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } /* Note: We pad the clipmask always to byte boundary */ if (pglyph->bpp==8) for ( k=0; k>3); for (j=0; jbits))[k*width_pad+j]!=bg) clipmask_ptr[line_off+(j>>3)] |= (0x01<<(j%8)); } } else if (pglyph->bpp==16) for ( k=0; k>3); for (j=0; jbits))[k*width_pad+j]!=(T1_AA_TYPE16)bg) clipmask_ptr[line_off+(j>>3)] |= (0x01<<(j%8)); } } else for ( k=0; k>3); for (j=0; jbits))[k*width_pad+j]!=(T1_AA_TYPE32)bg) clipmask_ptr[line_off+(j>>3)] |= (0x01<<(j%8)); } } clipmask=XCreateBitmapFromData( T1_display, d, (char *)clipmask_ptr, width, height ); free( clipmask_ptr); XSetClipMask(T1_display, gc, clipmask); XSetClipOrigin(T1_display, gc, x_dest, y_dest); } ximage=XCreateImage( T1_display, T1_visual, T1_depth, ZPixmap, /* XYBitmap or XYPixmap */ 0, /* No offset */ (char *)pglyph->bits, width, height, pFontBase->bitmap_pad, /* lines padded to bytes */ 0 /*PAD(width,8)/8*/ /* number of bytes per line */ ); ximage->byte_order=T1_byte_order; XPutImage(T1_display, d, gc, ximage, 0, 0, x_dest, y_dest, width, height ); XDestroyImage(ximage); if (clipmask){ XFreePixmap( T1_display, clipmask); clipmask=0; XSetClipMask(T1_display, gc, None); XSetClipOrigin(T1_display, gc, 0, 0); } pglyph->bits=NULL; /* Since XDestroyImage() free's this also! */ xglyph.metrics.leftSideBearing=pglyph->metrics.leftSideBearing; xglyph.metrics.rightSideBearing=pglyph->metrics.rightSideBearing; xglyph.metrics.advanceX=pglyph->metrics.advanceX; xglyph.metrics.advanceY=pglyph->metrics.advanceY; xglyph.metrics.ascent=pglyph->metrics.ascent; xglyph.metrics.descent=pglyph->metrics.descent; xglyph.bpp=pglyph->bpp; return( &xglyph); } /* T1_AASetCharX(): Draw a rectangle into an x11 drawable */ GLYPH *T1_AASetRectX( Drawable d, GC gc, int mode, int x_dest, int y_dest, int FontID, float size, float rwidth, float rheight, T1_TMATRIX *transform) { int j, k; GLYPH *pglyph; XImage *ximage; static GLYPH xglyph={NULL,{0,0,0,0,0,0},NULL,0}; int height, width, width_pad; XGCValues xgcvalues; static unsigned long fg, bg; Pixmap clipmask=0; int clipmask_h, clipmask_v, line_off; char *clipmask_ptr; int opaque; xglyph.metrics.leftSideBearing=0; xglyph.metrics.rightSideBearing=0; xglyph.metrics.advanceX=0; xglyph.metrics.advanceY=0; xglyph.metrics.ascent=0; xglyph.metrics.descent=0; xglyph.pFontCacheInfo=NULL; opaque=mode; xglyph.bpp=T1_depth; /* In order to be able to contruct the pixmap we need to know foreground and background color as well the copy function */ XGetGCValues( T1_display, gc, T1GCMASK, &xgcvalues); fg=xgcvalues.foreground; bg=xgcvalues.background; /* At this point we must compute the colors that are needed to do antialiasing between fore- and background. The following function fills the static aacolors */ if (T1aa_SmartOn==0) j=T1_AAGetLevel(); else if (size>=T1aa_smartlimit2) j=1; else if (size>=T1aa_smartlimit1) j=2; else j=4; if ( j!=lastlevel || fg!=oldfg || bg!=oldbg ){ switch ( j){ case 1: if ( fg!=oldfg_n || bg!=oldbg_n){ oldfg_n=fg; oldbg_n=bg; /* computing colors is not necessary here */ T1_AANSetGrayValues( bg, fg); } break; case 2: if ( fg!=oldfg_l || bg!=oldbg_l){ T1_ComputeAAColorsX( fg, bg, AAMAXPLANES); /*~derekn*/ /* If fg=bg, the clipmask will be messed up; in this case */ /* we can arbitrarily change bg to get a correct clipmask. */ if (opaque == 0 && fg == bg) aapixels[0] = bg = (fg > 0) ? fg - 1 : fg + 1; oldfg_l=fg; oldbg_l=bg; T1_AASetGrayValues(aapixels[0], /* white */ aapixels[4], aapixels[8], aapixels[12], aapixels[16] ); /* black */ } break; case 4: if ( fg!=oldfg_h || bg!=oldbg_h){ T1_ComputeAAColorsX( fg, bg, AAMAXPLANES); /*~derekn*/ /* If fg=bg, the clipmask will be messed up; in this case */ /* we can arbitrarily change bg to get a correct clipmask. */ if (opaque == 0 && fg == bg) aapixels[0] = bg = (fg > 0) ? fg - 1 : fg + 1; oldfg_h=fg; oldbg_h=bg; T1_AAHSetGrayValues( aapixels); } break; } lastlevel=j; oldfg=fg; oldbg=bg; } if ((pglyph=T1_AASetRect( FontID, size, rwidth, rheight, transform))==NULL){ T1_PrintLog( "T1_AASetRectX()", "T1_AASetRect() returned NULL-pointer!", T1LOG_WARNING); return(NULL); } /* Check for empty bitmap */ if (pglyph->bits==NULL) { xglyph=*pglyph; return( &xglyph); } width=pglyph->metrics.rightSideBearing-pglyph->metrics.leftSideBearing; height=pglyph->metrics.ascent-pglyph->metrics.descent; /* Correct position */ if (T1_lposition){ x_dest += pglyph->metrics.leftSideBearing; y_dest -= pglyph->metrics.ascent; } if (opaque==0){ clipmask_v=height; clipmask_h=width; width_pad=PAD(width*T1aa_bpp, pFontBase->bitmap_pad)/T1aa_bpp; clipmask_ptr=(char *)calloc((PAD(clipmask_h, 8)>>3) * clipmask_v, sizeof( char)); if (clipmask_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } /* Note: We pad the clipmask always to byte boundary */ if (pglyph->bpp==8) for ( k=0; k>3); for (j=0; jbits))[k*width_pad+j]!=bg) clipmask_ptr[line_off+(j>>3)] |= (0x01<<(j%8)); } } else if (pglyph->bpp==16) for ( k=0; k>3); for (j=0; jbits))[k*width_pad+j]!=(T1_AA_TYPE16)bg) clipmask_ptr[line_off+(j>>3)] |= (0x01<<(j%8)); } } else for ( k=0; k>3); for (j=0; jbits))[k*width_pad+j]!=(T1_AA_TYPE32)bg) clipmask_ptr[line_off+(j>>3)] |= (0x01<<(j%8)); } } clipmask=XCreateBitmapFromData( T1_display, d, (char *)clipmask_ptr, width, height ); free( clipmask_ptr); XSetClipMask(T1_display, gc, clipmask); XSetClipOrigin(T1_display, gc, x_dest, y_dest); } ximage=XCreateImage( T1_display, T1_visual, T1_depth, ZPixmap, /* XYBitmap or XYPixmap */ 0, /* No offset */ (char *)pglyph->bits, width, height, pFontBase->bitmap_pad, 0 /*PAD(width,8)/8*/ /* number of bytes per line */ ); ximage->byte_order=T1_byte_order; XPutImage(T1_display, d, gc, ximage, 0, 0, x_dest, y_dest, width, height ); XDestroyImage(ximage); if (clipmask){ XFreePixmap( T1_display, clipmask); clipmask=0; XSetClipMask(T1_display, gc, None); XSetClipOrigin(T1_display, gc, 0, 0); } pglyph->bits=NULL; /* Since XDestroyImage() free's this also! */ xglyph.metrics.leftSideBearing=pglyph->metrics.leftSideBearing; xglyph.metrics.rightSideBearing=pglyph->metrics.rightSideBearing; xglyph.metrics.advanceX=pglyph->metrics.advanceX; xglyph.metrics.advanceY=pglyph->metrics.advanceY; xglyph.metrics.ascent=pglyph->metrics.ascent; xglyph.metrics.descent=pglyph->metrics.descent; xglyph.bpp=pglyph->bpp; return( &xglyph); } /* T1_ComputeAAColorsX(): Compute the antialiasing colors in dependency of foreground and background */ int T1_ComputeAAColorsX( unsigned long fg, unsigned long bg, int nolevels) { static unsigned long last_fg; static unsigned long last_bg; long delta_red, delta_green, delta_blue; int i; int nocolors=0; aacolors[0].pixel=bg; aacolors[nolevels-1].pixel=fg; if ((fg==last_fg)&&(bg==last_bg)) return(nocolors); /* Get RGB values for fore- and background */ XQueryColor( T1_display, T1_colormap, &aacolors[0]); XQueryColor( T1_display, T1_colormap, &aacolors[nolevels-1]); delta_red = (aacolors[nolevels-1].red - aacolors[0].red)/(nolevels-1); delta_green = (aacolors[nolevels-1].green - aacolors[0].green)/(nolevels-1); delta_blue = (aacolors[nolevels-1].blue - aacolors[0].blue)/(nolevels-1); aapixels[0]=aacolors[0].pixel; aapixels[nolevels-1]=aacolors[nolevels-1].pixel; for (i=1; ibits==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return( NULL); } if (pglyph->bpp==1) { /* we have a bitmap glyph */ ximage=XCreateImage( T1_display, T1_visual, 1, XYBitmap, /* XYBitmap or XYPixmap */ 0, /* No offset */ (char *)pglyph->bits, pglyph->metrics.rightSideBearing-pglyph->metrics.leftSideBearing, pglyph->metrics.ascent-pglyph->metrics.descent, pFontBase->bitmap_pad, 0 /* number of bytes per line */ ); } else { /* we have an anztialiased glyph */ ximage=XCreateImage( T1_display, T1_visual, T1_depth, ZPixmap, /* XYBitmap or XYPixmap */ 0, /* No offset */ (char *)pglyph->bits, pglyph->metrics.rightSideBearing-pglyph->metrics.leftSideBearing, pglyph->metrics.ascent-pglyph->metrics.descent, pFontBase->bitmap_pad, 0 /* number of bytes per line */ ); } if (ximage==NULL) { T1_errno=T1ERR_X11; return( NULL); } ximage->byte_order=T1_byte_order; /* Set t1lib´s byteorder */ return( ximage); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1misc.h0000664000175000017500000001566311742726711022660 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1misc.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2004-11-27 ----- Description: This file is part of the t1-library. It contains some miscellaneous definitions. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2004. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #include #define LINE_BUF 512 #define BUF_SIZE 512 #define NULLPTR (void *) 0 /* t1lib-glyphs are padded to this value by default: */ #define T1GLYPH_PAD 8 #define T1GLYPH_BIT 0 #define T1GLYPH_BYTE 0 #define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) /* For debugging purposes: */ #define SLEEP for(j=0; j<50; j++){for (k=0; k<65536; k++);} #define KERN_FLAG 0x01 #define LIGATURE_FLAG 0x02 /* common 'yes'/'no' */ #define T1_YES 0x1 #define T1_NO 0x0 /* The maximum length of a PostScript name of a font: */ #define MAXPSNAMELEN 256 #ifndef MAXPATHLEN # ifdef PATH_MAX # define MAXPATHLEN PATH_MAX # else # define MAXPATHLEN 4096 # endif #endif /* The default resolution used by the library */ #define DEFAULT_RES 72.0 #define BIGPOINTSPERINCH 72.0 /* Defaults for configuration file searching: */ /* (Note: The directory where the global config will be located is determined by configure at compile time) */ #define T1_CONFIGFILENAME ".t1librc" #define ENV_CONF_STRING "T1LIB_CONFIG" #define GLOBAL_CONFIG_FILE "t1lib.config" /* Directory separator is operating system dependent */ #if defined(VMS) # define DIRECTORY_SEP "]" # define DIRECTORY_SEP_CHAR ']' #elif defined(MSDOS) | defined(_WIN32) | defined(_MSC_VER) # define DIRECTORY_SEP "\\" # define DIRECTORY_SEP_CHAR '\\' #else # define DIRECTORY_SEP "/" # define DIRECTORY_SEP_CHAR '/' #endif /* For EMX-, WIN32-, MSDOS-environment, we define the default path separator to be ';' instead of ':' */ #if defined(MSDOS) | defined(_WIN32) | defined(__EMX__) | defined(_MSC_VER) | defined(VMS) #define PATH_SEP ";" #define PATH_SEP_CHAR ';' #else #define PATH_SEP ":" #define PATH_SEP_CHAR ':' #endif /* This non printable character is used internally */ #define INTERNAL_PATH_SEP "\001" #define INTERNAL_PATH_SEP_CHAR '\1' /* Default name for t1lib-logfile: */ #define ENV_LOG_STRING "T1LIB_LOGMODE" #define T1_LOG_FILE "t1lib.log" /* logfile levels: */ #define T1LOG_ERROR 1 #define T1LOG_WARNING 2 #define T1LOG_STATISTIC 3 #define T1LOG_DEBUG 4 /* def's for T1_InitLib() */ #define NO_LOGFILE 0x0 #define LOGFILE 0x1 #define IGNORE_FONTDATABASE 0x2 /* Default is to read database */ #define IGNORE_CONFIGFILE 0x4 /* Default is to read config file */ #define T1_AA_CACHING 0x8 /* Cache aa-bytes */ #define T1_NO_AFM 0x10 /* Don't load AFM files or generate AFM data */ /* How may ligatures a character may have at maximum: */ #define MAX_LIGS 20 /* The maximum number of gray-levels in antialiasing */ #define AAMAXPLANES 17 #define T1_AA_NONE 1 #define T1_AA_LOW 2 #define T1_AA_HIGH 4 /* The default limits for no/low/high AA */ #define T1_AA_SMARTLIMIT1 20.0 #define T1_AA_SMARTLIMIT2 60.0 /* How much to advance the number of FONTPRIVATE structures when reallocating for new fonts? */ #define ADVANCE_FONTPRIVATE 10 #define NO_ANTIALIAS 0 #define ANTIALIAS 1 /* #define's for manipulating searchpaths */ #define T1_PFAB_PATH 0x01 #define T1_AFM_PATH 0x02 #define T1_ENC_PATH 0x04 #define T1_FDB_PATH 0x08 #define T1_APPEND_PATH 0x00 #define T1_PREPEND_PATH 0x01 /* #define's for character/string properties (not all implemented) */ #define T1_DEFAULT 0x0000 #define T1_UNDERLINE 0x0001 #define T1_OVERLINE 0x0002 #define T1_OVERSTRIKE 0x0004 #define T1_DOUBLEOVERSTRIKE 0x0008 #define T1_RIGHT_TO_LEFT 0x0010 #define T1_SUBSCRIPT 0x0100 #define T1_SUPERSCRIPT 0x0200 #define T1_STROKED 0x1000 #define T1_KERNING 0x2000 /* Error handling: */ /* These are from scanning a font file */ #define T1ERR_SCAN_FONT_FORMAT -5 #define T1ERR_SCAN_FILE_OPEN_ERR -4 #define T1ERR_SCAN_OUT_OF_MEMORY -3 #define T1ERR_SCAN_ERROR -2 #define T1ERR_SCAN_FILE_EOF -1 /* These are from generating paths */ #define T1ERR_PATH_ERROR 1 #define T1ERR_PARSE_ERROR 2 #define T1ERR_TYPE1_ABORT 3 /* These are from t1lib */ #define T1ERR_INVALID_FONTID 10 #define T1ERR_INVALID_PARAMETER 11 #define T1ERR_OP_NOT_PERMITTED 12 #define T1ERR_ALLOC_MEM 13 #define T1ERR_FILE_OPEN_ERR 14 #define T1ERR_UNSPECIFIED 15 #define T1ERR_NO_AFM_DATA 16 #define T1ERR_X11 17 #define T1ERR_COMPOSITE_CHAR 18 #define T1ERR_SCAN_ENCODING 19 /* The info_flags meaning */ #define AFM_SUCCESS (short)0x0001 #define AFM_SLOPPY_SUCCESS (short)0x0002 #define AFM_SELFGEN_SUCCESS (short)0x0004 #define USES_STANDARD_ENCODING (short)0x0008 #define RASTER_STROKED (short)0x0010 #define CACHE_STROKED (short)0x0020 #define FONT_NOCACHING (short)0x0100 #ifndef PI #define PI 3.1415927 #endif /* Flags to control the rasterizer */ #define T1_IGNORE_FORCEBOLD 0x0001 #define T1_IGNORE_FAMILYALIGNMENT 0x0002 #define T1_IGNORE_HINTING 0x0004 #define T1_DEBUG_LINE 0x0100 #define T1_DEBUG_REGION 0x0200 #define T1_DEBUG_PATH 0x0400 #define T1_DEBUG_FONT 0x0800 #define T1_DEBUG_HINT 0x1000 /* */ #define DO_RASTER 0x1 #define DO_NOT_RASTER 0x0 /* this definition reports a character substitution from fontfcn */ #define FF_NOTDEF_SUBST -1 xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1subset.h0000664000175000017500000000557411742726711023232 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1subset.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2004-12-02 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1subset.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2004. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1SUBSET_C #define T1_SUBSET_DEFAULT 0x00 #define T1_SUBSET_FORCE_REENCODE 0x01 #define T1_SUBSET_SKIP_REENCODE 0x02 #define T1_SUBSET_ENCRYPT_BINARY 0x04 /* This is only for debugging, it does not produce valid font-files! */ #define T1_SUBSET_ENCRYPT_NONE 0x08 /* Functions used from the t1io-module, partially written and added for font-subsetting. We don't care about the special F_FILE-type defined in that module because all accesses are done via pointers. */ extern unsigned long T1GetFileSize( FILE *f); extern FILE *T1Open( char *fn, char *mode); extern int T1Gets(char *string, int size, FILE *f); extern int T1GetDecrypt( void); extern int T1GetTrailer(char *string, int size, FILE *f); extern int T1Close( FILE *f); extern void T1io_reset( void); extern int T1int_QuerySEAC( int FontID, unsigned char index, unsigned char* piece1, unsigned char* piece2 ); char *T1_SubsetFont( int FontID, char *mask, unsigned int flags, int linewidth, unsigned long maxblocksize, unsigned long *bufsize); char *T1_GetCharString( int FontID, char *charname, int *len); int T1_GetlenIV( int FontID); #define ZEROS 512 #else extern char *T1_SubsetFont( int FontID, char *mask, unsigned int flags, int linewidth, unsigned long maxblocksize, unsigned long *bufsize); extern char *T1_GetCharString( int FontID, char *charname, int *len); extern int T1_GetlenIV( int FontID); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1finfo.c0000664000175000017500000011542611742726711023017 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1finfo.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2005-05-01 ----- Description: This file is part of the t1-library. It contains functions for accessing afm-data and some other fontinformation data. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1FINFO_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/paths.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1finfo.h" #include "t1base.h" #include "t1misc.h" #include "t1set.h" #include "t1load.h" /* The following variable controls the computation of the bbox internal to T1_GetMetricsInfo(). Its influence may be overridden by the global variable ForceAFMBBox: */ static int ForceAFMBBoxInternal=0; extern int ForceAFMBBox; extern char *t1_get_abort_message( int number); /* int T1_GetKerning(): This function returns the amount of kerning that is specified in the afm-file for the supplied character-pair. If an an extension has been applied to the font in question, this is taken into account. If for whatever reason there's no afm information available (that's not deadly), simply 0 is returned, indicating that no kerning should be used. The value returned is meant to be in character space coordinates. Thus, it must be transformed to be applicable in device space. */ int T1_GetKerning( int FontID, char char1, char char2) { METRICS_ENTRY entry; METRICS_ENTRY *target_pair=NULL; /* Check whether font is loaded: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( 0); } /* if there's no kerning info, return immediately */ if (pFontBase->pFontArray[FontID].KernMapSize==0) return( 0); entry.chars=(char1<<8) | char2; if ((target_pair=(METRICS_ENTRY *) bsearch( &entry, pFontBase->pFontArray[FontID].pKernMap, (size_t) pFontBase->pFontArray[FontID].KernMapSize, sizeof(METRICS_ENTRY), &cmp_METRICS_ENTRY))==NULL) return(0); else return( target_pair->hkern * pFontBase->pFontArray[FontID].extend); } /* int T1_GetCharWidth(): This function returns the characterwidth specified in the .afm-file. If no .afm-file is loaded for that font, 0 is returned. Note that if one tries to raster strings, afm data must always be available. The returned character width is corrected using a possibly applied font extension! */ int T1_GetCharWidth( int FontID, char char1) { unsigned char uchar1; uchar1=(unsigned char) char1; /* Check whether font is loaded: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( 0); } /* return appriate value */ if (pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]>0) { /* ordinary character */ return((int) ((pFontBase->pFontArray[FontID].pAFMData->cmi[pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]-1].wx) * pFontBase->pFontArray[FontID].extend)); } else if (pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]<0) { /* composite character */ return((int) ((pFontBase->pFontArray[FontID].pAFMData->ccd[-(pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]+1)].wx) * pFontBase->pFontArray[FontID].extend)); } else { /* undefined or .notdef */ return(0); } } /* T1_GetCharBBox(): Get the BoundingBox of specified character. If an extension factor has been applied to the font in question, this is taken into account. However, a slant factor which has been applied to the font, also affects the bounding box of a character. The only way to determine its influence on the character bounding box is to compute the exact shape of that slanted character. There's no simple way to extract the new bounding box from the former bounding box. Thus, if a font has been slanted, the characters outline itself is examined. Since this must be done at 1000 bp it takes considerably longer than reading afm data. */ BBox T1_GetCharBBox( int FontID, char char1) { struct region *area; struct XYspace *S; int mode=0; int i; BBox NullBBox= { 0, 0, 0, 0}; /* A bounding box containing all 0's. */ BBox ResultBox= { 0, 0, 0, 0}; /* The Box returned if char is found */ unsigned char uchar1; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_GetCharBBox()", err_warn_msg_buf, T1LOG_ERROR); return( NullBBox); } uchar1=(unsigned char) char1; /* Check whether font is loaded: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NullBBox); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( NullBBox); } /* Check for a font slant */ if ((pFontBase->pFontArray[FontID].slant!=0.0) &&(ForceAFMBBox==0) &&(ForceAFMBBoxInternal==0)){ /* We have a font slant -> character outline must be examined in order to determine bounding box */ /* Set up an identity charspace matrix and take a slant and an extension into account */ /* And make it permanent, to plug a memory leak */ S=(struct XYspace *)IDENTITY; S=(struct XYspace *)Permanent (Transform(S, pFontBase->pFontArray[FontID].FontTransform[0], pFontBase->pFontArray[FontID].FontTransform[1], pFontBase->pFontArray[FontID].FontTransform[2], pFontBase->pFontArray[FontID].FontTransform[3])); /* Genrate an edgelist for the current character at size 1000bp using current transformation and encoding: */ area=fontfcnB( FontID, 0, S, pFontBase->pFontArray[FontID].pFontEnc, (int) uchar1, &mode, pFontBase->pFontArray[FontID].pType1Data, DO_RASTER,0.0f); /* Read out bounding box */ ResultBox.llx =area->xmin; ResultBox.urx =area->xmax; ResultBox.lly =area->ymin; ResultBox.ury =area->ymax; /* Reset AFM-switch and return BBox */ ForceAFMBBoxInternal=0; /* make sure to destroy 'area' before leaving! */ KillRegion (area); /* make sure to free S */ if (S) { KillSpace (S); } return(ResultBox); } else{ /* Assign bounding box for the different cases: */ /* Check if character is */ if (pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]>0) { /* ordinary char */ ResultBox=(pFontBase->pFontArray[FontID].pAFMData->cmi[pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]-1].charBBox); } else if (pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]<0) { /* composite char */ ResultBox=(pFontBase->pFontArray[FontID].pAFMData->ccd[-(pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]+1)].charBBox); } else { /* undefined char */ return(NullBBox); } /* .. and apply transformations: */ ResultBox.llx *=pFontBase->pFontArray[FontID].extend; ResultBox.urx *=pFontBase->pFontArray[FontID].extend; return(ResultBox); } } /* int T1_GetUnderlinePosition(): Return underline position of specified font in charspace units. If 0 is returned, it indicated that the font is not yet loaded into memory. or an invalid ID has been specified. */ float T1_GetUnderlinePosition( int FontID) { if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return((float)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[UNDERLINEPOSITION].value.data.real)); } /* int T1_GetUnderlineThickness(): Return underline thickness of specified font in charspace units. If 0 is returned, it indicated that the font is not yet loaded into memory. or an invalid ID has been specified. */ float T1_GetUnderlineThickness( int FontID) { if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return((float)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[UNDERLINETHICKNESS].value.data.real)); } /* int T1_ItalicAngle(): Return underline position of specified font in charspace units. If 0.0 is returned, it indicated that the font is not yet loaded into memory. or an invalid ID has been specified. */ float T1_GetItalicAngle( int FontID) { if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return((float)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ITALICANGLE].value.data.real)); } /* int T1_GetUnderlinePosition(): Return underline position of specified font in charspace units. If 0 is returned, it indicated that the font is not yet loaded into memory. or an invalid ID has been specified. */ int T1_GetIsFixedPitch( int FontID) { if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return((int)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ISFIXEDPITCH].value.data.boolean)); } /* char *T1_GetFontName( FontID): Get the PostScript FontName of the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetFontName( int FontID) { static char fontname[MAXPSNAMELEN]; if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(fontname, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTNAME].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTNAME].value.len); fontname[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTNAME].value.len]=0; return(fontname); } /* char *T1_GetFullName( FontID): Get the Full Name from the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetFullName( int FontID) { static char fullname[MAXPSNAMELEN]; if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(fullname, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FULLNAME].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FULLNAME].value.len); fullname[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FULLNAME].value.len]=0; return(fullname); } /* char *T1_GetFamilyName( FontID): Get the Family Name of the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetFamilyName( int FontID) { static char familyname[MAXPSNAMELEN]; if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(familyname, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FAMILYNAME].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FAMILYNAME].value.len); familyname[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FAMILYNAME].value.len]=0; return(familyname); } /* char *T1_GetWeight( FontID): Get the Weight entry from the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetWeight( int FontID) { static char weight[128]; if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(weight, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[WEIGHT].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[WEIGHT].value.len); weight[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[WEIGHT].value.len]=0; return(weight); } /* char *T1_GetFontName( FontID): Get the Version entry from the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetVersion( int FontID) { static char version[2048]; if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(version, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[VERSION].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[VERSION].value.len); version[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[VERSION].value.len]=0; return(version); } /* char *T1_GetNotice( FontID): Get the Notice entry from the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetNotice( int FontID) { static char notice[2048]; if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(notice, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[NOTICE].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[NOTICE].value.len); notice[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[NOTICE].value.len]=0; return(notice); } /* char *T1_GetCharName(): Get the PostScript character name of the character indexed by char1. */ char *T1_GetCharName( int FontID, char char1) { static char cc_name1[256]; char *c1; if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } if (pFontBase->pFontArray[FontID].pFontEnc==NULL){ /* We have to get the names from the fonts internal encoding */ c1= (char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].data.arrayP; strncpy(cc_name1, (char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].data.arrayP, pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].len); cc_name1[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].len]=0; } else{ /* Take names from explicitly loaded and assigned encoding */ c1=pFontBase->pFontArray[FontID].pFontEnc[(unsigned char)char1]; strcpy(cc_name1,c1); } /* Return address of charname */ return(cc_name1); } /* T1_QueryLigs(): Get the number of ligatures defined in the font FontID for the character which is located at position char1 in the current encoding vector! Function returns the number of defined ligs (including 0) or -1 if an error occured. */ int T1_QueryLigs( int FontID, char char1, char **successors, char **ligatures) { FontInfo *afm_ptr; CharMetricInfo *m_ptr; char *c_name; char cc_name[128]; static char succ[MAX_LIGS]; int succ_index; static char lig[MAX_LIGS]; int lig_index; Ligature *ligs; int i,j; /* Check whether font is loaded: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( -1); } /* All OK, ... */ afm_ptr=pFontBase->pFontArray[FontID].pAFMData; m_ptr=afm_ptr->cmi; /* Get the name of the character: */ if (pFontBase->pFontArray[FontID].pFontEnc==NULL){ /* We have to get the name from the fonts internal encoding */ c_name=(char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].data.arrayP; strncpy(cc_name, (char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].data.arrayP, pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].len); cc_name[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].len]=0; } else{ /* Take name from explicitly loaded and assigned encoding */ c_name=pFontBase->pFontArray[FontID].pFontEnc[(unsigned char)char1]; strcpy(cc_name,c_name); } for (i=0; inumOfChars; i++){ if (strcmp(m_ptr[i].name,cc_name)==0) break; } if (i==afm_ptr->numOfChars) /* we didn't find the characters name */ return(-1); ligs=m_ptr[i].ligs; j=0; if (ligs==NULL) return(0); while (ligs!=NULL) { /* Get indices of the two characters: */ if ((succ_index=T1_GetEncodingIndex( FontID, (char*) ligs->succ))==-1) { /* successor is not current encoding */ ligs=ligs->next; continue; } if ((lig_index=T1_GetEncodingIndex( FontID, (char*) ligs->lig))==-1) { /* Specified ligature is not in current encoding */ ligs=ligs->next; continue; } succ[j]=(char)succ_index; lig[j]=(char)lig_index; j++; ligs=ligs->next; } *successors=succ; *ligatures=lig; return(j); } /* T1_GetEncodingIndex(): Return the Index of char1 in the current encoding vector of font FontID */ int T1_GetEncodingIndex( int FontID, char *char1) { int i; int len1; int result_index; char **extern_enc; psobj *objptr; if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } extern_enc=pFontBase->pFontArray[FontID].pFontEnc; len1=strlen( char1); /* The default return-value if character is not found: */ result_index=-1; if (extern_enc==NULL) { objptr=&(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[0]); /* We have to search the fonts internal encoding */ for (i=0;i<256;i++){ if (len1==objptr[i].len){ if (strncmp((char *)objptr[i].data.arrayP, char1, objptr[i].len)==0){ result_index=i; break; } } } } else { /* Take name from explicitly loaded and assigned encoding */ for (i=0;i<256;i++){ if (strcmp(extern_enc[i], char1)==0){ result_index=i; break; } } } return(result_index); } /* T1_GetEncodingIndices(): Return all indices of char1 in the current encoding vector of font FontID. */ int *T1_GetEncodingIndices( int FontID, char *char1) { int i; int endmark=0; int len1; char **extern_enc; psobj *objptr; /* the following array suffices for the extreme unlikely case of a font where one single fillsthe whole encoding vector */ static int indices[257]; if (T1_CheckForFontID(FontID)!=1) { T1_errno=T1ERR_INVALID_FONTID; return(NULL); } extern_enc=pFontBase->pFontArray[FontID].pFontEnc; len1=strlen( char1); if (extern_enc==NULL) { objptr=&(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[0]); /* We have to search the fonts internal encoding */ for (i=0;i<256;i++){ if (len1==objptr[i].len){ if (strncmp((char *)objptr[i].data.arrayP, char1, objptr[i].len)==0){ indices[endmark++]=i; } } } } else { /* Take name from explicitly loaded and assigned encoding */ for (i=0;i<256;i++){ if (strcmp(extern_enc[i], char1)==0){ indices[endmark++]=i; } } } indices[endmark]=-1; return((int *)indices); } /* int T1_GetStringWidth(): This function returns the width of string in .afm-file units. If no .afm-file is loaded for font FontID, 0 is returned. Note that if one tries to raster strings, afm data should always be available. The returned character width is corrected using a possibly applied font extension! */ int T1_GetStringWidth( int FontID, char *string, int len, long spaceoff, int kerning) { int no_chars; /* Number of chars in string */ int i; int *kern_pairs; int *charwidths; int spacewidth; int stringwidth; unsigned char *ustring; ustring=(unsigned char *) string; /* First, check for a correct ID */ i=T1_CheckForFontID(FontID); if (i!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( 0); } /* Get length of string: */ if (len<0 || ustring == NULL){ /* invalid length or NULL-pointer */ T1_errno=T1ERR_INVALID_PARAMETER; return(0); } if (len==0) /* should be computed assuming "normal" 0-terminated string */ no_chars=strlen(string); else /* use value given on command line */ no_chars=len; switch (no_chars) { case 0: /* Empty string has width 0 */ stringwidth=0; break; case 1: /* Width of string with 1 character is the width of that character. If the character is a space, adjust by the value of spaceoff. */ stringwidth=T1_GetCharWidth(FontID,ustring[0]); if (ustring[0]==pFontBase->pFontArray[FontID].space_position) stringwidth+=spaceoff; break; default: /* Two or more characters. Add widths of characters and adjust by the adjustment widths for any kerning pairs. For spaces, use the width of the space character in the font adjusted by the value of spaceoff. */ /* Allocate room for temporary arrays of kerning and width arrays: */ kern_pairs=(int *)calloc(no_chars -1, sizeof(int)); if (kern_pairs==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(0); } charwidths=(int *)calloc(no_chars, sizeof(int)); if (charwidths==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(0); } /* If kerning is requested, get kerning amounts and fill the array: */ if (kerning){ for (i=0; ipFontArray[FontID].space_position)+spaceoff; /* Fill the width-array: */ for (i=0; ipFontArray[FontID].space_position) charwidths[i]=(int)spacewidth; else charwidths[i]=T1_GetCharWidth(FontID,ustring[i]); } /* Accumulate width: */ stringwidth=0; for (i=0; ipFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( NullBBox); } /* Get length of string: */ if (len<0 || string==NULL) { /* invalid length or NULL-pointer */ T1_errno=T1ERR_INVALID_PARAMETER; return(NullBBox); } if (len==0) /* should be computed assuming "normal" 0-terminated string */ no_chars=strlen(string); else /* use value given on command line */ no_chars=len; spacewidth= T1_GetCharWidth(FontID,pFontBase->pFontArray[FontID].space_position)+spaceoff; /* Accumulate metrics: */ for (i=0; ipFontArray[FontID].space_position) curr_width +=spacewidth; else{ tmp_BBox=T1_GetCharBBox( FontID, string[i]); if (curr_width+tmp_BBox.llx < lsb_min) lsb_min=curr_width+tmp_BBox.llx; if (curr_width+tmp_BBox.urx > rsb_max) rsb_max=curr_width+tmp_BBox.urx; if (tmp_BBox.lly < overalldescent) overalldescent=tmp_BBox.lly; if (tmp_BBox.ury > overallascent) overallascent=tmp_BBox.ury; curr_width +=T1_GetCharWidth( FontID, string[i]); if ((ipFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( metrics); } /* Get length of string: */ if (len<0 || ustring==NULL ) { /* invalid length or NULL_pointer */ T1_errno=T1ERR_INVALID_PARAMETER; return(metrics); } if (len==0) /* should be computed assuming "normal" 0-terminated string */ no_chars=strlen(string); else /* use value given on command line */ no_chars=len; /* Compute the correct spacewidth value (in charspace units): */ spacewidth=T1_GetCharWidth(FontID,pFontBase->pFontArray[FontID].space_position)+spaceoff; /* Allocate memory for character positions array: */ metrics.charpos=(int *)calloc(no_chars, sizeof(int)); metrics.numchars=no_chars; /* Accumulate metrics: */ for (i=0; ipFontArray[FontID].space_position) curr_width +=spacewidth; else{ tmp_BBox=T1_GetCharBBox( FontID, string[i]); if (curr_width+tmp_BBox.llx < lsb_min) lsb_min=curr_width+tmp_BBox.llx; if (curr_width+tmp_BBox.urx > rsb_max) rsb_max=curr_width+tmp_BBox.urx; if (tmp_BBox.lly < overalldescent) overalldescent=tmp_BBox.lly; if (tmp_BBox.ury > overallascent) overallascent=tmp_BBox.ury; curr_width +=T1_GetCharWidth( FontID, string[i]); if ((ipFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[0]); outbox.llx = objPIsInteger(obj) ? obj->data.integer : obj->data.real > 0 ? (int) ceil(obj->data.real) : (int) floor(obj->data.real); obj = &(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[1]); outbox.lly = objPIsInteger(obj) ? obj->data.integer : obj->data.real > 0 ? (int) ceil(obj->data.real) : (int) floor(obj->data.real); obj = &(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[2]); outbox.urx = objPIsInteger(obj) ? obj->data.integer : obj->data.real > 0 ? (int) ceil(obj->data.real) : (int) floor(obj->data.real); obj = &(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[3]); outbox.ury = objPIsInteger(obj) ? obj->data.integer : obj->data.real > 0 ? (int) ceil(obj->data.real) : (int) floor(obj->data.real); return( outbox); } /* T1_GetAllCharNames(): Get a list of all defined character names in in the font FontID: */ char **T1_GetAllCharNames( int FontID) { static char **bufmem=NULL; register char *namedest; psdict *pCharStrings; int len, i, j; long nameoffset; int bufmemsize=0; /* return NULL if font not loaded */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( NULL); } pCharStrings=pFontBase->pFontArray[FontID].pType1Data->CharStringsP; /* First, get number of charstrings: */ len=pCharStrings[0].key.len; /* We must be careful here: size of the charstrings dict might be larger than the actual number of charstrings. We correct for this by reducing the value of len appropriately */ for ( i=1; i<=len; i++){ /* calculate room for each characters name plus the prepending \0 */ if ((j=pCharStrings[i].key.len)){ bufmemsize += j + 1; } else{ /* we skip this (the remaining) entries */ len--; i--; } } /* Now we reserve memory for the pointers (including final NULL) */ nameoffset=(len+1)*sizeof( char *); bufmemsize += nameoffset; /* Now allocate memory, copy strings and initialize pointers */ if (bufmem!=NULL) free(bufmem); if ((bufmem=(char **)malloc( bufmemsize))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } namedest=(char *)((long)bufmem + nameoffset); j=0; for ( i=0; ipFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( -1); } return( pFontBase->pFontArray[FontID].pAFMData->numOfPairs); } /* A function for comparing METRICS_ENTRY structs */ static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2) { if (((METRICS_ENTRY *)entry1)->chars < ((METRICS_ENTRY *)entry2)->chars) return(-1); if (((METRICS_ENTRY *)entry1)->chars > ((METRICS_ENTRY *)entry2)->chars) return(1); return(0); /* This should not happen */ } /* A few functions for accessing composite character data: */ /* T1_GetNoCompositeChars(): Return the number of characters for for which composite character information is available for font FontID */ int T1_GetNoCompositeChars( int FontID) { /* Check whether font is loaded: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( -1); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( -1); } return( pFontBase->pFontArray[FontID].pAFMData->numOfComps); } /* T1_QueryCompositeChar(): Query whether char1 from font FontID is a composite character. If so, the index of the composite character data within the afm array is returned. The index can be used to retrieve the retrieve the composite character data. retval>=0: index into AFM-array where the corresponding composite char data is located retval=-1: No composite character, but result is valid, retval=-2: No composite character, but result is invalid. T1_errno indicated the reason. */ int T1_QueryCompositeChar( int FontID, char char1) { unsigned char uchar1; uchar1=char1; /* Check whether font is loaded: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( -2); } /* If no AFM info is present, we return -2 */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( -2); } if (pFontBase->pFontArray[FontID].pEncMap[ uchar1]<0) { /* composite char */ return( -(pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]+1)); } return(-1); } /* T1_GetCompCharData(): Retrieve data to construct composite character char1 from font FontID. In case of an error NULL is returned and T1_errno is set appropriately. */ T1_COMP_CHAR_INFO *T1_GetCompCharData( int FontID, char char1) { T1_COMP_CHAR_INFO *cci=NULL; CompCharData *ccd=NULL; int afmind=-1; int i; unsigned char uchar1; /* Check whether font is loaded: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( cci); } /* If no AFM info is present, we return -2 */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( cci); } if ((cci=(T1_COMP_CHAR_INFO*)malloc( sizeof(T1_COMP_CHAR_INFO)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( cci); } uchar1=(unsigned char)char1; /* set default values */ cci->compchar=uchar1; cci->numPieces=1; cci->pieces=NULL; /* check char1 */ if ((afmind=pFontBase->pFontArray[FontID].pEncMap[uchar1]) >= 0) { /* char is no composite char */ return(cci); } /* character is a composite char-> retrieve index and pointer into AFM data */ afmind=-(afmind+1); ccd=&(pFontBase->pFontArray[FontID].pAFMData->ccd[afmind]); /* cci->compchar is already setup correctly because char1 is a composite character */ cci->numPieces=ccd->numOfPieces; /* we expect numPieces to be >1 */ if ((cci->pieces=(T1_COMP_PIECE *)malloc( sizeof(T1_COMP_PIECE)* cci->numPieces))==NULL) { T1_errno=T1ERR_ALLOC_MEM; free( cci); return( NULL); } /* Copy information */ for (i=0; inumPieces; i++) { cci->pieces[i].piece=T1_GetEncodingIndex( FontID, ccd->pieces[i].pccName); cci->pieces[i].deltax=ccd->pieces[i].deltax; cci->pieces[i].deltay=ccd->pieces[i].deltay; } return( cci); } /* T1_GetCompCharDataByIndex(): Retrieve data to construct composite characters form font FontID. The data is addressed by index which may, for example, have been obtained by a call to T1_QueryCompositeChar(). In case of error NULL is returned and T1_errno is set appropriately. */ T1_COMP_CHAR_INFO *T1_GetCompCharDataByIndex( int FontID, int index) { T1_COMP_CHAR_INFO *cci=NULL; CompCharData *ccd=NULL; int i; /* Check whether font is loaded: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( cci); } /* If no AFM info is present, we return -2 */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( cci); } /* range check for index */ if ((index < 0) || (index >= pFontBase->pFontArray[FontID].pAFMData->numOfComps)) { T1_errno=T1ERR_INVALID_PARAMETER; return( cci); } /* Alloc mem */ if ((cci=(T1_COMP_CHAR_INFO*)malloc( sizeof(T1_COMP_CHAR_INFO)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( cci); } /* set source pointer */ ccd=&(pFontBase->pFontArray[FontID].pAFMData->ccd[index]); /* and copy information */ cci->compchar=T1_GetEncodingIndex( FontID, ccd->ccName); cci->numPieces=ccd->numOfPieces; /* we expect numPieces to be >1 */ if ((cci->pieces=(T1_COMP_PIECE *)malloc( sizeof(T1_COMP_PIECE)* cci->numPieces))==NULL) { T1_errno=T1ERR_ALLOC_MEM; free( cci); return( NULL); } /* Copy information */ for (i=0; inumPieces; i++) { cci->pieces[i].piece=T1_GetEncodingIndex( FontID, ccd->pieces[i].pccName); cci->pieces[i].deltax=ccd->pieces[i].deltax; cci->pieces[i].deltay=ccd->pieces[i].deltay; } return( cci); } /* T1_IsInternalChar(): Query whether the character in encoding slot char1 of font FontID has an internal definition (CharString) or whether it is constructed by t1lib from elementary units */ int T1_IsInternalChar( int FontID, char char1) { unsigned char uchar1; char *charname; psdict *pCharStrings; int len, i, j; /* return NULL if font not loaded */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( -1); } pCharStrings=pFontBase->pFontArray[FontID].pType1Data->CharStringsP; uchar1=(unsigned char)char1; charname=T1_GetCharName( FontID, uchar1); /* First, get the maximum number of charstrings: */ len=pCharStrings[0].key.len; /* Check all CharString definitions */ for ( i=1; i<=len; i++) { /* if len=0, then the CharStrings dict is larger that required which is valid and allowed by the spec.*/ if ((j=pCharStrings[i].key.len)!=0) { if ( (j==strlen(charname)) && (strncmp( charname, pCharStrings[i].key.data.nameP, j)==0) ) { /* we have found an internal definition */ return( 1); } } } return( 0); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1env.c0000664000175000017500000010355011742726711022501 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1env.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2007-12-22 ----- Description: This file is part of the t1-library. It implements the reading of a configuration file and path-searching of type1-, afm- and encoding files. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2007. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1ENV_C #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/fontmisc.h" #include "sysconf.h" #include "t1types.h" #include "t1extern.h" #include "t1env.h" #include "t1misc.h" #include "t1base.h" /* The following static variables are used to store information on the distinct file search paths: -1 t1lib has not yet been initialized! 0 t1lib has been initialized and default paths have been setup n (>0) there are n path elements for current search path type, either built from a FontDataBase file or from explicit fucntion calls. */ static int pfab_no=-1; static int afm_no=-1; static int enc_no=-1; static int fdb_no=-1; static int fdbxlfd_no=-1; static char path_sep_char='\0'; static char path_sep_string[2]; static char pathbuf[2048]; /* Define some default search paths */ #ifndef VMS static char T1_pfab[]="."; static char T1_afm[]="."; static char T1_enc[]="."; #else static char T1_pfab[]="sys$disk:[]"; static char T1_afm[]="sys$disk:[]"; static char T1_enc[]="sys$disk:[]"; #endif char T1_fdb[]="FontDataBase"; char T1_fdbxlfd[]=""; /* By default, we do not search XLFD databases. */ /* keywords recognized in config file */ static const char enc_key[]="ENCODING"; static const char pfab_key[]="TYPE1"; static const char afm_key[]="AFM"; static const char fdb_key[]="FONTDATABASE"; static const char fdbxlfd_key[]="FONTDATABASEXLFD"; /* qstrncpy(): Copy bytes from srcP to to destP. srcP is count bytes long and destP is the number of quoted characters shorter. That is, count refers to the number of characters including the escapement chars in srcP! */ static void qstrncpy( char *destP, const char *srcP, long nochars) { long i; long j; i=0; /* dest-index */ j=0; /* src-index */ while (j omit escape char. */ } } else { /* normal character */ destP[i++]=srcP[j++]; } } } /* Setup the default paths for searching the distinct file types. If paths have been setup explicitly, skip the step of setting up a default path. */ void intT1_SetupDefaultSearchPaths( void) { path_sep_char=PATH_SEP_CHAR; sprintf( path_sep_string, "%c", path_sep_char); /* We set the number of stored path elements 0 so that we can distiguish between explicitly setup paths and default paths in intT1_ScanConfigFile(). */ if (pfab_no==-1) { T1_PFAB_ptr=(char**) calloc( 2, sizeof(char*)); T1_PFAB_ptr[0]=(char*)malloc(strlen(T1_pfab)+1); strcpy(T1_PFAB_ptr[0],T1_pfab); pfab_no=0; } if (afm_no==-1) { T1_AFM_ptr=(char**) calloc( 2, sizeof(char*)); T1_AFM_ptr[0]=(char*)malloc(strlen(T1_afm)+1); strcpy(T1_AFM_ptr[0],T1_afm); afm_no=0; } if (enc_no==-1) { T1_ENC_ptr=(char**) calloc( 2, sizeof(char*)); T1_ENC_ptr[0]=(char*)malloc(strlen(T1_enc)+1); strcpy(T1_ENC_ptr[0],T1_enc); enc_no=0; } if (fdb_no==-1) { T1_FDB_ptr=(char**) calloc( 2, sizeof(char*)); T1_FDB_ptr[0]=(char*)malloc(strlen(T1_fdb)+1); strcpy(T1_FDB_ptr[0],T1_fdb); fdb_no=0; } if (fdbxlfd_no==-1) { /* The XLFD font data base defaults to be empty */ T1_FDBXLFD_ptr=(char**) calloc( 1, sizeof(char*)); fdbxlfd_no=0; } } /* This function is called from T1_CloseLib(). We have to indicate the state of a non-initialzed t1lib! */ void intT1_FreeSearchPaths( void) { int i; i=0; if (T1_PFAB_ptr!=NULL) { while (T1_PFAB_ptr[i]!=NULL) { free(T1_PFAB_ptr[i]); T1_PFAB_ptr[i++]=NULL; } free( T1_PFAB_ptr); T1_PFAB_ptr=NULL; } i=0; if (T1_AFM_ptr!=NULL) { while (T1_AFM_ptr[i]!=NULL) { free(T1_AFM_ptr[i]); T1_AFM_ptr[i++]=NULL; } free( T1_AFM_ptr); T1_AFM_ptr=NULL; } i=0; if (T1_ENC_ptr!=NULL) { while (T1_ENC_ptr[i]!=NULL) { free(T1_ENC_ptr[i]); T1_ENC_ptr[i++]=NULL; } free( T1_ENC_ptr); T1_ENC_ptr=NULL; } i=0; if (T1_FDB_ptr!=NULL) { while (T1_FDB_ptr[i]!=NULL) { free(T1_FDB_ptr[i]); T1_FDB_ptr[i++]=NULL; } free( T1_FDB_ptr); T1_FDB_ptr=NULL; } i=0; if (T1_FDBXLFD_ptr!=NULL) { while (T1_FDBXLFD_ptr[i]!=NULL) { free(T1_FDBXLFD_ptr[i]); T1_FDBXLFD_ptr[i++]=NULL; } free( T1_FDBXLFD_ptr); T1_FDBXLFD_ptr=NULL; } /* indicate t1lib non-initialized */ pfab_no=-1; afm_no=-1; enc_no=-1; fdb_no=-1; fdbxlfd_no=-1; return; } /* ScanConfigFile(): Read a configuration file and scan and save the environment strings used for searching pfa/pfb-, afm- and encoding files as well as the name of the font database file. */ int intT1_ScanConfigFile( void) { char *env_str; char *linebuf; char *usershome; char *cnffilepath; char *globalcnffilepath; static int linecnt; char local_path_sep_char; int quoted=0; int quotecnt=0; FILE *cfg_fp; int filesize, i, j, k; int ignoreline=0; char*** destP=NULL; int *idestP=NULL; char* curr_key=NULL; /* First, get the string stored in the environment variable: */ env_str=getenv(ENV_CONF_STRING); linecnt=1; if (!env_str) { /* environment variable not set, try to open default file in user's home directory and afterwards global config file */ if ((usershome=getenv("HOME"))!=NULL) { cnffilepath=(char *)malloc((strlen(usershome) + strlen(T1_CONFIGFILENAME) + 2 ) * sizeof(char)); if (cnffilepath==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( cnffilepath, usershome); } else { cnffilepath=(char *)malloc((strlen(T1_CONFIGFILENAME) + 2 ) * sizeof(char)); } strcat( cnffilepath, DIRECTORY_SEP); strcat( cnffilepath, T1_CONFIGFILENAME); globalcnffilepath=(char*)malloc((strlen(GLOBAL_CONFIG_DIR) + strlen(GLOBAL_CONFIG_FILE) + 2 ) * sizeof(char)); if (globalcnffilepath==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( globalcnffilepath, GLOBAL_CONFIG_DIR); strcat( globalcnffilepath, DIRECTORY_SEP); strcat( globalcnffilepath, GLOBAL_CONFIG_FILE); if ((cfg_fp=fopen( cnffilepath, "rb"))==NULL){ sprintf( err_warn_msg_buf, "Could not open configfile %s", cnffilepath); T1_PrintLog( "ScanConfigFile()", err_warn_msg_buf, T1LOG_STATISTIC); /* Try global config file */ if ((cfg_fp=fopen( globalcnffilepath, "rb"))==NULL){ sprintf( err_warn_msg_buf, "Could not open global configfile %s", globalcnffilepath); T1_PrintLog( "ScanConfigFile()", err_warn_msg_buf, T1LOG_WARNING); } else{ sprintf( err_warn_msg_buf, "Using %s as Configfile (global)", globalcnffilepath); T1_PrintLog( "ScanConfigFile()", err_warn_msg_buf, T1LOG_STATISTIC); } } else{ sprintf( err_warn_msg_buf, "Using %s as Configfile (user's)", cnffilepath); T1_PrintLog( "ScanConfigFile()", err_warn_msg_buf, T1LOG_STATISTIC); } free( cnffilepath); free( globalcnffilepath); if (cfg_fp==NULL){ T1_PrintLog( "ScanConfigFile()", "Neither user's nor global Configfile has been found", T1LOG_WARNING); return(0); } } else { /* open specified file for reading the configuration */ if ((cfg_fp=fopen(env_str,"rb"))==NULL){ T1_PrintLog( "ScanConfigFile()", "Configfile as specified by Environment has not been found", T1LOG_WARNING); return(0); /* specified file could not be openend => no config paths read */ } else { sprintf( err_warn_msg_buf, "Using %s as Configfile (environment)", env_str); T1_PrintLog( "ScanConfigFile()", err_warn_msg_buf, T1LOG_STATISTIC); } } /* cfg_fp points now to a valid config file */ /* Get the file size */ fseek( cfg_fp, 0, SEEK_END); filesize=ftell(cfg_fp); /* Reset fileposition to start */ fseek( cfg_fp, 0, SEEK_SET); if ((linebuf=(char *)calloc( filesize+1, sizeof(char)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(-1); } fread((char *)linebuf, sizeof(char), filesize, cfg_fp); fclose(cfg_fp); i=0; /* this might be overwritten on a per file basis */ local_path_sep_char=path_sep_char; while(i end of path specification */ else quotecnt++; } /* some other char */ if (linebuf[i]=='\n') { /* a newline in a quoted string? Perhabs, quotes do not match! */ T1_PrintLog( "ScanConfigFile()", "Newline in quoted %s-string in line %d, column %d, of config file! Closing quote missing?", T1LOG_WARNING, curr_key, linecnt, i-j+1); j=i+1; /* resynchronize linecount */ linecnt++; } if (i1) && (FileName[0]=='.') && (FileName[1]==DIRECTORY_SEP_CHAR)) || ((fnamelen>2) && (FileName[0]=='.') && (FileName[1]=='.') && (FileName[2]==DIRECTORY_SEP_CHAR)) #if defined(MSDOS) | defined(_WIN32) | defined (__EMX__) || ((isalpha(FileName[0])) && (FileName[1]==':')) #endif #ifdef VMS || (strchr(FileName,':') != NULL) #endif ) { /* Check for existence of the path: */ if (!stat( FileName, &filestats)) { if (t1lib_log_file!=NULL) { sprintf( err_warn_msg_buf, "stat()'ing complete path %s successful", FileName); T1_PrintLog( "intT1_Env_GetCompletePath()", err_warn_msg_buf, T1LOG_DEBUG); } /* Return a copy of the string */ if ((FullPathName=(char *)malloc( fnamelen + 1))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } strcpy( FullPathName, FileName); return(FullPathName); } if (t1lib_log_file!=NULL){ sprintf( err_warn_msg_buf, "stat()'ing complete path %s failed", FileName); T1_PrintLog( "intT1_Env_GetCompletePath()", err_warn_msg_buf, T1LOG_DEBUG); } /* Trying to locate absolute path spec. failed. We try to recover by removing the path component and searching in the remaining search path entries. This depends on the OS. */ i=fnamelen-1; StrippedName=&(FileName[i]); while ( FileName[i]!=DIRECTORY_SEP_CHAR #if defined(VMS) /* What exactly to do for VMS? */ #elif defined(MSDOS) | defined(_WIN32) | defined (__EMX__) | defined(_MSC_VER) /* We take a drive specification into account. This means we step back until the directory separator or a drive specifier appears! */ && FileName[i]!=':' #endif ) { i--; } i++; StrippedName=&FileName[i]; if (t1lib_log_file!=NULL){ sprintf( err_warn_msg_buf, "path %s stripped to %s", FileName, StrippedName); T1_PrintLog( "intT1_Env_GetCompletePath()", err_warn_msg_buf, T1LOG_DEBUG); } } else{ /* We have a relative path name */ StrippedName=&FileName[0]; } i=0; while (env_ptr[i]!=NULL) { /* Copy current path element: */ strcpy( pathbuf, env_ptr[i]); /* cut a trailing directory separator */ j=strlen(pathbuf); if (pathbuf[j-1]==DIRECTORY_SEP_CHAR) pathbuf[--j]='\0'; /* Add the directory separator: */ #ifdef VMS { char *p= strrchr(pathbuf, DIRECTORY_SEP_CHAR); if (p && *(p+1) == '\0') *p = '\0'; } #endif strcat( pathbuf, DIRECTORY_SEP); /* And finally the filename. The following is fix against a vulnerability given by passing in large filenames, cf.: http://www.securityfocus.com/bid/25079 or http://packetstormsecurity.nl/0707-advisories/t1lib.txt If current pathbuf + StrippedName + 1 byte for NULL is bigger than pathbuf log a warning and try next pathbuf */ if ( strlen(pathbuf) + strlen(StrippedName) + 1 > sizeof(pathbuf) ) { T1_PrintLog( "intT1_Env_GetCompletePath()", "Omitting suspicious long candidate path in order to prevent buffer overflow.", T1LOG_WARNING); i++; continue; } strcat( pathbuf, StrippedName); /* Check for existence of the path: */ if (!stat( pathbuf, &filestats)) { if ((FullPathName=(char*)malloc( (j+fnamelen+2)*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } strcpy( FullPathName, pathbuf); if (t1lib_log_file!=NULL){ sprintf( err_warn_msg_buf, "stat()'ing %s successful", FullPathName); T1_PrintLog( "intT1_Env_GetCompletePath()", err_warn_msg_buf, T1LOG_DEBUG); } return(FullPathName); } if (t1lib_log_file!=NULL){ sprintf( err_warn_msg_buf, "stat()'ing %s failed", pathbuf); T1_PrintLog( "intT1_Env_GetCompletePath()", err_warn_msg_buf, T1LOG_DEBUG); } /* We didn't find the file --> try next path entry */ i++; } /* If we get here, no file was found at all, so return a NULL-pointer */ return(NULL); } /* T1_SetFileSearchPath(): Set the search path to find files of the specified type and return 0 if successful and -1 otherwise. An existing path is overwritten rigorously, unless the database already contains fonts. In the latter case the function returns with an error status. Multiple path types may be specified as a bitmask! */ int T1_SetFileSearchPath( int type, char *pathname) { int i; int pathlen; if (pathname==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } /* We do not allow to change the searchpath if the database already contains one or more entries. */ if (T1_GetNoFonts()>0){ sprintf( err_warn_msg_buf, "Path %s not set, database is not empty", pathname); T1_PrintLog( "T1_SetFileSearchPath()", err_warn_msg_buf, T1LOG_STATISTIC); T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pathlen=strlen(pathname)+1; /* Throw away a possibly existing path */ if (type & T1_PFAB_PATH){ if (pfab_no==-1) { T1_PFAB_ptr=NULL; /* realloc() will do a malloc() */ } else { /* throw away current paths */ i=0; while (T1_PFAB_ptr[i]!=NULL) { free (T1_PFAB_ptr[i++]); } } if ((T1_PFAB_ptr=(char**)realloc( T1_PFAB_ptr, 2*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } if ((T1_PFAB_ptr[0]=(char*)malloc(pathlen*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( T1_PFAB_ptr[0], pathname); T1_PFAB_ptr[1]=NULL; pfab_no=1; } if (type & T1_AFM_PATH){ if (afm_no==-1) { T1_AFM_ptr=NULL; /* realloc() will do a malloc() */ } else { /* throw away current paths */ i=0; while (T1_AFM_ptr[i]!=NULL) { free (T1_AFM_ptr[i++]); } } if ((T1_AFM_ptr=(char**)realloc( T1_AFM_ptr, 2*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } if ((T1_AFM_ptr[0]=(char*)malloc(pathlen*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( T1_AFM_ptr[0], pathname); T1_AFM_ptr[1]=NULL; afm_no=1; } if (type & T1_ENC_PATH){ if (enc_no==-1) { T1_ENC_ptr=NULL; /* realloc() will do a malloc() */ } else { /* throw away current paths */ i=0; while (T1_ENC_ptr[i]!=NULL) { free (T1_ENC_ptr[i++]); } } if ((T1_ENC_ptr=(char**)realloc( T1_ENC_ptr, 2*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } if ((T1_ENC_ptr[0]=(char*)malloc(pathlen*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( T1_ENC_ptr[0], pathname); T1_ENC_ptr[1]=NULL; enc_no=1; } return(0); } /* T1_GetFileSearchPath(): Return the specified file search path or NULL if an error occurred. Note: We do only one path at a time, so that if a bitmask is specified, the first match wins. The returned path is formatted using the actual PATH_SEP_CHAR. */ char *T1_GetFileSearchPath( int type) { static char *out_ptr; int i; int pathlen; char **src_ptr=NULL; if (out_ptr!=NULL) free( out_ptr); out_ptr=NULL; if (type & T1_PFAB_PATH) { src_ptr=T1_PFAB_ptr; } else if (type & T1_AFM_PATH) { src_ptr=T1_AFM_ptr; } else if (type & T1_ENC_PATH) { src_ptr=T1_ENC_ptr; } else if (type & T1_FDB_PATH) { src_ptr=T1_FDB_ptr; } i=0; pathlen=0; while (src_ptr[i]!=NULL) { pathlen +=strlen( src_ptr[i++]); pathlen+=1; /* path separator */ } if ((out_ptr=(char *)malloc(pathlen+1))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( NULL); } strcpy( out_ptr, src_ptr[0]); i=1; while (src_ptr[i]!=NULL) { strcat( out_ptr, path_sep_string); strcat( out_ptr, src_ptr[i++]); } return( out_ptr); } /* T1_AddToFileSearchPath(): Add the specified path element to the specified search path. If the existing path is the default path, it will not be replaced by the new path element. Since this function might be called before initialization, we have to be aware that even the default path could be missing. Multiple path types may be specified as a bitmask! Return value is 0 if successful and -1 otherwise */ int T1_AddToFileSearchPath( int pathtype, int mode, char *pathname) { int i; int pathlen; char* newpath = NULL; int nofonts; if (pathname==NULL) return(-1); nofonts=T1_GetNoFonts(); pathlen=strlen(pathname); if (pathtype & T1_PFAB_PATH){ /* Allocate meory for string */ if ((newpath=(char*)malloc( (pathlen+1)*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Check for and handle the existing path configuration */ if (pfab_no==0) { /* do not free the default path but establish it as a regularly setup path, if database not empty! */ if (nofonts>0) { pfab_no++; } else { free( T1_AFM_ptr[0]); } } if (pfab_no==-1) { /* not initialized! */ pfab_no=0; T1_PFAB_ptr=NULL; /* realloc() will do the malloc()! */ } if ((T1_PFAB_ptr=(char**)realloc( T1_PFAB_ptr, (++pfab_no+1)*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Insert the new path element: */ if (mode & T1_PREPEND_PATH){ /* prepend */ i=pfab_no-2; while (i>=0) { T1_PFAB_ptr[i+1]=T1_PFAB_ptr[i]; i--; } T1_PFAB_ptr[0]=newpath; } else{ /* append */ T1_PFAB_ptr[pfab_no-1]=newpath; } T1_PFAB_ptr[pfab_no]=NULL; } if (pathtype & T1_AFM_PATH){ /* Allocate meory for string */ if ((newpath=(char*)malloc( (pathlen+1)*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Check for and handle the existing path configuration */ if (afm_no==0) { /* do not free the default path but establish it as a regularly setup path, if database not empty! */ if (nofonts>0) { afm_no++; } else { free( T1_AFM_ptr[0]); } } if (afm_no==-1) { /* not initialized! */ afm_no=0; T1_AFM_ptr=NULL; /* realloc() will do the malloc()! */ } if ((T1_AFM_ptr=(char**)realloc( T1_AFM_ptr, (++afm_no+1)*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Insert the new path element */ if (mode & T1_PREPEND_PATH){ /* prepend */ i=afm_no-2; while (i>=0) { T1_AFM_ptr[i+1]=T1_AFM_ptr[i]; i--; } T1_AFM_ptr[0]=newpath; } else{ /* append */ T1_AFM_ptr[afm_no-1]=newpath; } T1_AFM_ptr[afm_no]=NULL; } if (pathtype & T1_ENC_PATH){ /* Allocate meory for string */ if ((newpath=(char*)malloc( (pathlen+1)*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Check for and handle the existing path configuration */ if (enc_no==0) { /* do not free the default path but establish it as a regularly setup path, if database not empty! */ if (nofonts>0) { enc_no++; } else { free( T1_ENC_ptr[0]); } } if (enc_no==-1) { /* not initialized! */ enc_no=0; T1_ENC_ptr=NULL; /* realloc() will do the malloc()! */ } if ((T1_ENC_ptr=(char**)realloc( T1_ENC_ptr, (++enc_no+1)*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Insert the new path element: */ if (mode & T1_PREPEND_PATH){ /* prepend */ i=enc_no-2; while (i>=0) { T1_ENC_ptr[i+1]=T1_ENC_ptr[i]; i--; } T1_ENC_ptr[0]=newpath; } else{ /* append */ T1_ENC_ptr[enc_no-1]=newpath; } T1_ENC_ptr[enc_no]=NULL; } /* Copy new path to where it belongs ... */ if (newpath) strcpy(newpath, pathname); return(0); } /* T1_SetFontDataBase(): Set a new name for the font database. It replaces the default name and any names specified previously with this function. Return value: 0 if OK, and -1 if filename not valid or an allocation error occurred */ int T1_SetFontDataBase( char *filename) { int pathlen; int i; int result=0; /* chekc filename */ if (filename==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return -1; } /* this function must be called before any font is in the database, that is, usually, before initialization! */ if ( pFontBase!=NULL && pFontBase->no_fonts>0) { T1_errno=T1ERR_OP_NOT_PERMITTED; return -1; } pathlen=strlen(filename)+1; /* Throw away a possibly existing font database-statement */ if (fdb_no==-1) { T1_FDB_ptr=NULL; /* realloc() will do a malloc() */ } else { /* throw away current paths */ i=0; while (T1_FDB_ptr[i]!=NULL) { free (T1_FDB_ptr[i++]); } } if ((T1_FDB_ptr=(char**)realloc( T1_FDB_ptr, 2*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return -1; } if ((T1_FDB_ptr[0]=(char*)malloc(pathlen*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return -1; } strcpy( T1_FDB_ptr[0], filename); T1_FDB_ptr[1]=NULL; fdb_no=1; /* Load database immediately if t1lib already is initailzed */ if (T1_CheckForInit()==0) { if ((result=intT1_scanFontDBase(T1_FDB_ptr[0]))==-1) { T1_PrintLog( "T1_AddFontDataBase()", "Fatal error scanning Font Database File %s (T1_errno=%d)", T1LOG_WARNING, T1_FDB_ptr[0], T1_errno); } if (result>-1) pFontBase->no_fonts+=result; result=pFontBase->no_fonts; } return result; } /* T1_AddFontDataBase(): Add a new font database file to the list. If the lib is already initialzed, then the new database is immediately loaded. Otherwise it is simply appended to the list and loaded at the time of initialization. Returns: -1 an error occured 0 successfully inserted but not loaded because lib not initilized n>0 the highest defined FontID */ int T1_AddFontDataBase( int mode, char *filename) { int i; int pathlen; int result=0; char* newpath; if (filename==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } pathlen=strlen(filename); /* Allocate memory for string */ if ((newpath=(char*)malloc( (pathlen+1)*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( newpath, filename); /* Check for and handle the existing path configuration */ if (fdb_no==0) { /* defauls setup, free the path */ free( T1_FDB_ptr[0]); } if (fdb_no==-1) { /* not initialized! */ fdb_no=0; T1_FDB_ptr=NULL; /* realloc() will do the malloc()! */ } if ((T1_FDB_ptr=(char**)realloc( T1_FDB_ptr, (++fdb_no+1)*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Insert the new database. If t1lib is already initialzed, the database can only be appended. Otherwise. prepending is also possible.*/ if ((mode & T1_PREPEND_PATH) && (T1_CheckForInit()!=0) ) { /* prepend */ i=fdb_no-2; while (i>=0) { T1_FDB_ptr[i+1]=T1_FDB_ptr[i]; i--; } T1_FDB_ptr[0]=newpath; result=0; } else { /* append */ T1_FDB_ptr[fdb_no-1]=newpath; if (T1_CheckForInit()==0) { if ((result=intT1_scanFontDBase(T1_FDB_ptr[fdb_no-1]))==-1) { T1_PrintLog( "T1_AddFontDataBase()", "Fatal error scanning Font Database File %s (T1_errno=%d)", T1LOG_WARNING, T1_FDB_ptr[fdb_no-1], T1_errno); } if (result>-1) pFontBase->no_fonts+=result; result=pFontBase->no_fonts; } } T1_FDB_ptr[fdb_no]=NULL; return result; } /* T1_SetFontDataBaseXLFD(): Set a new name for the XLFD font database. It replaces the default name (which is empty and any names specified previously with this function. Return value: 0 if OK, and -1 if filename not valid or an allocation error occurred */ int T1_SetFontDataBaseXLFD( char *filename) { int pathlen; int i; int result=0; /* check filename */ if (filename==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return -1; } /* this function must be called before any font is in the database, that is, usually, before initialization! */ if ( pFontBase!=NULL && pFontBase->no_fonts>0) { T1_errno=T1ERR_OP_NOT_PERMITTED; return -1; } pathlen=strlen(filename)+1; /* Throw away a possibly existing font database-statement */ if (fdbxlfd_no==-1) { T1_FDBXLFD_ptr=NULL; /* realloc() will do a malloc() */ } else { /* throw away current paths */ i=0; while (T1_FDBXLFD_ptr[i]!=NULL) { free (T1_FDBXLFD_ptr[i++]); } } if ((T1_FDBXLFD_ptr=(char**)realloc( T1_FDBXLFD_ptr, 2*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return -1; } if ((T1_FDBXLFD_ptr[0]=(char*)malloc(pathlen*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return -1; } strcpy( T1_FDBXLFD_ptr[0], filename); T1_FDBXLFD_ptr[1]=NULL; fdb_no=1; /* Load XLFD database immediately if t1lib already is initailzed */ if (T1_CheckForInit()==0) { if ((result=intT1_scanFontDBaseXLFD(T1_FDBXLFD_ptr[0]))==-1) { T1_PrintLog( "T1_AddFontDataBaseXLFD()", "Fatal error scanning XLFD Font Database File %s (T1_errno=%d)", T1LOG_WARNING, T1_FDBXLFD_ptr[0], T1_errno); } if (result>-1) pFontBase->no_fonts+=result; result=pFontBase->no_fonts; } return result; } /* T1_AddFontDataBaseXLFD(): Add a new XLFD font database file to the list. If the lib is already initialzed, then the new database is immediately loaded. Otherwise it is simply appended to the list and loaded at the time of initialization. Returns: -1 an error occured 0 successfully inserted but not loaded because lib not initilized n>0 the highest defined FontID */ int T1_AddFontDataBaseXLFD( int mode, char *filename) { int i; int pathlen; int result=0; char* newpath; if (filename==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } pathlen=strlen(filename); /* Allocate memory for string */ if ((newpath=(char*)malloc( (pathlen+1)*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( newpath, filename); /* Check for and handle the existing path configuration */ if (fdb_no==0) { /* defauls setup, free the path */ free( T1_FDB_ptr[0]); } if (fdbxlfd_no==-1) { /* not initialized! */ fdbxlfd_no=0; T1_FDBXLFD_ptr=NULL; /* realloc() will do the malloc()! */ } if ((T1_FDBXLFD_ptr=(char**)realloc( T1_FDBXLFD_ptr, (++fdbxlfd_no+1)*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Insert the new database. If t1lib is already initialzed, the database can only be appended. Otherwise. prepending is also possible.*/ if ((mode & T1_PREPEND_PATH) && (T1_CheckForInit()!=0) ) { /* prepend */ i=fdbxlfd_no-2; while (i>=0) { T1_FDBXLFD_ptr[i+1]=T1_FDBXLFD_ptr[i]; i--; } T1_FDBXLFD_ptr[0]=newpath; result=0; } else { /* append */ T1_FDBXLFD_ptr[fdbxlfd_no-1]=newpath; if (T1_CheckForInit()==0) { if ((result=intT1_scanFontDBaseXLFD(T1_FDBXLFD_ptr[fdbxlfd_no-1]))==-1) { T1_PrintLog( "T1_AddFontDataBase()", "Fatal error scanning Font Database File %s (T1_errno=%d)", T1LOG_WARNING, T1_FDBXLFD_ptr[fdbxlfd_no-1], T1_errno); } if (result>-1) pFontBase->no_fonts+=result; result=pFontBase->no_fonts; } } T1_FDBXLFD_ptr[fdbxlfd_no]=NULL; return result; } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1types.h0000664000175000017500000002073411742726711023064 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1types.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2004-12-09 ----- Description: This file is part of the t1-library. It contains type definitions used by the t1-library. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2004. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1TYPES_H #include "sysconf.h" typedef struct { int flags; int chars; int hkern; } METRICS_ENTRY; typedef struct { char *pFontFileName; /* Pointer to the font's filename */ char *pAfmFileName; /* Pointer to the afm filename, IFF set explicitly */ FontInfo *pAFMData; /* A pointer to a struct which gives access to all the data contained in the .afm-file. If this pointer is NULL, no .afm-file had been found. => There's no advanced info on the font available. */ psfont *pType1Data; /* A pointer to a struct giving access to all information contained in the .pfa/.pfb-file. This is needed! */ int *pEncMap; /* For fast mapping from charnames to encoding indices */ METRICS_ENTRY *pKernMap; /* dito */ int KernMapSize; char **pFontEnc; /* This is the pointer to the encoding array associated with that particular font. If FontEnc=NULL, it means the internal (fontspecific) encoding is to be used. */ char *vm_base; /* The base address of the virtual memory area for this font. It must be stored in order to be able to realloc and free those memory areas later. */ void *pFontSizeDeps; /* This one points to a linked list of structures which store all font size dependent data. */ double FontMatrix[4]; /* Two matrices which store the font matrix and special Transformation to be applied, such as slant and extend or probably some rotation. */ double FontTransform[4]; float slant; /* A slant factor for the font */ float extend; /* A extension factor for the font */ float UndrLnPos; /* Parameters for ~lining rules */ float UndrLnThick; float OvrLnPos; float OvrLnThick; float OvrStrkPos; float OvrStrkThick; float StrokeWidth; float SavedStrokeWidth; unsigned short physical; /* This entry is used to decide, whether a font is associated with an own physical fontfile, or whether it has been created as a "logical" font by copying another "physical" font. */ unsigned short refcount; /* At load time this counter is set to 1. Every time, a T1_CopyFont() is executed on this font, this counter is incremented by 1. This gives the possibility to decide whether a physical font is used by some logical font. */ short space_position; /* The position where "space" is encoded, is saved in this entry. The space character needs special treatment. Saving its position here yields faster execution during rastering of strings with a user-supplied space-offset! */ short info_flags; /* Here some info may be stored */ } FONTPRIVATE; /* A structure representing a matrix */ typedef struct { double cxx; double cyx; double cxy; double cyy; } T1_TMATRIX; /* Following struct is used for storing all information for a particular rendered character glyph */ typedef struct { char *bits; /* A pointer to the characters local bitmap */ struct /* A struct containing diverse metric information */ { int ascent; int descent; int leftSideBearing; int rightSideBearing; int advanceX; int advanceY; } metrics; void *pFontCacheInfo; unsigned long bpp; /* The number of bits that represent 1 pixel */ } GLYPH; /* Next comes the struct declaration for FontSizeDeps, which stores size specific data of a font */ typedef struct { GLYPH *pFontCache; /* Pointer to the cache area of this font at this size */ void *pNextFontSizeDeps; /* A pointer to the next size's FontSizeDeps-structure. */ void *pPrevFontSizeDeps; /* A pointer to the previous size's FontSizeDeps-structure or NULL if the current is the first. */ struct XYspace *pCharSpaceLocal; /* This is a scaled version of the global version for this font. */ float size; /* The desired size, to be specified in bp's. */ int antialias; /* Switch for marking the current size antialiased */ } FONTSIZEDEPS; /* A data type that makes most important information available to user. */ typedef struct { int width; /* The glyph's width */ BBox bbox; /* The glyph's bounding box */ int numchars; /* The number of characters in the glyph (string) */ int *charpos; /* A pointer to an integer array were the horizontal positions in (afm units) of the individual characters in the string are stored */ } METRICSINFO; /* Handling of outlines: These definitions decouple from the type 1 rasterizers def's and make the necessary stuff available to end users */ #define FRACTBITS 16 /* number of fractional bits in 'fractpel' */ /* From/to conversion of pels/fractpels */ #define T1_TOPATHPOINT(p) (((T1_AA_TYPE32)p)<>FRACTBITS) /* A fractional point */ typedef struct { T1_AA_TYPE32 x; T1_AA_TYPE32 y; } T1_PATHPOINT; /* A straight outline segment, stroked or not stroked */ typedef struct pathsegment { char type; /* type of segment (line or move) */ unsigned char flag; /* type1 rasterizer internal stuff */ short references; /* type1 rasterizer internal stuff */ unsigned char size; /* size of the structure */ unsigned char context; /* index to device context */ struct pathsegment *link; /* pointer to next structure in linked list */ struct pathsegment *last; /* pointer to last structure in list */ T1_PATHPOINT dest; /* relative ending location of path segment */ } T1_PATHSEGMENT; /* A third order bezier segment */ typedef struct bezierpathsegment { char type; /* type of segment (bezier) */ unsigned char flag; /* type1 rasterizer internal stuff */ short references; /* type1 rasterizer internal stuff */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ T1_PATHSEGMENT *link; /* as with any 'segment' type */ T1_PATHSEGMENT *last; /* as with any 'segment' type */ T1_PATHPOINT dest; /* ending point (D) */ T1_PATHPOINT B; /* control point B */ T1_PATHPOINT C; /* control point C */ } T1_BEZIERSEGMENT; typedef T1_PATHSEGMENT T1_OUTLINE; /* Two structures for handling composite character data */ /* One structure for each symbol of the composite character */ typedef struct { int piece; /* the index of the current symbol */ int deltax; /* horizontal displacement of current symbol in CS */ int deltay; /* vertical displacement of current symbol in CS */ } T1_COMP_PIECE; /* This one defines the composite character, the number of pieces and how to access their data. */ typedef struct { int compchar; /* the base character in the current encoding */ int numPieces; /* the number of defined pieces including the base char */ T1_COMP_PIECE *pieces; /* a pointer to the pieces' information */ } T1_COMP_CHAR_INFO; xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1enc.c0000664000175000017500000005532011742726711022457 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1enc.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2005-05-01 ----- Description: This file is part of the t1-library. It contains functions encoding handling at runtime. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1ENC_C #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/paths.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1enc.h" #include "t1env.h" #include "t1base.h" #include "t1finfo.h" static char defaultencodingname[]="Unspecified"; /* This struct is retunred by the tokenizer. It contains indices in linebuf for the first and the last character in a token */ typedef struct { int first; int last; } CNTOKEN; /* ScanForWord(): Tokenizer for ScanEncodingFile. - and return the first and last index in linebuf of the token - skips whitespace and comments - the vector marks [ and ] are considered token-delimiters and also treated as independent tokens - the literal escape char "/" is also considered as a token delimiter but is not returned as a token. This function leaves linebuf unmodified so that in case of a failure, TryT1LibEncoding() will receive a clean buffer! */ static CNTOKEN *ScanForWord( char *lb, int size) { static int i=-1; int j; int comment; static CNTOKEN currtoken={-1,-1}; /* Reset tokenizer */ if (lb==NULL) { i=-1; currtoken.first=-1; currtoken.last=-1; return NULL; } comment=0; j=-1; while (++i word */ if (j==-1) { j=i; currtoken.first=j; continue; } } /* We're at the end of the buffer. Do we have a word? */ if (j!=-1) { currtoken.last=i-1; return &currtoken; } /* We have nothing */ return NULL; } /* tokcpy(): Copy a token from linebuf and append \0 */ static char *tokcpy( char *dest, const char *src, int first, int last) { /* we do not do any range or error checking in this function */ memcpy( dest, &(src[first]), last-first+1); dest[last-first+1]='\0'; return dest; } /* TryDVIPSEncoding(): Try to read an encoding file conforming to the dvips specification. The file's contents is expected in a buffer "linebuf" of size "filesize". Function returns the actual size of the charnames memory or -1. */ static int TryDVIPSEncoding( char *linebuf, int filesize, char *charnames) { char token[256]; char *encname; int charname_count=0; int k=0; CNTOKEN *currtokenP; /* Initialize tokenizer */ currtokenP=ScanForWord( NULL, filesize); currtokenP=ScanForWord(linebuf,filesize); if ( (currtokenP!=NULL) && (linebuf[currtokenP->first]=='/')) { /* / indicates start of postscript string literal, so this could be a postscript .enc file */ if ((encname=(char *)malloc( (currtokenP->last - currtokenP->first + 1 + 1) * sizeof( char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return -1; } else { /* store encoding name */ if (currtokenP->first==currtokenP->last) { /* PostScript encoding requires an identifier so this does not seem to be a valid encoding file */ free( encname); return( -1); } tokcpy( encname, linebuf, currtokenP->first+1, currtokenP->last); } /* Next, the PostScript "mark" character is expected */ if ( ((currtokenP=ScanForWord(linebuf,filesize))!=NULL) && (currtokenP->first==currtokenP->last) && (linebuf[currtokenP->first]!='[') ) { /* Since we got up to here, there is a certain probability that we have a PostScript encoding definition, but with invalid syntax. So put log message. */ sprintf( err_warn_msg_buf, "Expected encoding definition after %s, but did not find \"[\"-character", encname); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); if (encname!=NULL) free( encname); return( -1); } /* now, try to read 256 literal character names. We do not check for charname count because this would bypass error checking. */ while((currtokenP=ScanForWord(linebuf,filesize))!=NULL) { /* End of vector operator? */ if ( (currtokenP->first==currtokenP->last) && /* one character? */ (linebuf[currtokenP->first]==']')) { break; } /* We drop the escape character if it is present. However, non-literal name specifications are not allowed in encoding vectors. */ if (linebuf[currtokenP->first]!='/') { sprintf( err_warn_msg_buf, "Found non-literal name (c=%c (first=%d, last=%d)) at slot %d while scanning encoding vector %s.", linebuf[currtokenP->first], currtokenP->first, currtokenP->last, charname_count, encname); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); if (encname!=NULL) free( encname); return( -1); } else { /* OK, first char in token is "/". Does there follow a name? */ if ( currtokenP->first==currtokenP->last) { sprintf( err_warn_msg_buf, "Empty literal name at slot %d while scanning encoding vector %s.", charname_count, encname); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); if (encname!=NULL) free( encname); return( -1); } } /* We seem to have a valid name -> copy name to *charnames-array */ tokcpy( &(charnames[k]), linebuf, currtokenP->first+1, currtokenP->last); k+=currtokenP->last-currtokenP->first+1; /* note: we have omitted "/"! */ /* Increment character counter */ charname_count++; /* set index to start of next word/line */ } /* end of loop scanning character names */ if (currtokenP==NULL) { /* In this case loop has been stopped because buffer end has been reached. Since we did not alreay read the ]-character, this is an error condition. */ sprintf( err_warn_msg_buf, "Premature end of encoding definition encountered." ); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); free(encname); return( -1); } /* Since the above loop has not been finished due to a NULL-ptr, the token ] must have been encountered. Thus, read ahead and look for def: */ if ((currtokenP=ScanForWord(linebuf,filesize))==NULL) { sprintf( err_warn_msg_buf, "Premature end of encoding definition encountered."); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); free(encname); return( -1); } if (strcmp(tokcpy( &(charnames[k]), linebuf, currtokenP->first, currtokenP->last), "def")!=0) { /* we store the current token in charnames only temporarily, so we do not increment k! */ sprintf( err_warn_msg_buf, "Closing token \"def\" expected but found \"%s\".", &(charnames[k])); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); free(encname); return( -1); } /* Encoding definition is complete. we do not allow any further tokens except comments. */ if ((currtokenP=ScanForWord(linebuf,filesize))!=NULL) { tokcpy( token, linebuf, currtokenP->first, currtokenP->last); sprintf( err_warn_msg_buf, "Token \"%s\" after closing \"def\" in successfully scanned encoding file makes encoding definition file invalid", token); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); free(encname); return( -1); } /* we allow less than 256 character names. The missing ones are filled now with .notdef */ for ( ; charname_count<256; charname_count++) { tokcpy( &(charnames[k]), ".notdef", 0, 6); k+=8; } /* Append the string for the encoding's name */ strcpy( &(charnames[k]), encname); k +=strlen(encname)+1; free(encname); return( k); } /* file does not start with / -> no dvips-encoding file */ return( -1); } /* TryT1LibEncoding(): Try to read an encoding file conforming to the t1lib specification. The file's contents is expected in a buffer "linebuf" of size "filesize". Function returns the actual size of the charnames memory or -1. */ static int TryT1LibEncoding( char *linebuf, int filesize, char *charnames) { int i=0, j=0, k=0, l=0; char save_char; int charname_count=0; while(i no encoding read */ } /* enc_fp points now to a (hopefully) valid encoding file */ /* Get the file size */ fseek( enc_fp, 0, SEEK_END); filesize=ftell(enc_fp); /* Reset fileposition to start */ fseek( enc_fp, 0, SEEK_SET); if ((linebuf=(char *)calloc( filesize, sizeof(char)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } /* Allocate space for character names, assume the worst case and realloc later. The DVIPS-parser requires one more char in order to work properly */ if ((charnames=(char *)calloc( filesize + strlen(defaultencodingname+1), sizeof(char)))==NULL){ free( linebuf); T1_errno=T1ERR_ALLOC_MEM; return(NULL); } fread((char *)linebuf, sizeof(char), filesize, enc_fp); fclose(enc_fp); /* file is read. Operate now on the buffer. */ /* try dvips encoding file */ cnsize=TryDVIPSEncoding( linebuf, filesize, charnames); if ( cnsize>-1) { /* a debug message to log file */ sprintf( err_warn_msg_buf, "Scanned file %s (%d bytes) as dvips-encoding file.", FileName, filesize); T1_PrintLog( "ScanEncodingFile()", err_warn_msg_buf, T1LOG_DEBUG); } else { /* try t1lib encoding file */ cnsize=TryT1LibEncoding( linebuf, filesize, charnames); if ( cnsize>-1) { /* write a debug message to log file */ sprintf( err_warn_msg_buf, "Scanned file %s (%d bytes) as t1lib-encoding file.", FileName, filesize); T1_PrintLog( "ScanEncodingFile()", err_warn_msg_buf, T1LOG_DEBUG); } else { /* write a warning message because loading encoding entirely failed */ sprintf( err_warn_msg_buf, "Scanning file %s (%d bytes) as encoding file failed.", FileName, filesize); T1_PrintLog( "ScanEncodingFile()", err_warn_msg_buf, T1LOG_WARNING); } } if ( cnsize<0) { T1_errno=T1ERR_SCAN_ENCODING; if ( charnames!=NULL) { free(charnames); } free(linebuf); return( NULL); } /* cnsize contains the size of the charnames' memory, so let's now realloc charnames */ charnames=(char *)realloc( charnames, cnsize*sizeof(char)); /* Now initialize the array with the start-addresses of the character name strings */ /* We alloc 257 to save the encoding's name at the 257th entry */ if ((encoding=(char **)malloc(257*sizeof(char *)))==NULL) { if ( charnames!=NULL) { free(charnames); } free(linebuf); T1_errno=T1ERR_ALLOC_MEM; return(NULL); } while (i<257) { encoding[i]=&charnames[j]; while (charnames[j]) j++; j++; i++; } free( linebuf); return(encoding); } /* T1_LoadEncoding(): Load an encoding file to have a new encoding available. If successful, the pointer to the encoding array is returned. In case of an error, the return value is NULL. */ char **T1_LoadEncoding( char *FileName) { char **Encoding; char *EncFileName; if( FileName==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } if ((EncFileName=intT1_Env_GetCompletePath( FileName, T1_ENC_ptr))==NULL){ T1_errno=T1ERR_FILE_OPEN_ERR; return(NULL); } Encoding=ScanEncodingFile(EncFileName); free(EncFileName); return(Encoding); } /* T1_DeleteEncoding() free a previously loaded encoding */ int T1_DeleteEncoding( char **encoding) { if (encoding){ /* First free character names memory */ free( encoding[0]); /* then, free pointer array */ free( encoding); } return(0); } /* T1_ReencodeFont(): Assign a new encoding to an existent font. This is only allowed if no size dependent data exists for the font in question. Moreover, the font must be loaded already since must get the position of the space-character. Function returns 0 if successful, and -1 otherwise. */ int T1_ReencodeFont( int FontID, char **Encoding) { int i, j, k, l, m; char *charname; PairKernData *pkd; METRICS_ENTRY *kern_tbl; int char1, char2; /* First, check for valid font ID residing in memory: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* Second, check whether size-dependent data exists: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps != NULL){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pFontBase->pFontArray[FontID].pFontEnc=Encoding; /* We have to update the space_position-entry in the FONTPRIVATE. If space is not found (not encoded), set it to -1: */ pFontBase->pFontArray[FontID].space_position=-1; i=0; if (Encoding){ /* external encoding */ while (i<256){ if (strcmp( (char *)pFontBase->pFontArray[FontID].pFontEnc[i], "space")==0){ /* space found at position i: */ pFontBase->pFontArray[FontID].space_position=i; break; } i++; } } else{ /* reencoding to internal encoding */ while (i<256){ if (strcmp( (char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[i].data.arrayP, "space")==0){ /* space found at position i: */ pFontBase->pFontArray[FontID].space_position=i; break; } i++; } } /* Now update afm index mapping: */ if (pFontBase->pFontArray[FontID].pAFMData != NULL){ for (i=0; i<256; i++) { charname=T1_GetCharName( FontID, i); /* in a first loop check for ordinary characters */ for ( j=0; jpFontArray[FontID].pAFMData->numOfChars; j++) { if (strcmp( charname, pFontBase->pFontArray[FontID].pAFMData->cmi[j].name)==0) { pFontBase->pFontArray[FontID].pEncMap[i]=j+1; /* index 0 is reserved! */ continue; } } /* if nothing has been found, check for composite characters */ for ( j=0; jpFontArray[FontID].pAFMData->numOfComps; j++) { if (strcmp( charname, pFontBase->pFontArray[FontID].pAFMData->ccd[j].ccName)==0) { pFontBase->pFontArray[FontID].pEncMap[i]=-(j+1); /* index 0 is reserved! */ /* Note: Metrics of composite characters already exist so that there is no need to recalculate them! */ continue; } } } /* Update kerning table */ pFontBase->pFontArray[FontID].KernMapSize=0; k=pFontBase->pFontArray[FontID].pAFMData->numOfPairs; if (k>0){ /* i.e., there are any pairs */ /* OK, it does not suffice to alloc numOfPairs METRICS_ENTRYs, because a given character might be encoded at several locations and kerning should still work. As a worst case estimation, we allocate 256^2 and realloc later. */ if ((pFontBase->pFontArray[FontID].pKernMap= (METRICS_ENTRY *)malloc( (256*256) *sizeof( METRICS_ENTRY)))==NULL){ sprintf( err_warn_msg_buf, "Error allocating memory for metrics map (FontID=%d)", FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-1); } kern_tbl=pFontBase->pFontArray[FontID].pKernMap; pkd=pFontBase->pFontArray[FontID].pAFMData->pkd; j=0; for ( i=0; i Put char1 in higher byte and char2 in LSB: */ kern_tbl[j].chars=(char1 << 8) | char2; /* We only make use of horizontal kerning */ kern_tbl[j].hkern=pkd[i].xamt; j++; } /* while (char2) */ } /* while (char1) */ } /* for */ /* We are done, realloc memory: */ kern_tbl=(METRICS_ENTRY*) realloc( kern_tbl, j*sizeof(METRICS_ENTRY)); /* We now sort the kerning array with respect to char indices */ qsort( kern_tbl, (size_t) j, sizeof(METRICS_ENTRY), &cmp_METRICS_ENTRY ); /* Finally write back pointer for the case that realloc changed the pointer */ pFontBase->pFontArray[FontID].pKernMap=kern_tbl; pFontBase->pFontArray[FontID].KernMapSize=j; } else { pFontBase->pFontArray[FontID].pKernMap=NULL; } } return(0); } /* T1_SetDefaultEncoding(): Set the default encoding vector that's used when fonts are loaded. */ int T1_SetDefaultEncoding( char **encoding) { if (T1_CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pFontBase->default_enc=encoding; return(0); } /* T1_GetEncodingScheme(): Get the name associated with the current encoding vector of font FontID */ char *T1_GetEncodingScheme( int FontID) { static char enc_scheme[256]; /* First, check for valid font ID residing in memory: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } if (pFontBase->pFontArray[FontID].pFontEnc==NULL){ if (pFontBase->pFontArray[FontID].info_flags & USES_STANDARD_ENCODING){ strcpy( enc_scheme, "StandardEncoding"); } else { strcpy( enc_scheme, "FontSpecific"); } } else strcpy( enc_scheme, pFontBase->pFontArray[FontID].pFontEnc[256]); return(enc_scheme); } /* A function for comparing METRICS_ENTRY structs */ static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2) { if (((METRICS_ENTRY *)entry1)->chars < ((METRICS_ENTRY *)entry2)->chars) return(-1); if (((METRICS_ENTRY *)entry1)->chars > ((METRICS_ENTRY *)entry2)->chars) return(1); return(0); /* This should not happen */ } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/.dependencies0000664000175000017500000001136611742726711023732 0ustar uwabamiuwabamiparseAFM.lo: parseAFM.c parseAFM.h t1base.h t1misc.h t1aaset.lo: t1aaset.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/paths.h \ ../type1/regions.h t1types.h sysconf.h t1extern.h t1misc.h t1aaset.h \ t1set.h t1load.h t1finfo.h t1base.h t1outline.h t1afmtool.lo: t1afmtool.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/paths.h \ ../type1/regions.h ../type1/blues.h t1types.h sysconf.h t1extern.h \ t1misc.h t1finfo.h t1base.h t1set.h t1load.h t1afmtool.h t1base.lo: t1base.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/paths.h \ ../type1/regions.h sysconf.h t1base.h t1types.h t1global.h t1misc.h \ t1env.h t1delete.h t1delete.lo: t1delete.c ../type1/types.h parseAFM.h ../type1/objects.h \ ../type1/spaces.h ../type1/util.h ../type1/fontfcn.h t1types.h \ sysconf.h t1extern.h t1misc.h t1delete.h t1load.h t1finfo.h t1base.h t1enc.lo: t1enc.c ../type1/ffilest.h ../type1/types.h ../type1/Xstuff.h \ ../type1/fontmisc.h ../type1/fontstruct.h ../type1/font.h \ ../type1/fsmasks.h ../type1/fontfile.h ../type1/fontxlfd.h parseAFM.h \ ../type1/objects.h ../type1/spaces.h ../type1/util.h \ ../type1/fontfcn.h ../type1/paths.h ../type1/regions.h t1types.h \ sysconf.h t1extern.h t1misc.h t1enc.h t1env.h t1base.h t1finfo.h t1env.lo: t1env.c ../type1/types.h parseAFM.h ../type1/objects.h \ ../type1/spaces.h ../type1/util.h ../type1/fontfcn.h \ ../type1/fontmisc.h sysconf.h t1types.h t1extern.h t1misc.h t1env.h \ t1base.h t1finfo.lo: t1finfo.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/paths.h \ ../type1/regions.h t1types.h sysconf.h t1extern.h t1misc.h t1finfo.h \ t1base.h t1set.h t1load.h t1load.lo: t1load.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/blues.h ../type1/paths.h \ ../type1/regions.h t1types.h sysconf.h t1extern.h t1misc.h t1load.h \ t1env.h t1set.h t1base.h t1finfo.h t1afmtool.h t1outline.lo: t1outline.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/paths.h \ ../type1/regions.h t1types.h sysconf.h t1extern.h t1misc.h t1set.h \ t1load.h t1finfo.h t1base.h t1outline.h t1set.lo: t1set.c ../type1/ffilest.h ../type1/types.h ../type1/Xstuff.h \ ../type1/fontmisc.h ../type1/fontstruct.h ../type1/font.h \ ../type1/fsmasks.h ../type1/fontfile.h ../type1/fontxlfd.h parseAFM.h \ ../type1/objects.h ../type1/spaces.h ../type1/util.h \ ../type1/fontfcn.h ../type1/paths.h ../type1/regions.h t1types.h \ sysconf.h t1extern.h t1misc.h t1set.h t1load.h t1finfo.h t1base.h t1subset.lo: t1subset.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/paths.h \ ../type1/regions.h t1types.h sysconf.h t1extern.h t1misc.h t1finfo.h \ t1base.h t1delete.h t1subset.h t1trans.lo: t1trans.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/paths.h \ ../type1/regions.h t1types.h sysconf.h t1extern.h t1misc.h t1trans.h \ t1base.h t1x11.lo: t1x11.c ../type1/types.h parseAFM.h ../type1/objects.h \ ../type1/spaces.h ../type1/util.h ../type1/fontfcn.h ../type1/paths.h \ ../type1/regions.h t1types.h sysconf.h t1extern.h t1misc.h t1set.h \ t1aaset.h t1load.h t1finfo.h t1x11.h t1base.h xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/parseAFM.h0000664000175000017500000003161111742726711023105 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: parseAFM.h ----- Author: Adobe Systems Inc., modifications by Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It is the original parseAFM.h modified at a few points. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ /* * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved. * * This file may be freely copied and redistributed as long as: * 1) This entire notice continues to be included in the file, * 2) If the file has been modified in any way, a notice of such * modification is conspicuously indicated. * * PostScript, Display PostScript, and Adobe are registered trademarks of * Adobe Systems Incorporated. * * ************************************************************************ * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION, * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. * ************************************************************************ */ /* ParseAFM.h * * This header file is used in conjuction with the parseAFM.c file. * Together these files provide the functionality to parse Adobe Font * Metrics files and store the information in predefined data structures. * It is intended to work with an application program that needs font metric * information. The program can be used as is by making a procedure call to * parse an AFM file and have the data stored, or an application developer * may wish to customize the code. * * This header file defines the data structures used as well as the key * strings that are currently recognized by this version of the AFM parser. * This program is based on the document "Adobe Font Metrics Files, * Specification Version 2.0". * * AFM files are separated into distinct sections of different data. Because * of this, the parseAFM program can parse a specified file to only save * certain sections of information based on the application's needs. A record * containing the requested information will be returned to the application. * * AFM files are divided into five sections of data: * 1) The Global Font Information * 2) The Character Metrics Information * 3) The Track Kerning Data * 4) The Pair-Wise Kerning Data * 5) The Composite Character Data * * Basically, the application can request any of these sections independent * of what other sections are requested. In addition, in recognizing that * many applications will want ONLY the x-width of characters and not all * of the other character metrics information, there is a way to receive * only the width information so as not to pay the storage cost for the * unwanted data. An application should never request both the * "quick and dirty" char metrics (widths only) and the Character Metrics * Information since the Character Metrics Information will contain all * of the character widths as well. * * There is a procedure in parseAFM.c, called parseFile, that can be * called from any application wishing to get information from the AFM File. * This procedure expects 3 parameters: a vaild file descriptor, a pointer * to a (FontInfo *) variable (for which space will be allocated and then * will be filled in with the data requested), and a mask specifying * which data from the AFM File should be saved in the FontInfo structure. * * The flags that can be used to set the appropriate mask are defined below. * In addition, several commonly used masks have already been defined. * * History: * original: DSM Thu Oct 20 17:39:59 PDT 1988 * modified: DSM Mon Jul 3 14:17:50 PDT 1989 * - added 'storageProblem' return code * - fixed typos */ #include /* your basic constants */ #define T1LIB_TRUE 1 #define T1LIB_FALSE 0 #define EOL '\n' /* end-of-line indicator */ #define MAX_NAME 4096 /* max length for identifiers */ #define BOOL int #define FLAGS int /* Flags that can be AND'ed together to specify exactly what * information from the AFM file should be saved. */ #define P_G 0x01 /* 0000 0001 */ /* Global Font Info */ #define P_W 0x02 /* 0000 0010 */ /* Character Widths ONLY */ #define P_M 0x06 /* 0000 0110 */ /* All Char Metric Info */ #define P_P 0x08 /* 0000 1000 */ /* Pair Kerning Info */ #define P_T 0x10 /* 0001 0000 */ /* Track Kerning Info */ #define P_C 0x20 /* 0010 0000 */ /* Composite Char Info */ /* Commonly used flags */ #define P_GW (P_G | P_W) #define P_GM (P_G | P_M) #define P_GMP (P_G | P_M | P_P) #define P_GMK (P_G | P_M | P_P | P_T) #define P_ALL (P_G | P_M | P_P | P_T | P_C) /* Possible return codes from the parseFile procedure. * * ok means there were no problems parsing the file. * * parseError means that there was some kind of parsing error, but the * parser went on. This could include problems like the count for any given * section does not add up to how many entries there actually were, or * there was a key that was not recognized. The return record may contain * vaild data or it may not. * * earlyEOF means that an End of File was encountered before expected. This * may mean that the AFM file had been truncated, or improperly formed. * * storageProblem means that there were problems allocating storage for * the data structures that would have contained the AFM data. */ #define ok 0 #define parseError -1 #define earlyEOF -2 #define storageProblem -3 /************************* TYPES *********************************/ /* Below are all of the data structure definitions. These structures * try to map as closely as possible to grouping and naming of data * in the AFM Files. */ /* Bounding box definition. Used for the Font BBox as well as the * Character BBox. */ typedef struct { int llx; /* lower left x-position */ int lly; /* lower left y-position */ int urx; /* upper right x-position */ int ury; /* upper right y-position */ } BBox; /* Global Font information. * The key that each field is associated with is in comments. For an * explanation about each key and its value please refer to the AFM * documentation (full title & version given above). */ typedef struct { char *afmVersion; /* key: StartFontMetrics */ char *fontName; /* key: FontName */ char *fullName; /* key: FullName */ char *familyName; /* key: FamilyName */ char *weight; /* key: Weight */ float italicAngle; /* key: ItalicAngle */ BOOL isFixedPitch; /* key: IsFixedPitch */ BBox fontBBox; /* key: FontBBox */ int underlinePosition; /* key: UnderlinePosition */ int underlineThickness; /* key: UnderlineThickness */ char *version; /* key: Version */ char *notice; /* key: Notice */ char *encodingScheme; /* key: EncodingScheme */ int capHeight; /* key: CapHeight */ int xHeight; /* key: XHeight */ int ascender; /* key: Ascender */ int descender; /* key: Descender */ } GlobalFontInfo; /* Ligature definition is a linked list since any character can have * any number of ligatures. */ typedef struct _t_ligature { char *succ, *lig; struct _t_ligature *next; } Ligature; /* Character Metric Information. This structure is used only if ALL * character metric information is requested. If only the character * widths is requested, then only an array of the character x-widths * is returned. * * The key that each field is associated with is in comments. For an * explanation about each key and its value please refer to the * Character Metrics section of the AFM documentation (full title * & version given above). */ typedef struct { int code, /* key: C */ wx, /* key: WX */ wy; /* together wx and wy are associated with key: W */ char *name; /* key: N */ BBox charBBox; /* key: B */ Ligature *ligs; /* key: L (linked list; not a fixed number of Ls */ } CharMetricInfo; /* Track kerning data structure. * The fields of this record are the five values associated with every * TrackKern entry. * * For an explanation about each value please refer to the * Track Kerning section of the AFM documentation (full title * & version given above). */ typedef struct { int degree; float minPtSize, minKernAmt, maxPtSize, maxKernAmt; } TrackKernData; /* Pair Kerning data structure. * The fields of this record are the four values associated with every * KP entry. For KPX entries, the yamt will be zero. * * For an explanation about each value please refer to the * Pair Kerning section of the AFM documentation (full title * & version given above). */ typedef struct { char *name1; char *name2; int xamt, yamt; } PairKernData; /* PCC is a piece of a composite character. This is a sub structure of a * compCharData described below. * These fields will be filled in with the values from the key PCC. * * For an explanation about each key and its value please refer to the * Composite Character section of the AFM documentation (full title * & version given above). */ typedef struct { char *pccName; int deltax, deltay; } Pcc; /* Composite Character Information data structure. * The fields ccName and numOfPieces are filled with the values associated * with the key CC. The field pieces points to an array (size = numOfPieces) * of information about each of the parts of the composite character. That * array is filled in with the values from the key PCC. * * For an explanation about each key and its value please refer to the * Composite Character section of the AFM documentation (full title * & version given above). structure extended for use with t1lib. The fields "width" and bbox store the composite characters escapement and its bounding box (2001-05-027, RMz) */ typedef struct { int wx; /* these two will be filled by T1_LoadFont() */ BBox charBBox; char *ccName; int numOfPieces; Pcc *pieces; } CompCharData; /* FontInfo * Record type containing pointers to all of the other data * structures containing information about a font. * A a record of this type is filled with data by the * parseFile function. */ typedef struct { GlobalFontInfo *gfi; /* ptr to a GlobalFontInfo record */ int *cwi; /* ptr to 256 element array of just char widths */ int numOfChars; /* number of entries in char metrics array */ CharMetricInfo *cmi; /* ptr to char metrics array */ int numOfTracks; /* number to entries in track kerning array */ TrackKernData *tkd; /* ptr to track kerning array */ int numOfPairs; /* number to entries in pair kerning array */ PairKernData *pkd; /* ptr to pair kerning array */ int numOfComps; /* number to entries in comp char array */ CompCharData *ccd; /* ptr to comp char array */ } FontInfo; /************************* PROCEDURES ****************************/ /* Call this procedure to do the grunt work of parsing an AFM file. * * "fp" should be a valid file pointer to an AFM file. * * "fi" is a pointer to a pointer to a FontInfo record sturcture * (defined above). Storage for the FontInfo structure will be * allocated in parseFile and the structure will be filled in * with the requested data from the AFM File. * * "flags" is a mask with bits set representing what data should * be saved. Defined above are valid flags that can be used to set * the mask, as well as a few commonly used masks. * * The possible return codes from parseFile are defined above. */ extern int T1lib_parseFile ( FILE *fp, FontInfo **fi, FLAGS flags ); xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1lib.h.in0000664000175000017500000004164311742726711023075 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1lib.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2004-12-19 ----- Description: This file is part of the t1-library. It must be included by the user of the t1lib. It contains function declarations and some basic data types, the user must deal with. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2004. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifndef T1LIB_H_INCLUDED #define T1LIB_H_INCLUDED /* type definitions, needed by the user: */ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* Version information filled in by configure */ #define T1LIB_VERSION @T1LIB_VERSION@ #define T1LIB_REVISION @T1LIB_REVISION@ #define T1LIB_PATCHLEVEL @T1LIB_PATCHLEVEL@ #define T1LIB_VERSIONSTRING @T1LIB_VERSIONSTRING@ /* Data Type information filled in by configure. */ typedef @T1_INT16@ T1_int16; typedef @T1_INT32@ T1_int32; /* the data structure which contains the character bitmap description */ typedef struct { char *bits; /* A pointer to the characters local bitmap */ struct /* A struct containing diverse metric information */ { int ascent; int descent; int leftSideBearing; int rightSideBearing; int advanceX; int advanceY; } metrics; void *pFontCacheInfo; unsigned long bpp; } GLYPH; /* A structure representing a matrix */ typedef struct { double cxx; double cyx; double cxy; double cyy; } T1_TMATRIX; /* the bounding box data structure: */ typedef struct { int llx; /* lower left x-position */ int lly; /* lower left y-position */ int urx; /* upper right x-position */ int ury; /* upper right y-position */ } BBox; /* A data that makes most important information available to user. */ typedef struct { int width; /* The glyph's width */ BBox bbox; /* The glyph's bounding box */ int numchars; /* The number of characters in the glyph (string) */ int *charpos; /* A pointer to an integer array were the horizontal positions in (afm units) of the individual characters in the string are stored */ } METRICSINFO; #define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) /* def's for T1_InitLib() */ #define NO_LOGFILE 0x0 #define LOGFILE 0x1 #define IGNORE_FONTDATABASE 0x2 /* Default is to read database */ #define IGNORE_CONFIGFILE 0x4 /* Default is to read config file */ #define T1_AA_CACHING 0x8 /* Cache aa-bytes */ #define T1_NO_AFM 0x10 /* Do not load or generate AFM data */ /* common 'yes'/'no' */ #define T1_YES 0x1 #define T1_NO 0x0 /* logfile levels: */ #define T1LOG_ERROR 1 #define T1LOG_WARNING 2 #define T1LOG_STATISTIC 3 #define T1LOG_DEBUG 4 /* #define's for manipulating searchpaths */ #define T1_PFAB_PATH 0x01 #define T1_AFM_PATH 0x02 #define T1_ENC_PATH 0x04 #define T1_FDB_PATH 0x08 #define T1_APPEND_PATH 0x00 #define T1_PREPEND_PATH 0x01 /* #define's for character/string properties (not all implemented) */ #define T1_DEFAULT 0x0000 #define T1_UNDERLINE 0x0001 #define T1_OVERLINE 0x0002 #define T1_OVERSTRIKE 0x0004 #define T1_DOUBLEOVERSTRIKE 0x0008 #define T1_RIGHT_TO_LEFT 0x0010 #define T1_SUBSCRIPT 0x0100 #define T1_SUPERSCRIPT 0x0200 #define T1_STROKED 0x1000 #define T1_KERNING 0x2000 /* Setting the subsampling value */ #define T1_AA_NONE 1 #define T1_AA_LOW 2 #define T1_AA_HIGH 4 /* Error handling: */ extern int T1_errno; /* These are from scanning a font file */ #define T1ERR_SCAN_FONT_FORMAT -5 #define T1ERR_SCAN_FILE_OPEN_ERR -4 #define T1ERR_SCAN_OUT_OF_MEMORY -3 #define T1ERR_SCAN_ERROR -2 #define T1ERR_SCAN_FILE_EOF -1 /* These are from generating paths */ #define T1ERR_PATH_ERROR 1 #define T1ERR_PARSE_ERROR 2 #define T1ERR_TYPE1_ABORT 3 /* These are from t1lib */ #define T1ERR_INVALID_FONTID 10 #define T1ERR_INVALID_PARAMETER 11 #define T1ERR_OP_NOT_PERMITTED 12 #define T1ERR_ALLOC_MEM 13 #define T1ERR_FILE_OPEN_ERR 14 #define T1ERR_UNSPECIFIED 15 #define T1ERR_NO_AFM_DATA 16 #define T1ERR_X11 17 #define T1ERR_COMPOSITE_CHAR 18 #define T1ERR_SCAN_ENCODING 19 /* Flags to control the rasterizer */ #define T1_IGNORE_FORCEBOLD 0x0001 #define T1_IGNORE_FAMILYALIGNMENT 0x0002 #define T1_IGNORE_HINTING 0x0004 #define T1_DEBUG_LINE 0x0100 #define T1_DEBUG_REGION 0x0200 #define T1_DEBUG_PATH 0x0400 #define T1_DEBUG_FONT 0x0800 #define T1_DEBUG_HINT 0x1000 /* definitions for outline handling */ #define FRACTBITS 16 /* number of fractional bits in 'fractpel' */ /* From/to conversion of pels/fractpels */ #define T1_TOPATHPOINT(p) (((T1_int32)p)<>FRACTBITS) /* A fractional point */ typedef struct { T1_int32 x; T1_int32 y; } T1_PATHPOINT; /* A straight outline segment, stroked or not stroked */ typedef struct pathsegment { char type; /* type of segment (line or move) */ unsigned char flag; /* type1 rasterizer internal stuff */ short references; /* type1 rasterizer internal stuff */ unsigned char size; /* size of the structure */ unsigned char context; /* index to device context */ struct pathsegment *link; /* pointer to next structure in linked list */ struct pathsegment *last; /* pointer to last structure in list */ T1_PATHPOINT dest; /* relative ending location of path segment */ } T1_PATHSEGMENT; /* A third order bezier segment */ typedef struct bezierpathsegment { char type; /* type of segment (bezier) */ unsigned char flag; /* type1 rasterizer internal stuff */ short references; /* type1 rasterizer internal stuff */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ T1_PATHSEGMENT *link; /* as with any 'segment' type */ T1_PATHSEGMENT *last; /* as with any 'segment' type */ T1_PATHPOINT dest; /* ending point (D) */ T1_PATHPOINT B; /* control point B */ T1_PATHPOINT C; /* control point C */ } T1_BEZIERSEGMENT; typedef T1_PATHSEGMENT T1_OUTLINE; #define T1_PATHTYPE_LINE 0x10 #define T1_PATHTYPE_BEZIER 0x12 #define T1_PATHTYPE_MOVE 0x15 /* Definitions for font subsetting */ #define T1_SUBSET_DEFAULT 0x00 #define T1_SUBSET_FORCE_REENCODE 0x01 #define T1_SUBSET_SKIP_REENCODE 0x02 #define T1_SUBSET_ENCRYPT_BINARY 0x04 /* This is only for debugging, it does not produce valid font-files! This flag is not in the documented API!. */ #define T1_SUBSET_ENCRYPT_NONE 0x08 /* Two structures for handling composite character data */ /* One structure for each symbol of the composite character */ typedef struct { int piece; /* the index of the current symbol */ int deltax; /* horizontal displacement of current symbol in CS */ int deltay; /* vertical displacement of current symbol in CS */ } T1_COMP_PIECE; /* This one defines the composite character, the number of pieces and how to access their data. */ typedef struct { int compchar; /* the base character in the current encoding */ int numPieces; /* the number of defined pieces including the base char */ T1_COMP_PIECE *pieces; /* a pointer to the pieces' information */ } T1_COMP_CHAR_INFO; /* function declarations: */ /* from t1base.c */ extern void *T1_InitLib( int log); extern int T1_CloseLib( void); extern int T1_AddFont( char *fontfilename); extern void T1_PrintLog( char *func_ident, char *msg_txt, int level, ...); extern void T1_SetLogLevel( int level); extern int T1_CheckForInit(void); extern int T1_CheckForFontID( int FontID); extern char *T1_GetFontFileName( int FontID); extern int T1_GetNoFonts(void); extern int T1_SetDeviceResolutions( float x_res, float y_res); extern int T1_CopyFont( int FontID); extern int T1_QueryX11Support( void); extern int T1_CheckEndian(void); extern int T1_SetBitmapPad( int pad); extern int T1_GetBitmapPad( void); extern char *T1_GetLibIdent( void); extern void T1_SetRasterFlags( int flags); extern char *T1_GetAfmFileName( int FontID); extern int T1_SetAfmFileName( int FontId, char *afm_name); extern char *T1_GetFontFilePath( int FontID); extern char *T1_GetAfmFilePath( int FontID); extern const char *T1_StrError( int t1err); /* from t1delete.c */ extern int T1_DeleteSize( int FontID, float size); extern int T1_DeleteAllSizes( int FontID); extern int T1_FreeGlyph( GLYPH *glyph); extern int T1_FreeCompCharData( T1_COMP_CHAR_INFO *cci); extern int T1_DeleteFont( int FontID); /* from t1enc.c */ extern char **T1_LoadEncoding( char *FileName); extern int T1_DeleteEncoding( char **encoding); extern int T1_ReencodeFont( int FontID, char **Encoding); extern int T1_SetDefaultEncoding( char **encoding); extern char *T1_GetEncodingScheme( int FontID); /* from t1env.c */ extern int T1_SetFileSearchPath( int type, char *pathname); extern int T1_AddToFileSearchPath( int pathtype, int mode, char *pathname); extern char *T1_GetFileSearchPath( int type); extern int T1_SetFontDataBase( char *filename); extern int T1_AddFontDataBase( int mode, char *filename); /* from t1finfo.c */ extern int T1_GetKerning( int FontID, char char1, char char2); extern int T1_GetCharWidth( int FontID, char char1); extern BBox T1_GetCharBBox( int FontID, char char1); extern float T1_GetUnderlinePosition( int FontID); extern float T1_GetUnderlineThickness( int FontID); extern float T1_GetItalicAngle( int FontID); extern int T1_GetIsFixedPitch( int FontID); extern char *T1_GetFontName( int FontID); extern char *T1_GetFullName( int FontID); extern char *T1_GetFamilyName( int FontID); extern char *T1_GetWeight( int FontID); extern char *T1_GetVersion( int FontID); extern char *T1_GetNotice( int FontID); extern char *T1_GetCharName( int FontID, char char1); extern int T1_QueryLigs( int FontID, char char1, char **successors, char **ligatures); extern int T1_GetEncodingIndex( int FontID, char *char1); extern int *T1_GetEncodingIndices( int FontID, char *char1); extern int T1_GetStringWidth( int FontID, char *string, int len, long spaceoff, int kerning); extern BBox T1_GetStringBBox( int FontID, char *string, int len, long spaceoff, int kerning); extern METRICSINFO T1_GetMetricsInfo( int FontID, char *string, int len, long spaceoff, int kerning); extern BBox T1_GetFontBBox( int FontID); extern char **T1_GetAllCharNames( int FontID); extern int T1_GetNoKernPairs( int FontID); extern int T1_GetNoCompositeChars( int FontID); extern int T1_QueryCompositeChar( int FontID, char char1); extern T1_COMP_CHAR_INFO *T1_GetCompCharData( int FontID, char char1); extern T1_COMP_CHAR_INFO *T1_GetCompCharDataByIndex( int FontID, int index); extern int T1_IsInternalChar( int FontID, char char1); /* from t1load.c */ extern int T1_LoadFont( int FontID); extern void *T1_QueryFontSize( int FontID, float size, int aa); /* from t1set.c */ extern GLYPH *T1_SetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_SetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern GLYPH* T1_SetRect( int FontID, float size, float width, float height, T1_TMATRIX *transform); extern GLYPH *T1_CopyGlyph(GLYPH *glyph); extern void T1_DumpGlyph( GLYPH *glyph); extern GLYPH *T1_ConcatGlyphs( GLYPH *glyph1, GLYPH *glyph2, int x_off, int y_off, int modflag); extern void T1_DumpPixmap( GLYPH *glyph); extern GLYPH *T1_FillOutline( T1_OUTLINE *path, int modflag); /* from t1trans.c */ extern int T1_ExtendFont( int FontID, double extend); extern int T1_SlantFont( int FontID, double slant); extern int T1_TransformFont( int FontID, T1_TMATRIX *matrix); extern double T1_GetExtend( int FontID); extern double T1_GetSlant( int FontID); extern T1_TMATRIX T1_GetTransform( int FontID); extern int T1_SetLinePosition( int FontID, int linetype, float value); extern int T1_SetLineThickness( int FontID, int linetype, float value); extern float T1_GetLinePosition( int FontID, int linetype); extern float T1_GetLineThickness( int FontID, int linetype); extern T1_TMATRIX *T1_RotateMatrix( T1_TMATRIX *matrix, double angle); extern T1_TMATRIX *T1_MirrorHMatrix( T1_TMATRIX *matrix); extern T1_TMATRIX *T1_MirrorVMatrix( T1_TMATRIX *matrix); extern T1_TMATRIX *T1_ShearHMatrix( T1_TMATRIX *matrix, double shear); extern T1_TMATRIX *T1_ShearVMatrix( T1_TMATRIX *matrix, double shear); extern T1_TMATRIX *T1_ExtendHMatrix( T1_TMATRIX *matrix, double extent); extern T1_TMATRIX *T1_ExtendVMatrix( T1_TMATRIX *matrix, double extent); extern T1_TMATRIX *T1_TransformMatrix( T1_TMATRIX *matrix, double cxx, double cyx, double cxy, double cyy); extern int T1_StrokeFont( int FontID, int dostroke); extern int T1_SetStrokeFlag( int FontID); extern int T1_ClearStrokeFlag( int FontID); extern int T1_GetStrokeMode( int FontID); extern int T1_SetStrokeWidth( int FontID, float strokewidth); extern float T1_GetStrokeWidth( int FontID); /* from t1aaset.c */ extern GLYPH *T1_AASetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_AASetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern GLYPH* T1_AASetRect( int FontID, float size, float width, float height, T1_TMATRIX *transform); extern int T1_AASetGrayValues(unsigned long white, unsigned long gray75, unsigned long gray50, unsigned long gray25, unsigned long black); extern int T1_AAHSetGrayValues( unsigned long *grayvals); extern int T1_AANSetGrayValues( unsigned long bg, unsigned long fg); extern int T1_AAGetGrayValues( long *pgrayvals); extern int T1_AAHGetGrayValues( long *pgrayvals); extern int T1_AANGetGrayValues( long *pgrayvals); extern int T1_AASetBitsPerPixel( int bpp); extern int T1_AAGetBitsPerPixel( void); extern int T1_AASetLevel( int level); extern int T1_AAGetLevel( void); extern GLYPH *T1_AAFillOutline( T1_OUTLINE *path, int modflag); extern int T1_AASetSmartLimits( float limit1, float limit2); extern int T1_AASetSmartMode( int smart); /* from t1afmtool.c */ extern int T1_WriteAFMFallbackFile( int FontID); /* from t1outline.c */ extern T1_OUTLINE *T1_GetCharOutline( int FontID, char charcode, float size, T1_TMATRIX *transform); extern T1_OUTLINE *T1_GetStringOutline( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern T1_OUTLINE *T1_ConcatOutlines( T1_OUTLINE *path1, T1_OUTLINE *path2); extern T1_OUTLINE *T1_ScaleOutline( T1_OUTLINE *path, float scale); extern T1_OUTLINE *T1_GetMoveOutline( int FontID, int deltax, int deltay, int modflag, float size, T1_TMATRIX *transform); extern void T1_DumpPath( T1_OUTLINE *path); extern void T1_AbsolutePath( T1_OUTLINE *rpath); extern void T1_RelativePath( T1_OUTLINE *apath); extern void T1_ManipulatePath( T1_OUTLINE *path, void (*manipulate)(long *x,long *y,int type)); extern T1_OUTLINE *T1_CopyOutline( T1_OUTLINE *path); extern void T1_FreeOutline( T1_OUTLINE *path); /* from t1subset.c */ extern char *T1_SubsetFont( int FontID, char *mask, unsigned int flags, int linewidth, unsigned long maxblocksize, unsigned long *bufsize); extern char *T1_GetCharString( int FontID, char *charname, int *len); extern int T1_GetlenIV( int FontID); #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif /* T1LIB_H_INCLUDED */ xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1base.h0000664000175000017500000000650211742726711022627 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1base.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2002-05-16 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1base.c ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1BASE_C void *T1_InitLib( int log); int intT1_scanFontDBase( char *filename); int intT1_scanFontDBaseXLFD( char *filename); int T1_CloseLib( void); int T1_AddFont( char *fontfilename); void T1_PrintLog( char *func_ident, char *msg_txt, int level, ...); void T1_SetLogLevel( int level); int T1_CheckForInit(void); int T1_CheckForFontID( int FontID); char *T1_GetFontFileName( int FontID); int T1_GetNoFonts(void); int T1_SetDeviceResolutions( float x_res, float y_res); int T1_CopyFont( int FontID); int T1_QueryX11Support( void); int T1_CheckEndian(void); int T1_SetBitmapPad( int pad); int T1_GetBitmapPad( void); char *T1_GetLibIdent( void); void T1_SetRasterFlags( int flags); char *T1_GetAfmFileName( int FontID); int T1_SetAfmFileName( int FontId, char *afm_name); char *T1_GetFontFilePath( int FontID); char *T1_GetAfmFilePath( int FontID); const char *T1_StrError( int t1err); extern int T1_Type1OperatorFlags; #else extern void *T1_InitLib( int log); extern int intT1_scanFontDBase( char *filename); extern int intT1_scanFontDBaseXLFD( char *filename); extern int T1_CloseLib( void); extern int T1_AddFont( char *fontfilename); extern void T1_PrintLog( char *func_ident, char *msg_txt, int level, ...); extern void T1_SetLogLevel( int level); extern int T1_CheckForInit(void); extern int T1_CheckForFontID( int FontID); extern char *T1_GetFontFileName( int FontID); extern int T1_GetNoFonts(void); extern int T1_SetDeviceResolutions( float x_res, float y_res); extern int T1_QueryX11Support( void); extern int T1_CopyFont( int FontID); extern int T1_CheckEndian(void); extern int T1_SetBitmapPad( int pad); extern int T1_GetBitmapPad( void); extern char *T1_GetLibIdent( void); extern void T1_SetRasterFlags( int flags); extern char *T1_GetAfmFileName( int FontID); extern int T1_SetAfmFileName( int FontId, char *afm_name); extern char *T1_GetFontFilePath( int FontID); extern char *T1_GetAfmFilePath( int FontID); extern const char *T1_StrError( int t1err); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1subset.c0000664000175000017500000007327011742726711023223 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1subset.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2005-05-01 ----- Description: This file is part of the t1-library. It contains functions for subsetting type 1 fonts. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1SUBSET_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/paths.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1finfo.h" #include "t1misc.h" #include "t1base.h" #include "t1delete.h" #include "t1subset.h" /* Segment header for pfb-files (reminder): Segment-header: Byte 1: always 128 (0x80) Byte 2: 1 = ASCII text 2 = Binary text 3 = End of file indicator (EOF) Byte 3: least significant byte \ Byte 4: \ Length of Byte 5: / data segment in bytes Byte 6: most significant byte / */ #define SEGMENT_ASCII 1 #define SEGMENT_BINARY 2 #define SEGMENT_EOF 3 extern psobj *StdEncArrayP; /* For accessing StandardEncoding */ static char *charstringP; static int charstringL; /* We define two lookup tables to make a fast conversion from binary bytes to ASCII-hex bytes. */ static unsigned char highHexByte[256]={ 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, 0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31, 0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32, 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, 0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37, 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43, 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, 0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45, 0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46 }; static unsigned char lowHexByte[256]={ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46 }; /* parameters for eexec encryption */ static unsigned short int eexec_r; static unsigned short int eexec_c1=52845; static unsigned short int eexec_c2=22719; /* Eexec-encrption according to the Adobe Black Book */ static unsigned char EexecEncrypt( unsigned char plain) { unsigned char cipher; cipher = (plain ^ (eexec_r>>8)); eexec_r = (cipher + eexec_r) * eexec_c1 + eexec_c2; return( cipher); } static int locateCharString( int FontID, char *charname) { int namelen; int dictlen; int i; psdict *CharStringsP; namelen=strlen( charname); CharStringsP=pFontBase->pFontArray[FontID].pType1Data->CharStringsP; dictlen=CharStringsP[0].key.len; for ( i=1; i<=dictlen; i++) { if (namelen==CharStringsP[i].key.len) { /* This could be the charstring in question */ if (strncmp( charname, CharStringsP[i].key.data.nameP, namelen)==0) { /* It is the the desired charstring */ charstringP=CharStringsP[i].value.data.valueP; charstringL=CharStringsP[i].value.len; return( i); } } } /* charstring not found ??? */ return( 0); } static int make_pfb_segment_header( char *ptr, int type, unsigned long size) { ptr[0]=(char) 0x80; ptr[1]=type; if (type==3) return( 2); ptr[2]=(char)(size & 0xFF); ptr[3]=(char)((size>>8) & 0xFF); ptr[4]=(char)((size>>16) & 0xFF); ptr[5]=(char)((size>>24) & 0xFF); return( 6); } char *T1_SubsetFont( int FontID, char *mask, unsigned int flags, int linewidth, unsigned long maxblocksize, unsigned long *bufsize) { FILE *ifp; static char *filebuf=NULL; unsigned long filesize=0; int filesegs=0; char *outbuf=NULL; unsigned long outsize=0; char *encryptbuf=NULL; unsigned long encryptsize=0; int encryptsegs=0; char *trailerbuf=NULL; unsigned long trailersize=0; int trailersegs=0; char linebuf[1025]; char *csdone; /* stores which charstrings already have been written */ int currstring_no=0; char *charnameP; char charnamebuf[257]; unsigned char cipher; char rdstring[3]; char ndstring[3]; int retval=1; /* Indices. Could save a few but debugging becomes easier this way */ int i=0; int j=0; int k=0; int l=0; int m=0; int n=0; int o=0; int p=0; int notdefencoded=0; int stdenc=0; int reencode=0; int colcount=0; int tr_len=-1; int encrypt=1; /* 1=ASCII-hex, 2=Binary, 0=None (for debugging) */ int dindex=0; int nocharstrings=0; char encmask[256]; /* Mask after resolving composite characters */ T1_COMP_CHAR_INFO* cci = NULL; /* variables for checking SEAC's */ int qs_num = 0; unsigned char qs_piece1 = 0; unsigned char qs_piece2 = 0; /* Otherwise we would get invalid accesses later */ if (T1_CheckForFontID(FontID)!=1) { T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* Check parameters */ if ( (mask==NULL) || (bufsize==NULL) || (linewidth < 8) || (linewidth > 1024) || (maxblocksize < 4) ) { T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } /* Reset resulting encoding mask */ for ( j=0; j<256; j++) { encmask[j] = 0; } /* Build encmask, a mask, where all required elementary character definitions required are tagged. Font internal SEAC definitions are evaluated at first priority, and as a fallback, also user specified composite character data is taken into account. */ for ( j=0; j<256; j++) { if ( mask[j] != 0 ) { /* In any case, tag slot j itself */ encmask[j] |= 0x01; /* Now check against correctly defined SEAC (Standard Encoding Accented Character). */ if ( (qs_num = T1int_QuerySEAC( FontID, j, &qs_piece1, &qs_piece2 )) > 1 ) { /* We have a SEAC --> reserve 2 additional slots, the basechar and the accent. The index numbers in this case always refer to to StandardEncoding, which is not necessarily the font's current encoding. We indicate this by using bit 2 0x2 inverse sign. */ encmask[qs_piece1] |= 0x2; encmask[qs_piece2] |= 0x2; } else { /* OK, it is no a SEAC, but we still check against AFM composite character data definition. This is non-standard, but we give the user the chance to access all single character definitions in order construct arbitrary composite characters. */ if ( cci != NULL ) { T1_FreeCompCharData( cci); } cci = T1_GetCompCharData( FontID, j); if ( (cci != NULL) && (cci->numPieces > 1) ) { /* Tag all components that are required to construct the composite character j. */ for ( p=0; pnumPieces; p++) { encmask[cci->pieces[p].piece] |= 0x1; } } } } /* if ( mask[j] != 0 ) */ } /* for ... mask */ /* Inspect encmask, get number of atomic charstrings and check for ".notdef" being encoded. */ for ( j=0; j<256; j++) { if ( (encmask[j] & 0x01) != 0 ) { ++nocharstrings; /* Obtain name from current encoding */ charnameP=T1_GetCharName( FontID, j); } if ( (encmask[j] & 0x02) != 0 ) { ++nocharstrings; /* Obtain name from StandardEncoding */ strncpy( charnamebuf, (StdEncArrayP[j]).data.nameP, (StdEncArrayP[j]).len); charnamebuf[StdEncArrayP[j].len] = '\0'; charnameP=charnamebuf; } if ( encmask[j] != 0 ) { if ( strcmp(charnameP, ".notdef") == 0 ) { notdefencoded=1; } } } /* adjust encrypting type according to flags. Default is ASCII-hex encryption because the output may be verbatim inserted into a PostScript-file. */ if (flags & T1_SUBSET_ENCRYPT_BINARY) encrypt=2; else if (flags & T1_SUBSET_ENCRYPT_NONE) encrypt=0; /* Open and initialize scanning machinery */ T1io_reset(); if ((ifp = (FILE *)T1Open(T1_GetFontFilePath( FontID), "rb"))==NULL) { T1_errno=T1ERR_FILE_OPEN_ERR; return(NULL); } if (encrypt==0) sprintf( err_warn_msg_buf, "Subsetting Font %d, flags=0x%X, non-encrypted debug output", FontID, flags); else if (encrypt==1) sprintf( err_warn_msg_buf, "Subsetting Font %d, flags=0x%X, ASCII-hex output with linelength %d", FontID, flags, linewidth); else if (encrypt==2) sprintf( err_warn_msg_buf, "Subsetting Font %d, flags=0x%X, Binary output with maximum blocksize %lu", FontID, flags, maxblocksize); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); /* Get size of file */ filesize=T1GetFileSize( ifp); sprintf( err_warn_msg_buf, "Source file %s is %lu bytes long", T1_GetFontFilePath( FontID), filesize); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); if ((filebuf=(char *)calloc( filesize, sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( NULL); } while (retval>0) { /* get a line from the file. We have to read enough characters to ensure that "eexec" does not get split between two reads. Otherwise, decryption would not be started. */ retval=T1Gets(&(filebuf[i]), 1025, ifp); i+=retval; if ( (dindex==0) && (T1GetDecrypt()>0) ) { dindex=i-retval; /* from this point on we have decrypted bytes */ sprintf( err_warn_msg_buf, "Human-readable header finished (%d data bytes)", dindex); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); } /* Encoding handling follows. Note: If the font file defines StandardEncoding (as we will check shortly), but the font has been reencoded by t1lib, we enforce reencoding in any case so that all characters are accessible eventually in the subset. */ if ( pFontBase->pFontArray[FontID].pFontEnc != NULL ) { T1_PrintLog( "T1_SubsetFont()", "Font is reencoded by t1lib, enforcing Reencoding of subset", T1LOG_DEBUG); /* Set flag to enforce reenocde in case of StandardEncoding */ flags |= T1_SUBSET_FORCE_REENCODE; /* Reset flag to enforce reenocde in case of StandardEncoding */ flags &= ~T1_SUBSET_SKIP_REENCODE; } if (strstr( &(filebuf[i-retval]), "/Encoding")!=NULL) { if (strstr( &(filebuf[i-retval]), "StandardEncoding")!=NULL) { stdenc=1; if ((flags & T1_SUBSET_FORCE_REENCODE)!=0) { /* we ignore the current line ... */ i-=retval; /* and put the encoding header into the buffer */ i+=sprintf( &(filebuf[i]), "/Encoding 256 array\n0 1 255 {1 index exch /.notdef put} for\n" ); reencode=1; } else { T1_PrintLog( "T1_SubsetFont()", "Leaving StandardEncoding untouched", T1LOG_DEBUG); reencode=0; } } else { /* The encoding is explicitly defined in the font file. We skip copying the whole definition because we will reencode the subset later, unless reencoding should be skipped by means of the flag settings. If the font has been reencoded by t1lib, we enforce reencoding in order to ensure that all characters in the subset will be accessible (see above). */ stdenc=0; retval=T1Gets(&(filebuf[i]), 1025, ifp); i+=retval; while (retval>0) { /* get a line and check for end of encoding definition. */ retval=T1Gets(&(filebuf[i]), 1025, ifp); if ((flags & T1_SUBSET_SKIP_REENCODE)!=0) { /* we store the encoding defined here */ i+=retval; reencode=0; } else { reencode=1; } if ( (dindex==0) && (T1GetDecrypt()>0) ) { dindex=i; /* from this point we have decrypted bytes */ } if (strstr( &(filebuf[i-retval]), "readonly def")!=NULL) { break; } } if (reencode==0) T1_PrintLog( "T1_SubsetFont()", "Preserving FontSpecific Encoding", T1LOG_DEBUG); } /* At this point, if required, the actual encoding definition follows. */ if ( reencode!=0) { k=0; /* Write actually required encoding slots. We only encode the characters required from the current fonts encoding. Characters from StandardEncoding required by composite chars are not encoded. */ for ( j=0; j<256; j++) { if ( (encmask[j] & 0x01) !=0 ) { charnameP=T1_GetCharName( FontID, j); i+=sprintf( &(filebuf[i]), "dup %d /%s put\n", j, charnameP); k++; } } /* finish encoding definition */ i+=sprintf( &(filebuf[i]), "readonly def\n"); sprintf( err_warn_msg_buf, "Encoded %d characters", k); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); k=0; } } /* end of if (...encoding handling...) */ /* Extract the names that are used for the charstring definitions. We will later need them! */ if (strstr( &(filebuf[i-retval]), "/RD")!=NULL) { sprintf( rdstring, "RD"); } if (strstr( &(filebuf[i-retval]), "/ND")!=NULL) { sprintf( ndstring, "ND"); } if (strstr( &(filebuf[i-retval]), "/-|")!=NULL) { sprintf( rdstring, "-|"); } if (strstr( &(filebuf[i-retval]), "/|-")!=NULL) { sprintf( ndstring, "|-"); } if (strstr( &(filebuf[i-retval]), "/CharStrings")!=NULL) { /* replace dictionary with one of an appropriate size: */ i -=retval; sprintf( err_warn_msg_buf, "Private dictionary finished (%u data bytes)", i-dindex); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); /* if .notdef is not in the encoding mask, we have to reserve room for the additional charstring .notdef. Note that still nocharstrings is an upper bound estimation, which is reached in cases where no characters are encoded more than one time. */ if ( notdefencoded == 0 ) { nocharstrings++; } i+=sprintf( &(filebuf[i]), "2 index /CharStrings %d dict dup begin\n", nocharstrings); break; } } /* the portion until Charstrings-dict is now read in */ /* We now have to write the CharStrings. Each charstring must be written once, even if the respective character appears more than once in the encoding. So we set up table to remember which charstrings already have been written. Note: The indices returned by locateCharString() range from 1 to n, so that we have to decrement the index when filling the csdone array! */ if (( csdone=(char *)calloc( pFontBase->pFontArray[FontID].pType1Data->CharStringsP[0].key.len, sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; free( filebuf); T1Close( ifp); return( NULL); } /* The .notdef character is in force! */ if ((currstring_no=locateCharString( FontID, ".notdef"))==0) { T1_errno=T1ERR_UNSPECIFIED; free( csdone); T1Close( ifp); return( NULL); } i+=sprintf( &(filebuf[i]), "/.notdef %d %s ", charstringL, rdstring); memcpy(&(filebuf[i]), charstringP, charstringL); i+=charstringL; i+=sprintf( &(filebuf[i]), " %s\n", ndstring); csdone[currstring_no-1]=1; /* Now, step through the specifier matrix and write only the necessary charstrings. */ for ( j=0; j<256; j++) { if (encmask[j]!=0) { if ( (encmask[j] & 0x01) != 0 ) { /* Obtain name from current encoding */ charnameP=T1_GetCharName( FontID, j); } else { /* Obtain name from StandardEncoding */ strncpy( charnamebuf, (StdEncArrayP[j]).data.nameP, (StdEncArrayP[j]).len); charnamebuf[StdEncArrayP[j].len] = '\0'; charnameP=charnamebuf; } if ((currstring_no=locateCharString( FontID, charnameP))==0) { /* Atomic character not found. This is mysterious, but causes no harm because .notdef will be substituted */ sprintf( err_warn_msg_buf, "Could not locate CS ""%s"" for index %d", charnameP, j); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_WARNING); continue; } /* Process charstring only if it has not already been done */ if (csdone[currstring_no-1]==0) { k=i; i+=sprintf( &(filebuf[i]), "/%s %d %s ", charnameP, charstringL, rdstring); memcpy(&(filebuf[i]), charstringP, charstringL); i+=charstringL; i+=sprintf( &(filebuf[i]), " %s\n", ndstring); csdone[currstring_no-1]=1; sprintf( err_warn_msg_buf, "Processing of CS ""%s"" for index %d (EncMaskFlag=0x%X) successful (len=%d bytes, line=%d bytes)", charnameP, j, encmask[j], charstringL, i-k); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); } else { sprintf( err_warn_msg_buf, "Skipped multiple processing of CS ""%s"" (index %d)", charnameP, j); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); } } } /* Get rid of temporary data */ if (csdone!=NULL) { free( csdone); csdone = NULL; } if ( cci != NULL ) { free( cci); cci = NULL; } /* All charstrings are written. Some PostScript code follows */ i+=sprintf( &(filebuf[i]), "end\nend\nreadonly put\nnoaccess put\ndup /FontName get exch definefont pop\nmark currentfile closefile\n"); sprintf( err_warn_msg_buf, "Charstrings and Font definition finished (%d data bytes, from which %d bytes will be encrypted)", i, i-dindex); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); /* we compute the size of the encrypted area. */ if (encrypt==1) { encryptsize=i-dindex; encryptsize+=4; /* the four random bytes */ encryptsize*=2; /* since we use ASCII-hex output */ encryptsize+=(int)ceil((double)encryptsize/linewidth); /* we need a few newline characters to adjust the output format */ } else if (encrypt==2) { /* binary encryption. The whole data is contiguous and only at the end of the data a newline is added. */ encryptsize=i-dindex+1; encryptsize+=4; /* the four random bytes */ } else { /*The case of no encryption does not produce valid fonts, it is for debugging purposes only */ encryptsize=i-dindex+1; } /* we add the size of the 512 zeros and the cleartomark */ trailersize+=ZEROS; trailersize+=(int)ceil((double)ZEROS/linewidth); trailersize+=12; /* cleartomark */ /* Search for remaining PostScript code in the last 1024 bytes. This should suffice for any font. */ tr_len=T1GetTrailer( linebuf, 1025, ifp); T1Close(ifp); /* we do not need the file any longer */ /* And we add the size of the trailer. A trailer only consisting of a newline is ignored because the newline has already been included in the cleartomark-string. */ if ( !((tr_len==1) && ((linebuf[0]=='\n') || (linebuf[0]=='\r')) ) ) { trailersize+=tr_len; } if ((encryptbuf=(char *)calloc( encryptsize, 1))==NULL) { T1_errno=T1ERR_ALLOC_MEM; free( filebuf); return( NULL); } /* Allocate one byte in orer to be able to use sprintf() (which appends an ASCII-\0).*/ if ((trailerbuf=(char *)calloc( trailersize+1, 1))==NULL) { T1_errno=T1ERR_ALLOC_MEM; free( filebuf); free( encryptbuf); return( NULL); } k=0; colcount=0; /* perform eexec-encryption */ eexec_r=55665; if (encrypt==0) { for (j=dindex; jpFontArray[FontID].pType1Data->Private[LENIV].value.data.integer); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1trans.h0000664000175000017500000001011611742726711023040 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1trans.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2002-10-19 ----- Description: This file is part of the t1-library. It contains definitions and declarations fort t1trans.c ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2002. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1TRANS_C int T1_ExtendFont( int FontID, double extend); int T1_SlantFont( int FontID, double slant); int T1_TransformFont( int FontID, T1_TMATRIX *matrix); double T1_GetExtend( int FontID); double T1_GetSlant( int FontID); T1_TMATRIX T1_GetTransform( int FontID); int T1_SetLinePosition( int FontID, int linetype, float value); int T1_SetLineThickness( int FontID, int linetype, float value); float T1_GetLinePosition( int FontID, int linetype); float T1_GetLineThickness( int FontID, int linetype); T1_TMATRIX *T1_RotateMatrix( T1_TMATRIX *matrix, double angle); T1_TMATRIX *T1_MirrorHMatrix( T1_TMATRIX *matrix); T1_TMATRIX *T1_MirrorVMatrix( T1_TMATRIX *matrix); T1_TMATRIX *T1_ShearHMatrix( T1_TMATRIX *matrix, double shear); T1_TMATRIX *T1_ShearVMatrix( T1_TMATRIX *matrix, double shear); T1_TMATRIX *T1_ExtendHMatrix( T1_TMATRIX *matrix, double extent); T1_TMATRIX *T1_ExtendVMatrix( T1_TMATRIX *matrix, double extent); T1_TMATRIX *T1_TransformMatrix( T1_TMATRIX *matrix, double cxx, double cyx, double cxy, double cyy); int T1_StrokeFont( int FontID, int dostroke); int T1_SetStrokeFlag( int FontID); int T1_ClearStrokeFlag( int FontID); int T1_GetStrokeMode( int FontID); int T1_SetStrokeWidth( int FontID, float strokewidth); float T1_GetStrokeWidth( int FontID); #else extern int T1_ExtendFont( int FontID, double extend); extern int T1_SlantFont( int FontID, double slant); extern int T1_TransformFont( int FontID, T1_TMATRIX *matrix); extern double T1_GetExtend( int FontID); extern double T1_GetSlant( int FontID); extern T1_TMATRIX T1_GetTransform( int FontID); extern int T1_SetLinePosition( int FontID, int linetype, float value); extern int T1_SetLineThickness( int FontID, int linetype, float value); extern float T1_GetLinePosition( int FontID, int linetype); extern float T1_GetLineThickness( int FontID, int linetype); extern T1_TMATRIX *T1_RotateMatrix( T1_TMATRIX *matrix, double angle); extern T1_TMATRIX *T1_MirrorHMatrix( T1_TMATRIX *matrix); extern T1_TMATRIX *T1_MirrorVMatrix( T1_TMATRIX *matrix); extern T1_TMATRIX *T1_ShearHMatrix( T1_TMATRIX *matrix, double shear); extern T1_TMATRIX *T1_ShearVMatrix( T1_TMATRIX *matrix, double shear); extern T1_TMATRIX *T1_ExtendHMatrix( T1_TMATRIX *matrix, double extent); extern T1_TMATRIX *T1_ExtendVMatrix( T1_TMATRIX *matrix, double extent); extern T1_TMATRIX *T1_TransformMatrix( T1_TMATRIX *matrix, double cxx, double cyx, double cxy, double cyy); extern int T1_StrokeFont( int FontID, int dostroke); extern int T1_SetStrokeFlag( int FontID); extern int T1_ClearStrokeFlag( int FontID); extern int T1_GetStrokeMode( int FontID); extern int T1_SetStrokeWidth( int FontID, float strokewidth); extern float T1_GetStrokeWidth( int FontID); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1aaset.c0000664000175000017500000014547311742726711023020 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1aaset.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) Subsampling based on code by Raph Levien (raph@acm.org) ----- Date: 2007-12-21 ----- Description: This file is part of the t1-library. It contains functions for antialiased setting of characters and strings of characters. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2007. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1AASET_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/paths.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1aaset.h" #include "t1set.h" #include "t1load.h" #include "t1finfo.h" #include "t1misc.h" #include "t1base.h" #include "t1outline.h" #define DEFAULTBPP 8 /* As a fall back */ #ifndef T1_AA_TYPE16 #define T1_AA_TYPE16 short #endif #ifndef T1_AA_TYPE32 #define T1_AA_TYPE32 int #endif /* In the following arrays take the gray values. Entry 0 is associated with the white (background) value and the max entry is the black (foreground) value. */ static unsigned T1_AA_TYPE32 gv[5]={0,0,0,0,0}; static unsigned T1_AA_TYPE32 gv_h[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; static unsigned T1_AA_TYPE32 gv_n[2]={0,0}; static int T1aa_level=T1_AA_LOW; /* The default value */ static T1_AA_TYPE32 T1aa_lut[625]; static int T1aa_count[256]; static T1_AA_TYPE32 T1aa_h_lut[289]; static int T1aa_h_count[256]; static T1_AA_TYPE32 T1aa_n_lut[64]; /* This global is for querying the current bg from other parts of t1lib */ unsigned T1_AA_TYPE32 T1aa_bg=0; /* The limit values for smart antialiasing */ float T1aa_smartlimit1=T1_AA_SMARTLIMIT1; float T1aa_smartlimit2=T1_AA_SMARTLIMIT2; int T1aa_SmartOn=0; /* We do not enable smart AA by default */ /* T1_AAInit: This function must be called whenever the T1aa_gray_val or T1aa_bpp variables change, or the level changes. */ static int T1_AAInit ( int level ) { int i; int i0, i1, i2, i3; int movelow=0, movehigh=0, indlow=0, indhigh=0; /* Note: movelow, movehigh, indlow and indhigh take care for proper byte swapping in dependence of endianess for level=4 */ if (level==T1_AA_NONE){ if (T1aa_bpp==8){ if (pFontBase->endian){ movelow=3; movehigh=2; } else{ movelow=0; movehigh=1; } } else if (T1aa_bpp==16){ if (pFontBase->endian){ movelow=1; movehigh=0; } else{ movelow=0; movehigh=1; } } } if (level==T1_AA_HIGH){ if (T1aa_bpp==8){ if (pFontBase->endian){ indlow=17; indhigh=1; movelow=3; movehigh=2; } else{ indlow=1; indhigh=17; movelow=0; movehigh=1; } } else if (T1aa_bpp==16){ if (pFontBase->endian){ indlow=17; indhigh=1; movelow=1; movehigh=0; } else{ indlow=1; indhigh=17; movelow=0; movehigh=1; } } else if (T1aa_bpp==32){ indlow=1; indhigh=17; } for (i = 0; i < 256; i++) { T1aa_h_count[i] = 0; if (i & 0x80) T1aa_h_count[i] += indhigh; if (i & 0x40) T1aa_h_count[i] += indhigh; if (i & 0x20) T1aa_h_count[i] += indhigh; if (i & 0x10) T1aa_h_count[i] += indhigh; if (i & 0x08) T1aa_h_count[i] += indlow; if (i & 0x04) T1aa_h_count[i] += indlow; if (i & 0x02) T1aa_h_count[i] += indlow; if (i & 0x01) T1aa_h_count[i] += indlow; } } if (level == 2 && T1aa_bpp == 8) { for (i0 = 0; i0 < 5; i0++) for (i1 = 0; i1 < 5; i1++) for (i2 = 0; i2 < 5; i2++) for (i3 = 0; i3 < 5; i3++) { ((char *)T1aa_lut)[(((i0 * 5 + i1) * 5 + i2) * 5 + i3) * 4] = gv[i3]; ((char *)T1aa_lut)[(((i0 * 5 + i1) * 5 + i2) * 5 + i3) * 4 + 1] = gv[i2]; ((char *)T1aa_lut)[(((i0 * 5 + i1) * 5 + i2) * 5 + i3) * 4 + 2] = gv[i1]; ((char *)T1aa_lut)[(((i0 * 5 + i1) * 5 + i2) * 5 + i3) * 4 + 3] = gv[i0]; } for (i = 0; i < 256; i++) { T1aa_count[i] = 0; if (i & 0x80) T1aa_count[i] += 125; if (i & 0x40) T1aa_count[i] += 125; if (i & 0x20) T1aa_count[i] += 25; if (i & 0x10) T1aa_count[i] += 25; if (i & 0x08) T1aa_count[i] += 5; if (i & 0x04) T1aa_count[i] += 5; if (i & 0x02) T1aa_count[i] += 1; if (i & 0x01) T1aa_count[i] += 1; } return(0); } else if (level == 2 && T1aa_bpp == 16) { for (i0 = 0; i0 < 5; i0++) for (i1 = 0; i1 < 5; i1++) { ((T1_AA_TYPE16 *)T1aa_lut)[(i0 * 5 + i1) * 2] = gv[i1]; ((T1_AA_TYPE16 *)T1aa_lut)[(i0 * 5 + i1) * 2 + 1] = gv[i0]; } for (i = 0; i < 256; i++) { T1aa_count[i] = 0; if (i & 0x80) T1aa_count[i] += 160; if (i & 0x40) T1aa_count[i] += 160; if (i & 0x20) T1aa_count[i] += 32; if (i & 0x10) T1aa_count[i] += 32; if (i & 0x08) T1aa_count[i] += 5; if (i & 0x04) T1aa_count[i] += 5; if (i & 0x02) T1aa_count[i] += 1; if (i & 0x01) T1aa_count[i] += 1; } return(0); } else if (level == 2 && T1aa_bpp == 32) { for (i0 = 0; i0 < 5; i0++) ((T1_AA_TYPE32 *)T1aa_lut)[i0] = gv[i0]; for (i = 0; i < 256; i++) { T1aa_count[i] = 0; if (i & 0x80) T1aa_count[i] += 512; if (i & 0x40) T1aa_count[i] += 512; if (i & 0x20) T1aa_count[i] += 64; if (i & 0x10) T1aa_count[i] += 64; if (i & 0x08) T1aa_count[i] += 8; if (i & 0x04) T1aa_count[i] += 8; if (i & 0x02) T1aa_count[i] += 1; if (i & 0x01) T1aa_count[i] += 1; } return(0); } else if (level == 4 && T1aa_bpp == 8) { for (i0 = 0; i0 < 17; i0++){ /* i0 indexes higher nibble */ for (i1 = 0; i1 < 17; i1++){ /* i1 indixes lower nibble */ ((char *)T1aa_h_lut)[(i0 * 17 + i1) * 4 + movelow] = gv_h[i1]; ((char *)T1aa_h_lut)[(i0 * 17 + i1) * 4 + movehigh] = gv_h[i0]; } } return(0); } else if (level == 4 && T1aa_bpp == 16) { for (i0 = 0; i0 < 17; i0++){ /* i0 indexes higher nibble */ for (i1 = 0; i1 < 17; i1++){ /* i1 indixes lower nibble */ ((T1_AA_TYPE16 *)T1aa_h_lut)[(i0 * 17 + i1) * 2 + movelow] = gv_h[i1]; ((T1_AA_TYPE16 *)T1aa_h_lut)[(i0 * 17 + i1) * 2 + movehigh] = gv_h[i0]; } } return(0); } else if (level == 4 && T1aa_bpp == 32) { for (i0 = 0; i0 < 17; i0++){ /* i0 indexes higher nibble */ for (i1 = 0; i1 < 17; i1++){ /* i1 indixes lower nibble */ ((T1_AA_TYPE32 *)T1aa_h_lut)[(i0 * 17 + i1)] = gv_h[i1]; } } return(0); } else if (level == 1 && T1aa_bpp == 8) { for (i0=0; i0<16; i0++) { ((char *)T1aa_n_lut)[i0*4+movelow]=gv_n[i0 & 0x01]; ((char *)T1aa_n_lut)[i0*4+movelow+1]=gv_n[(i0>>1) & 0x01]; ((char *)T1aa_n_lut)[i0*4+movelow+2]=gv_n[(i0>>2) & 0x01]; ((char *)T1aa_n_lut)[i0*4+movelow+3]=gv_n[(i0>>3) & 0x01]; } return(0); } else if (level == 1 && T1aa_bpp == 16) { for (i0=0; i0<4; i0++) { ((T1_AA_TYPE16 *)T1aa_n_lut)[i0*2]=gv_n[i0 & 0x01]; ((T1_AA_TYPE16 *)T1aa_n_lut)[i0*2+1]=gv_n[(i0>>1) & 0x01]; } return(0); } else if (level == 1 && T1aa_bpp == 32) { for ( i0=0; i0<2; i0++) { ((T1_AA_TYPE32 *)T1aa_n_lut)[i0]=gv_n[i0]; } return(0); } else { /* unsupported combination of level and bpp -> we set T1_errno and put an entry into the logfile! */ T1_errno=T1ERR_INVALID_PARAMETER; sprintf( err_warn_msg_buf, "Unsupported AA specification: level=%d, bpp=%d", level, T1aa_bpp); T1_PrintLog( "T1_AAInit()", err_warn_msg_buf, T1LOG_WARNING); } return(1); } /* T1_AADoLine: Create a single scanline of antialiased output. The (x, y) arguments refer to the number of pixels in the input image to convert down. The width argument is the number of bytes separating scanlines in the input. The quantity hcorr describes the number of subpixels. It is the shift of the oversampled bitmap to the right */ static void T1_AADoLine ( int level, int x, int y, int width, char *c_in_ptr, char *target_ptr, int hcorr ) { int i=0; int size; int count=0; int mod; unsigned char bcarry1=0, bcarry2=0, bcarry3=0, bcarry4=0; static char *align_buf = NULL; static int align_buf_size = 0; unsigned char *in_ptr; int new_size=55; register char *optr; /* We convert the input pointer to unsigned since we use it as index! */ in_ptr=(unsigned char*)c_in_ptr; if ((long)target_ptr & 3){ /* calculate new_size (size in bytes of output buffer */ if (level == T1_AA_LOW){ new_size=((x + hcorr + 1) >> 1) * (T1aa_bpp >> 3); } else{ /* T1_AA_HIGH */ new_size = ((x + hcorr + 3) >> 2) * (T1aa_bpp >> 3); } if (new_size > align_buf_size) { if (align_buf) free (align_buf); /* Note: we allocate 12 more than necessary to have tolerance at the end of line */ align_buf = (char *)malloc(new_size+12); align_buf_size = new_size; } optr = align_buf; } else optr = target_ptr; /* size: The number of valid byte in the input string, i.e., the number of bytes partially filled with pixels before shifting with hcorr. mod: Is 1 if after shifting with hcorr the last byte in the input line has an overflow. */ if (level == T1_AA_LOW) { size=(x+7)>>3; mod=(x+hcorr)>(size*8) ? 1 : 0; if (T1aa_bpp == 8) { if (y == 2){ for (i = 0; i < size; i++) { ((T1_AA_TYPE32 *)optr)[i] = T1aa_lut[(T1aa_count[(unsigned char)((in_ptr[i]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<> 5]; bcarry1=in_ptr[i]>>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<> 5]; bcarry1=in_ptr[i]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<> 5]; } } else if (T1aa_bpp == 32) { if (y == 2){ for (i = 0; i < size; i++) { count = T1aa_count[(unsigned char)((in_ptr[i]<> 3) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 2] = T1aa_lut[(count >> 6) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 3] = T1aa_lut[(count >> 9) & 7]; bcarry1=in_ptr[i]>>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<> 3) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 2] = T1aa_lut[(count >> 6) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 3] = T1aa_lut[(count >> 9) & 7]; bcarry1=in_ptr[i]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<> 3) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 2] = T1aa_lut[(count >> 6) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 3] = T1aa_lut[(count >> 9) & 7]; } } } else if (level==T1_AA_HIGH){ size=(x+7)>>3; mod=(x+hcorr)>(size*8) ? 1 : 0; if (T1aa_bpp == 8) { if (y == 4){ for (i = 0; i < size; i++) { ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); bcarry4=in_ptr[i+3*width]>>(8-hcorr); } } else if (y == 3){ for (i = 0; i < size; i++) { ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); } } else if (y == 2){ for (i = 0; i < size; i++) { ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } } else if (y == 1){ for (i = 0; i < size; i++) { ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<>(8-hcorr); } } if (mod) { if (y == 4) ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2] + T1aa_h_count[bcarry3] + T1aa_h_count[bcarry4])]; else if (y == 3) ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2] + T1aa_h_count[bcarry3])]; else if (y == 2) ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2])]; else if (y == 1) ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1])]; } } else if (T1aa_bpp == 16) { if (y == 4){ for (i = 0; i < size; i++) { ((T1_AA_TYPE32 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); bcarry4=in_ptr[i+3*width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); bcarry2=in_ptr[i+2*width]>>(8-hcorr); bcarry3=in_ptr[i+3*width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); bcarry4=in_ptr[i+3*width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>j%8)&0x0F]; } } else if (T1aa_bpp==16) { starget_ptr=(T1_AA_TYPE16 *)target_ptr; for ( j=0; j>j%8)&0x03]; } } else if (T1aa_bpp==32) { ltarget_ptr=(T1_AA_TYPE32 *)target_ptr; for ( j=0; j>j%8)&0x01]; } return; } /* T1_AASetChar(...): Generate the anti-aliased bitmap for a character */ GLYPH *T1_AASetChar( int FontID, char charcode, float size, T1_TMATRIX *transform) { GLYPH *glyph; /* pointer to bitmap glyph */ static GLYPH aaglyph={NULL,{0,0,0,0,0,0},NULL,DEFAULTBPP};/* The anti-aliased glyph */ long asc, dsc, ht, wd; long i; long n_horz, n_horz_pad, n_vert, n_asc, n_dsc; long v_start, v_end; char *target_ptr; long offset; char *ptr; int y; long lsb, aalsb, aahstart; int memsize; LONG paddedW; int savelevel; FONTSIZEDEPS *font_ptr=NULL; unsigned char ucharcode; /* Reset character glyph, if necessary */ if (aaglyph.bits!=NULL){ free(aaglyph.bits); aaglyph.bits=NULL; } aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=0; aaglyph.metrics.advanceY=0; aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; aaglyph.bpp=T1aa_bpp; ucharcode=charcode; /* Check for smart antialiasing */ savelevel=T1aa_level; if (T1aa_SmartOn){ if (size>=T1aa_smartlimit2) { T1aa_level=T1_AA_NONE; } else if (size>=T1aa_smartlimit1) { T1aa_level=T1_AA_LOW; } else { T1aa_level=T1_AA_HIGH; } } /* The following code is only exectued if caching of antialiased chracters is enabled. */ /* Check if char is in cache */ if ((pFontBase->t1lib_flags & T1_AA_CACHING)) { if (transform==NULL){ /* if size/aa is not existent we create it */ if ((font_ptr=T1int_QueryFontSize( FontID, size, T1aa_level))==NULL){ /* We create the required size struct and leave the rest for T1_SetChar() */ font_ptr=T1int_CreateNewFontSize( FontID, size, T1aa_level); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; T1aa_level=savelevel; return(NULL); } } else {/* size is already existent in cache */ if (font_ptr->pFontCache[ucharcode].bits != NULL){ /* Character is already in Chache -> create a copy of cache and return a pointer to the result: */ memcpy( &aaglyph, &(font_ptr->pFontCache[ucharcode]), sizeof(GLYPH)); memsize = (aaglyph.metrics.ascent-aaglyph.metrics.descent) * PAD((aaglyph.metrics.rightSideBearing-aaglyph.metrics.leftSideBearing) * T1aa_bpp,pFontBase->bitmap_pad)/8; aaglyph.bits = (char *)malloc(memsize*sizeof( char)); if (aaglyph.bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; T1aa_level=savelevel; return(NULL); } memcpy( aaglyph.bits, font_ptr->pFontCache[ucharcode].bits, memsize); return(&(aaglyph)); } } } /* (transform==NULL) */ } /* T1_AA_CACHING */ /* First, call routine to rasterize character, all error checking is done in this function: */ if ((glyph=T1_SetChar( FontID, charcode, T1aa_level*size, transform))==NULL){ /* restore level */ T1aa_level=savelevel; return(NULL); /* An error occured */ } /* In case there are no black pixels, we simply set the dimensions and then return */ if ( glyph->bits == NULL) { aaglyph.bits=NULL; aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; /* restore level and return */ T1aa_level=savelevel; return(&aaglyph); } /* Get dimensions of bitmap: */ asc=glyph->metrics.ascent; dsc=glyph->metrics.descent; lsb=glyph->metrics.leftSideBearing; ht=asc-dsc; wd=glyph->metrics.rightSideBearing-lsb; if (T1aa_level==T1_AA_NONE){ /* we only convert bitmap to bytemap */ aaglyph=*glyph; aaglyph.bpp=T1aa_bpp; /* Compute scanline length and such */ n_horz_pad=PAD( wd*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* Allocate memory for glyph */ memsize = n_horz_pad*ht*8; /* aaglyph.bits = (char *)malloc(memsize*sizeof( char)); */ aaglyph.bits = (char *)malloc(memsize*sizeof( char)); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* restore level */ T1aa_level=savelevel; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)>>3; ptr=glyph->bits; target_ptr=aaglyph.bits; for (i = 0; i < ht; i++) { T1_DoLine ( wd, paddedW, ptr, target_ptr ); ptr += paddedW; target_ptr += n_horz_pad; } /* restore level */ T1aa_level=savelevel; return(&aaglyph); } /* Set some looping parameters for subsampling */ if (lsb<0){ aalsb=lsb/T1aa_level-1; aahstart=T1aa_level+(lsb%T1aa_level); } else{ aalsb=lsb/T1aa_level; aahstart=lsb%T1aa_level; } /* The horizontal number of steps: */ n_horz=(wd+aahstart+T1aa_level-1)/T1aa_level; /* And the padded value */ n_horz_pad=PAD( n_horz*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* vertical number of steps: */ if (asc % T1aa_level){ /* not aligned */ if ( asc > 0){ n_asc=asc/T1aa_level+1; v_start=asc % T1aa_level; } else{ n_asc=asc/T1aa_level; v_start=T1aa_level + (asc % T1aa_level); } } else{ n_asc=asc/T1aa_level; v_start=T1aa_level; } if (dsc % T1aa_level){ /* not aligned */ if ( dsc < 0){ n_dsc=dsc/T1aa_level-1; v_end=-(dsc % T1aa_level); } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level - (dsc % T1aa_level); } } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level; } /* the total number of lines: */ n_vert=n_asc-n_dsc; /* Allocate memory for glyph */ memsize = n_horz_pad*n_vert; /* Note: we allocate 12 bytes more than necessary */ aaglyph.bits = (char *)malloc(memsize*sizeof( char) +12); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* restore level */ T1aa_level=savelevel; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)/8; offset=0; target_ptr=aaglyph.bits; /* We must check for n_vert==1 because then both v_start and v_end could / will affect the same AA scan line. Because I'm forgetful, a reminder: v_end | 000000000000000000000 | 111111111111111111111 ^ Y 111111111111111111111 | 000000000000000000000 | v_start In order to count the v_end from bottom to top, we express it as (T1aa_level-v_end). The number of rows to take into account is then v_start-(T1aa_level-v_end). */ if (n_vert==1) { v_start=v_start - (T1aa_level - v_end); } ptr = glyph->bits; for (i = 0; i < n_vert; i++) { if (i==0) y=v_start; else if (i==n_vert-1) y=v_end; else y=T1aa_level; T1_AADoLine ( T1aa_level, wd, y, paddedW, ptr, target_ptr, aahstart ); ptr += y * paddedW; target_ptr += n_horz_pad; } /* .. and set them in aaglyph */ aaglyph.metrics.leftSideBearing=aalsb; aaglyph.metrics.rightSideBearing=aalsb + n_horz; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=n_asc; aaglyph.metrics.descent=n_dsc; aaglyph.pFontCacheInfo=NULL; if ((pFontBase->t1lib_flags & T1_AA_CACHING) && (transform==NULL)) { /* Put char into cache area */ memcpy( &(font_ptr->pFontCache[ucharcode]), &aaglyph, sizeof(GLYPH)); font_ptr->pFontCache[ucharcode].bits = (char *)malloc(memsize*sizeof( char)); if (font_ptr->pFontCache[ucharcode].bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; T1aa_level=savelevel; return(NULL); } memcpy( font_ptr->pFontCache[ucharcode].bits, aaglyph.bits, memsize); } /* restore level */ T1aa_level=savelevel; return(&aaglyph); } /* T1_AASetString(...): Generate the antialiased bitmap for a string of characters */ GLYPH *T1_AASetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform) { GLYPH *glyph; /* pointer to bitmap glyph */ static GLYPH aastring_glyph={NULL,{0,0,0,0,0,0},NULL,DEFAULTBPP};/* The anti-aliased glyph */ long asc, dsc, ht, wd; long i; long n_horz, n_horz_pad, n_vert, n_asc, n_dsc; long v_start, v_end; char *target_ptr; long offset; char *ptr; int y; long lsb, aalsb, aahstart; int memsize; LONG paddedW; int savelevel; /* Reset character glyph, if necessary */ if (aastring_glyph.bits!=NULL){ free(aastring_glyph.bits); aastring_glyph.bits=NULL; } aastring_glyph.metrics.leftSideBearing=0; aastring_glyph.metrics.rightSideBearing=0; aastring_glyph.metrics.advanceX=0; aastring_glyph.metrics.advanceY=0; aastring_glyph.metrics.ascent=0; aastring_glyph.metrics.descent=0; aastring_glyph.pFontCacheInfo=NULL; aastring_glyph.bpp=T1aa_bpp; /* Check for smart antialiasing */ savelevel=T1aa_level; if (T1aa_SmartOn){ if (size>=T1aa_smartlimit2) { T1aa_level=T1_AA_NONE; } else if (size>=T1aa_smartlimit1) { T1aa_level=T1_AA_LOW; } else { T1aa_level=T1_AA_HIGH; } } /* First, call routine to rasterize character, all error checking is done in this function: */ if ((glyph=T1_SetString( FontID, string, len, spaceoff, modflag, T1aa_level*size, transform))==NULL){ /* restore level */ T1aa_level=savelevel; return(NULL); /* An error occured */ } /* In case there are no black pixels, we simply set the dimensions and then return */ if ( glyph->bits == NULL) { aastring_glyph.bits=NULL; aastring_glyph.metrics.leftSideBearing=0; aastring_glyph.metrics.rightSideBearing=0; aastring_glyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aastring_glyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aastring_glyph.metrics.ascent=0; aastring_glyph.metrics.descent=0; aastring_glyph.pFontCacheInfo=NULL; /* restore level and return */ T1aa_level=savelevel; return(&aastring_glyph); } /* Get dimensions of bitmap: */ asc=glyph->metrics.ascent; dsc=glyph->metrics.descent; lsb=glyph->metrics.leftSideBearing; ht=asc-dsc; wd=glyph->metrics.rightSideBearing-lsb; if (T1aa_level==T1_AA_NONE){ /* we only convert bitmap to bytemap */ aastring_glyph=*glyph; aastring_glyph.bpp=T1aa_bpp; /* Compute scanline length and such */ n_horz_pad=PAD( wd*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* Allocate memory for glyph */ memsize = n_horz_pad*ht*8; aastring_glyph.bits = (char *)malloc(memsize*sizeof( char)); if (aastring_glyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* restore level */ T1aa_level=savelevel; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)>>3; ptr=glyph->bits; target_ptr=aastring_glyph.bits; for (i = 0; i < ht; i++) { T1_DoLine ( wd, paddedW, ptr, target_ptr ); ptr += paddedW; target_ptr += n_horz_pad; } /* restore level */ T1aa_level=savelevel; return(&aastring_glyph); } /* Set some looping parameters for subsampling */ if (lsb<0){ aalsb=lsb/T1aa_level-1; aahstart=T1aa_level+(lsb%T1aa_level); } else{ aalsb=lsb/T1aa_level; aahstart=lsb%T1aa_level; } /* The horizontal number of steps: */ n_horz=(wd+aahstart+T1aa_level-1)/T1aa_level; /* And the padded value */ n_horz_pad=PAD( n_horz*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* vertical number of steps: */ if (asc % T1aa_level){ /* not aligned */ if ( asc > 0){ n_asc=asc/T1aa_level+1; v_start=asc % T1aa_level; } else{ n_asc=asc/T1aa_level; v_start=T1aa_level + (asc % T1aa_level); } } else{ n_asc=asc/T1aa_level; v_start=T1aa_level; } if (dsc % T1aa_level){ /* not aligned */ if ( dsc < 0){ n_dsc=dsc/T1aa_level-1; v_end=-(dsc % T1aa_level); } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level - (dsc % T1aa_level); } } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level; } /* the total number of lines: */ n_vert=n_asc-n_dsc; /* Allocate memory for glyph */ memsize = n_horz_pad*n_vert; /* Note: we allocate 12 bytes more than necessary */ aastring_glyph.bits = (char *)malloc(memsize*sizeof( char) +12); if (aastring_glyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)/8; offset=0; target_ptr=aastring_glyph.bits; /* We must check for n_vert==1 because then both v_start and v_end could / will affect the same AA scan line. */ if (n_vert==1) { v_start=v_start - (T1aa_level - v_end); } ptr = glyph->bits; for (i = 0; i < n_vert; i++) { if (i==0) y=v_start; else if (i==n_vert-1) y=v_end; else y=T1aa_level; T1_AADoLine ( T1aa_level, wd, y, paddedW, ptr, target_ptr, aahstart ); ptr += y * paddedW; target_ptr += n_horz_pad; } /* .. and set them in aastring_glyph */ aastring_glyph.metrics.leftSideBearing=aalsb; aastring_glyph.metrics.rightSideBearing=aalsb + n_horz; aastring_glyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aastring_glyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aastring_glyph.metrics.ascent=n_asc; aastring_glyph.metrics.descent=n_dsc; aastring_glyph.pFontCacheInfo=NULL; /* restore level */ T1aa_level=savelevel; return(&aastring_glyph); } /* T1_AASetRect(): Raster a rectangle, whose size is given in charspace units. The resulting glyph does not cause any escapement. */ GLYPH* T1_AASetRect( int FontID, float size, float width, float height, T1_TMATRIX *transform) { GLYPH *glyph; /* pointer to bitmap glyph */ static GLYPH aaglyph={NULL,{0,0,0,0,0,0},NULL,DEFAULTBPP};/* The anti-aliased glyph */ long asc, dsc, ht, wd; long i; long n_horz, n_horz_pad, n_vert, n_asc, n_dsc; long v_start, v_end; char *target_ptr; long offset; char *ptr; int y; long lsb, aalsb, aahstart; int memsize; LONG paddedW; int savelevel; /* Reset character glyph, if necessary */ if (aaglyph.bits!=NULL){ free(aaglyph.bits); aaglyph.bits=NULL; } aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=0; aaglyph.metrics.advanceY=0; aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; aaglyph.bpp=T1aa_bpp; /* Check for smart antialiasing */ savelevel=T1aa_level; if (T1aa_SmartOn){ if (size>=T1aa_smartlimit2) { T1aa_level=T1_AA_NONE; } else if (size>=T1aa_smartlimit1) { T1aa_level=T1_AA_LOW; } else { T1aa_level=T1_AA_HIGH; } } /* First, call routine to rasterize character, all error checking is done in this function: */ if ((glyph=T1_SetRect( FontID, T1aa_level*size, width, height, transform))==NULL){ /* restore level */ T1aa_level=savelevel; return(NULL); /* An error occured */ } /* In case there are no black pixels, we simply set the dimensions and then return */ if ( glyph->bits == NULL) { aaglyph.bits=NULL; aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; /* restore level and return */ T1aa_level=savelevel; return(&aaglyph); } /* Get dimensions of bitmap: */ asc=glyph->metrics.ascent; dsc=glyph->metrics.descent; lsb=glyph->metrics.leftSideBearing; ht=asc-dsc; wd=glyph->metrics.rightSideBearing-lsb; if (T1aa_level==T1_AA_NONE){ /* we only convert bitmap to bytemap */ aaglyph=*glyph; aaglyph.bpp=T1aa_bpp; /* Compute scanline length and such */ n_horz_pad=PAD( wd*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* Allocate memory for glyph */ memsize = n_horz_pad*ht*8; /* aaglyph.bits = (char *)malloc(memsize*sizeof( char)); */ aaglyph.bits = (char *)malloc(memsize*sizeof( char)); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* restore level */ T1aa_level=savelevel; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)>>3; ptr=glyph->bits; target_ptr=aaglyph.bits; for (i = 0; i < ht; i++) { T1_DoLine ( wd, paddedW, ptr, target_ptr ); ptr += paddedW; target_ptr += n_horz_pad; } /* restore level */ T1aa_level=savelevel; return(&aaglyph); } /* Set some looping parameters for subsampling */ if (lsb<0){ aalsb=lsb/T1aa_level-1; aahstart=T1aa_level+(lsb%T1aa_level); } else{ aalsb=lsb/T1aa_level; aahstart=lsb%T1aa_level; } /* The horizontal number of steps: */ n_horz=(wd+aahstart+T1aa_level-1)/T1aa_level; /* And the padded value */ n_horz_pad=PAD( n_horz*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* vertical number of steps: */ if (asc % T1aa_level){ /* not aligned */ if ( asc > 0){ n_asc=asc/T1aa_level+1; v_start=asc % T1aa_level; } else{ n_asc=asc/T1aa_level; v_start=T1aa_level + (asc % T1aa_level); } } else{ n_asc=asc/T1aa_level; v_start=T1aa_level; } if (dsc % T1aa_level){ /* not aligned */ if ( dsc < 0){ n_dsc=dsc/T1aa_level-1; v_end=-(dsc % T1aa_level); } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level - (dsc % T1aa_level); } } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level; } /* the total number of lines: */ n_vert=n_asc-n_dsc; /* Allocate memory for glyph */ memsize = n_horz_pad*n_vert; /* Note: we allocate 12 bytes more than necessary */ aaglyph.bits = (char *)malloc(memsize*sizeof( char) +12); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* restore level */ T1aa_level=savelevel; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)/8; offset=0; target_ptr=aaglyph.bits; /* We must check for n_vert==1 because then both v_start and v_end could / will affect the same AA scan line. */ if (n_vert==1) { v_start=v_start - (T1aa_level - v_end); } ptr = glyph->bits; for (i = 0; i < n_vert; i++) { if (i==0) y=v_start; else if (i==n_vert-1) y=v_end; else y=T1aa_level; T1_AADoLine ( T1aa_level, wd, y, paddedW, ptr, target_ptr, aahstart ); ptr += y * paddedW; target_ptr += n_horz_pad; } /* .. and set them in aaglyph */ aaglyph.metrics.leftSideBearing=aalsb; aaglyph.metrics.rightSideBearing=aalsb + n_horz; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=n_asc; aaglyph.metrics.descent=n_dsc; aaglyph.pFontCacheInfo=NULL; /* restore level */ T1aa_level=savelevel; return(&aaglyph); } /* T1_AASetGrayValues(): Sets the byte values that are put into the pixel position for the respective entries: Returns 0 if successfull. */ int T1_AASetGrayValues(unsigned long white, unsigned long gray75, unsigned long gray50, unsigned long gray25, unsigned long black) { if (T1_CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } gv[4]=(unsigned T1_AA_TYPE32)black; /* black value */ gv[3]=(unsigned T1_AA_TYPE32)gray25; /* gray 25% value */ gv[2]=(unsigned T1_AA_TYPE32)gray50; /* gray 50% value */ gv[1]=(unsigned T1_AA_TYPE32)gray75; /* gray 75% value */ gv[0]=(unsigned T1_AA_TYPE32)white; /* white value */ T1aa_bg=white; if ((T1_AAInit( T1_AA_LOW))) return(-1); return(0); } /* T1_AAHSetGrayValues(): Sets the byte values that are put into the pixel position for the respective entries (for 17 gray levels): Returns 0 if successfull. */ int T1_AAHSetGrayValues( unsigned long *grayvals) { int i; if (T1_CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } /* 0==white(background) ... 16==black(foreground) */ for (i=0; i<17; i++){ gv_h[i]=(unsigned T1_AA_TYPE32)grayvals[i]; } T1aa_bg=grayvals[0]; if ((T1_AAInit( T1_AA_HIGH))) return(-1); return(0); } /* T1_AANSetGrayValues(): Sets the byte values that are put into the pixel position for the respective entries (for 2 gray levels): Returns 0 if successfull. This is for the case the non-antialiased "bytemaps" should be generated. */ int T1_AANSetGrayValues( unsigned long bg, unsigned long fg) { if (T1_CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } gv_n[0]=bg; gv_n[1]=fg; T1aa_bg=bg; if ((T1_AAInit( T1_AA_NONE))) return(-1); return(0); } /* Get the current setting of graylevels for 2x antialiasing. The 5 values are stored at address pgrayvals in order from background to foreground */ int T1_AAGetGrayValues( long *pgrayvals) { int i; if (T1_CheckForInit()) { T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } if (pgrayvals==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } for ( i=0; i<5; i++) { /* bg (i=0) to fg (i=4) */ pgrayvals[i]=gv[i]; } return( 0); } /* Get the current setting of graylevels for 4x antialiasing. The 17 values are stored at address pgrayvals in order from background to foreground */ int T1_AAHGetGrayValues( long *pgrayvals) { int i; if (T1_CheckForInit()) { T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } if (pgrayvals==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } for ( i=0; i<17; i++) { /* bg (i=0) to fg (i=16) */ pgrayvals[i]=gv_h[i]; } return( 0); } /* Get the current setting of graylevels for no antialiasing. The 2 values are stored at address pgrayvals in order from background to foreground */ int T1_AANGetGrayValues( long *pgrayvals) { if (T1_CheckForInit()) { T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } if (pgrayvals==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } pgrayvals[0]=gv_n[0]; /* background */ pgrayvals[1]=gv_n[1]; /* foreground */ return( 0); } /* T1_AASetBitsPerPixel(): Sets the depths of the antialiased glyph pixel. Returns 0 if bpp is valid and -1 otherwise. If 24 is specified, meaning to be the depth rather than the bpp-value, automatically 32 bpp is chosen. */ int T1_AASetBitsPerPixel( int bpp) { if (T1_CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } /* T1aa_level = 0; */ if (bpp==8){ T1aa_bpp=8; return(0); } if (bpp==16){ T1aa_bpp=16; return(0); } if ((bpp==32)|(bpp==24)){ T1aa_bpp=32; return(0); } T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } /* T1_AAGetBitsPerPixel(): Return the number of bits per pixel set in t1lib. */ int T1_AAGetBitsPerPixel( void) { return( T1aa_bpp); } /* Set the Subsampling level for subsequent operations: */ int T1_AASetLevel( int level) { if (T1_CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } if (level==T1_AA_LOW){ T1aa_level=T1_AA_LOW; return(0); } else if (level==T1_AA_HIGH){ T1aa_level=T1_AA_HIGH; return(0); } else if (level==T1_AA_NONE){ T1aa_level=T1_AA_NONE; return(0); } T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } /* Get the current subsampling level */ int T1_AAGetLevel( void) { return( T1aa_level); } /* T1_AAFillOutline(): Create a filled glyph from an outline description */ GLYPH *T1_AAFillOutline( T1_OUTLINE *path, int modflag) { GLYPH *glyph; /* pointer to bitmap glyph */ static GLYPH aaglyph={NULL,{0,0,0,0,0,0},NULL,DEFAULTBPP};/* The anti-aliased glyph */ long asc, dsc, ht, wd; long i; long n_horz, n_horz_pad, n_vert, n_asc, n_dsc; long v_start, v_end; char *target_ptr; long offset; char *ptr; int y; long lsb, aalsb, aahstart; int memsize; LONG paddedW; /* Reset character glyph, if necessary */ if (aaglyph.bits!=NULL){ free(aaglyph.bits); aaglyph.bits=NULL; } aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=0; aaglyph.metrics.advanceY=0; aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; aaglyph.bpp=T1aa_bpp; /* First, scale outline appropriately: */ path=T1_ScaleOutline( path, T1aa_level); /* Second, call routine to fill outline, all error checking is done in this function: */ if ((glyph=T1_FillOutline( path, modflag))==NULL) return(NULL); /* An error occured */ /* In case there are no black pixels, we simply set the dimensions and then return */ if ( glyph->bits == NULL) { aaglyph.bits=NULL; aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; return(&aaglyph); } /* Get dimensions of bitmap: */ asc=glyph->metrics.ascent; dsc=glyph->metrics.descent; lsb=glyph->metrics.leftSideBearing; ht=asc-dsc; wd=glyph->metrics.rightSideBearing-lsb; if (T1aa_level==T1_AA_NONE){ /* we only convert bitmap to bytemap */ aaglyph=*glyph; aaglyph.bpp=T1aa_bpp; /* Compute scanline length and such */ n_horz_pad=PAD( wd*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* Allocate memory for glyph, we alloc 12 bytes more to simplify subsampling! */ memsize = n_horz_pad*ht*8; aaglyph.bits = (char *)malloc(memsize*sizeof( char) +12); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)>>3; ptr=glyph->bits; target_ptr=aaglyph.bits; for (i = 0; i < ht; i++) { T1_DoLine ( wd, paddedW, ptr, target_ptr ); ptr += paddedW; target_ptr += n_horz_pad; } return(&aaglyph); } /* Set some looping parameters for subsampling */ if (lsb<0){ aalsb=lsb/T1aa_level-1; aahstart=T1aa_level+(lsb%T1aa_level); } else{ aalsb=lsb/T1aa_level; aahstart=lsb%T1aa_level; } /* The horizontal number of steps: */ n_horz=(wd+aahstart+T1aa_level-1)/T1aa_level; /* And the padded value */ n_horz_pad=PAD( n_horz*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* vertical number of steps: */ if (asc % T1aa_level){ /* not aligned */ if ( asc > 0){ n_asc=asc/T1aa_level+1; v_start=asc % T1aa_level; } else{ n_asc=asc/T1aa_level; v_start=T1aa_level + (asc % T1aa_level); } } else{ n_asc=asc/T1aa_level; v_start=T1aa_level; } if (dsc % T1aa_level){ /* not aligned */ if ( dsc < 0){ n_dsc=dsc/T1aa_level-1; v_end=-(dsc % T1aa_level); } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level - (dsc % T1aa_level); } } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level; } /* the total number of lines: */ n_vert=n_asc-n_dsc; /* Allocate memory for glyph */ memsize = n_horz_pad*n_vert; aaglyph.bits = (char *)malloc(memsize*sizeof( char)+12); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)/8; offset=0; target_ptr=aaglyph.bits; /* We must check for n_vert==1 because then both v_start and v_end could / will affect the same AA scan line. */ if (n_vert==1) { v_start=v_start - (T1aa_level - v_end); } ptr = glyph->bits; for (i = 0; i < n_vert; i++) { if (i==0) y=v_start; else if (i==n_vert-1) y=v_end; else y=T1aa_level; T1_AADoLine ( T1aa_level, wd, y, paddedW, ptr, target_ptr, aahstart ); ptr += y * paddedW; target_ptr += n_horz_pad; } /* .. and set them in aaglyph */ aaglyph.metrics.leftSideBearing=aalsb; aaglyph.metrics.rightSideBearing=aalsb + n_horz; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=n_asc; aaglyph.metrics.descent=n_dsc; aaglyph.pFontCacheInfo=NULL; return(&aaglyph); } /* T1_AASetSmartLimits(): Set the limit-values for smart antialiasing. Returns 0 if OK, and -1 else. */ int T1_AASetSmartLimits( float limit1, float limit2) { if (limit1 > 0.0 && limit2 > 0.0 && limit2 >= limit2) { T1aa_smartlimit1=limit1; T1aa_smartlimit2=limit2; return( 0); } else{ T1_errno=T1ERR_INVALID_PARAMETER; return( -1); } } /* T1_AASetSmartMode(): Enable or disable smart anialiasing */ int T1_AASetSmartMode( int smart) { if (smart==T1_YES) { T1aa_SmartOn=1; } else if (smart==T1_NO) { T1aa_SmartOn=0; } else { T1_errno=T1ERR_INVALID_PARAMETER; return( -1); } return( 0); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1trans.c0000664000175000017500000004476011742726711023047 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1trans.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2005-05-01 ----- Description: This file is part of the t1-library. It contains functions for transforming fonts and setting line-parameters. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1TRANS_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/paths.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1trans.h" #include "t1base.h" /* T1_ExtendFont(): Extend the font referenced by FontID by the factor extend. This is only allowed if no size dependent data exists. Of course, the font must already have been loaded. Returns 0 for success and -1 otherwise. */ int T1_ExtendFont( int FontID, double extend) { /* First, check for font residing in memory: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* Second, check whether size-dependent data exists: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps != NULL){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pFontBase->pFontArray[FontID].extend=extend; pFontBase->pFontArray[FontID].FontTransform[0] = extend; return(0); } /* T1_GetExtend(): Return the current extension factor of the font FontID Return: 0.0 if font not loaded current extent otherwise */ double T1_GetExtend( int FontID) { /* First, check for font residing in memory: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return( pFontBase->pFontArray[FontID].extend); } /* T1_SlantFont(): Slant the font referenced by FontID by the factor extend. This is only allowed if no size dependent data exists. Of course, the font must already have been loaded. Returns 0 for success and -1 otherwise. */ int T1_SlantFont( int FontID, double slant) { /* First, check for font residing in memory: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* Second, check whether size-dependent data exists: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps != NULL){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pFontBase->pFontArray[FontID].slant=slant; pFontBase->pFontArray[FontID].FontTransform[2] = slant; return(0); } /* T1_GetSlant(): Return the current slanting factor of the font FontID Return: 0.0 if font not loaded current slant otherwise (may also be 0.0!) */ double T1_GetSlant( int FontID) { /* First, check for font residing in memory: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return( pFontBase->pFontArray[FontID].slant); } /* T1_TransformFont(): Transform the font referenced by FontID according to the transform matrix. This is only allowed if no size dependent data exists. Of course, the font must already have been loaded. Returns 0 for success and -1 otherwise. */ int T1_TransformFont( int FontID, T1_TMATRIX *matrix) { /* First, check for font residing in memory: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* Second, check whether size-dependent data exists: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps != NULL){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pFontBase->pFontArray[FontID].FontTransform[0] = matrix->cxx; pFontBase->pFontArray[FontID].FontTransform[1] = matrix->cxy; pFontBase->pFontArray[FontID].FontTransform[2] = matrix->cyx; pFontBase->pFontArray[FontID].FontTransform[3] = matrix->cyy; return(0); } /* T1_GetTransform(): Return the current transformation matrix for the font FontID Return: [0.0, 0.0, 0.0, 0.0] if font not loaded current tmatrix otherwise */ T1_TMATRIX T1_GetTransform( int FontID) { T1_TMATRIX tmatrix={0.0, 0.0, 0.0, 0.0}; /* First, check for font residing in memory: */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(tmatrix); } tmatrix.cxx=pFontBase->pFontArray[FontID].FontTransform[0]; tmatrix.cxy=pFontBase->pFontArray[FontID].FontTransform[1]; tmatrix.cyx=pFontBase->pFontArray[FontID].FontTransform[2]; tmatrix.cyy=pFontBase->pFontArray[FontID].FontTransform[3]; return( tmatrix); } /* Functions for setting line-parameters: linetypeis expected to be an OR'ed combination of T1_UNDERLINE, T1_OVERLINE and T1_OVERSTRIKE. */ int T1_SetLinePosition( int FontID, int linetype, float value) { if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } if (linetype & T1_UNDERLINE){ pFontBase->pFontArray[FontID].UndrLnPos=value; return( 0); } if (linetype & T1_OVERLINE){ pFontBase->pFontArray[FontID].OvrLnPos=value; return( 0); } if (linetype & T1_OVERSTRIKE){ pFontBase->pFontArray[FontID].OvrStrkPos=value; return( 0); } /* The linetype was bad */ T1_errno=T1ERR_INVALID_PARAMETER; return( -1); } int T1_SetLineThickness( int FontID, int linetype, float value) { if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } if (linetype & T1_UNDERLINE){ pFontBase->pFontArray[FontID].UndrLnThick=value; return( 0); } if (linetype & T1_OVERLINE){ pFontBase->pFontArray[FontID].OvrLnThick=value; return( 0); } if (linetype & T1_OVERSTRIKE){ pFontBase->pFontArray[FontID].OvrStrkThick=value; return( 0); } /* The linetype was bad */ T1_errno=T1ERR_INVALID_PARAMETER; return( -1); } float T1_GetLinePosition( int FontID, int linetype) { if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } if (linetype & T1_UNDERLINE) return( pFontBase->pFontArray[FontID].UndrLnPos); if (linetype & T1_OVERLINE) return( pFontBase->pFontArray[FontID].OvrLnPos); if (linetype & T1_OVERSTRIKE) return( pFontBase->pFontArray[FontID].OvrStrkPos); /* The linetype was bad */ T1_errno=T1ERR_INVALID_PARAMETER; return( 0.0); } float T1_GetLineThickness( int FontID, int linetype) { if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } if (linetype & T1_UNDERLINE) return( pFontBase->pFontArray[FontID].UndrLnThick); if (linetype & T1_OVERLINE) return( pFontBase->pFontArray[FontID].OvrLnThick); if (linetype & T1_OVERSTRIKE) return( pFontBase->pFontArray[FontID].OvrStrkThick); /* The linetype was bad */ T1_errno=T1ERR_INVALID_PARAMETER; return( 0.0); } /* Functions for intuitively transforming matrices. All function operate on their original objects. In case NULL is specified, a unity-matrix is allocated by the function and then tranformed appropriately. Note that in order to concatenate transformation in the sense of t1lib the current transformation matrix must be left-multiplied by the trnasformation to be applied! */ /* Rotation: ( x11' x21' ) ( cos(a) -sin(a) ) ( x11 x21 ) ( ) = ( ) * ( ) ( x12' x22' ) ( sin(a) cos(a) ) ( x12 x22 ) */ T1_TMATRIX *T1_RotateMatrix( T1_TMATRIX *matrix, double angle) { T1_TMATRIX tmat; if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } memcpy( &tmat, matrix, sizeof(T1_TMATRIX)); /* Convert angle to radians: */ angle=angle*PI/180.0; /* multiply matrices */ matrix->cxx=cos((double)angle) * tmat.cxx - sin((double)angle) * tmat.cxy; matrix->cyx=cos((double)angle) * tmat.cyx - sin((double)angle) * tmat.cyy; matrix->cxy=sin((double)angle) * tmat.cxx + cos((double)angle) * tmat.cxy; matrix->cyy=sin((double)angle) * tmat.cyx + cos((double)angle) * tmat.cyy; return( matrix); } /* Horizontal mirroring */ /* H-Mirror: ( x11' x21' ) ( -1 0 ) ( x11 x21 ) ( -x11 -x21 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( 0 1 ) ( x12 x22 ) ( x12 x22 ) */ T1_TMATRIX *T1_MirrorHMatrix( T1_TMATRIX *matrix) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxx *=-1.0; matrix->cyx *=-1.0; return( matrix); } /* Vertical mirroring */ /* V-Mirror: ( x11' x21' ) ( 1 0 ) ( x11 x21 ) ( x11 x21 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( 0 -1 ) ( x12 x22 ) ( -x12 -x22 ) */ T1_TMATRIX *T1_MirrorVMatrix( T1_TMATRIX *matrix) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxy *=-1.0; matrix->cyy *=-1.0; return( matrix); } /* Horizontal shearing */ /* H-Shearing: ( x11' x21' ) ( 1 f ) ( x11 x21 ) ( x11+f*x12 x21+f*x22 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( 0 1 ) ( x12 x22 ) ( x12 x22 ) */ T1_TMATRIX *T1_ShearHMatrix( T1_TMATRIX *matrix, double shear) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxx +=shear*matrix->cxy; matrix->cyx +=shear*matrix->cyy; return( matrix); } /* Vertical shearing */ /* V-Shearing: ( x11' x21' ) ( 1 0 ) ( x11 x21 ) ( x11 x21 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( f 1 ) ( x12 x22 ) ( x12+f*x11 x22+f*x21 ) */ T1_TMATRIX *T1_ShearVMatrix( T1_TMATRIX *matrix, double shear) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxy +=shear*matrix->cxx; matrix->cyy +=shear*matrix->cyx; return( matrix); } /* Horizontal extension */ /* Horizontal-Extension: ( x11' x21' ) ( f 0 ) ( x11 x21 ) ( f*x11 f*x21 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( 0 1 ) ( x12 x22 ) ( x12 x22 ) */ T1_TMATRIX *T1_ExtendHMatrix( T1_TMATRIX *matrix, double extent) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxx *=extent; matrix->cyx *=extent; return( matrix); } /* Vertical extension */ /* Vertical-Extension: ( x11' x21' ) ( 1 0 ) ( x11 x21 ) ( x11 x21 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( 0 f ) ( x12 x22 ) ( f*x12 f*x22 ) */ T1_TMATRIX *T1_ExtendVMatrix( T1_TMATRIX *matrix, double extent) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxy *=extent; matrix->cyy *=extent; return( matrix); } /* General transformation */ /* ( x11 x21 ) ( y11 y21 ) ( x11*y11+x21*y12 x11*y21+x21*y22 ) ( ) * ( ) = ( ) ( x12 x22 ) ( y12 y22 ) ( x12*y11+x22*y12 x12*y21+x22*y22 ) */ T1_TMATRIX *T1_TransformMatrix( T1_TMATRIX *matrix, double cxx, double cyx, double cxy, double cyy) { T1_TMATRIX tmat; if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } memcpy( &tmat, matrix, sizeof(T1_TMATRIX)); matrix->cxx=cxx * tmat.cxx + cyx * tmat.cxy; matrix->cyx=cxx * tmat.cyx + cyx * tmat.cyy; matrix->cxy=cxy * tmat.cxx + cyy * tmat.cxy; matrix->cyy=cxy * tmat.cyx + cyy * tmat.cyy; return( matrix); } /* T1_StrokeFont(): Switch the font referenced by FontID to stroking or filling. The stroked character will be cached and filled characters are no longer cached and vice versa. This is only allowed if no size dependent data exists. Of course, the font must already have been loaded. Returns 0 for success and -1 otherwise. */ int T1_StrokeFont( int FontID, int dostroke) { /* First, check for font residing in memory: */ if ( T1_CheckForFontID( FontID) != 1 ) { T1_errno = T1ERR_INVALID_FONTID; return -1; } /* Second, check whether size-dependent data exists: */ if ( pFontBase->pFontArray[FontID].pFontSizeDeps != NULL ) { T1_errno = T1ERR_OP_NOT_PERMITTED; return -1; } if ( dostroke != 0 ) { pFontBase->pFontArray[FontID].info_flags |= RASTER_STROKED; pFontBase->pFontArray[FontID].info_flags |= CACHE_STROKED; } else { pFontBase->pFontArray[FontID].info_flags &= ~RASTER_STROKED; pFontBase->pFontArray[FontID].info_flags &= ~CACHE_STROKED; } return 0; } /* T1_SetStrokeFlag(): Return the stroke flag for font FontID. Return: 0 flag has been set -1 flag could not be set */ int T1_SetStrokeFlag( int FontID) { /* First, check for font residing in memory: */ if ( T1_CheckForFontID(FontID) != 1 ) { T1_errno = T1ERR_INVALID_FONTID; return -1; } /* Set stroke flag to true */ pFontBase->pFontArray[FontID].info_flags |= RASTER_STROKED; return 0; } /* T1_ClearStrokeFlag(): Reset the stroke flag for font FontID. Return: 0 flag has been reset -1 flag could not be reset */ int T1_ClearStrokeFlag( int FontID) { /* First, check for font residing in memory: */ if ( T1_CheckForFontID(FontID) != 1 ) { T1_errno = T1ERR_INVALID_FONTID; return -1; } /* Reset stroke flag */ pFontBase->pFontArray[FontID].info_flags &= ~RASTER_STROKED; return 0; } /* T1_GetStrokeMode(): Return the stroke flag for font FontID. Return: -1 if font is not loaded. 0 if flag is reset, 1 if stroking is enabled for this font, 2 if stroked characters are cached, 3 if stroking is enabled and stroked characters are cached. */ int T1_GetStrokeMode( int FontID) { int outval = 0; /* First, check for font residing in memory: */ if ( T1_CheckForFontID( FontID) != 1 ) { T1_errno = T1ERR_INVALID_FONTID; return -1; } if ( (pFontBase->pFontArray[FontID].info_flags & CACHE_STROKED) != 0 ) outval |= 0x02; if ( (pFontBase->pFontArray[FontID].info_flags & RASTER_STROKED) != 0 ) outval |= 0x01; return outval; } /* T1_SetStrokeWidth(): Set the penwidth used when stroking font FontID. Return -1 If width could not be set. 0 if width has been set. */ int T1_SetStrokeWidth( int FontID, float strokewidth) { /* First, check for font residing in memory: */ if ( T1_CheckForFontID( FontID) != 1 ) { T1_errno = T1ERR_INVALID_FONTID; return -1; } /* Second, check whether caching stroked characters is enabled for this font and glyph data is already existing. In this case the operation is forbidden, unless the previous non-zero value is just restored! */ if ( ((pFontBase->pFontArray[FontID].info_flags & CACHE_STROKED) != 0) && (pFontBase->pFontArray[FontID].pFontSizeDeps != NULL) && (pFontBase->pFontArray[FontID].SavedStrokeWidth != strokewidth) ) { T1_errno = T1ERR_OP_NOT_PERMITTED; return -1; } /* OK, accept stroke width after ensuring a numerically meaningful value */ if ( strokewidth < 0.0f ) { T1_errno = T1ERR_INVALID_PARAMETER; return -1; } pFontBase->pFontArray[FontID].StrokeWidth = strokewidth; if ( strokewidth != 0.0f ) pFontBase->pFontArray[FontID].SavedStrokeWidth = strokewidth; return 0; } /* T1_GetStrokeWidth(): Get the penwidth used when stroking font FontID. If 0.0 is returned, it might also indicate that the font is not loaded. */ float T1_GetStrokeWidth( int FontID) { /* First, check for font residing in memory: */ if ( T1_CheckForFontID( FontID) != 1 ) { T1_errno = T1ERR_INVALID_FONTID; return 0.0f; } return pFontBase->pFontArray[FontID].StrokeWidth; } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/Makefile.in0000664000175000017500000000417711742726711023352 0ustar uwabamiuwabami# Makefile.in # # This file is part of the t1lib-package! See documentation and Readme files # of the t1lib-package for copyright restrictions. # # Targets provided: # all (default) # install # clean # # Author: Rainer Menzner (Rainer.Menzner@web.de) # Date: 06/20/1997 # Last modified: 2001-04-01 # # Modified by H.Kakugawa to use libtool LIBTOOL = ../../libtool SHELL = /bin/sh CC = @CC@ CPP = @CPP@ CFLAGS = @CFLAGS@ OPTIONS = @OPTIONS@ X_LIBS = @X_LIBS@ TOPSRC = @top_srcdir@ XPM_LIB = -lXpm XLIB = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@ LDFLAGS = @LDFLAGS@ LDLIBS = @LDLIBS@ AR = ar rc RANLIB = @RANLIB@ RM = rm -f X_CFLAGS = @X_CFLAGS@ YACC = @YACC@ LEX = @LEX@ LEXLIB = @LEXLIB@ ALLCFLAGS = $(CFLAGS) INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @top_srcdir@/ac-tools/mkinstalldirs prefix = @prefix@ exec_prefix = @exec_prefix@ includedir = @includedir@ bindir = @bindir@ datadir = @datadir@ libdir = @libdir@ mandir = @mandir@/man1 manext = .1 no_x = @no_x@ T1_AA_TYPE16 = @T1_AA_TYPE16@ T1_AA_TYPE32 = @T1_AA_TYPE32@ T1_AA_TYPE64 = @T1_AA_TYPE64@ SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(ALLCFLAGS) $(T1_AA_TYPE16) $(T1_AA_TYPE32) $(T1_AA_TYPE64)' 'OPTIONS=$(OPTIONS)' @SET_MAKE@ OBJS = \ t1finfo.lo \ t1base.lo \ t1delete.lo \ t1enc.lo \ t1env.lo \ t1load.lo \ t1set.lo \ t1trans.lo \ t1aaset.lo \ t1afmtool.lo \ t1outline.lo \ t1subset.lo \ parseAFM.lo XOBJS = @XOBJS@ .SUFFIXES: .c .o .lo .c.lo: $(LIBTOOL) --mode=compile \ $(CC) -c $(CPPFLAGS) $(CFLAGS) $< .c.o: $(LIBTOOL) --mode=compile \ $(CC) -c $(CPPFLAGS) $(CFLAGS) $< all: $(OBJS) $(XOBJS) .PHONY: clean dependencies: dummy gcc -MM *.c | sed 's/\.o:/.lo:/g' > .dependencies clean: dummy -$(RM) *.lo *.o .libs/* -$(RM) *~ *.bak \#*\# -rmdir .libs install: dummy dummy: # Dependencies of object files include .dependencies xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1load.h0000664000175000017500000000424411742726711022635 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1load.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2002-12-02 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1load.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2002. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1LOAD_C int T1_LoadFont( int FontID); static int openFontMetricsFile( int FontID, int open_sloppy); FONTSIZEDEPS *T1int_CreateNewFontSize( int FontID, float size, int aa); FONTSIZEDEPS *T1int_GetLastFontSize( int FontID); FONTSIZEDEPS *T1int_QueryFontSize( int FontID, float size, int aa); int fontfcnA( char *env, int *mode, psfont *Font_Ptr); static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2); extern char *vm_base; /* from fontfcn.c in initfont()! */ extern char *vm_used; /* from fontfcn.c in fontfcnA()! */ #else extern int T1_LoadFont( int FontID); extern FONTSIZEDEPS *T1int_CreateNewFontSize( int FontID, float size, int aa); extern FONTSIZEDEPS *T1int_GetLastFontSize( int FontID); extern FONTSIZEDEPS *T1int_QueryFontSize( int FontID, float size, int aa); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1set.h0000664000175000017500000000740711742726711022515 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1set.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2003-01-02 ----- Description: This file is part of the t1-library. It contains definitions and declarations for t1set.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2003. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1SET_C GLYPH *T1_SetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); GLYPH *T1_SetString( int FontID, char *string, volatile int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); GLYPH* T1_SetRect( int FontID, float size, float width, float height, T1_TMATRIX *transform); void fill(char *dest, int h, int w, struct region *area, int byte, int bit, int wordsize); void fillrun(char *p, pel x0, pel x1, int bit); GLYPH *T1_CopyGlyph(GLYPH *glyph); void T1_DumpGlyph( GLYPH *glyph); GLYPH *T1_ConcatGlyphs( GLYPH *glyph1, GLYPH *glyph2, int x_off, int y_off, int modflag); void T1_DumpGlyph( GLYPH *glyph); GLYPH *T1_FillOutline( T1_OUTLINE *path, int modflag); #else extern GLYPH *T1_SetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_SetString( int FontID, char *string, volatile int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern GLYPH* T1_SetRect( int FontID, float size, float width, float height, T1_TMATRIX *transform); extern void fill(char *dest, int h, int w, struct region *area, int byte, int bit, int wordsize); extern void fillrun(char *p, pel x0, pel x1, int bit); extern GLYPH *T1_CopyGlyph(GLYPH *glyph); extern void T1_DumpGlyph( GLYPH *glyph); extern GLYPH *T1_ConcatGlyphs( GLYPH *glyph1, GLYPH *glyph2, int x_off, int y_off, int modflag); extern void T1_DumpGlyph( GLYPH *glyph); extern GLYPH *T1_FillOutline( T1_OUTLINE *path, int modflag); #endif extern struct region *fontfcnB(int FontID, int modflag, struct XYspace *S, char **ev, unsigned char index, int *mode, psfont *Font_Ptr, int do_raster, float strokewidth); extern struct region *fontfcnB_string( int FontID, int modflag, struct XYspace *S, char **ev, unsigned char *string, int no_chars, int *mode, psfont *Font_Ptr, int *kern_pairs, long spacewidth, int do_raster, float strokewidth); extern struct region *fontfcnB_ByName( int FontID, int modflag, struct XYspace *S, char *charname, int *mode, psfont *Font_Ptr, int do_raster); extern struct region* fontfcnRect( float width, float height, struct XYspace* S, int* mode, int do_raster, float strokewidth); xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/sysconf.h.in0000664000175000017500000000341011742726712023535 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: sysconf.h.in ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. Some system dependent definitions are stored here. sysconf.h is generated from this file automatically by the configure-script. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #undef __CHAR_UNSIGNED__ #define SIZEOF_CHAR 0 #define SIZEOF_SHORT 0 #define SIZEOF_INT 0 #define SIZEOF_LONG 0 #define SIZEOF_LONG_LONG 0 #define SIZEOF_FLOAT 0 #define SIZEOF_DOUBLE 0 #define SIZEOF_LONG_DOUBLE 0 #define SIZEOF_VOID_P 0 xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1afmtool.h0000664000175000017500000000347111742726712023361 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1afmtool.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1afmtool.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1AFMTOOL_C FontInfo *T1_GenerateAFMFallbackInfo( int FontID); int T1_WriteAFMFallbackFile( int FontID); extern struct region *fontfcnB_ByName( int FontID, int modflag, struct XYspace *S, char *charname, int *mode, psfont *Font_Ptr, int do_raster); #else extern FontInfo *T1_GenerateAFMFallbackInfo( int FontID); extern int T1_WriteAFMFallbackFile( int FontID); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1global.h0000664000175000017500000001016411742726712023155 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1global.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2005-05-16 ----- Description: This file is part of the t1-library. It contains global declarations used by the t1-library. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #include "t1misc.h" /* Following struct will allow all accesses to font data! */ struct FONTBASE { int t1lib_flags; /* Global library flags */ int no_fonts_ini; /* The number of fonts initially declared in Font database file. */ int no_fonts; /* The number of currently allocated fonts including logical fonts produced by T1_CopyFont() */ int no_fonts_limit; /* The maximum number of font for which is memory currently available. */ int bitmap_pad; /* The value to which bitmap-scanlines are padded */ int endian; /* 1 if little endian representation and 0 otherwise */ char **default_enc; /* The default encoding vector */ FONTPRIVATE *pFontArray; /* Points to first element of font pointer array */ } FontBase; struct FONTBASE *pFontBase=NULL; /* Further we need a struct where to save device dependent data such as resolution. The values in this struct may be altered using T1_SetDeviceRes(x_res,y_res). Generally, the fontsize is to be specified in BigPoints ("bp")---this is the default PostScript unit. It is 1in=72bp. */ typedef struct { float x_resolution; /* Value must be specified in DPI */ float y_resolution; /* Value must be specified in DPI */ float scale_x; /* horizontal scale-value to get a matrix scaled to 1b */ float scale_y; /* vertical scale-value to get a matrix scaled to 1b */ } DEVICESPECIFICS; DEVICESPECIFICS DeviceSpecifics = { DEFAULT_RES, DEFAULT_RES, DEFAULT_RES/BIGPOINTSPERINCH, DEFAULT_RES/BIGPOINTSPERINCH }; struct stat filestats; /* A structure where fileinfo is stored */ char linebuf[BUF_SIZE]; /* A buffer for reading files line by line */ int T1_Up=0; /* This one is for initialization-checking */ /* The width of AA-pixels */ int T1aa_bpp; /* The follwoing variable allows the primary rastering functions to check for the caller */ int SetFuncRequestID=0; /* The following variable allows to suppress rastering at 1000 bp for getting a correct bounding box for slanted characters --> should only internally be used */ int ForceAFMBBox=0; extern struct XYspace *IDENTITY; int errornumber; /* for debugging purposes */ /* The following pointers should be set to path-strings--used for locating type1, afm and encoding files */ char** T1_PFAB_ptr=NULL; char** T1_AFM_ptr=NULL; char** T1_ENC_ptr=NULL; char** T1_FDB_ptr=NULL; char** T1_FDBXLFD_ptr=NULL; /* We use a uchar buffer for error and warning messages: */ char err_warn_msg_buf[1024]; /* file pointer for log-file */ FILE *t1lib_log_file=NULL; int t1lib_log_level=2; /* The errno for t1lib */ int T1_errno=0; /* A variable for saving stack info */ jmp_buf stck_state; xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1load.c0000664000175000017500000012437511742726712022641 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1load.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2007-12-23 ----- Description: This file is part of the t1-library. It contains functions for loading fonts and for managing size dependent data. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2007. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1LOAD_C #define ANSI_REALLOC_VM /* Note: On some systems, like e.g. my Linux box, realloc() frequently returns the identical pointer, if the memory chunk is *decreased* in size. As a consequence, pointer shifting (as implemented below) would never actually appear. The following definition enforces pointer shifting, and hence allows to check pointer shifting on every system. Do not activate this, it is meant for testing only! */ /* #define ANSI_REALLOC_ENFORCE_POINTERSHIFTING */ #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/blues.h" #include "../type1/paths.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1load.h" #include "t1env.h" #include "t1set.h" #include "t1base.h" #include "t1finfo.h" #include "t1afmtool.h" extern psobj *StdEncArrayP; /* For checking of a fonts encoding */ extern char not_def[]; /* for checking the ".notdef"-string */ /* T1_LoadFont(FontID): Loads a Type1 font into memory and allocates all memory, necessary for this. */ int T1_LoadFont( int FontID) { int i, j, k, l, m, n; char *FileName, *FileNamePath; int mode; /* This is used by the type1-library for error reporting */ char *charname; /* The following vars are used for reallocation of VM */ long tmp_size; float ascender; #ifdef ANSI_REALLOC_VM unsigned long shift; unsigned long ldummy; char *tmp_ptr; #endif struct region *area; struct XYspace *S; /* These are for constructing the kerning lookup table: */ PairKernData *pkd; METRICS_ENTRY *kern_tbl; int char1, char2; if (T1_CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } i=T1_CheckForFontID(FontID); if (i==1) return(0); /* Font already loaded */ if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); /* illegal FontID */ } /* Allocate memory for ps_font structure: */ if ((pFontBase->pFontArray[FontID].pType1Data=(psfont *)malloc(sizeof(psfont)))==NULL){ T1_PrintLog( "T1_LoadFont()", "Failed to allocate memory for psfont-struct (FontID=%d)", T1LOG_ERROR, FontID); T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Check for valid filename */ if ((FileName=T1_GetFontFileName(FontID))==NULL){ T1_PrintLog( "T1_LoadFont()", "No font file name for font %d", T1LOG_ERROR, FontID); return(-1); } /* Fetch the full path of type1 font file */ if ((FileNamePath=intT1_Env_GetCompletePath( FileName, T1_PFAB_ptr))==NULL){ T1_PrintLog( "T1_LoadFont()", "Couldn't locate font file for font %d in %s", T1LOG_ERROR, FontID, T1_GetFileSearchPath(T1_PFAB_PATH)); T1_errno=T1ERR_FILE_OPEN_ERR; return(-1); } /* And load all PostScript information into memory */ if (fontfcnA( FileNamePath, &mode, pFontBase->pFontArray[FontID].pType1Data) == FALSE){ T1_PrintLog( "T1_LoadFont()", "Loading font with ID = %d failed! (mode = %d)", T1LOG_ERROR, FontID, mode); free(FileNamePath); pFontBase->pFontArray[FontID].pType1Data=NULL; T1_errno=mode; return(-1); } free(FileNamePath); /* Set some default for FontBBox and Encoding if the font does not provide correct data. Strictly taken, these fonts do not adhere to the Type1 specification. However, it is easy to work around and find reasonable defaults. This solution has been proposed by the Debian community (see http://bugs.debian.org/313236). */ /* 1. FontBBox. We set default values of 0 which is recommended by Adobe in cases where the font does not make use of the SEAC primitive. Later on, if AFM fallback info is computed, these settings might be overwritten with meaningful values. */ if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP == NULL) { if ((pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP = (psobj *)vm_alloc(4 * sizeof(psobj))) == NULL) { T1_PrintLog( "T1_LoadFont()", "Error allocating memory for fontbbox objects (FontID=%d)", T1LOG_ERROR, FontID); T1_errno=T1ERR_ALLOC_MEM; return(-1); } for (n = 0; n < 4; n++) { pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[n].type = OBJ_INTEGER; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[n].len = 0; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[n].data.integer = 0; } T1_PrintLog( "T1_LoadFont()", "Missing FontBBox, adding a trivial one in order to avoid crashes (FontID=%d)", T1LOG_WARNING, FontID); } /* 2. Encoding. In this case, we simply fallback to Standard Encoding. */ if (pFontBase->pFontArray[FontID].pFontEnc == NULL && pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP == NULL) { pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.valueP = (char *) StdEncArrayP; T1_PrintLog( "T1_LoadFont()", "Missing, invalid or undefined Encoding, setting up Standard Encoding in order to avoid crashes (FontID=%d)", T1LOG_WARNING, FontID); } /* Store the base address of virtual memory and realloc in order not to waste too much memory: */ pFontBase->pFontArray[FontID].vm_base=vm_base; #ifdef ANSI_REALLOC_VM /* We first get the size of pointers on the current system */ /* Get size of VM, ... */ tmp_size=((unsigned long)vm_used - (unsigned long)vm_base); /* ... realloc to that size ... */ #ifdef ANSI_REALLOC_ENFORCE_POINTERSHIFTING tmp_ptr=(char *)malloc( tmp_size); memcpy( tmp_ptr, vm_base, tmp_size); #else tmp_ptr=(char *)realloc(vm_base, tmp_size); #endif /* ... and shift all pointers refering to that area */ if (tmp_ptr > vm_base){ shift= (unsigned long)tmp_ptr - (unsigned long)vm_base; sprintf( err_warn_msg_buf, "Old VM at 0x%lX, new VM at 0x%lX, shifting up by %lu", (unsigned long)vm_base, (unsigned long)tmp_ptr, tmp_size); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); /* We start by shifting the topmost pointers: */ pFontBase->pFontArray[FontID].vm_base=tmp_ptr; ldummy=(long)(pFontBase->pFontArray[FontID].pType1Data->vm_start); ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->vm_start=(char *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP=(psdict *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->Private=(psdict *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP=(psdict *)ldummy; ldummy=(long)(pFontBase->pFontArray[FontID].pType1Data->BluesP); ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->BluesP=(struct blues_struct *)ldummy; /* We now have to care for correcting all pointers which are in the VM and refer to some place in the VM! Note: Instead of selecting the appropriate pointer-elements of the union we simply shift the unspecified pointer "valueP". Note: The filename entry does not need to be modified since it does not need to be shifted since it points to memory managed by t1lib. */ /* FontInfo-dictionary: All name-pointers and the pointers to all array types have to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->fontInfoP[0].key.len; for (j=1; j<=i; j++){ if ((pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_ARRAY) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_STRING) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_NAME) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_FILE)){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP=(char *)ldummy; } /* The encoding needs special treatment: */ if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_ENCODING){ /* If builtin StandardEncoding is used, we do nothing here. Standard Encoding is now located once for all fonts on the heap. For font-specific encodings we have to move all pointers appropriately, because this is entirely located in VM */ if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP == StdEncArrayP){ /* Font uses builtin StandardEncoding */ ; } else{ /* Font-specific encoding */ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP=(char *)ldummy; for (k=0; k<256; k++){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP[k].data.arrayP; /* The ".notdef" is also static and may not be shifted (Thanks, Derek ;) */ if (ldummy != (unsigned long)not_def) { ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP[k].data.arrayP=(struct ps_obj *)ldummy; } } } } /* end of encoding-handling */ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].key.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].key.data.valueP=(char *)ldummy; } /* fontinfo-dict done */ /* Private-dictionary: All name-pointers and the pointers to all array types have to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->Private[0].key.len; for (j=1; j<=i; j++){ if ((pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_ARRAY) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_STRING) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_NAME) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_FILE)){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private[j].value.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->Private[j].value.data.valueP=(char *)ldummy; } ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private[j].key.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->Private[j].key.data.valueP=(char *)ldummy; } /* BluesP: The entry "next" is the only pointer in blues_struct. Although it is not used anywhere we should shift it for correctness reasons (in case its not NULL)! */ if (pFontBase->pFontArray[FontID].pType1Data->BluesP->next != NULL){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->BluesP->next; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->BluesP->next=(struct blues_struct *)ldummy; } /* The CharStrings-dictionary: Every namepointer and its corresponding charstring has to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->CharStringsP[0].key.len; for (j=1; j<=i; j++){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].value.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].value.data.valueP=(char *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].key.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].key.data.valueP=(char *)ldummy; } /* The Subroutines have also to be reorganized: */ i=pFontBase->pFontArray[FontID].pType1Data->Subrs.len; /* First, shift pointer to array-start and after that the pointers to each command string: */ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP=(struct ps_obj *)ldummy; for (j=0; jpFontArray[FontID].pType1Data->Subrs.data.arrayP[j].data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP[j].data.valueP=(char *)ldummy; } } /* end of if( tmp_ptr > vm_base ) */ else if ( vm_base > tmp_ptr){ shift= (unsigned long)vm_base - (unsigned long)tmp_ptr; sprintf( err_warn_msg_buf, "Old VM at 0x%lX, new VM at 0x%lX, shifting down by %lu", (unsigned long)vm_base, (unsigned long)tmp_ptr, tmp_size); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); /* We start by shifting the topmost pointers: */ pFontBase->pFontArray[FontID].vm_base=tmp_ptr; ldummy=(long)(pFontBase->pFontArray[FontID].pType1Data->vm_start); ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->vm_start=(char *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP=(psdict *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->Private=(psdict *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP=(psdict *)ldummy; ldummy=(long)(pFontBase->pFontArray[FontID].pType1Data->BluesP); ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->BluesP=(struct blues_struct *)ldummy; /* We now have to care for correcting all pointers which are in the VM and refer to some place in the VM! Note: Instead of selecting the appropriate pointer-elements of the union we simply shift the unspecified pointer "valueP". Note: The filename entry does not need to be modified since it does not need to be shifted since it points to memory managed by t1lib. */ /* FontInfo-dictionary: All name-pointers and the pointers to all array types have to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->fontInfoP[0].key.len; for (j=1; j<=i; j++){ if ((pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_ARRAY) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_STRING) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_NAME) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_FILE)){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP=(char *)ldummy; } /* The encoding needs special treatment: */ if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_ENCODING){ /* If builtin StandardEncoding is used, we do nothing here. Standard Encoding is now located once for all fonts on the heap. For font-specific encodings we have to move all pointers appropriately, because this is entirely located in VM */ if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP == StdEncArrayP){ /* Font uses builtin StandardEncoding */ ; } else{ /* Font-specific encoding */ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP=(char *)ldummy; for (k=0; k<256; k++){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP[k].data.arrayP; /* The ".notdef" is also static and may not be shifted (Thanks, Derek ;) */ if (ldummy != (unsigned long)not_def) { ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP[k].data.arrayP=(struct ps_obj *)ldummy; } } } } /* end of encoding-handling */ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].key.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].key.data.valueP=(char *)ldummy; } /* fontinfo-dict done */ /* Private-dictionary: All name-pointers and the pointers to all array types have to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->Private[0].key.len; for (j=1; j<=i; j++){ if ((pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_ARRAY) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_STRING) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_NAME) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_FILE)){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private[j].value.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->Private[j].value.data.valueP=(char *)ldummy; } ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private[j].key.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->Private[j].key.data.valueP=(char *)ldummy; } /* BluesP: The entry "next" is the only pointer in blues_struct. Although it is not used anywhere we should shift it for correctness reasons (in case its not NULL)! */ if (pFontBase->pFontArray[FontID].pType1Data->BluesP->next != NULL){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->BluesP->next; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->BluesP->next=(struct blues_struct *)ldummy; } /* The CharStrings-dictionary: Every namepointer and its corresponding charstring has to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->CharStringsP[0].key.len; for (j=1; j<=i; j++){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].value.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].value.data.valueP=(char *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].key.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].key.data.valueP=(char *)ldummy; } /* The Subroutines have also to be reorganized: */ i=pFontBase->pFontArray[FontID].pType1Data->Subrs.len; /* First, shift pointer to array-start and after that the pointers to each command string: */ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP=(struct ps_obj *)ldummy; for (j=0; jpFontArray[FontID].pType1Data->Subrs.data.arrayP[j].data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP[j].data.valueP=(char *)ldummy; } } /* end of if( vm_base > tmp_ptr ) */ else{ /* VM addess has not changed during reallocation */ sprintf( err_warn_msg_buf, "Old VM and new VM at 0x%lX, no pointer-shifting", (unsigned long)vm_base); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); } #ifdef ANSI_REALLOC_ENFORCE_POINTERSHIFTING /* If pointer shifting had been enforced by allocating from scratch using malloc() free the previous vm. */ free( vm_base); #endif #endif /* Generate a message how much VM the current font consumes */ sprintf( err_warn_msg_buf, "VM for Font %d: %d bytes", FontID, (int) tmp_size); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_STATISTIC); /* Set the matrix for common transformations to "no transformations" */ pFontBase->pFontArray[FontID].FontTransform[0]=1.0; pFontBase->pFontArray[FontID].FontTransform[1]=0.0; pFontBase->pFontArray[FontID].FontTransform[2]=0.0; pFontBase->pFontArray[FontID].FontTransform[3]=1.0; /* Now, that the font has been loaded into memory, try to find the FontMatrix in the font info dictionary. If it exists, load it into our local fontmatrix, otherwise use a default matrix which scales to 1/1000 (since font outlines are defined in a 1000 point space) and does no further transformations. */ if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTMATRIX].value.data.arrayP == NULL){ pFontBase->pFontArray[FontID].FontMatrix[0]=0.001; pFontBase->pFontArray[FontID].FontMatrix[1]=0.0; pFontBase->pFontArray[FontID].FontMatrix[2]=0.0; pFontBase->pFontArray[FontID].FontMatrix[3]=0.001; } else{ pFontBase->pFontArray[FontID].FontMatrix[0]= (double)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTMATRIX].value.data.arrayP[0].data.real; pFontBase->pFontArray[FontID].FontMatrix[1]= (double)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTMATRIX].value.data.arrayP[1].data.real; pFontBase->pFontArray[FontID].FontMatrix[2]= (double)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTMATRIX].value.data.arrayP[2].data.real; pFontBase->pFontArray[FontID].FontMatrix[3]= (double)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTMATRIX].value.data.arrayP[3].data.real; } /* Set the default values for transformation: */ pFontBase->pFontArray[FontID].slant=0.0; pFontBase->pFontArray[FontID].extend=1.0; /* Now try to load afm-structures from corresponding .afm-file (if not suppressed by the user). */ if ((pFontBase->t1lib_flags & T1_NO_AFM)!=0) { pFontBase->pFontArray[FontID].pAFMData = NULL; T1_PrintLog( "T1_LoadFont()", "Suppressing AFM data handling on user request", T1LOG_STATISTIC); } else { if ((i=openFontMetricsFile( FontID, 0))){ /* Try a fallback, opening sloppy: */ if ((i=openFontMetricsFile( FontID, 1))) { sprintf( err_warn_msg_buf, "Alert: Error (%d) sloppy-processing afm-file for Font %d!", i ,FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_STATISTIC); if ((pFontBase->pFontArray[FontID].pAFMData= T1_GenerateAFMFallbackInfo(FontID))==NULL){ sprintf( err_warn_msg_buf, "Ultimately failed to generate metrics information Font %d!", FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_WARNING); } else { pFontBase->pFontArray[FontID].info_flags |=AFM_SELFGEN_SUCCESS; T1_PrintLog( "T1_LoadFont()", "Generating AFM-information from fontfile successful!", T1LOG_STATISTIC); } } else { pFontBase->pFontArray[FontID].info_flags |=AFM_SLOPPY_SUCCESS; sprintf( err_warn_msg_buf, "Alert: Limited afm-information for Font %d",FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_STATISTIC); } } else { pFontBase->pFontArray[FontID].info_flags |=AFM_SUCCESS; } } /* Now, set Encodingvector entry to default if the font's internal encoding is "StandardEncoding". */ if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP == StdEncArrayP) { pFontBase->pFontArray[FontID].info_flags |=USES_STANDARD_ENCODING; pFontBase->pFontArray[FontID].pFontEnc=pFontBase->default_enc; sprintf( err_warn_msg_buf, "Font %d reencoded to default",FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); } else { sprintf( err_warn_msg_buf, "Font %d not reencoded to default",FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); pFontBase->pFontArray[FontID].pFontEnc = NULL; } /* If AFM-Info available we try to speed up some things: */ if (pFontBase->pFontArray[FontID].pAFMData != NULL) { /* We have to fill the array that maps the current encodings' indices to the indices used in afm file. The interpretation has been changed in in t1lib-1.2. We now use positive values for indexing into the charmetrics array and negative values for indexing into the composite character array. an index of zero indicates that no metrics are defined for this character. This may happen because (a) not all AFM-files define metrics for the .notdef character, and (b) because font and AFM-file do not match. */ if ((pFontBase->pFontArray[FontID].pEncMap= (int *)calloc(256,sizeof(int)))==NULL) { sprintf( err_warn_msg_buf, "Error allocating memory for encoding map (FontID=%d)", FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-1); } for (i=0; i<256; i++) { charname=T1_GetCharName( FontID, i); /* in a first loop check for ordinary characters */ for ( j=0; jpFontArray[FontID].pAFMData->numOfChars; j++) { if (strcmp( charname, pFontBase->pFontArray[FontID].pAFMData->cmi[j].name)==0) { pFontBase->pFontArray[FontID].pEncMap[i]=j+1; /* index 0 is reserved! */ continue; } } /* if nothing has been found, check for composite characters */ for ( j=0; jpFontArray[FontID].pAFMData->numOfComps; j++) { if (strcmp( charname, pFontBase->pFontArray[FontID].pAFMData->ccd[j].ccName)==0) { pFontBase->pFontArray[FontID].pEncMap[i]=-(j+1); /* index 0 is reserved! */ continue; } } } /* For composite characters, we still have to compute the width and bbox */ for ( j=0; jpFontArray[FontID].pAFMData->numOfComps; j++) { /*and bounding box by ourselves. First, set up an identity charspace matrix and then generate an edgelist for the composite character at size 1000bp using no transformation and current encoding. Note: This action is only required when loading a font at first time, but not when reencoding a font. */ S=(struct XYspace *)IDENTITY; S=(struct XYspace *)Permanent (Transform(S, pFontBase->pFontArray[FontID].FontTransform[0], pFontBase->pFontArray[FontID].FontTransform[1], pFontBase->pFontArray[FontID].FontTransform[2], pFontBase->pFontArray[FontID].FontTransform[3])); area=fontfcnB_ByName( FontID, 0, S, pFontBase->pFontArray[FontID].pAFMData->ccd[j].ccName, &mode, pFontBase->pFontArray[FontID].pType1Data, DO_RASTER); /* Store bounding box ... */ pFontBase->pFontArray[FontID].pAFMData->ccd[j].charBBox.llx=area->xmin; pFontBase->pFontArray[FontID].pAFMData->ccd[j].charBBox.urx=area->xmax; pFontBase->pFontArray[FontID].pAFMData->ccd[j].charBBox.lly=area->ymin; pFontBase->pFontArray[FontID].pAFMData->ccd[j].charBBox.ury=area->ymax; /* ... and character width. This should be the width of the base character of the composite! */ pFontBase->pFontArray[FontID].pAFMData->ccd[j].wx=NEARESTPEL(area->ending.x); /* clean up. */ KillRegion (area); if (S!=NULL) { KillSpace (S); S=NULL; } } /* We now create an encoding-specific kerning table which will speed up looking for kerning pairs! */ pFontBase->pFontArray[FontID].KernMapSize=0; /* First, get number of defined kerning pairs: */ k=pFontBase->pFontArray[FontID].pAFMData->numOfPairs; if (k>0){ /* i.e., there are any pairs */ /* OK, it does not suffice to alloc numOfPairs METRICS_ENTRYs, because a given character might be encoded at several locations and kerning should still work. As a worst case estimation, we allocate 256^2 and realloc later. */ if ((pFontBase->pFontArray[FontID].pKernMap= (METRICS_ENTRY *)malloc( (256*256) *sizeof( METRICS_ENTRY)))==NULL){ sprintf( err_warn_msg_buf, "Error allocating memory for metrics map (FontID=%d)", FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-1); } kern_tbl=pFontBase->pFontArray[FontID].pKernMap; pkd=pFontBase->pFontArray[FontID].pAFMData->pkd; j=0; for ( i=0; i Put char1 in higher byte and char2 in LSB: */ kern_tbl[j].chars=(char1 << 8) | char2; /* We only make use of horizontal kerning */ kern_tbl[j].hkern=pkd[i].xamt; j++; } /* while (char2) */ } /* while (char1) */ } /* for */ /* We are done, realloc memory: */ kern_tbl=(METRICS_ENTRY*) realloc( kern_tbl, j*sizeof(METRICS_ENTRY)); /* We now sort the kerning array with respect to char indices */ qsort( kern_tbl, (size_t) j, sizeof(METRICS_ENTRY), &cmp_METRICS_ENTRY ); /* Finally write back pointer for the case that realloc changed the pointer */ pFontBase->pFontArray[FontID].pKernMap=kern_tbl; pFontBase->pFontArray[FontID].KernMapSize=j; } else pFontBase->pFontArray[FontID].pKernMap=NULL; } else { /* no AFM data */ pFontBase->pFontArray[FontID].pKernMap=NULL; pFontBase->pFontArray[FontID].pEncMap=NULL; } /* End of "if (AFM-info ..)" */ /* We have just loaded a physical font into memory, thus .... */ pFontBase->pFontArray[FontID].physical=1; /* Set reference-counter to 1: */ pFontBase->pFontArray[FontID].refcount=1; /* Get the index into encoding vector where the space character is found. If not encoded, set space_position to -1. */ pFontBase->pFontArray[FontID].space_position=-1; i=0; if (pFontBase->pFontArray[FontID].pFontEnc) { /* external default encoding */ while (i<256) { if (strcmp( (char *)pFontBase->pFontArray[FontID].pFontEnc[i], "space")==0){ /* space found at position i: */ pFontBase->pFontArray[FontID].space_position=i; break; } i++; } } else { /* internal encoding */ while (i<256) { if (strcmp( (char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[i].data.arrayP, "space")==0){ /* space found at position i: */ pFontBase->pFontArray[FontID].space_position=i; break; } i++; } } /* Set the lining rule parameters to default values */ pFontBase->pFontArray[FontID].UndrLnPos= pFontBase->pFontArray[FontID].pType1Data->fontInfoP[UNDERLINEPOSITION].value.data.real; pFontBase->pFontArray[FontID].UndrLnThick= pFontBase->pFontArray[FontID].pType1Data->fontInfoP[UNDERLINETHICKNESS].value.data.real; /* We have to set the value for the typographic ascender. If possible, we get it from the afm-File. But be aware this value might be undefined! This value should in any acse explicitly be set later by the user! */ if (pFontBase->pFontArray[FontID].pAFMData!=NULL && pFontBase->pFontArray[FontID].pAFMData->gfi!=NULL) { ascender=(float) pFontBase->pFontArray[FontID].pAFMData->gfi->ascender; } else { ascender=(float) T1_GetCharBBox( FontID, T1_GetEncodingIndex( FontID, "d")).ury; } pFontBase->pFontArray[FontID].OvrLnPos=ascender + (float) abs( (double)pFontBase->pFontArray[FontID].UndrLnPos); pFontBase->pFontArray[FontID].OvrStrkPos=ascender / 2.0; pFontBase->pFontArray[FontID].OvrLnThick=pFontBase->pFontArray[FontID].UndrLnThick; pFontBase->pFontArray[FontID].OvrStrkThick=pFontBase->pFontArray[FontID].UndrLnThick; /* Finally, set the font size dependencies pointer to NULL since we can assume, that at load time of a font, no size specific data of this font is available. */ pFontBase->pFontArray[FontID].pFontSizeDeps=NULL; /* If wanted, some debugging information is put into logfile */ sprintf( err_warn_msg_buf, "Pointer vm_base: 0x%lX", (long)pFontBase->pFontArray[FontID].vm_base); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "Pointer vm_start: 0x%lX", (long)pFontBase->pFontArray[FontID].pType1Data->vm_start); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "Pointer CharStringsP: 0x%lX", (long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "Pointer Private: 0x%lX", (long)pFontBase->pFontArray[FontID].pType1Data->Private); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "Pointer fontInfoP: 0x%lX", (long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); return(0); } /* openFontMetricsFile( FontID, open_sloppy): Gets the fontfilename corresponding to FontID, opens the corresponding afm-file and fills the data structures. return-value is the value returned by the T1lib_parseFile() function. If open_sloppy is set, the minimum information needed is read from AFM file. This can be considered a fallback for problematic AFM files. */ static int openFontMetricsFile( int FontID, int open_sloppy) { char *FontFileName; char *AFMFileName; char *afm_name; char *AFMFileNamePath; int i, j; FILE *metricsfile; afm_name=T1_GetAfmFileName(FontID); if (afm_name!=NULL) { /* We have name explicitly specified */ /* It needs to be freeable */ if ((AFMFileName= (char *)malloc( (strlen(afm_name)+1)*sizeof( char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( -6); } strcpy( AFMFileName, afm_name); } else { FontFileName=T1_GetFontFileName( FontID); i=strlen(FontFileName); j=i; AFMFileName=(char *)malloc( i+5); strcpy( AFMFileName, FontFileName); while ( AFMFileName[i] != '.'){ if (i==0) break; else i--; } if (i==0){ /* We have a filename without extension -> append extension */ AFMFileName[j]='.'; AFMFileName[j+1]='a'; AFMFileName[j+2]='f'; AFMFileName[j+3]='m'; AFMFileName[j+4]='\0'; } else{ /* we found a '.' -> replace extension */ AFMFileName[i+1]='a'; AFMFileName[i+2]='f'; AFMFileName[i+3]='m'; AFMFileName[i+4]='\0'; } } /* Get full path of the afm file (The case of a full path name name specification is valid */ AFMFileNamePath=intT1_Env_GetCompletePath( AFMFileName, T1_AFM_ptr); free( AFMFileName); /* open afm-file: */ if (AFMFileNamePath!=NULL){ if ((metricsfile=fopen(AFMFileNamePath,"rb"))==NULL){ free(AFMFileNamePath); return(-4); } else { free(AFMFileNamePath); } } else{ return( -5); } /* Call procedure to read afm-file and store the data formatted. Flags used here: P_M All Metrics Information P_P Pair Kerning Information P_C Composite Character Data (since t1lib V.1.2) The P_G flag to get global font information should not be used if not absolutely needed. When parsing an unknown keyword, which may be harmless, the T1lib_parseFile function returns the error code -1 (parseError). On the other hand, all other really relevant data may habe been parsed and stored correctly. In such a case, There's no way to make a serious decision whether an error has occured or not. */ if (open_sloppy!=0) i=T1lib_parseFile( (FILE *) metricsfile, (FontInfo **) &(FontBase.pFontArray[FontID].pAFMData), P_M ); else i=T1lib_parseFile( (FILE *) metricsfile, (FontInfo **) &(FontBase.pFontArray[FontID].pAFMData), P_G | P_M | P_P | P_C ); fclose(metricsfile); return(i); } /* T1int_CreateNewFontSize( FontID, size): Create a new size "size" of font "FontID" and allocate all data necessary for this. The data structure is connected to the linked list of FontSizeDeps for this font. Returns a pointer to the newly created FontSizeDeps-struct if all went correct and NULL otherwise. Since of version 0.3 a member antialias has been added to the FONTSIZEDEPS structure! This can be: 0: bitmaps are stored in this struct 1: non-antialiased bytemaps are stored in this struct 2: low-antialiased bytemaps are stored in this struct 4: high-antialiased bytemaps are stored in this struct */ FONTSIZEDEPS *T1int_CreateNewFontSize( int FontID, float size, int aa) { FONTSIZEDEPS *pFontSizeDeps, *pPrev; /* First, get to the last font size in the linked list for this font. The following routine returns the address of the last struct in the linked list of FONTSIZEDEPS or NULL if none exists. */ pFontSizeDeps=T1int_GetLastFontSize( FontID); pPrev=pFontSizeDeps; if (pFontSizeDeps==NULL){ /* Allocate memory for first FontSizeDeps-structure: */ if ((pFontBase->pFontArray[FontID].pFontSizeDeps=(FONTSIZEDEPS *)malloc(sizeof(FONTSIZEDEPS)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } pFontSizeDeps=pFontBase->pFontArray[FontID].pFontSizeDeps; } else{ /* A valid address of an existing structure was found */ if ((pFontSizeDeps->pNextFontSizeDeps=(FONTSIZEDEPS *)malloc(sizeof(FONTSIZEDEPS)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } pFontSizeDeps=pFontSizeDeps->pNextFontSizeDeps; } /* The pointer to the previous struct */ pFontSizeDeps->pPrevFontSizeDeps=pPrev; /* Put the size into this structure */ pFontSizeDeps->size=size; /* Set the antialias mark: */ pFontSizeDeps->antialias=aa; /* Just the current becomes now the last item in the linked list: */ pFontSizeDeps->pNextFontSizeDeps=NULL; /* Setup CharSpaceMatrix for this font: */ pFontSizeDeps->pCharSpaceLocal=(struct XYspace *) IDENTITY; /* Apply transformation with font matrix: */ pFontSizeDeps->pCharSpaceLocal=(struct XYspace *) Transform(pFontSizeDeps->pCharSpaceLocal, pFontBase->pFontArray[FontID].FontMatrix[0], pFontBase->pFontArray[FontID].FontMatrix[1], pFontBase->pFontArray[FontID].FontMatrix[2], pFontBase->pFontArray[FontID].FontMatrix[3]); /* Apply a further transformation (optionally): */ pFontSizeDeps->pCharSpaceLocal=(struct XYspace *) Transform(pFontSizeDeps->pCharSpaceLocal, pFontBase->pFontArray[FontID].FontTransform[0], pFontBase->pFontArray[FontID].FontTransform[1], pFontBase->pFontArray[FontID].FontTransform[2], pFontBase->pFontArray[FontID].FontTransform[3]); /* Apply desired scaling factor, and make it Permanent */ pFontSizeDeps->pCharSpaceLocal=(struct XYspace *) Permanent (Scale(pFontSizeDeps->pCharSpaceLocal, size, size)); /* We should now allocate memory for the glyph area of the font cache: */ if ((pFontSizeDeps->pFontCache=(GLYPH *)calloc(256,sizeof(GLYPH))) ==NULL) return(NULL); sprintf( err_warn_msg_buf, "New Size %f created for FontID %d (antialias=%d)", pFontSizeDeps->size, FontID, pFontSizeDeps->antialias); T1_PrintLog( "CreateNewFontSize()", err_warn_msg_buf, T1LOG_STATISTIC); /* We are done */ return(pFontSizeDeps); } /* T1_QueryFontSize( FontID, size, aa): Search if a requested size of font FontID is already existing. If so, it returns a pointer to the respective FontSizeDeps-structure, otherwise NULL is returned: */ FONTSIZEDEPS *T1int_QueryFontSize( int FontID, float size, int aa) { FONTSIZEDEPS *link_ptr; /* There's not yet one size: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps == NULL) return(pFontBase->pFontArray[FontID].pFontSizeDeps); /* There's already existing one or more size */ link_ptr=pFontBase->pFontArray[FontID].pFontSizeDeps; while (((link_ptr->size != size)||(link_ptr->antialias != aa)) &&(link_ptr->pNextFontSizeDeps != NULL)) link_ptr=link_ptr->pNextFontSizeDeps; if ((link_ptr->size != size)||(link_ptr->antialias != aa)) return( NULL); /* requested size/aa-combination was not found */ else return(link_ptr); /* return pointer to requested struct */ } /* FONTSIZEDEPS *T1int_GetLastFontSize( FontID): Get the address of the last struct in the linked list of FontSizeDeps or NULL if there is no existing size dependent data. */ FONTSIZEDEPS *T1int_GetLastFontSize( int FontID) { FONTSIZEDEPS *link_ptr, *result_ptr; /* There's not yet one size: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps == NULL) return((FONTSIZEDEPS *) (pFontBase->pFontArray[FontID].pFontSizeDeps)); /* There's already existing one or more size */ link_ptr=pFontBase->pFontArray[FontID].pFontSizeDeps; while (link_ptr != NULL){ result_ptr=link_ptr; link_ptr=link_ptr->pNextFontSizeDeps; } return((FONTSIZEDEPS *)(result_ptr)); } /* A function for comparing METRICS_ENTRY structs */ static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2) { if (((METRICS_ENTRY *)entry1)->chars < ((METRICS_ENTRY *)entry2)->chars) return(-1); if (((METRICS_ENTRY *)entry1)->chars > ((METRICS_ENTRY *)entry2)->chars) return(1); return(0); /* This should not happen */ } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1set.c0000664000175000017500000020635411742726712022513 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1set.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2005-05-01 ----- Description: This file is part of the t1-library. It contains functions for setting characters and strings of characters. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1SET_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/paths.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1set.h" #include "t1load.h" #include "t1finfo.h" #include "t1misc.h" #include "t1base.h" /* As a fall back */ #ifndef T1_AA_TYPE16 #define T1_AA_TYPE16 short #endif #ifndef T1_AA_TYPE32 #define T1_AA_TYPE32 int #endif extern char *t1_get_abort_message( int number); extern struct region *Interior(struct segment *path, int fillrule); extern unsigned T1_AA_TYPE32 T1aa_bg; /* white value */ static void T1_ComputeLineParameters( int FontID, int width, int mode, float size, int *startx, int *endx, int *starty, int *endy); static int T1_bit=T1GLYPH_BIT; static int T1_byte; static int T1_pad; static int T1_wordsize; static int c_shift=8; static int s_shift=16; static int l_shift=32; /* bin_dump(): Print a binary dump of a byte, short and long variable (used for debug purposes only): */ static void bin_dump_c(unsigned char value, char space_flag) { int i,j; for (i=0;i<=7;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } if (space_flag) printf(" "); } static void bin_dump_s(unsigned short value, char space_flag) { int i,j; if (T1_CheckEndian()){ for (i=8;i<=15;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } for (i=0;i<=7;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } } else{ for (i=0;i<=15;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } } if (space_flag) printf(" "); } static void bin_dump_l(unsigned long value, char space_flag) { int i,j; if (T1_CheckEndian()){ for (i=24;i<=31;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } for (i=16;i<=23;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } for (i=8;i<=15;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } for (i=0;i<=7;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } } else{ for (i=0;i<=31;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } } if (space_flag) printf(" "); } /* T1_SetChar(...): Generate the bitmap for a character */ GLYPH *T1_SetChar( int FontID, char charcode, float size, T1_TMATRIX *transform) { int i; int mode; struct region *area; struct XYspace *Current_S; int cache_flag = 1; int rot_flag = 0; unsigned char ucharcode; float strokewidth = 0.0f; volatile int strokeextraflag = 0; FONTSIZEDEPS *font_ptr; FONTPRIVATE *fontarrayP; volatile int memsize=0; LONG h,w; LONG paddedW; /* We don't implement underlining for characters, but the rasterer implements it. Thus, we use a modflag of constant 0 */ int modflag=0; static GLYPH glyph={NULL,{0,0,0,0,0,0},NULL,1}; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_SetChar()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } ucharcode=(unsigned char)charcode; /* Reset character glyph, if necessary */ if (glyph.bits!=NULL){ free(glyph.bits); glyph.bits=NULL; } glyph.metrics.leftSideBearing=0; glyph.metrics.rightSideBearing=0; glyph.metrics.advanceX=0; glyph.metrics.advanceY=0; glyph.metrics.ascent=0; glyph.metrics.descent=0; glyph.pFontCacheInfo=NULL; glyph.bpp=1; /* First, check for a correct ID */ i=T1_CheckForFontID(FontID); if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* if necessary load font into memory */ if (i==0) if (T1_LoadFont(FontID)) return(NULL); /* Check for valid size */ if (size<=0.0){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } /* Assign padding value */ T1_pad=pFontBase->bitmap_pad; if (pFontBase->endian) T1_byte=1; else T1_byte=0; T1_wordsize=T1_pad; fontarrayP=&(pFontBase->pFontArray[FontID]); /* Check if rotation is requested */ if (transform!=NULL){ /* there's rotation requested => do not cache the resulting bitmap */ rot_flag=1; cache_flag=0; } else { rot_flag=0; cache_flag=1; } /* handle stroking stuff */ if ( pFontBase->pFontArray[FontID].info_flags & RASTER_STROKED) { /* Stroking requested. If caching is not desired, clear cache_flag. Otherwise, leave it unaffected. */ if ( (pFontBase->pFontArray[FontID].info_flags & CACHE_STROKED) == 0 ) { /* filled glyphs are cached, indicate that character is to be rendered on the fly and not to be cached */ strokeextraflag = 1; cache_flag = 0; } strokewidth = pFontBase->pFontArray[FontID].StrokeWidth; } else { /* filling requested. */ if ( (pFontBase->pFontArray[FontID].info_flags & CACHE_STROKED) != 0 ) { /* stroked glyphs are cached, indicate that character is to be rendered on the fly and not to be cached */ strokeextraflag = 1; cache_flag = 0; } strokewidth = 0.0f; } /* font is now loaded into memory => Check for size: */ if ((font_ptr=T1int_QueryFontSize( FontID, size, NO_ANTIALIAS))==NULL){ font_ptr=T1int_CreateNewFontSize( FontID, size, NO_ANTIALIAS); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } else {/* size is already existent in cache */ /* If no rotation and no noncached stroking , try to get character from cache */ if ( (rot_flag==0) && (strokeextraflag==0) ) { /* we don't use the .bits entry to check because in newer releases also white glyphs (bits=NULL) are allowed. Rather, we check whether bpp > 0! */ if (font_ptr->pFontCache[ucharcode].bpp > 0){ /* Character is already in Chache -> create a copy of cache and return a pointer to the result: */ memcpy( &glyph, &(font_ptr->pFontCache[ucharcode]), sizeof(GLYPH)); paddedW = PAD((glyph.metrics.rightSideBearing-glyph.metrics.leftSideBearing), T1_pad); if (font_ptr->pFontCache[ucharcode].bits!=NULL) { memsize = (glyph.metrics.ascent-glyph.metrics.descent)*paddedW / 8; glyph.bits = (char *)malloc(memsize*sizeof( char)); if (glyph.bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } memcpy( glyph.bits, font_ptr->pFontCache[ucharcode].bits, memsize); } return(&(glyph)); } } } /* Setup an appropriate charspace matrix. Note that the rasterizer assumes vertical values with inverted sign! Transformation should create a copy of the local charspace matrix which then still has to be made permanent. */ if (rot_flag){ Current_S=(struct XYspace *) Permanent(Scale(Transform (font_ptr->pCharSpaceLocal, transform->cxx, - transform->cxy, transform->cyx, - transform->cyy), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } else{ Current_S=(struct XYspace *) Permanent(Scale(Transform(font_ptr->pCharSpaceLocal, 1.0, 0.0, 0.0, -1.0), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } /* fnt_ptr now points to the correct FontSizeDeps-struct => lets now raster the character */ mode=0; area=fontfcnB( FontID, modflag, Current_S, fontarrayP->pFontEnc, ucharcode, &mode, fontarrayP->pType1Data, DO_RASTER, strokewidth); KillSpace (Current_S); /* fill the glyph-structure */ if (mode > 0) { sprintf( err_warn_msg_buf, "fontfcnB() set mode=%d", mode); T1_PrintLog( "T1_SetChar()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=mode; return(NULL); } if (area == NULL){ T1_PrintLog( "T1_SetChar()", "area=NULL returned by fontfcnB()", T1LOG_WARNING); T1_errno=mode; return(NULL); } h = area->ymax - area->ymin; w = area->xmax - area->xmin; if (mode == FF_NOTDEF_SUBST) { sprintf( err_warn_msg_buf, "\".notdef\" substituted for character %d from font %d", ucharcode, FontID); T1_PrintLog( "T1_SetChar()", err_warn_msg_buf, T1LOG_WARNING); mode=0; } paddedW = PAD(w, T1_pad); if (h > 0 && w > 0) { memsize = h * paddedW / 8 + 1; /* This is for the users copy of the character, for security-reasons the original pointer to the cache area is not used. The entry glyph.bits is free'ed every time this function is called: */ glyph.bits = (char *)malloc(memsize*sizeof( char)); if (glyph.bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; /* make sure to get rid of 'area' before leaving! */ KillRegion (area); return(NULL); } } else { h = w = 0; area->xmin = area->xmax = 0; area->ymin = area->ymax = 0; } /* Assign metrics */ glyph.metrics.leftSideBearing = area->xmin; glyph.metrics.advanceX = NEARESTPEL(area->ending.x - area->origin.x); glyph.metrics.advanceY = - NEARESTPEL(area->ending.y - area->origin.y); glyph.metrics.rightSideBearing = area->xmax; glyph.metrics.descent = - area->ymax; glyph.metrics.ascent = - area->ymin; if (h > 0 && w > 0) { (void) memset(glyph.bits, 0, memsize); fill(glyph.bits, h, paddedW, area, T1_byte, T1_bit, T1_wordsize ); } /* make sure to get rid of 'area' before leaving! */ KillRegion (area); /* Cache glyph if requested, also if it contains only white space */ if (cache_flag){ /* Copy glyph to cache but be careful not to modify the pixmap entry */ font_ptr->pFontCache[ucharcode].metrics.leftSideBearing=glyph.metrics.leftSideBearing; font_ptr->pFontCache[ucharcode].metrics.rightSideBearing=glyph.metrics.rightSideBearing; font_ptr->pFontCache[ucharcode].metrics.advanceX=glyph.metrics.advanceX; font_ptr->pFontCache[ucharcode].metrics.advanceY=glyph.metrics.advanceY; font_ptr->pFontCache[ucharcode].metrics.ascent=glyph.metrics.ascent; font_ptr->pFontCache[ucharcode].metrics.descent=glyph.metrics.descent; font_ptr->pFontCache[ucharcode].pFontCacheInfo=glyph.pFontCacheInfo; font_ptr->pFontCache[ucharcode].bpp=glyph.bpp; if (glyph.bits==NULL) { font_ptr->pFontCache[ucharcode].bits=NULL; } else { font_ptr->pFontCache[ucharcode].bits = (char *)malloc(memsize*sizeof( char)); if (font_ptr->pFontCache[ucharcode].bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } /* ... and copy bitmap to cache area: */ memcpy( font_ptr->pFontCache[ucharcode].bits, glyph.bits, memsize); } } return(&glyph); } /* T1_SetString(...): Generate the bitmap for a string of characters */ GLYPH *T1_SetString( int FontID, char *string, volatile int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform) { volatile int i, j=0, k; int mode; /* initialize this to NULL just to be on the safe side */ struct region *area = NULL; struct XYspace *Current_S, *S; int cache_flag=1; volatile int rot_flag=0; int *kern_pairs; /* use for accessing the kern pairs if kerning is requested */ int no_chars=0; /* The number of characters in the string */ static int lastno_chars=0; float factor; long spacewidth; /* This is given to fontfcnb_string() */ float strokewidth = 0.0f; volatile int strokeextraflag = 0; FONTSIZEDEPS *font_ptr; FONTPRIVATE *fontarrayP; volatile int memsize=0; long h,w; long paddedW, char_paddedW; int h_anchor, v_anchor; static int *pixel_h_anchor_corr=NULL; static int *flags=NULL; int lsb_min, rsb_max; long overallwidth=0; long overallascent=0; long overalldescent=0; int underline_startx, underline_starty, underline_endx, underline_endy; int overline_startx, overline_starty, overline_endx, overline_endy; int overstrike_startx, overstrike_starty, overstrike_endx, overstrike_endy; int start, middle; int afm_ind; char startmask, endmask; static unsigned char *r2lstring; static int r2l_len=0; static GLYPH string_glyph={NULL,{0,0,0,0,0,0},NULL,1}; GLYPH *currchar; /* The following are for bitmap blitting */ long BitShift; long ByteOffset; /* pad=8 */ unsigned T1_AA_TYPE16 BitBuf_c; unsigned char *p_c; unsigned char *Target_c; /* pad=16 */ unsigned T1_AA_TYPE32 BitBuf_s; unsigned T1_AA_TYPE16 *p_s; unsigned T1_AA_TYPE16 *Target_s; #ifdef T1_AA_TYPE64 /* pad=32 */ unsigned T1_AA_TYPE64 BitBuf_l; unsigned T1_AA_TYPE32 *p_l; unsigned T1_AA_TYPE32 *Target_l; #endif unsigned char *ustring; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } /* force string elements into unsigned */ ustring=(unsigned char*)string; /* Check for valid string */ if (string==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } /* Reorganize if required */ if (modflag & T1_RIGHT_TO_LEFT){ if (len) i=len; else i=j=strlen( string); if (i+1>r2l_len){ if (r2lstring!=NULL) free( r2lstring); r2lstring=(unsigned char *)malloc( (i+1)*sizeof(char)); r2l_len=i+1; } j--; while ( i--) { r2lstring[j-i]=ustring[i]; } ustring=r2lstring; len=j+1; } /* Reset string glyph, if necessary */ if (string_glyph.bits!=NULL){ free(string_glyph.bits); string_glyph.bits=NULL; } string_glyph.metrics.leftSideBearing=0; string_glyph.metrics.rightSideBearing=0; string_glyph.metrics.advanceX=0; string_glyph.metrics.advanceY=0; string_glyph.metrics.ascent=0; string_glyph.metrics.descent=0; string_glyph.pFontCacheInfo=NULL; string_glyph.bpp=1; /* We don't want to cache the resulting bitmap: */ cache_flag=0; /* First, check for a correct ID */ i=T1_CheckForFontID(FontID); if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* if necessary load font into memory */ if (i==0) if (T1_LoadFont(FontID)) return(NULL); /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return(NULL); } /* Check for valid size */ if (size<=0.0){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } /* Assign padding value */ T1_pad=pFontBase->bitmap_pad; if (pFontBase->endian) T1_byte=1; else T1_byte=0; T1_wordsize=T1_pad; fontarrayP=&(pFontBase->pFontArray[FontID]); /* Check if rotation is requested */ if (transform!=NULL){ /* there's rotation requested => do not cache the resulting bitmap */ rot_flag=1; cache_flag=0; } /* handle stroking stuff */ if ( pFontBase->pFontArray[FontID].info_flags & RASTER_STROKED) { /* Stroking requested. If caching is not desired, clear cache_flag. Otherwise, leave it unaffected. */ if ( (pFontBase->pFontArray[FontID].info_flags & CACHE_STROKED) == 0 ) { /* filled glyphs are cached, indicate that character is to be rendered on the fly and not to be cached */ strokeextraflag = 1; cache_flag = 0; } strokewidth = pFontBase->pFontArray[FontID].StrokeWidth; } else { /* filling requested. */ if ( (pFontBase->pFontArray[FontID].info_flags & CACHE_STROKED) != 0 ) { /* stroked glyphs are cached, indicate that character is to be rendered on the fly and not to be cached */ strokeextraflag = 1; cache_flag = 0; } strokewidth = 0.0f; } /* font is now loaded into memory => Check for size: */ if ((font_ptr=T1int_QueryFontSize( FontID, size, NO_ANTIALIAS))==NULL){ font_ptr=T1int_CreateNewFontSize( FontID, size, NO_ANTIALIAS); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } /* Now comes string specific stuff: Get length of string and create an array of integers where to store the bitmap positioning dimens: */ if (len<0){ /* invalid length */ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } if (len==0) /* should be computed assuming "normal" 0-terminated string, or R2L-part has already been computed! */ no_chars=strlen(string); else /* use value given on command line */ no_chars=len; /* If necessary, allocate memory */ if (no_chars>lastno_chars){ if (pixel_h_anchor_corr!=NULL){ free(pixel_h_anchor_corr); } if (flags!=NULL){ free(flags); } pixel_h_anchor_corr=(int *)calloc(no_chars, sizeof(int)); flags=(int *)calloc(no_chars, sizeof(int)); lastno_chars=no_chars; } else{ /* Reset flags and position array */ for (i=0; ipCharSpaceLocal, transform->cxx, - transform->cxy, transform->cyx, - transform->cyy), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } else{ Current_S=(struct XYspace *) Permanent(Scale(Transform(font_ptr->pCharSpaceLocal, 1.0, 0.0, 0.0, -1.0), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } /* Compute the correct spacewidth value (in charspace units). The value supplied by the user is interpreted as an offset in char space units: */ spacewidth=T1_GetCharWidth(FontID,fontarrayP->space_position)+spaceoff; /* The following if (rot_flag==0){ ... } contains the whole code to execute when the string is oriented horizontal. Then, there's the possibility of concatenating most probably existent bitmaps from the Cache, which should be much faster than every time raster all the characters. */ /* First, ensure that all needed characters are in the Cache; if not, generate them */ if ( (rot_flag==0) && (strokeextraflag==0) ){ overallwidth=0; for (i=0; ipFontCache[ustring[i]]); if (currchar->bpp<1) { flags[i]=0; mode=0; /* Don't try to generate space-character: */ if (ustring[i]!=fontarrayP->space_position){ /* Note: Never underline etc. cached chars --> modflag=0 */ area=fontfcnB( FontID, 0, Current_S, fontarrayP->pFontEnc, ustring[i], &mode, fontarrayP->pType1Data, DO_RASTER, strokewidth); /* fill the glyph-structure */ if (mode > 0) { sprintf( err_warn_msg_buf, "fontfcnB() set mode=%d", mode); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=mode; /* Make sure to free the region if it's non-NULL */ if (area){ KillRegion (area); } return(NULL); } if (area == NULL){ T1_PrintLog( "T1_SetString()", "area=NULL returned by fontfcnB()", T1LOG_WARNING); T1_errno=mode; return(NULL); } if (mode == FF_NOTDEF_SUBST) { sprintf( err_warn_msg_buf, "\".notdef\" substituted in string[%d] (=character %d) from font %d", i, ustring[i], FontID); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_WARNING); mode=0; flags[i]=1; /* indicates that .notdef has been substituted */ } h = area->ymax - area->ymin; w = area->xmax - area->xmin; if (h > 0 && w > 0) { /* bitmap contains pixels */ paddedW = PAD(w, T1_pad); memsize = h * paddedW / 8 + 1; currchar->bits = (char *)malloc(memsize*sizeof( char)); if (currchar->bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* Make sure to free up the region if it's non-NULL */ if (area){ KillRegion (area); } return(NULL); } (void) memset(currchar->bits, 0, memsize); fill(currchar->bits, h, paddedW, area, T1_byte, T1_bit, T1_wordsize ); } /* area valid -> set metrics in cache for that character */ currchar->metrics.leftSideBearing = area->xmin; currchar->metrics.advanceX = NEARESTPEL(area->ending.x - area->origin.x); currchar->metrics.advanceY = - NEARESTPEL(area->ending.y - area->origin.y); currchar->metrics.rightSideBearing = area->xmax; currchar->metrics.descent = - area->ymax; currchar->metrics.ascent = - area->ymin; currchar->bpp=1; /* By this point, it's clear that the 'area' struct exists, and that we no longer need it, so free it up. */ KillRegion (area); } } /* end of if ( ... ), needed characters are now in cache! */ } /* end of for (ipFontArray[FontID].pEncMap[(int) ustring[i]]; /* Advance to next character in high resolution */ if (ustring[i]==fontarrayP->space_position) h_anchor +=(int)spacewidth; /* check for a substituted char or notdef and get missing escapement */ else if (afm_ind==0) { /* Setup apropriate charspace matrix */ S=(struct XYspace *)IDENTITY; /* Make this permanent so that scaling it in fontfcnB_ByName will make a duplicate of it, and this duplicate can thus be safely destroyed. Fixes the somewhat smaller memory leak */ S=(struct XYspace *)Permanent (Transform(S, pFontBase->pFontArray[FontID].FontTransform[0], pFontBase->pFontArray[FontID].FontTransform[1], pFontBase->pFontArray[FontID].FontTransform[2], pFontBase->pFontArray[FontID].FontTransform[3])); /* Get metrics values */ area=fontfcnB_ByName( FontID, 0, S, ".notdef", &mode, pFontBase->pFontArray[FontID].pType1Data, DO_RASTER); if (area==NULL || mode!=0){ sprintf( err_warn_msg_buf, "Could not get charspace representation of \".notdef\", Font %d, mode=%d!", FontID, mode); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_ERROR); T1_errno=mode; return( NULL); } /* value to add to hanchor */ h_anchor +=NEARESTPEL(area->ending.x); /* make sure to free S */ if (S) { KillSpace (S); } /* make sure to free area */ if (area) { KillRegion (area); } } else{ currchar=&(font_ptr->pFontCache[ustring[i]]); pixel_h_anchor_corr[i]=((int)floor(h_anchor*factor+0.5)); /* Store maximum rsb ...*/ if ( pixel_h_anchor_corr[i]+currchar->metrics.rightSideBearing > rsb_max){ rsb_max=pixel_h_anchor_corr[i]+currchar->metrics.rightSideBearing; } /* ... and minimum lsb */ if ( pixel_h_anchor_corr[i]+currchar->metrics.leftSideBearing < lsb_min){ lsb_min=pixel_h_anchor_corr[i]+currchar->metrics.leftSideBearing; } /* Advance by current chars width */ /* h_anchor +=T1_GetCharWidth( FontID, ustring[i]); */ if (afm_ind>0) { /* we have a standard character */ h_anchor +=(fontarrayP->pAFMData->cmi[afm_ind-1].wx) * fontarrayP->extend; } else { /* afm_ind must be negative so that we have a composite char */ h_anchor +=(fontarrayP->pAFMData->ccd[-(afm_ind+1)].wx) * fontarrayP->extend; } /* If kerning, insert kerning amount */ if ((imetrics.ascent>overallascent) overallascent=currchar->metrics.ascent; if (currchar->metrics.descentmetrics.descent; } } string_glyph.metrics.advanceX=(int)floor(h_anchor*factor+0.5); /* We have to check for underlining and such things. They may affect the bounding box of the glyph */ if (modflag & T1_UNDERLINE){ T1_ComputeLineParameters( FontID, T1_UNDERLINE, string_glyph.metrics.advanceX, size, &underline_startx, &underline_endx, &underline_starty, &underline_endy); /* Check whether rsb is affected ...*/ if ( underline_endx > rsb_max){ rsb_max=underline_endx; } /* ... and for lsb */ if ( underline_startx < lsb_min){ lsb_min=underline_startx; } /* Vertical metrics may also be affected. */ if (underline_starty > overallascent) overallascent=underline_starty; if (underline_endy < overalldescent) overalldescent=underline_endy; } if (modflag & T1_OVERLINE){ T1_ComputeLineParameters( FontID, T1_OVERLINE, string_glyph.metrics.advanceX, size, &overline_startx, &overline_endx, &overline_starty, &overline_endy); /* Check whether rsb is affected ...*/ if ( overline_endx > rsb_max){ rsb_max=overline_endx; } /* ... and for lsb */ if ( overline_startx < lsb_min){ lsb_min=overline_startx; } /* Vertical metrics may also be affected. */ if (overline_starty > overallascent) overallascent=overline_starty; if (overline_endy < overalldescent) overalldescent=overline_endy; } if (modflag & T1_OVERSTRIKE){ T1_ComputeLineParameters( FontID, T1_OVERSTRIKE, string_glyph.metrics.advanceX, size, &overstrike_startx, &overstrike_endx, &overstrike_starty, &overstrike_endy); /* Check whether rsb is affected ...*/ if ( overstrike_endx > rsb_max){ rsb_max=overstrike_endx; } /* ... and for lsb */ if ( overstrike_startx < lsb_min){ lsb_min=overstrike_startx; } /* Vertical metrics may also be affected. */ if (overstrike_starty > overallascent) overallascent=overstrike_starty; if (overstrike_endy < overalldescent) overalldescent=overstrike_endy; } /* Set the string-glyphs' metrics: */ /* Bearings: */ string_glyph.metrics.rightSideBearing=rsb_max; string_glyph.metrics.leftSideBearing=lsb_min; /* ascent and descent: */ string_glyph.metrics.ascent=overallascent; string_glyph.metrics.descent=overalldescent; /* Now, allocate memory for the resulting bitmap and set it to 0: */ h=overallascent - overalldescent; w=string_glyph.metrics.rightSideBearing-string_glyph.metrics.leftSideBearing; paddedW = PAD( w, T1_pad); if ( h > 0 && w > 0){ memsize = h * paddedW / 8; /* We alloc some amount more in order to avoid alignment check in bit-blitting loop */ memsize += T1_pad/8; string_glyph.bits = (char *)malloc( memsize); if (string_glyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } else { /* We have only characters without pixels in the string -> we allow this and only set the advance width in the glyph. The bits pointer will be NULL. We reset rsb and lsb */ string_glyph.metrics.rightSideBearing=0; string_glyph.metrics.leftSideBearing=0; string_glyph.metrics.ascent=0; string_glyph.metrics.descent=0; } if (string_glyph.bits != NULL) { memset(string_glyph.bits, 0, memsize); /* Now comes the loop for bitmap blitting: */ for (i=0;ipFontCache[ustring[i]]); /* First, we have to correct the positioning values to refer to the bitmap BBox */ pixel_h_anchor_corr[i] -= lsb_min; pixel_h_anchor_corr[i] += currchar->metrics.leftSideBearing; /* Compute vertical anchor for current char-bitmap: */ v_anchor=overallascent - currchar->metrics.ascent; char_paddedW=PAD( currchar->metrics.rightSideBearing - currchar->metrics.leftSideBearing , T1_pad); /* We have to check for Big Endian. In that case, we have to act on byte-level */ if (T1_byte){ BitShift = pixel_h_anchor_corr[i] % 8; ByteOffset = pixel_h_anchor_corr[i] / 8; } else { BitShift = pixel_h_anchor_corr[i] % T1_pad; ByteOffset = pixel_h_anchor_corr[i] / T1_pad; if (T1_pad==32) ByteOffset *=4; else if (T1_pad==16) ByteOffset *=2; } #ifdef T1_AA_TYPE64 /* We compile this part only if long is 64 bits to be conform to ANSI C */ if (T1_pad==32 && T1_byte==0){ /* The following loop steps through the lines of the character bitmap: */ for (j=0;jmetrics.ascent-currchar->metrics.descent;j++){ Target_l= (unsigned T1_AA_TYPE32 *)(string_glyph.bits +((v_anchor+j)*paddedW/8) +ByteOffset); /* The following loop copies the scanline of a character bitmap: */ if (currchar->bits != NULL) { p_l = (unsigned T1_AA_TYPE32 *)(currchar->bits+(char_paddedW/8*j)); if (BitShift == 0) { for (k=char_paddedW >> 5; k; k--) *Target_l++ |= *p_l++; } else { for (k=0; k < char_paddedW / 32 ; k++){ BitBuf_l= ((T1_AA_TYPE64)(*p_l++)) << BitShift; *Target_l++ |= BitBuf_l; *Target_l |= BitBuf_l>>l_shift; } /* End of for ( .. ) stepping through columns */ } } /* End of if(currchar->bits != NULL) */ } /* End of for( .. ) steppin' through lines of char bitmap */ }/* end if (T1_pad==32) */ else #endif if (T1_pad==16 && T1_byte==0){ /* The following loop steps through the lines of the character bitmap: */ for (j=0;jmetrics.ascent-currchar->metrics.descent;j++){ Target_s= (unsigned T1_AA_TYPE16 *)(string_glyph.bits +((v_anchor+j)*paddedW/8) +ByteOffset); /* The following loop copies the scanline of a character bitmap: */ if (currchar->bits != NULL) { p_s = (unsigned T1_AA_TYPE16 *)(currchar->bits+(char_paddedW/8*j)); if (BitShift == 0) { for (k=char_paddedW >> 4; k; k--) *Target_s++ |= *p_s++; } else{ for (k=char_paddedW >> 4; k; k--){ BitBuf_s= ((T1_AA_TYPE32)(*p_s++))<>s_shift; } /* End of for ( .. ) stepping through columns */ } } /* End of if(currchar->bits != NULL) */ } /* End of for( .. ) steppin' through lines of char bitmap */ }/* end if (T1_pad==16 */ else{ /* T1_pad = 8 or Big Endian machine */ /* The following loop steps through the lines of the character bitmap: */ for (j=0;jmetrics.ascent-currchar->metrics.descent;j++){ Target_c= (unsigned char *)(string_glyph.bits +((v_anchor+j)*paddedW/8) +ByteOffset); /* The following loop copies the scanline of a character bitmap: */ if (currchar->bits != NULL) { p_c = (unsigned char *)(currchar->bits+(char_paddedW/8*j)); if (BitShift == 0){ for (k=char_paddedW >> 3; k; k--) *Target_c++ |= *p_c++; } else{ for (k=char_paddedW >> 3; k; k--){ BitBuf_c = ((T1_AA_TYPE16)(*p_c++)) << BitShift; *Target_c++ |= BitBuf_c; *Target_c |= BitBuf_c>>c_shift; } /* End of for ( .. ) stepping through columns */ } } /* End of if(currchar->bits != NULL) */ } /* End of for( .. ) steppin' through lines of char bitmap */ } /* end if (T1_pad==8) and/or BigEndian */ } } /* if (string_glyph.bits != NULL) */ /* We now put the underlining rule on the glyph */ if (modflag & T1_UNDERLINE){ start=-string_glyph.metrics.leftSideBearing; for (i=string_glyph.metrics.ascent-underline_starty; islant+0.5); middle = ((start+string_glyph.metrics.advanceX) / 8) - (start / 8); startmask = 0xFF << (start % 8); endmask = (char) ~(0xFF << ((start+string_glyph.metrics.advanceX) % 8)); Target_c= (unsigned char *)(string_glyph.bits +(i*paddedW/8) + (start / 8)); if (!Target_c) { continue; } j=middle; if (j == 0) *Target_c++ |= startmask & endmask; else { *Target_c++ |= startmask; while (--j > 0) *Target_c++ = (unsigned char) 0xFF; if ((endmask)) *Target_c |= endmask; } } } /* Put an overstrike rule on the glyph */ if (modflag & T1_OVERSTRIKE){ start=-string_glyph.metrics.leftSideBearing; for (i=string_glyph.metrics.ascent-overstrike_starty; islant+0.5); middle = ((start+string_glyph.metrics.advanceX) / 8) - (start / 8); startmask = 0xFF << (start % 8); endmask = (char) ~(0xFF << ((start+string_glyph.metrics.advanceX) % 8)); Target_c= (unsigned char *)(string_glyph.bits +(i*paddedW/8) + (start / 8)); if (!Target_c) { continue; } j=middle; if (j == 0) *Target_c++ |= startmask & endmask; else { *Target_c++ |= startmask; while (--j > 0) *Target_c++ = (unsigned char) 0xFF; if ((endmask)) *Target_c |= endmask; } } } /* Put an overline rule */ if (modflag & T1_OVERLINE){ start=-string_glyph.metrics.leftSideBearing; for (i=string_glyph.metrics.ascent-overline_starty; islant+0.5); middle = ((start+string_glyph.metrics.advanceX) / 8) - (start / 8); startmask = 0xFF << (start % 8); endmask = (char) ~(0xFF << ((start+string_glyph.metrics.advanceX) % 8)); Target_c= (unsigned char *)(string_glyph.bits +(i*paddedW/8) + (start / 8)); if (!Target_c) { continue; } j=middle; if (j == 0) *Target_c++ |= startmask & endmask; else { *Target_c++ |= startmask; while (--j > 0) *Target_c++ = (unsigned char) 0xFF; if ((endmask)) *Target_c |= endmask; } } } /* Check for writing direction and re-compute dimensions appropriately: */ if (modflag & T1_RIGHT_TO_LEFT){ string_glyph.metrics.advanceX *= -1; string_glyph.metrics.leftSideBearing += string_glyph.metrics.advanceX; string_glyph.metrics.rightSideBearing += string_glyph.metrics.advanceX; } return(&string_glyph); } /* end of "if (rot_flag==0.0)" */ /* fnt_ptr now points to the correct FontSizeDeps-struct => lets now raster the character */ mode=0; kern_pairs=(int *)calloc(no_chars, sizeof(int)); if ((modflag & T1_KERNING)) for (i=0; ipFontEnc, ustring, no_chars, &mode, fontarrayP->pType1Data, kern_pairs, spacewidth, DO_RASTER, strokewidth); KillSpace (Current_S); /* In all cases, free memory for kerning pairs */ free(kern_pairs); /* fill the string_glyph-structure */ if (mode > 0) { sprintf( err_warn_msg_buf, "fontfcnB() set mode=%d", mode); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=mode; /* make sure to get rid of area if it's there */ if (area){ KillRegion (area); } return(NULL); } if (area == NULL){ T1_PrintLog( "T1_SetString()", "area=NULL returned by fontfcnB()", T1LOG_WARNING); T1_errno=mode; return(NULL); } if (mode == FF_NOTDEF_SUBST) { sprintf( err_warn_msg_buf, "\".notdef\" substituted somewhere in string from font %d", FontID); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_WARNING); mode=0; } h = area->ymax - area->ymin; w = area->xmax - area->xmin; paddedW = PAD(w, T1_pad); if (h > 0 && w > 0) { memsize = h * paddedW / 8 + 1; /* This is for the users copy of the character, for security-reasons the original pointer to the cache area is not used. The entry string_glyph.bits is free'ed every time this function is called: */ string_glyph.bits = (char *)malloc(memsize*sizeof( char)); if (string_glyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* make sure to get rid of area if it's there */ if (area){ KillRegion (area); } /* it's safe to free this, since this is a rotated glyph and therefore it's a copy of the original one */ return(NULL); } } else { h = w = 0; area->xmin = area->xmax = 0; area->ymin = area->ymax = 0; } string_glyph.metrics.leftSideBearing=area->xmin; string_glyph.metrics.advanceX=NEARESTPEL(area->ending.x - area->origin.x); string_glyph.metrics.advanceY=-NEARESTPEL(area->ending.y - area->origin.y); string_glyph.metrics.rightSideBearing=area->xmax; string_glyph.metrics.descent=-area->ymax; string_glyph.metrics.ascent=-area->ymin; if (h > 0 && w > 0) { (void) memset(string_glyph.bits, 0, memsize); fill(string_glyph.bits, h, paddedW, area, T1_byte, T1_bit, T1_wordsize ); } else { /* We have no black pixels */ string_glyph.metrics.leftSideBearing=0; string_glyph.metrics.advanceX=NEARESTPEL(area->ending.x - area->origin.x); string_glyph.metrics.advanceY=-NEARESTPEL(area->ending.y - area->origin.y); string_glyph.metrics.rightSideBearing=0; string_glyph.metrics.descent=0; string_glyph.metrics.ascent=0; } /* make sure to get rid of area if it's there */ if (area){ KillRegion (area); } /* Check for writing direction and re-compute dimensions appropriately: */ if (modflag & T1_RIGHT_TO_LEFT){ string_glyph.metrics.advanceX *= -1; string_glyph.metrics.advanceY *= -1; string_glyph.metrics.leftSideBearing += string_glyph.metrics.advanceX; string_glyph.metrics.rightSideBearing += string_glyph.metrics.advanceX; string_glyph.metrics.descent += string_glyph.metrics.advanceY; string_glyph.metrics.ascent += string_glyph.metrics.advanceY; } return(&string_glyph); } void fill(dest, h, w, area, byte, bit, wordsize) register char *dest; /* destination bitmap */ int h,w; /* dimensions of 'dest', w padded */ register struct region *area; /* region to write to 'dest' */ int byte,bit; /* flags; LSBFirst or MSBFirst */ int wordsize; /* number of bits per word for LSB/MSB purposes */ { register struct edgelist *edge; /* for looping through edges */ register char *p; /* current scan line in 'dest' */ register int y; /* for looping through scans */ register int wbytes = w / 8; /* number of bytes in width */ register pel *leftP,*rightP; /* pointers to X values, left and right */ int xmin = area->xmin; /* upper left X */ int ymin = area->ymin; /* upper left Y */ for (edge = area->anchor; VALIDEDGE(edge); edge = edge->link->link) { p = dest + (edge->ymin - ymin) * wbytes; leftP = edge->xvalues; rightP = edge->link->xvalues; for (y = edge->ymin; y < edge->ymax; y++) { fillrun(p, *leftP++ - xmin , *rightP++ - xmin, bit); p += wbytes; } } /* Now, as an afterthought, we'll go reorganize if odd byte order requires it: */ /* We do not reorganize since t1lib internally always uses LSBFirst */ /* if ( 0 && wordsize != 8) { register int i; printf("Reorganizing data ..\n"); switch (wordsize) { case 16: { register unsigned short data,*p; p = (unsigned short *) dest; for (i = h * w /16; --i >= 0;) { data = *p; *p++ = (data << 8) + (data >> 8); } break; } case 64: case 32: { register ULONG data,*p; p = (ULONG *) dest; for (i = h * w / 32; --i >= 0;) { data = *p; *p++ = (data << 24) + (data >> 24) + (0xFF00 & (data >> 8)) + (0xFF0000 & (data << 8)); } if (wordsize == 64) { p = (ULONG *) dest; for (i = h * w / 64; --i >= 0;) { data = *p++; p[-1] = p[0]; *p++ = data; } } break; } default: abort("xiFill: unknown format"); } } */ } #define ALLONES 0xFF void fillrun(register char *p, pel x0, pel x1, int bit) { register int startmask,endmask; /* bits to set in first and last char*/ register int middle; /* number of chars between start and end + 1 */ if (x1 <= x0) return; middle = x1/8 - x0/8; p += x0/8; x0 &= 7; x1 &= 7; if (bit == LSBFirst) { startmask = ALLONES << x0; endmask = ~(ALLONES << x1); } else { startmask = ALLONES >> x0; endmask = ~(ALLONES >> x1); } if (middle == 0) *p++ |= startmask & endmask; else { *p++ |= startmask; while (--middle > 0){ *p++ = (unsigned char)ALLONES; } if (endmask) *p |= endmask; } } /* outline */ #undef CHECK_OUTLINEFILL #ifdef CHECK_OUTLINEFILL void fill(dest, h, w, area, byte, bit, wordsize) register char *dest; /* destination bitmap */ int h,w; /* dimensions of 'dest', w padded */ register struct region *area; /* region to write to 'dest' */ int byte,bit; /* flags; LSBFirst or MSBFirst */ int wordsize; /* number of bits per word for LSB/MSB purposes */ { register struct edgelist *edge; /* for looping through edges */ register char *p; /* current scan line in 'dest' */ register int y; /* for looping through scans */ register int wbytes = w / 8; /* number of bytes in width */ register pel *leftP,*rightP; /* pointers to X values, left and right */ int xmin = area->xmin; /* upper left X */ int ymin = area->ymin; /* upper left Y */ for (edge = area->anchor; VALIDEDGE(edge); edge = edge->link->link) { p = dest + (edge->ymin - ymin) * wbytes; leftP = edge->xvalues; rightP = edge->link->xvalues; printf("leftP=%d, RightP=%d,\n", *leftP, *rightP); for (y = edge->ymin; y < edge->ymax; y++) { printf("leftP=%d, RightP=%d,y=%d\n", *leftP, *rightP, y); fillrun(p, *leftP++ - xmin, *rightP++ - xmin, bit); p += wbytes; } } } #endif /* T1_CopyGlyph(): Make a copy of an existent glyph-structure to save it for later usage by the user. */ GLYPH *T1_CopyGlyph( GLYPH *glyph) { GLYPH *dest; long size; if (glyph==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } /* Assign padding value */ T1_pad=pFontBase->bitmap_pad; /* Allocate memory for struct: */ if ((dest=(GLYPH *)malloc(sizeof(GLYPH)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } /* Copy the structure members: */ *dest=*glyph; /* Allocate memory for bitmap, initialize pointer to it and copy bitmap: */ size=PAD((dest->metrics.rightSideBearing-dest->metrics.leftSideBearing)* glyph->bpp, T1_pad) / 8; size=size*(dest->metrics.ascent-dest->metrics.descent); /* We must check whether there's actually a bits-pointer different from NULL. If not omit the following step: */ if (glyph->bits!=NULL){ if ((dest->bits=(char *)malloc(size*sizeof(char)))==NULL){ free(dest); T1_errno=T1ERR_ALLOC_MEM; return(NULL); } memcpy(dest->bits,glyph->bits,size); } return(dest); } /* T1_DumpGlyph(): Dump a glyph-representation to stdout: */ void T1_DumpGlyph( GLYPH *glyph) { int i,j,h,w; /* i=line-index, j=column-index */ long paddedW; printf("Dataformat: T1_bit=%d, T1_byte=%d, T1_wordsize=%d, T1_pad=%d\n", T1_bit, T1_byte, T1_pad, T1_pad); if (glyph==NULL){ return; } h=glyph->metrics.ascent-glyph->metrics.descent; w=glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing; paddedW=PAD(w,T1_pad); printf("GlyphInfo: h=%d, w=%d, paddedW=%ld\n", h, w, paddedW); for ( i=0; ibits[i*paddedW/T1_pad+j], 1); else if (T1_pad==16) for (j=0; jbits)[i*paddedW/T1_pad+j], 1); } else for (j=0; jbits)[i*paddedW/T1_pad+j], 1); } printf("\n"); } } /* This function will essentially return the bounding box of the line-rule */ static void T1_ComputeLineParameters( int FontID, int mode, int width, float size, int *startx, int *endx, int *starty, int *endy) { float position=0.0, thickness=0.0; int startx1, startx2, endx1, endx2; if (mode & T1_UNDERLINE){ position=pFontBase->pFontArray[FontID].UndrLnPos * DeviceSpecifics.scale_y; thickness=pFontBase->pFontArray[FontID].UndrLnThick * DeviceSpecifics.scale_y; } else if (mode & T1_OVERLINE){ position=pFontBase->pFontArray[FontID].OvrLnPos * DeviceSpecifics.scale_y; thickness=pFontBase->pFontArray[FontID].OvrLnThick * DeviceSpecifics.scale_y; } else if (mode & T1_OVERSTRIKE){ position=pFontBase->pFontArray[FontID].OvrStrkPos * DeviceSpecifics.scale_y; thickness=pFontBase->pFontArray[FontID].OvrStrkThick * DeviceSpecifics.scale_y; } *starty=(int) floor((position+0.5*(thickness-DeviceSpecifics.y_resolution/1000.0)) *size/1000.0 +0.5 ); startx1=(int) floor(*starty*pFontBase->pFontArray[FontID].slant+0.5); *endy =*starty - (int) floor(thickness/1000.0*size+0.5); startx2=(int) floor(*endy*pFontBase->pFontArray[FontID].slant+0.5); *startx=startx1 < startx2 ? startx1 : startx2; endx1 = width + (int) floor(*starty*pFontBase->pFontArray[FontID].slant+0.5); endx2 = width + (int) floor(*endy*pFontBase->pFontArray[FontID].slant+0.5); *endx=endx1 < endx2 ? endx2 : endx1; /* We take care that at least one pixel is drawn */ if (*starty==*endy) *endy -=1; return; } /* The following function concatenates two glyphs. Optional offsets x_off, y_off are respected. By the function. If either glyph is NULL or the glyphs have distinct depth, NULL is returned. */ GLYPH *T1_ConcatGlyphs( GLYPH *glyph_1, GLYPH *glyph_2, int x_off, int y_off, int modflag) { int lsb1, lsb2, rsb1, rsb2; int advanceX1, advanceX2, advanceY1, advanceY2; int ascent1, ascent2, descent1, descent2; int rsb, lsb, ascent, descent, advanceX, advanceY; int vanchor, w, h, wscanline, wscanline1, wscanline2, bpp; int memsize, BitShift; GLYPH *glyph1, *glyph2; unsigned T1_AA_TYPE16 BitBuf_c; unsigned T1_AA_TYPE32 BitBuf_s; unsigned long BitBuf_l; /* This is only actually used if sizeof long = 8 */ int i, j, k; int ByteOffset; unsigned char *Target_c, *p_c; unsigned T1_AA_TYPE16 *Target_s, *p_s; unsigned T1_AA_TYPE32 *Target_l, *p_l; static GLYPH glyph={NULL,{0,0,0,0,0,0},NULL,1}; /* We handle the Right-To-Left concatenation the simple way: 1) Change the order of the two glyphs 2) Invert the sign of the y-part of the offset 3) Recalculate the dimensions of the resulating glyph. */ /* Check for writing direction and reorganize appropriately: */ if (modflag & T1_RIGHT_TO_LEFT){ glyph1=glyph_2; glyph2=glyph_1; y_off=-y_off; } else { glyph1=glyph_1; glyph2=glyph_2; } if (glyph1==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return( NULL); } if (glyph2==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return( NULL); } if (glyph1->bpp != glyph2->bpp){ T1_errno=T1ERR_INVALID_PARAMETER; return( NULL); } /* We have two glyph different from NULL */ /* Reset glyph, if necessary */ if (glyph.bits!=NULL){ free(glyph.bits); glyph.bits=NULL; } glyph.metrics.leftSideBearing=0; glyph.metrics.rightSideBearing=0; glyph.metrics.advanceX=0; glyph.metrics.advanceY=0; glyph.metrics.ascent=0; glyph.metrics.descent=0; glyph.pFontCacheInfo=NULL; glyph.bpp=1; /* Assign dimens */ lsb1=glyph1->metrics.leftSideBearing; rsb1=glyph1->metrics.rightSideBearing; ascent1=glyph1->metrics.ascent; descent1=glyph1->metrics.descent; advanceX1=glyph1->metrics.advanceX + x_off; advanceY1=glyph1->metrics.advanceY + y_off; lsb2=glyph2->metrics.leftSideBearing; rsb2=glyph2->metrics.rightSideBearing; ascent2=glyph2->metrics.ascent; descent2=glyph2->metrics.descent; advanceX2=glyph2->metrics.advanceX; advanceY2=glyph2->metrics.advanceY; lsb=lsb1 < lsb2+advanceX1 ? lsb1 : lsb2+advanceX1; rsb=rsb1 > rsb2+advanceX1 ? rsb1 : rsb2+advanceX1; ascent=ascent1 > ascent2+advanceY1 ? ascent1 : ascent2+advanceY1; descent=descent1 < descent2+advanceY1 ? descent1 : descent2+advanceY1; advanceX=advanceX1+advanceX2; advanceY=advanceY1+advanceY2; bpp=glyph1->bpp; w=rsb-lsb; h=ascent-descent; wscanline=PAD( w*bpp, T1_pad) / 8; wscanline1=PAD( (rsb1-lsb1)*bpp, T1_pad) / 8; wscanline2=PAD( (rsb2-lsb2)*bpp, T1_pad) / 8; memsize=wscanline*h; if ((glyph.bits=(char *)calloc( memsize + 1, sizeof(unsigned char)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } if (bpp==1){ if (T1_pad==32 && T1_byte==0 && sizeof(long)==8){ /* The following loop steps through the lines of the first glyph: */ vanchor=ascent-ascent1; BitShift=(lsb1-lsb) % 32; ByteOffset=(lsb1-lsb)/32*4; for ( i=0; ibits+(wscanline1*i)); if (BitShift == 0){ for (k=wscanline1/4; k; k--) *Target_l++ |= *p_l++; } else{ for (k=wscanline1/4; k; k--){ BitBuf_l = ((long)*p_l++) << BitShift; *Target_l++ |= BitBuf_l; *Target_l |= BitBuf_l>>l_shift; } } } /* The following loop steps through the lines of the second glyph: */ vanchor=ascent-(ascent2+advanceY1); BitShift=(lsb2+advanceX1-lsb) % 32; ByteOffset=(lsb2+advanceX1-lsb)/32*4; for ( i=0; ibits+(wscanline2*i)); if (BitShift == 0){ for (k=wscanline2/4; k; k--) *Target_l++ |= *p_l++; } else{ for (k=wscanline2/4; k; k--){ BitBuf_l = ((long)*p_l++) << BitShift; *Target_l++ |= BitBuf_l; *Target_l |= BitBuf_l>>l_shift; } } } } else if(T1_pad==16 && T1_byte==0){ /* The following loop steps through the lines of the first glyph: */ vanchor=ascent-ascent1; BitShift=(lsb1-lsb) % 16; ByteOffset=(lsb1-lsb)/16*2; for ( i=0; ibits+(wscanline1*i)); if (BitShift == 0){ for (k=wscanline1/2; k; k--) *Target_s++ |= *p_s++; } else{ for (k=wscanline1/2; k; k--){ BitBuf_s = ((T1_AA_TYPE32)*p_s++) << BitShift; *Target_s++ |= BitBuf_s; *Target_s |= BitBuf_s>>s_shift; } } } /* The following loop steps through the lines of the second glyph: */ vanchor=ascent-(ascent2+advanceY1); BitShift=(lsb2+advanceX1-lsb) % 16; ByteOffset=(lsb2+advanceX1-lsb)/16*2; for ( i=0; ibits+(wscanline2*i)); if (BitShift == 0){ for (k=wscanline2/2; k; k--) *Target_s++ |= *p_s++; } else{ for (k=wscanline2/2; k; k--){ BitBuf_s = ((T1_AA_TYPE32)*p_s++) << BitShift; *Target_s++ |= BitBuf_s; *Target_s |= BitBuf_s>>s_shift; } } } } else{ /* T1_pad==8 or Big Endian machine */ /* The following loop steps through the lines of the first glyph: */ vanchor=ascent-ascent1; BitShift=(lsb1-lsb) % 8; ByteOffset=(lsb1-lsb) / 8; for ( i=0; ibits+(wscanline1*i)); if (BitShift == 0){ for (k=wscanline1; k; k--) *Target_c++ |= *p_c++; } else{ for (k=wscanline1; k; k--){ BitBuf_c = ((T1_AA_TYPE16)*p_c++) << BitShift; *Target_c++ |= BitBuf_c; *Target_c |= BitBuf_c>>c_shift; } } } /* The following loop steps through the lines of the second glyph: */ vanchor=ascent-(ascent2+advanceY1); BitShift=(lsb2+advanceX1-lsb) % 8; ByteOffset=(lsb2+advanceX1-lsb) / 8; for ( i=0; ibits+(wscanline2*i)); if (BitShift == 0){ for (k=wscanline2; k; k--) *Target_c++ |= *p_c++; } else{ for (k=wscanline2; k; k--){ BitBuf_c = ((T1_AA_TYPE16)*p_c++) << BitShift; *Target_c++ |= BitBuf_c; *Target_c |= BitBuf_c>>c_shift; } } } } } /* end of if (bpp==1) ... */ else if (bpp==8){ /* Set background */ for ( i=0; ibits+(wscanline1*i)); memcpy( Target_c, p_c, (rsb1-lsb1)); } /* The following loop steps through the lines of the second glyph. Note that we only set the pixel if it is not background! */ vanchor=ascent-(ascent2+advanceY1); for ( i=0; ibits+(wscanline2*i)); for (j=0; j<(rsb2-lsb2); j++) if (p_c[j] != (unsigned char) T1aa_bg) Target_c[j]=p_c[j]; } } /* end of if (bpp==8) ... */ else if (bpp==16){ /* Set background */ for ( i=0; ibits+(wscanline1*i)); memcpy( Target_s, p_s, (rsb1-lsb1)*2); } /* The following loop steps through the lines of the second glyph. Note that we only set the pixel if it is not background! */ vanchor=ascent-(ascent2+advanceY1); for ( i=0; ibits+(wscanline2*i)); for (j=0; j<(rsb2-lsb2); j++) if (p_s[j] != (unsigned T1_AA_TYPE16) T1aa_bg) Target_s[j]=p_s[j]; } } /* end of if (bpp==16) ... */ else if (bpp==32){ /* Set background */ for ( i=0; ibits+(wscanline1*i)); memcpy( Target_l, p_l, (rsb1-lsb1)*4); } /* The following loop steps through the lines of the second glyph. Note that we only set the pixel if it is not background! */ vanchor=ascent-(ascent2+advanceY1); for ( i=0; ibits+(wscanline2*i)); for (j=0; j<(rsb2-lsb2); j++) if (p_l[j] != (unsigned T1_AA_TYPE32) T1aa_bg) Target_l[j]=p_l[j]; } } /* end of if (bpp==32) ... */ /* Check for writing direction and re-compute dimens appropriately: */ if (modflag & T1_RIGHT_TO_LEFT){ advanceX=-advanceX1-advanceX2; advanceY=-advanceY1-advanceY2; lsb=lsb1 < lsb2+advanceX1 ? advanceX+lsb1 : advanceX+lsb2+advanceX1; rsb=rsb1 > rsb2+advanceX1 ? advanceX+rsb1 : advanceX+rsb2+advanceX1; ascent=ascent1 > ascent2+advanceY1 ? ascent1 : ascent2+advanceY1; descent=descent1 < descent2+advanceY1 ? descent1 : descent2+advanceY1; ascent += advanceY; descent += advanceY; } glyph.metrics.leftSideBearing=lsb; glyph.metrics.rightSideBearing=rsb; glyph.metrics.advanceX=advanceX; glyph.metrics.advanceY=advanceY; glyph.metrics.ascent=ascent; glyph.metrics.descent=descent; glyph.bpp=bpp; /* printf("lsb=%d, rsb=%d, adX=%d, adY=%d asc=%d, desc=%d\n", glyph.metrics.leftSideBearing, glyph.metrics.rightSideBearing, glyph.metrics.advanceX, glyph.metrics.advanceY, glyph.metrics.ascent, glyph.metrics.descent ); */ return( &glyph); } /* T1_FillOutline(): Create a filled glyph from an outline description */ GLYPH *T1_FillOutline( T1_OUTLINE *path, int modflag) { struct region *area=NULL; static GLYPH glyph={NULL,{0,0,0,0,0,0},NULL,1}; volatile int memsize=0; int i; LONG h,w; LONG paddedW; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_FillOutline()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } /* Reset character glyph, if necessary */ if (glyph.bits!=NULL){ free(glyph.bits); glyph.bits=NULL; } glyph.metrics.leftSideBearing=0; glyph.metrics.rightSideBearing=0; glyph.metrics.advanceX=0; glyph.metrics.advanceY=0; glyph.metrics.ascent=0; glyph.metrics.descent=0; glyph.pFontCacheInfo=NULL; glyph.bpp=1; /* Assign padding value */ T1_pad=pFontBase->bitmap_pad; if (pFontBase->endian) T1_byte=1; else T1_byte=0; T1_wordsize=T1_pad; /* Create a region from outline */ area=(struct region *)Interior( (struct segment *)path, WINDINGRULE+CONTINUITY); /* fill the glyph-structure */ if (area == NULL){ T1_PrintLog( "T1_FillOutline()", "area=NULL returned by Interior()", T1LOG_WARNING); T1_errno=1000; return(NULL); } h = area->ymax - area->ymin; w = area->xmax - area->xmin; paddedW = PAD(w, T1_pad); if ( (area->xmin > area->xmax) || (area->ymin > area->ymax) ){ /* There was a character like .notdef or space, that didn't produce any black pixels on the bitmap! -> we return a glyph with correct metrics and bitmap pointer set to NULL */ sprintf( err_warn_msg_buf, "No black pixels in outline %p", path); T1_PrintLog( "T1_FillOutline()", err_warn_msg_buf, T1LOG_WARNING); glyph.metrics.leftSideBearing = 0; glyph.metrics.advanceX = NEARESTPEL(area->ending.x - area->origin.x); glyph.metrics.advanceY = - NEARESTPEL(area->ending.y - area->origin.y); glyph.metrics.rightSideBearing = 0; glyph.metrics.descent = 0; glyph.metrics.ascent = 0; /* make sure to get rid of 'area' before leaving! */ KillRegion (area); return( &glyph); } if (h > 0 && w > 0) { memsize = h * paddedW / 8 + 1; /* This is for the users copy of the character, for security-reasons the original pointer to the cache area is not used. The entry glyph.bits is free'ed every time this function is called: */ glyph.bits = (char *)malloc(memsize*sizeof( char)); if (glyph.bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; /* make sure to get rid of area if it's there */ if (area){ KillRegion (area); } return(NULL); } } else { h = w = 0; area->xmin = area->xmax = 0; area->ymin = area->ymax = 0; } glyph.metrics.leftSideBearing = area->xmin; glyph.metrics.advanceX = NEARESTPEL(area->ending.x - area->origin.x); glyph.metrics.advanceY = - NEARESTPEL(area->ending.y - area->origin.y); glyph.metrics.rightSideBearing = area->xmax; glyph.metrics.descent = - area->ymax; glyph.metrics.ascent = - area->ymin; if (h > 0 && w > 0) { (void) memset(glyph.bits, 0, memsize); fill(glyph.bits, h, paddedW, area, T1_byte, T1_bit, T1_wordsize ); } /* Check for writing direction and re-compute dimensions appropriately: */ if (modflag & T1_RIGHT_TO_LEFT){ glyph.metrics.advanceX *= -1; glyph.metrics.advanceY *= -1; glyph.metrics.leftSideBearing += glyph.metrics.advanceX; glyph.metrics.rightSideBearing += glyph.metrics.advanceX; glyph.metrics.descent += glyph.metrics.advanceY; glyph.metrics.ascent += glyph.metrics.advanceY; } /* make sure to get rid of area if it's there */ if (area){ KillRegion (area); } return( &glyph); } /* T1_SetRect(): Raster a rectangle, whose size is given in charspace units. The resulting glyph does not cause any escapement. */ GLYPH* T1_SetRect( int FontID, float size, float width, float height, T1_TMATRIX *transform) { int i; int mode; struct region *area; struct XYspace *Current_S; float strokewidth = 0.0f; FONTSIZEDEPS *font_ptr; FONTPRIVATE *fontarrayP; volatile int memsize=0; LONG h,w; LONG paddedW; static GLYPH glyph={NULL,{0,0,0,0,0,0},NULL,1}; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_SetRect()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } font_ptr = NULL; /* Reset character glyph, if necessary */ if (glyph.bits!=NULL){ free(glyph.bits); glyph.bits=NULL; } glyph.metrics.leftSideBearing=0; glyph.metrics.rightSideBearing=0; glyph.metrics.advanceX=0; glyph.metrics.advanceY=0; glyph.metrics.ascent=0; glyph.metrics.descent=0; glyph.pFontCacheInfo=NULL; glyph.bpp=1; /* First, check for a correct ID. */ i=T1_CheckForFontID(FontID); if ( i == -1 ) { return NULL; } /* if necessary load font into memory */ if ( i == 0 ) if ( T1_LoadFont( FontID) ) return NULL; /* Check for valid size */ if (size<=0.0){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } /* Assign padding value */ T1_pad=pFontBase->bitmap_pad; if (pFontBase->endian) T1_byte=1; else T1_byte=0; T1_wordsize=T1_pad; if ( i > 0 ) { /* FontID identifies a valid font */ fontarrayP = &(pFontBase->pFontArray[FontID]); /* Check for size and create it if necessary */ if ((font_ptr=T1int_QueryFontSize( FontID, size, NO_ANTIALIAS))==NULL){ font_ptr=T1int_CreateNewFontSize( FontID, size, NO_ANTIALIAS); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } /* handle stroking stuff */ if ( fontarrayP->info_flags & RASTER_STROKED) { strokewidth = pFontBase->pFontArray[FontID].StrokeWidth; } else { strokewidth = 0.0f; } } else { fontarrayP = NULL; strokewidth = 0.0f; } /* Setup an appropriate charspace matrix. Note that the rasterizer assumes vertical values with inverted sign! Transformation should create a copy of the local charspace matrix which then still has to be made permanent. */ if ( transform != NULL ) { Current_S = (struct XYspace *) Permanent(Scale(Transform (font_ptr->pCharSpaceLocal, transform->cxx, - transform->cxy, transform->cyx, - transform->cyy), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } else{ Current_S = (struct XYspace *) Permanent(Scale(Transform(font_ptr->pCharSpaceLocal, 1.0, 0.0, 0.0, -1.0), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } mode=0; area=fontfcnRect( width, height, Current_S, &mode, DO_RASTER, strokewidth); KillSpace (Current_S); /* fill the glyph-structure */ if ( mode > 0 ) { sprintf( err_warn_msg_buf, "fontfcnRect() set mode=%d", mode); T1_PrintLog( "T1_SetRect()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=mode; return(NULL); } if ( area == NULL ) { T1_PrintLog( "T1_SetRect()", "area=NULL returned by fontfcnRect()", T1LOG_WARNING); T1_errno=mode; return(NULL); } h = area->ymax - area->ymin; w = area->xmax - area->xmin; paddedW = PAD(w, T1_pad); if (h > 0 && w > 0) { memsize = h * paddedW / 8 + 1; /* This is for the users copy of the character, for security-reasons the original pointer to the cache area is not used. The entry glyph.bits is free'ed every time this function is called: */ glyph.bits = (char *)malloc(memsize*sizeof( char)); if ( glyph.bits == NULL ) { T1_errno=T1ERR_ALLOC_MEM; /* make sure to get rid of 'area' before leaving! */ KillRegion (area); return(NULL); } } else { h = w = 0; area->xmin = area->xmax = 0; area->ymin = area->ymax = 0; } /* Assign metrics */ glyph.metrics.leftSideBearing = area->xmin; glyph.metrics.advanceX = NEARESTPEL(area->ending.x - area->origin.x); glyph.metrics.advanceY = - NEARESTPEL(area->ending.y - area->origin.y); glyph.metrics.rightSideBearing = area->xmax; glyph.metrics.descent = - area->ymax; glyph.metrics.ascent = - area->ymin; if (h > 0 && w > 0) { (void) memset(glyph.bits, 0, memsize); fill(glyph.bits, h, paddedW, area, T1_byte, T1_bit, T1_wordsize ); } /* make sure to get rid of 'area' before leaving! */ KillRegion (area); return(&glyph); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1outline.c0000664000175000017500000005472411742726712023401 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1outline.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2005-05-01 ----- Description: This file is part of the t1-library. It contains functions for getting glyph outline descriptions of strings and characters. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1OUTLINE_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/paths.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1set.h" #include "t1load.h" #include "t1finfo.h" #include "t1misc.h" #include "t1base.h" #include "t1outline.h" /* As a fall back */ #ifndef T1_AA_TYPE16 #define T1_AA_TYPE16 short #endif #ifndef T1_AA_TYPE32 #define T1_AA_TYPE32 int #endif extern char *t1_get_abort_message( int number); extern struct segment *Type1Line(psfont *env, struct XYspace *S, float line_position, float line_thickness, float line_length); extern struct segment *t1_Join( struct segment *path1, struct segment *path2); extern struct segment *CopyPath( struct segment *p); extern void KillPath( struct segment *p); /* T1_SetChar(...): Generate the bitmap for a character */ T1_OUTLINE *T1_GetCharOutline( int FontID, char charcode, float size, T1_TMATRIX *transform) { int i; int mode; T1_PATHSEGMENT *charpath; struct XYspace *Current_S; unsigned char ucharcode; FONTSIZEDEPS *font_ptr; FONTPRIVATE *fontarrayP; /* We don't implement underlining for characters, but the rasterer implements it. Thus, we use a modflag of constant 0 */ int modflag=0; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_GetCharOutline()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } ucharcode=(unsigned char)charcode; /* First, check for a correct ID */ i=T1_CheckForFontID(FontID); if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* if necessary load font into memory */ if (i==0) if (T1_LoadFont(FontID)) return(NULL); /* Check for valid size */ if (size<=0.0){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } fontarrayP=&(pFontBase->pFontArray[FontID]); /* font is now loaded into memory => Check for size: */ if ((font_ptr=T1int_QueryFontSize( FontID, size, NO_ANTIALIAS))==NULL){ font_ptr=T1int_CreateNewFontSize( FontID, size, NO_ANTIALIAS); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } /* Setup an appropriate charspace matrix. Note that the rasterizer assumes vertical values with inverted sign! Transformation should create a copy of the local charspace matrix which then still has to be made permanent. */ if (transform!=NULL) { Current_S=(struct XYspace *) Permanent(Scale(Transform (font_ptr->pCharSpaceLocal, transform->cxx, - transform->cxy, transform->cyx, - transform->cyy), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } else{ Current_S=(struct XYspace *) Permanent(Scale(Transform(font_ptr->pCharSpaceLocal, 1.0, 0.0, 0.0, -1.0), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } /* fnt_ptr now points to the correct FontSizeDeps-struct => lets now raster the character */ mode=0; charpath=(T1_PATHSEGMENT *)fontfcnB( FontID, modflag, Current_S, fontarrayP->pFontEnc, ucharcode, &mode, fontarrayP->pType1Data, DO_NOT_RASTER,0.0f); KillSpace (Current_S); return((T1_OUTLINE *)charpath); } /* T1_GetStringOutline(...): Generate the outline for a string of characters */ T1_OUTLINE *T1_GetStringOutline( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform) { int i; int mode; /* initialize this to NULL just to be on the safe side */ T1_PATHSEGMENT *charpath = NULL; struct XYspace *Current_S; int *kern_pairs; /* use for accessing the kern pairs if kerning is requested */ int no_chars=0; /* The number of characters in the string */ static int lastno_chars=0; long spacewidth; /* This is given to fontfcnb_string() */ FONTSIZEDEPS *font_ptr; FONTPRIVATE *fontarrayP; static int *pixel_h_anchor_corr=NULL; static int *flags=NULL; unsigned char *ustring; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_GetStringOutline()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } /* force string elements into unsigned */ ustring=(unsigned char*)string; /* First, check for a correct ID */ i=T1_CheckForFontID(FontID); if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* if necessary load font into memory */ if (i==0) if (T1_LoadFont(FontID)) return(NULL); /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return(NULL); } /* Check for valid size */ if (size<=0.0){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } fontarrayP=&(pFontBase->pFontArray[FontID]); /* font is now loaded into memory => Check for size: */ if ((font_ptr=T1int_QueryFontSize( FontID, size, NO_ANTIALIAS))==NULL){ font_ptr=T1int_CreateNewFontSize( FontID, size, NO_ANTIALIAS); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } /* Now comes string specific stuff: Get length of string and create an array of integers where to store the bitmap positioning dimens: */ if (len<0){ /* invalid length */ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } if (len==0) /* should be computed assuming "normal" 0-terminated string */ no_chars=strlen(string); else /* use value given on command line */ no_chars=len; /* If necessary, allocate memory */ if (no_chars>lastno_chars){ if (pixel_h_anchor_corr!=NULL){ free(pixel_h_anchor_corr); } if (flags!=NULL){ free(flags); } pixel_h_anchor_corr=(int *)calloc(no_chars, sizeof(int)); flags=(int *)calloc(no_chars, sizeof(int)); lastno_chars=no_chars; } else{ /* Reset flags and position array */ for (i=0; ipCharSpaceLocal, transform->cxx, - transform->cxy, transform->cyx, - transform->cyy), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } else{ Current_S=(struct XYspace *) Permanent(Scale(Transform(font_ptr->pCharSpaceLocal, 1.0, 0.0, 0.0, -1.0), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } /* Compute the correct spacewidth value (in charspace units). The value supplied by the user is interpreted as an offset in char space units: */ spacewidth=T1_GetCharWidth(FontID,fontarrayP->space_position)+spaceoff; mode=0; kern_pairs=(int *)calloc(no_chars, sizeof(int)); if ((modflag & T1_KERNING)) for (i=0; ipFontEnc, (unsigned char *)string, no_chars, &mode, fontarrayP->pType1Data, kern_pairs, spacewidth, DO_NOT_RASTER,0.0f); KillSpace (Current_S); /* In all cases, free memory for kerning pairs */ free(kern_pairs); /* fill the string_glyph-structure */ if (mode != 0) { sprintf( err_warn_msg_buf, "fontfcnB_string() set mode=%d", mode); T1_PrintLog( "T1_GetStringOutline()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=mode; /* make sure to get rid of path if it's there */ if (charpath){ KillRegion (charpath); } return(NULL); } if (charpath == NULL){ T1_PrintLog( "T1_GetStringOutline()", "path=NULL returned by fontfcnB_string()", T1LOG_WARNING); T1_errno=mode; return(NULL); } return( (T1_OUTLINE *)charpath); } /* T1_GetMoveOutline(...): Generate the "outline" for a movement */ T1_OUTLINE *T1_GetMoveOutline( int FontID, int deltax, int deltay, int modflag, float size, T1_TMATRIX *transform) { int i; FONTSIZEDEPS *font_ptr; struct segment *path, *tmppath; struct XYspace *Current_S; psfont *FontP; float length; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_GetMoveOutline()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } /* First, check for a correct ID */ i=T1_CheckForFontID(FontID); if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* if necessary load font into memory */ if (i==0) if (T1_LoadFont(FontID)) return(NULL); /* Check for valid size */ if (size<=0.0){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } FontP=pFontBase->pFontArray[i].pType1Data; /* font is now loaded into memory => Check for size: */ if ((font_ptr=T1int_QueryFontSize( FontID, size, NO_ANTIALIAS))==NULL){ font_ptr=T1int_CreateNewFontSize( FontID, size, NO_ANTIALIAS); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } /* Setup an appropriate charspace matrix. Note that the rasterizer assumes vertical values with inverted sign! Transformation should create a copy of the local charspace matrix which then still has to be made permanent. */ if (transform!=NULL){ Current_S=(struct XYspace *) Permanent(Scale(Transform (font_ptr->pCharSpaceLocal, transform->cxx, - transform->cxy, transform->cyx, - transform->cyy), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } else{ Current_S=(struct XYspace *) Permanent(Scale(Transform(font_ptr->pCharSpaceLocal, 1.0, 0.0, 0.0, -1.0), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } path=(struct segment *)ILoc( Current_S, deltax, deltay); /* Take care for underlining and such */ length=(float) deltax; if (modflag & T1_UNDERLINE){ tmppath=(struct segment *)Type1Line(FontP,Current_S, pFontBase->pFontArray[FontID].UndrLnPos, pFontBase->pFontArray[FontID].UndrLnThick, length); path=(struct segment *)Join(path,tmppath); } if (modflag & T1_OVERLINE){ tmppath=(struct segment *)Type1Line(FontP,Current_S, pFontBase->pFontArray[FontID].OvrLnPos, pFontBase->pFontArray[FontID].OvrLnThick, length); path=(struct segment *)Join(path,tmppath); } if (modflag & T1_OVERSTRIKE){ tmppath=(struct segment *)Type1Line(FontP,Current_S, pFontBase->pFontArray[FontID].OvrStrkPos, pFontBase->pFontArray[FontID].OvrStrkThick, length); path=(struct segment *)Join(path,tmppath); } KillSpace( Current_S); return( (T1_OUTLINE *)path); } /* T1_ConcatOutlines(): Concatenate two outline to one path */ T1_OUTLINE *T1_ConcatOutlines( T1_OUTLINE *path1, T1_OUTLINE *path2) { return( (T1_OUTLINE *) t1_Join( (struct segment *) path1, (struct segment *) path2)); } /* T1_ScaleOutline(): Scale an outline */ T1_OUTLINE *T1_ScaleOutline( T1_OUTLINE *path, float scale) { struct segment *ipath; /* Step through the path list */ ipath=(struct segment *)path; do { if (ipath->type==LINETYPE){ ipath->dest.x = (fractpel) (ipath->dest.x * scale); ipath->dest.y = (fractpel) (ipath->dest.y * scale); } if (ipath->type==CONICTYPE){ ((struct conicsegment *)ipath)->dest.x = (fractpel) ((struct conicsegment *)ipath)->dest.x * scale; ((struct conicsegment *)ipath)->dest.y = (fractpel) ((struct conicsegment *)ipath)->dest.y * scale; ((struct conicsegment *)ipath)->M.x = (fractpel) ((struct conicsegment *)ipath)->M.x * scale; ((struct conicsegment *)ipath)->M.y = (fractpel) ((struct conicsegment *)ipath)->M.y * scale; } if (ipath->type==MOVETYPE){ ipath->dest.x = (fractpel) (ipath->dest.x * scale); ipath->dest.y = (fractpel) (ipath->dest.y * scale); } if (ipath->type==BEZIERTYPE){ ((struct beziersegment *)ipath)->B.x = (fractpel) (((struct beziersegment *)ipath)->B.x * scale); ((struct beziersegment *)ipath)->B.y = (fractpel) (((struct beziersegment *)ipath)->B.y * scale); ((struct beziersegment *)ipath)->C.x = (fractpel) (((struct beziersegment *)ipath)->C.x * scale); ((struct beziersegment *)ipath)->C.y = (fractpel) (((struct beziersegment *)ipath)->C.y * scale); ((struct beziersegment *)ipath)->dest.x = (fractpel) (((struct beziersegment *)ipath)->dest.x * scale); ((struct beziersegment *)ipath)->dest.y = (fractpel) (((struct beziersegment *)ipath)->dest.y * scale); } if (ipath->type==HINTTYPE){ ((struct hintsegment *)ipath)->dest.x = (fractpel) (((struct hintsegment *)ipath)->dest.x * scale); ((struct hintsegment *)ipath)->dest.y = (fractpel) (((struct hintsegment *)ipath)->dest.y * scale); ((struct hintsegment *)ipath)->ref.x = (fractpel) (((struct hintsegment *)ipath)->ref.x * scale); ((struct hintsegment *)ipath)->ref.y = (fractpel) (((struct hintsegment *)ipath)->ref.y * scale); ((struct hintsegment *)ipath)->width.x = (fractpel) (((struct hintsegment *)ipath)->width.x * scale); ((struct hintsegment *)ipath)->width.y = (fractpel) (((struct hintsegment *)ipath)->width.y * scale); } if (ipath->type==TEXTTYPE) ; ipath=ipath->link; } while (ipath!=NULL); return( path); } /* dump a description of path elements to stdout */ void T1_DumpPath( T1_OUTLINE *path) { struct segment *ipath; /* Step through the path list */ ipath=(struct segment *)path; do { if (ipath->type==LINETYPE){ printf("Line-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); } if (ipath->type==MOVETYPE){ printf("Move-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); } if (ipath->type==BEZIERTYPE){ printf("Bezier-Segment: ... (%f,%f) ... (%f,%f) -> (%f,%f)\n", (((struct beziersegment *)ipath)->B.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->B.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->C.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->C.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->dest.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->dest.y)/(double)(0xFFFF)); } ipath=ipath->link; } while (ipath!=NULL); } /* convert a relative path to an absolute path */ void T1_AbsolutePath( T1_OUTLINE *rpath) { struct segment *ipath; fractpel xcurr=0, ycurr=0; /* Step through the path list */ ipath=(struct segment *)rpath; do { if (ipath->type==LINETYPE){ ipath->dest.x +=xcurr; ipath->dest.y +=ycurr; #ifdef PRINT_PATHS_TO_STDOUT printf("Line-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); #endif xcurr=ipath->dest.x; ycurr=ipath->dest.y; } if (ipath->type==MOVETYPE){ ipath->dest.x +=xcurr; ipath->dest.y +=ycurr; #ifdef PRINT_PATHS_TO_STDOUT printf("Move-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); #endif xcurr=ipath->dest.x; ycurr=ipath->dest.y; } if (ipath->type==BEZIERTYPE){ ((struct beziersegment *)ipath)->B.x +=xcurr; ((struct beziersegment *)ipath)->B.y +=ycurr; ((struct beziersegment *)ipath)->C.x +=xcurr; ((struct beziersegment *)ipath)->C.y +=ycurr; ipath->dest.x +=xcurr; ipath->dest.y +=ycurr; #ifdef PRINT_PATHS_TO_STDOUT printf("Bezier-Segment: ... (%f,%f) ... (%f,%f) -> (%f,%f)\n", (((struct beziersegment *)ipath)->B.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->B.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->C.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->C.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->dest.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->dest.y)/(double)(0xFFFF)); #endif xcurr=ipath->dest.x; ycurr=ipath->dest.y; } ipath=ipath->link; } while (ipath!=NULL); } /* convert path into a relative path as needed by the rasterizer */ void T1_RelativePath( T1_OUTLINE *apath) { struct segment *ipath; fractpel xcurr=0, ycurr=0; /* Step through the path list */ ipath=(struct segment *)apath; do { if (ipath->type==LINETYPE){ ipath->dest.x -=xcurr; ipath->dest.y -=ycurr; xcurr +=ipath->dest.x; ycurr +=ipath->dest.y; #ifdef PRINT_PATHS_TO_STDOUT printf("Line-Segment: -> (%f,%f), curr=(%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF), xcurr/(double)(0xFFFF), -ycurr/(double)(0xFFFF)); #endif } if (ipath->type==MOVETYPE){ ipath->dest.x -=xcurr; ipath->dest.y -=ycurr; xcurr +=ipath->dest.x; ycurr +=ipath->dest.y; #ifdef PRINT_PATHS_TO_STDOUT printf("Move-Segment: -> (%f,%f), curr=(%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF), xcurr/(double)(0xFFFF), -ycurr/(double)(0xFFFF)); #endif } if (ipath->type==BEZIERTYPE){ ipath->dest.x -=xcurr; ipath->dest.y -=ycurr; ((struct beziersegment *)ipath)->C.x -=xcurr; ((struct beziersegment *)ipath)->C.y -=ycurr; ((struct beziersegment *)ipath)->B.x -=xcurr; ((struct beziersegment *)ipath)->B.y -=ycurr; xcurr +=ipath->dest.x; ycurr +=ipath->dest.y; #ifdef PRINT_PATHS_TO_STDOUT printf("Bezier-Segment: ... (%f,%f) ... (%f,%f) -> (%f,%f)\n", (((struct beziersegment *)ipath)->B.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->B.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->C.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->C.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->dest.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->dest.y)/(double)(0xFFFF)); #endif } ipath=ipath->link; } while (ipath!=NULL); } /* maniuplate the coordinata points of a path */ void T1_ManipulatePath( T1_OUTLINE *path, void (*manipulate)(fractpel *x,fractpel *y,int type)) { struct segment *ipath; /* Step through the path list */ ipath=(struct segment *)path; do { if (ipath->type==LINETYPE){ manipulate( &(ipath->dest.x), &ipath->dest.y, LINETYPE); #ifdef PRINT_PATHS_TO_STDOUT printf("Line-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); #endif } if (ipath->type==MOVETYPE){ manipulate( &(ipath->dest.x), &ipath->dest.y, MOVETYPE); #ifdef PRINT_PATHS_TO_STDOUT printf("Move-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); #endif } if (ipath->type==BEZIERTYPE){ manipulate( &((struct beziersegment *)ipath)->B.x, &((struct beziersegment *)ipath)->B.y, BEZIERTYPE); manipulate( &((struct beziersegment *)ipath)->C.x, &((struct beziersegment *)ipath)->C.y, BEZIERTYPE); manipulate( &((struct beziersegment *)ipath)->dest.x, &((struct beziersegment *)ipath)->dest.y, BEZIERTYPE); #ifdef PRINT_PATHS_TO_STDOUT printf("Bezier-Segment: ... (%f,%f) ... (%f,%f) -> (%f,%f)\n", (((struct beziersegment *)ipath)->B.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->B.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->C.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->C.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->dest.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->dest.y)/(double)(0xFFFF)); #endif } ipath=ipath->link; } while (ipath!=NULL); } /* T1_CopyOutline(): Copy an outline physically. Returns a pointer to the path or NULL */ T1_OUTLINE *T1_CopyOutline( T1_OUTLINE *path) { return( (T1_OUTLINE *) CopyPath( (struct segment *)path)); } /* T1_FreeOutline(): Free an outline. */ void T1_FreeOutline( T1_OUTLINE *path) { KillPath( (struct segment *)path); return; } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1aaset.h0000664000175000017500000000677411742726712023026 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1aaset.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2003-01-02 ----- Description: This file is part of the t1-library. It contains definitions and declarations for t1set.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2003. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1AASET_C GLYPH *T1_AASetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); GLYPH *T1_AASetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); GLYPH* T1_AASetRect( int FontID, float size, float width, float height, T1_TMATRIX *transform); int T1_AASetGrayValues( unsigned long white, unsigned long gray75, unsigned long gray50, unsigned long gray25, unsigned long black); int T1_AAHSetGrayValues( unsigned long *grayvals); int T1_AANSetGrayValues( unsigned long fg, unsigned long bg); int T1_AAGetGrayValues( long *pgrayvals); int T1_AAHGetGrayValues( long *pgrayvals); int T1_AANGetGrayValues( long *pgrayvals); int T1_AASetBitsPerPixel( int bpp); int T1_AAGetBitsPerPixel( void); int T1_AASetLevel( int level); int T1_AAGetLevel( void); GLYPH *T1_AAFillOutline( T1_OUTLINE *path, int modflag); int T1_AASetSmartLimits( float limit1, float limit2); int T1_AASetSmartMode( int smart); #else extern GLYPH *T1_AASetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_AASetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern GLYPH* T1_AASetRect( int FontID, float size, float width, float height, T1_TMATRIX *transform); extern int T1_AASetGrayValues( unsigned long white, unsigned long gray75, unsigned long gray50, unsigned long gray25, unsigned long black); extern int T1_AAHSetGrayValues( unsigned long *grayvals); extern int T1_AANSetGrayValues( unsigned long bg, unsigned long fg); extern int T1_AAGetGrayValues( long *pgrayvals); extern int T1_AAHGetGrayValues( long *pgrayvals); extern int T1_AANGetGrayValues( long *pgrayvals); extern int T1_AASetBitsPerPixel( int bpp); extern int T1_AAGetBitsPerPixel( void); extern int T1_AASetLevel( int level); extern int T1_AAGetLevel( void); extern GLYPH *T1_AAFillOutline( T1_OUTLINE *path, int modflag); extern int T1_AASetSmartLimits( float limit1, float limit2); extern int T1_AASetSmartMode( int smart); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1afmtool.c0000664000175000017500000004673411742726712023365 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1afmtool.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2007-12-23 ----- Description: This file is part of the t1-library. It contains functions for generating a fallback set of afm data from type 1 font files. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2007. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1AFMTOOL_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/paths.h" #include "../type1/regions.h" #include "../type1/blues.h" #include "t1types.h" #include "t1extern.h" #include "t1finfo.h" #include "t1base.h" #include "t1misc.h" #include "t1set.h" #include "t1load.h" #include "t1afmtool.h" #define DELTA_MAX 30 #define ENCODINGSIZE (int) 256 #ifndef T1LIB_IDENT #define T1LIB_IDENT "???.???" #endif extern char *t1_get_abort_message( int number); /* T1_GenerateAFMFallbackInfo(): Generate fallback information from Type 1 font file by rasterizing every character at 1000 bp. Returns a pointer to a generated FontInfo struct or NULL in case of an error. */ FontInfo *T1_GenerateAFMFallbackInfo( int FontID) { int i, j; struct region *area; struct XYspace *S; int mode=0; char **charnames; int nochars=0; FontInfo *pAFMData; /* When generaing fallback info, we accumulate a font bounding box that could be useful when the font's definition is missing or trivial. */ int acc_llx=0; int acc_lly=0; int acc_urx=0; int acc_ury=0; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } /* Check whether font is loaded: */ if (T1_CheckForFontID(FontID)!=1){ sprintf( err_warn_msg_buf, "Can't generate AFM Info from Font %d (invalid ID)\n", FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* Setup apropriate charspace matrix */ S=(struct XYspace *)IDENTITY; /* Make this permanent so that scaling it in fontfcnB_ByName will make a duplicate of it, and this duplicate can thus be safely destroyed. Fixes the somewhat smaller memory leak */ S=(struct XYspace *)Permanent (Transform(S, pFontBase->pFontArray[FontID].FontTransform[0], pFontBase->pFontArray[FontID].FontTransform[1], pFontBase->pFontArray[FontID].FontTransform[2], pFontBase->pFontArray[FontID].FontTransform[3])); /* Alloc memory for FontInfo: */ if ((pAFMData=(FontInfo *)malloc( sizeof(FontInfo)))==NULL){ sprintf( err_warn_msg_buf, "Failed to allocate memory for FontInfo in Font %d!", FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; /* make sure to free S */ if (S) { KillSpace (S); } return( NULL); } /* Initialize pointers */ pAFMData->gfi=NULL; pAFMData->cwi=NULL; pAFMData->numOfChars=0; pAFMData->cmi=NULL; pAFMData->numOfTracks=0; pAFMData->tkd=NULL; pAFMData->numOfPairs=0; pAFMData->pkd=NULL; pAFMData->numOfComps=0; pAFMData->ccd=NULL; /* Get list of character name */ charnames=T1_GetAllCharNames( FontID); /* and count number of characters */ nochars=0; while (charnames[nochars]!=NULL) nochars++; pAFMData->numOfChars=nochars; /* Allocate memory for CharMetricInfo area */ if ((pAFMData->cmi=(CharMetricInfo *) malloc( nochars * sizeof( CharMetricInfo)))==NULL){ sprintf( err_warn_msg_buf, "Failed to allocate memory for CharMetricsInfo area in Font %d!", FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_WARNING); free( pAFMData); T1_errno=T1ERR_ALLOC_MEM; /* make sure to free S */ if (S) { KillSpace (S); } return( NULL); } /* Get metrics values */ for (i=0; ipFontArray[FontID].pType1Data, DO_RASTER); if (area==NULL){ sprintf( err_warn_msg_buf, "Could not get charspace representation of character %d (%s) Font %d!", i, charnames[i], FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_WARNING); /* Return since we don't know how to fill the values */ for (j=i-1; j>=0; j--) free( pAFMData->cmi[j].name); if (pAFMData->cmi!=NULL) free( pAFMData->cmi); if (pAFMData!=NULL) free( pAFMData); T1_errno=mode; /* make sure to free S */ if (S) { KillSpace (S); } return( NULL); } else if ((pAFMData->cmi[i].name=(char *) malloc( (size_t)(strlen( charnames[i])+1)))==NULL){ sprintf( err_warn_msg_buf, "Failed to allocate memory for CharName %d (%s) Font %d!", i, charnames[i], FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_WARNING); /* NULL-ptr in charnames is prone to SIGSEGV-errors, thus, we have to return: */ for (j=i; j>=0; j--) free( pAFMData->cmi[j].name); free( pAFMData->cmi); free( pAFMData); T1_errno=T1ERR_ALLOC_MEM; /* make sure to free S */ if (S) { KillSpace (S); } return( NULL); } else{ strcpy( pAFMData->cmi[i].name, charnames[i]); pAFMData->cmi[i].code=T1_GetEncodingIndex( FontID, charnames[i]); pAFMData->cmi[i].wx=NEARESTPEL(area->ending.x); pAFMData->cmi[i].wy=NEARESTPEL(area->ending.y); /* We check for a valid BBox and set it to zero otherwise */ if ((int)area->xmax > (int)area->xmin){ pAFMData->cmi[i].charBBox.llx =(int)area->xmin; pAFMData->cmi[i].charBBox.urx =(int)area->xmax; pAFMData->cmi[i].charBBox.lly =(int)area->ymin; pAFMData->cmi[i].charBBox.ury =(int)area->ymax; } else{ pAFMData->cmi[i].charBBox.llx =0; pAFMData->cmi[i].charBBox.urx =0; pAFMData->cmi[i].charBBox.lly =0; pAFMData->cmi[i].charBBox.ury =0; } pAFMData->cmi[i].ligs=NULL; /* Accumulate bounding box of font */ if ( pAFMData->cmi[i].charBBox.llx < acc_llx ) { acc_llx=pAFMData->cmi[i].charBBox.llx; } if ( pAFMData->cmi[i].charBBox.lly < acc_lly ) { acc_lly=pAFMData->cmi[i].charBBox.lly; } if ( pAFMData->cmi[i].charBBox.urx > acc_urx ) { acc_urx=pAFMData->cmi[i].charBBox.urx; } if ( pAFMData->cmi[i].charBBox.ury > acc_ury ) { acc_ury=pAFMData->cmi[i].charBBox.ury; } /* We are done with area, so get rid of it. Solves the REALLY HUGE memory leak */ KillRegion (area); } } sprintf( err_warn_msg_buf, "Generated metric information for %d characters of font %d!", nochars, FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_STATISTIC); /* Check whether the bounding box we computed could be better than that specified in the font file itself. Id so, we overwrite it. */ if ( pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[0].data.integer == 0 && pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[1].data.integer == 0 && pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[2].data.integer == 0 && pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[3].data.integer == 0 ) { pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[0].data.integer = acc_llx; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[1].data.integer = acc_lly; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[2].data.integer = acc_urx; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[3].data.integer = acc_ury; sprintf( err_warn_msg_buf, "Substituted accumulated FontBBox [%d,%d,%d,%d] for trivial FontBBox of font %d!", acc_llx, acc_lly, acc_urx, acc_ury, FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_WARNING); } /* make sure to free S */ if (S) { KillSpace (S); } return( pAFMData); } /* T1_WriteAFMFallbackFile(): Write a fallback AFM-file from AFM data genarated for font FontID. returns 0 if successful -1 if afm-data was loaded from existent AFM-file -2 if font is not loaded (invalid FontID) -3 if for some reason the fonts' AFM-data has not been generated -4 if the file could not be openend -5 if an error occurred during write -6 other error. */ int T1_WriteAFMFallbackFile( int FontID) { int i, j, k, l; int nochars; int capheight, ascender, xheight, descender; int min=0, delta; time_t s_clock, *tp; char *afmfilename; FILE *afmfile; CharMetricInfo **cmi; /* Check for valid font */ if (T1_CheckForFontID(FontID)!=1){ sprintf( err_warn_msg_buf, "Warning: Invalid FontID, font %d not loaded!", FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_INVALID_FONTID; return(-2); } /* Check for AFM-data to be existent */ if (pFontBase->pFontArray[FontID].pAFMData==NULL){ sprintf( err_warn_msg_buf, "Warning: No AFM-Data available for font %d", FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_WARNING); return(-3); } /* Check if AFM data has been generated from existent afm file --> no need to generate a new one. */ if ((pFontBase->pFontArray[FontID].info_flags & AFM_SUCCESS) || (pFontBase->pFontArray[FontID].info_flags & AFM_SLOPPY_SUCCESS)){ sprintf( err_warn_msg_buf, "Alert: Available AFM-Data for font %d is generated from existent AFM-file!", FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_STATISTIC); return(-1); } /* Construct AFM-filename */ i=strlen(pFontBase->pFontArray[FontID].pFontFileName); if ((afmfilename=(char *)malloc((size_t)(i + 1) ))==NULL){ sprintf( err_warn_msg_buf, "Memory allocation error (fontID = %d)", FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-6); } strcpy( afmfilename, pFontBase->pFontArray[FontID].pFontFileName); while (afmfilename[i]!='.') i--; afmfilename[i+1]='a'; afmfilename[i+2]='f'; afmfilename[i+3]='m'; if ((afmfile=fopen( afmfilename, "wb"))==NULL){ sprintf( err_warn_msg_buf, "Could not open %s, (FontID = %d)", afmfilename, FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_WARNING); free( afmfilename); T1_errno=T1ERR_FILE_OPEN_ERR; return(-4); } /* Set the creation time of afm file */ tp=&s_clock; s_clock=time( tp); /* Allocate a pointer-array to the metrics information, of the size 256 + number of characters. */ nochars=pFontBase->pFontArray[FontID].pAFMData->numOfChars; if ((cmi=(CharMetricInfo **)calloc( nochars+ENCODINGSIZE, sizeof(CharMetricInfo *)))==NULL){ sprintf( err_warn_msg_buf, "Memory allocation error (fontID = %d)", FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-6); } /* Reset area */ for ( i=0; i<(nochars+ENCODINGSIZE); i++) cmi[i]=NULL; /* First half of array is dedicated to encoded characters, the second half for unencoded characters */ k=ENCODINGSIZE; for ( i=0; ipFontArray[FontID].pAFMData->cmi[i].name); if (j>=0) cmi[j]=&(pFontBase->pFontArray[FontID].pAFMData->cmi[i]); else cmi[k++]=&(pFontBase->pFontArray[FontID].pAFMData->cmi[i]); } fprintf(afmfile, "StartFontMetrics 4.0\n"); fprintf(afmfile, "Comment This is %s created from %s by t1lib V. %s.\n", afmfilename, pFontBase->pFontArray[FontID].pFontFileName, T1LIB_IDENT); fprintf(afmfile, "Comment File creation date: %s", ctime(&s_clock)); fprintf(afmfile, "Comment t1lib is copyright (c) Rainer Menzner, 1996-2001.\n"); fprintf(afmfile, "Comment t1lib is distributed under the GNU General Public Library License (LGPL)\n"); fprintf(afmfile, "FontName %s\n", T1_GetFontName( FontID)); fprintf(afmfile, "FullName %s\n", T1_GetFullName( FontID)); fprintf(afmfile, "FamilyName %s\n", T1_GetFamilyName( FontID)); fprintf(afmfile, "Weight %s\n", T1_GetWeight( FontID)); fprintf(afmfile, "ItalicAngle %d\n", (int)T1_GetItalicAngle( FontID)); fprintf(afmfile, "IsFixedPitch %s\n", T1_GetIsFixedPitch( FontID) ? "true" : "false" ); fprintf(afmfile, "FontBBox %d %d %d %d\n", T1_GetFontBBox( FontID).llx, T1_GetFontBBox( FontID).lly, T1_GetFontBBox( FontID).urx, T1_GetFontBBox( FontID).ury); fprintf(afmfile, "UnderlinePosition %d\n", (int)T1_GetUnderlinePosition( FontID)); fprintf(afmfile, "UnderlineThickness %d\n", (int)T1_GetUnderlineThickness( FontID)); fprintf(afmfile, "Version %s\n", T1_GetVersion( FontID)); fprintf(afmfile, "Notice %s\n", T1_GetNotice( FontID)); /* Encoding */ if (pFontBase->pFontArray[FontID].pFontEnc==NULL){ if (pFontBase->pFontArray[FontID].info_flags & USES_STANDARD_ENCODING){ fprintf( afmfile, "EncodingScheme AdobeStandardEncoding\n"); } else{ fprintf( afmfile, "EncodingScheme FontSpecific\n"); } } else fprintf( afmfile, "EncodingScheme FontSpecific\n"); /* Values like capheight ascender xheight and descender */ /* We start with the overshoot positions */ i=pFontBase->pFontArray[FontID].pType1Data->BluesP->numBlueValues; if (i>0){ /* Capheight */ if ((k=T1_GetEncodingIndex( FontID, "H"))!=-1){ l=T1_GetCharBBox( FontID, (char) k).ury; delta=10000; for (j=0; j abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l)){ min=j; delta=abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l); } } if (min % 2) /* index is odd */ min--; /* Check for plausibility */ if (abs( pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min] - l) > DELTA_MAX) /* We probably did not found the right position */ capheight=0; else capheight=pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min]; } else capheight=0; /* XHeight */ if ((k=T1_GetEncodingIndex( FontID, "x"))!=-1){ l=T1_GetCharBBox( FontID, (char) k).ury; delta=10000; for (j=0; j abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l)){ min=j; delta=abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l); } } if (min % 2) /* index is odd */ min--; /* Check for plausibility */ if (abs( pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min] - l) > DELTA_MAX) /* We probably did not found the right position */ xheight=0; else xheight=pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min]; } else{ xheight=0; } /* Ascender */ if ((k=T1_GetEncodingIndex( FontID, "d"))!=-1){ l=T1_GetCharBBox( FontID, (char) k).ury; delta=10000; for (j=0; j abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l)){ min=j; delta=abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l); } } if (min % 2) /* index is odd */ min--; /* Check for plausibility */ if (abs( pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min] - l) > DELTA_MAX) /* We probably did not found the right position */ ascender=0; else ascender=pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min]; } else{ ascender=0; } } else{ capheight=0; xheight=0; ascender=0; } /* And now comes under shoot alignment position */ i=pFontBase->pFontArray[FontID].pType1Data->BluesP->numOtherBlues; if (i>0){ /* Descender */ if ((k=T1_GetEncodingIndex( FontID, "p"))!=-1){ l=T1_GetCharBBox( FontID, (char) k).lly; delta=10000; for (j=0; j abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->OtherBlues[j] - l)){ min=j; delta=abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->OtherBlues[j] - l); } } if ((min % 2)==0) /* index is even */ min++; /* Check for plausibility */ if (abs( pFontBase->pFontArray[FontID].pType1Data->BluesP->OtherBlues[min] - l) > DELTA_MAX) /* We probably did not found the right position */ descender=0; else descender=pFontBase->pFontArray[FontID].pType1Data->BluesP->OtherBlues[min]; } else{ descender=0; } } else{ descender=0; } if (capheight != 0) fprintf( afmfile, "CapHeight %d\n", capheight); if (xheight != 0) fprintf( afmfile, "XHeight %d\n", xheight); if (ascender != 0) fprintf( afmfile, "Ascender %d\n", ascender); if (descender != 0) fprintf( afmfile, "Descender %d\n", descender); if (pFontBase->pFontArray[FontID].pType1Data->BluesP->StdHW != 0.0) fprintf( afmfile, "StdHW %d\n", (int) pFontBase->pFontArray[FontID].pType1Data->BluesP->StdHW); if (pFontBase->pFontArray[FontID].pType1Data->BluesP->StdVW != 0.0) fprintf( afmfile, "StdVW %d\n", (int) pFontBase->pFontArray[FontID].pType1Data->BluesP->StdVW); /* Now fill in the values (we omit the .notdef) */ fprintf(afmfile, "StartCharMetrics %d\n", nochars-1); for ( i=0; i<(nochars+ENCODINGSIZE); i++){ if (cmi[i]!=NULL && strcmp(cmi[i]->name,".notdef")) fprintf( afmfile, "C %3d ; WX %4d ; N %-20s ; B %5d %5d %5d %5d ;\n", cmi[i]->code, cmi[i]->wx, cmi[i]->name, cmi[i]->charBBox.llx, cmi[i]->charBBox.lly, cmi[i]->charBBox.urx, cmi[i]->charBBox.ury); } fprintf(afmfile, "EndCharMetrics\nEndFontMetrics\n"); free(cmi); fclose( afmfile); return(0); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1enc.h0000664000175000017500000000375411742726712022471 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1enc.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-06-16 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t11enc.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1ENC_C static char **ScanEncodingFile( char *FileName); char **T1_LoadEncoding( char *FileName); int T1_DeleteEncoding( char **encoding); int T1_ReencodeFont( int FontID, char **Encoding); int T1_SetDefaultEncoding( char **encoding); char *T1_GetEncodingScheme( int FontID); static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2); #else extern char **T1_LoadEncoding( char *FileName); extern int T1_DeleteEncoding( char **encoding); extern int T1_ReencodeFont( int FontID, char **Encoding); extern int T1_SetDefaultEncoding( char **encoding); extern char *T1_GetEncodingScheme( int FontID); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1base.c0000664000175000017500000012464511742726712022634 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1base.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2005-05-17 ----- Description: This file is part of the t1-library. It contains basic routines to initialize the data structures used by the t1-library. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1BASE_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/paths.h" #include "../type1/regions.h" #include "sysconf.h" #include "t1base.h" #include "t1types.h" #include "t1global.h" #include "t1env.h" #include "t1delete.h" static int test_for_t1_file( char *buffer ); static int T1_pad=0; /* A fix for Encoding Vector problem. Initialization / Deinitialization is now done in T1_InitLib() / T1-CloseLib. */ extern boolean Init_BuiltInEncoding( void); extern psobj *StdEncArrayP; static const char* T1errmsg[] = { "", /* -10 */ "", /* -9 */ "", /* -8 */ "", /* -7 */ "", /* -6 */ "Attempt to Load Multiple Master Font", /* T1ERR_SCAN_FONT_FORMAT -5 */ "Type 1 Font File Open Error", /* T1ERR_SCAN_FILE_OPEN_ERR -4 */ "Virtual Memory Exceeded", /* T1ERR_SCAN_OUT_OF_MEMORY -3 */ "Syntactical Error Scanning Font File", /* T1ERR_SCAN_ERROR -2 */ "Premature End of Font File Encountered", /* T1ERR_SCAN_FILE_EOF -1 */ "", /* 0 */ "Path Construction Error", /* T1ERR_PATH_ERROR 1 */ "Font is Corrupt", /* T1ERR_PARSE_ERROR 2 */ "Rasterization Aborted", /* T1ERR_TYPE1_ABORT 3 */ "", /* 4 */ "", /* 5 */ "", /* 6 */ "", /* 7 */ "", /* 8 */ "", /* 9 */ "Font ID Invalid in this Context", /* T1ERR_INVALID_FONTID 10 */ "Invalid Argument in Function Call", /* T1ERR_INVALID_PARAMETER 11 */ "Operation not Permitted", /* T1ERR_OP_NOT_PERMITTED 12 */ "Memory Allocation Error", /* T1ERR_ALLOC_MEM 13 */ "Error Opening File", /* T1ERR_FILE_OPEN_ERR 14 */ "Unspecified T1Lib Error", /* T1ERR_UNSPECIFIED 15 */ "Missing AFM Data", /* T1ERR_NO_AFM_DATA 16 */ "X11 Interface Error", /* T1ERR_X11 17 */ "Missing Component of Composite Character" /* T1ERR_COMPOSITE_CHAR 18 */ "Error Scanning Encoding File", /* T1ERR_SCAN_ENCODING 19 */ "", /* 20 */ }; /* T1_StrError(): Return an error message corresponding to the value of t1err. */ const char *T1_StrError( int t1err) { int errind; errind = t1err + 10; if ( errind < 0 ) errind = 0; if ( errind > 29 ) errind = 0; return T1errmsg[errind]; } /* This function is to be called by the user to initialize the font mechanism */ void *T1_InitLib( int log) { int result; int i; char *usershome=NULL; char *logfilepath=NULL; char *envlogreq=NULL; int usrforcelog=0; /* Check against multiple initialization. */ if ( T1_Up != 0 ) { T1_errno=T1ERR_OP_NOT_PERMITTED; return NULL; } /* Reset T1_errno */ T1_errno=0; /* Assign pointer to global struct and set entry padding: */ pFontBase=&FontBase; if (T1_pad) pFontBase->bitmap_pad=T1_pad; else pFontBase->bitmap_pad=T1GLYPH_PAD; pFontBase->pFontArray = NULL; pFontBase->t1lib_flags=0; /* Check for AA-caching */ if ((log & T1_AA_CACHING)){ pFontBase->t1lib_flags |= T1_AA_CACHING; } /* Check for AFM disable */ if ((log & T1_NO_AFM)) { pFontBase->t1lib_flags |= T1_NO_AFM; } /* Check environment variable ENV_LOG_STRING. By this means, a user may generate a log file even if at compile time log file creation has been suppressed. Of course, if the loglevel is reduced after initialization by the programmer, this environment variable takes no effect! */ if ((envlogreq=getenv(ENV_LOG_STRING))!=NULL) { if (strcmp( envlogreq, "logDebug")==0) T1_SetLogLevel( T1LOG_DEBUG); else if (strcmp( envlogreq, "logStatistic")==0) T1_SetLogLevel( T1LOG_STATISTIC); else if (strcmp( envlogreq, "logWarning")==0) T1_SetLogLevel( T1LOG_WARNING); else if (strcmp( envlogreq, "logError")==0) T1_SetLogLevel( T1LOG_ERROR); usrforcelog=1; } /* Open log-file: */ t1lib_log_file=NULL; if ((log & LOGFILE) || (usrforcelog!=0)) { pFontBase->t1lib_flags |= LOGFILE; /* Try first opening in current directory: */ if ((t1lib_log_file=fopen( T1_LOG_FILE, "wb"))==NULL) { if ((usershome=getenv("HOME"))!=NULL) { logfilepath=(char *)malloc((strlen(usershome) + strlen(T1_LOG_FILE) + 2 ) * sizeof(char)); strcpy( logfilepath, usershome); strcat( logfilepath, DIRECTORY_SEP); strcat( logfilepath, T1_LOG_FILE); if ((t1lib_log_file=fopen( logfilepath, "wb"))==NULL){ t1lib_log_file=stderr; } free( logfilepath); } else { t1lib_log_file=stderr; } } if (t1lib_log_file==stderr) { T1_PrintLog( "T1_InitLib()", "Unable to open a logfile, using stderr", T1LOG_ERROR); } } T1_PrintLog( "T1_InitLib()", "Initialization started", T1LOG_STATISTIC); /* Check for representation of data in memory: */ if ((pFontBase->endian=T1_CheckEndian())){ T1_PrintLog( "T1_InitLib()", "Using Big Endian data presentation (MSBFirst)", T1LOG_DEBUG); pFontBase->endian=1; } else{ T1_PrintLog( "T1_InitLib()", "Using Little Endian data presentation (LSBFirst)", T1LOG_DEBUG); pFontBase->endian=0; } /* Save version identifier */ sprintf( err_warn_msg_buf, "Version Identifier: %s", T1LIB_IDENT); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); /* Save how t1lib is initialized */ sprintf( err_warn_msg_buf, "Initialization flags: 0x%X", log); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); /* Save padding value in log file */ sprintf( err_warn_msg_buf, "Glyphs are padded to %d bits", pFontBase->bitmap_pad); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); #ifdef __CHAR_UNSIGNED__ T1_PrintLog( "T1_InitLib()", "System-Info: char is unsigned", T1LOG_DEBUG); #else T1_PrintLog( "T1_InitLib()", "System-Info: char is signed", T1LOG_DEBUG); #endif sprintf( err_warn_msg_buf, "System-Info: sizeof(char): %d", SIZEOF_CHAR); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(short): %d", SIZEOF_SHORT); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(int): %d", SIZEOF_INT); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(long): %d", SIZEOF_LONG); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(long long): %d", SIZEOF_LONG_LONG); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(float): %d", SIZEOF_FLOAT); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(double): %d", SIZEOF_DOUBLE); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(long double): %d", SIZEOF_LONG_DOUBLE); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(void *): %d", SIZEOF_VOID_P); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); intT1_SetupDefaultSearchPaths(); if (log & IGNORE_CONFIGFILE) { pFontBase->t1lib_flags |= IGNORE_CONFIGFILE; T1_PrintLog( "T1_InitLib()", "Skipping configuration file search!", T1LOG_STATISTIC); } else { if ((result=intT1_ScanConfigFile())==0) T1_PrintLog( "T1_InitLib()", "Warning t1lib configuration file not found!", T1LOG_WARNING); } /* Initialize builtin Standard Encoding */ if ( !(Init_BuiltInEncoding()) ) { T1_PrintLog( "T1_InitLib()", "Unable initialize internal StandardEncoding!", T1LOG_ERROR); } /* Set the default encoding to the fonts' internal encoding */ pFontBase->default_enc=NULL; /* Initialize the no_fonts... values */ pFontBase->no_fonts=0; pFontBase->no_fonts_ini=pFontBase->no_fonts; pFontBase->no_fonts_limit=pFontBase->no_fonts; /* Check whether to read font database */ if ((log & IGNORE_FONTDATABASE)){ pFontBase->t1lib_flags |= IGNORE_FONTDATABASE; T1_Up=1; /* System has been initialized ! */ T1_PrintLog( "T1_InitLib()", "Initialization successfully finished (Database empty)", T1LOG_STATISTIC); return((void *) pFontBase); } result=0; /* Read fontdatabase(s) */ i=0; while (T1_FDB_ptr[i]!=NULL) { if ((result=intT1_scanFontDBase(T1_FDB_ptr[i]))==-1){ T1_PrintLog( "T1_InitLib()", "Fatal error scanning Font Database File %s", T1LOG_WARNING, T1_FDB_ptr[i]); } if (result>-1) pFontBase->no_fonts+=result; i++; } if ( (result == 0) && (i != 0)){ T1_PrintLog( "T1_InitLib()", "No fonts from Font Database File(s) found (T1_errno=%d)", T1LOG_ERROR, T1_errno); return(NULL); } result=0; /* Read XLFD fontdatabase(s) */ i=0; while (T1_FDBXLFD_ptr[i]!=NULL) { if ((result=intT1_scanFontDBaseXLFD(T1_FDBXLFD_ptr[i]))==-1){ T1_PrintLog( "T1_InitLib()", "Fatal error scanning XLFD Font Database File %s", T1LOG_WARNING, T1_FDB_ptr[i]); } if (result>-1) pFontBase->no_fonts+=result; i++; } if ( (result == 0) && (i != 0)){ T1_PrintLog( "T1_InitLib()", "No fonts from XLFD Font Database File(s) found (T1_errno=%d)", T1LOG_ERROR, T1_errno); return(NULL); } /* Initialize the no_fonts... values */ pFontBase->no_fonts_ini=pFontBase->no_fonts; pFontBase->no_fonts_limit=pFontBase->no_fonts; T1_Up=1; /* System has been initialized ! */ T1_PrintLog( "T1_InitLib()", "Initialization successfully finished", T1LOG_STATISTIC); return((void *) pFontBase); } /* intT1_scanFontDBase(): - opens the file with the font definitions, - reads the number of fonts defined and saves this in FontBase, - allocates memory for all the filenames of the Type1 files - tests for .pfa und .pfb files and saves the name found - initializes an array that allows to acces these names by an index number, the font_ID - returns -1 on fatal error and the number of fonts located successfully */ int intT1_scanFontDBase( char *filename) { int fd; int filesize, i, j, k, m; int found=0, located=0; char *filebuffer; int nofonts=0; FONTPRIVATE* fontarrayP=NULL; #ifndef O_BINARY # define O_BINARY 0x0 #endif if ((fd=open( filename, O_RDONLY | O_BINARY))<3){ T1_PrintLog( "intT1_scanFontDBase()", "Font Database File %s not found!", T1LOG_WARNING, filename); T1_errno=T1ERR_FILE_OPEN_ERR; return(-1); } /* Get the file size */ filesize=lseek( fd, 0, 2); /* Reset fileposition to start */ lseek (fd, 0, 0); if ((filebuffer=(char *)malloc(filesize*sizeof(char) )) == NULL){ T1_PrintLog( "intT1_scanFontDBase()", "Couldn't allocate memory for loading font database file %s", T1LOG_ERROR, filename); T1_errno=T1ERR_ALLOC_MEM; return(-1); } i=read( fd, filebuffer, filesize); close(fd); /* Close font database file */ i=j=m=0; while (inofonts) /* to ignore especially white space at end */ break; i++; /* Step further in file position */ } /* Return the memory for file reading */ free(filebuffer); return( found); } /* intT1_scanFontDBaseXLFD(): - opens the file with the font definitions, - reads the number of fonts defined and saves this in FontBase, - allocates memory for all the filenames of the Type1 files - tests for .pfa und .pfb files and saves the name found - initializes an array that allows to acces these names by an index number, the font_ID - returns -1 on fatal error and the number of fonts located successfully. This function is identical to intT1_scanFontDBase() with the difference that it expects the database file to be in XLFD format, that is, the font's name comes in the first place stead of in the last. */ int intT1_scanFontDBaseXLFD( char *filename) { int fd; int filesize, i, j, l, m; int found=0, located=0; char *filebuffer; int nofonts=0; FONTPRIVATE* fontarrayP=NULL; #ifndef O_BINARY # define O_BINARY 0x0 #endif if ((fd=open( filename, O_RDONLY | O_BINARY))<3){ T1_PrintLog( "intT1_scanFontDBaseXLFD()", "XLFD Font Database File %s not found!", T1LOG_WARNING, filename); T1_errno=T1ERR_FILE_OPEN_ERR; return(-1); } /* Get the file size */ filesize=lseek( fd, 0, 2); /* Reset fileposition to start */ lseek (fd, 0, 0); if ((filebuffer=(char *)malloc(filesize*sizeof(char) )) == NULL){ T1_PrintLog( "intT1_scanFontDBaseXLFD()", "Couldn't allocate memory for loading XLFD font database file %s", T1LOG_ERROR, filename); T1_errno=T1ERR_ALLOC_MEM; return(-1); } i=read( fd, filebuffer, filesize); close(fd); /* Close XLFD font database file */ i=j=l=m=0; while (inofonts) /* to ignore especially white space at end */ break; i++; /* Step further in file position */ } /* Return the memory for file reading */ free(filebuffer); return( found); } /* T1_CloseLib(): Close the library and free all associated memory */ int T1_CloseLib( void) { int i, j, error=0; if ( T1_Up != 0 ) { for (i=pFontBase->no_fonts; i; i--){ /* Free filename only if not NULL and if the font is physical! Do it before removing the font since the physical information is no more available afterwards. If necessary, an explicitly specified AFM filename is also freed. */ if ((pFontBase->pFontArray[i-1].pFontFileName!=NULL) && (pFontBase->pFontArray[i-1].physical==1)){ free( pFontBase->pFontArray[i-1].pFontFileName); pFontBase->pFontArray[i-1].pFontFileName=NULL; if (pFontBase->pFontArray[i-1].pAfmFileName!=NULL){ free( pFontBase->pFontArray[i-1].pAfmFileName); pFontBase->pFontArray[i-1].pAfmFileName=NULL; } } /* Now, remove font: */ if ((j=T1_DeleteFont( i-1))){ error=1; sprintf( err_warn_msg_buf, "T1_DeleteFont() returned %d for Font %d", j, i-1); T1_PrintLog( "T1_CloseLib()", err_warn_msg_buf, T1LOG_ERROR); } } /* Free the FONTPRIVATE area */ if (pFontBase->pFontArray) free( pFontBase->pFontArray); else error=1; /* Get rid of internal StandardEncoding vector */ if ( StdEncArrayP != NULL ) { free( StdEncArrayP); StdEncArrayP = NULL; } /* Free search paths */ intT1_FreeSearchPaths(); /* Reset the flags */ pFontBase->t1lib_flags=0; /* Indicate Library is no longer initialized */ pFontBase=NULL; T1_Up=0; T1_PrintLog( "T1_CloseLib()", "Library closed", T1LOG_STATISTIC); if ((t1lib_log_file!=NULL) && (t1lib_log_file!=stderr)) fclose(t1lib_log_file); t1lib_log_file=NULL; } return( error); } /* T1_AddFont(): Add a new fontfile to the fontdatabase. Return values: >0: Assigned FontID -1: Fontfile not found -2: Error allocating memory for FONTPRIVATE-area -3: No memory for saving font filename */ int T1_AddFont( char *fontfilename) { char *FullName; FONTPRIVATE *save_ptr; int i; int new_ID; if (fontfilename==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } /* Check for existence of fontfile */ if ((FullName=intT1_Env_GetCompletePath(fontfilename,T1_PFAB_ptr))==NULL) { T1_errno=T1ERR_FILE_OPEN_ERR; return(-1); } free(FullName); /* Check if free space for a new FONTPRIVATE is available; if not, realloc memory some amount larger */ save_ptr=pFontBase->pFontArray; if (pFontBase->no_fonts==pFontBase->no_fonts_limit){ if (pFontBase->pFontArray == NULL) { /* In case this is the first font */ pFontBase->pFontArray=(FONTPRIVATE *)calloc(pFontBase->no_fonts_limit + ADVANCE_FONTPRIVATE, sizeof(FONTPRIVATE)); } else { /* We already have some fonts */ pFontBase->pFontArray=(FONTPRIVATE *)realloc(pFontBase->pFontArray, (pFontBase->no_fonts_limit + ADVANCE_FONTPRIVATE) * sizeof(FONTPRIVATE)); if (pFontBase->pFontArray==NULL){ /* Restore pointer */ pFontBase->pFontArray=save_ptr; T1_errno=T1ERR_ALLOC_MEM; return(-2); /* No memory available */ } } pFontBase->no_fonts_limit += ADVANCE_FONTPRIVATE; /* First, initialize newly allocated to be not used */ for ( i=pFontBase->no_fonts; ino_fonts+ADVANCE_FONTPRIVATE; i++){ pFontBase->pFontArray[i].pFontFileName=NULL; pFontBase->pFontArray[i].pAfmFileName=NULL; pFontBase->pFontArray[i].pAFMData=NULL; pFontBase->pFontArray[i].pType1Data=NULL; pFontBase->pFontArray[i].pEncMap=NULL; pFontBase->pFontArray[i].pKernMap=NULL; pFontBase->pFontArray[i].pFontEnc=NULL; pFontBase->pFontArray[i].pFontSizeDeps=NULL; pFontBase->pFontArray[i].vm_base=NULL; pFontBase->pFontArray[i].FontMatrix[0]=0.0; pFontBase->pFontArray[i].FontMatrix[1]=0.0; pFontBase->pFontArray[i].FontMatrix[2]=0.0; pFontBase->pFontArray[i].FontMatrix[3]=0.0; pFontBase->pFontArray[i].FontTransform[0]=0.0; pFontBase->pFontArray[i].FontTransform[1]=0.0; pFontBase->pFontArray[i].FontTransform[2]=0.0; pFontBase->pFontArray[i].FontTransform[3]=0.0; pFontBase->pFontArray[i].slant=0.0; pFontBase->pFontArray[i].extend=0.0; pFontBase->pFontArray[i].physical=0; pFontBase->pFontArray[i].refcount=0; pFontBase->pFontArray[i].space_position=0; pFontBase->pFontArray[i].info_flags=0; } } /* no_fonts-1 was the largest allowed font ID */ new_ID=pFontBase->no_fonts; pFontBase->no_fonts++; if ((FontBase.pFontArray[new_ID].pFontFileName=(char *) calloc( strlen( fontfilename)+1, sizeof(char))) == NULL){ T1_PrintLog( "T1_AddFont()", "Failed to allocate memory for Filename %s (FontID=%d)", T1LOG_ERROR, fontfilename, new_ID); T1_errno=T1ERR_ALLOC_MEM; return(-3); } strcpy( FontBase.pFontArray[new_ID].pFontFileName, fontfilename); /* Generate logfile entry */ sprintf( err_warn_msg_buf, "Assigned FontID %d to fontfile %s", new_ID, FontBase.pFontArray[new_ID].pFontFileName); T1_PrintLog( "T1_AddFont()", err_warn_msg_buf, T1LOG_STATISTIC); /* Return FontID of newly declared font */ return( new_ID); } /* T1_PrintLog() generates entries in the log file. msg_txt is subject to scan conversion and ... signifies a accordingly lrge variable list. */ void T1_PrintLog( char *func_ident, char *msg_txt, int level, ...) { va_list vararg; static char levelid[4]={ 'E', 'W', 'S', 'D'}; time_t s_clock, *tp; if (t1lib_log_file==NULL) return; if ((level>t1lib_log_level) || (level<1)){ return; } else{ /* initialize argument list */ va_start( vararg, level); tp=&s_clock; s_clock=time( tp); /* fprintf( t1lib_log_file, "(%c) (%.24s) %s: ", levelid[level-1], ctime(&s_clock), func_ident); */ /* Don't print the time stamp */ fprintf( t1lib_log_file, "(%c) %s: ", levelid[level-1], func_ident ); vfprintf( t1lib_log_file, msg_txt, vararg ); fprintf( t1lib_log_file, "\n"); fflush( t1lib_log_file); /* cleanup variable list */ va_end( vararg); return; } } /* T1_SetLogLevel(): Set the level which a message must have so that it is printed into the logfile. This function may be called before T1_InitLib(). */ void T1_SetLogLevel( int level) { if ((level>0) && (level<5)) t1lib_log_level=level; return; } /* T1_CheckForInit(): If no initialization of font mechanism has been done, return -1, indicating an error. */ int T1_CheckForInit(void) { if(T1_Up) return(0); else return(-1); } /* T1_CheckForFontID(): Checks the font mechanism concerning the specified ID. It returns: 0 if font belonging to FontID has not yet been loaded 1 if font belonging to FontID has already been loaded -1 if FontID is an invalid specification or t1lib not initialized */ int T1_CheckForFontID( int FontID) { /* FontID is invalid */ if ((FontID<0)||(FontID>(pFontBase->no_fonts - 1))||(T1_Up==0)) return(-1); if (pFontBase->pFontArray[FontID].pType1Data==NULL) return(0); /* has not yet been loaded */ else return(1); /* has already been loaded */ } /* test_for_t1_file returns 0 if a file "name.pfa" or "name.pfb" was found. Else, -1 is returned. If successful, buffer contains the found filename string */ static int test_for_t1_file( char *buffer ) { int i=0; char *FullName; /* First case: A PostScript Font ASCII File without extension (according to some UNIX-conventions) */ if ((FullName=intT1_Env_GetCompletePath(buffer,T1_PFAB_ptr))!=NULL) { free(FullName); return(0); } while (buffer[i]!=0){ i++; } buffer[i]='.'; buffer[i+1]='p'; buffer[i+2]='f'; buffer[i+4]=0; /* Second case: A PostScript Font ASCII File */ buffer[i+3]='a'; if ((FullName=intT1_Env_GetCompletePath(buffer,T1_PFAB_ptr))!=NULL) { free(FullName); return(0); } /* Third case: A PostScript Font Binary File */ buffer[i+3]='b'; if ((FullName=intT1_Env_GetCompletePath(buffer,T1_PFAB_ptr))!=NULL) { free(FullName); return(0); } /* If we get here no file was found => Set buffer to an empty string and return -1 */ buffer[0]=0; return(-1); } /* T1_GetFontFileName() returns a pointer to the filename of the font, associated with FontID. This filename does not contain a full path. */ char *T1_GetFontFileName( int FontID) { static char filename[MAXPATHLEN+1]; if (T1_CheckForInit())return(NULL); /* Check first for valid FontID */ if ((FontID<0) || (FontID>FontBase.no_fonts)){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strcpy( filename, pFontBase->pFontArray[FontID].pFontFileName); return( filename); } /* As suggested by Nicolai Langfeldt, we make it possible to specify a completely independent path for the afm filename. This should make t1lib usable in context with using the kpathsearch-library. We allow setting those path´s after initialization, but before a font is loaded. returns 0: OK -1: Operation could not be performed */ int T1_SetAfmFileName( int FontID, char *afm_name) { if (T1_CheckForFontID(FontID)!=0){ /* Operation may not be applied because FontID is invalid or font is loaded */ T1_errno=T1ERR_INVALID_FONTID; return(-1); } if (afm_name==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } if (pFontBase->pFontArray[FontID].pAfmFileName!=NULL){ /* we first free the current name */ free( pFontBase->pFontArray[FontID].pAfmFileName); pFontBase->pFontArray[FontID].pAfmFileName=NULL; } if ((pFontBase->pFontArray[FontID].pAfmFileName= (char *)malloc( (strlen(afm_name)+1)*sizeof( char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( -1); } strcpy( pFontBase->pFontArray[FontID].pAfmFileName, afm_name); return(0); } /* We have a function for querying the name. Returns a pointer to the string or NULL if name was not explicitly set .*/ char *T1_GetAfmFileName( int FontID) { static char filename[MAXPATHLEN+1]; if (T1_CheckForInit())return(NULL); /* Check first for valid FontID */ if ((FontID<0) || (FontID>FontBase.no_fonts)){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } if (pFontBase->pFontArray[FontID].pAfmFileName==NULL) { return( NULL); } strcpy( filename, pFontBase->pFontArray[FontID].pAfmFileName); return( filename); } /* T1_GetNoFonts(): Return the number of declared fonts */ int T1_GetNoFonts(void) { if (T1_CheckForInit()) return(-1); return(FontBase.no_fonts); } /* T1_SetDeviceResolutions( x_res, y_res): Set the device's physical resolution in horizontal and vertical direction, mesured in DPI (Dots Per Inch). This should be done before the first font is loaded! */ int T1_SetDeviceResolutions( float x_res, float y_res) { int i; if (T1_CheckForInit()) ; /* Not initialized -> no size dependent data -> OK */ else /* Check if size-dependent data is existent */ for ( i=T1_GetNoFonts(); i; i--) if (pFontBase->pFontArray[i-1].pFontSizeDeps!=NULL){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); /* There's is size dependent data for a font */ } /* Save resolutions and calculate horizontal and vertical scale factors to map desired bp to device pixel */ DeviceSpecifics.x_resolution=(float) x_res; DeviceSpecifics.y_resolution=(float) y_res; DeviceSpecifics.scale_x=(float)(((float)x_res)/BIGPOINTSPERINCH); DeviceSpecifics.scale_y=(float)(((float)y_res)/BIGPOINTSPERINCH); return(0); } /* T1_QueryX11Support(): Check at runtime to see if t1lib was compiled with X11 interface: */ int T1_QueryX11Support( void) { #ifndef T1LIB_NO_X11_SUPPORT return(1); #else return(0); #endif } /* int T1_CopyFont(): Copies the font associated with FontID to another location. The pointers to type1- , afm- and encoding data as well as the matrices remain completely untouched. However, size dependent data is not copied. The produced font is marked as a "logical" font. If no memory is available in the FONTPRIVATE-array, there's realloc'ed some more memory. The FontID which is assigned to the newly generated font is given as the return value, or < 0 if an error occurs. Also, the refcount entry of the source font is incremented by one. Return value -1: invalid FontID specified -2: source font is not a "physical" font -3: no memory for reallocation of FONTPRIVATEs -4: no memory for one of the mapping tables */ int T1_CopyFont( int FontID) { FONTPRIVATE *save_ptr; int k; int new_ID; /* Check for a valid source font */ if (T1_CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* Check if the font in question is a "physical" font, otherwise it may not be copied */ if (pFontBase->pFontArray[FontID].physical==0){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-2); } /* Check if free space for a new FONTPRIVATE is available; if not, realloc memory some amount larger */ save_ptr=pFontBase->pFontArray; if (pFontBase->no_fonts==pFontBase->no_fonts_limit){ pFontBase->pFontArray=(FONTPRIVATE *)realloc(pFontBase->pFontArray, (pFontBase->no_fonts_limit + ADVANCE_FONTPRIVATE) * sizeof(FONTPRIVATE)); if (pFontBase->pFontArray==NULL){ /* Restore pointer */ pFontBase->pFontArray=save_ptr; T1_errno=T1ERR_ALLOC_MEM; return(-3); } /* We zero the newly allocated memory */ if (pFontBase->pFontArray != NULL) { memset( pFontBase->pFontArray + pFontBase->no_fonts_limit, 0, ADVANCE_FONTPRIVATE * sizeof(FONTPRIVATE)); } pFontBase->no_fonts_limit += ADVANCE_FONTPRIVATE; } /* no_fonts-1 was the largest allowed font ID */ new_ID=pFontBase->no_fonts; /* Copy FONTPRIVATE-structure: */ pFontBase->pFontArray[new_ID]=pFontBase->pFontArray[FontID]; /* (Re)Set some values explicitly, others remain untouched: */ pFontBase->pFontArray[new_ID].pFontSizeDeps=NULL; pFontBase->pFontArray[new_ID].physical=0; /* AFM-mapping tables are to be setup for logical fonts separately (if AFM data is there) */ /* first, kerning map */ if (pFontBase->pFontArray[new_ID].pAFMData) { k=pFontBase->pFontArray[new_ID].pAFMData->numOfPairs; if (k>0){ /* kern map exists only if kerning pairs exist! */ if ((pFontBase->pFontArray[new_ID].pKernMap= (METRICS_ENTRY *)malloc( k*sizeof( METRICS_ENTRY)))==NULL){ sprintf( err_warn_msg_buf, "Error allocating memory for kerning map (new_ID=%d)", new_ID); T1_PrintLog( "T1_CopyFont()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-4); } memcpy( pFontBase->pFontArray[new_ID].pKernMap, pFontBase->pFontArray[FontID].pKernMap, k*sizeof( METRICS_ENTRY)); } else { /* no kerning pairs, bu AFM data present */ pFontBase->pFontArray[new_ID].pKernMap=NULL; } } else { /* AFM data not present at all */ pFontBase->pFontArray[new_ID].pKernMap=NULL; } /* second, encoding map */ if (pFontBase->pFontArray[FontID].pEncMap!=NULL) { if ((pFontBase->pFontArray[new_ID].pEncMap= (int *)calloc(256,sizeof(int)))==NULL){ sprintf( err_warn_msg_buf, "Error allocating memory for encoding map (new_ID=%d)", new_ID); T1_PrintLog( "T1_CopyFont()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-4); } memcpy( pFontBase->pFontArray[new_ID].pEncMap, pFontBase->pFontArray[FontID].pEncMap, 256*sizeof( int)); } /* New font is logical --> indicate to which physical font it refers by setting refcount: */ pFontBase->pFontArray[new_ID].refcount=FontID; /* Now the struct is setup; increment no_fonts by 1 because new_ID is a valid font specification from now on. */ pFontBase->no_fonts++; /* Increment refcount in source font */ pFontBase->pFontArray[FontID].refcount++; /* Generate logfile entry */ sprintf( err_warn_msg_buf, "Assigned FontID %d to fontfile %s", new_ID, FontBase.pFontArray[new_ID].pFontFileName); T1_PrintLog( "T1_CopyFont()", err_warn_msg_buf, T1LOG_STATISTIC); return(new_ID); } /* T1_SetBitmapPad(): Set the value to which bitmap-scanlines are padded. This has to be done before initialization because it is a very rudimentary operation. */ int T1_SetBitmapPad( int pad) { if (T1_Up){ /* Library is initialized --> return error */ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } else{ switch (pad){ case 8: T1_pad=8; return(0); case 16: T1_pad=16; return(0); #ifdef T1_AA_TYPE64 case 32: T1_pad=32; return(0); #endif default: T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } } } /* T1_GetBitmapPad(): Read the value to which scanlines of bitmap are padded. This can be done before or after initialization. */ int T1_GetBitmapPad( void) { if (pFontBase) /* T1lib initialized --> return value from struct */ return( pFontBase->bitmap_pad); else{ if (T1_pad) return(T1_pad); /* pad is explicitly set --> return that value */ else return( T1GLYPH_PAD); /* not expl. set --> return compilation default */ } } /* CheckEndian(): Checks whether the current machine is of little or big endian architecture. This is important for concatenating bitmaps. Function returns 0 if LittleEndian and 1 if BigEndian representation is used on the current hardware. */ int T1_CheckEndian() { unsigned char *charptr; /* Generate test value */ unsigned short test=0x0001; /* Read out memory as unsigned char */ charptr=(unsigned char *)(&test)+1; /* Return value will be 1 if Big- and 0 if Little Endian */ return((int) *charptr); } /* T1_GetLibIdent(): Return the identifier string for the current version of t1lib */ char *T1_GetLibIdent( void) { static char buf[15]; sprintf( buf, "%s", T1LIB_IDENT); return( (char *)buf); } /* T1_SetRasterFlags(): Enable/Disable certain features in the rasterizer */ extern void T1_SetRasterFlags( int flags) { T1_Type1OperatorFlags=flags; return; } /* T1_GetFontFileName(): returns a pointer to the complete path filename of the font, associated with FontID as it is in use by t1lib. */ char *T1_GetFontFilePath( int FontID) { static char filepath[MAXPATHLEN+1]; char *FileNamePath=NULL; /* is initialzed? */ if (T1_CheckForInit()) { T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* Check first for valid FontID */ if ((FontID<0) || (FontID>FontBase.no_fonts)){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* lib is initialized and FontID is valid -> we can really expect a name */ if ((FileNamePath=intT1_Env_GetCompletePath( pFontBase->pFontArray[FontID].pFontFileName, T1_PFAB_ptr))==NULL) { T1_PrintLog( "T1_GetFontFilePath()", "Couldn't locate font file for font %d in %s", T1LOG_WARNING, FontID, T1_GetFileSearchPath(T1_PFAB_PATH)); T1_errno=T1ERR_FILE_OPEN_ERR; return(NULL); } strcpy( filepath, FileNamePath); free( FileNamePath); return( filepath); } /* We have a function for querying the name. Returns a pointer to the string or NULL if name was not explicitly set .*/ char *T1_GetAfmFilePath( int FontID) { static char filepath[MAXPATHLEN+1]; char *FontFileName; char *AFMFilePath; int i, j; /* is initialized? */ if ((T1_CheckForInit())) { T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* Check first for valid FontID */ if ((FontID<0) || (FontID>FontBase.no_fonts)){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* Check wether AFM-file loading was suppressed on user's request */ if ((pFontBase->t1lib_flags & T1_NO_AFM)!=0) { /* this is no error condition, we simply return (NULL) */ return( NULL); } /* Check for explicitly associated metrics filename (via "T1_SetAfmFileName()"). If it exists, we return it! */ if (pFontBase->pFontArray[FontID].pAfmFileName!=NULL) { strcpy( filepath, pFontBase->pFontArray[FontID].pAfmFileName); sprintf( err_warn_msg_buf, "Returning explicitly specified path %s for Font %d", filepath, FontID); T1_PrintLog( "T1_GetAfmFilePath()", err_warn_msg_buf, T1LOG_DEBUG); return( filepath); } /* we have the usual case that the name of the metrics file has to be deduced from the font file name */ FontFileName=T1_GetFontFileName( FontID); i=strlen(FontFileName); j=i; strcpy( filepath, FontFileName); while ( filepath[i] != '.'){ if (i==0) break; else i--; } if (i==0){ /* We have a filename without extension -> append extension */ filepath[j]='.'; filepath[j+1]='a'; filepath[j+2]='f'; filepath[j+3]='m'; filepath[j+4]='\0'; } else{ /* we found a '.' -> replace extension */ filepath[i+1]='a'; filepath[i+2]='f'; filepath[i+3]='m'; filepath[i+4]='\0'; } /* Get full path of the afm file (The case of a full path name name specification is valid) */ if ((AFMFilePath=intT1_Env_GetCompletePath( filepath, T1_AFM_ptr)) == NULL) { return NULL; } strcpy( filepath, AFMFilePath); free( AFMFilePath); return( filepath); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1outline.h0000664000175000017500000000744611742726712023405 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1outline.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2002-10-18 ----- Description: This file is part of the t1-library. It contains definitions and declarations for t1outline.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2002. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1OUTLINE_C T1_OUTLINE *T1_GetCharOutline( int FontID, char charcode, float size, T1_TMATRIX *transform); T1_OUTLINE *T1_GetStringOutline( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); T1_OUTLINE *T1_ConcatOutlines( T1_OUTLINE *path1, T1_OUTLINE *path2); T1_OUTLINE *T1_ScaleOutline( T1_OUTLINE *path, float scale); T1_OUTLINE *T1_GetMoveOutline( int FontID, int deltax, int deltay, int modflag, float size, T1_TMATRIX *transform); void T1_DumpPath( T1_OUTLINE *path); void T1_AbsolutePath( T1_OUTLINE *rpath); void T1_RelativePath( T1_OUTLINE *apath); void T1_ManipulatePath( T1_OUTLINE *path, void (*manipulate)(fractpel *x,fractpel *y,int type)); T1_OUTLINE *T1_CopyOutline( T1_OUTLINE *path); void T1_FreeOutline( T1_OUTLINE *path); #else extern T1_OUTLINE *T1_GetCharOutline( int FontID, char charcode, float size, T1_TMATRIX *transform); extern T1_OUTLINE *T1_GetStringOutline( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern T1_OUTLINE *T1_ConcatOutlines( T1_OUTLINE *path1, T1_OUTLINE *path2); extern T1_OUTLINE *T1_ScaleOutline( T1_OUTLINE *path, float scale); extern T1_OUTLINE *T1_GetMoveOutline( int FontID, int deltax, int deltay, int modflag, float size, T1_TMATRIX *transform); extern void T1_DumpPath( T1_OUTLINE *path); extern void T1_AbsolutePath( T1_OUTLINE *rpath); extern void T1_RelativePath( T1_OUTLINE *apath); extern void T1_ManipulatePath( T1_OUTLINE *path, void (*manipulate)(fractpel *x,fractpel *y,int type)); extern T1_OUTLINE *T1_CopyOutline( T1_OUTLINE *path); extern void T1_FreeOutline( T1_OUTLINE *path); #endif extern struct region *fontfcnB(int FontID, int modflag, struct XYspace *S, char **ev, unsigned char index, int *mode, psfont *Font_Ptr, int do_raster, float strokewidth); extern struct region *fontfcnB_string( int FontID, int modflag, struct XYspace *S, char **ev, unsigned char *string, int no_chars, int *mode, psfont *Font_Ptr, int *kern_pairs, long spacewidth, int do_raster, float strokewidth); extern struct region *fontfcnB_ByName( int FontID, int modflag, struct XYspace *S, char *charname, int *mode, psfont *Font_Ptr, int do_raster); xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1env.h0000664000175000017500000000501511742726712022504 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1env.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2005-05-16 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1env.c ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2005. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1ENV_C void intT1_FreeSearchPaths( void); void intT1_SetupDefaultSearchPaths( void); int intT1_ScanConfigFile( void); char *intT1_Env_GetCompletePath( char *FileName, char **env_ptr ); int T1_SetFileSearchPath( int type, char *pathname); int T1_AddToFileSearchPath( int pathtype, int mode, char *pathname); char *T1_GetFileSearchPath( int type); int T1_SetFontDataBase( char *filename); int T1_AddFontDataBase( int mode, char *filename); int T1_SetFontDataBaseXLFD( char *filename); int T1_AddFontDataBaseXLFD( int mode, char *filename); #else extern void intT1_FreeSearchPaths( void); extern void intT1_SetupDefaultSearchPaths( void); extern int intT1_ScanConfigFile( void); extern char *intT1_Env_GetCompletePath( char *FileName, char **env_ptr ); extern int T1_SetFileSearchPath( int type, char *pathname); extern int T1_AddToFileSearchPath( int pathtype, int mode, char *pathname); extern char *T1_GetFileSearchPath( int type); extern int T1_SetFontDataBase( char *filename); extern int T1_AddFontDataBase( int mode, char *filename); extern int T1_SetFontDataBaseXLFD( char *filename); extern int T1_AddFontDataBaseXLFD( int mode, char *filename); #endif xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/lib/t1lib/t1delete.c0000664000175000017500000002630311742726712023154 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: t1delete.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2002-12-02 ----- Description: This file is part of the t1-library. It contains functions for giving free previously allocated memory areas and similar things. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2002. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1DELETE_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "t1types.h" #include "t1extern.h" #include "t1delete.h" #include "t1load.h" #include "t1finfo.h" #include "t1base.h" /* T1_DeleteSize(): Gives back all the memory allocated for size to the system. If size is somewhere in the middle of a linked list of sizes, it further takes care that the remaining list is linked in a proper way. Function returns 0 if successful and otherwise -1*/ int T1_DeleteSize( int FontID, float size) { int i, j; FONTSIZEDEPS *ptr, *next_ptr, *prev_ptr; int jobs=0; int antialias; int level[4]={0,T1_AA_NONE,T1_AA_LOW,T1_AA_HIGH}; for ( j=0; j<4; j++){ antialias=level[j]; /* Check if size exists; if not, return 1 */ if ((ptr=T1int_QueryFontSize( FontID, size, antialias))!=NULL){ /* We have to remove a size-> */ jobs++; /* Get pointers to structure which is before/after the structure to be deleted in the linked list and properly relink structures */ next_ptr=((FONTSIZEDEPS *)ptr)->pNextFontSizeDeps; prev_ptr=((FONTSIZEDEPS *)ptr)->pPrevFontSizeDeps; if ((prev_ptr==NULL)&&(next_ptr==NULL)){ /* There's only one single size, no relink is necessary => reset the initial pointer to indicate that no size dependent data is available */ pFontBase->pFontArray[FontID].pFontSizeDeps=NULL; } else{ if (prev_ptr!=NULL) /* We are at the first size of the linked list and there are still some sizes left after removing the current */ prev_ptr->pNextFontSizeDeps=next_ptr; else pFontBase->pFontArray[FontID].pFontSizeDeps=next_ptr; if (next_ptr!=NULL) /* We are at the end of an list of at least two sizes: */ next_ptr->pPrevFontSizeDeps=prev_ptr; } /* Now, that the list is properly linked, free the memory used by size: */ /* Free the bitmaps memory: */ for (i=0; i<256; i++) if (ptr->pFontCache[i].bits) free(ptr->pFontCache[i].bits); /* Free memory for glyphs: */ free(ptr->pFontCache); /* Free the structure itself: */ free(ptr); /* Print log: */ sprintf( err_warn_msg_buf, "Size %f deleted for FontID %d (antialias=%d)", size, FontID, antialias); T1_PrintLog( "T1_DeleteSize()", err_warn_msg_buf, T1LOG_STATISTIC); } } /* Return the appropriate value */ if (jobs==0) return(-1); else return(0); } /* T1_DeleteAllSizes(): Gives back all the memory allocated for all sizes to the system. Function returns the number of removed sizes or -1 if an error ocurred. */ int T1_DeleteAllSizes( int FontID) { int sizecount; float currsize; FONTSIZEDEPS *ptr; if (T1_CheckForFontID(FontID)!=1) return(-1); /* Start deleting at the end of the linked list: */ sizecount=0; if ((ptr=T1int_GetLastFontSize( FontID))==NULL){ /* There has not been any size dependent data: */ return(0); } while (((ptr=T1int_GetLastFontSize(FontID)) != NULL)){ currsize=ptr->size; T1_DeleteSize( FontID, currsize); sizecount++; } return(sizecount); } /* T1_FreeGlyph(): Gives the memory used by a glyph back to the system. */ int T1_FreeGlyph( GLYPH *glyph) { if (glyph!=NULL) { if (glyph->bits!=NULL) { free(glyph->bits); } free(glyph); } return(0); } /* T1_FreeCompCharData(): Return emory used by a composite character data information structure to the system */ int T1_FreeCompCharData( T1_COMP_CHAR_INFO *cci) { if (cci!=NULL) { if (cci->pieces!=NULL) { free( cci->pieces); } free( cci); } return( 0); } /* T1_DeleteFont(): Gives all memory used by a font back to the system. If the font is successfully deinstalled 0 is returned. A positive value indicates an error. */ int T1_DeleteFont( int FontID) { int result; if (T1_CheckForFontID(FontID)==-1){ /* Invalid ID */ T1_errno=T1ERR_INVALID_FONTID; return(-1); } if (T1_CheckForFontID(FontID)==0) /* Font is not loaded */ return(0); /* Memory freeing must be done hierachical, start with size dependent data: */ result=T1_DeleteAllSizes(FontID); /* Next we delete the AFM-mapping tables */ if (pFontBase->pFontArray[FontID].pEncMap!=NULL) free( pFontBase->pFontArray[FontID].pEncMap); if (pFontBase->pFontArray[FontID].pKernMap!=NULL) free( pFontBase->pFontArray[FontID].pKernMap); /* We do not touch the file name because this is only to be done by T1_CloseLib(): */ /* The Type-1 area and tyhe AFM-area may only be free'ed, if the font is a "physical" font and if its reference counter is 1, or if it is a logical font. Otherwise, other logical font use this physical one and it may not be free'ed. In this case, return the number of logical fonts which refer to this physical font. */ if ((pFontBase->pFontArray[FontID].physical==1)&& (pFontBase->pFontArray[FontID].refcount==1)){ /* Now handle the type 1 data: */ if (pFontBase->pFontArray[FontID].pType1Data!=NULL){ /* First: VM, which includes CharStrings, Private, .... */ free(pFontBase->pFontArray[FontID].vm_base); /* .. then the struct itself: */ free(pFontBase->pFontArray[FontID].pType1Data); pFontBase->pFontArray[FontID].pType1Data=NULL; } /* afm-data is yet there -> */ if (pFontBase->pFontArray[FontID].pAFMData!=NULL){ result=FreeAFMData(pFontBase->pFontArray[FontID].pAFMData); pFontBase->pFontArray[FontID].pAFMData=NULL; } } else{ if (pFontBase->pFontArray[FontID].physical==1){ /* font is physical and is referred to by other fonts -> Do nothing further and return number of references: */ return(pFontBase->pFontArray[FontID].refcount - 1); } } /* If we get here and the font is logical, we have to decrement the refcount of the referred physical font */ if (pFontBase->pFontArray[FontID].physical==0){ pFontBase->pFontArray[pFontBase->pFontArray[FontID].refcount].refcount--; } /* Set remaining area explicitly to 0 (all but pFontFileName and pAfmFileName!) */ pFontBase->pFontArray[FontID].pAFMData=NULL; pFontBase->pFontArray[FontID].pType1Data=NULL; pFontBase->pFontArray[FontID].pEncMap=NULL; pFontBase->pFontArray[FontID].pKernMap=NULL; pFontBase->pFontArray[FontID].pFontEnc=NULL; pFontBase->pFontArray[FontID].pFontSizeDeps=NULL; pFontBase->pFontArray[FontID].vm_base=NULL; pFontBase->pFontArray[FontID].FontMatrix[0]=0.0; pFontBase->pFontArray[FontID].FontMatrix[1]=0.0; pFontBase->pFontArray[FontID].FontMatrix[2]=0.0; pFontBase->pFontArray[FontID].FontMatrix[3]=0.0; pFontBase->pFontArray[FontID].FontTransform[0]=0.0; pFontBase->pFontArray[FontID].FontTransform[1]=0.0; pFontBase->pFontArray[FontID].FontTransform[2]=0.0; pFontBase->pFontArray[FontID].FontTransform[3]=0.0; pFontBase->pFontArray[FontID].slant=0.0; pFontBase->pFontArray[FontID].extend=0.0; pFontBase->pFontArray[FontID].UndrLnPos=0.0; pFontBase->pFontArray[FontID].UndrLnThick=0.0; pFontBase->pFontArray[FontID].OvrLnPos=0.0; pFontBase->pFontArray[FontID].OvrLnThick=0.0; pFontBase->pFontArray[FontID].OvrStrkPos=0.0; pFontBase->pFontArray[FontID].OvrStrkThick=0.0; pFontBase->pFontArray[FontID].physical=0; pFontBase->pFontArray[FontID].refcount=0; pFontBase->pFontArray[FontID].space_position=0; pFontBase->pFontArray[FontID].info_flags=0; return(0); } /* FreeAFMData(): Give all memory used by afm-Information back to the system. */ int FreeAFMData( FontInfo *pAFMData) { if (pAFMData != NULL){ if (pAFMData->gfi != NULL){ free(pAFMData->gfi->afmVersion); pAFMData->gfi->afmVersion = NULL; free(pAFMData->gfi->fontName); pAFMData->gfi->fontName = NULL; free(pAFMData->gfi->fullName); pAFMData->gfi->fullName = NULL; free(pAFMData->gfi->familyName); pAFMData->gfi->familyName = NULL; free(pAFMData->gfi->weight); pAFMData->gfi->weight = NULL; free(pAFMData->gfi->version); pAFMData->gfi->version = NULL; free(pAFMData->gfi->notice); pAFMData->gfi->notice = NULL; free(pAFMData->gfi->encodingScheme); pAFMData->gfi->encodingScheme = NULL; free(pAFMData->gfi); pAFMData->gfi = NULL; } if (pAFMData->cwi != NULL){ free(pAFMData->cwi); pAFMData->cwi = NULL; } if (pAFMData->cmi != NULL){ int i = 0; CharMetricInfo *temp = pAFMData->cmi; Ligature *node = temp->ligs; for (i = 0; i < pAFMData->numOfChars; ++i){ for (node = temp->ligs; node != NULL; node = node->next){ free(node->succ); node->succ = NULL; free(node->lig); node->lig = NULL; } free(temp->name); temp->name = NULL; temp++; } free(pAFMData->cmi); pAFMData->cmi = NULL; } if (pAFMData->tkd != NULL){ free(pAFMData->tkd); pAFMData->tkd = NULL; } if (pAFMData->pkd != NULL){ int i = 0; for (i = 0; i < pAFMData->numOfPairs; ++i){ free(pAFMData->pkd[i].name1); pAFMData->pkd[i].name1 = NULL; free(pAFMData->pkd[i].name2); pAFMData->pkd[i].name2 = NULL; } free(pAFMData->pkd); pAFMData->pkd = NULL; } if (pAFMData->ccd != NULL){ int i = 0, j = 0; CompCharData *ccd = pAFMData->ccd; for (i = 0; i < pAFMData->numOfComps; ++i){ for (j = 0; j < ccd[i].numOfPieces; ++j){ free(ccd[i].pieces[j].pccName); ccd[i].pieces[j].pccName = NULL; } free(ccd[i].ccName); ccd[i].ccName = NULL; } free(pAFMData->ccd); pAFMData->ccd = NULL; } free(pAFMData); } return(0); } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/LICENSE0000664000175000017500000004307611742726712020533 0ustar uwabamiuwabami GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE 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. END OF TERMS AND CONDITIONS Appendix: 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 convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/xglyph/0000775000175000017500000000000011742726712021027 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/xglyph/xglyph.c0000664000175000017500000044341611742726712022522 0ustar uwabamiuwabami/*-------------------------------------------------------------------------- ----- File: xglyph.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2003-01-02 ----- Description: This file is part of the t1-library. The program xglyph allows viewing of character- and string-glyphs. Diverse parameters may be interactively configured. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2003. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ /* definitions for activating special tests for features of t1lib via commandline arguments: */ #define CHECK_PERFORMANCE 0x0001 #define CHECK_T1_COPYFONT_T1_ADDFONT 0x0002 #define CHECK_CONCATGLYPHS 0x0004 #define CHECK_CONCATOUTLINES 0x0008 #define CHECK_FOR_BAD_CHARS 0x0010 #define CHECK_DEFAULT_ENCODING 0x0020 #define CHECK_SMART_AA 0x0040 #define NO_GRID 0x0080 #define CHECK_AA_CACHING 0x0100 #define CHECK_CACHE_STROKED 0x0200 #define CHECK_SET_RECT 0x0400 /* #define SHOW_MANIPULATE_PATHS */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* The following stuff is necessary for compiling and running xglyph on VMS. Submitted by John Hasstedt (John.Hasstedt@sunysb.edu), who did the VMS-port of t1lib. */ #if defined(__VMS) && __CRTL_VER < 70000000 # define putenv(p) \ printf("You must define T1LIB_CONFIG before running this program\n"); \ exit; # define gettimeofday(p1,p2) #endif /* Note: We include t1lib.h and t1libx.h from lib/t1lib. That way the objectfile does only need to be rebuild when the header itself changes and not each time the library has been recompiled */ #include "../lib/t1lib/t1lib.h" #include "../lib/t1lib/t1libx.h" #ifndef PI #define PI 3.1415927 #endif /* utility functions */ BBox ComputeRotBBox( BBox, float); long time_diff(struct timeval *, struct timeval *); /* fallback-function */ void exitprog( Widget, XtPointer, XtPointer); void togglekerning( Widget, XtPointer, XtPointer); void toggleligatur( Widget, XtPointer, XtPointer); void toggler2l( Widget, XtPointer, XtPointer); void toggleunderline( Widget, XtPointer, XtPointer); void toggleoverline( Widget, XtPointer, XtPointer); void toggleoverstrike( Widget, XtPointer, XtPointer); void showchar( Widget , XtPointer , XtPointer ); void showstring( Widget , XtPointer , XtPointer ); void aashowchar( Widget , XtPointer , XtPointer ); void aashowstring( Widget , XtPointer , XtPointer ); void showcharX( Widget , XtPointer , XtPointer ); void showstringX( Widget , XtPointer , XtPointer ); void aashowcharX( Widget , XtPointer , XtPointer ); void aashowstringX( Widget , XtPointer , XtPointer ); void showabout( Widget , XtPointer , XtPointer ); void toggleopacity( Widget, XtPointer, XtPointer); void setcolor( Widget, XtPointer, XtPointer); void fonttable( Widget, XtPointer, XtPointer); void toggleaalevel( Widget, XtPointer, XtPointer); int ComputeAAColorsX( unsigned long fg, unsigned long bg, int nolevels); void printusage( int max); int CheckTransform( void); #define DOUBLEMARGIN 10 #define SIMPLEMARGIN 5 #define XOUTPUT_HALFVSIZE 200 #define XOUTPUT_HALFHSIZE 300 #define XGLYPH_PAD 16 #define T1LIBENCFILE "IsoLatin1.enc" #define MAXENCODINGS 10 #define TESTFONTFILE "eufm10.pfb" #define SHOWGRID #define CROSS_SIZE 6 #define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) #define DIALOGWIDTH 170 #define DIALOGHEIGHT 20 #define ACTIONBUTTONHEIGHT 20 #define APPLICATIONHEIGHT 690 #define EDITABLE_COLOR "red" #define MESSAGEBOXHEIGHT 180 #define AAMAXPLANES 17 #define GRAY0 WhitePixel(display, screen_number) #define GRAY1 gray1.pixel #define GRAY2 gray2.pixel #define GRAY3 gray3.pixel #define GRAY4 BlackPixel(display, screen_number) #define min(a,b) (a < b ? a : b) #define max(a,b) (a > b ? a : b) #define DEFAULT_SIZE "100.0" #define DEFAULT_CHAR "65" /* Global variables for rasterizer parameters */ float Size=400.0, Slant=0.0, Extent=1.0, Angle=0.0; int Modflag=0; int FontID=0, Caching=1, DeviceResolution=72; int StrokeWidth; int nofonts; long Space=0; int Opacity=0; int aalevel; char TestString[1024]="Test"; int TestChar=70; char EncodingFile[128]=""; char LastEncodingFile[128]=""; struct { char *encfilename; char **encoding; } encstruct[MAXENCODINGS]; int *last_resolution; float *lastExtent; float *lastSlant; int LigDetect=0; unsigned long fg, bg, outbg; Pixmap tmp_pixmap=0; Pixmap white_pixmap=0; Pixmap perf_pixmap; Pixmap pixmap; XImage *ximage; XColor edit_color, gray0, gray1, gray2, gray3, gray4; XColor white, black, gray, red, green, blue, pink4, yellow, gridcolor1, gridcolor2,wozu; XColor aacolors[AAMAXPLANES]; unsigned long aapixels[AAMAXPLANES]; XGCValues xgcvalues; unsigned short dummy; char input; int overallwidth; char commandline[256]; GLYPH *glyph; GLYPH *glyph1, *glyph2; char **Encoding=NULL; unsigned int height, width; char statusstring[1024]; T1_TMATRIX matrix; T1_TMATRIX *matrixP; static char msg_buf[256]; /* How t1lib pads lines: */ int t1_pad=0; /* When to swap bytes in aa-pixels? */ int xglyph_byte_order; /* The following is for time measurements: */ struct timeval time_start, time_stop; struct timeval *time_ptr_start, *time_ptr_stop; void *void_ptr; /* Global X(t)-stuff */ Display *display; Screen *screen; int screennumber; int depth; Widget TopLevel; Widget OutputWindow; Widget Output; Widget OutputWindow2; Widget Output2; Widget dialogfontid; Widget dialogsize; Widget dialogslant; Widget dialogextent; Widget dialogangle; Widget dialogteststring; Widget dialogtestcharacter; Widget dialogdevres; Widget dialogstroke; Widget dialogencfile; Widget dialogspace; Widget dialogtmatrix; Widget labelstatus; Widget fgcolorbutton; Widget bgcolorbutton; /* color setting widgets */ Widget fgwhitebutton; Widget fgblackbutton; Widget fggraybutton; Widget fgredbutton; Widget fggreenbutton; Widget fgbluebutton; Widget bgwhitebutton; Widget bgblackbutton; Widget bggraybutton; Widget bgredbutton; Widget bggreenbutton; Widget bgbluebutton; Widget fglabel; Widget bglabel; Widget colorbox; Widget fgstatus; Widget bgstatus; Widget optionsbox; /* Commandline handling */ char *xglyphoptions[]={"--help", /* 0 */ "--Help", /* 1 */ "--noGrid", /* 2 */ "--setPad", /* 3 */ "--logError", /* 4 */ "--logWarning", /* 5 */ "--logStatistic", /* 6 */ "--logDebug", /* 7 */ "--ignoreForceBold", /* 8 */ "--ignoreFamilyAlignment", /* 9 */ "--ignoreHinting", /* 10 */ "--ignoreAFM", /* 11 */ "--debugLine", /* 12 */ "--debugRegion", /* 13 */ "--debugPath", /* 14 */ "--debugFont", /* 15 */ "--debugHint", /* 16 */ "--checkPerformance", /* 17 */ "--checkCopyFont", /* 18 */ "--checkConcatGlyphs", /* 19 */ "--checkConcatOutlines", /* 20 */ "--checkBadCharHandling", /* 21 */ "--checkDefaultEncoding", /* 22 */ "--checkSmartAntialiasing", /* 23 */ "--checkAACaching", /* 24 */ "--checkSetRect", /* 25 */ "--cacheStrokedGlyphs", /* 26 */ NULL}; int extraflags=0; /* #define SHOW_MANIPULATE_PATHS */ #ifdef SHOW_MANIPULATE_PATHS void mymanipulate( long *x, long *y, int type) { double corr; double dx, dy; dx=(double)*x; dy=(double)*y; /* we have to scale down because we deal with fractional pels */ /* corr=0.000000000000004*dx*dx; dy *=1.0+corr; */ /* #define PERIOD 500.0 corr=65536.0*0.5*sin(2*PI/PERIOD/65536.0*dx); dy +=corr*30.0; */ *y=(long)dy; } #endif int main( int argc, char **argv) { XtAppContext TopLevelApp; Arg args[10]; int i, j, numopts=0; Widget kerningbutton; Widget ligaturbutton; Widget r2lbutton; Widget showcharbutton; Widget showstringbutton; Widget aashowcharbutton; Widget aashowstringbutton; Widget showcharbuttonX; Widget showstringbuttonX; Widget aashowcharbuttonX; Widget aashowstringbuttonX; Widget stringlabel; Widget aboutbutton; Widget opacitybutton; Widget underlinebutton; Widget overstrikebutton; Widget overlinebutton; Widget transbox; Widget fonttablebutton; Widget aalevelbutton; Widget exitbutton; Widget box; int rasterflags=0, initflags=0, optfound; int loglevel=0; i=0; j=0; while (xglyphoptions[i++]!=NULL) numopts++; for ( i=1; i no option */ break; } /* Assign address of time parameter */ time_ptr_start=&time_start; time_ptr_stop=&time_stop; /* Check for environment entry. If not set, set it to current directory so that configuration file is found there */ if (getenv("T1LIB_CONFIG")==NULL){ putenv( "T1LIB_CONFIG=./t1lib.config"); } /* Set log-level: */ T1_SetLogLevel( loglevel & (~(0x01<<8))); /* Get padding value if not set from commandline. For 32 bit architectures like Intel, 16 might be the best padding default value: */ if (t1_pad==0) t1_pad=16; if (T1_SetBitmapPad( t1_pad)!=0){ t1_pad=T1_GetBitmapPad(); } /* Initialize t1-library. If xglyph is called with arguments that are no options, we assume that the arguments are font files and ignore the fontdata base file. At this point the value of "i" is the number of commandline arg that is supposed to contain a fontfile name (or it is argc, if no files where specified). Note further that "loglevel" contains (1) info whether to create a log file in the first bit of the higher byte of the lower word and (2) info which loglevel to set. (3) It further may contain more initialization flags. */ if ((extraflags & CHECK_AA_CACHING)){ loglevel |= (T1_AA_CACHING<<8); } if (i==argc){ if (T1_InitLib( (loglevel>>8) | initflags )==NULL){ fprintf(stderr,"Initialization of t1lib failed (T1_errno=%d)!\n", T1_errno); return(-1); } } else{ /* There are still arguments which we interprete as fontfile names */ if (T1_InitLib( (loglevel>>8) | initflags | IGNORE_FONTDATABASE )==NULL){ fprintf(stderr,"Initialization of t1lib failed (T1_errno=%d)!\n", T1_errno); return(-1); } /* We start adding fonts as the i-th commandline arguments */ for ( j=i; j" ); i++; XtSetValues(r2lbutton,args,i); XtAddCallback( r2lbutton, XtNcallback, (XtCallbackProc) toggler2l, (XtPointer) 0 ); /* The toggle widget for underlining (un-)setting */ underlinebutton = XtCreateManagedWidget("toggle", toggleWidgetClass, optionsbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 55 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, "Underline" ); i++; XtSetValues(underlinebutton,args,i); XtAddCallback( underlinebutton, XtNcallback, (XtCallbackProc) toggleunderline, (XtPointer) 0 ); /* The toggle widget for underlining (un-)setting */ overlinebutton = XtCreateManagedWidget("toggle", toggleWidgetClass, optionsbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 55 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, "Overline" ); i++; XtSetValues(overlinebutton,args,i); XtAddCallback( overlinebutton, XtNcallback, (XtCallbackProc) toggleoverline, (XtPointer) 0 ); /* The toggle widget for underlining (un-)setting */ overstrikebutton = XtCreateManagedWidget("toggle", toggleWidgetClass, optionsbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 55 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, "Overstrike" ); i++; XtSetValues(overstrikebutton,args,i); XtAddCallback( overstrikebutton, XtNcallback, (XtCallbackProc) toggleoverstrike, (XtPointer) 0 ); /* The button to raster and display the current character using the current settings */ showcharbutton = XtCreateManagedWidget("Com", commandWidgetClass, box, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 60 ); i++; XtSetArg( args[i], XtNheight, ACTIONBUTTONHEIGHT ); i++; XtSetArg( args[i], XtNlabel, "Char"); i++; XtSetValues(showcharbutton,args,i); XtAddCallback( showcharbutton, XtNcallback, (XtCallbackProc) showchar, (XtPointer) 0 ); /* The button to raster and display the current string using the current settings */ showstringbutton = XtCreateManagedWidget("Com", commandWidgetClass, box, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 60 ); i++; XtSetArg( args[i], XtNheight, ACTIONBUTTONHEIGHT ); i++; XtSetArg( args[i], XtNlabel, "String"); i++; XtSetValues(showstringbutton,args,i); XtAddCallback( showstringbutton, XtNcallback, (XtCallbackProc) showstring, (XtPointer) 0 ); /* The button to raster and display the current character using the current settings and antialiasing */ aashowcharbutton = XtCreateManagedWidget("Com", commandWidgetClass, box, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 120 ); i++; XtSetArg( args[i], XtNheight, ACTIONBUTTONHEIGHT ); i++; XtSetArg( args[i], XtNlabel, "AAChar"); i++; XtSetValues(aashowcharbutton,args,i); XtAddCallback( aashowcharbutton, XtNcallback, (XtCallbackProc) aashowchar, (XtPointer) 0 ); /* The button to raster and display the current string using the current settings and antialiasing */ aashowstringbutton = XtCreateManagedWidget("Com", commandWidgetClass, box, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 120 ); i++; XtSetArg( args[i], XtNheight, ACTIONBUTTONHEIGHT ); i++; XtSetArg( args[i], XtNlabel, "AAString"); i++; XtSetValues(aashowstringbutton,args,i); XtAddCallback( aashowstringbutton, XtNcallback, (XtCallbackProc) aashowstring, (XtPointer) 0 ); /* The button to raster and display the current character using the current settings */ showcharbuttonX = XtCreateManagedWidget("Com", commandWidgetClass, box, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 60 ); i++; XtSetArg( args[i], XtNheight, ACTIONBUTTONHEIGHT ); i++; XtSetArg( args[i], XtNlabel, "CharX"); i++; XtSetValues(showcharbuttonX,args,i); XtAddCallback( showcharbuttonX, XtNcallback, (XtCallbackProc) showcharX, (XtPointer) 0 ); /* The button to raster and display the current string using the current settings */ showstringbuttonX = XtCreateManagedWidget("Com", commandWidgetClass, box, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 60 ); i++; XtSetArg( args[i], XtNheight, ACTIONBUTTONHEIGHT ); i++; XtSetArg( args[i], XtNlabel, "StringX"); i++; XtSetValues(showstringbuttonX,args,i); XtAddCallback( showstringbuttonX, XtNcallback, (XtCallbackProc) showstringX, (XtPointer) 0 ); /* The button to raster and display the current character using the current settings and antialiasing */ aashowcharbuttonX = XtCreateManagedWidget("Com", commandWidgetClass, box, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 120 ); i++; XtSetArg( args[i], XtNheight, ACTIONBUTTONHEIGHT ); i++; XtSetArg( args[i], XtNlabel, "AACharX"); i++; XtSetValues(aashowcharbuttonX,args,i); XtAddCallback( aashowcharbuttonX, XtNcallback, (XtCallbackProc) aashowcharX, (XtPointer) 0 ); /* The button to raster and display the current string using the current settings and antialiasing */ aashowstringbuttonX = XtCreateManagedWidget("Com", commandWidgetClass, box, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 120 ); i++; XtSetArg( args[i], XtNheight, ACTIONBUTTONHEIGHT ); i++; XtSetArg( args[i], XtNlabel, "AAStringX"); i++; XtSetValues(aashowstringbuttonX,args,i); XtAddCallback( aashowstringbuttonX, XtNcallback, (XtCallbackProc) aashowstringX, (XtPointer) 0 ); /* The box for color trasp/op and fonttable button */ transbox=XtCreateManagedWidget("box", boxWidgetClass, box, NULL, 0); i=0; XtSetArg(args[i], XtNheight,20); i++; XtSetArg(args[i], XtNwidth,90); i++; XtSetValues(transbox,args,i); /* The button to display an AA font table */ fonttablebutton = XtCreateManagedWidget("Com", commandWidgetClass, transbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 80 ); i++; XtSetArg( args[i], XtNheight, 15 ); i++; XtSetArg( args[i], XtNlabel, "Font Table"); i++; XtSetValues(fonttablebutton,args,i); XtAddCallback( fonttablebutton, XtNcallback, (XtCallbackProc) fonttable, (XtPointer) 0 ); /* The toggle widget for opacity/transparency */ opacitybutton = XtCreateManagedWidget("toggle", toggleWidgetClass, transbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 80 ); i++; XtSetArg( args[i], XtNheight, 15 ); i++; XtSetArg( args[i], XtNlabel, "Transparent" ); i++; XtSetValues(opacitybutton,args,i); XtAddCallback( opacitybutton, XtNcallback, (XtCallbackProc) toggleopacity, (XtPointer) 0 ); outbg=pink4.pixel; /* the initial bgcolor for transparent mode */ /* The toggle widget for opacity/transparency */ aalevelbutton = XtCreateManagedWidget("toggle", toggleWidgetClass, transbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 80 ); i++; XtSetArg( args[i], XtNheight, 15 ); i++; XtSetArg( args[i], XtNlabel, "AA-Low" ); i++; XtSetValues(aalevelbutton,args,i); XtAddCallback( aalevelbutton, XtNcallback, (XtCallbackProc) toggleaalevel, (XtPointer) 0 ); aalevel=T1_AA_LOW; /* the initial bgcolor for transparent mode */ /* The box for color selecting buttons for the X11-rastering functions */ colorbox=XtCreateManagedWidget("box", boxWidgetClass, box, NULL, 0); i=0; XtSetArg(args[i], XtNheight,20); i++; XtSetArg(args[i], XtNwidth,280); i++; XtSetValues(colorbox,args,i); /* FG-label */ fgstatus = XtCreateManagedWidget("label", labelWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, fg); i++; XtSetValues(fgstatus,args,i); fglabel = XtCreateManagedWidget("label", labelWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 80 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, "Foreground"); i++; XtSetValues(fglabel,args,i); fgwhitebutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, white.pixel); i++; XtSetValues(fgwhitebutton,args,i); XtAddCallback( fgwhitebutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); fgblackbutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, black.pixel); i++; XtSetValues(fgblackbutton,args,i); XtAddCallback( fgblackbutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); fggraybutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, gray.pixel); i++; XtSetValues(fggraybutton,args,i); XtAddCallback( fggraybutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); fgredbutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, red.pixel); i++; XtSetValues(fgredbutton,args,i); XtAddCallback( fgredbutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); fggreenbutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, green.pixel); i++; XtSetValues(fggreenbutton,args,i); XtAddCallback( fggreenbutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); fgbluebutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, blue.pixel); i++; XtSetValues(fgbluebutton,args,i); XtAddCallback( fgbluebutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); /* BG-label */ bgstatus = XtCreateManagedWidget("label", labelWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, bg); i++; XtSetValues(bgstatus,args,i); bglabel = XtCreateManagedWidget("label", labelWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 80 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, "Background"); i++; XtSetValues(bglabel,args,i); bgwhitebutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, white.pixel); i++; XtSetValues(bgwhitebutton,args,i); XtAddCallback( bgwhitebutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); bgblackbutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, black.pixel); i++; XtSetValues(bgblackbutton,args,i); XtAddCallback( bgblackbutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); bggraybutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, gray.pixel); i++; XtSetValues(bggraybutton,args,i); XtAddCallback( bggraybutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); bgredbutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, red.pixel); i++; XtSetValues(bgredbutton,args,i); XtAddCallback( bgredbutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); bggreenbutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, green.pixel); i++; XtSetValues(bggreenbutton,args,i); XtAddCallback( bggreenbutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); bgbluebutton = XtCreateManagedWidget("Com", commandWidgetClass, colorbox, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 20 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, ""); i++; XtSetArg( args[i], XtNbackground, blue.pixel); i++; XtSetValues(bgbluebutton,args,i); XtAddCallback( bgbluebutton, XtNcallback, (XtCallbackProc) setcolor, (XtPointer) 0 ); /* Label for the next box */ stringlabel=XtCreateManagedWidget("Label", labelWidgetClass, box, NULL, 0); i=0; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNlabel, "Test-String:"); i++; XtSetValues(stringlabel,args,i); /* An input-box for the test-string */ dialogteststring=XtCreateManagedWidget("dialog1", asciiTextWidgetClass, box, NULL, 0); i=0; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight,30); i++; XtSetArg(args[i], XtNwrap, XawtextWrapLine); i++; XtSetArg(args[i], XtNeditType, XawtextEdit ); i++; XtSetArg(args[i], XtNforeground, edit_color.pixel); i++; XtSetValues(dialogteststring,args,i); /* Label for the next box */ labelstatus=XtCreateManagedWidget("Label", labelWidgetClass, box, NULL, 0); i=0; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, "No Messages!"); i++; XtSetValues(labelstatus,args,i); /* The button to exit the program */ exitbutton = XtCreateManagedWidget("Com2", commandWidgetClass, box, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 100 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNx, 0 ); i++; XtSetArg( args[i], XtNy, 0 ); i++; XtSetArg( args[i], XtNlabel, " Exit Program"); i++; XtSetValues(exitbutton,args,i); XtAddCallback( exitbutton, XtNcallback, (XtCallbackProc) exitprog, (XtPointer) 0 ); /* The About widget for the about message */ aboutbutton = XtCreateManagedWidget("Com", commandWidgetClass, box, NULL, 0); i=0; XtSetArg( args[i], XtNwidth, 55 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, "About" ); i++; XtSetValues(aboutbutton,args,i); XtAddCallback( aboutbutton, XtNcallback, (XtCallbackProc) showabout, (XtPointer) 0 ); XtRealizeWidget(TopLevel); XtPopup(Output,XtGrabNone); if( extraflags & CHECK_PERFORMANCE){ XtPopup(Output2,XtGrabNone); } /* Set parameters for X11-support */ T1_SetX11Params( display, DefaultVisual(display, screennumber), DefaultDepth( display, screennumber), DefaultColormap(display, screennumber)); /* Create a dummy-pixmap because we need one to destroy before the next is created! */ pixmap = XCreatePixmap(display, XtWindow(OutputWindow), 200, 200, DefaultDepth(display,screennumber) ); XtAppMainLoop(TopLevelApp); return(0); } /* Compute the BBox of a rotated box: */ BBox ComputeRotBBox( BBox inbox, float angle) { int i; BBox resultbox={ 0, 0, 0, 0}; struct point { double x; double y; } p[4], P[4]; double sinalpha, cosalpha; sinalpha=sin((double)angle*PI/180); cosalpha=cos((double)angle*PI/180); /* initialize points */ p[0].x=(double) inbox.llx; p[0].y=(double) inbox.lly; p[1].x=(double) inbox.urx; p[1].y=(double) inbox.lly; p[2].x=(double) inbox.urx; p[2].y=(double) inbox.ury; p[3].x=(double) inbox.llx; p[3].y=(double) inbox.ury; /* fprintf( stderr, "InBox: (%f,%f), (%f,%f), (%f,%f), (%f,%f)\n", p[0].x, p[0].y, p[1].x, p[1].y, p[2].x, p[2].y, p[3].x, p[3].y); */ /* Compute tranformed points */ P[0].x=p[0].x*cosalpha-p[0].y*sinalpha; P[0].y=p[0].x*sinalpha+p[0].y*cosalpha; P[1].x=p[1].x*cosalpha-p[1].y*sinalpha; P[1].y=p[1].x*sinalpha+p[1].y*cosalpha; P[2].x=p[2].x*cosalpha-p[2].y*sinalpha; P[2].y=p[2].x*sinalpha+p[2].y*cosalpha; P[3].x=p[3].x*cosalpha-p[3].y*sinalpha; P[3].y=p[3].x*sinalpha+p[3].y*cosalpha; /* fprintf( stderr, "RotPoints: (%f,%f), (%f,%f), (%f,%f), (%f,%f)\n", P[0].x, P[0].y, P[1].x, P[1].y, P[2].x, P[2].y, P[3].x, P[3].y); */ /* Get BBox: */ for (i=0; i<4; i++){ if (P[i].x < (float) resultbox.llx) resultbox.llx=(int) floor(P[i].x +0.5); if (P[i].x > (float) resultbox.urx) resultbox.urx=(int) floor(P[i].x +0.5); if (P[i].y < (float) resultbox.lly) resultbox.lly=(int) floor(P[i].y +0.5); if (P[i].y > (float) resultbox.ury) resultbox.ury=(int) floor(P[i].y +0.5); } return(resultbox); } void exitprog(Widget exitbutton, XtPointer client_data , XtPointer call_data) { int i; for (i=0; i< T1_GetNoFonts(); i++){ /* printf("Enc-Scheme=%s\n", T1_GetEncodingScheme( i));*/ ; } T1_CloseLib(); exit(0); } void togglekerning( Widget kerningbutton, XtPointer client_data, XtPointer call_data) { int i; char state=0; Arg args[10]; /* Get state of toggle Button: */ i=0; XtSetArg(args[i], XtNstate, &state); i++; XtGetValues(kerningbutton,args,1); if ((state)) Modflag |= T1_KERNING; else Modflag &= ~T1_KERNING; } void toggleligatur( Widget ligaturbutton, XtPointer client_data, XtPointer call_data) { int i; char state=0; Arg args[10]; /* Get state of toggle Button: */ i=0; XtSetArg(args[i], XtNstate, &state); i++; XtGetValues(ligaturbutton,args,1); LigDetect=state; } void toggler2l( Widget r2lbutton, XtPointer client_data, XtPointer call_data) { int i; char state=0; Arg args[10]; /* Get state of toggle Button: */ i=0; XtSetArg(args[i], XtNstate, &state); i++; XtGetValues(r2lbutton,args,1); if ((state)) Modflag |= T1_RIGHT_TO_LEFT; else Modflag &= ~T1_RIGHT_TO_LEFT; /* Invert state */ i=0; if (state){ XtSetArg( args[i], XtNwidth, 55 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, "<--|" ); i++; } else{ XtSetArg( args[i], XtNwidth, 55 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; XtSetArg( args[i], XtNlabel, "|-->" ); i++; } XtSetValues(r2lbutton,args,i); } void toggleunderline( Widget underlinebutton, XtPointer client_data, XtPointer call_data) { int i; char state=0; Arg args[10]; /* Get state of toggle Button: */ i=0; XtSetArg(args[i], XtNstate, &state); i++; XtGetValues(underlinebutton,args,1); if ((state)) Modflag |= T1_UNDERLINE; else Modflag &= ~T1_UNDERLINE; } void toggleoverline( Widget overlinebutton, XtPointer client_data, XtPointer call_data) { int i; char state=0; Arg args[10]; /* Get state of toggle Button: */ i=0; XtSetArg(args[i], XtNstate, &state); i++; XtGetValues( overlinebutton,args,1); if ((state)) Modflag |= T1_OVERLINE; else Modflag &= ~T1_OVERLINE; } void toggleoverstrike( Widget overstrikebutton, XtPointer client_data, XtPointer call_data) { int i; char state=0; Arg args[10]; /* Get state of toggle Button: */ i=0; XtSetArg(args[i], XtNstate, &state); i++; XtGetValues( overstrikebutton,args,1); if ((state)) Modflag |= T1_OVERSTRIKE; else Modflag &= ~T1_OVERSTRIKE; } void toggleopacity( Widget opacitybutton, XtPointer client_data, XtPointer call_data) { int i; char state=0; Arg args[10]; /* Get state of toggle Button: */ i=0; XtSetArg(args[i], XtNstate, &state); i++; XtGetValues(opacitybutton,args,1); i=0; XtSetArg( args[i], XtNstate, state); i++; XtSetArg( args[i], XtNwidth, 80 ); i++; XtSetArg( args[i], XtNheight, 20 ); i++; Opacity=state; /* Invert state */ if (state){ XtSetArg( args[i], XtNlabel, "Opaque" ); i++; XtSetValues(opacitybutton,args,i); outbg=bg; } else{ XtSetArg( args[i], XtNlabel, "Transparent" ); i++; XtSetValues(opacitybutton,args,i); outbg=pink4.pixel; } } /* Toggle the antialiasing level */ void toggleaalevel( Widget aalevelbutton, XtPointer client_data, XtPointer call_data) { int i; char state=0; Arg args[10]; /* Get state of toggle Button: */ i=0; XtSetArg(args[i], XtNstate, &state); i++; XtGetValues( aalevelbutton,args,1); i=0; XtSetArg( args[i], XtNstate, state); i++; XtSetArg( args[i], XtNwidth, 80 ); i++; XtSetArg( args[i], XtNheight, 15 ); i++; /* Invert state */ if (state){ XtSetArg( args[i], XtNlabel, "AA-High" ); i++; XtSetValues(aalevelbutton,args,i); aalevel=T1_AA_HIGH; } else{ XtSetArg( args[i], XtNlabel, "AA-Low" ); i++; XtSetValues(aalevelbutton,args,i); aalevel=T1_AA_LOW; } } /* Set a new fore/background color */ void setcolor( Widget widget, XtPointer client_data, XtPointer call_data) { int i; Arg args[10]; /* foreground colors */ if (widget==fgwhitebutton){ fg=white.pixel; i=0; XtSetArg( args[i], XtNbackground, fg ); i++; XtSetValues(fgstatus,args,i); return; } if (widget==fgblackbutton){ fg=black.pixel; i=0; XtSetArg( args[i], XtNbackground, fg ); i++; XtSetValues(fgstatus,args,i); return; } if (widget==fggraybutton){ fg=gray.pixel; i=0; XtSetArg( args[i], XtNbackground, fg ); i++; XtSetValues(fgstatus,args,i); return; } if (widget==fgredbutton){ fg=red.pixel; i=0; XtSetArg( args[i], XtNbackground, fg ); i++; XtSetValues(fgstatus,args,i); return; } if (widget==fggreenbutton){ fg=green.pixel; i=0; XtSetArg( args[i], XtNbackground, fg ); i++; XtSetValues(fgstatus,args,i); return; } if (widget==fgbluebutton){ fg=blue.pixel; i=0; XtSetArg( args[i], XtNbackground, fg ); i++; XtSetValues(fgstatus,args,i); return; } /* background colors */ if (widget==bgwhitebutton){ bg=white.pixel; if (Opacity) outbg=bg; i=0; XtSetArg( args[i], XtNbackground, bg ); i++; XtSetValues(bgstatus,args,i); return; } if (widget==bgblackbutton){ bg=black.pixel; if (Opacity) outbg=bg; i=0; XtSetArg( args[i], XtNbackground, bg ); i++; XtSetValues(bgstatus,args,i); return; } if (widget==bggraybutton){ bg=gray.pixel; if (Opacity) outbg=bg; i=0; XtSetArg( args[i], XtNbackground, bg ); i++; XtSetValues(bgstatus,args,i); return; } if (widget==bgredbutton){ bg=red.pixel; if (Opacity) outbg=bg; i=0; XtSetArg( args[i], XtNbackground, bg ); i++; XtSetValues(bgstatus,args,i); return; } if (widget==bggreenbutton){ bg=green.pixel; if (Opacity) outbg=bg; i=0; XtSetArg( args[i], XtNbackground, bg ); i++; XtSetValues(bgstatus,args,i); return; } if (widget==bgbluebutton){ bg=blue.pixel; if (Opacity) outbg=bg; i=0; XtSetArg( args[i], XtNbackground, bg ); i++; XtSetValues(bgstatus,args,i); return; } /* we shouldn't get here */ return; } void showchar( Widget showcharbutton, XtPointer client_data, XtPointer call_data) { int i, j; Arg args[10]; sscanf( XawDialogGetValueString(dialogfontid),"%d", &FontID); sscanf( XawDialogGetValueString(dialogsize),"%f", &Size); sscanf( XawDialogGetValueString(dialogangle),"%f", &Angle); sscanf( XawDialogGetValueString(dialogtestcharacter), "%d", &TestChar); sscanf( XawDialogGetValueString(dialogdevres),"%d", &DeviceResolution); sscanf( XawDialogGetValueString(dialogstroke),"%d", &StrokeWidth); if (FontID<0 || FontID>=T1_GetNoFonts()) { sprintf(statusstring, "t1lib: FontID out of range!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Ensure that font is loaded before any operation on the font */ if ( T1_CheckForFontID( FontID) < 1 ) { T1_LoadFont( FontID); } if ( StrokeWidth == 0.0f ) { T1_ClearStrokeFlag( FontID); } else { T1_SetStrokeFlag( FontID); if ( T1_SetStrokeWidth( FontID, StrokeWidth) != 0 ) { sprintf( statusstring, "t1lib: Unable to setup strokewidth!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } } if (CheckTransform()==0 && Angle==0.0){ matrixP=NULL; } else{ matrixP=T1_RotateMatrix( &matrix, Angle); } if (DeviceResolution!=last_resolution[FontID]){ /* Delete all size dependent data for that font */ for ( i=0; i reset to internal encoding */ for (i=0; i so load it */ i=0; while (encstruct[i].encfilename != NULL) i++; encstruct[i].encoding=T1_LoadEncoding(EncodingFile); encstruct[i].encfilename=(char *)malloc(strlen(EncodingFile)+1); if (encstruct[i].encoding==NULL){ free( encstruct[i].encfilename); encstruct[i].encfilename=NULL; } i++; } for (j=0; jmetrics.ascent - glyph->metrics.descent; overallwidth=glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing; width=overallwidth; /* Prepare status message: */ sprintf(statusstring,"Elapsed time: %ld Microseconds\nLeftSideBearing: %d\nRightSideBearing: %d\nAscent: %d\nDescent: %d\nAdvanceX: %d\nAdvanceY: %d\nBits Per Pixel: %ld\nImage Size: %ld Bytes\nPostScript Fontname: %s\nCharactername: %s\nT1_errno: %d\n", time_diff(time_ptr_start,time_ptr_stop), glyph->metrics.leftSideBearing, glyph->metrics.rightSideBearing, glyph->metrics.ascent, glyph->metrics.descent, glyph->metrics.advanceX, glyph->metrics.advanceY, glyph->bpp, PAD(glyph->bpp*(glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing),XGLYPH_PAD)/8*(glyph->metrics.ascent-glyph->metrics.descent), T1_GetFontName(FontID), T1_GetCharName(FontID,(char)TestChar), T1_errno); if (glyph->bits !=NULL) { ximage=XCreateImage( display, DefaultVisual(display, screennumber), 1, /* depths for bitmap is 1 */ XYBitmap, /* XYBitmap or XYPixmap */ 0, /* No offset */ glyph->bits, width, height, t1_pad, /* lines padded to bytes */ 0 /*PAD(width,8)/8*/ /* number of bytes per line */ ); /* Force bit and byte order */ ximage->bitmap_bit_order=0; ximage->byte_order=0; XFreePixmap(display,pixmap); pixmap = XCreatePixmap(display, XtWindow(TopLevel), width, height, DefaultDepth(display,screennumber) ); XPutImage(display, pixmap, DefaultGC( display, screennumber), ximage, 0, 0, 0, 0, width, height ); XDestroyImage(ximage); } i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNbackgroundPixmap, XtUnspecifiedPixmap); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); i=0; XtSetArg( args[i], XtNwidth, width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, height + DOUBLEMARGIN); i++; if (glyph->bits != NULL) { XtSetArg( args[i], XtNbitmap, pixmap); i++; } else { XtSetArg( args[i], XtNbitmap, 0); i++; } XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, WhitePixel(display,screennumber)); i++; XtSetArg( args[i], XtNforeground, BlackPixel(display,screennumber)); i++; XtSetValues(OutputWindow ,args,i); i=0; XtSetArg( args[i], XtNwidth, width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, height + DOUBLEMARGIN); i++; if (glyph->bits != NULL) { XtSetArg( args[i], XtNbitmap, pixmap); i++; } else { XtSetArg( args[i], XtNbitmap, 0); i++; } XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetValues(Output ,args,i); glyph->bits=NULL; /* Since XDestroyImage() free's this also! */ } void showstring( Widget showstringbutton, XtPointer client_data, XtPointer call_data) { int i,j,k,l,m,none_found; Arg args[10]; char *theString='\0'; char *ligtheString='\0'; char *succs, *ligs; char buf_char; sscanf( XawDialogGetValueString(dialogfontid),"%d", &FontID); sscanf( XawDialogGetValueString(dialogsize),"%f", &Size); sscanf( XawDialogGetValueString(dialogangle),"%f", &Angle); sscanf( XawDialogGetValueString(dialogspace),"%ld", &Space); sscanf( XawDialogGetValueString(dialogdevres),"%d", &DeviceResolution); sscanf( XawDialogGetValueString(dialogstroke),"%d", &StrokeWidth); if (FontID<0 || FontID>=T1_GetNoFonts()) { sprintf(statusstring, "t1lib: FontID out of range!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Ensure that font is loaded before any operation on the font */ if ( T1_CheckForFontID( FontID) < 1 ) { T1_LoadFont( FontID); } if ( StrokeWidth == 0.0f ) { T1_ClearStrokeFlag( FontID); } else { T1_SetStrokeFlag( FontID); if ( T1_SetStrokeWidth( FontID, StrokeWidth) != 0 ) { sprintf( statusstring, "t1lib: Unable to setup strokewidth"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } } if (CheckTransform()==0 && Angle==0.0){ matrixP=NULL; } else{ matrixP=T1_RotateMatrix( &matrix, Angle); } if (DeviceResolution!=last_resolution[FontID]){ /* Delete all size dependent data for that font */ for ( i=0; i reset to internal encoding */ for (i=0; i so load it */ i=0; while (encstruct[i].encfilename != NULL) i++; encstruct[i].encoding=T1_LoadEncoding(EncodingFile); encstruct[i].encfilename=(char *)malloc(strlen(EncodingFile)+1); if (encstruct[i].encoding==NULL){ free( encstruct[i].encfilename); encstruct[i].encfilename=NULL; } i++; } for (j=0; j0){ buf_char=theString[j]; while (k>0){ none_found=1; for (l=0;lcompchar > -1 ? T1_GetCharName( FontID, ccd->compchar) : "not_enc", ccd->compchar, ccd->numPieces); printf( " basechar %s (%d)\n", ccd->pieces[0].piece > -1 ? T1_GetCharName( FontID, ccd->pieces[0].piece) : "not_enc", ccd->pieces[0].piece); printf( " accent %s (%d)\n", ccd->pieces[1].piece > -1 ? T1_GetCharName( FontID, ccd->pieces[1].piece) : "not_enc", ccd->pieces[1].piece); } T1_FreeCompCharData( ccd); } } */ XSetForeground( display, DefaultGC( display, screennumber), black.pixel); XSetBackground( display, DefaultGC( display, screennumber), white.pixel); /* Reset T1_errno: */ T1_errno=0; gettimeofday(time_ptr_start, void_ptr); if( extraflags & CHECK_CONCATGLYPHS){ glyph2=T1_SetString(FontID,(char *)ligtheString,0,Space,Modflag,Size,matrixP); glyph1=T1_CopyGlyph( glyph2); glyph2=T1_SetString(FontID+1,(char *)ligtheString,0,Space,Modflag,Size,matrixP); glyph=T1_ConcatGlyphs( glyph1, glyph2, 0, 0, Modflag); } else if( extraflags & CHECK_CONCATOUTLINES){ { T1_OUTLINE *path=NULL; path=T1_GetStringOutline(FontID,(char *)ligtheString, 0,Space,Modflag,Size,matrixP); if (path==NULL){ return; } #ifdef SHOW_MANIPULATE_PATHS T1_AbsolutePath( path); T1_ManipulatePath( path, &mymanipulate); T1_RelativePath( path); #else T1_ConcatOutlines( path, T1_GetStringOutline(FontID+1,(char *)ligtheString, 0,Space,Modflag,Size,matrixP)); #endif glyph=T1_FillOutline( path, Modflag); } } else{ if( extraflags & CHECK_FOR_BAD_CHARS){ sscanf( XawDialogGetValueString(dialogtestcharacter), "%d", &TestChar); ligtheString[strlen(ligtheString)/2]=(unsigned char) TestChar; } glyph=T1_SetString(FontID,(char *)ligtheString,0,Space,Modflag,Size,matrixP); } gettimeofday(time_ptr_stop, void_ptr); free(ligtheString); if ( glyph ==NULL ) { sprintf(statusstring, "t1lib: Couldn't generate Bitmap,\n(%s)", T1_StrError(T1_errno)); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } height=glyph->metrics.ascent - glyph->metrics.descent; overallwidth=glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing; width=overallwidth; /* Prepare status message: */ sprintf(statusstring,"Elapsed time: %ld Microseconds\nLeftSideBearing: %d\nRightSideBearing: %d\nAscent: %d\nDescent: %d\nAdvanceX: %d\nAdvanceY: %d\nBits Per Pixel: %ld\nImage Size: %ld Bytes\nPostScript Fontname: %s\nT1_errno: %d\n", time_diff(time_ptr_start,time_ptr_stop), glyph->metrics.leftSideBearing, glyph->metrics.rightSideBearing, glyph->metrics.ascent, glyph->metrics.descent, glyph->metrics.advanceX, glyph->metrics.advanceY, glyph->bpp, PAD(glyph->bpp*(glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing),XGLYPH_PAD)/8*(glyph->metrics.ascent-glyph->metrics.descent), T1_GetFontName(FontID), T1_errno); if (glyph->bits != NULL) { ximage=XCreateImage( display, DefaultVisual(display, screennumber), 1, /* depths for bitmap is 1 */ XYBitmap, /* XYBitmap or XYPixmap */ 0, /* No offset */ glyph->bits, width, height, t1_pad, /* lines padded to bytes */ 0 /*PAD(width,8)/8*/ /* number of bytes per line */ ); /* Force bit and byte order */ ximage->bitmap_bit_order=LSBFirst; ximage->byte_order=LSBFirst; XFreePixmap(display,pixmap); pixmap = XCreatePixmap(display, XtWindow(TopLevel), width, height, DefaultDepth(display,screennumber) ); XPutImage(display, pixmap, DefaultGC( display, screennumber), ximage, 0, 0, 0, 0, width, height ); XDestroyImage(ximage); } i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNbackgroundPixmap, XtUnspecifiedPixmap); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); i=0; XtSetArg( args[i], XtNwidth, width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, height + DOUBLEMARGIN); i++; if (glyph->bits != NULL) { XtSetArg( args[i], XtNbitmap, pixmap); i++; } else { XtSetArg( args[i], XtNbitmap, 0); i++; } XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, WhitePixel(display,screennumber)); i++; XtSetValues(OutputWindow ,args,i); i=0; XtSetArg( args[i], XtNwidth, width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, height + DOUBLEMARGIN); i++; if (glyph->bits != NULL) { XtSetArg( args[i], XtNbitmap, pixmap); i++; } else { XtSetArg( args[i], XtNbitmap, 0); i++; } XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, WhitePixel(display,screennumber)); i++; XtSetValues(Output ,args,i); glyph->bits=NULL; /* Since XDestroyImage() free's this also! */ } void aashowchar( Widget showcharbutton, XtPointer client_data, XtPointer call_data) { int i, j; Arg args[10]; sscanf( XawDialogGetValueString(dialogfontid),"%d", &FontID); sscanf( XawDialogGetValueString(dialogsize),"%f", &Size); sscanf( XawDialogGetValueString(dialogangle),"%f", &Angle); sscanf( XawDialogGetValueString(dialogtestcharacter), "%d", &TestChar); sscanf( XawDialogGetValueString(dialogdevres),"%d", &DeviceResolution); sscanf( XawDialogGetValueString(dialogstroke),"%d", &StrokeWidth); if (FontID<0 || FontID>=T1_GetNoFonts()) { sprintf(statusstring, "t1lib: FontID out of range!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Ensure that font is loaded before any operation on the font */ if ( T1_CheckForFontID( FontID) < 1 ) { T1_LoadFont( FontID); } if ( StrokeWidth == 0.0f ) { T1_ClearStrokeFlag( FontID); } else { T1_SetStrokeFlag( FontID); if ( T1_SetStrokeWidth( FontID, StrokeWidth) != 0 ) { sprintf( statusstring, "t1lib: Unable to setup strokewidth"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } } if (CheckTransform()==0 && Angle==0.0){ matrixP=NULL; } else{ matrixP=T1_RotateMatrix( &matrix, Angle); } if (DeviceResolution!=last_resolution[FontID]){ /* Delete all size dependent data for that font */ for ( i=0; i reset to internal encoding */ for (i=0; i so load it */ i=0; while (encstruct[i].encfilename != NULL) i++; encstruct[i].encoding=T1_LoadEncoding(EncodingFile); encstruct[i].encfilename=(char *)malloc(strlen(EncodingFile)+1); if (encstruct[i].encoding==NULL){ free( encstruct[i].encfilename); encstruct[i].encfilename=NULL; } i++; } for (j=0; jmetrics.ascent - glyph->metrics.descent; overallwidth=glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing; width=overallwidth; /* Prepare status message: */ sprintf(statusstring,"Elapsed time: %ld Microseconds\nLeftSideBearing: %d\nRightSideBearing: %d\nAscent: %d\nDescent: %d\nAdvanceX: %d\nAdvanceY: %d\nBits Per Pixel: %ld\nImage Size: %ld Bytes\nPostScript Fontname: %s\nCharactername: %s\nT1_errno: %d\n", time_diff(time_ptr_start,time_ptr_stop), glyph->metrics.leftSideBearing, glyph->metrics.rightSideBearing, glyph->metrics.ascent, glyph->metrics.descent, glyph->metrics.advanceX, glyph->metrics.advanceY, glyph->bpp, PAD(glyph->bpp*(glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing),XGLYPH_PAD)/8*(glyph->metrics.ascent-glyph->metrics.descent), T1_GetFontName(FontID), T1_GetCharName(FontID,(char)TestChar), T1_errno); /* printf("glyph->bits=%u\n", glyph->bits); printf("glyph->metrics.leftSideBearing=%u\n", glyph->metrics.leftSideBearing); printf("glyph->metrics.rightSideBearing=%u\n", glyph->metrics.rightSideBearing); printf("glyph->metrics.advanceX=%u\n", glyph->metrics.advanceX); printf("glyph->metrics.ascent=%u\n", glyph->metrics.ascent); printf("glyph->metrics.descent=%u\n", glyph->metrics.descent); printf("glyph->pFontCacheInfo=%u\n", glyph->pFontCacheInfo); */ if (glyph->bits != NULL) { ximage=XCreateImage( display, DefaultVisual(display, screennumber), DefaultDepth(display,screennumber), /* depths for bitmap is 1 */ ZPixmap, /* XYBitmap or XYPixmap */ 0, /* No offset */ glyph->bits, width, height, t1_pad, /* lines padded to bytes */ 0 /*PAD(width,8)/8*/ /* number of bytes per line */ ); ximage->byte_order=xglyph_byte_order; XFreePixmap(display,pixmap); pixmap = XCreatePixmap(display, XtWindow(TopLevel), width, height, DefaultDepth(display,screennumber) /* 8 */ /* depth */ ); XPutImage(display, pixmap, DefaultGC( display, screennumber), ximage, 0, 0, 0, 0, width, height ); XDestroyImage(ximage); } i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNbackgroundPixmap, XtUnspecifiedPixmap); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); i=0; XtSetArg( args[i], XtNwidth, width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, height + DOUBLEMARGIN); i++; if (glyph->bits != NULL) { XtSetArg( args[i], XtNbitmap, pixmap); i++; } else { XtSetArg( args[i], XtNbitmap, 0); i++; } XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, WhitePixel(display,screennumber)); i++; XtSetValues(OutputWindow ,args,i); i=0; XtSetArg( args[i], XtNwidth, width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, height + DOUBLEMARGIN); i++; if (glyph->bits != NULL) { XtSetArg( args[i], XtNbitmap, pixmap); i++; } else { XtSetArg( args[i], XtNbitmap, 0); i++; } XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetValues(Output ,args,i); glyph->bits=NULL; /* Since XDestroyImage() free's this also! */ } void aashowstring( Widget showstringbutton, XtPointer client_data, XtPointer call_data) { int i,j,k,l,m,none_found; Arg args[10]; char *theString='\0'; char *ligtheString='\0'; char *succs, *ligs; char buf_char; sscanf( XawDialogGetValueString(dialogfontid),"%d", &FontID); sscanf( XawDialogGetValueString(dialogsize),"%f", &Size); sscanf( XawDialogGetValueString(dialogangle),"%f", &Angle); sscanf( XawDialogGetValueString(dialogspace),"%ld", &Space); sscanf( XawDialogGetValueString(dialogdevres),"%d", &DeviceResolution); sscanf( XawDialogGetValueString(dialogstroke),"%d", &StrokeWidth); if (FontID<0 || FontID>=T1_GetNoFonts()) { sprintf(statusstring, "t1lib: FontID out of range!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Ensure that font is loaded before any operation on the font */ if ( T1_CheckForFontID( FontID) < 1 ) { T1_LoadFont( FontID); } if ( StrokeWidth == 0.0f ) { T1_ClearStrokeFlag( FontID); } else { T1_SetStrokeFlag( FontID); if ( T1_SetStrokeWidth( FontID, StrokeWidth) != 0 ) { sprintf( statusstring, "t1lib: Unable to setup strokewidth"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } } if (CheckTransform()==0 && Angle==0.0){ matrixP=NULL; } else{ matrixP=T1_RotateMatrix( &matrix, Angle); } if (DeviceResolution!=last_resolution[FontID]){ /* Delete all size dependent data for that font */ for ( i=0; i reset to internal encoding */ for (i=0; i so load it */ i=0; while (encstruct[i].encfilename != NULL) i++; encstruct[i].encoding=T1_LoadEncoding(EncodingFile); encstruct[i].encfilename=(char *)malloc(strlen(EncodingFile)+1); if (encstruct[i].encoding==NULL){ free( encstruct[i].encfilename); encstruct[i].encfilename=NULL; } i++; } for (j=0; j0){ buf_char=theString[j]; while (k>0){ none_found=1; for (l=0;lmetrics.ascent - glyph->metrics.descent; overallwidth=glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing; width=overallwidth; /* Prepare status message: */ sprintf(statusstring,"Elapsed time: %ld Microseconds\nLeftSideBearing: %d\nRightSideBearing: %d\nAscent: %d\nDescent: %d\nAdvanceX: %d\nAdvanceY: %d\nBits Per Pixel: %ld\nImage Size: %ld Bytes\nPostScript Fontname: %s\nT1_errno: %d\n", time_diff(time_ptr_start,time_ptr_stop), glyph->metrics.leftSideBearing, glyph->metrics.rightSideBearing, glyph->metrics.ascent, glyph->metrics.descent, glyph->metrics.advanceX, glyph->metrics.advanceY, glyph->bpp, PAD(glyph->bpp*(glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing),XGLYPH_PAD)/8*(glyph->metrics.ascent-glyph->metrics.descent), T1_GetFontName(FontID), T1_errno); /* printf("glyph->bits=%u\n", glyph->bits); printf("glyph->metrics.leftSideBearing=%u\n", glyph->metrics.leftSideBearing); printf("glyph->metrics.rightSideBearing=%u\n", glyph->metrics.rightSideBearing); printf("glyph->metrics.advanceX=%u\n", glyph->metrics.advanceX); printf("glyph->metrics.ascent=%u\n", glyph->metrics.ascent); printf("glyph->metrics.descent=%u\n", glyph->metrics.descent); printf("glyph->pFontCacheInfo=%u\n", glyph->pFontCacheInfo); */ if (glyph->bits != NULL) { ximage=XCreateImage( display, DefaultVisual(display, screennumber), DefaultDepth(display,screennumber), ZPixmap, /* XYBitmap or XYPixmap */ 0, /* No offset */ glyph->bits, width, height, t1_pad, /* lines padded to bytes */ 0 /* number of bytes per line */ ); ximage->byte_order=xglyph_byte_order; XFreePixmap(display,pixmap); pixmap = XCreatePixmap(display, XtWindow(TopLevel), width, height, DefaultDepth(display,screennumber) ); XPutImage(display, pixmap, DefaultGC( display, screennumber), ximage, 0, 0, 0, 0, width, height ); XDestroyImage(ximage); } i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNbackgroundPixmap, XtUnspecifiedPixmap); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); i=0; XtSetArg( args[i], XtNwidth, width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, height + DOUBLEMARGIN); i++; if (glyph->bits != NULL) { XtSetArg( args[i], XtNbitmap, pixmap); i++; } else { XtSetArg( args[i], XtNbitmap, 0); i++; } XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, WhitePixel( display, screennumber)); i++; XtSetValues(OutputWindow ,args,i); i=0; XtSetArg( args[i], XtNwidth, width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, height + DOUBLEMARGIN); i++; if (glyph->bits != NULL) { XtSetArg( args[i], XtNbitmap, pixmap); i++; } else { XtSetArg( args[i], XtNbitmap, 0); i++; } XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, WhitePixel( display, screennumber)); i++; XtSetValues(Output ,args,i); glyph->bits=NULL; /* Since XDestroyImage() free's this also! */ } void showcharX( Widget showcharbutton, XtPointer client_data, XtPointer call_data) { int i, j; Arg args[10]; int tmp_width, tmp_height; sscanf( XawDialogGetValueString(dialogfontid),"%d", &FontID); sscanf( XawDialogGetValueString(dialogsize),"%f", &Size); sscanf( XawDialogGetValueString(dialogangle),"%f", &Angle); sscanf( XawDialogGetValueString(dialogtestcharacter), "%d", &TestChar); sscanf( XawDialogGetValueString(dialogdevres),"%d", &DeviceResolution); sscanf( XawDialogGetValueString(dialogstroke),"%d", &StrokeWidth); if (FontID<0 || FontID>=T1_GetNoFonts()) { sprintf(statusstring, "t1lib: FontID out of range!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Ensure that font is loaded before any operation on the font */ if ( T1_CheckForFontID( FontID) < 1 ) { T1_LoadFont( FontID); } if ( StrokeWidth == 0.0f ) { T1_ClearStrokeFlag( FontID); } else { T1_SetStrokeFlag( FontID); if ( T1_SetStrokeWidth( FontID, StrokeWidth) != 0 ) { sprintf( statusstring, "t1lib: Unable to setup strokewidth"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } } if (CheckTransform()==0 && Angle==0.0){ matrixP=NULL; } else{ matrixP=T1_RotateMatrix( &matrix, Angle); } if (DeviceResolution!=last_resolution[FontID]){ /* Delete all size dependent data for that font */ for ( i=0; i reset to internal encoding */ for (i=0; i so load it */ i=0; while (encstruct[i].encfilename != NULL) i++; encstruct[i].encoding=T1_LoadEncoding(EncodingFile); encstruct[i].encfilename=(char *)malloc(strlen(EncodingFile)+1); if (encstruct[i].encoding==NULL){ free( encstruct[i].encfilename); encstruct[i].encfilename=NULL; } i++; } for (j=0; jmetrics.advanceX - CROSS_SIZE, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY, XOUTPUT_HALFHSIZE + glyph->metrics.advanceX + CROSS_SIZE, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY); XDrawLine( display, tmp_pixmap, DefaultGC( display, screennumber), XOUTPUT_HALFHSIZE + glyph->metrics.advanceX, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY - CROSS_SIZE, XOUTPUT_HALFHSIZE + glyph->metrics.advanceX, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY + CROSS_SIZE); } } XSetForeground( display, DefaultGC( display, screennumber), fg); /* Check for errors */ if (glyph==NULL) { sprintf(statusstring, "t1lib: Couldn't generate Bitmap,\n(%s)", T1_StrError(T1_errno)); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Prepare status message: */ sprintf(statusstring,"Elapsed time: %ld Microseconds\nLeftSideBearing: %d\nRightSideBearing: %d\nAscent: %d\nDescent: %d\nAdvanceX: %d\nAdvanceY: %d\nBits Per Pixel: %ld\nImage Size: %ld Bytes\nPostScript Fontname: %s\nCharactername: %s\nT1_errno: %d\n", time_diff(time_ptr_start,time_ptr_stop), glyph->metrics.leftSideBearing, glyph->metrics.rightSideBearing, glyph->metrics.ascent, glyph->metrics.descent, glyph->metrics.advanceX, glyph->metrics.advanceY, glyph->bpp, PAD(glyph->bpp*(glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing),XGLYPH_PAD)/8*(glyph->metrics.ascent-glyph->metrics.descent), T1_GetFontName(FontID), T1_GetCharName(FontID,(char)TestChar), T1_errno); /* Finally, set the resources: */ i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNbackgroundPixmap, XtUnspecifiedPixmap); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); i=0; XtSetArg( args[i], XtNwidth, tmp_width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, tmp_height + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNbitmap, tmp_pixmap); i++; XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, outbg); i++; XtSetValues(OutputWindow ,args,i); i=0; XtSetArg( args[i], XtNwidth, tmp_width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, tmp_height + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNbitmap, tmp_pixmap); i++; XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetValues(Output ,args,i); } void showstringX( Widget showstringbutton, XtPointer client_data, XtPointer call_data) { int i,j,k,l,m,none_found; Arg args[10]; int tmp_width, tmp_height; char *theString='\0'; char *ligtheString='\0'; char *succs, *ligs; char buf_char; sscanf( XawDialogGetValueString(dialogfontid),"%d", &FontID); sscanf( XawDialogGetValueString(dialogsize),"%f", &Size); sscanf( XawDialogGetValueString(dialogangle),"%f", &Angle); sscanf( XawDialogGetValueString(dialogspace),"%ld", &Space); sscanf( XawDialogGetValueString(dialogdevres),"%d", &DeviceResolution); sscanf( XawDialogGetValueString(dialogstroke),"%d", &StrokeWidth); if (FontID<0 || FontID>=T1_GetNoFonts()) { sprintf(statusstring, "t1lib: FontID out of range!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Ensure that font is loaded before any operation on the font */ if ( T1_CheckForFontID( FontID) < 1 ) { T1_LoadFont( FontID); } if ( StrokeWidth == 0.0f ) { T1_ClearStrokeFlag( FontID); } else { T1_SetStrokeFlag( FontID); if ( T1_SetStrokeWidth( FontID, StrokeWidth) != 0 ) { sprintf( statusstring, "t1lib: Unable to setup strokewidth"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } } if (CheckTransform()==0 && Angle==0.0){ matrixP=NULL; } else{ matrixP=T1_RotateMatrix( &matrix, Angle); } if (DeviceResolution!=last_resolution[FontID]){ /* Delete all size dependent data for that font */ for ( i=0; i reset to internal encoding */ for (i=0; i so load it */ i=0; while (encstruct[i].encfilename != NULL) i++; encstruct[i].encoding=T1_LoadEncoding(EncodingFile); encstruct[i].encfilename=(char *)malloc(strlen(EncodingFile)+1); if (encstruct[i].encoding==NULL){ free( encstruct[i].encfilename); encstruct[i].encfilename=NULL; } i++; } for (j=0; j0){ buf_char=theString[j]; while (k>0){ none_found=1; for (l=0;lmetrics.advanceX - CROSS_SIZE, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY, XOUTPUT_HALFHSIZE + glyph->metrics.advanceX + CROSS_SIZE, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY); XDrawLine( display, tmp_pixmap, DefaultGC( display, screennumber), XOUTPUT_HALFHSIZE + glyph->metrics.advanceX, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY - CROSS_SIZE, XOUTPUT_HALFHSIZE + glyph->metrics.advanceX, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY + CROSS_SIZE); } } XSetForeground( display, DefaultGC( display, screennumber), fg); /* Free the ligature-converted string */ free(ligtheString); /* Check for errors */ if (glyph==NULL) { sprintf(statusstring, "t1lib: Couldn't generate Bitmap,\n(%s)", T1_StrError(T1_errno)); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Prepare status message: */ sprintf(statusstring,"Elapsed time: %ld Microseconds\nLeftSideBearing: %d\nRightSideBearing: %d\nAscent: %d\nDescent: %d\nAdvanceX: %d\nAdvanceY: %d\nBits Per Pixel: %ld\nImage Size: %ld Bytes\nPostScript Fontname: %s\nT1_errno: %d\n", time_diff(time_ptr_start,time_ptr_stop), glyph->metrics.leftSideBearing, glyph->metrics.rightSideBearing, glyph->metrics.ascent, glyph->metrics.descent, glyph->metrics.advanceX, glyph->metrics.advanceY, glyph->bpp, PAD(glyph->bpp*(glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing),XGLYPH_PAD)/8*(glyph->metrics.ascent-glyph->metrics.descent), T1_GetFontName(FontID), T1_errno); /* Finally, set resources */ i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNbackgroundPixmap, XtUnspecifiedPixmap); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); i=0; XtSetArg( args[i], XtNwidth, tmp_width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, tmp_height + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNbitmap, tmp_pixmap); i++; XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, outbg); i++; XtSetValues(OutputWindow ,args,i); i=0; XtSetArg( args[i], XtNwidth, tmp_width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, tmp_height + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNbitmap, tmp_pixmap); i++; XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, outbg); i++; XtSetValues(Output ,args,i); } void aashowcharX( Widget showcharbutton, XtPointer client_data, XtPointer call_data) { int i, j; Arg args[10]; int tmp_width, tmp_height; sscanf( XawDialogGetValueString(dialogfontid),"%d", &FontID); sscanf( XawDialogGetValueString(dialogsize),"%f", &Size); sscanf( XawDialogGetValueString(dialogangle),"%f", &Angle); sscanf( XawDialogGetValueString(dialogtestcharacter), "%d", &TestChar); sscanf( XawDialogGetValueString(dialogdevres),"%d", &DeviceResolution); sscanf( XawDialogGetValueString(dialogstroke),"%d", &StrokeWidth); if (FontID<0 || FontID>=T1_GetNoFonts()) { sprintf(statusstring, "t1lib: FontID out of range!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Ensure that font is loaded before any operation on the font */ if ( T1_CheckForFontID( FontID) < 1 ) { T1_LoadFont( FontID); } if ( StrokeWidth == 0.0f ) { T1_ClearStrokeFlag( FontID); } else { T1_SetStrokeFlag( FontID); if ( T1_SetStrokeWidth( FontID, StrokeWidth) != 0 ) { sprintf( statusstring, "t1lib: Unable to setup strokewidth"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } } if (CheckTransform()==0 && Angle==0.0){ matrixP=NULL; } else{ matrixP=T1_RotateMatrix( &matrix, Angle); } if (DeviceResolution!=last_resolution[FontID]){ /* Delete all size dependent data for that font */ for ( i=0; i reset to internal encoding */ for (i=0; i so load it */ i=0; while (encstruct[i].encfilename != NULL) i++; encstruct[i].encoding=T1_LoadEncoding(EncodingFile); encstruct[i].encfilename=(char *)malloc(strlen(EncodingFile)+1); if (encstruct[i].encoding==NULL){ free( encstruct[i].encfilename); encstruct[i].encfilename=NULL; } i++; } for (j=0; jmetrics.advanceX - CROSS_SIZE, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY, XOUTPUT_HALFHSIZE + glyph->metrics.advanceX + CROSS_SIZE, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY); XDrawLine( display, tmp_pixmap, DefaultGC( display, screennumber), XOUTPUT_HALFHSIZE + glyph->metrics.advanceX, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY - CROSS_SIZE, XOUTPUT_HALFHSIZE + glyph->metrics.advanceX, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY + CROSS_SIZE); } } XSetForeground( display, DefaultGC( display, screennumber), fg); /* Check for errors */ if (glyph==NULL) { sprintf(statusstring, "t1lib: Couldn't generate Bitmap,\n(%s)", T1_StrError(T1_errno)); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Prepare status message: */ sprintf(statusstring,"Elapsed time: %ld Microseconds\nLeftSideBearing: %d\nRightSideBearing: %d\nAscent: %d\nDescent: %d\nAdvanceX: %d\nAdvanceY: %d\nBits Per Pixel: %ld\nImage Size: %ld Bytes\nPostScript Fontname: %s\nCharactername: %s\nT1_errno: %d\n", time_diff(time_ptr_start,time_ptr_stop), glyph->metrics.leftSideBearing, glyph->metrics.rightSideBearing, glyph->metrics.ascent, glyph->metrics.descent, glyph->metrics.advanceX, glyph->metrics.advanceY, glyph->bpp, PAD(glyph->bpp*(glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing),XGLYPH_PAD)/8*(glyph->metrics.ascent-glyph->metrics.descent), T1_GetFontName(FontID), T1_GetCharName(FontID,(char)TestChar), T1_errno); /* Finally, set the resources: */ i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNbackgroundPixmap, XtUnspecifiedPixmap); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); i=0; XtSetArg( args[i], XtNwidth, tmp_width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, tmp_height + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNbitmap, tmp_pixmap); i++; XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, outbg); i++; XtSetValues(OutputWindow ,args,i); i=0; XtSetArg( args[i], XtNwidth, tmp_width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, tmp_height + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNbitmap, tmp_pixmap); i++; XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetValues(Output ,args,i); } void aashowstringX( Widget showstringbutton, XtPointer client_data, XtPointer call_data) { int i,j,k,l,m,none_found; Arg args[10]; int tmp_width, tmp_height; char *theString='\0'; char *ligtheString='\0'; char *succs, *ligs; char buf_char; sscanf( XawDialogGetValueString(dialogfontid),"%d", &FontID); sscanf( XawDialogGetValueString(dialogsize),"%f", &Size); sscanf( XawDialogGetValueString(dialogangle),"%f", &Angle); sscanf( XawDialogGetValueString(dialogspace),"%ld", &Space); sscanf( XawDialogGetValueString(dialogdevres),"%d", &DeviceResolution); sscanf( XawDialogGetValueString(dialogstroke),"%d", &StrokeWidth); if (FontID<0 || FontID>=T1_GetNoFonts()) { sprintf(statusstring, "t1lib: FontID out of range!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Ensure that font is loaded before any operation on the font */ if ( T1_CheckForFontID( FontID) < 1 ) { T1_LoadFont( FontID); } if ( StrokeWidth == 0.0f ) { T1_ClearStrokeFlag( FontID); } else { T1_SetStrokeFlag( FontID); if ( T1_SetStrokeWidth( FontID, StrokeWidth) != 0 ) { sprintf( statusstring, "t1lib: Unable to setup strokewidth"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } } if (CheckTransform()==0 && Angle==0.0){ matrixP=NULL; } else{ matrixP=T1_RotateMatrix( &matrix, Angle); } if (DeviceResolution!=last_resolution[FontID]){ /* Delete all size dependent data for that font */ for ( i=0; i reset to internal encoding */ for (i=0; i so load it */ i=0; while (encstruct[i].encfilename != NULL) i++; encstruct[i].encoding=T1_LoadEncoding(EncodingFile); encstruct[i].encfilename=(char *)malloc(strlen(EncodingFile)+1); if (encstruct[i].encoding==NULL){ free( encstruct[i].encfilename); encstruct[i].encfilename=NULL; } i++; } else for (j=0; j0){ buf_char=theString[j]; while (k>0){ none_found=1; for (l=0;lmetrics.advanceX - CROSS_SIZE, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY, XOUTPUT_HALFHSIZE + glyph->metrics.advanceX + CROSS_SIZE, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY); XDrawLine( display, tmp_pixmap, DefaultGC( display, screennumber), XOUTPUT_HALFHSIZE + glyph->metrics.advanceX, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY - CROSS_SIZE, XOUTPUT_HALFHSIZE + glyph->metrics.advanceX, XOUTPUT_HALFVSIZE - glyph->metrics.advanceY + CROSS_SIZE); } } XSetForeground( display, DefaultGC( display, screennumber), fg); /* Free the ligature-converted string */ free(ligtheString); /* Check for errors */ if (glyph==NULL) { sprintf(statusstring, "t1lib: Couldn't generate Bitmap,\n(%s)", T1_StrError(T1_errno)); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Prepare status message: */ sprintf(statusstring,"Elapsed time: %ld Microseconds\nLeftSideBearing: %d\nRightSideBearing: %d\nAscent: %d\nDescent: %d\nAdvanceX: %d\nAdvanceY: %d\nBits Per Pixel: %ld\nImage Size: %ld Bytes\nPostScript Fontname: %s\nT1_errno: %d\n", time_diff(time_ptr_start,time_ptr_stop), glyph->metrics.leftSideBearing, glyph->metrics.rightSideBearing, glyph->metrics.ascent, glyph->metrics.descent, glyph->metrics.advanceX, glyph->metrics.advanceY, glyph->bpp, PAD(glyph->bpp*(glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing),XGLYPH_PAD)/8*(glyph->metrics.ascent-glyph->metrics.descent), T1_GetFontName(FontID), T1_errno); /* Finally, set resources */ i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNbackgroundPixmap, XtUnspecifiedPixmap); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); i=0; XtSetArg( args[i], XtNwidth, tmp_width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, tmp_height + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNbitmap, tmp_pixmap); i++; XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, outbg); i++; XtSetValues(OutputWindow ,args,i); i=0; XtSetArg( args[i], XtNwidth, tmp_width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, tmp_height + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNbitmap, tmp_pixmap); i++; XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, outbg); i++; XtSetValues(Output ,args,i); } void fonttable( Widget fonttablebutton, XtPointer client_data, XtPointer call_data) { int i, j; Arg args[10]; static Pixmap pixmap=0; int x, y; int CellLeftMargin, CellTopMargin; int ColAdvance, RowAdvance; int width, height; int FontID, DeviceResolution; float Size, Extent, Slant; float scale; BBox fontbbox, tmpbbox; sscanf( XawDialogGetValueString(dialogfontid),"%d", &FontID); sscanf( XawDialogGetValueString(dialogsize),"%f", &Size); sscanf( XawDialogGetValueString(dialogangle),"%f", &Angle); sscanf( XawDialogGetValueString(dialogspace),"%ld", &Space); sscanf( XawDialogGetValueString(dialogdevres),"%d", &DeviceResolution); sscanf( XawDialogGetValueString(dialogstroke),"%d", &StrokeWidth); if (FontID<0 || FontID>=T1_GetNoFonts()) { sprintf(statusstring, "t1lib: FontID out of range!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Ensure that font is loaded before any operation on the font */ if ( T1_CheckForFontID( FontID) < 1 ) { T1_LoadFont( FontID); } if ( StrokeWidth == 0.0f ) { T1_ClearStrokeFlag( FontID); } else { T1_SetStrokeFlag( FontID); if ( T1_SetStrokeWidth( FontID, StrokeWidth) != 0 ) { sprintf( statusstring, "t1lib: Unable to setup strokewidth"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } } /* We don't obey rotation when displaying a fonttable */ matrixP=NULL; if (DeviceResolution!=last_resolution[FontID]){ /* Delete all size dependent data for that font */ for ( i=0; i reset to internal encoding */ for (i=0; i so load it */ i=0; while (encstruct[i].encfilename != NULL) i++; encstruct[i].encoding=T1_LoadEncoding(EncodingFile); encstruct[i].encfilename=(char *)malloc(strlen(EncodingFile)+1); if (encstruct[i].encoding==NULL){ free( encstruct[i].encfilename); encstruct[i].encfilename=NULL; } i++; } else for (j=0; jfontbbox.urx) fontbbox.urx=tmpbbox.urx; if (tmpbbox.ury>fontbbox.ury) fontbbox.ury=tmpbbox.ury; } } /* We scale the font bounding box according to extent, slant and device resolution. For the slant, we assume that the font contains at least one character which reaches to the upper right corner and the same for lower left corner. */ scale=DeviceResolution/72.0; fontbbox.urx=fontbbox.urx+(int)((float)fontbbox.ury*Slant); fontbbox.llx=fontbbox.llx+(int)((float)fontbbox.lly*Slant); fontbbox.urx=(int)((float)fontbbox.urx*Extent); fontbbox.llx=(int)((float)fontbbox.llx*Extent); fontbbox.llx=(int)((float)fontbbox.llx*scale); fontbbox.urx=(int)((float)fontbbox.urx*scale); fontbbox.lly=(int)((float)fontbbox.lly*scale); fontbbox.ury=(int)((float)fontbbox.ury*scale); /* Left and top margin of the char-origins with respect upper left corner of cell */ CellTopMargin=SIMPLEMARGIN + fontbbox.ury; if (fontbbox.llx < 0){ CellLeftMargin= - fontbbox.llx; } else{ CellLeftMargin=0; } /* How much to advance in which direction when incrementing */ ColAdvance=CellLeftMargin + fontbbox.urx ; RowAdvance=CellTopMargin - fontbbox.lly ; /* Scale the charspace values */ CellTopMargin = (int) floor((double)CellTopMargin*Size/1000.0+0.5)+SIMPLEMARGIN; CellLeftMargin = (int) floor((double)CellLeftMargin*Size/1000.0+0.5)+SIMPLEMARGIN; ColAdvance = (int) floor((double)ColAdvance*Size/1000.0+0.5)+DOUBLEMARGIN; RowAdvance = (int) floor((double)RowAdvance*Size/1000.0+0.5)+DOUBLEMARGIN; /* Overall width and height of map */ width=1+(16*ColAdvance); height=1+(16*RowAdvance); /* We clip to a window as large as the screen in this function */ if (width > 1024) width=WidthOfScreen(screen); if (height > 768) height=HeightOfScreen(screen); /* Create pixmap of appropriate size, */ if (pixmap!=0) XFreePixmap( display, pixmap); pixmap=XCreatePixmap( display, XtWindow(TopLevel), width, height, depth ); /* We always use opaque mode */ XSetForeground( display, DefaultGC( display, screennumber), bg); XFillRectangle( display, pixmap, DefaultGC( display, screennumber), 0, 0, width, height); XSetForeground( display, DefaultGC( display, screennumber), fg); XSetBackground( display, DefaultGC( display, screennumber), bg); /* Draw cell grid: */ for (j=0; j<17; j++){ XDrawLine( display, pixmap, DefaultGC( display, screennumber), j*ColAdvance, 0, j*ColAdvance, height); } for (j=0; j<17; j++){ XDrawLine( display, pixmap, DefaultGC( display, screennumber), 0, j*RowAdvance, width, j*RowAdvance); } /* Reset T1_errno: */ T1_errno=0; /* Set antialiasing level */ T1_AASetLevel( aalevel); /* Draw characters into pixmap */ for ( i=0; i<16; ) { /* row-loop */ for ( j=0; j<16; j++) { x=1+(j*ColAdvance)+CellLeftMargin; y=1+CellTopMargin+(i*RowAdvance); glyph=T1_AASetCharX( pixmap, DefaultGC( display, screennumber), 1, x, y, FontID, (char) (i*16+j), Size, matrixP); if (x>width) { sprintf( msg_buf, "Clipping row %d horizontally at column %d", i, j); T1_PrintLog( "fonttable()", msg_buf, T1LOG_STATISTIC); break; } } if (y>height) { sprintf( msg_buf, "Clipping vertically at row %d", i); T1_PrintLog( "fonttable()", msg_buf, T1LOG_STATISTIC); break; } i++; } /* If font was not loadable */ if (T1_GetFontName( FontID)==NULL) sprintf(statusstring, "t1lib: Can't get font name, T1_errno=%d!", T1_errno); else sprintf(statusstring,"Font %s, final T1_errno = %d\n %s", T1_GetFontName( FontID), T1_errno, T1_StrError(T1_errno)); /* Finally, set resources */ i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNbackgroundPixmap, XtUnspecifiedPixmap); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); i=0; XtSetArg( args[i], XtNwidth, width); i++; XtSetArg( args[i], XtNheight, height); i++; XtSetArg( args[i], XtNbitmap, pixmap); i++; XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, outbg); i++; XtSetValues(OutputWindow ,args,i); i=0; XtSetArg( args[i], XtNwidth, width); i++; XtSetArg( args[i], XtNheight, height); i++; XtSetArg( args[i], XtNbitmap, pixmap); i++; XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, outbg); i++; XtSetValues(Output ,args,i); } /* This function shows the About-message */ void showabout( Widget aboutbutton, XtPointer client_data, XtPointer call_data) { int i; Arg args[10]; Pixmap about=0; XGCValues xgcvalues; GC gc; static char ident[80]=""; #define T1GCMASK GCForeground | GCBackground if (about==0) { about=XCreatePixmap( display, XtWindow(TopLevel), 380, MESSAGEBOXHEIGHT, depth); } gc=DefaultGC( display, screennumber); XGetGCValues( display, gc, T1GCMASK, &xgcvalues); fg=xgcvalues.foreground; bg=xgcvalues.background; XSetForeground( display, gc, white.pixel); XFillRectangle( display, about, gc, 0, 0, 380, MESSAGEBOXHEIGHT); XSetForeground( display, gc, black.pixel); XSetBackground( display, gc, white.pixel); /* Set antialiasing level */ T1_AASetLevel( aalevel); sprintf( ident, "This is xglyph, T1Lib Version %s", T1_GetLibIdent()); glyph=T1_AASetStringX( about, gc, 1, 10, 30, /* x_dest, y_dest */ 0, ident, 0, 0.0, T1_UNDERLINE | T1_KERNING, 20.0, NULL); glyph=T1_AASetStringX( about, gc, 1, 10, 60, /* x_dest, y_dest */ 0, "xglyph is an interactive tool for illustrating some", 0, 0.0, T1_KERNING, 15.0, NULL); glyph=T1_AASetStringX( about, gc, 1, 10, 80, /* x_dest, y_dest */ 0, "of the T1Lib features. T1Lib is distributed under", 0, 0.0, T1_KERNING, 15.0, NULL); glyph=T1_AASetStringX( about, gc, 1, 10, 100, /* x_dest, y_dest */ 0, "the GNU General Public Library License (LGPL).", 0, 0.0, T1_KERNING, 15.0, NULL); glyph=T1_AASetStringX( about, gc, 1, 10, 133, /* x_dest, y_dest */ 0, "Enjoy it!", 0, 0.0, T1_KERNING, 15.0, NULL); XSetForeground( display, gc, fg); XSetBackground( display, gc, bg); i=0; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNbackgroundPixmap, about); i++; XtSetArg(args[i], XtNlabel, ""); i++; XtSetValues(labelstatus,args,i); } /* This function returns a time difference in Microseconds, provided that the time difference is not greater than approximately 35 minutes. */ long time_diff(struct timeval *time_ptr_start, struct timeval *time_ptr_stop) { return((time_ptr_stop->tv_sec - time_ptr_start->tv_sec)*1000000 +(time_ptr_stop->tv_usec - time_ptr_start->tv_usec)); } /* T1_ComputeAAColorsX(): Compute the antialiasing colors in dependency of foreground and background */ int ComputeAAColorsX( unsigned long fg, unsigned long bg, int nolevels) { static unsigned long last_fg; static unsigned long last_bg; unsigned long delta_red, delta_green, delta_blue; int i; int nocolors=0; aacolors[0].pixel=bg; aacolors[nolevels-1].pixel=fg; if ((fg==last_fg)&&(bg==last_bg)) return(nocolors); /* Get RGB values for fore- and background */ XQueryColor( display, DefaultColormap(display,screennumber), &aacolors[0]); XQueryColor( display, DefaultColormap(display,screennumber), &aacolors[nolevels-1]); delta_red = (aacolors[nolevels-1].red - aacolors[0].red)/(nolevels-1); delta_green = (aacolors[nolevels-1].green - aacolors[0].green)/(nolevels-1); delta_blue = (aacolors[nolevels-1].blue - aacolors[0].blue)/(nolevels-1); aapixels[0]=aacolors[0].pixel; aapixels[nolevels-1]=aacolors[nolevels-1].pixel; for (i=1; i .dependencies clean: dummy $(RM) xglyph *.lo *.o .libs/* *~ \#*\# *.log *.bak -rmdir .libs install: dummy $(MKINSTALLDIRS) $(DESTDIR)$(bindir) $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) xglyph $(DESTDIR)$(bindir)/xglyph uninstall: dummy $(LIBTOOL) --mode=uninstall $(RM) -f $(DESTDIR)$(bindir)/xglyph dummy: # Dependencies of object files (generated by "gcc -MM *.c"): include .dependencies xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/xglyph/bchr.pfb0000664000175000017500000010406511742726712022444 0ustar uwabamiuwabami€Ô%!PS-AdobeFont-1.0 %%CreationDate: Fri Nov 2 19:00:13 1990 % Bitstream Type 1 Font Program % Copyright 1990 as an unpublished work by Bitstream Inc., Cambridge, MA. % All rights reserved. % Confidential and proprietary to Bitstream Inc. % U.S. GOVERNMENT RESTRICTED RIGHTS % This software typeface product is provided with RESTRICTED RIGHTS. Use, % duplication or disclosure by the Government is subject to restrictions % as set forth in the license agreement and in FAR 52.227-19 (c) (2) (May, 1987), % when applicable, or the applicable provisions of the DOD FAR supplement % 252.227-7013 subdivision (a) (15) (April, 1988) or subdivision (a) (17) % (April, 1988). Contractor/manufacturer is Bitstream Inc., % 215 First Street, Cambridge, MA 02142. % Bitstream is a registered trademark of Bitstream Inc. 11 dict begin /FontInfo 9 dict dup begin /version (2.0-1.0) readonly def /Notice (Copyright 1990 as an unpublished work by Bitstream Inc. All rights reserved. Confidential.) readonly def /FullName (Bitstream Charter) readonly def /FamilyName (Bitstream Charter) readonly def /Weight (Normal) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -109 def /UnderlineThickness 61 def end readonly def /FontName /CharterBT-Roman def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding StandardEncoding def /FontBBox {-161 -236 1193 963} readonly def /UniqueID 15530648 def currentdict end currentfile eexec €9€¢•@ƒŠA3ƒœ©Ò.+™ò¶v|Öu ¬ü²NÍ6s›¶I”Åg7 Lì’É”_ðt^÷ÿư©£¸Içé‡@ål Z÷‡UœÆ•j³3Ï…SÕ\ ŽõìkôbêÄ.s€Ê’®‚³Ö¼ò»]Vp”Ïâ}N¬–“èƒrÒX´~ 8vUŽ¿uz¼\Ýö+ÏÍ‚qòYƒ;¬yprìš0c¿s…à-ŒX¬ß³;Œ‡h²x±L‹ûËp5Á`iÝï–z3꣜ëiѦ3‹æù¤ˆ™”ôÕX‚åYCtë·V-gÌôn®äÑ©žV–CäÀ MÑc‰ÄÛ•ŠW×(üNR¾§>uŽã¹D/ÎŒŸ yP›¼¢^Et*ãRBB¦’·»¸h®tÙö#ùoÞžëª#.AöGÌg¢¾@¸ž&–‡v½spÅÚ•ËÅÄ~ Œý¢5@±áîY'hv Ž@~Ú¿‡®,5É>÷‚9?4KëÚ2îX{PÀJÃRúûhíÞn9’jÖ'QþÄ(_ü<Å9€E>טSÖ~Ùpƒ–Ú=¢ŒÑaxø<…v—ê5hªoBÈõºó;=¿LÍ÷½±]­: }ýgý®ÏÏçÀzpT¸î¦†­‹ B¿ÎôcgH2ÁBT͉e”FßôH}J2ýû,`Ôj0€racQZº~`,â6‚PûP‚Ã×@ç”ÅE0èk$ÖaèBf;¶½æTýeMP˜z  ê &¼˜c}¸³•‰ïξ!11“IütiØñÒ¾]§äig ºSm˜auÀ:§ç^4X,[»8ÜÜE›kÆY¢ê¹Ìåsx>¸¿Ï¸à/Ð÷Ãç;›dB¬"ù½Z“x?bQõ‹°-¾ê³þAÝw|BÆØÍ¥†x p-ì=™d‘¦õÇa3OëÆ­¿Ï6œ!¢Æ9±zçùlnGFbpó—ùtÛçeO0‰ÖÊÊìH¢Ø-÷sä·#U}®í ¸¹TÿëPD£¼–E…zü7Îw!òÊfC_¸Mí¿ ?/¯!‚}ÉXÅ[ÑÄ]Ìå¹^ lŽ…e KY’qÒo{–åFýÏš©Ž zìÂLˆÁÛ¿†SÉ%;ÇÙ&iX¶u￸ՠ̀cå«jièî™a†gÅß#9}Ëoùk$2fr< ˆ?ñ©ÆÒª`àzÒ†è(XÀ³³l&8Œqdð»‚U›J‘Ñxv‡T?åYK%c™Y|5!­=ûåoÞ“ülˆ/’•s»—Ÿ¿¯°ÂN% …N.§ªÃшKØtä 1é{µ·È:¬¦µ9Ô%† €“;&bÎ<‰ûtÁ¦ÙÙQV4ØšºÒ6vo|Dúšêp¢üƒŠ»"Nœ² aMŽ•IÇxˆ_¢ÝqDãÖÍòG\mÖõ^XœØpõVŠž¿ùùç yÄu®Ø‹&à85½'õ[Z’éâ”zoÉ=“Ó‘}iž^¸+¾Ù‹]wåK A ?0·¦ r ’|Q Ž|HÞý<, D)%mM+<ÿ-¡]®çló‘iæKoÔì¢'«ËŒÉÎÃ|`jUu:+Ev+"É`&ƒÀh”ªQ—³ gF+éºPkx;À•L©«€Fí <ÓººwŠ0ÂŒ³;ÀZãs²¸5É/:ÍèÊoº2•µýRïÉ‹wè¨kFÛæaÝzãUÀdÊYKqˆ \v¬R^:«à¨  ë*æxóæ_í²11&^'‹…áÃÏ7CëMê9Ñjý]¸^cþ¹&ËŽæT=¶¢ífŠ9í‹Osé4i‹Cïù¶Þv˜WL––Hx–éç„Kå ›¹¼ðú(à¼øZ)ù¸ŒÞVèÖ|+«7kœæþe¼ðÅÕÄ^ Äå¸-°Cy0ƒ¤jaaù©ŽkìYÆ7¼‡q’t’‰œ¿õ=³WÙ%‡ @È£>nþTTdm‘p¾s=\2í‹¿DƒŸx1jÓÏ,;;ßo³’a^H†$/SœÀÙeÿ|²¼OêÊó·x©÷A ÍG¼žSÁly{¼<]ð¸sóÉœ&‹\í¸À4÷Ù÷LòW†4x…•XÒÁ„XDÎuªVLârYý¹„…ƒíg²¦–Ÿ Ò•ýÜÞþ©LœG€Ó0Q‡ËŠVYo,© ñ;^ ,tGqÜró‘X½è¤È"{G¸ª¯z×ìÒ¤žÐœ#ˆ¦þÿO1]¹Œ™žD/6p©oD—mWë p Ihƒ×úžiJ‡EÙîºxͰäÞx 2“›‡ZÐÈWö˜onI@¶tÝ;DýçБºK§KðÓ›^¶ ¡Í€’û²©òy„h…ßùV®äfÁ¶4ZKaœV¥ÆšŒÓÞÎiRÇzZÏ`=óËRâ¶<HÍ÷;Yî±Û9 \6 K*ÿ)ŠLcÏ:˜ 8K‹ö‡•’HÂøÚi<½Ö<5‰O|y7+ÝsÞ·/d–gÜV“Cþ¢3‚ƒò¨»šbá”Àúø˜ÁÄÝU»ˆ"Û&l­3ƒÈó¼¢yo;&h”K‚¤ÿys˜Ã]:6wCãJ×W3¾t;&9ªœÓŸˆa*ÀѪfˆèývßÂŽ} › ¶ž ›kô.žý£,á)$KÀÒÖìªÏ”~8)âZ¸ä],Þyw—¡¹wÀ“÷ÅàæJYa?#èã!˜7yâa_È2}˜Ÿ„ùÐß¼ åûaÀ(©¤¹û9 VæmÀtv z båÔXåO%“·cmì”(1u0¿Q*Ýé^ ‹ÑÆŠ\Š ¯Â)½®çÌFáQú;*ãÇ­Ï<.‡½¸½/‡˜¡š4¦o¶9rÛË'öÖ$ÆÃef׿]y X: º.És.ˆnç@pâ‹¥—MgCÚSÞ2¿ðÄãDˆ_”L©Xq" +5.!É@cl,b+ûA§¢sOòE’|GòK+äçñÍõïçOÇØüY넞fkiÜ Ö!3 v³8—:ÕìGcÓï÷÷•…°Ö¿&µŠƒšiUj/QLj¢ìÁu_EHj ÄðÒXAß®ª+Cª× OèüMI¤ÖÆ“ýkPÍ#@ÅñÁãZ°ÖqSû™ã”z¥N xvTÎü*?ªdü¥Ì;'!o–Âcnûh,c‡ƒ{ˆ4¹Ä/(sÒTc;½$®VÔÚÅreÜÕiÆHuOºd†û j ~úü~3«¬Q£†üY•\¹C®ËŠè^ï‘a4]Hï…®ãŽîcë{zgÕsrµþ.sô3ÄùVùNý½kåªê¶ï¦ÍG°¾;±U,$åGL‘™B³CæÊS2–Dµn™%>Ðó”=wÇ{é,àR¼b&Ž„Ÿ¨³d)S9²p*ª‰f,\™1e$šÎ}¤ë8jaKW|+ô¦L  ô&½¤¾åVnèi8ÑsGèÿ‰mlü;Ö¼Œ…ÒÓI¶Ïx³¨‰Âsö2–›ü³¹mg!2ËEž%àò†àJ¼Z¢¡$(sßIl¥¹¤5‚jM²Z1¬ÕŒ¾q/ZWiÙNC—œì5¡æœa° '¾§Ÿ{|zQ`êê7¨6i‘ŽbW§Ü R²7)_-…%IŸ·ÑHc’_îÆI$—ºÙehOòaÙbDx×ù'÷^Ö´z'\¨îÝE%Ös"XG‡”XUéÌŸ[~„"*3‚zóÒã1ôßÁš¶êÏó~4Ó4‘؇EÛðîÉ13Ë¡â ÈZ"öÓÔh»ÔãØ,ÎEY V#ˆgŸ^ÿJòòö¾¾&ìaMO±Vž‘åô­€ZâCÝ üs׺HÏtÙõÔÃ÷¥ùiÒEîÚyó[ÇpÛp#bï&1%Ò¦ŠÑ-VvŒ´ˆ¯Ž!/Ύ“š+—Ð ^õ æ‚¼¡âø@Ö“–K•g‚V»„»jƒª¶¾&^mÝußlÄCqa|¶ŠcôìæGÐz+®W¦“K½bØæKÕלŒ2†ýÏ)z׫œÅ0õcn·»÷À e™€ôyظ ILÛ éO?œÊâÜ ~ÂYØf ô°¢¡™Osev#÷PÅRâÁï¶€?™Y ‘_ómð2ã^ÍÄg¹o÷ò¢PsÿyŸÞæU–¤ò{3YpŘ%ž«–böMô¼°´)Ü$ÃÎç©b ®‹x,À –Ap¸Å‰eKa6’&sCÌÃi7>"-èÚ/–œŒWn€9ý(%ˆêÓ< ù¯x_7)$1,/®û6½éä“âUjÅN|½Y®ëž¾Ùm&‹L>³YÅ¿!ÂvÈœ2½Â ñR©hIRéq¨2*ß³ ¸À„R[=Üúô1›¥U)¿eß­ЉSÊeX¶ç‘èuë%÷üè‹“,!>@ß¼é×йQÛïd);_¿S!z¦…Q]µ$ùU¥jÑ´ÓŸ~æ·l‚µÿ¢v”¯!¯Xç2ø—àÎ#=±ÂÒë¶`þÊGÌ+ !Ë?~#€¯o‰þ–W‚[´îîd±º"JðŠ%¶ŒÜ¡ó!UqZ²ð>5òÔ™ Ï™ñ)•ñ _ÞÍòȲã7 c¯ÀïV~ðrn¥¬ñJ‹ôù\å7êzPÐ(¥ äÜЃWÖOõ=‚ƒ5ð=(ÔÞßL!Úë -?ÂÀ8Ÿ89ÌèºÍ»d^|k£h}OQi(û¾ÜeKÅB‰âŸ$Þõ/$QH|:»'P †$0 ÛÞ@Z/“.<~z°™jœ1>Ä×ï‘·Õ“"VQc¶ªqÞ"ÌJI¾ç[2L¿ƒ-lË.Ù³ú´ªï^ª~ÉqX§É‹@[ižÉT¸) „¸[IKI²ä‰T‘š•»Êеô ‚ù‹÷-O¥5@û£o“¦ò¦åìåh 5ÆÛã¹Í6S[K³Š\}º‘?­Nâp ˆ³9E¥6p‹&Ñõãe „Ž[>˜ñäUå.¯ôSWFi„ågëàêýL×Ë!ð/ ¯_@Ú/j6P¬‚rªÉνá=JY?(ãNꥷٖýò~ã*B&Ç’ ʪÂO.Bâ‡HuDšBù” …çÞŽ/îÔsV#kfÇH¢ôà–d¶fÉ®dãeǪײO f6Øò)8˜-¢ Í£E]4îa#ͿҾìÄÀÄâɸëNÈäÛ(3L6m¢vJþÂJaÜ%ÄŽ¨ƒú¨U9AMw€àÊ;èP O°z q#äT0àþ7Vi°‹h)®bùƒ¿^ʃ¾FÙ‹ÿ…Ö0Ñg[8f¬Y‹²µÚƒG‚Pâ'û kDU‡ïë!”dšy“‰>÷… „x´P¹\Ë2JQ…<†×(µ«0º:á*Ó›0x2B<ïF$Ê&â ò¸Ì0®ù[`ÿۥȷJ„,ˆ<ØÂú{jCKy‡/NƦì¡Wx7æGÞÃ2ø=h ƒ'¹KD–v¸WÂעܩ³'Œˆq»Ì ÊʆtpÓÙÂ)ªº†¸ô2B·òÏVÔ-§É\£G2C´í ,md…˜ré£.”±¶fø .Õù¸¯Mr…äZ^c(  Ú‘®oTïrƒéf™µ£ÛpuðüZ⇿é†×‚¼ß}Ö#Ü(ÿ¡›µßÓfsÓŦ]sÚ†Ã_ ÿDuႎ“cMj0oíÝ9Ñ*Ióždâ–øV-¯V`2=ŠÜÃ#Vˆn‚¸Ñ[Ÿ2BÑZ.¯GR™›ƒ ’?ÉwW“x-RØñäÑËõ¬Vô°Rmp”ãÓb#«íÝÃñã|Ñ[ o^µbú”ÑH:z¤ÑžÁ†¬ÿ›nÇÆ¢nY?ל¾û{Ð"ݵ¸ún:.§Õå%šsL¾"RŸn^mDáêÛæ ºŽ_™}Í»c,úáQ(i,”c D.+ñHµdeÑ”Õ(4ć|0Ë¥~ñ¹Nz“ª\q¯èTfÞ'>=WÄ>dqœgF¤Ý9ž4/"ö_­þÕ7£wa_ÄÜ="Àe ׃oÖ‰Dð÷™áÄOz}Ú“1Ç(€Önµ[Šƒ> àPͶÃÔÞ…×Ðæ³/Îê¤ïqüiSPçÐá3†]_‹ÀèEÜéà?™Ì ËÕ[ÜÐnªÔ;dÈÙé¢OŠ{dH¢,àRßÙ¾ý—ø6bŒ~¡gì=|vCùTgG\p ’Á¥œôÐ_ joîÆÀé«£Pé¶Ö™ÛÞýw2£³uÛþß!heÔ‰&ê÷”?õ.*áF¡‘Œ‹i0üèDzŠ$™¬%ÊŸ:]œ„êþN‹éz%MüÀ]å¨4X5æUás² Ébò…¹ÆŠæ?CÙÐt®ØÄ0FˆŠÈS›0êH”§Ý\ÍëC˜ÇåR¿=áî-—žàdÛEŒ?ÔP9}!]xžê²cúù%Ýí)Ý£Oz¢¿)p3Ö˜Vr³“Ø)NÉ|âíµi`«ÌÎpC[™˜@ ×clâÔ¯9‹ÚÿLz)é^ã»éŠáfÈGçÏÁzÖõsôÑÓMrŠìu¢ÎS4Á-Õø*æÅª”^»î[õ~Ãéúàоí¸'m5èœæ¿4­eHÐòóÕ©nI ,iŠÑá¶]+±ÇÀÌø³ø@­µå«±ø»Šª¡×F>Öœ¯/”P'Û,*¤ÆýÒ{sùñ3»-[å8RëO¡¥‘t¦ÎlÄý_À%®÷Åù°3~‘Ep¢Œ}Y"yx ï4¯}´ÙFd–ÞåØ eIhW½dóWWÖ§s€o+:yx ôÌÜâX M¡_A,®§~ЊGüDT¨ÿ]tü2¦\¦ýÏg˜>ƒ,ˆ&ÂÛ¶þ†"òò|cãdJ>€›àâßÑØ6­£`@vÓ»å‹>3\WGíS 7L´ZÕâð±‡ÆìrlÈ'¶lÓ2ÝTP ¢dßþnQÀç ÚÍ«T‘‘©KJ»°%¾ÿ[´G¯¿œÓͬ$[*SR™mËïœîa!@œÑ/'Ùáª-šO–û |ý¼èøeÏêällÑC ÄûÀÖD êl"!cd sLñÊë”]&7º¢Ñ„š¥ `øiQ«f$n†Q9.s®ù’dq4‹­ðS/õÆÜÛ²Yˆ]¨3™óö— ã>º[lÌ­¹'"¨¶£8NŠú3¬1°vZÏ@É*"€k¦¼¾M9Æò<ô…|$F•,#/NOb zž'™1Xè/;Ñyï4TŽƒï;(Γt¤ó³Úò @ ™_Bå8i}|j÷ùƒ¥"N–DôÍ*•ày—›4àñ¸¯Wï}ñFäéÍZù‘àþµ‰MgŠLÞ·aúë®Ù‡â´¨ $r¶úaÎÎð“có1Å,q*mÖ%ÕÎVõ&êñ[*ê6HÅ]zkR<–ë1Äç‰æ5>´ÄýbúX®cPvOƒ†2ð¿¡Ûs'/ IFrãÈTÁÿ…,…ô/O ô‹ÚE@„ÆqGäCÔóéñ‡Â¶ó?WæŲmÊ_yð}$©ÈmÌu–ç ÿ[ <4K[?qy_3êЈ~Øf;Ÿxì ir#|™#Û0È^å¤Wi™7÷1Vy«'%è=yzþ`Ž»OÒPü—½%ŒùáNXU.tó!Áwa{:‘ð‡ø‘š¶=p\öïçü-PæZí¹2Âßp!÷¬Y(¦vs¦œЋW:c2à Í–®Ê@ÎOlh`¸AÛ¬Í(Ëÿ¿ a?c-t“x?¦50“ @6»¤вAHhnÁ–V}§Êa-€çã70¨e¡Ç#™ D››Ùw‡Nf\ —|ݼ!bðþÜ;…ŽïtÓ=TòõìùÚÖ ¨Ñ™¢hª6¶-´s%÷xù&áôÆX"*?€·zd€éuÕb*Ñ©&Œ¤0|ÙÑk8Ú%ŠÚŒ½ÁJ;¾¶ûràgœDT¬Ù¾aÐú8¡€.ávëlž®²¦ŒŠ«˜aÃwåx ã7t6«bqûä|·ôtê––s8»¢ß´¤Zñ[wà7²vÁ߯¦¢‘ ¼¼ EoÆjˆ#ñžÃu€sd“Z¥Sé …¥‹MÙl`3”~¦ˆ¨ s˜üŒ^&Gq»è¥É&«¹ÖKÙ÷ Öð’¯mmFÄ¿™C†¯uqŸ­_JZÆ@3U/¸O´z£r2^‘o®;0tÅ0ÞB O~sÁEvÆI€ËO®³E}[ý¢hâÅU¹u*|l£C'OŒ9W©ÜS§ÒðN„ŒT¤S¯µÌ$utTaÎJ+2À*3´_‰w‹6=/Aö¶A }VršQ«üš âį)éd¥øÞ܈˜ÂPêé 2FP4ƒÌ?2í´(¤|"Ù)B+ƒ'˜ÏÞÍ÷uFá?•¢È¤€3ÜéàÃå Ã&tÀ\äËå/¯ÛAT©%^ Z˜ª·à"øxFv×¶±Nk·?I—é)½ö" ÏHÊ23bvœ·#e«S]Æõ)iG¥¤9§®¤”l)_rñçÿTÑFǯTn®‡Æâú&ûw¨„‰#“96T\çȺaOb¿WéÌŸ[~„i—ÀZŠA‹ƒ½å¿ðÕB¹4Q¶¬UÖË•Ø|/q`k$Q;vcÝ4T 2ãêšù³‚j¬öäqbXn»ðã#…“±1Ñþä$b½9”äTÛr!ø}L£Š iž„Ê#ûP•ù aÒjû(cLh‘õÀˆî]À‚ö¾äÌeç˜P_v"l—¹óŽÎv×,OÛ¡a? œ§)´¿W¤Iׯ»‡ bÅë±t.}b/JŠW}Àõ¡Ôo10ÆøàRâ–o15šâjjWçfÿ§#€ýH΢‚©=r?9+ÄúÞÞ_´jR ýÚÀ«-VU¹º iö&4+1*¼˜ªÄPÅ4ˆty|•‡¤‹Ruw£üÅv\B?`÷‰¿ît/á*¼¢«K4RÚô— /“ž‘uïy4³ÕÞbÊAbZ0 )ZÀ ]4`ÚÑM Ù ž•ò7ŸqÓicLN}™‡{JP6æŠìn#çÂkR »L~Ô¦˜¬å÷õ°qõC"fŒÿX^ Ñý¯Wá…<eõ' ÄDðj})§Ù$shäòÑ ½z/p‡X7îÞ̉Å.½ª½ëð`zÄÕïz8ŠíÒzù•ÒC[âUãnÛû*Ä‘ÿñÅ õ¤ýÑ !Ê‹sG£ø¦Ñš»…,Vn”N²O‚#ªÈö}† ;¹ëÉD‹‹™Õd%Iìæo”ž5 Ó¡©€]~º4)Ûœ¥”ÛˆÉaEÑFK ZË?ëq肈Ø^:#hc]‹MX¤Ÿ¹e²Å,z£3fƒgqÓ†.ÇñÂ): ®^ªœ¹1Ê‚¥Úyׯá{Ñÿ ^°p)§|h’fÕ—?XwHF8¥o_ÓA`+MJlAø Ìæ™ž©)Üå¸Vëë ÖCÖXlîò¾)ÎA ôm 7• “.-ÄrÊнܜ–KsÚtÙ­¸9Ô1î— ï¶ 8ø%ê¿RO»VÖg·1•­v™~а%d9 Q뀙4.Á $0¡Bçui ’Þ•<Ìõ¶[Ôœé!C÷E¬J ¿¥²/†¨ÅRWnžna¤h@\©"¨Wƒv÷ˆÄ›6íí1åZ´9u+¡•ðXݰ<~—ÛàoÂKÄ¹šŒ± †çs dÀ]8ðDz›k±\8¤Ø{¼˜ i‰Ç윳ÍüXãwbFËJMp l&ói„íbG€uâYë„uÈÖ Èk #%]ÎM#‡mÑ(L¸åXf+…÷p¦ß6ôűbî~¦¯ºÜƒSuí:ØbÍúœöˆt†@Ÿ$ÀÉû„1¶%ácy6Åo&mR$üAH½®PßI‚±‹õQY óXžlthíLôÝÒü2'Ð’gm£È‚ ³ÌèU±¥hjõÒõæV#'§§)JB_ ÿ¢`fÏ€DqQÖÔ3ž”g8Å8ƒÏ4g†Am@jÛ<áÝûÜpîÓ¯d­ö‹™DWË”Žáó2J>ÉKG j‚A lt`•¸¶r6ª*S\Ý1u*BD,Á£jYæà`¯º!ÌW—âƒmëL¿^ô^„ε¿AîãM„·¥ÉÕw¦Ø'âðãŸ%ñ…O\éf“¨ÂÏ2}ÄÛóüDm±¾*ßYU•ýzîtŽÜömÜ Ovþ ˜Å$òôûõëÁP—!Neýµµ‘ñ¦`]JçÞtáT‰ Í¡©Ú›‡åŒÈÞå¸x·…0µ‘KýÀØèȦ§Æ¿q•s‹}3[rO*2‚¼7‹6þ~Wã©Ð ªö³ŸÞËáéǯ!Ú~9käj©b/ À+¿&M‘˜l=·ivèCP˜¶Õ©t¼ìñ‡fOÏT· ÿ¿ë­¨Òan¸bp¿æž,˃ü‘£j4Äœo+8”€²ÖjX´'eV'~–8©rÕ1õÖ06Yû'χ§ŽÛa1örŒçß­/û6f½£=ÊB²VóÙü€Ï…ãø;O@‘¯XǨ{ñ¸ïÒ–j-„ŠkSÈÓd 3ªð³¡i]©ÞŒßSÇvbkÒh;Á^7“Âè åÙ뜿zùØmç0÷«mQóÔŒh+ä|¨[V]mNyéz[6wÜdÐL蜫ËYÐðÜ×øê‹öo$’»Þ{ùÌ7m¼Ò$0E®áÝ6ܘCg½—ýãàúw«ëMûº®u…§~ÝG8ߺ¯r—`s£ý÷&šaöN‹ËKH†*Èé-gÿütÛÐ'sôÁ 4QåŠî0c/òí,¹,xð¦sVT ´ð§ð­-Ý­L¤p>±øÈˆ:ñë£F=¯i³2*NP™,É%$uVÏ^¬3cô¶(sq³«;‘Êò"˜¥²P0(pyá3?è5&‹«­ I*±¤A[õø–»ÒU_W“ÅQj¬ggs_×8Tþ­÷¶m¨7î˜ä¹gõ$º¢,ÔÎËë;ˆP|µ¨³=2×Yë!GéògŸÕ€ÍËz›²g€u|{.ºÉ_r‘Ÿ…+:ã{3ªj$l;¸a§HÆ[Õ–X @ÉeEäI‹Ö‰•½Z çDzöÒ€vâÝOÁ­X¢;'ÍëEI±0!:Cv¨`v¯$§{>EË“‹ŽÑ…ÿ)í‹O8f«¬M“1s „{c\sðjÊÖ¶ªî=]‚*\kµ S€f{;o ø»Á.%½çìä?¢Ù P혫™1ýë~\¬?Œi¯19®“^³îKtËâfA Ï4ÜLÔSOÜ»ëÁ@bô„Þ¤`šƒ"œU² èJ—qBº¼E­-È•¦À=ÀfÍ”hì·¦ÌørjN‚þ>˜ñ½Ï2Ãe¥jX@ŽYà…·W•mý™&›_\åøÕ´õìûgáCA#š, `´~(MèðXþbNÛÔ-/›Äª=u íS{ÑQ3e{~D‰Í uÏ/ÉEšô·'ݻݠ‘'ToqúNô·j·Ç„c)-j œ`c •µÅß\UZãÝ-µqäç%×›Cj­4™Os)˜õC±g·Bõóþè§9ë>ach…Ã÷ºci€ëœX#Æ$ÂàËU‘áÏ1ŠÉ­Ö kÕAŽg{ÿ ³ã´yèwb‰EJ‰]î¯ê¾™o1óºêËÞ‡d°{†¶ßCÇ\À¾hÎ.PO Ý,ö¬xµÚÏu‰ÌÌ—èoCBî?l´É8½Èy½|ƒ ®Ø(þÖÕò—Ú\>wä X•C\§¬o^hs ~ä(>mªå`½(kgŠFŒËùÈ苸nÜÈS.ɘæe›f™ˆÎ!|.{ËC'¬‰0?0¼'¤ªºVlñ¨$=îœÕ8޾QÎýÔÜ<=“›ñfÓg;%ȭŪ{èT9pä‘ǃo§½Ã›®¨¡QóD“ª6;jCD»qÖRû7&‹zXØì¦õúïsE¨ÿaþÞ­zlƒöÚVqi•`^ö(B[%eY‘‡@LÉh=È‚¼Ñ½mZìýƒ´ï ¡YP<ߘÆ÷-œ=o<¼Ë—PÒ¦ol[%Jmƒ>ïåÐÙv]c{0ïÇJm/vþ­ZQa2I/û(á¾~â¦)ÃÓz äƒ1Úãê®x± wüŸ†~àõDŽ•¿¦/|Á›[ ¬<ãÈ|!‡¸U@ õªhLŸ•ƒÍT#º“?¬¤W ÿLEbIÒúºÐö5Fµ ¦Á.‰Û§ñÿêJÙ¸Háù¿6ÎLóÇðy…o ÐDÐŧ Â?Èr÷¬pt‹ß›õí"‚wr®Ö͈4/áä}¢=«ovÇÚȇ÷]Œó–4î® 5*š®*ŒSÿ —~¡Yžú‰»M® B°˜Ì¤¼…qäî_½d‚päÁžûºÒ­õ-Å!j`³ˆ¸fø@û;q…h;’™l?_Åm½¿>äL>÷ÆÝÆìRÅ™`Õ8ÎU—m¬ÒËHZ2›ÏbÌô#Uù´ø ñ4k˜Î |É6pPÚ"é#31­?Õ¥ï‚ÒdÎýžòÀzL˜ ÛA¥éœÙ0uz„X±‚aC·—mm]*‚É´–áä+Û[Ãj*TR:QeoرlHoÑI_–B`mâ b>®!hbG8¾Ú9Xô#ð+LÛªPlèk¼V‚'Ò*¹,ÓoÊÃ%nqRéÈ·ôœ ?•Ú ÿáÌ13I*)¾ÿ3àlÜ5e8òË:ºs4ÈÖ0‡/ŽQ¹ñêuÏú<òGFª¯ÅCäüÝœ ârß&À@ Þì—Ã×Ï9_ÿ!âWCBy‚xóÄ@ÎJs2xþ äs›ë­à¦+¸ vÇ=Øû¢v£&Í"ÔQÏÜžÕênkpS3]àƒÅct?ŽÏ)+¤ŸñCäþVµÑò»Áh—3+K°Í/œ¼Ê€“ì›I´¥é&Ùs™<ÖÀÞ¤ÊIum¥o™»”é¹X9$™Cšw°‡%Ø‘ï*óVUË¥(“¬9Sfy'Öj7Q³˜œ@CÆå0V´’¬Ã×ä@Ú)¹KæÜDòkD3 ѱ‘—Gá‘ *–Ö+3yÚD £(2(Šyw‚X+qåŽqT¾ qA‹”S—@ó²ù ¶#lŽ•ç$ÇX±³eœUå(†Óq·#Iî·ðŒŽÁ ,a:jò4ŒÀfª<¨‚Øp…9*Ôôs± ’øEqi‚™Í¼Ï¾õ:pЇoŸØnh×0ÊpˆÙU:ñå^ð-ØÖz«!”»63…‡bl@Á&ÐëÅT™±òÌœèÓô`zÝaºp‰öÓï+3 nëZ¶×Eóü}Æ/w¯ ¬å c =ïí~dG¹„™aäGP»IùÀ¹8MQ¸Q÷b…I$"å¨uë¹Už¼7+ŒÖœ8äG½†òà/0f ³ÇXH¦=«‘ÆW}'„£ îýIÉ#È9AKîdÔîÙ€˜ó2üÃ~yÐùÂÓ,5†š›Ȧ?HÖ½"îÅŸÊÝY‹ºP ê)ä[ ¢PÛöžÊq> ÖðY·(`({/ÛLyD>3ÓUMXÄ¡çö0ÞÇ3Aå˾`y•Óbá¯$péA¬>ó p2ˆ‚ÚDx¢7:ipotwåw Ñ(2˜aJÛÞ4´ƒ¸Ÿsαö¼=;?z›—‡3˜òaÉ’*¨ÝúÒˆãÍ­2ÙPè¿uk(¡0.ÌÿÑ:P ^®bîàú'Î ŠÊƃYÃÅ-ªÛÖŒýf«^¨'²|Uh¾š%¬eÎü…)%¯<%V€ü‚K ÀƒŒªÐ–açàÇ»ìGö¿$´"}T¢Œ†÷ÝCëUÊúpz_Þ©Ýã‡FÏlVü(q˜ayeo`ûãħœýnè~¬g&ýç$­Ÿz±QX¿ñ'ûƒœ3 *¹Ä9"fMFocWp -b±íPj'µCçd“†0¢QüÀ|IŒ™=ˆ–n+ë. Åí`²Yn\Öö´I?0KUÉ‚‡¢§ ZóŸèîé³nè¾€8Mk”åÀý3æQþS6â@ÖE”üöÓ·T){ÞªCÓLFBü6ˆ²€z|8cøPº¯¨š¥Œâ_ûgѼŸï§J·lxÒ(ÿxrÇ–yÑ,Aˆ¬Lº’ó•´×±±Ðš-+yÚ®ŸçæYŒ¥¾ÆHÅ:Ýkx¡œ¬®j7Œ2ó; ÁƒX·fkEˆæçÅó‘õÆ›»D¼ï×Àe²¸"k˜¨9‚sSòý«|vøÐJp†V•Rkºyi ~Tž´!(Ø7Ð.z~”W¡aÇ=ÄùÃç~‚öw«5ó~Ÿh®8ŽâÇùŠTÚ§7áhÚw»r¡Ðì÷:î‰Å^Ug:ÂQjšÎ¶)M¿žEø(Uk¨è ?&ÐF”U8½æf)¢0¾–„¾Üöªî'îà—g üÜR’Òi’뎾¾…î&¡‡˜„&­Í_|)v \íËcÄߨ *üIš)¢ç'u88éÇn·hçwƸá.bÕ{oªÈ¼êC,¯ ¸b”’ìÆ.Ö¯©Ö32oâk¤£³‹zèÖìnÝ­Š»¿±æ/hŸMdõÄ·ˆø^zÎñ ©“ÓÞÏA ™vÐԜ݀…úxhÛ)P&²Oñ¯ îP©™²ÚXˆÍõÒ«hhü:×6ŽþÄ€úæl¾õaU½ÌrÙÞìÇý],Ûwdžœ­?M8D‘…ßÝÔ"n¸Ÿ›ù±<ŽyâЄý+zø¶¹›;ÏÛ!hi}†»Ù%gIûåºiéëK *ë;o;.Q‡ëøHÁÄW…õÌ_i^VŠFJPmäpY¿«÷ XFœï¹‘•tô¡œ¶§¢xKû¼÷“˜9tË>`ª©§*v÷Ø8N¦¬\ñ`ºÆDÀÀ®ÅÑc˜CÐŒœ…Ÿ{'ˆx•Et”µ÷GQÐ?ΞùÅ0? …þ–Zç<™Ãó±U&«•ôÔN<†b246ó·¬PÉAÒ¢Q UÕí=¨ º=ﳂ+,?b ´f2Ь@¥v- T,>Å øûðæ¼Ýc•øçvÖ×W'þ50•>22Ø<ÑÿÖû§5|p Õ:²7Ê+Ÿriv™¡s«â€)¯#p¨Ãa ¿yuT²Ó´xÇ») £#ßê¿Ú‚:ÂmqÙ:LàW€ Åù•‘~Z®cFV7!½f¥9Á­Hê„Ëþüû?‡»²«]…Èìœô(Þ‹l}VtÁ>½Û¢;Ìr—â8‹´‰”gQÂr û&HlÁµ³¤.è™9ØI À;­LjÚp¥øâ9ó½ O /œÕTAçòœWüÑ$/Zeù¤–-oçHÆœý7÷%ãá^ίüj3’~_òö¡92Ôù\Ë™t3•„«‡»—:8Ý0ÒÃú$umTx‡'$JàÈ™oEHäëEu°Ê¤Rdd¥5;À!; »FÅ&ùCVOzV¹½2Z²3ä×Â(!ì_*ð&¤ý‡ôú5-ÝÉ1³ˆÆ|ñ•ÎX×Û‚\Ç#h,ü—\ÀJµÑ—™jÃ8üùMê,W@w¸½)ÌRsÕÓ¹Ùa£ð8Jٳوa  "4}Íõ¦éÅM¡±¤–œ­¨7ÕÇbƒž-OW‰r†ž!?ŸäN‰Ïí»ˆW‡@’,+bÐ!׋ÃìÚÀ¾“9Jl›ù#•+ôƒÈÏ̯šâó¶i3…âD³›V­vކ¢%op¢Å<¥ñüâ¬$¼7YÑ”îœl©Ÿ|‡¨ûz÷i^¤*gטN”¹|æu±ZRÙH„_œ ™Sîñ.¾Æƒ½6~A®œ¢—„x;dç%)ó%ÑïÛp™jWâ?g"Žbà)F¡  XpŒÿúŒúì1 \j­{‰§$ùû÷Vߘ y‚à´1m ðŽ3J›QŠÓ¶i8úqáÃIH;PGõ §ê½-¡§mthkBÍIA£ÆòõÃr>Hmbñ>ªW7Á‰nšnW9 Ågñ»B½ŸÎHm»®;™_¢ñûå.r™à5Â$¥/¬çЛ´ ¨,DÆéÝÓ0LÈÅ[ G{ç©:"gP­xîF(I¢Iî0RØ­ÍÒ^ÒÇÇøƒáÕy™0g”@÷-Ó¹¨1W¤`ºÊý}{ßA0¥îhϦ í{I3méÝš²Ñ-è`²+“[ëë~•¢gajƨ®æ\QRž‡’`i$?«ÕÓ5i?NNñ߉ÌêrîüœÞshÀü/w 2/Ö#•uuðÛUœÌZd׃Ja¼V¯P­DÖñ™à ,°ÑZÜi,g¦ÔoîÆA±DxÀ‚¤¿?l˜œÇ„Í_´YáùÖ¯žYÖ>}ÝË„}ŘD©¦›õƒÂ¶¼ó8A«ÆS9ZT`u †B3ëK÷v‚Þ¯“•~ÐG(íßß}`¨Јf6\«ÓWé¡A1/С:.µjðÀ"ñ ÝXW‡(O‡Uâ1mJ!?§¾Ë¼W3Ž1? /R@ë¡ EuËê¦Fr‹Ý}:¤ï»-©*ùTé0æËR‰I ¿\É+£g{sÛy±°9Ë`ÁA¹AJa·Т]´3O|ò/šæKˆ’ÄHkpiT®™€mEM(Î,K Ÿ,÷Ñ÷‰âZ’A")@íy»#ÀçgêÑ o[,U0‰Ô ¶‚)û/»D#•Nt!ê$l—µõ‘ä¯Ö±i³eô:|£¸5kÑä_»9eÝ®"956zÀçx›‡:ÁÞõX.¬Ý¹ в$´ÖíìWeÓ˜=Óé>@]=% »þ®‰IÑ¿…‰Q°h@¦.ª0¤ƒO(í±.ÏAö¶áÙ>"ú¶±©Oùø%²Ø¦×>Ça«“ÜAµ9u™AbÍݺ԰wö,¦ØcnCÑEĦ ÁÜ„­¤é£"úŽ©œ‡ÅÎñ<ÞÉ÷…Y»àØ¡éÎ:'5Ž­=»ñ¬­ütF¸I›ßpBþ:Q»LÙÀöFãfåpgä•öÔà8Õ¨)ݵ ìL‚í¥º€Ç?PÜÂxy˜U3;‡#;O|X½RµxYG1ÕÆÒÍcKœMTØ9ÆWú¢\¬ž Ô® ‡œšuTZàã®óÎS‰5ÔÓˆ¦4FcûÍ-ñ¸ {†ac2Ñ(WÁ\Õ炊Tº‹Ú~F.ߘZÅCŠ1ÇÅ`m3g>Aä5Geh"–¯Ì&¸#œ¨\šAk¥ÃX²ÛK„?ýCâV€yͬþ x¼(²ðÍX~«ÂÆ-ôr?#®’&úÇf™4Ž›¢Þ´Y¹´…·`°ÓNñµyܼ¯ œ›Ð_ÅÉMò2©â@•Ѳ”¯ ÉŸné+”ðÀê åk7…19º÷û–BõÎ0àÎ'œ•PM}À¼*•mÙÓ¸¢â†5Qð¶Áœ42¸Þ¶y·Zb½o‡AþüQßÊÍ:»³“Æ oÒR#½ ÙB&o,Ño&š¸ŽxY¬Êòa‘"Y‡W_^ Ù@Ùg{ÞŒBR3§º‰mЫö¹E1;£EOŸ·ò”¾þžšÊlnÁ$Pë  $ïHê&ÀP _RÓ˜ >4°N){>×Q¤g(wµð¹G~o#@¶:–ü*óð)FºWÐÇjTSWò¡&~˱ý¼»»¸t,b>äYt WqòÛm¿ežÌ/<²ájwü)‘—E[š¶…=9=™§ÕÒÌkuv¾ÐNg^a0;öðÏðo„”°Šƒv·7œ)mv]#!ׂò£t<‘‹¦k?ËÀD|k†‚o³jºÒÃ%àÔ‹qi››ÛIÏjLI^®Ö vñœ`2¢œüI)6÷›“îlËðåwKÚ—WÙŒqÚ\M ƒ\E,²&¥4ß@“ÎJåq¥ßDÀW}¢\«ºª‰#˶+r­­u½æØev ñIç…[7rÙ ï¹’ßltlpÐ;T`δßTY´åFð?½šÕlYáf וWFƒ~‘TzN ½€ÕñC‚,<"<ýß"‹”UwZíkD.ÍÉ;þH@^.â8/Ns:³¶b~§µÎ×–IŠ‹¹žm„øMT ³óyœKþ¥9’ƒÂnAtNÔÄ8vÎPn^ÿIÁ-€;Â:œ™#±'º]~ç[Þë/T ”yÖÆK\›_¯GJzAކô{Û°½õMPQ‰x\§ÖRªÈ,!É—„ÕÝ›~»’ßò}—#}‘Ÿ™^ÉîXPyްF)øbR_–0='b±”QˆÙóÎŽHF݈À^ÀùÇ)B–y"ò¦ÎôÇ¢¢¬-÷J@•p!-§%€QÁs­1ÁÞ‹ô©!üž¹VfÎ7^›â«63Iá%a·å@²©²CâYƒû'I6'wŠ<œì—î­»Ÿ#bu); ª¼ok@[ü¬©ï·BÜý“ÒðoÈëasüV%ó1ëê$û‘÷—\BKd—-”&¼SÒj¥©¹LKà»<ðC/‚˜&;ºV=¼¶ÛUèüh:V!ÔÞ‹=<æ-ýÇaÿiz”Hh kÔáÚÔÕ`‚SìO sÃóÚsSV5ôˆƒæ1§Ø#‹¸] öƒœrø=ÌüX½Üúº,*[c®öž•;j‘[¦µŽ=«ƒåpœ mm ‰\RN®#O—Ua5ûr4Ùþ‹šQçÚ¾!g3È<îs`6I=xljϡžË°hÎáh[ñåÒ*/Óx?š <î’¤þÐÐ^$s—¤IÈH–¾•ŸRßÐÆb ‚°G³M#y¶ø³h]¤õó…bwü)„²\¬y‡ »ŸþºÄ™Þf Àj܇ZC”hõàÁ{ Î"BÓµÙ0¹·¯ÄΉ²²l€)b×M´»7¹'ÂBòÑØNti¼é:J‰­JÜNšýˆ2Êø´óñËÚ ‘—û 5hÖ\ñìŽ}ÖÇö”–˧6ˆØÆ›–ÁIseá\y!Æt±ŽHME˜%Êç®ožò:9O`¦EÈbM=˜Ÿ>ö¼*\óðíÊû?÷(¶“ãž/hî\4h1þ’<Ñt¬®ç9&ÌìƒúCäÉ£û ÷ 8uª×£’!ÀsYRf7°’m?@BfG*,{6V×,Oؽ þ³×I²?xpZJ¬ˆ)ëÛè÷ õI$)uts‚¯/²¨@§Wæ@D¶7‡*‹ )uƒ88 sA°Gˆ“Ø)í×õhçmµÙâ·~f1­1˜ùT#ˆCc¡ù&£"2ç‹`ì+TùÉ Î4^,\îÏM÷Àkb•k²¯£q¼ ìü Ñf¡¡Z\šA°Oìt\pߤ̯€àxOðË” ‘ª'(±óJ½˜9û¦å×<6¤¥ò9%*Oè¶•‹ß|]NÛ gÄ󸕉[Þ媀tnùPðÇ…¾wen Ì“¼äÕ5¡‹ Î슽«yŠz1j†S›4'O¦îY4ì ô1–¢NC½bëã1ÎsòžSê*ùobùÃKAU¿a0Âño¶ðεˮ1¢ë—„ÓÊÉÛ3W‰Ët£ GP¥eXázBÅ ™ð@V*œ(ünê„íÚ_³â<š(öZ³–.áj  czöŒQ¼¨'F >Ú[¾Ã›„8Ørd÷£ô"½<ÀmwÌXw*¸!‹Ù¼ äC˜2YjãŽv—bûŒ Ö-h 2î 뻚-^§£Áýñp"¦98Ô¾šùÕð¤H€ÀìÞPÜ句¡úWæ$6°ŸtPæ+PgG$YÆ.†«àxo¾ôËñ¯0Dœs!¿¦ã †ß-¢Ôuƒ7 $ÚØ‚uìJæ‚ÿDÇî·žþ3SÈä„b}m¤WœGe×±Ù…^?±ÇâF;?¯ƒd˜Å1K·¥.‚û‹³ÿÀÒwoÛ6¹ä ›á›Æq–‰Äþ$%s!|~@R´ýê*8ü<‡ÄÊ|/sìüÝ¢å îW¿øb­Å;²•ÿ9åä.ö˦&á»-©ñŠ„–âô (,;Û#x ÷]G£>EÌvêu’)» >4nVð§öÍ¢l_ızš.•r€³ÌÀ—¿käŒM0Â_9Ø'‹2ƒ·¢z>ÍÃJm;‹c×^~i»ñŠÒ èW7.wV¦ íK`¶«ÀZ l>±ÏAXsíYK –”0õðWV ô5R%q8‰"¶±°«„Bç¾=è1¼×S!kÖ(¥Ö;ÐûÍhÆ´v]NBm`„Â=g€9·L~(}Ð:Éž•@V÷ƒQÝÌȧãüd+£ÜEÙJ÷B_’}á«„ñŽõ”ýù\ñãl]ÈÇ“€â̤~¸"Ö|o)íd†ä©¤\ñº¼¦KbqG‡àÚI\4‚©¸¼ó¯Î¬–ôè;䘣FgÐŒä£#:ÞÝ¥lyßÙ’KÅzfsRd‘†ï ,ÄÍ–Æ&X<öIÌ"CQøMY9Í`Ì@D-Xû›JQÖ±lŒ’p6aØåvKrob4-,óâ’Ävø»ü#•Ú ñElu$MV¦Å*åÚJc›eÁW(;ÖøŠS¡uy$Õß$3Œä<õÇ#£.PÎ9e 3àì“ü P~{ŠÿcÔù‹Àb(èíÓˆ7¦ölÓvšlM>ª²Ò|ꂟCfÓvænÍz>úðC8öä{>C2«*•~Äv¢;üECM¸ URj$kk>˜ Zu:m£'k[Ù=h‘òÞäà¼K;ý5pöDz¢fü®-åø©-A±Îâx ¨“Ç’B8ëºá¡zX®2•æ³~Gq­®}•ÄÈ.¡Tì,RÏzXŸÏXˆäè=Ù¨×Îáž3ÄÀ*q§§eSkßÙñDŒåuBÙÔ9¨¦Ä˜¡#©UÄ[]¬qL°ŠÌ}Nœ„X’ËÕ¤T»C<'„ÂòÌ®ºuª)œ ¥‹ÏF2Ã4{:?´V³8|;?i¼Ç1ygEŽ|·raݨÁ¸¨âЊ|T’ z§M¼¸¾ÐôÙˆÑX‡=±p°.Tm†ìØç©s†h®ìÝÖ¬idñ€Yš?¬P¨¹c€6}Ý  ÏSÁ±–瑇qíÑÚº¿±yFA©ý]¸s‹A ob­§&€‰ÍÙ…±DÀ:G³°“x§$>ƒ•€Ðqåz¸xZcß›|®['"mü|Š)"PÃ%š\1ŒÊ!¸„[Ôü1Y *Å"ÙÔ2UÁz„ˆÿóÕUÓ•6œ…8T^Hp?¬vC³ ¢ÌÞ ˆÐ+%>w÷O¸ dp-­T‰lÈÙp?;S=µ” g-ÞY,y×±Ê.ñÆb{Îû¦—/jçÆ‚ÓÉ"°^àTc M”‰–L}j#zt·Z_°|Z6æjÃSóX5 ª=±ÝOˆî…¸õú"_Ï¿3~­Tƒ ý½ÆeËN6|ñC/©Üâý]ì5×g‰êið§ÔýI"t|MQj"ÀÅÛf7¼ï‡ã4M–lþåö–îK6g)‰*4ßD}0Gb°bù/è¨êo€Ö®÷tÁŽ…áPé;ŒŸ”îw_”4Ö’Õ™Š#Ťž…6½Ea;üþ_€`àÜkÆj»;‘c LóŠÄwgíƒmx”ÑFi"¦ŠxÿÀn~°ò¬=%¹ß¡žœ©jYÑ÷­eGŒdL‡ðûwX´v…a%ù ‡^£*Z Òø^l¯gÁÒÁÉ*Å–qïô™‚xsvb6 ßPƒÍ|]/Å©¯ÑàqäjSI{Ò€¨õ_]Ms^(ÈìIÛ÷®EÜ•YÌéâlê®PR|211¶'  ã7 ¾¥ëçcª=¢BE:Ÿ->[Ïk¨…1;éshÄ­mrÇ™ÚãÄ|7*«™¼:© Åï!/ðÒðÖ§ngÖÖʯÅ/›`»ýŽWÎ ¢¼ ãÈ5‚Å” ~á¢vµv¹I¹uüáùÈAôxºÙØ‹&¬V‡sŠšÓã9´·ˆòîæ°á¶N°ÑZ4ç·ÚT{þ¶³3 Qþ–¦üYy]ÈÌÆõß“~ð]›çö·Ò¶–9?kôãÉTü¼Z‰Ÿbœ6ó0×q½ <Âe¥·Ÿ§EM5­MoÂÄ ÄÚ£¥‹B}Ä"܇l‰ùÓs‡VYƒŸ²Ùê›cŠ| 4óC+htq#òF´ü”÷©k½uòZ¦À¯…wdý0»’;‘é1¥,±x ŒÞä¢!üí¡TärnIâõ_û+e¾½ÿ¶›ÐyÔ——nÁÏô$Ù\%Q&ß‹:1° ¢4<„O ãsE'ÛíèItÉŠ Ù;KÓ%Ày5Ê_DhØ<´U -ÄÑ\¿´Øçj9?V!WÍña0#iJ˜[ïÈþ ²8DRkÐ ÕèÉ0Ì¥%AÆ¥T£:Gž%Ü#ÎoݧX¬Zh*~¶gF OÜ98¶Ù¢50-ƒt–kDŠÓ‘èÙŸ³¾iL²«€ˆÿB†oˆšczÓ|L; RAZL€à[ŠÏ‡Vå¢CçSÄÏ7ýwßÙ”‰6•õ]H`ˆ¨ôFÆýË1BD0ÉO¹$A^Àôò ¿—|\×XQ¯¾äº\-ÝbªÁ o'cˆªBÍVô¶siVt¯ªGMÞ~x¾\Ãðš9õzˆ´KÆ„ C[Àù±ùEfÄ%cÒB¹ÊI€}5VÃÝò]³ú£ÔÌpUD82⃿°4¸£N†Kn0ç*^Ì=cš5Ž€j6ïŸ ·cMqe<œ[-ƒ·å®h(òt|TÔº£¸÷3õ¼ž/kô>ð3Á¨Ÿ *„ª„¾ÉZžç=ê …0IŒ÷1'jÍò{†Žñßuò’cñA&û<PKïo…¥EgÅZÄS\®¬ç¹ ë"Bq”j,{e 7—šÇÜÝQ_ZŸ[Ë{ cÒ¹d> »«:ÆÕÙÁ(!t> éaå½yUFF|¢-‹ê$.(<ö1 å9 s{ZH¸/(4‚GcÈÕÂjn ­Ð.‚¡6ñWªWýqy“ï n“NÐzͬ8«/œ.ùJ0ö o"ASö÷)mÃÍÀ Nd¡‰‰[Iu¦w’K>Ì‘%¹“(Y80H RÚ= žÌÐrÄÜGõx/¬J7HÎ ü“ ~·EìJ+¢·•~òFuy‘ÿµÂO@Íó“ .Q³‡µ}Í»ÈFCÜ#ª&6«&ñ.6·‡¯‡À˜"º¹f|ô´Z‚€]ï:•·zQæï‘»xõ3MãZnwÂæL%¹_¯^ÛØ À䳯ipæDd'•G Çáë FÊO°‹ß{ž”%öIkžº”Nb{Lcž¿ª]g—ôê>õ)N„”R»4…8¿ß¯ Ù˜ ›ò(A$LNàÌò\tmŸ¥äZÞ_Ëd;`L¢AÔ\©yÃoh¹È´Þ+HH¼?©µv}6Â>^I‘1ë§¹³·û]Ñ_Ò䫱$1iDžJµ˜^!5”§2luªyc9åw«J0IT~¢;cÂ^IŠñ—_3輿‘*±áÏ;)W©Š¸™¢3ÓUŒOº¼Z¼dÈó쉋y"K¨vIÔK}¹¾=7b"+ÈmpŽG#fëkËhhqá;{”È3=†´¶–o½Üàl;ãöʺŽL¡p Ôm%`ÊO‹Wòå`[%}mÙuJt€J·òس‹ÿC±âº› ðä9Æ]!s,sG|.»ûË5xùCÞ© SáöãYã¥ñô}Ry¢+XÄd¸Ñ‘áÊÊño_mȆ:Üîõ¹ H…Ø™ oiŒàxåêÀ•›b¿d5¡†Iâ“S®v¹:}õhwÌ/Áv9S(Ý~I“|£OÌéÒXs£÷8#ÉŠææV¢±Àl¨¯Áde”¸ÈË“L=d¯Ä÷}yêâ+Ш|¯*”øF% ‹^[q˜í„vIÇúZ>²õ‘?CçAV¸–jŠ@ÁúBËæÑsƒbømÛh˜qœ¸ùMu³Ú@0²‡Ðò¥î½2kZ±û:R³Îª¾®€‹´ÒM‘‰ Œ_›ò6yÂÌGc¿ÖY›f÷8àÙÒÜ-?áQ‘|އþPk°Û•Þ(á3tz¶àÂË~šíM¹å9Øh6[&É¢Ø¨í© :"Ým(A r•yk+­}ˆ¾RÂŒîÒNdõþõÛÕ}êÀª+¯þ̵©ÊtGæÈ r‚WEþàèP3*°s¥öá Z9¡Þb‰ÿ;¬4j7%PpXœ«P. E‰ä‹–r )û,J#Ý¡|Xú”…2äm!:Q·¨o¨ôÑ{¨õ| »o,TÉlï¼z•‹¯oI,Ù\„Li4ñêÿKcç ŽÌ/pMYvE‹«i·®iž=>¶—¬Òz(¸S!§LÇÀ:ô¡O ÆÌ<©YM¬ VH€ÑâÂÝIÙøØ¶qA&kºúê_³fDáLª pÀ&…>Ž{7ÄPyÐÈX§m“u’_‚Évã» /7FFb³šé.[PN©¦-O¤DÅ µîä8¼”ý ªërXÃÅôTyL$3•ÁÏÅz÷Ò’MS3\ê €÷0K3º¨ó´äÙÓWsñgž¿¤› žv¨‡`IÐ$<¼«T5ëùM‡ý"Ùà³P_ÁŒ¶¥&ï…ý:h¸² !–Ã42ù<]R#WÏo_° #Y1´…~û«¡BºÍ‹vÿD,l'ˆÐ"\¬ßÕåC@´0íÖ¦+= Ž·‚FÝOëó\Ë[ËE)%>ä…“U‘êr³½~_—]BÈ„½ ¿OÚ^qN¦O³~²Ƴêyk_P»TÅ wj4ò²'Ó“¨eL,¼ªˆÌܱyÞ—Ý/‚8l»sE€-âV÷¦n׊Àë‡å/z0á…¼Ñ.¤\ј)ÆŽ°gQ9â¼Ö¾äTK[ðáÐBåÅÝ£å,ñ»æùŒŒsù­[ nÔH^äEÍ)Ñæ5ï¹OÒxdf®,UéÝoœ…²fºpð?yÚ1dläõ ¿Òý²gQzÂÙ¢ ]8œ–¢µN'Ÿ»°Ò/½8ÎáueÀZâybèõúà߫֯WûÊ¥#Ë?1W&×±!d¾»)äDKH±ÈÜ¡•)ˆ _ˆ@ήÿÚ©f•6ÚõGÔCcv—8y³Þøþ ª½ð6?õsnÓéa ámFˆÔÂf OL]Æ^l ib’Žgž0 |–(:Ô0õ[Ùy¹l[ j"?„©rW™£ ¾ON+Mg×›>¬ñ€¹Xè†S+D§r)¬\üŸÞ`(©[¼ÖI ÜœÈü•!íI’šDãÊËë6X/ºÖ‰6Å×[ßMçö~–hªjO\L¬§A€-üPm Ümm·$YŽw=Ø FD s3˜ý+;U¹ƒTš+ÖÏG ã~ëB› s‡†?zfÑ3觪¦¤Y6•Hë)ÃÜýª-pS0G2:Nþ¸¾Áv;KEEÊ;żA£É¹(A˜žŽwB³s?85ŽûU¶W­ûHÒtþ£®†­T¥xö;ˆŽ"qÇæÆí1¢¸Î°\R®šÌᇜ¤ÍÐl.¾¤§3çh׿:©Bæ¾HB³É³Žs¨ûW!oÑŽ¼wçjãÚ­¤”—Y R*h_nœßð—¼LºïõVJôO€[@4ºNê ; wx°©“]C41SÔFÊ*2pëtaÂi®&\š‡l™4ÐVËÞ í✠ƒ4].#ÜGÍ“ )@Vd ž·•¤Â‚¹cí$ù€ˆhÞy‡Œz^ rùS\àýëò2Ò§Š°¾Xlˆª*ÔéÜ%zÝTl˜ú ®jè>þWŽ?Y–°+Ukš`Ò¹+è̬{„d+‘lQ{÷ì'¤µˆö<'ãN §â†Žz=iß |:öìXy¢ûœÈ_BÎaC攉å6_v½Óæ(tÝ×')Ü™öMG ËM6–ÔnQcGgðU¢‚à>„*,¶A5XAú†›eï1yÞtq`›w‰ízà z×1 Gn€õÌã‡þÒœÞãX®?ø²Á%Îõo6ÈéX 9.ìéÜ«zQR„~¾2~9TCŸ‘ÊZ[dýÐö‰áu6êIkXàò„_>ê¼Ç·:Û½Š×G‹jÑ’«Î‡u^o¸O OÆ‚¥"?TsçýÿUDƒ›«1+œ‹ WŽ$?wŠg´ÆöYÀÀH¨ Ù4ðC¹ržB_R¥?ÍÿYø9ÃŽÊÀ®2H*v3i$ÇŒw8up'i}ªë(ø  ¦Ñy¿Ñ0¬‰£!±rcÈ=ÿš×F8¤GpéïuØQ½Ô£èÿDk6b"Qmždcõ扪¸S.ÈÕ‰åúŠ õ¿‚B®¯P‹Ïµðs}·ÛÓe}ˆo뺃cÜíÉÇ„*lÌL6¶Ç cr”GÖB¬Npœ)Éû©‚ÿ=—)s A˜¤2ÁdÅmŒDB¥4Í-"'¸8Îç(žˆs›»¹b© ¤݇µÒÖÖïûÖèý²¥K[ÍY*‡·qÜ62‰ä8™Ò˜Ù'^Ybj:†5 Úȃú¬Òð£¢Þ <û+ºñlT¨àÕ21¾„gRR#EñÄ fÛ§Àr¾ˆ’ÆîÆ’TlVµ]I¼/êvYeIß´CErqüçÈ«pWó)­ü:îàDѺ`@Ù|Ÿ:é~¬*Ò^ ˜'š¨ÕEh¤š2Ó}’`ϺeE¿¤‹XÌiÿŠKŸù«P‹›c‘ìcv«¬³ èà7ä B€'&¦‰Ò ܳçó-ØêE‹ É ©·@:?FÖ-ìÆ&W›£j–Ym…®´•­)É•J?þH’·ô t$( XösΠ0ÝMÙ­áB(?QÇH²©†¢£ú<½mIžÔsÆ â ±Þíôm  ã@æ½RÆâ©`&µW?dÓÉq-fxŽî` Ó&¯©§ž1ª±kQ ¹¨¾ úEše¼@ß)@‹r:ÆØ5,Éÿ[PŸn‹ò#Ѝƒ\ßK, â‚å-È‘íUe™a†BFœÖ ÇÄEKVÑÖÊÒ"ò·„ä‚/SK-=fC`ã´Õ¦—Óˆ„S}J f³}Ò#Œ»ION¯»n­Æ€6¥$w¼³\ð'}¤&Õ ­.k€|!¯Â'ñ·1Êü=.wäòÈ òrPr‡ Ø9ÞmYEå£(ÎJÅ¥l…A¥Ñ$±ZwL¶â`M•Ø£u¸Q’§Õ$uƒb5A’f 8©kÛ DŸ ÐhÝžkŠÕUG>á—†ŠúyåUz{[êäÑÙ'À¸áÙÄa@“@ã‹1%­ÎÇ«L«)—Åñß–¬Œ6‘O^È‘c=Â"‚•¿Ãñ-Qp|¢™8’ÌL¼§ýõøº8¼ÝVNqt]q<¹Žþ^Ú¸¾Û#øI÷–Øm­)Eàç¶œlNÛø¼ØÝ-€aQ T sv"„ˆ~Ëó–îÂÃpz,ÃfÐ1%ìÛ¦8]"§V·N€©ƒzF‰fÅqLã\Y”±Lh¤÷£ŒKFoÈz—¸œíß[B÷§¾ÀwÚ¼±ÉQ"YΦqÞÔj$ÿðõ|¿ÕÍðÂ'5W£v`âT¥—/Ö¢UA%a¹>Â>ù‹JžÆÂª^ÿhª©Pâøþ#*!”rÛ/ÁÖâ¾ò 0bљɊ¿­C¡P!‰Þžûª^iו.4‡u–˜×²cIµ`Uåm1ìEÌÏ…+»C_ÂýМ—ÌR ó“Û»LWI”+zYìÐ!³†Ó1ÿsãöãMjjú O.nõEžœtÎøMæ&¦¡KtEËCÝ'‚ãć8®ä+ óJj 3µ—„Ø\¥í¾×UB¼Q) ð¨a17ƒ+)¶†BI.b\žndÒnKwàJ©hÂÆ6!ubÍæÍ½¬LAìæ z=%9Sq¶b×c”Þgw—ã¾G|åáߪ¦€Žë0ã¾#0œ*ñô8…¾ßÙñFÔ€0ˆ´'ËÌ,xE‰Ú?x˜ nŠæ3 póùß›¼“¬eâŒ%ÒÛîE!öNÎÅÈhp9 Ô5göqýaØ.Ý,1d!Z‹þÔü,BŽ>ÞØ3 –©¸$=™?áé_…÷p+êÐCAÝì¿™v÷yÌß.À‡‘Îý”ð.“ÏÈlšÊ$q.²aΫKBÊè0â9_ÎZ®Þ0 tùH®Þ ­ò ³qtÍcÓ_êUÀºnl±~õzžœ:èxô Ó,"B]0wŒ¨ÚOTÚ§„_lƒVœG»ù„OßzZ65Ý$©x0Û§Þû‹VU#vl.}+ÜÐ D_Ù& ªøavu Ù=ìˆhö±$ˆ¢‹GnoìÿïLoÊXÍž2J—ðm T:SâÕvBÂ1,ˆ¼÷uq‰Ì”¼É΂[H¾qf¥¬_½)x°ƒè¶ >9>(ÑÁì”: ñÇÁœ¦‰º*‹Ó k ø®Uõ&ª¼ÏÕ@À-&Ú}¢œ?aïrï!”¤‘¶£€‹¼ŒO¾ýªßsÜwDæÎ):¡,œoEÇÓÁ— š±‡÷£ ¿øAW1ƨÅÒÑPQøÈx¦¹í_:"©}•ƒµ¥+ê3n>&Ó {'ÿnwBƒŸðF î}ñÞ€èrÑ•KXbãó»®4³}1 ÝOO´êbÊ[ЮÇwt9@€C¼‹š7ñŽºMΦÆRÑïØ5²e÷= PøCŸA Sd†öóÖým³jºÐþ½dÍEyCÍòÕõ5ëw´Þ#"Ád—7|Ç>ÐuÇy×'ª?ax+c œã‰ê¡vrD’zQØùÏ\ó?úÎÈòK³-~oÊX~>`7;|ÃX޶4iÝô!J5./U@¼§Ç^ûê\e‰ [™æÕAf´?º'ð“c«f –ko ñnåq^Lx'†ÃÞx¨ÿ‹¿®ÙR=Mî*ó‰ÍÜ-¢ ÆÝSÃûaõý}âêE 9sº\cÊ.°¸¬TÙ?+Ýn>ø¹Û-ú‰J¼¨\ោ@»Û©wdš& ¸ø&Å#Vˆnökw‡+µ$ô“QïÛ«š£á óÿÊ‚'ŒAÓÉÉsF"¦v—q檘BHZ(GR}딜›¨­ ð{ac“{Jk0§9](ß°þH½·‹–i‹`Ï||ââ{¥«¬&½ÑR«±Ð[Ÿ7çÉÿ@¼\žóšž^Z YLà`ðû°LÅÊêDÂRÍçIöÛÙrN­FK™÷&(jGìGö™³ˆ¦¯\šE=W®b®…-¬ggh›ÅI¬ÜÍ…é«c)ç)vëk¹<ÜfÆ´NH>Ö…r ÈÏ/’í®*‹2w´B üszkŠZº% ?ê)fÿWx”34ü;Ê!Àô¸ƒ“ÓC±Þœr1y=82lÑÚ¯™q¶¸aw»4Êà2ã/*Ç€Îê1i78’Ñ¡‘r7x£wÄÅ{8ƒU´ýß è>N‡?„OÇÓ-x ^ðÙ$zõ­ƒÖ(VF d,+E»œ©à5xv‰SBÒnIPµÍ춨ꜿlùüséÏ´ÔÖD¿|´Õe¬|÷k& b³fôI“p'' ¡èÒ2–úï·m™ õ¥ù“š)û‚Ë+¬K!Ÿ¹ðM€B«kÛPã‘Ì9(Ã6¯žIâœÅó522êî¸O±›£ÛdâÅ;?wM”úËGÚÔA¡Ì^d¶Üàß+0:ÇßÎâao@z?d.{•[}~vpT¶¶póõïö´"ÖAžˆÉa>‡•DZ®°}÷ÅT]QÊ ÀNEµÜ®Ìq;Ræ.‘lQw0š—Çqãø”&^Ž‹¾x€Ít÷ÛX×\¥í™(DßIøÚ‡«=€  y}ñ:®A0¹S ¤¹á0ÄvkMß1¡Ã¶Z¾šUˆßqâ|¨k2>²UDh¹0Ï µh%ß4 ÄRå3m¼*qaõ·ÞAÞ1» f®JPëÀ¶vº‰Õȳ¾øc^±ÌHøªE…#Lû4;ïýˆ Iÿ^Þ%VXFkç£ÇäˆÓôƃ kÜÔ ÿyµƒ F¼ÄˆjÅÎtÀ§i ¨MŠê~^UÞ÷7/ØúÊZ(ó8e¾e“œÐÒU_+Yvî9›«Óªn²FÇ0‚·Ú%† ظQµH@Œ–Y>u’4»Ä;•ìi/âªr%ÃjoÄp2Dˆ=2}&ðçµôD¢cù«púin\íª­Uc2â÷)N0@À2X×îmL³Œ­MN÷þÜÝ©,9C·0T¸Øïµ¹CEðщŒë¢:ó éÝ·Xv×R[uAaYöù3á|gúWµoè÷\Ös¢ÿ&#âáz®ª¤½–2òï,Ä ¬ì@žù º—+ÐèOålª²püîÁUæ³Ã“mr óm·j¡/¥kÏ<üùÖ‘Çd`¡&–G"Ñ׌¹ëä£ —,ƱÞЛÚS…ëT_…^KD•Œ²%¸Ÿ›õÀ›0¿} ó9˜ãá×ñxÒ.Ò¶@»°6)nŽ÷ÒÎ æù‡$q¥Õ‹Ò(ÎFcúÍ— í;@AâŠ~NˆæŽ Ä&¢ó´&×ÕÀ€"µÑ1uýWJãr•Ó5šKÄ»‰¹*kSЯXwããþÙZŒ#z•ŽW . •ÖòÔÀÈŠÌçã`34ït_¨â«TU?94ˆ`°7¿¬­$IdxΖƒ’Ó…˜ÚureÚðwëMÒ³Ö£UÁ=@°øÊÿ±š‘ʽ|eª#ñè„‹ ±I©cf̸#ëêÓYÄc1®ãŒjÆûç“HTpƒïÄ…hÚ‰÷V~{ÜqîxîþÔfl nMI­… ‘ž!ºç ¼wTJÉãè0‚i±¸/H_ÐO°ýå¼ 1e¡ÈOM?Áœvg|Ø 6æ g7ëÀƒÃF:{xŸ?Ø Ví’•’ ìœZ޼«VÞ¸‡½a;Ú¬CÒÅ„WtÁb,Ö¨®c€ZAxã@ìîÀW¿I½k2pÎÅÕ&ZðRÐCQtÞi08û¢ilˆ \ÔRŒ®¼QbÄ—”’>PCšÓ¿…È ¼I' { µh&7ÖR°Nå˜e©²XáúReýáL£K{µ“-ƒÊ*Þžg?j–/¿"7‘Ô<{H;™½ãõ@“ÚÐ1~V]¢E‰ùoü\Y1«¬ &¡ïžj?±³Hµƒ:q³ªB5¢{ïJéÜØ¿õ8x½h–iœØÏ¬úTN´È„FIFÃäÐQ|Eì¾D%ù[šQc]Þ8¢úcý߀øµìü*"-NÇúÏ`úTœª{ì"ÐDzB_Râ"É€»¨QÚPq· ãÊ@«CWöxd¢L²û¥Wò_ë?nf3¹žXÚÓ uSÝìdÓÚ'bþ/@÷ä¢ñC[E•áûú[mÝý êzè:Ô »°°µ¢¥:lJ­ù¤_OFõŠ<¸ÌI·Vǽõ^±Ã„ЀpI—ƒPÅ=±¡x£6Ñ$–Õ„{’þ%Ç99·ª$\u–çNR©±ƒ±‡£Î¦¨a?¡ Á~ªVšu߇€¦È¸ìrgîÓü@@c½{Û#8¬[9Ã<߀öfš]%)ÿY[tÿ vü|ÂÒ€»ý¬\Ñ6YÙ¨ÛÔr+ÿ´vÚqzᎿ¨hJi\TmÂÞ¦E01óŸï᳦šäô^ÈMñdh ¿ƒøolÁJ-ïÉB€å…{Æ#„}=fò: ø3~¯­2iÀd#¥&_UÒü];ªGæÀŠR»x6ø©z˜–8£$Çê·‚EÈå-/6@ˆú¾Aß­&Jãó¤B™–ìS ,2&‹Œ­ ‰þê_TT̈D[ôÐ5€(½mn£Æ÷p 2N6kvxUñ=Õ$ˆýún^Ñ¥çåi3YFÇœ2J¾t¢J«çÒ³m#=@ù$ÜXÎâ&Õ;÷ð5dÒǯŸýY­Ç,ÒskV—ÛðïÈ:¥½;ÿ¤Î‰¸óÙÐ}¢ à×eÐ=—k½r=Ï%Ú¶=]£KçÊ4~ Ö˜áW¦¯Úõ>P>‘óý^Q¥÷_°E¶ÙÂîwT¢CDnQc×[ʹ[Oޯ˅V Ñv5fÆzK8 +Fe©CûJ¢ 6ôã„ ½B|«‡®wnqˆkƒ„~ŸC’ѹ;Žì¬~S“'scÍŸàAYvoB]© lŸ+ ËûôÖ‘º*¬&òÉ`@»Dµ>#ÀþZãG3þLÈõÞ¡ª¤ Ìy»-¹ì_eÖÂì¯d÷q!2ó©–Ùm[\òE mÁb›k³e9„}Ñœãy;× ³@»n›½|ò€è~þ˜q€IS ¥ûß’gA:³X"r:ËV'Ù$¹é À„"tÜdþjØâ5)êÕň 6ÍLËʼn—LE/ŸÉ“s^‰lLKƒ`N§º¾È;TC¨ÜÿHâÒ[˜Æ9%\ýgIÏñ#l¸Â‡‹óLh[òP>¸Ëñ‚ñkjÌñ&4­UfúžµLcSøæ¶ž“/ékÜEp0Ü–bÉæÿ(zÌf·š±“fK>\1Ýë"à¢p ä×ëS{$‹}y“Et¿»NA#ó{å˜y튺´¡‚Ê)¥´¬”,õæ£@)Ç/ãqHÞ8|Å^«¤Èqâ5€tŒ™y¯™—w^¾×ƒ$û²+ÄÓ\u¨Î¿ÞË"¦w÷Ló¢9VA8iÛàí}&ÔPý®ôÆdV es‘(0•Õˆ™HGãB²´¦6e»}"ÔpUˆ£Ù7•ÆïE1ŸRêö}Á\žvM›ÑzÚýæ\E«(éÍĬ¦môùr†¼{Ö÷r¥ Ί‰ Ÿ%®WRÑØëb­¢$,ïqåú$Ò!{ÎðæWQô#Ÿq°é/ví5##b¡éÊ¿p°VÞtZ;šzÃÁÃú¶?Œú…aê˜{K¬#yjLîÍg+þt_éÙá&p#¢¨~¢…VÇ¿v|i‚]¨×wÉ”'e#ü1ûv:3?5¦¼½W°lƒÊžÿ ÜÑ9 @Jú¦ÍˆzyÖZ3øÚ p ³cj¢’ø¨Ü±¯l†už6… ]àȱìðunMÜTXÊ:‡Ä[ÙÉí!ëh¥Vg^Ã,—¯þ}RHéë%x5À™5¦äó‡¡óD•ÜvôfM ËÁ*ªix3씣q*¸¹k+ 0çxtµ‚V*Á–Œd:…Tµ_“Ч+õæ>fÛw%c5o¢ÚAìš×‚"CmÔiØšÔìËzØõœ>’UÉíàÝsQ~?¯^ËQ3Ž>Ñ©Y©!^Ú,y]‰ž·úiÔ©w…iIa„Ë"+µ÷’:CuØW­\¨ê3õA98]±P€M€ŸgOŠš%¦´]Z­/fÅ‚ Ó*8ðÀ‹Ú`ˆ<½ÃxN²¸ù´Ñü +:(]GX¾îßð€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/xglyph/FontDataBase0000664000175000017500000000012611742726712023244 0ustar uwabamiuwabami8 bchr.afm bchri.afm bchb.afm bchbi.afm dcr10.afm dcti10.afm dcbx10.afm dcbxti10.afm xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/README.t1python0000664000175000017500000000121211742726712022155 0ustar uwabamiuwabami About t1python -------------- t1python is a wrapper in the Python language, written by Fred L. Drake, Jr (fdrake@acm.org), which makes most functionality of t1lib available from within Python script programs. Further information about this package is available at http://www.python.org/sigs/image-sig/t1lib/ As opposed to some earlier versions t1python is not included in the current version of t1lib. This is due to time constraints of Fred and myself. Users interested in t1python should watch the URL above for getting information about newer versions of t1python. -Rainer xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/ac-tools/0000775000175000017500000000000011742726712021235 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/ac-tools/ice_find_athena.m40000664000175000017500000001273311742726712024565 0ustar uwabamiuwabamidnl dnl ice_find_athena.m4 dnl dnl ----------------------------------------------------------- dnl dnl * To: autoconf-collection@peti.gmd.de dnl * Subject: ice_find_athena.m4 dnl * From: Andreas Zeller dnl * Date: Sat, 29 Nov 1997 17:14:09 +0100 (MET) dnl * Sender: autoconf-collection-owner@peti.gmd.de dnl dnl ----------------------------------------------------------- dnl dnl ICE_FIND_ATHENA dnl --------------- dnl dnl Find Athena libraries and headers. dnl Put Athena include directory in athena_includes, dnl put Athena library directory in athena_libraries, dnl and add appropriate flags to X_CFLAGS and X_LIBS. dnl dnl AC_DEFUN(ICE_FIND_ATHENA, [ AC_REQUIRE([AC_PATH_XTRA]) athena_includes= athena_libraries= AC_ARG_WITH(athena, [ --without-athena do not use Athena widgets]) dnl Treat --without-athena like dnl --without-athena-includes --without-athena-libraries. if test "$with_athena" = "no" then athena_includes=no athena_libraries=no fi AC_ARG_WITH(athena-includes, [ --with-athena-includes=DIR Athena include files are in DIR], athena_includes="$withval") AC_ARG_WITH(athena-libraries, [ --with-athena-libraries=DIR Athena libraries are in DIR], athena_libraries="$withval") AC_MSG_CHECKING(for Athena) # # # Search the include files. # if test "$athena_includes" = ""; then AC_CACHE_VAL(ice_cv_athena_includes, [ ice_athena_save_LIBS="$LIBS" ice_athena_save_CFLAGS="$CFLAGS" ice_athena_save_CPPFLAGS="$CPPFLAGS" ice_athena_save_LDFLAGS="$LDFLAGS" # LIBS="$X_PRE_LIBS -lXaw -lXmu -lXext -lXt -lX11 $X_EXTRA_LIBS $LIBS" CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" LDFLAGS="$X_LIBS $LDFLAGS" # AC_TRY_COMPILE([ #include #include ],[int a;], [ # X11/Xaw/Text.h is in the standard search path. ice_cv_athena_includes= ], [ # X11/Xaw/Text.h is not in the standard search path. # Locate it and put its directory in `athena_includes' # # /usr/include/Motif* are used on HP-UX (Motif). # /usr/include/X11* are used on HP-UX (X and Athena). # /usr/dt is used on Solaris (Motif). # /usr/openwin is used on Solaris (X and Athena). # Other directories are just guesses. for dir in "$x_includes" "${prefix}/include" /usr/include /usr/local/include \ /usr/include/Motif2.0 /usr/include/Motif1.2 /usr/include/Motif1.1 \ /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 \ /usr/dt/include /usr/openwin/include \ /usr/dt/*/include /opt/*/include /usr/include/Motif* \ "${prefix}"/*/include /usr/*/include /usr/local/*/include \ "${prefix}"/include/* /usr/include/* /usr/local/include/*; do if test -f "$dir/X11/Xaw/Text.h"; then ice_cv_athena_includes="$dir" break fi done ]) # LIBS="$ice_athena_save_LIBS" CFLAGS="$ice_athena_save_CFLAGS" CPPFLAGS="$ice_athena_save_CPPFLAGS" LDFLAGS="$ice_athena_save_LDFLAGS" ]) athena_includes="$ice_cv_athena_includes" fi # # # Now for the libraries. # if test "$athena_libraries" = ""; then AC_CACHE_VAL(ice_cv_athena_libraries, [ ice_athena_save_LIBS="$LIBS" ice_athena_save_CFLAGS="$CFLAGS" ice_athena_save_CPPFLAGS="$CPPFLAGS" ice_athena_save_LDFLAGS="$LDFLAGS" # LIBS="$X_PRE_LIBS -lXaw -lXmu -lXext -lXt -lX11 $X_EXTRA_LIBS $LIBS" CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" LDFLAGS="$X_LIBS $LDFLAGS" # AC_TRY_LINK([ #include #include ],[XtToolkitInitialize();], [ # libXaw.a is in the standard search path. ice_cv_athena_libraries= ], [ # libXaw.a is not in the standard search path. # Locate it and put its directory in `athena_libraries' # # # /usr/lib/Motif* are used on HP-UX (Motif). # /usr/lib/X11* are used on HP-UX (X and Athena). # /usr/dt is used on Solaris (Motif). # /usr/openwin is used on Solaris (X and Athena). # Other directories are just guesses. for dir in "$x_libraries" "${prefix}/lib" /usr/lib /usr/local/lib \ /usr/lib/Motif2.0 /usr/lib/Motif1.2 /usr/lib/Motif1.1 \ /usr/lib/X11R6 /usr/lib/X11R5 /usr/lib/X11R4 /usr/lib/X11 \ /usr/dt/lib /usr/openwin/lib \ /usr/dt/*/lib /opt/*/lib /usr/lib/Motif* \ "${prefix}"/*/lib /usr/*/lib /usr/local/*/lib \ "${prefix}"/lib/* /usr/lib/* /usr/local/lib/*; do if test -d "$dir" && test "`ls $dir/libXaw.* 2> /dev/null`" != ""; then ice_cv_athena_libraries="$dir" break fi done ]) # LIBS="$ice_athena_save_LIBS" CFLAGS="$ice_athena_save_CFLAGS" CPPFLAGS="$ice_athena_save_CPPFLAGS" LDFLAGS="$ice_athena_save_LDFLAGS" ]) # athena_libraries="$ice_cv_athena_libraries" fi # Add Athena definitions to X flags # if test "$athena_includes" != "" && test "$athena_includes" != "$x_includes" && test "$athena_includes" != "no" then X_CFLAGS="-I$athena_includes $X_CFLAGS" fi if test "$athena_libraries" != "" && test "$athena_libraries" != "$x_libraries" && test "$athena_libraries" != "no" then case "$X_LIBS" in *-R\ *) X_LIBS="-L$athena_libraries -R $athena_libraries $X_LIBS";; *-R*) X_LIBS="-L$athena_libraries -R$athena_libraries $X_LIBS";; *) X_LIBS="-L$athena_libraries $X_LIBS";; esac fi # # athena_libraries_result="$athena_libraries" athena_includes_result="$athena_includes" test "$athena_libraries_result" = "" && athena_libraries_result="in default path" test "$athena_includes_result" = "" && athena_includes_result="in default path" test "$athena_libraries_result" = "no" && athena_libraries_result="(none)" test "$athena_includes_result" = "no" && athena_includes_result="(none)" AC_MSG_RESULT( [libraries $athena_libraries_result, headers $athena_includes_result]) ])dnl xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/parse_afm/0000775000175000017500000000000011742726712021451 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/parse_afm/README.RMz0000664000175000017500000000055311742726712023043 0ustar uwabamiuwabamiDear Folks, this directory contains the shell-archive with the parseAFM-package by Adobe Systems Inc. The shell archive is only located here for completeness. The files used by the t1-library (parseAFM.c, parseAFM.h) have been extracted and copied to the t1lib-subdirectory. Thus, no make is done in this directory. (08/11/1996, RMz) xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/parse_afm/parseAFM.shar0000664000175000017500000021650111742726712023773 0ustar uwabamiuwabami#!/bin/sh # This is a shell archive (produced by GNU sharutils 4.1.6). # To extract the files from this archive, save it to some FILE, remove # everything before the `!/bin/sh' line above, then type `sh FILE'. # # Made on 1996-10-25 16:19 EDT by . # Source directory was `/usr/home/rainer/src/T1/parse_afm'. # # Existing files will *not* be overwritten unless `-c' is specified. # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 280 -rw-r--r-- makefile # 43280 -rw-r--r-- parseAFM.c # 11502 -rw-r--r-- parseAFM.h # 12210 -rw-r--r-- parseAFMclient.c # save_IFS=${IFS} IFS="${IFS}:" gettext_dir=FAILED locale_dir=FAILED for dir in $PATH do if test "$gettext_dir" = "FAILED" && test -f $dir/gettext \ && ($dir/gettext --version >/dev/null 2>&1) then set `$dir/gettext --version 2>&1` if test "$3" = "GNU" then gettext_dir=$dir fi fi if test "$locale_dir" = "FAILED" && test -f $dir/shar \ && ($dir/shar --print-text-domain-dir >/dev/null 2>&1) then locale_dir=`$dir/shar --print-text-domain-dir` fi done IFS=$save_IFS if test "$locale_dir" = "FAILED" || test "$gettext_dir" = "FAILED" then echo=echo else TEXTDOMAINDIR=$locale_dir export TEXTDOMAINDIR TEXTDOMAIN=sharutils export TEXTDOMAIN echo="$gettext_dir/gettext --shell-script" fi touch -am 1231235999 $$.touch >/dev/null 2>&1 if test ! -f 1231235999 && test -f $$.touch; then shar_touch=touch else shar_touch=: echo $echo 'WARNING: not restoring timestamps. Consider getting and' $echo "installing GNU \`touch', distributed in GNU File Utilities..." echo fi rm -f 1231235999 $$.touch # if mkdir _sh00599; then $echo 'x -' 'creating lock directory' else $echo 'failed to create lock directory' exit 1 fi # ============= makefile ============== if test -f 'makefile' && test X"$1" != X"-c"; then $echo 'x -' SKIPPING 'makefile' '(file already exists)' else $echo 'x -' extracting 'makefile' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'makefile' && X parseAFM: parseAFM.o parseAFMclient.o makefile X cc -g -o parseAFM parseAFM.o parseAFMclient.o -lm;\ X shar makefile parseAFM.c parseAFM.h parseAFMclient.c > parseAFM.shar X parseAFMclient.o: parseAFMclient.c X cc -g -c parseAFMclient.c X parseAFM.o: parseAFM.c X cc -g -c parseAFM.c X SHAR_EOF $shar_touch -am 1018085596 'makefile' && chmod 0644 'makefile' || $echo 'restore of' 'makefile' 'failed' shar_count="`wc -c < 'makefile'`" test 280 -eq "$shar_count" || $echo 'makefile:' 'original size' '280,' 'current size' "$shar_count" fi # ============= parseAFM.c ============== if test -f 'parseAFM.c' && test X"$1" != X"-c"; then $echo 'x -' SKIPPING 'parseAFM.c' '(file already exists)' else $echo 'x -' extracting 'parseAFM.c' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'parseAFM.c' && /* X * (C) 1988, 1989, 1990 by Adobe Systems Incorporated. All rights reserved. X * X * This file may be freely copied and redistributed as long as: X * 1) This entire notice continues to be included in the file, X * 2) If the file has been modified in any way, a notice of such X * modification is conspicuously indicated. X * X * PostScript, Display PostScript, and Adobe are registered trademarks of X * Adobe Systems Incorporated. X * X * ************************************************************************ X * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT X * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS X * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR X * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY X * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION, X * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, X * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. X * ************************************************************************ X */ X /* parseAFM.c X * X * This file is used in conjuction with the parseAFM.h header file. X * This file contains several procedures that are used to parse AFM X * files. It is intended to work with an application program that needs X * font metric information. The program can be used as is by making a X * procedure call to "parseFile" (passing in the expected parameters) X * and having it fill in a data structure with the data from the X * AFM file, or an application developer may wish to customize this X * code. X * X * There is also a file, parseAFMclient.c, that is a sample application X * showing how to call the "parseFile" procedure and how to use the data X * after "parseFile" has returned. X * X * Please read the comments in parseAFM.h and parseAFMclient.c. X * X * History: X * original: DSM Thu Oct 20 17:39:59 PDT 1988 X * modified: DSM Mon Jul 3 14:17:50 PDT 1989 X * - added 'storageProblem' return code X * - fixed bug of not allocating extra byte for string duplication X * - fixed typos X * modified: DSM Tue Apr 3 11:18:34 PDT 1990 X * - added free(ident) at end of parseFile routine X * modified: DSM Tue Jun 19 10:16:29 PDT 1990 X * - changed (width == 250) to (width = 250) in initializeArray X */ X #include #include #include #include #include "parseAFM.h" X #define lineterm EOL /* line terminating character */ #define normalEOF 1 /* return code from parsing routines used only */ X /* in this module */ #define Space "space" /* used in string comparison to look for the width */ X /* of the space character to init the widths array */ #define False "false" /* used in string comparison to check the value of */ X /* boolean keys (e.g. IsFixedPitch) */ X #define MATCH(A,B) (strncmp((A),(B), MAX_NAME) == 0) X X X /*************************** GLOBALS ***********************/ X static char *ident = NULL; /* storage buffer for keywords */ X X /* "shorts" for fast case statement X * The values of each of these enumerated items correspond to an entry in the X * table of strings defined below. Therefore, if you add a new string as X * new keyword into the keyStrings table, you must also add a corresponding X * parseKey AND it MUST be in the same position! X * X * IMPORTANT: since the sorting algorithm is a binary search, the strings of X * keywords must be placed in lexicographical order, below. [Therefore, the X * enumerated items are not necessarily in lexicographical order, depending X * on the name chosen. BUT, they must be placed in the same position as the X * corresponding key string.] The NOPE shall remain in the last position, X * since it does not correspond to any key string, and it is used in the X * "recognize" procedure to calculate how many possible keys there are. X */ X static enum parseKey { X ASCENDER, CHARBBOX, CODE, COMPCHAR, CAPHEIGHT, COMMENT, X DESCENDER, ENCODINGSCHEME, ENDCHARMETRICS, ENDCOMPOSITES, X ENDFONTMETRICS, ENDKERNDATA, ENDKERNPAIRS, ENDTRACKKERN, X FAMILYNAME, FONTBBOX, FONTNAME, FULLNAME, ISFIXEDPITCH, X ITALICANGLE, KERNPAIR, KERNPAIRXAMT, LIGATURE, CHARNAME, X NOTICE, COMPCHARPIECE, STARTCHARMETRICS, STARTCOMPOSITES, X STARTFONTMETRICS, STARTKERNDATA, STARTKERNPAIRS, X STARTTRACKKERN, TRACKKERN, UNDERLINEPOSITION, X UNDERLINETHICKNESS, VERSION, XYWIDTH, XWIDTH, WEIGHT, XHEIGHT, X NOPE }; X /* keywords for the system: X * This a table of all of the current strings that are vaild AFM keys. X * Each entry can be referenced by the appropriate parseKey value (an X * enumerated data type defined above). If you add a new keyword here, X * a corresponding parseKey MUST be added to the enumerated data type X * defined above, AND it MUST be added in the same position as the X * string is in this table. X * X * IMPORTANT: since the sorting algorithm is a binary search, the keywords X * must be placed in lexicographical order. And, NULL should remain at the X * end. X */ X static char *keyStrings[] = { X "Ascender", "B", "C", "CC", "CapHeight", "Comment", X "Descender", "EncodingScheme", "EndCharMetrics", "EndComposites", X "EndFontMetrics", "EndKernData", "EndKernPairs", "EndTrackKern", X "FamilyName", "FontBBox", "FontName", "FullName", "IsFixedPitch", X "ItalicAngle", "KP", "KPX", "L", "N", X "Notice", "PCC", "StartCharMetrics", "StartComposites", X "StartFontMetrics", "StartKernData", "StartKernPairs", X "StartTrackKern", "TrackKern", "UnderlinePosition", X "UnderlineThickness", "Version", "W", "WX", "Weight", "XHeight", X NULL }; X /*************************** PARSING ROUTINES **************/ X /*************************** token *************************/ X /* A "AFM File Conventions" tokenizer. That means that it will X * return the next token delimited by white space. See also X * the `linetoken' routine, which does a similar thing but X * reads all tokens until the next end-of-line. X */ X static char *token(stream) X FILE *stream; { X int ch, idx; X X /* skip over white space */ X while ((ch = fgetc(stream)) == ' ' || ch == lineterm || X ch == ',' || ch == '\t' || ch == ';'); X X idx = 0; X while (ch != EOF && ch != ' ' && ch != lineterm X && ch != '\t' && ch != ':' && ch != ';') X { X ident[idx++] = ch; X ch = fgetc(stream); X } /* while */ X X if (ch == EOF && idx < 1) return ((char *)NULL); X if (idx >= 1 && ch != ':' ) ungetc(ch, stream); X if (idx < 1 ) ident[idx++] = ch; /* single-character token */ X ident[idx] = 0; X X return(ident); /* returns pointer to the token */ X } /* token */ X X /*************************** linetoken *************************/ X /* "linetoken" will get read all tokens until the EOL character from X * the given stream. This is used to get any arguments that can be X * more than one word (like Comment lines and FullName). X */ X static char *linetoken(stream) X FILE *stream; { X int ch, idx; X X while ((ch = fgetc(stream)) == ' ' || ch == '\t' ); X X idx = 0; X while (ch != EOF && ch != lineterm) X { X ident[idx++] = ch; X ch = fgetc(stream); X } /* while */ X X ungetc(ch, stream); X ident[idx] = 0; X X return(ident); /* returns pointer to the token */ X } /* linetoken */ X X /*************************** recognize *************************/ X /* This function tries to match a string to a known list of X * valid AFM entries (check the keyStrings array above). X * "ident" contains everything from white space through the X * next space, tab, or ":" character. X * X * The algorithm is a standard Knuth binary search. X */ X static enum parseKey recognize(ident) X register char *ident; { X int lower = 0, upper = (int) NOPE, midpoint, cmpvalue; X BOOL found = FALSE; X X while ((upper >= lower) && !found) X { X midpoint = (lower + upper)/2; X if (keyStrings[midpoint] == NULL) break; X cmpvalue = strncmp(ident, keyStrings[midpoint], MAX_NAME); X if (cmpvalue == 0) found = TRUE; X else if (cmpvalue < 0) upper = midpoint - 1; X else lower = midpoint + 1; X } /* while */ X X if (found) return (enum parseKey) midpoint; X else return NOPE; X } /* recognize */ X X /************************* parseGlobals *****************************/ X /* This function is called by "parseFile". It will parse the AFM File X * up to the "StartCharMetrics" keyword, which essentially marks the X * end of the Global Font Information and the beginning of the character X * metrics information. X * X * If the caller of "parseFile" specified that it wanted the Global X * Font Information (as defined by the "AFM File Specification" X * document), then that information will be stored in the returned X * data structure. X * X * Any Global Font Information entries that are not found in a X * given file, will have the usual default initialization value X * for its type (i.e. entries of type int will be 0, etc). X * X * This function returns an error code specifying whether there was X * a premature EOF or a parsing error. This return value is used by X * parseFile to determine if there is more file to parse. X */ X static BOOL parseGlobals(fp, gfi) X FILE *fp; X register GlobalFontInfo *gfi; { X BOOL cont = TRUE, save = (gfi != NULL); X int error = ok; X register char *keyword; X X while (cont) X { X keyword = token(fp); X X if (keyword == NULL) X /* Have reached an early and unexpected EOF. */ X /* Set flag and stop parsing */ X { X error = earlyEOF; X break; /* get out of loop */ X } X if (!save) X /* get tokens until the end of the Global Font info section */ X /* without saving any of the data */ X switch (recognize(keyword)) X { X case STARTCHARMETRICS: X cont = FALSE; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X default: X break; X } /* switch */ X else X /* otherwise parse entire global font info section, */ X /* saving the data */ X switch(recognize(keyword)) X { X case STARTFONTMETRICS: X keyword = token(fp); X gfi->afmVersion = (char *) malloc(strlen(keyword) + 1); X strcpy(gfi->afmVersion, keyword); X break; X case COMMENT: X keyword = linetoken(fp); X break; X case FONTNAME: X keyword = token(fp); X gfi->fontName = (char *) malloc(strlen(keyword) + 1); X strcpy(gfi->fontName, keyword); X break; X case ENCODINGSCHEME: X keyword = token(fp); X gfi->encodingScheme = (char *) X malloc(strlen(keyword) + 1); X strcpy(gfi->encodingScheme, keyword); X break; X case FULLNAME: X keyword = linetoken(fp); X gfi->fullName = (char *) malloc(strlen(keyword) + 1); X strcpy(gfi->fullName, keyword); X break; X case FAMILYNAME: X keyword = linetoken(fp); X gfi->familyName = (char *) malloc(strlen(keyword) + 1); X strcpy(gfi->familyName, keyword); X break; X case WEIGHT: X keyword = token(fp); X gfi->weight = (char *) malloc(strlen(keyword) + 1); X strcpy(gfi->weight, keyword); X break; X case ITALICANGLE: X keyword = token(fp); X gfi->italicAngle = atof(keyword); X if (errno == ERANGE) error = parseError; X break; X case ISFIXEDPITCH: X keyword = token(fp); X if (MATCH(keyword, False)) X gfi->isFixedPitch = 0; X else X gfi->isFixedPitch = 1; X break; X case UNDERLINEPOSITION: X keyword = token(fp); X gfi->underlinePosition = atoi(keyword); X break; X case UNDERLINETHICKNESS: X keyword = token(fp); X gfi->underlineThickness = atoi(keyword); X break; X case VERSION: X keyword = token(fp); X gfi->version = (char *) malloc(strlen(keyword) + 1); X strcpy(gfi->version, keyword); X break; X case NOTICE: X keyword = linetoken(fp); X gfi->notice = (char *) malloc(strlen(keyword) + 1); X strcpy(gfi->notice, keyword); X break; X case FONTBBOX: X keyword = token(fp); X gfi->fontBBox.llx = atoi(keyword); X keyword = token(fp); X gfi->fontBBox.lly = atoi(keyword); X keyword = token(fp); X gfi->fontBBox.urx = atoi(keyword); X keyword = token(fp); X gfi->fontBBox.ury = atoi(keyword); X break; X case CAPHEIGHT: X keyword = token(fp); X gfi->capHeight = atoi(keyword); X break; X case XHEIGHT: X keyword = token(fp); X gfi->xHeight = atoi(keyword); X break; X case DESCENDER: X keyword = token(fp); X gfi->descender = atoi(keyword); X break; X case ASCENDER: X keyword = token(fp); X gfi->ascender = atoi(keyword); X break; X case STARTCHARMETRICS: X cont = FALSE; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X case NOPE: X default: X error = parseError; X break; X } /* switch */ X } /* while */ X X return(error); X } /* parseGlobals */ X X X /************************* initializeArray ************************/ X /* Unmapped character codes are (at Adobe Systems) assigned the X * width of the space character (if one exists) else they get the X * value of 250 ems. This function initializes all entries in the X * char widths array to have this value. Then any mapped character X * codes will be replaced with the width of the appropriate character X * when parsing the character metric section. X X * This function parses the Character Metrics Section looking X * for a space character (by comparing character names). If found, X * the width of the space character will be used to initialize the X * values in the array of character widths. X * X * Before returning, the position of the read/write pointer of the X * file is reset to be where it was upon entering this function. X */ X static int initializeArray(fp, cwi) X FILE *fp; X register int *cwi; { X BOOL cont = TRUE, found = FALSE; X long opos = ftell(fp); X int code = 0, width = 0, i = 0, error = 0; X register char *keyword; X X while (cont) X { X keyword = token(fp); X if (keyword == NULL) X { X error = earlyEOF; X break; /* get out of loop */ X } X switch(recognize(keyword)) X { X case COMMENT: X keyword = linetoken(fp); X break; X case CODE: X code = atoi(token(fp)); X break; X case XWIDTH: X width = atoi(token(fp)); X break; X case CHARNAME: X keyword = token(fp); X if (MATCH(keyword, Space)) X { X cont = FALSE; X found = TRUE; X } X break; X case ENDCHARMETRICS: X cont = FALSE; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X case NOPE: X default: X error = parseError; X break; X } /* switch */ X } /* while */ X X if (!found) X width = 250; X X for (i = 0; i < 256; ++i) X cwi[i] = width; X X fseek(fp, opos, 0); X X return(error); X } /* initializeArray */ X X /************************* parseCharWidths **************************/ X /* This function is called by "parseFile". It will parse the AFM File X * up to the "EndCharMetrics" keyword. It will save the character X * width info (as opposed to all of the character metric information) X * if requested by the caller of parseFile. Otherwise, it will just X * parse through the section without saving any information. X * X * If data is to be saved, parseCharWidths is passed in a pointer X * to an array of widths that has already been initialized by the X * standard value for unmapped character codes. This function parses X * the Character Metrics section only storing the width information X * for the encoded characters into the array using the character code X * as the index into that array. X * X * This function returns an error code specifying whether there was X * a premature EOF or a parsing error. This return value is used by X * parseFile to determine if there is more file to parse. X */ X static parseCharWidths(fp, cwi) X FILE *fp; X register int *cwi; { X BOOL cont = TRUE, save = (cwi != NULL); X int pos = 0, error = ok; X register char *keyword; X X while (cont) X { X keyword = token(fp); X /* Have reached an early and unexpected EOF. */ X /* Set flag and stop parsing */ X if (keyword == NULL) X { X error = earlyEOF; X break; /* get out of loop */ X } X if (!save) X /* get tokens until the end of the Char Metrics section without */ X /* saving any of the data*/ X switch (recognize(keyword)) X { X case ENDCHARMETRICS: X cont = FALSE; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X default: X break; X } /* switch */ X else X /* otherwise parse entire char metrics section, saving */ X /* only the char x-width info */ X switch(recognize(keyword)) X { X case COMMENT: X keyword = linetoken(fp); X break; X case CODE: X keyword = token(fp); X pos = atoi(keyword); X break; X case XYWIDTH: X /* PROBLEM: Should be no Y-WIDTH when doing "quick & dirty" */ X keyword = token(fp); keyword = token(fp); /* eat values */ X error = parseError; X break; X case XWIDTH: X keyword = token(fp); X if (pos >= 0) /* ignore unmapped chars */ X cwi[pos] = atoi(keyword); X break; X case ENDCHARMETRICS: X cont = FALSE; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X case CHARNAME: /* eat values (so doesn't cause parseError) */ X keyword = token(fp); X break; X case CHARBBOX: X keyword = token(fp); keyword = token(fp); X keyword = token(fp); keyword = token(fp); X break; X case LIGATURE: X keyword = token(fp); keyword = token(fp); X break; X case NOPE: X default: X error = parseError; X break; X } /* switch */ X } /* while */ X X return(error); X } /* parseCharWidths */ X X /************************* parseCharMetrics ************************/ X /* This function is called by parseFile if the caller of parseFile X * requested that all character metric information be saved X * (as opposed to only the character width information). X * X * parseCharMetrics is passed in a pointer to an array of records X * to hold information on a per character basis. This function X * parses the Character Metrics section storing all character X * metric information for the ALL characters (mapped and unmapped) X * into the array. X * X * This function returns an error code specifying whether there was X * a premature EOF or a parsing error. This return value is used by X * parseFile to determine if there is more file to parse. X */ X static parseCharMetrics(fp, fi) X FILE *fp; X register FontInfo *fi; { X BOOL cont = TRUE, firstTime = TRUE; X int error = ok, count = 0; X register CharMetricInfo *temp = fi->cmi; X register char *keyword; X X while (cont) X { X keyword = token(fp); X if (keyword == NULL) X { X error = earlyEOF; X break; /* get out of loop */ X } X switch(recognize(keyword)) X { X case COMMENT: X keyword = linetoken(fp); X break; X case CODE: X if (count < fi->numOfChars) X { X if (firstTime) firstTime = FALSE; X else temp++; X temp->code = atoi(token(fp)); X count++; X } X else X { X error = parseError; X cont = FALSE; X } X break; X case XYWIDTH: X temp->wx = atoi(token(fp)); X temp->wy = atoi(token(fp)); X break; X case XWIDTH: X temp->wx = atoi(token(fp)); X break; X case CHARNAME: X keyword = token(fp); X temp->name = (char *) malloc(strlen(keyword) + 1); X strcpy(temp->name, keyword); X break; X case CHARBBOX: X temp->charBBox.llx = atoi(token(fp)); X temp->charBBox.lly = atoi(token(fp)); X temp->charBBox.urx = atoi(token(fp)); X temp->charBBox.ury = atoi(token(fp)); X break; X case LIGATURE: { X Ligature **tail = &(temp->ligs); X Ligature *node = *tail; X X if (*tail != NULL) X { X while (node->next != NULL) X node = node->next; X tail = &(node->next); X } X X *tail = (Ligature *) calloc(1, sizeof(Ligature)); X keyword = token(fp); X (*tail)->succ = (char *) malloc(strlen(keyword) + 1); X strcpy((*tail)->succ, keyword); X keyword = token(fp); X (*tail)->lig = (char *) malloc(strlen(keyword) + 1); X strcpy((*tail)->lig, keyword); X break; } X case ENDCHARMETRICS: X cont = FALSE;; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X case NOPE: X default: X error = parseError; X break; X } /* switch */ X } /* while */ X X if ((error == ok) && (count != fi->numOfChars)) X error = parseError; X X return(error); X } /* parseCharMetrics */ X X X /************************* parseTrackKernData ***********************/ X /* This function is called by "parseFile". It will parse the AFM File X * up to the "EndTrackKern" or "EndKernData" keywords. It will save the X * track kerning data if requested by the caller of parseFile. X * X * parseTrackKernData is passed in a pointer to the FontInfo record. X * If data is to be saved, the FontInfo record will already contain X * a valid pointer to storage for the track kerning data. X * X * This function returns an error code specifying whether there was X * a premature EOF or a parsing error. This return value is used by X * parseFile to determine if there is more file to parse. X */ X static parseTrackKernData(fp, fi) X FILE *fp; X register FontInfo *fi; { X BOOL cont = TRUE, save = (fi->tkd != NULL); X int pos = 0, error = ok, tcount = 0; X register char *keyword; X X while (cont) X { X keyword = token(fp); X X if (keyword == NULL) X { X error = earlyEOF; X break; /* get out of loop */ X } X if (!save) X /* get tokens until the end of the Track Kerning Data */ X /* section without saving any of the data */ X switch(recognize(keyword)) X { X case ENDTRACKKERN: X case ENDKERNDATA: X cont = FALSE; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X default: X break; X } /* switch */ X else X /* otherwise parse entire Track Kerning Data section, */ X /* saving the data */ X switch(recognize(keyword)) X { X case COMMENT: X keyword = linetoken(fp); X break; X case TRACKKERN: X if (tcount < fi->numOfTracks) X { X keyword = token(fp); X fi->tkd[pos].degree = atoi(keyword); X keyword = token(fp); X fi->tkd[pos].minPtSize = atof(keyword); X if (errno == ERANGE) error = parseError; X keyword = token(fp); X fi->tkd[pos].minKernAmt = atof(keyword); X if (errno == ERANGE) error = parseError; X keyword = token(fp); X fi->tkd[pos].maxPtSize = atof(keyword); X if (errno == ERANGE) error = parseError; X keyword = token(fp); X fi->tkd[pos++].maxKernAmt = atof(keyword); X if (errno == ERANGE) error = parseError; X tcount++; X } X else X { X error = parseError; X cont = FALSE; X } X break; X case ENDTRACKKERN: X case ENDKERNDATA: X cont = FALSE; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X case NOPE: X default: X error = parseError; X break; X } /* switch */ X } /* while */ X X if (error == ok && tcount != fi->numOfTracks) X error = parseError; X X return(error); X } /* parseTrackKernData */ X X /************************* parsePairKernData ************************/ X /* This function is called by "parseFile". It will parse the AFM File X * up to the "EndKernPairs" or "EndKernData" keywords. It will save X * the pair kerning data if requested by the caller of parseFile. X * X * parsePairKernData is passed in a pointer to the FontInfo record. X * If data is to be saved, the FontInfo record will already contain X * a valid pointer to storage for the pair kerning data. X * X * This function returns an error code specifying whether there was X * a premature EOF or a parsing error. This return value is used by X * parseFile to determine if there is more file to parse. X */ X static parsePairKernData(fp, fi) X FILE *fp; X register FontInfo *fi; { X BOOL cont = TRUE, save = (fi->pkd != NULL); X int pos = 0, error = ok, pcount = 0; X register char *keyword; X X while (cont) X { X keyword = token(fp); X X if (keyword == NULL) X { X error = earlyEOF; X break; /* get out of loop */ X } X if (!save) X /* get tokens until the end of the Pair Kerning Data */ X /* section without saving any of the data */ X switch(recognize(keyword)) X { X case ENDKERNPAIRS: X case ENDKERNDATA: X cont = FALSE; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X default: X break; X } /* switch */ X else X /* otherwise parse entire Pair Kerning Data section, */ X /* saving the data */ X switch(recognize(keyword)) X { X case COMMENT: X keyword = linetoken(fp); X break; X case KERNPAIR: X if (pcount < fi->numOfPairs) X { X keyword = token(fp); X fi->pkd[pos].name1 = (char *) X malloc(strlen(keyword) + 1); X strcpy(fi->pkd[pos].name1, keyword); X keyword = token(fp); X fi->pkd[pos].name2 = (char *) X malloc(strlen(keyword) + 1); X strcpy(fi->pkd[pos].name2, keyword); X keyword = token(fp); X fi->pkd[pos].xamt = atoi(keyword); X keyword = token(fp); X fi->pkd[pos++].yamt = atoi(keyword); X pcount++; X } X else X { X error = parseError; X cont = FALSE; X } X break; X case KERNPAIRXAMT: X if (pcount < fi->numOfPairs) X { X keyword = token(fp); X fi->pkd[pos].name1 = (char *) X malloc(strlen(keyword) + 1); X strcpy(fi->pkd[pos].name1, keyword); X keyword = token(fp); X fi->pkd[pos].name2 = (char *) X malloc(strlen(keyword) + 1); X strcpy(fi->pkd[pos].name2, keyword); X keyword = token(fp); X fi->pkd[pos++].xamt = atoi(keyword); X pcount++; X } X else X { X error = parseError; X cont = FALSE; X } X break; X case ENDKERNPAIRS: X case ENDKERNDATA: X cont = FALSE; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X case NOPE: X default: X error = parseError; X break; X } /* switch */ X } /* while */ X X if (error == ok && pcount != fi->numOfPairs) X error = parseError; X X return(error); X } /* parsePairKernData */ X X /************************* parseCompCharData **************************/ X /* This function is called by "parseFile". It will parse the AFM File X * up to the "EndComposites" keyword. It will save the composite X * character data if requested by the caller of parseFile. X * X * parseCompCharData is passed in a pointer to the FontInfo record, and X * a boolean representing if the data should be saved. X * X * This function will create the appropriate amount of storage for X * the composite character data and store a pointer to the storage X * in the FontInfo record. X * X * This function returns an error code specifying whether there was X * a premature EOF or a parsing error. This return value is used by X * parseFile to determine if there is more file to parse. X */ X static parseCompCharData(fp, fi) X FILE *fp; X register FontInfo *fi; { X BOOL cont = TRUE, firstTime = TRUE, save = (fi->ccd != NULL); X int pos = 0, j = 0, error = ok, ccount = 0, pcount = 0; X register char *keyword; X X while (cont) X { X keyword = token(fp); X if (keyword == NULL) X /* Have reached an early and unexpected EOF. */ X /* Set flag and stop parsing */ X { X error = earlyEOF; X break; /* get out of loop */ X } X if (ccount > fi->numOfComps) X { X error = parseError; X break; /* get out of loop */ X } X if (!save) X /* get tokens until the end of the Composite Character info */ X /* section without saving any of the data */ X switch(recognize(keyword)) X { X case ENDCOMPOSITES: X cont = FALSE; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X default: X break; X } /* switch */ X else X /* otherwise parse entire Composite Character info section, */ X /* saving the data */ X switch(recognize(keyword)) X { X case COMMENT: X keyword = linetoken(fp); X break; X case COMPCHAR: X if (ccount < fi->numOfComps) X { X keyword = token(fp); X if (pcount != fi->ccd[pos].numOfPieces) X error = parseError; X pcount = 0; X if (firstTime) firstTime = FALSE; X else pos++; X fi->ccd[pos].ccName = (char *) X malloc(strlen(keyword) + 1); X strcpy(fi->ccd[pos].ccName, keyword); X keyword = token(fp); X fi->ccd[pos].numOfPieces = atoi(keyword); X fi->ccd[pos].pieces = (Pcc *) X calloc(fi->ccd[pos].numOfPieces, sizeof(Pcc)); X j = 0; X ccount++; X } X else X { X error = parseError; X cont = FALSE; X } X break; X case COMPCHARPIECE: X if (pcount < fi->ccd[pos].numOfPieces) X { X keyword = token(fp); X fi->ccd[pos].pieces[j].pccName = (char *) X malloc(strlen(keyword) + 1); X strcpy(fi->ccd[pos].pieces[j].pccName, keyword); X keyword = token(fp); X fi->ccd[pos].pieces[j].deltax = atoi(keyword); X keyword = token(fp); X fi->ccd[pos].pieces[j++].deltay = atoi(keyword); X pcount++; X } X else X error = parseError; X break; X case ENDCOMPOSITES: X cont = FALSE; X break; X case ENDFONTMETRICS: X cont = FALSE; X error = normalEOF; X break; X case NOPE: X default: X error = parseError; X break; X } /* switch */ X } /* while */ X X if (error == ok && ccount != fi->numOfComps) X error = parseError; X X return(error); X } /* parseCompCharData */ X X X X /*************************** 'PUBLIC' FUNCTION ********************/ X X /*************************** parseFile *****************************/ X /* parseFile is the only 'public' procedure available. It is called X * from an application wishing to get information from an AFM file. X * The caller of this function is responsible for locating and opening X * an AFM file and handling all errors associated with that task. X * X * parseFile expects 3 parameters: a vaild file pointer, a pointer X * to a (FontInfo *) variable (for which storage will be allocated and X * the data requested filled in), and a mask specifying which X * data from the AFM File should be saved in the FontInfo structure. X * X * The file will be parsed and the requested data will be stored in X * a record of type FontInfo (refer to ParseAFM.h). X * X * parseFile returns an error code as defined in parseAFM.h. X * X * The position of the read/write pointer associated with the file X * pointer upon return of this function is undefined. X */ X extern int parseFile (fp, fi, flags) X FILE *fp; X FontInfo **fi; X FLAGS flags; { X X int code = ok; /* return code from each of the parsing routines */ X int error = ok; /* used as the return code from this function */ X X register char *keyword; /* used to store a token */ X X X /* storage data for the global variable ident */ X ident = (char *) calloc(MAX_NAME, sizeof(char)); X if (ident == NULL) {error = storageProblem; return(error);} X X (*fi) = (FontInfo *) calloc(1, sizeof(FontInfo)); X if ((*fi) == NULL) {error = storageProblem; return(error);} X X if (flags & P_G) X { X (*fi)->gfi = (GlobalFontInfo *) calloc(1, sizeof(GlobalFontInfo)); X if ((*fi)->gfi == NULL) {error = storageProblem; return(error);} X } X X /* The AFM File begins with Global Font Information. This section */ X /* will be parsed whether or not information should be saved. */ X code = parseGlobals(fp, (*fi)->gfi); X X if (code < 0) error = code; X X /* The Global Font Information is followed by the Character Metrics */ X /* section. Which procedure is used to parse this section depends on */ X /* how much information should be saved. If all of the metrics info */ X /* is wanted, parseCharMetrics is called. If only the character widths */ X /* is wanted, parseCharWidths is called. parseCharWidths will also */ X /* be called in the case that no character data is to be saved, just */ X /* to parse through the section. */ X X if ((code != normalEOF) && (code != earlyEOF)) X { X (*fi)->numOfChars = atoi(token(fp)); X if (flags & (P_M ^ P_W)) X { X (*fi)->cmi = (CharMetricInfo *) X calloc((*fi)->numOfChars, sizeof(CharMetricInfo)); X if ((*fi)->cmi == NULL) {error = storageProblem; return(error);} X code = parseCharMetrics(fp, *fi); X } X else X { X if (flags & P_W) X { X (*fi)->cwi = (int *) calloc(256, sizeof(int)); X if ((*fi)->cwi == NULL) X { X error = storageProblem; X return(error); X } X } X /* parse section regardless */ X code = parseCharWidths(fp, (*fi)->cwi); X } /* else */ X } /* if */ X X if ((error != earlyEOF) && (code < 0)) error = code; X X /* The remaining sections of the AFM are optional. This code will */ X /* look at the next keyword in the file to determine what section */ X /* is next, and then allocate the appropriate amount of storage */ X /* for the data (if the data is to be saved) and call the */ X /* appropriate parsing routine to parse the section. */ X X while ((code != normalEOF) && (code != earlyEOF)) X { X keyword = token(fp); X if (keyword == NULL) X /* Have reached an early and unexpected EOF. */ X /* Set flag and stop parsing */ X { X code = earlyEOF; X break; /* get out of loop */ X } X switch(recognize(keyword)) X { X case STARTKERNDATA: X break; X case ENDKERNDATA: X break; X case STARTTRACKKERN: X keyword = token(fp); X if (flags & P_T) X { X (*fi)->numOfTracks = atoi(keyword); X (*fi)->tkd = (TrackKernData *) X calloc((*fi)->numOfTracks, sizeof(TrackKernData)); X if ((*fi)->tkd == NULL) X { X error = storageProblem; X return(error); X } X } /* if */ X code = parseTrackKernData(fp, *fi); X break; X case STARTKERNPAIRS: X keyword = token(fp); X if (flags & P_P) X { X (*fi)->numOfPairs = atoi(keyword); X (*fi)->pkd = (PairKernData *) X calloc((*fi)->numOfPairs, sizeof(PairKernData)); X if ((*fi)->pkd == NULL) X { X error = storageProblem; X return(error); X } X } /* if */ X code = parsePairKernData(fp, *fi); X break; X case STARTCOMPOSITES: X keyword = token(fp); X if (flags & P_C) X { X (*fi)->numOfComps = atoi(keyword); X (*fi)->ccd = (CompCharData *) X calloc((*fi)->numOfComps, sizeof(CompCharData)); X if ((*fi)->ccd == NULL) X { X error = storageProblem; X return(error); X } X } /* if */ X code = parseCompCharData(fp, *fi); X break; X case ENDFONTMETRICS: X code = normalEOF; X break; X case NOPE: X default: X code = parseError; X break; X } /* switch */ X X if ((error != earlyEOF) && (code < 0)) error = code; X X } /* while */ X X if ((error != earlyEOF) && (code < 0)) error = code; X X if (ident != NULL) { free(ident); ident = NULL; } X X return(error); X } /* parseFile */ SHAR_EOF $shar_touch -am 1018085596 'parseAFM.c' && chmod 0644 'parseAFM.c' || $echo 'restore of' 'parseAFM.c' 'failed' shar_count="`wc -c < 'parseAFM.c'`" test 43280 -eq "$shar_count" || $echo 'parseAFM.c:' 'original size' '43280,' 'current size' "$shar_count" fi # ============= parseAFM.h ============== if test -f 'parseAFM.h' && test X"$1" != X"-c"; then $echo 'x -' SKIPPING 'parseAFM.h' '(file already exists)' else $echo 'x -' extracting 'parseAFM.h' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'parseAFM.h' && /* X * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved. X * X * This file may be freely copied and redistributed as long as: X * 1) This entire notice continues to be included in the file, X * 2) If the file has been modified in any way, a notice of such X * modification is conspicuously indicated. X * X * PostScript, Display PostScript, and Adobe are registered trademarks of X * Adobe Systems Incorporated. X * X * ************************************************************************ X * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT X * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS X * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR X * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY X * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION, X * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, X * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. X * ************************************************************************ X */ X /* ParseAFM.h X * X * This header file is used in conjuction with the parseAFM.c file. X * Together these files provide the functionality to parse Adobe Font X * Metrics files and store the information in predefined data structures. X * It is intended to work with an application program that needs font metric X * information. The program can be used as is by making a procedure call to X * parse an AFM file and have the data stored, or an application developer X * may wish to customize the code. X * X * This header file defines the data structures used as well as the key X * strings that are currently recognized by this version of the AFM parser. X * This program is based on the document "Adobe Font Metrics Files, X * Specification Version 2.0". X * X * AFM files are separated into distinct sections of different data. Because X * of this, the parseAFM program can parse a specified file to only save X * certain sections of information based on the application's needs. A record X * containing the requested information will be returned to the application. X * X * AFM files are divided into five sections of data: X * 1) The Global Font Information X * 2) The Character Metrics Information X * 3) The Track Kerning Data X * 4) The Pair-Wise Kerning Data X * 5) The Composite Character Data X * X * Basically, the application can request any of these sections independent X * of what other sections are requested. In addition, in recognizing that X * many applications will want ONLY the x-width of characters and not all X * of the other character metrics information, there is a way to receive X * only the width information so as not to pay the storage cost for the X * unwanted data. An application should never request both the X * "quick and dirty" char metrics (widths only) and the Character Metrics X * Information since the Character Metrics Information will contain all X * of the character widths as well. X * X * There is a procedure in parseAFM.c, called parseFile, that can be X * called from any application wishing to get information from the AFM File. X * This procedure expects 3 parameters: a vaild file descriptor, a pointer X * to a (FontInfo *) variable (for which space will be allocated and then X * will be filled in with the data requested), and a mask specifying X * which data from the AFM File should be saved in the FontInfo structure. X * X * The flags that can be used to set the appropriate mask are defined below. X * In addition, several commonly used masks have already been defined. X * X * History: X * original: DSM Thu Oct 20 17:39:59 PDT 1988 X * modified: DSM Mon Jul 3 14:17:50 PDT 1989 X * - added 'storageProblem' return code X * - fixed typos X */ X #include X X X /* your basic constants */ #define TRUE 1 #define FALSE 0 #define EOL '\n' /* end-of-line indicator */ #define MAX_NAME 4096 /* max length for identifiers */ #define BOOL int #define FLAGS int X X X /* Flags that can be AND'ed together to specify exactly what X * information from the AFM file should be saved. X */ #define P_G 0x01 /* 0000 0001 */ /* Global Font Info */ #define P_W 0x02 /* 0000 0010 */ /* Character Widths ONLY */ #define P_M 0x06 /* 0000 0110 */ /* All Char Metric Info */ #define P_P 0x08 /* 0000 1000 */ /* Pair Kerning Info */ #define P_T 0x10 /* 0001 0000 */ /* Track Kerning Info */ #define P_C 0x20 /* 0010 0000 */ /* Composite Char Info */ X X /* Commonly used flags X */ #define P_GW (P_G | P_W) #define P_GM (P_G | P_M) #define P_GMP (P_G | P_M | P_P) #define P_GMK (P_G | P_M | P_P | P_T) #define P_ALL (P_G | P_M | P_P | P_T | P_C) X X X /* Possible return codes from the parseFile procedure. X * X * ok means there were no problems parsing the file. X * X * parseError means that there was some kind of parsing error, but the X * parser went on. This could include problems like the count for any given X * section does not add up to how many entries there actually were, or X * there was a key that was not recognized. The return record may contain X * vaild data or it may not. X * X * earlyEOF means that an End of File was encountered before expected. This X * may mean that the AFM file had been truncated, or improperly formed. X * X * storageProblem means that there were problems allocating storage for X * the data structures that would have contained the AFM data. X */ #define ok 0 #define parseError -1 #define earlyEOF -2 #define storageProblem -3 X X X /************************* TYPES *********************************/ /* Below are all of the data structure definitions. These structures X * try to map as closely as possible to grouping and naming of data X * in the AFM Files. X */ X X /* Bounding box definition. Used for the Font BBox as well as the X * Character BBox. X */ typedef struct { X int llx; /* lower left x-position */ X int lly; /* lower left y-position */ X int urx; /* upper right x-position */ X int ury; /* upper right y-position */ } BBox; X X /* Global Font information. X * The key that each field is associated with is in comments. For an X * explanation about each key and its value please refer to the AFM X * documentation (full title & version given above). X */ typedef struct { X char *afmVersion; /* key: StartFontMetrics */ X char *fontName; /* key: FontName */ X char *fullName; /* key: FullName */ X char *familyName; /* key: FamilyName */ X char *weight; /* key: Weight */ X float italicAngle; /* key: ItalicAngle */ X BOOL isFixedPitch; /* key: IsFixedPitch */ X BBox fontBBox; /* key: FontBBox */ X int underlinePosition; /* key: UnderlinePosition */ X int underlineThickness; /* key: UnderlineThickness */ X char *version; /* key: Version */ X char *notice; /* key: Notice */ X char *encodingScheme; /* key: EncodingScheme */ X int capHeight; /* key: CapHeight */ X int xHeight; /* key: XHeight */ X int ascender; /* key: Ascender */ X int descender; /* key: Descender */ } GlobalFontInfo; X X /* Ligature definition is a linked list since any character can have X * any number of ligatures. X */ typedef struct _t_ligature { X char *succ, *lig; X struct _t_ligature *next; } Ligature; X X /* Character Metric Information. This structure is used only if ALL X * character metric information is requested. If only the character X * widths is requested, then only an array of the character x-widths X * is returned. X * X * The key that each field is associated with is in comments. For an X * explanation about each key and its value please refer to the X * Character Metrics section of the AFM documentation (full title X * & version given above). X */ typedef struct { X int code, /* key: C */ X wx, /* key: WX */ X wy; /* together wx and wy are associated with key: W */ X char *name; /* key: N */ X BBox charBBox; /* key: B */ X Ligature *ligs; /* key: L (linked list; not a fixed number of Ls */ } CharMetricInfo; X X /* Track kerning data structure. X * The fields of this record are the five values associated with every X * TrackKern entry. X * X * For an explanation about each value please refer to the X * Track Kerning section of the AFM documentation (full title X * & version given above). X */ typedef struct { X int degree; X float minPtSize, X minKernAmt, X maxPtSize, X maxKernAmt; } TrackKernData; X X /* Pair Kerning data structure. X * The fields of this record are the four values associated with every X * KP entry. For KPX entries, the yamt will be zero. X * X * For an explanation about each value please refer to the X * Pair Kerning section of the AFM documentation (full title X * & version given above). X */ typedef struct { X char *name1; X char *name2; X int xamt, X yamt; } PairKernData; X X /* PCC is a piece of a composite character. This is a sub structure of a X * compCharData described below. X * These fields will be filled in with the values from the key PCC. X * X * For an explanation about each key and its value please refer to the X * Composite Character section of the AFM documentation (full title X * & version given above). X */ typedef struct { X char *pccName; X int deltax, X deltay; } Pcc; X X /* Composite Character Information data structure. X * The fields ccName and numOfPieces are filled with the values associated X * with the key CC. The field pieces points to an array (size = numOfPieces) X * of information about each of the parts of the composite character. That X * array is filled in with the values from the key PCC. X * X * For an explanation about each key and its value please refer to the X * Composite Character section of the AFM documentation (full title X * & version given above). X */ typedef struct { X char *ccName; X int numOfPieces; X Pcc *pieces; } CompCharData; X X /* FontInfo X * Record type containing pointers to all of the other data X * structures containing information about a font. X * A a record of this type is filled with data by the X * parseFile function. X */ typedef struct { X GlobalFontInfo *gfi; /* ptr to a GlobalFontInfo record */ X int *cwi; /* ptr to 256 element array of just char widths */ X int numOfChars; /* number of entries in char metrics array */ X CharMetricInfo *cmi; /* ptr to char metrics array */ X int numOfTracks; /* number to entries in track kerning array */ X TrackKernData *tkd; /* ptr to track kerning array */ X int numOfPairs; /* number to entries in pair kerning array */ X PairKernData *pkd; /* ptr to pair kerning array */ X int numOfComps; /* number to entries in comp char array */ X CompCharData *ccd; /* ptr to comp char array */ } FontInfo; X X X /************************* PROCEDURES ****************************/ X /* Call this procedure to do the grunt work of parsing an AFM file. X * X * "fp" should be a valid file pointer to an AFM file. X * X * "fi" is a pointer to a pointer to a FontInfo record sturcture X * (defined above). Storage for the FontInfo structure will be X * allocated in parseFile and the structure will be filled in X * with the requested data from the AFM File. X * X * "flags" is a mask with bits set representing what data should X * be saved. Defined above are valid flags that can be used to set X * the mask, as well as a few commonly used masks. X * X * The possible return codes from parseFile are defined above. X */ X extern int parseFile ( /* FILE *fp; FontInfo **fi; FLAGS flags; */ ); SHAR_EOF $shar_touch -am 1018085596 'parseAFM.h' && chmod 0644 'parseAFM.h' || $echo 'restore of' 'parseAFM.h' 'failed' shar_count="`wc -c < 'parseAFM.h'`" test 11502 -eq "$shar_count" || $echo 'parseAFM.h:' 'original size' '11502,' 'current size' "$shar_count" fi # ============= parseAFMclient.c ============== if test -f 'parseAFMclient.c' && test X"$1" != X"-c"; then $echo 'x -' SKIPPING 'parseAFMclient.c' '(file already exists)' else $echo 'x -' extracting 'parseAFMclient.c' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'parseAFMclient.c' && /* X * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved. X * X * This file may be freely copied and redistributed as long as: X * 1) This entire notice continues to be included in the file, X * 2) If the file has been modified in any way, a notice of such X * modification is conspicuously indicated. X * X * PostScript, Display PostScript, and Adobe are registered trademarks of X * Adobe Systems Incorporated. X * X * ************************************************************************ X * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT X * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS X * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR X * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY X * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION, X * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, X * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. X * ************************************************************************ X */ X /* parseAFMclient.c X * X * This file is an example of how an application might use the provided X * AFM Parser (parseAFM.c). X * X * In a nutshell, the client of the parser (like this file) chooses X * the AFM File that it wishes to have parsed, opens the file for X * reading (and does any/all error handling associated with that task), X * and passes the resulting file pointer to the procedure "parseFile" X * (in parseAFM.c). In addition to the file pointer, the client also X * needs to pass a pointer to a FontInfo record type (for which storage X * will be allocated and data filled in), and a mask representing which X * sections of the AFM should be saved in the FontInfo record. X * X * In the procedure "main", the mask is built from command line switches, X * but your application, of course, can set that mask any way you prefer. X * "main" then calls the "parseFile" procedure (of parseAFM.c) to do the X * grunt work, and checks the error codes upon "parseFile"'s return. X * X * The rest of this sample application is a collection of print routines X * that show how to reference each of the sections of data and a X * "freeStorage" routine (that many unix programmers may feel they X * don't need but is included for portability to other systems that do X * need to manage storage). The print procedures are there just to X * give meaning to this application, and hopefully your application X * will use the data collected from the AFM file in a more useful way. X * X * History: X * original: DSM Thu Oct 20 17:39:59 PDT 1988 X * modified: DSM Mon Jul 3 14:17:50 PDT 1989 X * - added 'storageProblem' check in main X */ X #include #include "parseAFM.h" X X /*************************** GLOBALS ***************************/ FontInfo *fi; FLAGS myflags = 0; X X /*************************** printGlobals **********************/ X printGlobals() { X printf("\nThis AFM is of Version %s\n", fi->gfi->afmVersion); X printf("The font name is %s\n", fi->gfi->fontName); X printf("The full name is %s\n", fi->gfi->fullName); X printf("The family name is %s\n", fi->gfi->familyName); X printf("The weight is %s\n", fi->gfi->weight); X printf("Italic Angle is %3.1f\n", fi->gfi->italicAngle); X if (fi->gfi->isFixedPitch) X printf("This font IS fixed-pitch\n"); X else X printf("This font is NOT fixed-pitch\n"); X printf("Underline position is %d\n", fi->gfi->underlinePosition); X printf("Underline thickness is %d\n", fi->gfi->underlineThickness); X printf("Version is %s\n", fi->gfi->version); X printf("FontBBox is [%d, %d, %d, %d]\n", X fi->gfi->fontBBox.llx, fi->gfi->fontBBox.lly, X fi->gfi->fontBBox.urx, fi->gfi->fontBBox.ury); X printf("%s\n", fi->gfi->notice); X printf("Encoding Scheme is %s\n", fi->gfi->encodingScheme); X printf("CapHeight is %d\n", fi->gfi->capHeight); X printf("XHeight is %d\n", fi->gfi->xHeight); X printf("Descender is %d\n", fi->gfi->descender); X printf("Ascender is %d\n\n", fi->gfi->ascender); X } /* printGlobals */ X X /*************************** printCharWidths *********************/ printCharWidths() { X int i = 0; X printf("Here come some character widths ...\n"); X for (i = 0; i < 256; ++i) X printf(" code: %3d width: %4d\n", i, fi->cwi[i]); X printf("\n"); X } /* printCharWidths */ X X /*************************** printAllCharMetrics *****************/ printAllCharMetrics() { X int i = 0; X CharMetricInfo *temp = fi->cmi; X Ligature *node = temp->ligs; X X printf("Here come some character metrics ...\n"); X for (i = 0; i < fi->numOfChars; ++i) X { X printf( X " code: %3d x-width: %4d y-width: %4d name: %-12s bbox: [%d, %d, %d, %d]\n", X temp->code, temp->wx, temp->wy, temp->name, temp->charBBox.llx, X temp->charBBox.lly, temp->charBBox.urx, temp->charBBox.ury); X for (node = temp->ligs; node != NULL; node = node->next) X { X printf(" Ligatures: successor: %s ligature: %s\n", X node->succ, node->lig); X } X temp++; X } /* for */ X printf("\n"); X } /* printAllCharMetrics */ X X /*************************** printKernPairData ******************/ printKernPairData() { X int i = 0; X PairKernData *pkd = fi->pkd; X X if (fi->numOfPairs != 0) X { X printf("Here comes the pair kerning data ...\n"); X for (i = 0; i < fi->numOfPairs; ++i) X printf( X " char 1: %-12s char 2: %-12s x-amount: %d y-amount: %d\n", X pkd[i].name1, pkd[i].name2, pkd[i].xamt, pkd[i].yamt); X } X else printf("There isn't any pair kerning data.\n"); X printf("\n"); X } /* printKernPairData */ X X /*************************** printKernTrackData *******************/ printKernTrackData() { X int i = 0; X TrackKernData *tkd = fi->tkd; X X if (fi->numOfTracks != 0) X { X printf("Here comes the track kerning data ...\n"); X for (i = 0; i < fi->numOfTracks; ++i) X printf( X " degree: %d min-pt: %5.2f min-kern: %5.2f max-pt: %5.2f max-kern: %5.2f\n", X tkd[i].degree, tkd[i].minPtSize, tkd[i].minKernAmt, X tkd[i].maxPtSize, tkd[i].maxKernAmt); X } X else printf("There isn't any track kerning data.\n"); X printf("\n"); X } /* printKernTrackData */ X X /*************************** printCompCharData ********************/ printCompCharData() { X int i = 0, j = 0; X CompCharData *ccd = fi->ccd; X X if (fi->numOfComps != 0) X { X printf("Here comes the composite character data ...\n"); X for (i = 0; i < fi->numOfComps; ++i) X { X printf(" comp char: %-12s pieces: %d\n", X ccd[i].ccName, ccd[i].numOfPieces); X for (j = 0; j < ccd[i].numOfPieces; ++j) X printf( X " Part # %d Name: %-12s Delta X: %d Delta Y: %d\n", X (j + 1), ccd[i].pieces[j].pccName, X ccd[i].pieces[j].deltax, ccd[i].pieces[j].deltay); X } X } X else printf("There aren't any composites characters. \n"); X printf("\n"); X } /* printCompCharData */ X X X /*************************** freeStorage ***********************/ X freeStorage() { X if (fi != NULL) X { X if (fi->gfi != NULL) X { X free(fi->gfi->afmVersion); fi->gfi->afmVersion = NULL; X free(fi->gfi->fontName); fi->gfi->fontName = NULL; X free(fi->gfi->fullName); fi->gfi->fullName = NULL; X free(fi->gfi->familyName); fi->gfi->familyName = NULL; X free(fi->gfi->weight); fi->gfi->weight = NULL; X free(fi->gfi->version); fi->gfi->version = NULL; X free(fi->gfi->notice); fi->gfi->notice = NULL; X free(fi->gfi->encodingScheme); fi->gfi->encodingScheme = NULL; X free(fi->gfi); fi->gfi = NULL; X } X X if (fi->cwi != NULL) X { free(fi->cwi); fi->cwi = NULL; } X X if (fi->cmi != NULL) X { X int i = 0; X CharMetricInfo *temp = fi->cmi; X Ligature *node = temp->ligs; X X for (i = 0; i < fi->numOfChars; ++i) X { X for (node = temp->ligs; node != NULL; node = node->next) X { X free(node->succ); node->succ = NULL; X free(node->lig); node->lig = NULL; X } X X free(temp->name); temp->name = NULL; X temp++; X } X X free(fi->cmi); fi->cmi = NULL; X } X X if (fi->tkd != NULL) X { free(fi->tkd); fi->tkd = NULL; } X X if (fi->pkd != NULL) X { X free(fi->pkd->name1); fi->pkd->name1 = NULL; X free(fi->pkd->name2); fi->pkd->name2 = NULL; X free(fi->pkd); fi->pkd = NULL; X } X X if (fi->ccd != NULL) X { X int i = 0, j = 0; X CompCharData *ccd = fi->ccd; X X for (i = 0; i < fi->numOfComps; ++i) X { X for (j = 0; j < ccd[i].numOfPieces; ++j) X { X free(ccd[i].pieces[j].pccName); X ccd[i].pieces[j].pccName = NULL; X } X X free(ccd[i].ccName); ccd[i].ccName = NULL; X } X X free(fi->ccd); fi->ccd = NULL; X } X X free(fi); X X } /* if */ X } /* freeStorage */ X X /*************************** printValues **************************/ X printValues() { X if ((myflags & P_G) && (fi->gfi != NULL)) printGlobals(); X if ((myflags & (P_M ^ P_W)) && (fi->cmi != NULL)) printAllCharMetrics(); X else if ((myflags & P_W) && (fi->cwi != NULL)) printCharWidths(); X if ((myflags & P_P) && (fi->pkd != NULL)) printKernPairData(); X if ((myflags & P_T) && (fi->tkd != NULL)) printKernTrackData(); X if ((myflags & P_C) && (fi->ccd != NULL)) printCompCharData(); X } /* printValues */ X X X /*************************** main *********************************/ X main (argc, argv) X int argc; X char **argv; { X char *filename, *prog = *argv; X FILE *fp; X X ++argv; --argc; X while (argc > 0 && **argv == '-') X { X switch ((*argv)[1]) X { X case 'g': /* save Globals */ X myflags |= P_G; X break; X case 'w': /* save Char Widths */ X myflags |= P_W; X break; X case 'm': /* save All Char Metrics */ X myflags |= P_M; X break; X case 'p': /* save Kern Pair Data */ X myflags |= P_P; X break; X case 't': /* save Kern Track Data */ X myflags |= P_T; X break; X case 'c': /* save Comp Char Data */ X myflags |= P_C; X break; X default: X printf(" usage: parseAFM [-g] [-w] [-p] [-t] [-c] [AFM File]\nOR: usage: parseAFM [-g] [-m] [-p] [-t] [-c] [AFM File]\n"); X exit(0); X } X ++argv; --argc; X } X X if (!argc) X { X printf(" usage: parseAFM [-g] [-w] [-p] [-t] [-c] [AFM File]\nOR: usage: parseAFM [-g] [-m] [-p] [-t] [-c] [AFM File]\n"); X exit(0); X } X else X filename = *argv; X X if (!filename[0]) X { X printf ("*** ERROR: can't open. filename is missing.\n", X filename ); X return 0; X } X X fp = fopen(filename, "r" ); X if (fp == NULL) X { X printf ("*** ERROR: can't find: %s\n", filename ); X exit(1); X } X X switch (parseFile(fp, &fi, myflags)) X { X case parseError: X printf("*** ERROR: problem in parsing the AFM File.\n"); X case ok: X fclose(fp); X printValues(); X freeStorage(); X break; X case earlyEOF: X printf("The AFM File ended prematurely.\n"); X break; X case storageProblem: X printf("*** ERROR: problem allocating storage.\n"); X break; X default: X break; X } X } /* main */ SHAR_EOF $shar_touch -am 1018085596 'parseAFMclient.c' && chmod 0644 'parseAFMclient.c' || $echo 'restore of' 'parseAFMclient.c' 'failed' shar_count="`wc -c < 'parseAFMclient.c'`" test 12210 -eq "$shar_count" || $echo 'parseAFMclient.c:' 'original size' '12210,' 'current size' "$shar_count" fi rm -fr _sh00599 exit 0 xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/configure.in0000664000175000017500000002047711742726712022037 0ustar uwabamiuwabamidnl Process this file with autoconf to produce a configure script. dnl dnl This file configure.in is part of the t1lib-package (V. 1.0). dnl dnl Author: Rainer Menzner (Rainer.Menzner@web.de) dnl Date: 06/25/1997 dnl Last Modified: 2007-12-21 dnl AC_REVISION([configure.in 1.00]) AC_INIT(lib/t1lib/t1base.c) AC_CONFIG_HEADER(lib/t1lib/sysconf.h:lib/t1lib/sysconf.h.in) AC_CONFIG_AUX_DIR(ac-tools) dnl We set CFLAGS in order to have complete control over compiler dnl switches during development dnl CFLAGS="$CFLAGS -g -Wall" dnl The following variables specify version information of the dnl library. Starting with V. 1.0.0 the libtool scheme is used dnl as intended by its authors. dnl dnl Note: The name of the shared library on Linux is build as dnl libt1.so.$(T1LIB_LT_CURRENT)-$(T1LIB_LT_AGE).$(T1LIB_LT_AGE).$(T1LIB_LT_REVISION) dnl Since I'm forgetful sometimes, I quote the libtool infopage here: dnl dnl 1. Start with version information of `0:0:0' for each libtool library. dnl dnl 2. Update the version information only immediately before a public dnl release of your software. More frequent updates are unnecessary, dnl and only guarantee that the current interface number gets larger dnl faster. dnl dnl 3. If the library source code has changed at all since the last dnl update, then increment REVISION (`C:R:A' becomes `C:r+1:A'). dnl dnl 4. If any interfaces have been added, removed, or changed since the dnl last update, increment CURRENT, and set REVISION to 0. dnl dnl 5. If any interfaces have been added since the last public release, dnl then increment AGE. dnl dnl 6. If any interfaces have been removed since the last public release, dnl then set AGE to 0. define( MACRO_T1LIB_LT_CURRENT, 6) define( MACRO_T1LIB_LT_REVISION, 2) define( MACRO_T1LIB_LT_AGE, 1) dnl ----------------------------------------------------------- dnl ----------------------------------------------------------- dnl dnl Do not change anything below this line! dnl dnl ----------------------------------------------------------- dnl ----------------------------------------------------------- dnl Build version string and setup stuff to be substituted in dnl Makefile's and t1lib.h define( MACRO_T1LIB_IDENTIFIER, "builtin(eval, MACRO_T1LIB_LT_CURRENT - MACRO_T1LIB_LT_AGE).builtin(eval, MACRO_T1LIB_LT_AGE).builtin(eval, MACRO_T1LIB_LT_REVISION)") T1LIB_LT_CURRENT=builtin(eval, MACRO_T1LIB_LT_CURRENT) T1LIB_LT_REVISION=builtin(eval, MACRO_T1LIB_LT_REVISION) T1LIB_LT_AGE=builtin(eval, MACRO_T1LIB_LT_AGE) T1LIB_IDENTIFIER=MACRO_T1LIB_IDENTIFIER T1LIB_VERSION=builtin(eval, MACRO_T1LIB_LT_CURRENT - MACRO_T1LIB_LT_AGE) T1LIB_REVISION=builtin(eval, MACRO_T1LIB_LT_AGE) T1LIB_PATCHLEVEL=builtin(eval, MACRO_T1LIB_LT_REVISION) T1LIB_VERSIONSTRING=\"MACRO_T1LIB_IDENTIFIER\" dnl We use this file by Andreas Zeller to check for libXaw builtin(include, ac-tools/ice_find_athena.m4) builtin(include, ac-tools/aclocal.m4) dnl We want these before the checks, so the checks can modify their values. test -z "$LDLIBS" && LDLIBS=-lm AC_SUBST(LDLIBS) test -z "$PROGEXT" && PROGEXT="" AC_SUBST(PROGEXT) test -z "$CFLAGS" AC_SUBST(CFLAGS) test -z "$LDFLAGS" AC_SUBST(LDFLAGS) T1LIB_DATA_DIR="${datadir}/t1lib" dnl The following variables should be used AC_SUBST(T1LIB_LT_CURRENT) AC_SUBST(T1LIB_LT_REVISION) AC_SUBST(T1LIB_LT_AGE) AC_SUBST(T1LIB_DATA_DIR) AC_SUBST(T1LIB_IDENTIFIER) AC_SUBST(MAIN_TARGET) AC_SUBST(MAIN_HEADER) AC_SUBST(OPTIONS) AC_SUBST(no_x) AC_SUBST(CC) AC_SUBST(T1_AA_TYPE16) AC_SUBST(T1_AA_TYPE32) AC_SUBST(T1_AA_TYPE64) AC_SUBST(T1_INT16) AC_SUBST(T1_INT32) AC_SUBST(XSUBDIRS) AC_SUBST(T1LIBX_OBJS) AC_SUBST(T1LIBX_SRCS) AC_SUBST(T1LIBX_HEADERS) AC_SUBST(XOBJS) AC_SUBST(T1LIB_VERSION) AC_SUBST(T1LIB_REVISION) AC_SUBST(T1LIB_PATCHLEVEL) AC_SUBST(T1LIB_VERSIONSTRING) dnl **** Check for some programs and libraries **** AC_PROG_MAKE_SET AC_PROG_CC AC_PROG_CPP AC_PATH_XTRA ICE_FIND_ATHENA AM_PROG_LIBTOOL AC_PROG_INSTALL dnl **** Check for some compiler/system characteristics AC_C_CHAR_UNSIGNED AC_CHECK_SIZEOF(char,0) AC_CHECK_SIZEOF(short,0) AC_CHECK_SIZEOF(int,0) AC_CHECK_SIZEOF(long,0) AC_CHECK_SIZEOF(long long,0) AC_CHECK_SIZEOF(float,0) AC_CHECK_SIZEOF(double,0) AC_CHECK_SIZEOF(long double,0) AC_CHECK_SIZEOF(void *,0) dnl **** Check for gcc strength-reduce bug **** if test "x${GCC}" = "xyes" then dnl We don'use CFLAGS="$CFLAGS" AC_CACHE_CHECK( "for gcc strength-reduce bug", ac_cv_c_gcc_strength_bug, AC_TRY_RUN([ int main(void) { static int Array[[3]]; unsigned int B = 3; int i; for(i=0; i conftest_asm.s < we do it by hand: if test "$no_x" = "yes" then CFLAGS="${CFLAGS} -DT1LIB_NO_X11_SUPPORT" MAKEFILES="Makefile \ lib/Makefile \ lib/type1/Makefile \ lib/t1lib/Makefile \ type1afm/Makefile \ examples/Makefile \ doc/Makefile" else MAKEFILES="Makefile \ lib/Makefile \ lib/type1/Makefile \ lib/t1lib/Makefile \ xglyph/Makefile \ type1afm/Makefile \ examples/Makefile \ doc/Makefile" fi AC_OUTPUT([ $MAKEFILES \ lib/t1lib/t1lib.h ]) echo echo "Configure finished!" echo " Do: 'make' to compile the t1lib-package." echo " Do: 'make without_doc' to compile if you do not have LaTeX." echo " Do: 'make install' to install the t1lib-package." echo "" dnl echo " Do: 'make t1python-all' to compile the t1python-package." dnl echo "" dnl Local Variables: dnl comment-start: "dnl " dnl comment-end: "" dnl comment-start-skip: "\\bdnl\\b\\s *" dnl compile-command: "autoconf" dnl End: xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2/Changes0000664000175000017500000006106511742726712021017 0ustar uwabamiuwabamiNov 1996: t1lib-0.1-alpha ------------------------- - first public release of t1lib with all basic functionality May 1997: t1lib-0.2-beta ------------------------- - Now uses autoconf to configure the software for the system. - All functions put into one library. - ATTENTION: Argument order for the glyph-setting functions changed to be consistent with the info functions. Programs that already use t1lib have to be rewritten (sorry....) - Function for computing the width of a string added (T1_GetStringWidth()). - Function for computing the BoundingBox of a string added (T1_GetStringBBox()). - Function T1_GetMetricsInfo() added. It returns a struct containing width, bounding box, number of characters and horizontal position of the characters in character space coordinates (afm-units). - Function T1_GetBBox() renamed to T1_GetCharBBox() for consistency reasons. - All exit() calls removed from library and replaced by appropriate error return codes. - t1lib now optionally supports a logfile for logging of error- and warning-messages at runtime. The "verbosity" of this logfile may be chosen by the user. - Documentation more complete. July 1997: t1lib-0.3-beta ------------------------- - Code for placing character bitmaps in T1_SetString() slightly advanced; the restrictions concerning slanted fonts are eliminated. - T1_GetStringBBox()/T1_GetCharBBox() extended. It is now possible to get the bounding box if the font is slanted. This is implemented by examining the characters outline at 1000bp. - Some Bugs in the code managing linked lists of font sizes have been corrected. - Bug in T1_CopyFont() has been corrected. This should work now. - The behavior during configuration file searching has been changed to be compatible to well known UNIX-conventions. - As the main new feature in this release t1lib now has direct support for X11 (optionally). There is a set of functions that act similar to XDrawText(), i.e. they draw directly into a drawable (pixmap or window). - Caching of bitmaps of the X11 rastering functions is also done in the X-Server for maximum performance (although it is not as fast as I dreamed of, admittedly). - X11 rastering functions use the current foreground/background colors - The X11 rastering functions implement automatical antialiasing between foreground and background color - The X11 rastering functions provide an opaque and a transparent mode - The X11 rastering functions can draw into drawable of any depth (provided the depth is large enough) - A new target has been added to the makefiles allowing to remove a t1lib-installation automatically from a system. December 1997: t1lib-0.4-beta ----------------------------- - Many memory allocation bugs fixed. t1lib is now "libefence-proved". - Kerning and Metrics-Lookup rewritten. The corresponding functions are now based on character indices rather than on character names which makes them up to 8 x faster than before, depeding on data and context. - Raph Levien (raph@acm.org) contributed a fast algorithm for subsampling which improves Antialiasing time significantly. - Fred L. Drake, Jr. (fdrake@acm.org) contributed a Python-interface to t1lib. This allows Python programmers to make use of Adobe Type 1 fonts. This package, called t1python, is distributed with t1lib in an independent subdirectory of the distribution. See README.t1python for more information on t1python. - Bitmaps and antialiased bitmaps may now be padded 8, 16 or 32 bits. This allows (with some restrictions) somewhat faster concatenation of characterbitmaps to stringbitmaps. The padding-value may be set and queried at runtime. - The optional X11-interface, introduced in t1lib-0.3-beta, has been reduced to a simple wrapper. X11-pixmap caching has been completely dropped since it has proven to be too inefficient. However, at the level of the function calls, nothing has changed. - Configuration of t1lib (with or without X11-interface) may be queried by applicationprogrammers at compiletime or by applications at runtime. - Two functions for informations on fonts have been added: 1) T1_GetFontBBox(): Return a fonts' bounding box. 2) T1_GetAllCharNames(): Return a list of all character defined in a Type 1 font. This might be of interest if somebody wants to set up new encodings. - Function T1_CloseLib() added. This function allows to completely free the data-structures of t1lib. T1_CloseLib() should be called in future when an application using t1lib exits. - Many other things not worth to be metioned ... March 1998: t1lib-0.5-beta -------------------------- - Changed the license to the GNU General Public Library License (LGPL) - Definition of INFINITY removed from lib/type1/[regions.c|regions.h|t1imager.h]. Collided with a definition in math.h on OS/2. - Implemented proper handling of environment variables CFLAGS, LDFLAGS and CC during build process. - Added target 'without_doc' for people who have a very rudimentary or no LaTeX-System at all - Fixed some bugs that appeared when font files from database were not found - Clipmask Bug in the X11-rastering functions fixed - Bugs in VM-reallocation (T1_LoadFont()) repeatedly fixed. It is now ANSI-C compliant. - Alignment of VM changed. This was needed on some systems. - Set of functions for accessing information from FontInfo dictionary is now complete. This introduces the new functions T1_GetFullName(), T1_GetFamilyName(), T1_GetWeight(), T1_GetItalicAngle(), T1_GetIsFixedPitch(), T1_GetVersion(), T1_GetNotice(). - ATTENTION: In the above context, T1_GetPostScriptName() has been renamed to T1_GetFontName() for consistency reasons, sorry. - ATTENTION: All types "unsigned char (*)" have been changed to char (*) in the API functions. This was necessary while adapting t1lib to ANSI-standard to make it portable. Sorry for this confusion. - New function T1_AddFont(): Fonts can now be added to the font database at runtime. This means especially, one can ignore a FontDataBase file thus can start t1lib-programs on single fontfiles without doing a complete setup before. - There is now also the possibility to ignore the currently active configuration file, thereby setting all search paths to the current working directory and having an empty font data base. This is meant for small applications that work on single files. - t1lib is now able to work with fonts without corresponding afm-files. AFM-information can be produced from pfa- and pfb-files. This, of course, refers only to character-metrics information. - A function T1_WriteAFMFallbackFile() is provided which allows to dump metrics information to a valid AFM-file. - New subdirectory type1afm created which contains type1afm, a program to extract afm files from Type 1 font files. - Renamed definitions MAX, MIN, ABS, TRUE and FALSE because they collided with system header files on some systems. - Corrected antialiasing functions. The metrics should now be as correct as possible and black pixel at the right edge of the bitmaps should not appear any more. - Handling of unencoded characters in strings (such as adieresis in AdobeStandardEncoding) is now consistent in rotated and non-rotated glyphs. - A few functions have been added to get information on the file search environment and to manipulate the search paths from within applications. - Mixed endian setups (i.e., client and X-server on different machines with different endianess) should now be handled correctly. - In summary t1lib should now be much more portable than before. - Update to t1python-0.3 March 1998: t1lib-0.6-beta -------------------------- - Cleaned up the sources in type1-directory - Functions Xalloc() and Xfree removed. x11dummy.c from list of source files removed. - A few bugs fixed - Character positioning rewritten. It does now handle strings correctly in which the leftmost pixels does not belong to the first character and the rightmost pixels do not belong to the last character. - t1lib now substitutes .notdef for defined character names that have no corresponding charstring. This is a workaround for some fonts in the ghostscript distribution (e.g., s050000l.pfb) - Separated the X11-wrapper from the rest of t1-stuff. t1lib now consists of two libraries and two include files. - Cleaned up configuration and compilation process. May 1998: t1lib-0.7-beta ------------------------ - Athena libraries are explicitly located for non-standard system - glyph-structure changed. glyph.metrics.characterWidth is replaced glyph.metrics.advanceX and an entry glyph.metrics.advanceY is added. - Interpretation of the sign of glyph.metrics.descent has changed. - String-rastering functions now support Underlining, Overlining and Overstriking. - Functions for overriding default line-parameters implemented. - Whitespace at beginning and ending of glyphs is now correctly recorded into leftSideBearing and RightSideBearing. - Function T1_ConcatGlyphs() added to API. It concatenates two glyphs of identical depth with an optional displacement inserted. - xglyph output window has changed for X-rastering functions. It is now of constant size with the logical origin in the center. Too large glyphs are simply clipped. - t1lib can be compiled and run on VMS thanks to John Hasstedt (John.Hasstedt@sunysb.edu). A configure.com script for building on VMS is included in the toplevel directory. - T1_GetMetricsInfo() and T1_GetStringBBox() fixed. Now results are correct also if the leftmost pixel in a glyph doesn't belong to the first char and if the rightmost pixel does not belong to the last character. - Leading and trailing white space in glyphs should now be recorded consistently and correctly for all rastering functions. - xglyph can now display a character map of a font. - Global variable T1_errno introduced. It basically works the same way as the errno in libc. This allows applications a unified error-handling. - Update to t1python-0.7. November 1998: t1lib-0.8-beta ----------------------------- - T1_GetAllCharNames() returned invalid list if the Charstrings dictionary was larger than the actual number of charstrings defined (which is perfectly valid, even if it does not make much sense) --> fixed. - 4 x Antialiasing implemented. This can improve the quality at small sizes once more, at the cost of some computational and memory requirement. It is possible to work with 2 x and 4 x concurrently. - Function T1_GetLibIdent() added to API. - Function T1_SetRasterFlags() added to API. It allows to selectively enable or disable certain rasterizer features like, e.g., hinting. - xglyph extended to support 4 x antialiasing. - xglyph now recognizes a few commandline options, primarily intended for debugging purposes. - xglyph is now somewhat more intelligent (and faster) if slanting, extending or reencoding is applied to a font. - New function T1_SetDefaultEncoding(). It allows to set a default encoding vector which then is applied to all subsequently loaded fonts that have StandardEncoding. - Bug in Type 1 rasterizer corrected which prevented fonts with non-standard lenIV values from being correctly decrypted (Charstring decryption). - Internal ISOLatin1Encoding removed from rasterizer since there's no reason for mainting this encoding scheme internally - tlib now has notion of "Encoding Schemes". The format of encoding files is extended correspondingly and is backward compatible. - Memory leaks eliminated, thanks to David Huggins-Daines. - Some slight performance improvements. - Kerning performance improved. Moreover, kerning pairs need no longer be alphabetically sorted. - AFM-parser modified to work with DOS-style AFM-files. - Some bugs in scan-code of Type 1 rasterizer corrected. Scanner is now aware of pfb-blocks and can scan files with multiple binary data segments. - t1lib now uses GNU-libtool, thanks to Hirotsugo Kakugawa (h.kakugawa@computer.org) - An encoding file for IsoLatin2 charset is included thanks to Jiri Pavlovsky (jirap@bajt.cz). - The angle-argument of the rastering functions has been replaced by a more general transformation specification. This is an incompatible change to previous versions, but I think it should be worth it. - t1lib can now handle fontfile names with arbitrary extensions and even without extension. - t1lib compiles and runs under Win32 using the cygwin32 toolkit. - Maximum number of stem-hints enlarged (-> 256) because 128 were not enough for complicated fonts. May 1999: t1lib-0.9 ------------------- - Sub-Pixel positioning for Antialiasing functions enthanced (It was in fact not correct before. - Multiple Master fonts are rejected instead of SIGSEGV (nearly as professional as supporting them ;) - An additional set of functions allows access, filling and manipulation of outlines. - Functionality for non-antialiased "bytemaps". - "Smart Antialiasing", allows to automatically let t1lib decide what AA-level to use. The switchlimits are adjustable. - An AFM-filename may explicitly be specified. This suppresses t1lib´s search for these files. This allows interfacing with other path search systems like kpathsea. This was suggested by Nicolai Langfeldt (janl@math.uio.no). - Some problems with aspect ratios different from 1 and transformed glyphs fixed. - Support for Right-To-Left typesetting. This might be experimental because I don't know the rules for this exactly. - In the context of Right-To-Left typesetting T1_ConcatGlyphs() expects one additional argument "mode". ATTENTION: This is an incompatible change with respect to V. 0.8. - abort()-calls in type1-sources are caught by longjmp(). t1lib does not any longer exit a program. Rather, errors may be handled by the user. - If a rastering operation did not produce any black pixels, the rastering fuctions do not return a NULL-glyph any longer. Rather, a glyph with the correct metrics and NULL-bitmap pointer is returned. This seems to come closer to accepted standards. - The t1python-package is currently not distributed with t1lib because the interface is not up to date. - A lot of bugs fixed (and a lot of others introduced, of course :) June 1999: t1lib-0.9.1 --------------------- - Several Bug-fixes, some functions that have been reported to be missing by users, but no general new features. - New functions T1_GetExtend(), T1_GetSlant() and T1_GetTransform() which give access to currently active values of fontlevel transformations - New function T1_GetNoKernPairs() which gives access to the number of defined kerningpairs. - New functions to query the grayvalue settings (T1_AAGetGrayValues(), T1_AAHGetGrayValues() and T1_AANGetGrayValues()) - Arbitrary linear transformations on fontlevel including caching using T1_TransformFont() (on suggestion and patches by Derek B. Noonburg, (derekn@foolabs.com) - Introduction of the initialization flag T1_NO_AFM which suppresses use of AFM data. This limits the functionality of t1lib considerably but applications that do not need those advanced functions can gain some performance boost while loading fonts because AFM files are not parsed and the mapping tables are not setup (also by Derek B. Noonburg) - xglyph clips output window for the function fonttable() to the physical screen size. This is to prevent from freezing or exceeding resources if the fonttable button had accidentally been pressed while a large size was active. - The utility function T1_DumpPixmap() removed from API. New function T1_XImageFromGlyph() added to X11 interface. This function allows, together with the Xpm-library function XpmWriteFileFromImage(), to write xpm-files from glyphs of arbitrary depths, colors, etc ... - Functions T1_CopyOutline() and T1_FreeOutline() added to the outline interface. - Fixed alignment problem on 64bit architecture. September 1999: t1lib-0.9.2: ---------------------------- - Support for EMX-environments under MSDOS. This concerns the file locating routines. - t1lib now allows for charstring code 15 and escape code 15 by ignoring these. They may appear in some old Adobe fonts. - Makefiles are more independent of GNU make. - Finally, undefined/missing characters are handled consistent in all rastering functions by substituting .notdef. - Several bug-fixes November 1999: t1lib-1.0: ------------------------- - Bug-fixes. - There happen to exist different assumptions about what exactly ISOLatin1Encoding is. Especially the name for char 45 (dec) is not uniquely specified in ISO 8859-1. Thus t1lib provides two encoding files ISOLatin1Encoding one which (PSLatin1.enc) is compatible with PostScript Level 2 and above. March 2000: t1lib-1.0.1: ------------------------- - A few bug Fixes. - lenIV=-1 is now handled. According to an undocumented Adobe convention lenIV=-1 indicates suppressing of charstring encryption. - Patches to compile t1lib und MS Visual C++ 6.0. In case something goes wrong, please contact Nakano Hideo (hideo@mb.infoeddy.ne.jp). February 2001: t1lib-1.1.0: --------------------------- - Bug Fixes. - Functions T1_GetFontFilePath() and T1_GetAfmFilePath() which return the complete path of the files used by t1lib. - Fixed parser code which previously failed on ASCII-encrypted files in which the hex-lines were separated by instead of by (Yes, there such DOSian files out there ...). - Multiple inclusion protection for t1lib.h - T1_QueryLigs() fixed. It did not work correct if successors and/or ligatures were not in the current encoding. - New patches for VMS by Martin P. J. Zinser (zinser@decus.de). - Patch by Sergey Babkin (babkin@bellatlantic.net) to correct the rasterizer to respect StdStemWidths. - General support for font subsetting. - Dokumentation also provided as pdf for those people who do not have LaTeX installed. This is due to suggestions and patches by Nguyen-Dai Quy (NDQ@iris.ltas.ulg.ac.be). April 2001: t1lib-1.1.1: ------------------------ - Update to libtool-1.3.5. - T1_GetFontBBox() also accepts specification consisting of floating point numbers (as suggested by Derek B. Noonburg (derekn@foolabs.com)). - Within the near future the t1lib-webpage will be no longer available because I will change my employer. - Similarly, the sources will be distributed from sunsite only from then on. - The Author's eMail-address will also become invalid in the near future. The new and hopefully permanent eMail.address will be "Rainer.Menzner@web.de". July 2001: t1lib-1.2: ---------------------- - Fixed bug in subsetting code. - Fixed bug in AFM-parser code. - Fixed kerning mapping code. Kerning did not work correctly for characters that appeared multiple times in an encoding vector. - In the same context a new function, T1_GetEncodingIndices() has been added to the API. It returns an array of indices (by contrast, T1_GetEncodingIndex() returns only the lowest index found). - Support for composite characters. - Additional support for dvips encoding files (thanks to suggestion and contribution by Nicolai Langfeldt (janl@linpro.no). - Documentation is installed in PostScript and PDF format, but no longer in DVI format. October 2001: t1lib-1.3: ------------------------ - *Really* an update to libtool-1.3.5 - Global Font Metrics Information is loaded from AFM files in order to be able to read the typographic ascender. Line ruling did not behave as documented. However, problems could still exist because the typographic ascender specification is optional in AFMs. - Reorganized search path handling and, in particular, the respective documentation is more detailed. - The configuration file now allows multiple lines of one type of search path specification and it is also possible to quote path specification in order to specify paths that contains special characters like spaces, colons, etc. - Multiple font databases are supported. - T1_PrintLog() extended to accept a variable argument list. - The environment variable T1LIB_LOGMODE is evaluated to give the user the chance to specify a loglevel and hence to detect t1lib-problems even if the application programmer did not enable the log file features. - Further bug fixes November 2001: t1lib-1.3.1: --------------------------- - Color problem in t1x11-module fixed. - Fixes in AFM parser. Among others, Version had been read as name, instead of as string. This led to a failure to scan global font info for some standard AFMs. - Fixes in of OpenVMS special code - Further Fixes January 2003: t1lib-5.0.0: -------------------------- - Forced PostScript target in the doc directory to file. - Subsetting code extended in order to ensure that components of composite characters are also part of the subset. - Hinting meachanism reworked in order to get rid of some rasterizing artifacts. - Experimental support for stroked fonts (PaintType=1) - Experimental support for stroking standard ATM fonts with PaintType=0. - For historical reasons, there happened to exist a few documented API functions that did not adhere to the T1_... naming convention. After considering the pro's and con's, I have decided to cleanup the interface, thus making this version incompatible to the previous version. Especially in the type1 subdirectory there are still a lot of global symbols, but at least these are not part of the documented API. The following functions are affected: CheckForInit() --> T1_CheckForInit() CheckForFontID() --> T1_CheckForFontID() T1_Get_no_fonts() --> T1_GetNoFonts() Furthermore, I have removed and made static a few functions which accidentally had found their way into t1lib.h, but which had not been part of the documented API. I'm sorry if this causes inconveniences ... - The new version, 5.0.0, follows as consequence from the issues discussed above. It is defined by the libtool quantities CURRENT, REVISION and AGE. - Functions for drawing rectangles. - Bug Fixes - Please also have a look at the topic "Future" in README.t1lib-5.0.0. February 2004: t1lib-5.0.1: --------------------------- - Support for Flex was not adapted to the changes from 5.0.0. This led to rasterization errors in fonts that use the Flex functionality --> fixed. - Bug Fixes April 2004: t1lib-5.0.2: ------------------------ - Changes not updated for this version Mai 2005: t1lib-5.1.0: ---------------------- - Check against MultipleMasterFonts somewhat more tolerant, so that Type 1 Fonts automatically created from Multiple Master Fonts (e.g. using Mmpfb) should now be acceptable. - The configure-machinery had been somewhat out of date and has been updated. The distributed configure script has been generated by AutoConf 2.59 and the redistributed libtool parts are taken from GNU libtool 1.5.10. - Top-Level TeX-file in the doc subdirectory adapted to recent TeX systems' requirements. - Added IsoLatin9.enc to distribution. - Subsetting extended so that it works for SEAC-constructed composites even if no AFM composite character information is available - Somewhat more intelligent defaults for subsetting when composite characters are included in the subset. - Reallocation had been broken by relocation of internal StandardEncoding vector. This problem turned out on systems where realloc() actually returned a different pointer. - Fix for outline code on 64bit systems. This involves a redefinition of the T1_PATHPOINT struct. This should be uncritical because for 32bit systems there is no difference, whereas on 64bit systems, this has never worked correctly before. - DESTDIR support in Makefile.in by Volker Zell - Support for XLFD font database format (in which the fonts' names appear in the first place on a line). - Further Bug Fixes December 2006: t1lib-5.1.1: --------------------------- - DESTDIR support was missing and has been addded in install-target for type1afm. - A bug fix in Anti-Aliasing subsampling code, which could make t1lib crash under certain conditions. - Small number of further fixes, in particular with respect to the build mechanism. December 2007: t1lib-5.1.2: --------------------------- - Small number of fixes reported by users. The fixes pertain to a vulnerability issue, memory access issues. - More decent handling if Encoding and / or FontBBox specification are missing (which is invalid with respect to the specification, but recoverablel). xdvik-ja-22.84.16-j1.40/libs/t1lib/ChangeLog0000664000175000017500000000260211742726712017612 0ustar uwabamiuwabami2011-07-19 Peter Breitenlohner * configure.ac: Use KPSE_COMPILER_WARNINGS. * Makefile.am [AM_CFLAGS]: Prepare for WARNING_CFLAGS. 2011-07-15 Peter Breitenlohner * version.ac: New file defining the t1lib version. * configure.ac: Adapt. Drop useless AC_HEADER_STAT. 2010-05-19 Peter Breitenlohner * Makefile.am: Do not compile lib/type1/bstring.c. 2010-02-27 Peter Breitenlohner * Makefile.am: List all t1lib source files. 2009-12-18 Peter Breitenlohner * configure.ac: Exchange role of t1lib.h and lib/t1lib/t1lib.h to work around an Autoconf bug when srcdir as an absolute path. Bug reported by Nikola Lecic . 2009-12-11 Peter Breitenlohner * configure.ac: Check if libm is required for sqrt(). * type1afm.test: Avoid GNU-ism (sed -e EXPR FILE). Reported by Nikola Lecic . 2009-02-05 Peter Breitenlohner Adapt to TL2009 build system. Add a test case for 'make check'. 2008-01-31 Peter Breitenlohner Convert from autoconf-2.13 to autoconf-2.59+: * t1lib.ac: Fixed a typo (that was ignored by autoconf-2.13). * Makefile.in: Add @configure_input@ line. * aclocal.m4 (new): Generated (aclocal -I ../../texk/m4). * configure: Regenerated (autoconf). xdvik-ja-22.84.16-j1.40/libs/t1lib/ac/0000775000175000017500000000000011742726712016423 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/ac/t1lib.ac0000664000175000017500000000060411742726712017743 0ustar uwabamiuwabami## libs/t1lib/ac/t1lib.ac: configure.ac fragment for the TeX Live subdirectory libs/t1lib/ dnl dnl Copyright (C) 2009 Peter Breitenlohner dnl You may freely use, modify and/or distribute this file. dnl ## basic check of system t1lib KPSE_TRY_LIB([t1lib], [#include ], [T1_InitLib(NO_LOGFILE); T1_CheckForInit(); T1_AddFont("font");]) xdvik-ja-22.84.16-j1.40/libs/t1lib/ac/withenable.ac0000664000175000017500000000046211742726712021054 0ustar uwabamiuwabami## libs/t1lib/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/t1lib/ dnl dnl Copyright (C) 2009 Peter Breitenlohner dnl You may freely use, modify and/or distribute this file. dnl ## configure options and TL libraries required for t1lib KPSE_WITH_LIB([t1lib]) xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2-PATCHES/0000775000175000017500000000000011742726712020601 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2-PATCHES/patch-01-buffer-limit0000664000175000017500000000216411742726712024427 0ustar uwabamiuwabamidiff -ur t1lib-5.1.2.orig/lib/t1lib/parseAFM.c t1lib-5.1.2/lib/t1lib/parseAFM.c --- t1lib-5.1.2.orig/lib/t1lib/parseAFM.c 2007-12-23 16:49:42.000000000 +0100 +++ t1lib-5.1.2/lib/t1lib/parseAFM.c 2011-04-13 20:48:00.000000000 +0200 @@ -179,6 +179,8 @@ /*************************** PARSING ROUTINES **************/ +#define MAX_NAME_1 MAX_NAME-1 /* check for buffer overflow */ + /*************************** token *************************/ /* A "AFM File Conventions" tokenizer. That means that it will @@ -198,7 +200,8 @@ idx = 0; - while (ch != EOF && ch != ' ' && ch != CR && ch != LF && + while (idx < MAX_NAME_1 && + ch != EOF && ch != ' ' && ch != CR && ch != LF && ch != CTRL_Z && ch != '\t' && ch != ':' && ch != ';'){ ident[idx++] = ch; ch = fgetc(stream); @@ -235,7 +238,7 @@ while ((ch = fgetc(stream)) == ' ' || ch == '\t' ); idx = 0; - while (ch != EOF && ch != CR && ch != LF && ch != CTRL_Z) + while (idx < MAX_NAME_1 && ch != EOF && ch != CR && ch != LF && ch != CTRL_Z) { ident[idx++] = ch; ch = fgetc(stream); xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2-PATCHES/TL-Changes0000664000175000017500000000043611742726712022414 0ustar uwabamiuwabamiChanges applied to the t1lib-5.1.2/ tree as obtained from: ftp://sunsite.unc.edu/pub/Linux/libs/graphics/t1lib-5.1.2.tar.gz Removed: ac-tools/aclocal.m4 ac-tools/config.guess ac-tools/config.sub ac-tools/install-sh ac-tools/ltmain.sh ac-tools/mkinstalldirs lib/t1lib/t1lib.h xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2-PATCHES/patch-02-ambiguous0000664000175000017500000000101211742726712024025 0ustar uwabamiuwabamidiff -ur t1lib-5.1.2.orig/lib/type1/type1.c t1lib-5.1.2/lib/type1/type1.c --- t1lib-5.1.2.orig/lib/type1/type1.c 2007-12-23 16:49:42.000000000 +0100 +++ t1lib-5.1.2/lib/type1/type1.c 2011-07-19 21:34:40.000000000 +0200 @@ -843,11 +843,11 @@ if (stemtop >= alignmentzones[i].bottomy + blues->BlueShift){ enforceovershoot = TRUE; } + } else if (stembottom <= alignmentzones[i].topy - blues->BlueShift){ enforceovershoot = TRUE; } - } } xdvik-ja-22.84.16-j1.40/libs/t1lib/t1lib-5.1.2-PATCHES/ChangeLog0000664000175000017500000000056311742726712022357 0ustar uwabamiuwabami2011-04-19 Peter Breitenlohner * patch-02-ambiguous (new): Fix braces added to avoid `ambiguous else' warning (compare libXfont 1.3.x from XOrg-7.4). 2011-04-14 Peter Breitenlohner * patch-01-buffer-limit (new): Avoid buffer overflow in lib/t1lib/parseAFM.c token() and linetoken(). http://secunia.com/advisories/43491/ xdvik-ja-22.84.16-j1.40/libs/t1lib/l047016t.xafm0000664000175000017500000005407611742726712020032 0ustar uwabamiuwabamiStartFontMetrics 4.0 Comment This is ./x047016t.afm created from ./x047016t.pfa by t1lib V. 5.1.2. Comment t1lib is copyright (c) Rainer Menzner, 1996-2001. Comment t1lib is distributed under the GNU General Public Library License (LGPL) FontName LuxiMono-Bold FullName Luxi Mono Bold FamilyName Luxi Mono Weight Bold ItalicAngle 0 IsFixedPitch true FontBBox 0 -211 714 1012 UnderlinePosition -88 UnderlineThickness 83 Version 1.1000 Notice Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. EncodingScheme FontSpecific CapHeight 723 XHeight 530 StdHW 84 StdVW 146 StartCharMetrics 309 C 32 ; WX 600 ; N space ; B 0 0 0 0 ; C 33 ; WX 600 ; N exclam ; B 228 0 373 723 ; C 34 ; WX 600 ; N quotedbl ; B 95 506 505 771 ; C 35 ; WX 600 ; N numbersign ; B 24 0 576 723 ; C 36 ; WX 600 ; N dollar ; B 53 -96 519 819 ; C 37 ; WX 600 ; N percent ; B 0 -18 601 741 ; C 38 ; WX 600 ; N ampersand ; B 22 -18 590 741 ; C 39 ; WX 600 ; N quotesingle ; B 216 470 384 771 ; C 40 ; WX 600 ; N parenleft ; B 94 -145 504 771 ; C 41 ; WX 600 ; N parenright ; B 96 -145 506 771 ; C 42 ; WX 600 ; N asterisk ; B 75 289 525 723 ; C 43 ; WX 600 ; N plus ; B 48 49 552 553 ; C 44 ; WX 600 ; N comma ; B 216 -169 384 168 ; C 45 ; WX 600 ; N hyphen ; B 72 253 528 350 ; C 46 ; WX 600 ; N period ; B 216 0 384 168 ; C 47 ; WX 600 ; N slash ; B 0 -145 600 771 ; C 48 ; WX 600 ; N zero ; B 42 -18 558 741 ; C 49 ; WX 600 ; N one ; B 72 0 551 735 ; C 50 ; WX 600 ; N two ; B 92 0 509 742 ; C 51 ; WX 600 ; N three ; B 84 -18 533 741 ; C 52 ; WX 600 ; N four ; B 35 0 559 732 ; C 53 ; WX 600 ; N five ; B 114 -18 533 723 ; C 54 ; WX 600 ; N six ; B 52 -18 560 741 ; C 55 ; WX 600 ; N seven ; B 63 0 537 723 ; C 56 ; WX 600 ; N eight ; B 46 -18 555 741 ; C 57 ; WX 600 ; N nine ; B 40 -18 548 741 ; C 58 ; WX 600 ; N colon ; B 216 0 384 530 ; C 59 ; WX 600 ; N semicolon ; B 216 -169 384 530 ; C 60 ; WX 600 ; N less ; B 48 0 551 603 ; C 61 ; WX 600 ; N equal ; B 50 150 550 452 ; C 62 ; WX 600 ; N greater ; B 48 0 551 603 ; C 63 ; WX 600 ; N question ; B 62 0 542 741 ; C 64 ; WX 600 ; N at ; B 22 -18 594 742 ; C 65 ; WX 600 ; N A ; B 12 0 588 723 ; C 66 ; WX 600 ; N B ; B 18 0 566 723 ; C 67 ; WX 600 ; N C ; B 24 -18 577 741 ; C 68 ; WX 600 ; N D ; B 18 0 576 723 ; C 69 ; WX 600 ; N E ; B 18 0 572 723 ; C 70 ; WX 600 ; N F ; B 18 0 566 723 ; C 71 ; WX 600 ; N G ; B 24 -18 571 741 ; C 72 ; WX 600 ; N H ; B 18 0 582 723 ; C 73 ; WX 600 ; N I ; B 60 0 539 723 ; C 74 ; WX 600 ; N J ; B 54 -18 578 723 ; C 75 ; WX 600 ; N K ; B 18 0 600 723 ; C 76 ; WX 600 ; N L ; B 24 0 576 723 ; C 77 ; WX 600 ; N M ; B 6 0 594 723 ; C 78 ; WX 600 ; N N ; B 18 0 594 723 ; C 79 ; WX 600 ; N O ; B 24 -18 576 741 ; C 80 ; WX 600 ; N P ; B 18 0 585 723 ; C 81 ; WX 600 ; N Q ; B 24 -178 598 741 ; C 82 ; WX 600 ; N R ; B 18 0 594 723 ; C 83 ; WX 600 ; N S ; B 55 -18 547 742 ; C 84 ; WX 600 ; N T ; B 23 0 577 723 ; C 85 ; WX 600 ; N U ; B 10 -18 590 723 ; C 86 ; WX 600 ; N V ; B 6 0 594 723 ; C 87 ; WX 600 ; N W ; B 6 0 594 723 ; C 88 ; WX 600 ; N X ; B 6 0 594 723 ; C 89 ; WX 600 ; N Y ; B 7 0 594 723 ; C 90 ; WX 600 ; N Z ; B 54 0 546 723 ; C 91 ; WX 600 ; N bracketleft ; B 168 -145 505 771 ; C 92 ; WX 600 ; N backslash ; B 0 -145 600 771 ; C 93 ; WX 600 ; N bracketright ; B 94 -145 431 771 ; C 94 ; WX 600 ; N asciicircum ; B 71 265 529 723 ; C 95 ; WX 600 ; N underscore ; B 0 -96 600 0 ; C 96 ; WX 600 ; N grave ; B 180 626 421 783 ; C 97 ; WX 600 ; N a ; B 42 -12 576 542 ; C 98 ; WX 600 ; N b ; B 18 -12 570 771 ; C 99 ; WX 600 ; N c ; B 30 -12 576 542 ; C 100 ; WX 600 ; N d ; B 30 -12 582 771 ; C 101 ; WX 600 ; N e ; B 30 -12 570 542 ; C 102 ; WX 600 ; N f ; B 59 0 600 784 ; C 103 ; WX 600 ; N g ; B 45 -205 591 542 ; C 104 ; WX 600 ; N h ; B 18 0 585 771 ; C 105 ; WX 600 ; N i ; B 68 0 574 771 ; C 106 ; WX 600 ; N j ; B 39 -205 467 771 ; C 107 ; WX 600 ; N k ; B 18 0 582 771 ; C 108 ; WX 600 ; N l ; B 68 0 574 771 ; C 109 ; WX 600 ; N m ; B 12 0 591 542 ; C 110 ; WX 600 ; N n ; B 18 0 585 542 ; C 111 ; WX 600 ; N o ; B 30 -12 570 542 ; C 112 ; WX 600 ; N p ; B 18 -193 570 542 ; C 113 ; WX 600 ; N q ; B 30 -193 594 542 ; C 114 ; WX 600 ; N r ; B 27 0 573 542 ; C 115 ; WX 600 ; N s ; B 82 -12 532 542 ; C 116 ; WX 600 ; N t ; B 36 -12 530 650 ; C 117 ; WX 600 ; N u ; B 15 -12 582 530 ; C 118 ; WX 600 ; N v ; B 6 0 594 530 ; C 119 ; WX 600 ; N w ; B 6 0 594 530 ; C 120 ; WX 600 ; N x ; B 12 0 588 530 ; C 121 ; WX 600 ; N y ; B 6 -193 594 530 ; C 122 ; WX 600 ; N z ; B 72 0 528 530 ; C 123 ; WX 600 ; N braceleft ; B 71 -145 511 771 ; C 124 ; WX 600 ; N bar ; B 252 -145 348 771 ; C 125 ; WX 600 ; N braceright ; B 89 -145 529 771 ; C 126 ; WX 600 ; N asciitilde ; B 51 203 549 405 ; C 128 ; WX 600 ; N Euro ; B 12 -18 576 742 ; C 130 ; WX 653 ; N quotesinglbase ; B 250 -145 418 168 ; C 131 ; WX 600 ; N florin ; B 42 -145 558 741 ; C 132 ; WX 653 ; N quotedblbase ; B 152 -144 562 145 ; C 133 ; WX 600 ; N ellipsis ; B 40 0 561 121 ; C 134 ; WX 600 ; N dagger ; B 83 -145 517 723 ; C 135 ; WX 653 ; N daggerdbl ; B 131 -145 565 723 ; C 136 ; WX 600 ; N circumflex ; B 129 626 472 783 ; C 137 ; WX 653 ; N perthousand ; B 9 -18 714 741 ; C 138 ; WX 600 ; N Scaron ; B 55 -18 547 940 ; C 139 ; WX 600 ; N guilsinglleft ; B 132 55 458 476 ; C 140 ; WX 600 ; N OE ; B 12 -18 585 741 ; C 145 ; WX 600 ; N quoteleft ; B 216 458 384 771 ; C 146 ; WX 600 ; N quoteright ; B 216 457 384 771 ; C 147 ; WX 600 ; N quotedblleft ; B 95 482 505 771 ; C 148 ; WX 600 ; N quotedblright ; B 95 482 505 771 ; C 149 ; WX 600 ; N bullet ; B 165 277 436 548 ; C 150 ; WX 600 ; N endash ; B 59 260 541 332 ; C 151 ; WX 600 ; N emdash ; B 0 260 600 332 ; C 152 ; WX 600 ; N tilde ; B 128 626 471 783 ; C 153 ; WX 600 ; N trademark ; B 24 361 582 723 ; C 154 ; WX 600 ; N scaron ; B 82 -12 532 783 ; C 155 ; WX 600 ; N guilsinglright ; B 141 55 467 476 ; C 156 ; WX 600 ; N oe ; B 16 -12 576 542 ; C 159 ; WX 600 ; N Ydieresis ; B 7 0 594 892 ; C 160 ; WX 600 ; N nbspace ; B 0 0 0 0 ; C 161 ; WX 600 ; N exclamdown ; B 228 -193 373 530 ; C 162 ; WX 600 ; N cent ; B 62 -18 540 741 ; C 163 ; WX 600 ; N sterling ; B 58 0 540 741 ; C 164 ; WX 600 ; N currency ; B 15 76 586 647 ; C 165 ; WX 600 ; N yen ; B 9 0 591 723 ; C 166 ; WX 600 ; N brokenbar ; B 252 -145 348 771 ; C 167 ; WX 600 ; N section ; B 65 -157 536 741 ; C 168 ; WX 600 ; N dieresis ; B 137 627 462 735 ; C 169 ; WX 600 ; N copyright ; B 30 -18 570 741 ; C 170 ; WX 600 ; N ordfeminine ; B 75 350 545 742 ; C 171 ; WX 600 ; N guillemotleft ; B 36 48 564 482 ; C 172 ; WX 600 ; N logicalnot ; B 42 96 545 350 ; C 173 ; WX 600 ; N sfthyphen ; B 72 253 528 350 ; C 174 ; WX 600 ; N registered ; B 30 -18 570 741 ; C 176 ; WX 600 ; N degree ; B 155 494 444 783 ; C 177 ; WX 600 ; N plusminus ; B 59 0 541 590 ; C 178 ; WX 600 ; N twosuperior ; B 115 356 486 742 ; C 179 ; WX 600 ; N threesuperior ; B 119 350 482 742 ; C 180 ; WX 600 ; N acute ; B 180 626 421 783 ; C 181 ; WX 600 ; N mu ; B 18 -193 585 530 ; C 182 ; WX 600 ; N paragraph ; B 43 -145 492 729 ; C 184 ; WX 600 ; N cedilla ; B 193 -211 406 0 ; C 185 ; WX 600 ; N onesuperior ; B 157 356 497 741 ; C 186 ; WX 600 ; N ordmasculine ; B 77 350 523 741 ; C 187 ; WX 600 ; N guillemotright ; B 36 48 564 482 ; C 188 ; WX 600 ; N onequarter ; B 14 -18 580 741 ; C 189 ; WX 600 ; N onehalf ; B 9 -18 584 741 ; C 190 ; WX 600 ; N threequarters ; B 15 -18 581 742 ; C 191 ; WX 600 ; N questiondown ; B 53 -211 533 530 ; C 192 ; WX 600 ; N Agrave ; B 12 0 588 940 ; C 193 ; WX 600 ; N Aacute ; B 12 0 588 940 ; C 194 ; WX 600 ; N Acircumflex ; B 12 0 588 940 ; C 195 ; WX 600 ; N Atilde ; B 12 0 588 940 ; C 196 ; WX 600 ; N Adieresis ; B 12 0 588 892 ; C 197 ; WX 600 ; N Aring ; B 12 0 588 953 ; C 198 ; WX 600 ; N AE ; B 6 0 582 723 ; C 199 ; WX 600 ; N Ccedilla ; B 24 -211 577 741 ; C 200 ; WX 600 ; N Egrave ; B 18 0 572 940 ; C 201 ; WX 600 ; N Eacute ; B 18 0 572 940 ; C 202 ; WX 600 ; N Ecircumflex ; B 18 0 572 940 ; C 203 ; WX 600 ; N Edieresis ; B 18 0 572 892 ; C 204 ; WX 600 ; N Igrave ; B 60 0 539 940 ; C 205 ; WX 600 ; N Iacute ; B 60 0 539 940 ; C 206 ; WX 600 ; N Icircumflex ; B 60 0 539 940 ; C 207 ; WX 600 ; N Idieresis ; B 60 0 539 892 ; C 208 ; WX 600 ; N Eth ; B 0 0 577 723 ; C 209 ; WX 600 ; N Ntilde ; B 18 0 594 940 ; C 210 ; WX 600 ; N Ograve ; B 24 -18 576 940 ; C 211 ; WX 600 ; N Oacute ; B 24 -18 576 940 ; C 212 ; WX 600 ; N Ocircumflex ; B 24 -18 576 940 ; C 213 ; WX 600 ; N Otilde ; B 24 -18 576 940 ; C 214 ; WX 600 ; N Odieresis ; B 24 -18 576 892 ; C 215 ; WX 600 ; N multiply ; B 61 59 538 536 ; C 216 ; WX 600 ; N Oslash ; B 24 -18 576 741 ; C 217 ; WX 600 ; N Ugrave ; B 10 -18 590 940 ; C 218 ; WX 600 ; N Uacute ; B 10 -18 590 940 ; C 219 ; WX 600 ; N Ucircumflex ; B 10 -18 590 940 ; C 220 ; WX 600 ; N Udieresis ; B 10 -18 590 892 ; C 221 ; WX 600 ; N Yacute ; B 7 0 594 940 ; C 222 ; WX 600 ; N Thorn ; B 18 0 584 723 ; C 223 ; WX 600 ; N germandbls ; B 21 -12 591 784 ; C 224 ; WX 600 ; N agrave ; B 42 -12 576 783 ; C 225 ; WX 600 ; N aacute ; B 42 -12 576 783 ; C 226 ; WX 600 ; N acircumflex ; B 42 -12 576 783 ; C 227 ; WX 600 ; N atilde ; B 42 -12 576 783 ; C 228 ; WX 600 ; N adieresis ; B 42 -12 576 735 ; C 229 ; WX 600 ; N aring ; B 42 -12 576 856 ; C 230 ; WX 600 ; N ae ; B 24 -12 576 542 ; C 231 ; WX 600 ; N ccedilla ; B 30 -211 576 542 ; C 232 ; WX 600 ; N egrave ; B 30 -12 570 783 ; C 233 ; WX 600 ; N eacute ; B 30 -12 570 783 ; C 234 ; WX 600 ; N ecircumflex ; B 30 -12 570 783 ; C 235 ; WX 600 ; N edieresis ; B 30 -12 570 735 ; C 236 ; WX 600 ; N igrave ; B 68 0 574 783 ; C 237 ; WX 600 ; N iacute ; B 68 0 574 783 ; C 238 ; WX 600 ; N icircumflex ; B 68 0 574 783 ; C 239 ; WX 600 ; N idieresis ; B 68 0 574 735 ; C 240 ; WX 600 ; N eth ; B 34 -12 570 826 ; C 241 ; WX 600 ; N ntilde ; B 18 0 585 783 ; C 242 ; WX 600 ; N ograve ; B 30 -12 570 783 ; C 243 ; WX 600 ; N oacute ; B 30 -12 570 783 ; C 244 ; WX 600 ; N ocircumflex ; B 30 -12 570 783 ; C 245 ; WX 600 ; N otilde ; B 30 -12 570 783 ; C 246 ; WX 600 ; N odieresis ; B 30 -12 570 735 ; C 247 ; WX 600 ; N divide ; B 50 0 550 603 ; C 248 ; WX 600 ; N oslash ; B 30 -12 570 548 ; C 249 ; WX 600 ; N ugrave ; B 15 -12 582 783 ; C 250 ; WX 600 ; N uacute ; B 15 -12 582 783 ; C 251 ; WX 600 ; N ucircumflex ; B 15 -12 582 783 ; C 252 ; WX 600 ; N udieresis ; B 15 -12 582 735 ; C 253 ; WX 600 ; N yacute ; B 6 -193 594 783 ; C 254 ; WX 600 ; N thorn ; B 18 -193 570 771 ; C 255 ; WX 600 ; N ydieresis ; B 6 -193 594 735 ; C -1 ; WX 600 ; N Abreve ; B 12 0 588 940 ; C -1 ; WX 600 ; N Aogonek ; B 12 -181 588 723 ; C -1 ; WX 600 ; N Cacute ; B 24 -18 577 940 ; C -1 ; WX 600 ; N Ccaron ; B 24 -18 577 940 ; C -1 ; WX 600 ; N Dcaron ; B 18 0 576 940 ; C -1 ; WX 600 ; N Ecaron ; B 18 0 572 940 ; C -1 ; WX 600 ; N Edotaccent ; B 18 0 572 928 ; C -1 ; WX 600 ; N Eogonek ; B 18 -181 572 723 ; C -1 ; WX 600 ; N Gbreve ; B 24 -18 571 940 ; C -1 ; WX 600 ; N Idotaccent ; B 60 0 539 928 ; C -1 ; WX 600 ; N Lacute ; B 24 0 576 940 ; C -1 ; WX 600 ; N Lcaron ; B 24 0 576 723 ; C -1 ; WX 600 ; N Nacute ; B 18 0 594 940 ; C -1 ; WX 600 ; N Ncaron ; B 18 0 594 940 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 24 -18 576 940 ; C -1 ; WX 600 ; N Racute ; B 18 0 594 940 ; C -1 ; WX 600 ; N Rcaron ; B 18 0 594 940 ; C -1 ; WX 600 ; N Sacute ; B 55 -18 547 940 ; C -1 ; WX 600 ; N Scedilla ; B 55 -211 547 742 ; C -1 ; WX 600 ; N Tcaron ; B 23 0 577 940 ; C -1 ; WX 600 ; N Uring ; B 10 -18 590 1012 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 10 -18 590 940 ; C -1 ; WX 600 ; N Zacute ; B 54 0 546 940 ; C -1 ; WX 600 ; N Zcaron ; B 54 0 546 940 ; C -1 ; WX 600 ; N Zdotaccent ; B 54 0 546 928 ; C -1 ; WX 600 ; N Amacron ; B 12 0 588 868 ; C -1 ; WX 600 ; N Tcommaaccent ; B 23 -211 577 723 ; C -1 ; WX 600 ; N Emacron ; B 18 0 572 868 ; C -1 ; WX 600 ; N Imacron ; B 60 0 539 868 ; C -1 ; WX 600 ; N Iogonek ; B 60 -181 539 723 ; C -1 ; WX 600 ; N Kcommaaccent ; B 18 -211 600 723 ; C -1 ; WX 600 ; N Lcommaaccent ; B 24 -211 576 723 ; C -1 ; WX 600 ; N Ncommaaccent ; B 18 -211 594 723 ; C -1 ; WX 600 ; N Omacron ; B 24 -18 576 868 ; C -1 ; WX 600 ; N Rcommaaccent ; B 18 -211 594 723 ; C -1 ; WX 600 ; N Gcommaaccent ; B 24 -211 571 741 ; C -1 ; WX 600 ; N Umacron ; B 10 -18 590 868 ; C -1 ; WX 600 ; N Uogonek ; B 10 -181 590 723 ; C -1 ; WX 600 ; N abreve ; B 42 -12 576 784 ; C -1 ; WX 600 ; N aogonek ; B 42 -181 576 542 ; C -1 ; WX 600 ; N cacute ; B 30 -12 576 783 ; C -1 ; WX 600 ; N ccaron ; B 30 -12 576 783 ; C -1 ; WX 600 ; N dcaron ; B 12 -12 600 771 ; C -1 ; WX 600 ; N ecaron ; B 30 -12 570 783 ; C -1 ; WX 600 ; N edotaccent ; B 30 -12 570 771 ; C -1 ; WX 600 ; N eogonek ; B 30 -181 570 542 ; C -1 ; WX 600 ; N gbreve ; B 45 -205 591 784 ; C -1 ; WX 600 ; N lacute ; B 68 0 574 976 ; C -1 ; WX 600 ; N lcaron ; B 68 0 599 771 ; C -1 ; WX 600 ; N nacute ; B 18 0 585 783 ; C -1 ; WX 600 ; N ncaron ; B 18 0 585 783 ; C -1 ; WX 600 ; N ohungarumlaut ; B 30 -12 570 783 ; C -1 ; WX 600 ; N racute ; B 27 0 573 783 ; C -1 ; WX 600 ; N sacute ; B 82 -12 532 783 ; C -1 ; WX 600 ; N scommaaccent ; B 82 -211 532 542 ; C -1 ; WX 600 ; N tcaron ; B 36 -12 530 843 ; C -1 ; WX 600 ; N uring ; B 15 -12 582 856 ; C -1 ; WX 600 ; N uhungarumlaut ; B 15 -12 582 783 ; C -1 ; WX 600 ; N zacute ; B 72 0 528 783 ; C -1 ; WX 600 ; N zcaron ; B 72 0 528 783 ; C -1 ; WX 600 ; N zdotaccent ; B 72 0 528 771 ; C -1 ; WX 600 ; N tcommaaccent ; B 36 -211 530 650 ; C -1 ; WX 600 ; N amacron ; B 42 -12 576 711 ; C -1 ; WX 600 ; N emacron ; B 30 -12 570 711 ; C -1 ; WX 600 ; N imacron ; B 68 0 574 711 ; C -1 ; WX 600 ; N kcommaaccent ; B 18 -211 582 771 ; C -1 ; WX 600 ; N lcommaaccent ; B 68 -211 574 771 ; C -1 ; WX 600 ; N ncommaaccent ; B 18 -211 585 542 ; C -1 ; WX 600 ; N omacron ; B 30 -12 570 711 ; C -1 ; WX 600 ; N rcommaaccent ; B 27 -211 573 542 ; C -1 ; WX 600 ; N umacron ; B 15 -12 582 711 ; C -1 ; WX 600 ; N uogonek ; B 15 -181 582 530 ; C -1 ; WX 600 ; N rcaron ; B 27 0 573 783 ; C -1 ; WX 600 ; N scedilla ; B 82 -211 532 542 ; C -1 ; WX 600 ; N gcommaaccent ; B 45 -205 591 915 ; C -1 ; WX 600 ; N iogonek ; B 68 -181 574 771 ; C -1 ; WX 600 ; N Scommaaccent ; B 55 -211 547 742 ; C -1 ; WX 600 ; N Dcroat ; B 0 0 577 723 ; C -1 ; WX 600 ; N Lslash ; B 24 0 576 723 ; C -1 ; WX 600 ; N dotlessi ; B 68 0 574 530 ; C -1 ; WX 600 ; N fi ; B 18 0 585 783 ; C -1 ; WX 600 ; N fl ; B 18 0 585 783 ; C -1 ; WX 600 ; N dcroat ; B 30 -12 594 771 ; C -1 ; WX 600 ; N lslash ; B 68 0 574 771 ; C -1 ; WX 600 ; N periodcentered ; B 222 229 379 385 ; C -1 ; WX 600 ; N minus ; B 48 253 552 350 ; C -1 ; WX 600 ; N fraction ; B 46 -18 554 741 ; C -1 ; WX 600 ; N dotaccent ; B 228 626 373 771 ; C -1 ; WX 600 ; N ring ; B 186 626 415 856 ; C -1 ; WX 600 ; N caron ; B 129 626 472 783 ; C -1 ; WX 600 ; N breve ; B 127 627 472 784 ; C -1 ; WX 600 ; N hungarumlaut ; B 103 626 498 783 ; C -1 ; WX 600 ; N ogonek ; B 179 -181 402 0 ; C -1 ; WX 600 ; N macron ; B 119 627 480 711 ; C -1 ; WX 333 ; N commaaccent ; B 66 -211 274 -48 ; EndCharMetrics EndFontMetrics xdvik-ja-22.84.16-j1.40/auxdir/0000775000175000017500000000000011730170101015346 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/auxdir/auxsub/0000775000175000017500000000000011742735216016676 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/auxdir/auxsub/configure0000775000175000017500000030461511730167476020622 0ustar uwabamiuwabami#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for TeX Live auxdir auxsub 2009. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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. as_myself= 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" 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. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $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 tex-k@tug.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: 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 STATUS 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=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&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'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/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='TeX Live auxdir auxsub' PACKAGE_TARNAME='tex-live-auxdir-auxsub' PACKAGE_VERSION='2009' PACKAGE_STRING='TeX Live auxdir auxsub 2009' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' ac_unique_file="../../build-aux/missing" ac_subst_vars='LTLIBOBJS LIBOBJS MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE 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_maintainer_mode ' ac_precious_vars='build_alias host_alias target_alias' # 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= ;; *) 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 TeX Live auxdir auxsub 2009 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/tex-live-auxdir-auxsub] --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 TeX Live auxdir auxsub 2009:";; 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] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer 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 TeX Live auxdir auxsub configure 2009 generated by GNU Autoconf 2.68 Copyright (C) 2010 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. ## ## ------------------------ ## 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 TeX Live auxdir auxsub $as_me 2009, which was generated by GNU Autoconf 2.68. 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 $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" 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 $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" 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 $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" 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 $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" 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 # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac 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 /dev/null != "$ac_site_file" && 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" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } 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. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && 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 # 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 ac_aux_dir= for ac_dir in ../../build-aux "$srcdir"/../../build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../build-aux \"$srcdir\"/../../build-aux" "$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. am__api_version='1.11' # 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 ${ac_cv_path_install+:} false; 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 ${ac_cv_prog_STRIP+:} false; 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 ${ac_cv_prog_ac_ct_STRIP+:} false; 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 ${ac_cv_path_mkdir+:} false; 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 test -d ./--version && rmdir ./--version 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. 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 ${ac_cv_prog_AWK+:} false; 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 eval \${ac_cv_prog_make_${ac_make}_set+:} false; 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='tex-live-auxdir-auxsub' VERSION='2009' 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. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE echo "'$srcdir/configure' $ac_configure_args" >../../subsubdir-conf.cmd ac_config_files="$ac_config_files 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 if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} 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}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= 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 -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" 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. as_myself= 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 STATUS 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=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&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 TeX Live auxdir auxsub $as_me 2009, which was generated by GNU Autoconf 2.68. 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 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _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 --config print configuration, 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 Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ TeX Live auxdir auxsub config.status 2009 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 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=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= 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 ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; 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"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --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 _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 "Makefile") CONFIG_FILES="$CONFIG_FILES 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 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= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # 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 {' >"$ac_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 >>"\$ac_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 >>"\$ac_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 < "$ac_tmp/subs1.awk" > "$ac_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 sole $(srcdir), # ${srcdir} and @srcdir@ entries 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[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " 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="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "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 >"$ac_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 "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; 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 1 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 xdvik-ja-22.84.16-j1.40/auxdir/auxsub/README0000664000175000017500000000070711730167476017566 0ustar uwabamiuwabamiCopyright (C) 2009 Peter Breitenlohner You may freely use, modify and/or distribute this file. This directory auxdir/auxsub/ of the TL tree does not build or install anything. Its purpose is to record the command line used to invoke auxdir/auxsub/configure. This information is then used by the Makefiles in libs, texk, and utils to invoke configure in their subdirectories without the need to adjust any absolute or relative paths. xdvik-ja-22.84.16-j1.40/auxdir/auxsub/configure.ac0000664000175000017500000000121611730167476021170 0ustar uwabamiuwabamidnl Process this file with autoconf to produce a configure script. dnl dnl Copyright (C) 2009 Peter Breitenlohner dnl dnl This file is free software; the copyright holder dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl AC_INIT([TeX Live auxdir auxsub], [2009], [tex-k@tug.org]) AC_PREREQ([2.65]) AC_CONFIG_SRCDIR([../../build-aux/missing]) AC_CONFIG_AUX_DIR([../../build-aux]) AM_INIT_AUTOMAKE([foreign]) AM_MAINTAINER_MODE echo "'$srcdir/configure' $ac_configure_args" >../../subsubdir-conf.cmd AC_CONFIG_FILES([Makefile]) AC_OUTPUT xdvik-ja-22.84.16-j1.40/auxdir/auxsub/Makefile.am0000664000175000017500000000034511730167476020740 0ustar uwabamiuwabami## Makefile.am for the TeX Live subdirectory auxdir/auxsub/ ## ## Copyright (C) 2009 Peter Breitenlohner ## You may freely use, modify and/or distribute this file. ## DISTCLEANFILES = ../../subsubdir-conf.cmd xdvik-ja-22.84.16-j1.40/auxdir/auxsub/Makefile.in0000664000175000017500000003444511730167476020761 0ustar uwabamiuwabami# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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)/../../build-aux/install-sh \ $(srcdir)/../../build-aux/missing $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure \ ../../build-aux/config.guess ../../build-aux/config.sub \ ../../build-aux/depcomp ../../build-aux/install-sh \ ../../build-aux/ltmain.sh ../../build-aux/missing \ ../../build-aux/texinfo.tex ../../build-aux/ylwrap ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ 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@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ 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@ DISTCLEANFILES = ../../subsubdir-conf.cmd all: all-am .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): tags: TAGS TAGS: ctags: CTAGS CTAGS: 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 -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -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=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(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_OPT=$${XZ_OPT--e} 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 $(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) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(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) gzip -dc $(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" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(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: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { 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-am all-am: Makefile 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic 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 -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am am--refresh check check-am clean clean-generic dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-lzma dist-shar \ dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-generic 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 maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am 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: xdvik-ja-22.84.16-j1.40/m4/0000775000175000017500000000000011742727701014413 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/m4/kpse-teckit-flags.m40000664000175000017500000000227111730167472020174 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_TECKIT_FLAGS # ----------------- # Provide the configure options '--with-system-teckit' (if in the TL tree), # '--with-teckit-includes', and '--with-teckit-libdir'. # # Set the make variables TECKIT_INCLUDES and TECKIT_LIBS to the CPPFLAGS and # LIBS required for the `-lTECkit' library in libs/teckit/ of the TL tree. AC_DEFUN([KPSE_TECKIT_FLAGS], [AC_REQUIRE([KPSE_ZLIB_FLAGS])[]dnl _KPSE_LIB_FLAGS([teckit], [TECkit], [], [-IBLD/libs/teckit/include], [BLD/libs/teckit/libTECkit.a], [], [], [${top_builddir}/../../libs/teckit/include/teckit/TECkit_Common.h])[]dnl ]) # KPSE_TECKIT_FLAGS # KPSE_TECKIT_OPTIONS([WITH-SYSTEM]) # ---------------------------------- AC_DEFUN([KPSE_TECKIT_OPTIONS], [_KPSE_LIB_OPTIONS([teckit], [$1])]) # KPSE_TECKIT_SYSTEM_FLAGS # ------------------------ AC_DEFUN([KPSE_TECKIT_SYSTEM_FLAGS], [_KPSE_LIB_FLAGS_SYSTEM([teckit], [TECkit])]) xdvik-ja-22.84.16-j1.40/m4/kpse-icu-flags.m40000664000175000017500000000610311730167472017467 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009 - 2011 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_ICU_FLAGS([MORE-ICU-LIBS], [ICU_CONFIG_ARGS]) # -------------------------------------------------- # Provide the configure option '--with-system-icu' (if in the TL tree). # # ICU_CONFIG_ARGS: icu-config arguments for additional icu libraries. # # Set the make variables ICU_INCLUDES and ICU_LIBS to the CPPFLAGS and # LIBS required for the icu libraries in libs/icu/ of the TL tree. AC_DEFUN([KPSE_ICU_FLAGS], [m4_pushdef([kpse_icu_config_args], [$2])[]dnl _KPSE_ICU_FLAGS([icuxxx], [], [$1])[]dnl m4_popdef([kpse_icu_config_args])[]dnl ]) # KPSE_ICU_FLAGS # KPSE_ICU_XETEX_FLAGS([MORE-ICU-LIBS]) # ------------------------------------- # Set the make variables ICU_INCLUDES and ICU_LIBS to the CPPFLAGS and # LIBS required for the icu-xetex libraries in libs/icu/ of the TL tree. AC_DEFUN([KPSE_ICU_XETEX_FLAGS], [_KPSE_ICU_FLAGS([sicuxxx], [tree], [$1])[]dnl ]) # KPSE_ICU_XETEX_FLAGS # _KPSE_ICU_FLAGS(LIBNAME, OPTIONS, [MORE-ICU-LIBS]) # -------------------------------------------------- # Internal subroutine. # # LIBNAME and OPTIONS as for _KPSE_LIB_FLAGS(). # MORE-ICU-LIBS: icu libraries from the TL tree in addition to icuuc and icudata. m4_define([_KPSE_ICU_FLAGS], [_KPSE_LIB_FLAGS([icu], [$1], [$2], [-DU_STATIC_IMPLEMENTATION -IBLD/libs/icu/include], m4_bpatsubst([$3 icuuc icudata], [icu\([18a-z]*\)], [BLD/libs/icu/icu-build/lib/libicu\1.a]), [], [], [${top_builddir}/../../libs/icu/include/unicode/uversion.h])[]dnl ]) # _KPSE_ICU_FLAGS # KPSE_ICU_OPTIONS([WITH-SYSTEM]) # ------------------------------- AC_DEFUN([KPSE_ICU_OPTIONS], [m4_ifval([$1], [AC_ARG_WITH([system-icu], AS_HELP_STRING([--with-system-icu], [use installed ICU headers and libraries (requires icu-config, not for XeTeX)]))])[]dnl ]) # KPSE_ICU_OPTIONS # KPSE_ICU_SYSTEM_FLAGS # --------------------- AC_DEFUN([KPSE_ICU_SYSTEM_FLAGS], [AC_REQUIRE([_KPSE_CHECK_ICU_CONFIG])[]dnl if $ICU_CONFIG --version >/dev/null 2>&1; then ICU_INCLUDES=`$ICU_CONFIG --cppflags` # Work around bug in icu-config version 4.4 ICU_LIBS=`$ICU_CONFIG --ldflags-searchpath m4_ifset([kpse_icu_config_args], [kpse_icu_config_args])` ICU_LIBS="$ICU_LIBS `$ICU_CONFIG --ldflags-libsonly --ldflags-system`" elif test "x$need_icu:$with_system_icu" = xyes:yes; then AC_MSG_ERROR([did not find icu-config required for system icu libraries]) fi ]) # KPSE_ICU_SYSTEM_FLAGS # _KPSE_CHECK_ICU_CONFIG # ---------------------- # Check for icu-config AC_DEFUN([_KPSE_CHECK_ICU_CONFIG], [AC_REQUIRE([AC_CANONICAL_HOST])[]dnl AC_CHECK_TOOL([ICU_CONFIG], [icu-config], [false])[]dnl ]) # _KPSE_CHECK_ICU_CONFIG xdvik-ja-22.84.16-j1.40/m4/kpse-pkgs.m40000664000175000017500000000666011730167472016571 0ustar uwabamiuwabami# Private macros for the TeX Live (TL) tree. # Copyright (C) 2009, 2010, 2011 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 ## ------------------------------ ## ## Define lists of sub-packages. ## ## ------------------------------ ## # Hopefully these lists are defined here and nowhere else. # Note: directories in these lists need not exist. # KPSE_LIBS_PKGS() # ---------------- # Define two lists of library sub-packages: # generic libraries, i.e., subdirs 'libs/*', that can be used by # utility and TeXk sub-packages # and # TeX specific libraries, i.e., subdirs 'texk/*', that can only # be used by TeXk sub-packages and can't use generic libraries # Each library must precede required other libraries (if any). AC_DEFUN([KPSE_LIBS_PKGS], [dnl generic libraries 'libs/*' m4_define([kpse_libs_pkgs], [ icu teckit graphite zziplib xpdf poppler gd freetype2 freetype t1lib obsdcompat libpng zlib ])[]dnl dnl TeX specific libraries m4_define([kpse_texlibs_pkgs], [ ptexenc kpathsea ])]) # KPSE_LIBS_PKGS # KPSE_ALL_SYSTEM_FLAGS() # ----------------------- # Generate flags for all potential system libraries available, # only used at top-level. AC_DEFUN([KPSE_ALL_SYSTEM_FLAGS], [AC_REQUIRE([KPSE_LIBS_PREPARE])[]dnl AC_REQUIRE([KPSE_KPATHSEA_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_PTEXENC_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_ZLIB_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_LIBPNG_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_T1LIB_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_FREETYPE_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_FREETYPE2_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_GD_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_XPDF_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_POPPLER_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_ZZIPLIB_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_GRAPHITE_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_TECKIT_SYSTEM_FLAGS])[]dnl AC_REQUIRE([KPSE_ICU_SYSTEM_FLAGS])[]dnl ]) # KPSE_ALL_SYSTEM_FLAGS # KPSE_UTILS_PKGS() # ----------------- # Define the list of utility sub-packages, i.e., subdirs 'utils/*'. AC_DEFUN([KPSE_UTILS_PKGS], [m4_define([kpse_utils_pkgs], [ biber chktex ps2eps psutils t1utils tpic2pdftex vlna xindy xpdfopen ])]) # KPSE_UTILS_PKGS # KPSE_TEXK_PKGS() # ---------------- # Define the list of TeXk sub-packages, i.e., subdirs 'texk/*', # excluding 'texk/kpathsea'. AC_DEFUN([KPSE_TEXK_PKGS], [m4_define([kpse_texk_pkgs], [ web2c afm2pl bibtex8 bibtexu cjkutils detex devnag dtl dvi2tty dvidvi dviljk dvipdfmx dvipng dvipos dvipsk dvisvgm gsftopk lacheck lcdf-typetools makeindexk makejvf mendexk ps2pkm seetexk tex4htk ttf2pk ttf2pk2 ttfdump xdv2pdf xdvik xdvipdfmx tetex texlive ])]) # KPSE_TEXK_PKGS ## ------------------------------- ## ## Loop over one of these lists. ## ## ------------------------------- ## # KPSE_FOR_PKGS(LIST, ACTION) # --------------------------- # Run the shell code ACTION for each element Kpse_Pkg in kpse_LIST_pkgs, # with Kpse_pkg a sanitized version of Kpse_Pkg for shell variables and # Kpse_PKG a sanitized (upper case) version for make variables. AC_DEFUN([KPSE_FOR_PKGS], [AC_REQUIRE([KPSE_LIBS_PKGS])AC_REQUIRE([KPSE_UTILS_PKGS])AC_REQUIRE([KPSE_TEXK_PKGS])[]dnl AC_FOREACH([Kpse_Pkg], kpse_$1_pkgs, [m4_pushdef([Kpse_pkg], AS_TR_SH(Kpse_Pkg))[]dnl m4_pushdef([Kpse_PKG], AS_TR_CPP(Kpse_Pkg))[]dnl $2 m4_popdef([Kpse_pkg])m4_popdef([Kpse_PKG])[]dnl ])]) # KPSE_FOR_PKGS xdvik-ja-22.84.16-j1.40/m4/kpse-common.m40000664000175000017500000002535411730167472017116 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 1995 - 2009 Karl Berry # Copyright (C) 2009, 2010 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_LIBS_PREPARE # ----------------- # Enforce inclusion of this file. AC_DEFUN([KPSE_LIBS_PREPARE], []) # _KPSE_INIT() # ------------ # Initialize infrastructure for libraries and programs in the TL tree. # If in the TL tree, define kpse_TL as relative path to the TL root. AC_DEFUN([_KPSE_INIT], [## $0: Initialize TL infrastructure m4_syscmd([test -f ../../texk/kpathsea/doc/kpathsea.texi])[]dnl m4_if(m4_sysval, [0], [m4_define([kpse_TL], [../../])])[]dnl m4_ifdef([kpse_TL], [kpse_BLD=`(cd "./kpse_TL()." && pwd)` kpse_SRC=`(cd "$srcdir/kpse_TL()." && pwd)` ])[]dnl ]) # _KPSE_INIT # KPSE_INIT() # ----------- # Initialize, if not automatically done so via KPSE_*_FLAGS AC_DEFUN([KPSE_INIT], [AC_REQUIRE([_KPSE_INIT])]) # _KPSE_USE_LIBTOOL() # ------------------- AC_DEFUN([_KPSE_USE_LIBTOOL], [## $0: Generate a libtool script for use in configure tests AC_PROVIDE_IFELSE([LT_INIT], , [m4_fatal([$0: requires libtool])])[]dnl LT_OUTPUT m4_append([AC_LANG(C)], [ac_link="./libtool --mode=link --tag=CC $ac_link" ])[]dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [m4_append([AC_LANG(C++)], [ac_link="./libtool --mode=link --tag=CXX $ac_link" ])])[]dnl AC_LANG(_AC_LANG)[]dnl ]) # _KPSE_USE_LIBTOOL # _KPSE_LIB_FLAGS(LIBDIR, LIBNAME, OPTIONS, # TL-INCLUDES, TL-LIBS, TL-EXTRA, # [REBUILD-SRC-DEPENDENCIES], # [REBUILD-BLD-DEPENDENCIES]) # ----------------------------------------------- # For generic libraries in libs/LIBDIR. # Provide the configure options '--with-system-LIBDIR' (if in the TL tree), # '--with-LIBDIR-includes', and '--with-LIBDIR-libdir'. # Options: # lt - this is a Libtool library # tree - only use library from the TL tree # # Set the make variables LIBDIR_INCLUDES and LIBDIR_LIBS to the CPPFLAGS and # LIBS required for the library in the directory libs/LIBDIR/ of the TL tree. # # If an installed (system) version of the library has been selected or is # implied, then execute KPSE_LIBDIR_SYSTEM_FLAGS to set the two variables. # # Otherwise, set LIBDIR_INCLUDES based on the value of TL_INCLUDES and # LIBDIR_LIBS based on the value of TL_LIBS; the optional shell code # TL-EXTRA may modifiy these values. # If OPTIONS specifies a Libtool library, then arrange that future configure # test use Libtool. # Furthermore, set LIBDIR_DEPEND and LIBDIR_RULE to values suitable as # dependency and (multiline) Make rule to rebuild the library (assuming that # '${top_srcdir}/../../' and '${top_builddir}/../../' point to the root of # the TL tree). AC_DEFUN([_KPSE_LIB_FLAGS], [AC_REQUIRE([_KPSE_INIT])[]dnl ## $0: Setup $1 (-l$2) flags m4_ifdef([kpse_TL], [_KPSE_LIB_FLAGS_TL($@)], [_KPSE_LIB_FLAGS_STANDALONE($@)])[]dnl AC_SUBST(AS_TR_CPP($1)[_INCLUDES])[]dnl AC_SUBST(AS_TR_CPP($1)[_LIBS])[]dnl AC_SUBST(AS_TR_CPP($1)[_DEPEND])[]dnl AC_SUBST(AS_TR_CPP($1)[_RULE])[]dnl m4_provide_if([AM_INIT_AUTOMAKE], [_AM_SUBST_NOTMAKE(AS_TR_CPP($1)[_RULE])])[]dnl ]) # _KPSE_LIB_FLAGS # _KPSE_TEXLIB_FLAGS(LIBDIR, LIBNAME, OPTIONS, # TL-INCLUDES, TL-LIBS, TL-EXTRA, # [REBUILD-SRC-DEPENDENCIES], # [REBUILD-BLD-DEPENDENCIES]) # ----------------------------------------------- # As above, but for TeX specific libraries in texk/LIBDIR. AC_DEFUN([_KPSE_TEXLIB_FLAGS], [m4_pushdef([Kpse_TeX_Lib], [])_KPSE_LIB_FLAGS($@)m4_popdef([Kpse_TeX_Lib])]) # _KPSE_LIB_FLAGS_TL(LIBDIR, LIBNAME, OPTIONS, # TL-INCLUDES, TL-LIBS, TL-EXTRA, # [REBUILD-SRC-DEPENDENCIES], # [REBUILD-BLD-DEPENDENCIES]) # -------------------------------------------------- # Internal subroutine for use of _KPSE_LIB_FLAGS inside the TL tree. m4_define([_KPSE_LIB_FLAGS_TL], [m4_if(m4_index([ $3 ], [ lt ]), [-1], , [AC_REQUIRE([_KPSE_USE_LIBTOOL])])[]dnl m4_if m4_if(m4_index([ $3 ], [ tree ]), [-1], [KPSE_]AS_TR_CPP([$1])[_OPTIONS([with-system])[]dnl if test "x$with_system_[]AS_TR_SH($1)" = xyes; then ]AS_TR_CPP([kpse-$1-system-flags])[[]dnl else ])[]dnl m4_if AS_TR_CPP($1)[_INCLUDES=`echo '$4' | sed \ -e "s,SRC/,$kpse_SRC/,g" \ -e "s,BLD/,$kpse_BLD/,g"`] AS_TR_CPP($1)[_LIBS=`echo '$5' | sed \ -e "s,BLD/,$kpse_BLD/,g"` $6] m4_ifdef([Kpse_TeX_Lib], [AS_TR_CPP($1)[_DEPEND=`echo '$5' | sed \ -e 's,BLD/texk/,${top_builddir}/../,g'`] AS_TR_CPP($1)[_RULE='# Rebuild lib$2 $(]AS_TR_CPP($1)[_DEPEND):]m4_ifval([$7], [[ $7]])m4_ifval([$8], [[ $8 cd ${top_builddir}/../$1 && $(MAKE) $(AM_MAKEFLAGS) rebuild $8:]])[ cd ${top_builddir}/../$1 && $(MAKE) $(AM_MAKEFLAGS) rebuild']], [AS_TR_CPP($1)[_DEPEND=`echo '$5' | sed \ -e 's,BLD/,${top_builddir}/../../,g'`] AS_TR_CPP($1)[_RULE='# Rebuild lib$2 $(]AS_TR_CPP($1)[_DEPEND):]m4_ifval([$7], [[ $7]])m4_ifval([$8], [[ $8 cd ${top_builddir}/../../libs/$1 && $(MAKE) $(AM_MAKEFLAGS) rebuild $8:]])[ cd ${top_builddir}/../../libs/$1 && $(MAKE) $(AM_MAKEFLAGS) rebuild']]) m4_if(m4_index([ $3 ], [ tree ]), [-1], [fi ])[]dnl m4_if ]) # _KPSE_LIB_FLAGS_TL # _KPSE_LIB_FLAGS_STANDALONE(LIBDIR, LIBNAME, OPTIONS) # ---------------------------------------------------- # Internal subroutine for standalone use of _KPSE_LIB_FLAGS. m4_define([_KPSE_LIB_FLAGS_STANDALONE], [m4_if(m4_index([ $3 ], [ tree ]), [-1], [KPSE_]AS_TR_CPP([$1])[_OPTIONS([])]dnl [KPSE_]AS_TR_CPP([$1])[_SYSTEM_FLAGS], [m4_fatal([$0: not in TL tree])])[]dnl m4_if ]) # _KPSE_LIB_FLAGS_STANDALONE # _KPSE_LIB_OPTIONS(LIBDIR, [WITH-SYSTEM]) # ---------------------------------------- # Internal subroutine: default configure options for system library, # including '--with-system-LIBDIR' if WITH-SYSTEM is nonempty. m4_define([_KPSE_LIB_OPTIONS], [m4_ifval([$2], [AC_ARG_WITH([system-$1], AS_HELP_STRING([--with-system-$1], [use installed $1 headers and library]))])[]dnl AC_ARG_WITH([$1-includes], AS_HELP_STRING([--with-$1-includes=DIR], [$1 headers installed in DIR]))[]dnl AC_ARG_WITH([$1-libdir], AS_HELP_STRING([--with-$1-libdir=DIR], [$1 library installed in DIR]))[]dnl ]) # _KPSE_LIB_OPTIONS # _KPSE_LIB_FLAGS_SYSTEM(LIBDIR, LIBNAME) # --------------------------------------- # Internal subroutine: default flags for system library. m4_define([_KPSE_LIB_FLAGS_SYSTEM], [if test "x$with_[]AS_TR_SH($1)_includes" != x && test "x$with_[]AS_TR_SH($1)_includes" != xyes; then AS_TR_CPP($1)_INCLUDES="-I$with_[]AS_TR_SH($1)_includes" fi AS_TR_CPP($1)_LIBS="-l$2" if test "x$with_[]AS_TR_SH($1)_libdir" != x && test "x$with_[]AS_TR_SH($1)_libdir" != xyes; then AS_TR_CPP($1)_LIBS="-L$with_[]AS_TR_SH($1)_libdir $AS_TR_CPP($1)_LIBS" fi ]) # _KPSE_LIB_FLAGS_SYSTEM # KPSE_SAVE_FLAGS # --------------- # Save values of CPPFLAGS and LIBS. AC_DEFUN([KPSE_SAVE_FLAGS], [kpse_save_CPPFLAGS=$CPPFLAGS kpse_save_LIBS=$LIBS ]) # KPSE_SAVE_FLAGS # KPSE_RESTORE_FLAGS # ------------------ # Restore values of CPPFLAGS and LIBS. AC_DEFUN([KPSE_RESTORE_FLAGS], [AC_REQUIRE([KPSE_SAVE_FLAGS])[]dnl CPPFLAGS=$kpse_save_CPPFLAGS LIBS=$kpse_save_LIBS ]) # KPSE_RESTORE_FLAGS # KPSE_ADD_FLAGS(LIBDIR) # ---------------------- # Add flags for LIBDIR to values of CPPFLAGS and LIBS. AC_DEFUN([KPSE_ADD_FLAGS], [AC_REQUIRE([KPSE_SAVE_FLAGS])[]dnl eval CPPFLAGS=\"$[]AS_TR_CPP($1)_INCLUDES \$CPPFLAGS\" eval LIBS=\"$[]AS_TR_CPP($1)_LIBS \$LIBS\" ]) # KPSE_ADD_FLAGS # KPSE_COMMON(PACKAGE-NAME, [MORE-AUTOMAKE-OPTIONS]) # -------------------------------------------------- # Common Autoconf code for all programs using libkpathsea. # Originally written by Karl Berry as texk/kpathsea/common.ac. # # Initialization of Automake and Libtool, some common tests. AC_DEFUN([KPSE_COMMON], [dnl Remember PACKAGE-NAME as Kpse_Package (for future messages) m4_define([Kpse_Package], [$1]) dnl AM_INIT_AUTOMAKE([foreign]m4_ifval([$2], [ $2])) AM_MAINTAINER_MODE dnl LT_PREREQ([2.2.6]) LT_INIT([win32-dll]) dnl AC_SYS_LARGEFILE AC_FUNC_FSEEKO dnl AC_HEADER_DIRENT AC_HEADER_STDC AC_FUNC_CLOSEDIR_VOID AC_CHECK_HEADERS([assert.h float.h limits.h memory.h pwd.h stdlib.h \ string.h strings.h sys/param.h unistd.h]) dnl dnl Replacement functions that may be required on ancient broken system. AC_CHECK_FUNCS([putenv strcasecmp strtol strstr]) dnl dnl More common functions AC_CHECK_FUNCS([bcmp bcopy bzero getcwd getwd index memcmp memcpy mkstemp mktemp rindex strchr strrchr]) dnl AC_C_CONST AC_C_INLINE AC_TYPE_SIZE_T dnl dnl Check whether struct stat provides high-res time. AC_CHECK_MEMBERS([struct stat.st_mtim]) dnl dnl Check whether prototypes work. AC_CACHE_CHECK([whether the compiler accepts prototypes], [kb_cv_c_prototypes], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[extern void foo(int i,...);]])], [kb_cv_c_prototypes=yes], [kb_cv_c_prototypes=no])]) if test "x$kb_cv_c_prototypes" = xno; then AC_MSG_ERROR([Sorry, your compiler does not understand prototypes.]) fi dnl dnl Enable flags for compiler warnings KPSE_COMPILER_WARNINGS ]) # KPSE_COMMON # KPSE_MSG_WARN(PROBLEM) # ---------------------- # Same as AC_MSG_WARN, but terminate if `--disable-missing' was given. AC_DEFUN([KPSE_MSG_WARN], [AC_REQUIRE([_KPSE_MSG_WARN_PREPARE])[]dnl AC_MSG_WARN([$1]) AS_IF([test "x$enable_missing" = xno], [AC_MSG_ERROR([terminating.])]) ]) # KPSE_MSG_WARN # _KPSE_MSG_WARN_PREPARE # ---------------------- # Internal subroutine. AC_DEFUN([_KPSE_MSG_WARN_PREPARE], [AC_ARG_ENABLE([missing], AS_HELP_STRING([--disable-missing], [terminate if a requested program or feature must be disabled, e.g., due to missing libraries]))[]dnl ]) # _KPSE_MSG_WARN_PREPARE # _KPSE_CHECK_PKG_CONFIG # ---------------------- # Check for pkg-config AC_DEFUN([_KPSE_CHECK_PKG_CONFIG], [AC_REQUIRE([AC_CANONICAL_HOST])[]dnl AC_CHECK_TOOL([PKG_CONFIG], [pkg-config], [false])[]dnl ]) # _KPSE_CHECK_PKG_CONFIG # KPSE_CANONICAL_HOST # ------------------- # Require both --host and --build for cross compilations; set kpse_build_alias. AC_DEFUN([KPSE_CANONICAL_HOST], [AC_REQUIRE([AC_CANONICAL_HOST])[]dnl AS_IF([test "x$host_alias" != x && test "x$build_alias" = x], [AC_MSG_ERROR([when cross-compiling you must specify both --host and --build.])]) eval kpse_build_alias=\${build_alias-$build} ]) # KPSE_CANONICAL_HOST xdvik-ja-22.84.16-j1.40/m4/kpse-macos-framework.m40000664000175000017500000000213611730167472020714 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2005 - 2008 Jonathan Kew <...@...> # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_CHECK_FRAMEWORK(FRAMEWORK, BODY) # ------------------------------------- # Check for mthe Mac OS X framework FRAMEWORK (using BODY) and if found, # set kpse_cv_have_FRAMEWORK to yes and define HAVE_FRAMEWORK. AC_DEFUN([KPSE_CHECK_FRAMEWORK], [AC_CACHE_CHECK([for Mac OS X $1 framework], [kpse_cv_have_$1], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <$1/$1.h>]], [[$2]])], [kpse_cv_have_$1=yes], [kpse_cv_have_$1=no])]) AS_IF([test "x$kpse_cv_have_$1" = xyes], [AC_DEFINE([HAVE_]AS_TR_CPP([$1]), 1, [Define to 1 if you have the Mac OS X $1 framework.])]) ]) # KPSE_CHECK_FRAMEWORK xdvik-ja-22.84.16-j1.40/m4/ltoptions.m40000644000175000017500000003007311742727321016707 0ustar uwabamiuwabami# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # 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 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) xdvik-ja-22.84.16-j1.40/m4/kpse-warnings.m40000664000175000017500000001764711730167472017464 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009-2012 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # KPSE_COMPILER_WARNINGS # ---------------------- # Set up compiler warnings for C and C++. # This macro determines and substitutes WARNING_CFLAGS for the C compiler # and, if applicable, WARNING_CXXFLAGS for the C++ compiler. To activate # them a Makefile.am must use them, e.g., in AM_CFLAGS or AM_CXXFLAGS. AC_DEFUN([KPSE_COMPILER_WARNINGS], [AC_REQUIRE([_KPSE_COMPILER_WARNINGS_OPTION])[]dnl dnl arrange that AC_PROG_CC uses _KPSE_WARNING_CFLAGS etc. AC_PROVIDE_IFELSE([AC_PROG_CC], [_KPSE_WARNING_CFLAGS], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_KPSE_WARNING_CFLAGS])]) AC_PROVIDE_IFELSE([AC_PROG_CXX], [_KPSE_WARNING_CXXFLAGS], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_KPSE_WARNING_CXXFLAGS])]) AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_KPSE_WARNING_OBJCFLAGS], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_KPSE_WARNING_OBJCFLAGS])]) AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_KPSE_WARNING_OBJCXXFLAGS], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_KPSE_WARNING_OBJCXXFLAGS])]) ]) # KPSE_COMPILER_WARNINGS # _KPSE_COMPILER_WARNINGS_OPTION # ------------------------------ # Internal subroutine. # Provide configure option `--enable-compiler-warnings=[no|min|yes|max|all]' # to enable various degrees of compiler warnings. AC_DEFUN([_KPSE_COMPILER_WARNINGS_OPTION], [AC_ARG_ENABLE([compiler-warnings], AS_HELP_STRING([--enable-compiler-warnings=@<:@no|min|yes|max|all@:>@], [Turn on compiler warnings @<:@default: yes if maintainer-mode, min otherwise@:>@]))[]dnl AS_CASE([$enable_compiler_warnings], [no | min | yes | max | all], [], [AS_IF([test "x$enable_maintainer_mode" = xyes], [enable_compiler_warnings=yes], [enable_compiler_warnings=min])]) ]) # _KPSE_COMPILER_WARNINGS_OPTION _KPSE_WARNING_CFLAGS # ------------------ # Internal subroutine. # Determine and substitute WARNING_CFLAGS for C compiler. AC_DEFUN([_KPSE_WARNING_CFLAGS], [AC_REQUIRE([_KPSE_COMPILER_WARNINGS_OPTION])[]dnl AC_REQUIRE([AC_PROG_CC])[]dnl AC_CACHE_CHECK([what warning flags to pass to the C compiler], [kpse_cv_warning_cflags], [dnl if test "x$GCC" = xyes; then _KPSE_WARNING_GNU_CFLAGS([CC], [cflags])[]dnl elif test "x$enable_compiler_warnings" = xno; then kpse_cv_warning_cflags= else kpse_cv_warning_cflags= # FIXME: warning flags for non-GNU C compilers fi]) WARNING_CFLAGS=$kpse_cv_warning_cflags AC_SUBST([WARNING_CFLAGS]) m4_define([_KPSE_WARNING_CFLAGS], [])[]dnl ]) # _KPSE_WARNING_CFLAGS # _KPSE_WARNING_CXXFLAGS # ---------------------- # Internal subroutine. # Determine and substitute WARNING_CXXFLAGS for C++ compiler. m4_define([_KPSE_WARNING_CXXFLAGS], [AC_CACHE_CHECK([what warning flags to pass to the C++ compiler], [kpse_cv_warning_cxxflags], [dnl if test "x$GXX" = xyes; then _KPSE_WARNING_GNU_CXXFLAGS([CXX], [cxxflags])[]dnl elif test "x$enable_compiler_warnings" = xno; then kpse_cv_warning_cxxflags= else kpse_cv_warning_cxxflags= # FIXME: warning flags for non-GNU C++ compilers fi]) WARNING_CXXFLAGS=$kpse_cv_warning_cxxflags AC_SUBST([WARNING_CXXFLAGS]) m4_define([_KPSE_WARNING_CXXFLAGS], [])[]dnl ]) # _KPSE_WARNING_CXXFLAGS _KPSE_WARNING_OBJCFLAGS # --------------------- # Internal subroutine. # Determine and substitute WARNING_OBJCFLAGS for Objective C compiler. AC_DEFUN([_KPSE_WARNING_OBJCFLAGS], [AC_REQUIRE([_KPSE_COMPILER_WARNINGS_OPTION])[]dnl AC_REQUIRE([AC_PROG_OBJC])[]dnl AC_CACHE_CHECK([what warning flags to pass to the Objective C compiler], [kpse_cv_warning_objcflags], [dnl if test "x$GOBJC" = xyes; then _KPSE_WARNING_GNU_CFLAGS([OBJC], [objcflags])[]dnl elif test "x$enable_compiler_warnings" = xno; then kpse_cv_warning_objcflags= else kpse_cv_warning_objcflags= # FIXME: warning flags for non-GNU Objective C compilers fi]) WARNING_OBJCFLAGS=$kpse_cv_warning_objcflags AC_SUBST([WARNING_OBJCFLAGS]) m4_define([_KPSE_WARNING_OBJCFLAGS], [])[]dnl ]) # _KPSE_WARNING_OBJCFLAGS _KPSE_WARNING_OBJCXXFLAGS # ----------------------- # Internal subroutine. # Determine and substitute WARNING_OBJCXXFLAGS for Objective C++ compiler. AC_DEFUN([_KPSE_WARNING_OBJCXXFLAGS], [AC_REQUIRE([_KPSE_COMPILER_WARNINGS_OPTION])[]dnl AC_REQUIRE([AC_PROG_OBJCXX])[]dnl AC_CACHE_CHECK([what warning flags to pass to the Objective C++ compiler], [kpse_cv_warning_objcxxflags], [dnl if test "x$GOBJCXX" = xyes; then _KPSE_WARNING_GNU_CXXFLAGS([OBJCXX], [objcxxflags])[]dnl elif test "x$enable_compiler_warnings" = xno; then kpse_cv_warning_objcxxflags= else kpse_cv_warning_objcxxflags= # FIXME: warning flags for non-GNU Objective C++ compilers fi]) WARNING_OBJCXXFLAGS=$kpse_cv_warning_objcxxflags AC_SUBST([WARNING_OBJCXXFLAGS]) m4_define([_KPSE_WARNING_OBJCXXFLAGS], [])[]dnl ]) # _KPSE_WARNING_OBJCXXFLAGS # _KPSE_WARNING_GNU_CFLAGS(COMPILER, TAG) # --------------------------------------- # Internal subroutine. # Determine warning flags for GNU (Objective) C compiler. m4_define([_KPSE_WARNING_GNU_CFLAGS], [kpse_cv_warning_$2= if test "x$enable_compiler_warnings" != xno; then kpse_cv_warning_$2="-Wimplicit -Wreturn-type" AS_CASE([`$[]$1 -dumpversion`], [3.4.* | 4.*], [kpse_cv_warning_$2="$kpse_cv_warning_$2 -Wdeclaration-after-statement"]) AS_CASE([`$[]$1 -dumpversion`], [3.@<:@234@:>@.* | 4.*], [kpse_cv_warning_$2="$kpse_cv_warning_$2 -Wno-unknown-pragmas"]) if test "x$enable_compiler_warnings" != xmin; then kpse_cv_warning_$2="-Wall -Wunused $kpse_cv_warning_$2" kpse_cv_warning_$2="$kpse_cv_warning_$2 -Wmissing-prototypes -Wmissing-declarations" if test "x$enable_compiler_warnings" != xyes; then kpse_cv_warning_$2="$kpse_cv_warning_$2 -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith" kpse_cv_warning_$2="$kpse_cv_warning_$2 -Wcast-qual -Wcast-align -Wwrite-strings" AS_CASE([`$[]$1 -dumpversion`], [3.4.* | 4.*], [kpse_cv_warning_$2="$kpse_cv_warning_$2 -Wold-style-definition"]) if test "x$enable_compiler_warnings" != xmax; then kpse_cv_warning_$2="$kpse_cv_warning_$2 -Wshadow" fi fi fi fi ]) # _KPSE_WARNING_GNU_CFLAGS # _KPSE_WARNING_GNU_CXXFLAGS(COMPILER, TAG) # ----------------------------------------- # Internal subroutine. # Determine warning flags for GNU (Objective) C++ compiler. m4_define([_KPSE_WARNING_GNU_CXXFLAGS], [kpse_cv_warning_$2= kpse_warn_strings="-Wno-write-strings" if test "x$enable_compiler_warnings" != xno; then kpse_cv_warning_$2="-Wreturn-type" AS_CASE([`$[]$1 -dumpversion`], [3.* | 4.@<:@012345@:>@.*], [kpse_cv_warning_$2="-Wimplicit $kpse_cv_warning_$2"]) AS_CASE([`$[]$1 -dumpversion`], [3.@<:@234@:>@.* | 4.*], [kpse_cv_warning_$2="$kpse_cv_warning_$2 -Wno-unknown-pragmas"]) if test "x$enable_compiler_warnings" != xmin; then kpse_cv_warning_$2="-Wall -Wunused $kpse_cv_warning_$2" if test "x$enable_compiler_warnings" != xyes; then kpse_cv_warning_$2="$kpse_cv_warning_$2 -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith" kpse_cv_warning_$2="$kpse_cv_warning_$2 -Wcast-qual -Wcast-align" kpse_warn_strings="-Wwrite-strings" if test "x$enable_compiler_warnings" != xmax; then kpse_cv_warning_$2="$kpse_cv_warning_$2 -Wshadow" fi fi fi fi kpse_cv_warning_$2="$kpse_cv_warning_$2 $kpse_warn_strings" ]) # _KPSE_WARNING_GNU_CXXFLAGS xdvik-ja-22.84.16-j1.40/m4/kpse-lt-hack.m40000664000175000017500000000263511730167472017146 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009, 2010 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_ENABLE_LT_HACK # ------------------- # Provide the configure option '--enable-libtool-hack'. AC_DEFUN([KPSE_ENABLE_LT_HACK], [AC_ARG_ENABLE([libtool-hack], AS_HELP_STRING([--enable-libtool-hack], [ignore libtool dependency_libs]))[]dnl ]) # KPSE_ENABLE_LT_HACK # KPSE_LT_HACK() # -------------- # Try to ignore libtool dependency_libs when possible, e.g., on systems # using ELF shared libraries. AC_DEFUN([KPSE_LT_HACK], [AC_REQUIRE([KPSE_ENABLE_LT_HACK])[]dnl AC_PROVIDE_IFELSE([LT_INIT], , [m4_fatal([$0: requires libtool])])[]dnl AC_PROVIDE_IFELSE([LT_OUTPUT], [m4_fatal([$0: too late])])[]dnl _LT_CONFIG_SAVE_COMMANDS([## $0: Prevent libtool from linking dependency_libs if test "x$enable_libtool_hack" = xyes; then $SED '/# Convert "-framework/i\ ## $0: ignore dependency_libs\ test "X$installed" = Xyes && dependency_libs=\ ' "$ofile" >"$cfgfile" mv "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" fi], [enable_libtool_hack='$enable_libtool_hack']) ]) # KPSE_LT_HACK xdvik-ja-22.84.16-j1.40/m4/lt~obsolete.m40000644000175000017500000001375611742727321017237 0ustar uwabamiuwabami# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # 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 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) xdvik-ja-22.84.16-j1.40/m4/README0000664000175000017500000000273611730167472015303 0ustar uwabamiuwabamiCopyright (C) 2009, 2011 Peter Breitenlohner You may freely use, modify and/or distribute this file. This directory is the central repository for Autoconf macros needed to build the TeX Live (TL) tree. (1) Public macros such as libtool.m4 used to build the libraries and programs in the TL subdirectories libs/*/, utils/*/, and texk/*/ that are owned by the TL tree, i.e., either not maintained independently or with a proxy Makefile.am using an (almost) unmodified source tree and bypassing the original build system. Note: the files libtool.m4 and ../build-aux/ltmain.sh must match. (2) `Public' macros for the TL build system and for the TL libraries in the subdirectories libs/*/, texk/kpathsea/, and texk/ptexenc, used to configure programs and other libraries requiring these TL libraries. The macros are designed with the aim that programs maintained independently can be built as part of the TL tree or without TL (using installed versions of the required libraries), ideally using the same unmodified sources. (3) `Private' macros for the TL infrastructure, only used in directories owned by the TL tree. kpse-pkgs.m4: defines lists of subdirectories libs/Lib/, utils/Util/, and tex/Prog/ with libraries and programs that can be built as part of the TL tree. kpse-setup.m4: macros that walk through these lists to provide configure options. They depend on configure fragments */*/ac/withenable.ac defining the dependencies between these libraries and programs. xdvik-ja-22.84.16-j1.40/m4/kpse-lex.m40000664000175000017500000000141011730167472016401 0ustar uwabamiuwabami# Private macros for the kpathsea library. # Copyright (C) 2003 - 2009 Karl Berry # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # KPSE_PROG_LEX() # --------------- # Like AC_PROG_LEX, with the flag '-l' for flex. AC_DEFUN([KPSE_PROG_LEX], [AC_PROG_LEX # Work around a problem with Flex Version 2.5.31 which needs -l flag. # Since all recent versions of flex support -l, don't check for the # specific version, but check that at least "--version" is supported. # We also want to catch LEX=/some/where/flex, so: case $LEX in *flex) $LEX --version >/dev/null 2>&1 && LEX="$LEX -l" ;; esac ]) # KPSE_PROG_LEX xdvik-ja-22.84.16-j1.40/m4/kpse-zlib-flags.m40000664000175000017500000000211111730167472017642 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_ZLIB_FLAGS # --------------- # Provide the configure options '--with-system-zlib' (if in the TL tree), # '--with-zlib-includes', and '--with-zlib-libdir'. # # Set the make variables ZLIB_INCLUDES and ZLIB_LIBS to the CPPFLAGS and # LIBS required for the `-lz' library in libs/zlib/ of the TL tree. AC_DEFUN([KPSE_ZLIB_FLAGS], [_KPSE_LIB_FLAGS([zlib], [z], [], [-IBLD/libs/zlib/include], [BLD/libs/zlib/libz.a], [], [], [${top_builddir}/../../libs/zlib/include/zconf.h])[]dnl ]) # KPSE_ZLIB_FLAGS # KPSE_ZLIB_OPTIONS([WITH-SYSTEM]) # -------------------------------- AC_DEFUN([KPSE_ZLIB_OPTIONS], [_KPSE_LIB_OPTIONS([zlib], [$1])]) # KPSE_ZLIB_SYSTEM_FLAGS # ---------------------- AC_DEFUN([KPSE_ZLIB_SYSTEM_FLAGS], [_KPSE_LIB_FLAGS_SYSTEM([zlib], [z])]) xdvik-ja-22.84.16-j1.40/m4/kpse-freetype2-flags.m40000664000175000017500000000417611730167472020624 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009, 2010 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_FREETYPE2_FLAGS # -------------------- # Provide the configure option '--with-system-freetype2' (if in the TL tree). # # Set the make variables FREETYPE2_INCLUDES and FREETYPE2_LIBS to the CPPFLAGS and # LIBS required for the `-lfreetype' library in libs/freetype2/ of the TL tree. AC_DEFUN([KPSE_FREETYPE2_FLAGS], [AC_REQUIRE([KPSE_ZLIB_FLAGS])[]dnl AC_REQUIRE([_KPSE_CHECK_FT2_CONFIG])[]dnl _KPSE_LIB_FLAGS([freetype2], [freetype], [lt], [BLD/libs/freetype2], [BLD/libs/freetype2/libfreetype.la], [FREETYPE2_LIBS="\`cat $FREETYPE2_INCLUDES/ft-libs\`" FREETYPE2_INCLUDES="\`cat $FREETYPE2_INCLUDES/ft-includes\`"], [], [${top_builddir}/../../libs/freetype2/ft2build.h])[]dnl ]) # KPSE_FREETYPE2_FLAGS # KPSE_FREETYPE2_OPTIONS([WITH-SYSTEM]) # ------------------------------------- AC_DEFUN([KPSE_FREETYPE2_OPTIONS], [m4_ifval([$1], [AC_ARG_WITH([system-freetype2], AS_HELP_STRING([--with-system-freetype2], [use installed freetype2 headers and library (requires freetype-config)]))])[]dnl ]) # KPSE_FREETYPE2_OPTIONS # KPSE_FREETYPE2_SYSTEM_FLAGS # --------------------------- AC_DEFUN([KPSE_FREETYPE2_SYSTEM_FLAGS], [AC_REQUIRE([_KPSE_CHECK_FT2_CONFIG])[]dnl if $FT2_CONFIG --ftversion >/dev/null 2>&1; then FREETYPE2_INCLUDES=`$FT2_CONFIG --cflags` FREETYPE2_LIBS=`$FT2_CONFIG --libs` elif test "x$need_freetype2:$with_system_freetype2" = xyes:yes; then AC_MSG_ERROR([did not find freetype-config required for system freetype2 library]) fi ]) # KPSE_FREETYPE2_SYSTEM_FLAGS # _KPSE_CHECK_FT2_CONFIG # ---------------------- # Check for freetype-config AC_DEFUN([_KPSE_CHECK_FT2_CONFIG], [AC_REQUIRE([AC_CANONICAL_HOST])[]dnl AC_CHECK_TOOL([FT2_CONFIG], [freetype-config], [false])[]dnl ]) # _KPSE_CHECK_FT2_CONFIG xdvik-ja-22.84.16-j1.40/m4/kpse-xpdf-flags.m40000664000175000017500000000335011730167472017651 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009-2011 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # KPSE_XPDF_FLAGS # --------------- # Provide the configure option '--with-system-xpdf' (if in the TL tree). # # Set the make variables XPDF_INCLUDES and XPDF_LIBS to the CPPFLAGS and # LIBS required for the `-lxpdf' library in libs/xpdf/ of the TL tree. AC_DEFUN([KPSE_XPDF_FLAGS], [_KPSE_LIB_FLAGS([xpdf], [xpdf], [], [-DPDF_PARSER_ONLY -IBLD/libs/xpdf -IBLD/libs/xpdf/goo -IBLD/libs/xpdf/xpdf], [BLD/libs/xpdf/libxpdf.a], [], [], [${top_builddir}/../../libs/xpdf/xpdf/Stream.h])[]dnl ]) # KPSE_XPDF_FLAGS # KPSE_XPDF_OPTIONS([WITH-SYSTEM]) # -------------------------------- AC_DEFUN([KPSE_XPDF_OPTIONS], [m4_ifval([$1], [AC_ARG_WITH([system-xpdf], AS_HELP_STRING([--with-system-xpdf], [use installed poppler headers and library instead of xpdf (requires pkg-config)]))])[]dnl ]) # KPSE_XPDF_OPTIONS # KPSE_XPDF_SYSTEM_FLAGS # ---------------------- AC_DEFUN([KPSE_XPDF_SYSTEM_FLAGS], [AC_REQUIRE([_KPSE_CHECK_PKG_CONFIG])[]dnl if $PKG_CONFIG poppler --atleast-version=0.12; then POPPLER_VERSION='-DPOPPLER_VERSION=\"'`$PKG_CONFIG poppler --modversion`'\"' XPDF_INCLUDES="$POPPLER_VERSION `$PKG_CONFIG poppler --cflags`" XPDF_LIBS=`$PKG_CONFIG poppler --libs` elif test "x$need_xpdf:$with_system_xpdf" = xyes:yes; then AC_MSG_ERROR([did not find poppler-0.12 or better]) fi ]) # KPSE_XPDF_SYSTEM_FLAGS xdvik-ja-22.84.16-j1.40/m4/kpse-socket-libs.m40000664000175000017500000000206211730167472020034 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 1997 Karl Berry # Copyright (C) 2009 Peter Breitenlohner # with help from Taco Hoekwater # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_CHECK_SOCKET_LIBS # ---------------------- # Set ac_cv_search_connect as AC_SEARCH_LIBS([connect], [LIB...]) # would do. # -lsocket is needed on Solaris, at least. Maybe -lnsl on SCO, too? # See AC_PATH_XTRA. # For WIN32 systems we need -lwsock32 but AC_SEARCH_LIBS would fail. AC_DEFUN([KPSE_CHECK_SOCKET_LIBS], [AC_REQUIRE([KPSE_CHECK_WIN32]) AS_IF([test "x$kpse_cv_have_win32" = xno], [kpse_save_LIBS=$LIBS AC_SEARCH_LIBS([connect], [socket nsl]) LIBS=$kpse_save_LIBS], [AC_CHECK_LIB([wsock32], [main], [ac_cv_search_connect=-lwsock32], [ac_cv_search_connect=no])]) ]) # KPSE_CHECK_SOCKET_LIBS xdvik-ja-22.84.16-j1.40/m4/kpse-libpng-flags.m40000664000175000017500000000314711730167472020167 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009, 2011 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_LIBPNG_FLAGS # ----------------- # Provide the configure options '--with-system-libpng' (if in the TL tree). # # Set the make variables LIBPNG_INCLUDES and LIBPNG_LIBS to the CPPFLAGS and # LIBS required for the `-lpng' library in libs/libpng/ of the TL tree. AC_DEFUN([KPSE_LIBPNG_FLAGS], [AC_REQUIRE([KPSE_ZLIB_FLAGS])[]dnl _KPSE_LIB_FLAGS([libpng], [png], [], [-IBLD/libs/libpng/include], [BLD/libs/libpng/libpng.a], [], [], [${top_builddir}/../../libs/libpng/include/png.h])[]dnl ]) # KPSE_LIBPNG_FLAGS # KPSE_LIBPNG_OPTIONS([WITH-SYSTEM]) # ---------------------------------- AC_DEFUN([KPSE_LIBPNG_OPTIONS], [m4_ifval([$1], [AC_ARG_WITH([system-libpng], AS_HELP_STRING([--with-system-libpng], [use installed libpng headers and library (requires pkg-config)]))])[]dnl ]) # KPSE_LIBPNG_OPTIONS # KPSE_LIBPNG_SYSTEM_FLAGS # ------------------------ AC_DEFUN([KPSE_LIBPNG_SYSTEM_FLAGS], [AC_REQUIRE([_KPSE_CHECK_PKG_CONFIG])[]dnl if $PKG_CONFIG libpng; then LIBPNG_INCLUDES=`$PKG_CONFIG libpng --cflags` LIBPNG_LIBS=`$PKG_CONFIG libpng --libs` elif test "x$need_libpng:$with_system_libpng" = xyes:yes; then AC_MSG_ERROR([did not find libpng]) fi ]) # KPSE_LIBPNG_SYSTEM_FLAGS xdvik-ja-22.84.16-j1.40/m4/kpse-cross.m40000664000175000017500000000322411730167472016747 0ustar uwabamiuwabami# Private macros for the kpathsea library. # Copyright (C) 1995 - 2009 Karl Berry # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # KPSE_CROSS_PATH_PROG(RESULT, CROSS_PROG, NORMAL_PROG) # ----------------------------------------------------- # Find a program when cross-compiling, or use a default when not. # RESULT = variable which records the outcome # CROSS_PROG = program to look for when cross-compiling # NORMAL_PROG = program to use when not cross-compiling # Example: KPSE_CROSS_PATH_PROG([TANGLE], [tangle], [./tangle]) sets # 'TANGLE' to the program 'tangle' found in PATH when cross-compiling, # and to './tangle' if not. AC_DEFUN([KPSE_CROSS_PATH_PROG], [if test "x$cross_compiling" = xyes; then AC_PATH_PROG([$1], [$2]) if test -z "${$1}"; then AC_MSG_ERROR([$2 was not found but is required when cross-compiling. Install $2 or set \$$1 to the full pathname.]) fi else $1=$3 fi ]) # KPSE_CROSS_PATH_PROG # KPSE_CROSS_BUILD_VAR(STEM, PROG) # -------------------------------- # Set BUILD$1 to $2 when cross-compiling, to $($1) if not. # Example: KPSE_CROSS_BUILD_VAR([CC], [cc]) sets 'BUILDCC' to 'cc' # if cross-compiling, and to '$(CC)' if not. AC_DEFUN([KPSE_CROSS_BUILD_VAR], [if test "x$cross_compiling" = xyes; then if test -z "${BUILD$1}"; then BUILD$1='$2' fi AC_MSG_RESULT([setting \$BUILD$1 to ${BUILD$1}]) else if test -n "${BUILD$1}"; then AC_MSG_WARN([\$BUILD$1 set but not cross-compiling.]) fi BUILD$1='$($1)' fi AC_SUBST([BUILD$1]) ]) # KPSE_CROSS_BUILD_VAR xdvik-ja-22.84.16-j1.40/m4/kpse-freetype-flags.m40000664000175000017500000000225611730167472020537 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_FREETYPE_FLAGS # ------------------- # Provide the configure options '--with-system-freetype' (if in the TL tree), # '--with-freetype-includes', and '--with-freetype-libdir'. # # Set the make variables FREETYPE_INCLUDES and FREETYPE_LIBS to the CPPFLAGS and # LIBS required for the `-lttf' library in libs/freetype/ of the TL tree. AC_DEFUN([KPSE_FREETYPE_FLAGS], [_KPSE_LIB_FLAGS([freetype], [ttf], [], [-IBLD/libs/freetype/freetype], [BLD/libs/freetype/libttf.a], [], [], [${top_builddir}/../../libs/freetype/freetype/freetype.h])[]dnl ]) # KPSE_FREETYPE_FLAGS # KPSE_FREETYPE_OPTIONS([WITH-SYSTEM]) # ------------------------------------ AC_DEFUN([KPSE_FREETYPE_OPTIONS], [_KPSE_LIB_OPTIONS([freetype], [$1])]) # KPSE_FREETYPE_SYSTEM_FLAGS # -------------------------- AC_DEFUN([KPSE_FREETYPE_SYSTEM_FLAGS], [_KPSE_LIB_FLAGS_SYSTEM([freetype], [ttf])]) xdvik-ja-22.84.16-j1.40/m4/kpse-graphite-flags.m40000664000175000017500000000336611730167472020522 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009, 2010 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_GRAPHITE_FLAGS # ------------------- # Provide the configure option '--with-system-graphite' (if in the TL tree). # # Set the make variables GRAPHITE_INCLUDES and GRAPHITE_LIBS to the CPPFLAGS # and LIBS required for the `-lgraphite' library in libs/graphite/ of the TL tree. AC_DEFUN([KPSE_GRAPHITE_FLAGS], [AC_REQUIRE([KPSE_ZLIB_FLAGS])[]dnl _KPSE_LIB_FLAGS([graphite], [graphite], [], [-IBLD/libs/graphite/include], [BLD/libs/graphite/libgraphite.a], [], [], [${top_builddir}/../../libs/graphite/include/graphite/GrClient.h])[]dnl ]) # KPSE_GRAPHITE_FLAGS # KPSE_GRAPHITE_OPTIONS([WITH-SYSTEM]) # ------------------------------------ AC_DEFUN([KPSE_GRAPHITE_OPTIONS], [m4_ifval([$1], [AC_ARG_WITH([system-graphite], AS_HELP_STRING([--with-system-graphite], [use installed silgraphite headers and library (requires pkg-config)]))])[]dnl ]) # KPSE_GRAPHITE_OPTIONS # KPSE_GRAPHITE_SYSTEM_FLAGS # -------------------------- AC_DEFUN([KPSE_GRAPHITE_SYSTEM_FLAGS], [AC_REQUIRE([_KPSE_CHECK_PKG_CONFIG])[]dnl if $PKG_CONFIG silgraphite --atleast-version=2.3; then GRAPHITE_INCLUDES="`$PKG_CONFIG silgraphite --cflags`" GRAPHITE_LIBS=`$PKG_CONFIG silgraphite --libs` elif test "x$need_graphite:$with_system_graphite" = xyes:yes; then AC_MSG_ERROR([did not find silgraphite 2.3 or better]) fi ]) # KPSE_GRAPHITE_SYSTEM_FLAGS xdvik-ja-22.84.16-j1.40/m4/kpse-poppler-flags.m40000664000175000017500000000337211730167472020375 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2011, 2012 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # KPSE_POPPLER_FLAGS # --------------- # Provide the configure option '--with-system-poppler' (if in the TL tree). # # Set the make variables POPPLER_INCLUDES and POPPLER_LIBS to the CPPFLAGS and # LIBS required for the `-lpoppler' library in libs/poppler/ of the TL tree. AC_DEFUN([KPSE_POPPLER_FLAGS], [_KPSE_LIB_FLAGS([poppler], [poppler], [], [-IBLD/libs/poppler -IBLD/libs/poppler/goo -IBLD/libs/poppler/poppler], [BLD/libs/poppler/libpoppler.a], [], [], [${top_builddir}/../../libs/poppler/poppler/Stream.h])[]dnl ]) # KPSE_POPPLER_FLAGS # KPSE_POPPLER_OPTIONS([WITH-SYSTEM]) # -------------------------------- AC_DEFUN([KPSE_POPPLER_OPTIONS], [m4_ifval([$1], [AC_ARG_WITH([system-poppler], AS_HELP_STRING([--with-system-poppler], [use installed poppler headers and library (requires pkg-config)]))])[]dnl ]) # KPSE_POPPLER_OPTIONS # KPSE_POPPLER_SYSTEM_FLAGS # ---------------------- AC_DEFUN([KPSE_POPPLER_SYSTEM_FLAGS], [AC_REQUIRE([_KPSE_CHECK_PKG_CONFIG])[]dnl if $PKG_CONFIG poppler --atleast-version=0.12; then POPPLER_VERSION='-DPOPPLER_VERSION=\"'`$PKG_CONFIG poppler --modversion`'\"' POPPLER_INCLUDES="$POPPLER_VERSION `$PKG_CONFIG poppler --cflags`" POPPLER_LIBS=`$PKG_CONFIG poppler --libs` elif test "x$need_poppler:$with_system_poppler" = xyes:yes; then AC_MSG_ERROR([did not find poppler-0.12 or better]) fi ]) # KPSE_POPPLER_SYSTEM_FLAGS xdvik-ja-22.84.16-j1.40/m4/cho-libs.m40000664000175000017500000001045311730167472016360 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 1998 - 2008 Jin-Hwan Cho # Copyright (C) 2008 - 2009 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # CHO_CHECK_ZLIB # -------------- # Check for zlib AC_DEFUN([CHO_CHECK_ZLIB], [AC_CACHE_CHECK([for zlib header files and library], [cho_cv_have_zlib], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[z_stream p;]])], [cho_cv_have_zlib=yes], [cho_cv_have_zlib=no])]) AS_IF([test "x$cho_cv_have_zlib" = xyes], [AC_CHECK_FUNCS([compress], [AC_DEFINE([HAVE_ZLIB], 1, [Define if you have zlib and its headers.]) AC_CHECK_FUNCS([compress2], [AC_DEFINE([HAVE_ZLIB_COMPRESS2], 1, [Define if your zlib has the compress2 function.])])])]) ])# CHO_CHECK_ZLIB # CHO_CHECK_LIBPNG # ---------------- # Check for libpng AC_DEFUN([CHO_CHECK_LIBPNG], [AC_CACHE_CHECK([for libpng header files and library], [cho_cv_have_png], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[png_infop p;]])], [cho_cv_have_png=yes], [cho_cv_have_png=no])]) AS_IF([test "x$cho_cv_have_png" = xyes], [AC_CHECK_FUNCS([png_get_image_width], [AC_DEFINE([HAVE_LIBPNG], 1, [Define if you have libpng and its headers.])])]) ])# CHO_CHECK_LIBPNG # CHO_CHECK_LIBPAPER # ------------------ # Check for libpaper AC_DEFUN([CHO_CHECK_LIBPAPER], [_cppflags=$CPPFLAGS _ldflags=$LDFLAGS AC_ARG_WITH([paper], [AS_HELP_STRING([--with-paper=DIR], [use paper include/library files from DIR])], [if test -d "$withval"; then CPPFLAGS="$CPPFLAGS -I$withval/include" LDFLAGS="$LDFLAGS -L$withval/lib" fi]) AC_MSG_CHECKING([for paper header files]) AC_TRY_COMPILE( [#include ], [struct paper *p;], [AC_MSG_RESULT(yes) AC_SEARCH_LIBS([paperpswidth], [paper], [AC_DEFINE(HAVE_LIBPAPER, 1, [Define if you have libpaper])])], [CPPFLAGS=$_cppflags LDDFLAGS=$_ldflags AC_MSG_RESULT(no)]) ])# CHO_CHECK_LIBPAPER # CHO_CHECK_LIBFONTCONFIG # ----------------------- # Check for libfontconfig AC_DEFUN([CHO_CHECK_LIBFONTCONFIG], [AC_CACHE_CHECK([for fontconfig header files and library], [cho_cv_have_fontconfig], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[FcObjectSet *os;]])], [cho_cv_have_fontconfig=yes], [cho_cv_have_fontconfig=no])]) AS_IF([test "x$cho_cv_have_fontconfig" = xyes], [AC_CHECK_FUNCS([FcInit], [AC_DEFINE([HAVE_LIBFONTCONFIG], 1, [Define if you have libfontconfig and its headers.])])]) ])# CHO_CHECK_LIBFONTCONFIG # CHO_CHECK_LIBFREETYPE(PACKAGE-NAME) # ----------------------------------- # Check for libfreetype, fail with error if not found AC_DEFUN([CHO_CHECK_LIBFREETYPE], [AC_CACHE_CHECK([for freetype2 header files and library], [cho_cv_have_freetype], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include #include FT_FREETYPE_H]], [[FT_Face face;]])], [cho_cv_have_freetype=yes], [cho_cv_have_freetype=no])]) AS_IF([test "x$cho_cv_have_freetype" = xyes], [AC_CHECK_FUNCS([FT_Init_FreeType], [AC_DEFINE([HAVE_LIBFREETYPE], 1, [Define if you have libfreetype and its headers.])])], [AC_MSG_ERROR([This version of $1 requires that FreeType2 and its headers be available. You can use the --with-freetype2-includes and/or --with-freetype2-libdir options to indicate the location of the installed freetype2 library and headers.])]) ])# CHO_CHECK_LIBFREETYPE xdvik-ja-22.84.16-j1.40/m4/kpse-gd-flags.m40000664000175000017500000000217011730167472017301 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009, 2010 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_GD_FLAGS # ------------- # Provide the configure options '--with-system-gd' (if in the TL tree), # '--with-gd-includes', and '--with-gd-libdir'. # # Set the make variables GD_INCLUDES and GD_LIBS to the CPPFLAGS and # LIBS required for the `-lgd' library in libs/gd/ of the TL tree. AC_DEFUN([KPSE_GD_FLAGS], [AC_REQUIRE([KPSE_LIBPNG_FLAGS])[]dnl AC_REQUIRE([KPSE_FREETYPE2_FLAGS])[]dnl _KPSE_LIB_FLAGS([gd], [gd], [], [-IBLD/libs/gd/include -DNONDLL], [BLD/libs/gd/libgd.a], [], [], [${top_builddir}/../../libs/gd/include/gd.h])[]dnl ]) # KPSE_GD_FLAGS # KPSE_GD_OPTIONS([WITH-SYSTEM]) # ------------------------------ AC_DEFUN([KPSE_GD_OPTIONS], [_KPSE_LIB_OPTIONS([gd], [$1])]) # KPSE_GD_SYSTEM_FLAGS # -------------------- AC_DEFUN([KPSE_GD_SYSTEM_FLAGS], [_KPSE_LIB_FLAGS_SYSTEM([gd], [gd])]) xdvik-ja-22.84.16-j1.40/m4/kpse-zziplib-flags.m40000664000175000017500000000334511730167472020377 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2010 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_ZZIPLIB_FLAGS # ----------------- # Provide the configure options '--with-system-zziplib' (if in the TL tree), # '--with-zziplib-includes', and '--with-zziplib-libdir'. # # Set the make variables ZZIPLIB_INCLUDES and ZZIPLIB_LIBS to the CPPFLAGS and # LIBS required for the `-lpng' library in libs/zziplib/ of the TL tree. AC_DEFUN([KPSE_ZZIPLIB_FLAGS], [AC_REQUIRE([KPSE_ZLIB_FLAGS])[]dnl _KPSE_LIB_FLAGS([zziplib], [zzip], [], [-IBLD/libs/zziplib/include], [BLD/libs/zziplib/libzzip.a], [], [], [${top_builddir}/../../libs/zziplib/include/zzip/zzip.h])[]dnl ]) # KPSE_ZZIPLIB_FLAGS # KPSE_ZZIPLIB_OPTIONS([WITH-SYSTEM]) # ---------------------------------- AC_DEFUN([KPSE_ZZIPLIB_OPTIONS], [m4_ifval([$1], [AC_ARG_WITH([system-zziplib], AS_HELP_STRING([--with-system-zziplib], [use installed zziplib headers and library (requires pkg-config)]))])[]dnl ]) # KPSE_ZZIPLIB_OPTIONS # KPSE_ZZIPLIB_SYSTEM_FLAGS # ------------------------ AC_DEFUN([KPSE_ZZIPLIB_SYSTEM_FLAGS], [AC_REQUIRE([_KPSE_CHECK_PKG_CONFIG])[]dnl if $PKG_CONFIG zziplib --atleast-version=0.12; then ZZIPLIB_INCLUDES=`$PKG_CONFIG zziplib --cflags` ZZIPLIB_LIBS=`$PKG_CONFIG zziplib --libs` elif test "x$need_zziplib:$with_system_zziplib" = xyes:yes; then AC_MSG_ERROR([did not find zziplib-0.12 or better]) fi ]) # KPSE_ZZIPLIB_SYSTEM_FLAGS xdvik-ja-22.84.16-j1.40/m4/ltversion.m40000644000175000017500000000126211742727321016677 0ustar uwabamiuwabami# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # 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. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) xdvik-ja-22.84.16-j1.40/m4/kpse-ptexenc-flags.m40000664000175000017500000000230511730167472020355 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2010 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_PTEXENC_FLAGS # ------------------ # Provide the configure options '--with-system-ptexenc' (if in the TL tree), # '--with-ptexenc-includes', and '--with-ptexenc-libdir'. # # Set the make variables PTEXENC_INCLUDES and PTEXENC_LIBS to the CPPFLAGS and # LIBS required for the `-lptexenc' library in texk/ptexenc/ of the TL tree. AC_DEFUN([KPSE_PTEXENC_FLAGS], [_KPSE_TEXLIB_FLAGS([ptexenc], [ptexenc], [lt], [-IBLD/texk/ptexenc -ISRC/texk/ptexenc], [BLD/texk/ptexenc/libptexenc.la], [], [${top_srcdir}/../ptexenc/*.c ${top_srcdir}/../ptexenc/ptexenc/*.h])[]dnl ]) # KPSE_PTEXENC_FLAGS # KPSE_PTEXENC_OPTIONS([WITH-SYSTEM]) # ----------------------------------- AC_DEFUN([KPSE_PTEXENC_OPTIONS], [_KPSE_LIB_OPTIONS([ptexenc], [$1])]) # KPSE_PTEXENC_SYSTEM_FLAGS # ------------------------- AC_DEFUN([KPSE_PTEXENC_SYSTEM_FLAGS], [_KPSE_LIB_FLAGS_SYSTEM([ptexenc], [ptexenc])]) xdvik-ja-22.84.16-j1.40/m4/kpse-web2c.m40000664000175000017500000000553311730167472016625 0ustar uwabamiuwabami# Private macros for the TeX Live (TL) tree. # Copyright (C) 2009-2011 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # KPSE_WEB2C_PREPARE # ------------------ # AC_DEFUN'ed so it can enforce inclusion of this file. AC_DEFUN([KPSE_WEB2C_PREPARE], []) # KPSE_WITH_XTEX(PROG, BUILD-OR-NO, SYNC-OR-NO, TEXT, REQUIRED-LIBS) # ------------------------------------------------------------------ # Provide and normalize the configure options --enable-*tex. m4_define([KPSE_WITH_XTEX], [AC_ARG_ENABLE([$1], AS_HELP_STRING([--]m4_if([$2], [yes], [dis], [en])[able-$1], m4_if([$2], [yes], [do not ])[compile and install $4], kpse_indent_26))[]dnl AS_CASE([$enable_$1], [yes | no], , [enable_$1=$2]) m4_ifval([$3], [ AC_ARG_ENABLE([$1-synctex], AS_HELP_STRING([--]m4_if([$3], [yes], [dis], [en])[able-$1-synctex], [build $4 with]m4_if([$3], [yes], [out])[ SyncTeX support], m4_eval(kpse_indent_26+2)))[]dnl ])[]dnl m4_ifval m4_ifval([$5], [ test "x$enable_web2c:$enable_$1" = xyes:yes && { AC_FOREACH([Kpse_Lib], [$5], [ need_[]AS_TR_SH(Kpse_Lib)=yes ])} ])[]dnl m4_ifval ]) # KPSE_WITH_XTEX # KPSE_XTEX_COND(PROG, BUILD-OR-NO, SYNC-OR-NO, TEXT, REQUIRED-LIBS) # ------------------------------------------------------------------ # Normalize --enable-*tex-synctex configure option and build conditionals. m4_define([KPSE_XTEX_COND], [AM_CONDITIONAL(AS_TR_CPP($1), [test "x$enable_$1" = xyes])[]dnl m4_ifval([$3], [ AS_CASE([$enable_native_texlive_build:$enable_$1_synctex], [yes:$3 | no:yes | no:no], , [AS_IF([test -z "$enable_$1_synctex"], [AC_MSG_NOTICE([Assuming `--enable-$1-synctex=$3'])], [AC_MSG_WARN([Enforcing `--enable-$1-synctex=$3' (native TeX Live build)])]) enable_$1_synctex=$3]) AM_CONDITIONAL(AS_TR_CPP($1)[_SYNCTEX], [test "x$enable_$1_synctex" = xyes])[]dnl ])[]dnl m4_ifval ]) # KPSE_XTEX_COND # KPSE_WITH_MFWIN(WINDOW, DEFINE, TEXT) # ------------------------------------- # Provide configure options --enable-*win. m4_define([KPSE_WITH_MFWIN], [AC_ARG_ENABLE([$1win], AS_HELP_STRING([--enable-$1win], [include $3 window support], m4_eval(kpse_indent_26+2)))[]dnl ]) # KPSE_WITH_MFWIN # KPSE_MFWIN_DEFINE(WINDOW, DEFINE, TEXT) # --------------------------------------- # Defines for enable-*win m4_define([KPSE_MFWIN_DEFINE], [AS_IF([test "x$enable_$1win" = xyes], [AC_DEFINE([$2WIN], , [metafont: Define to include $3 window support.])]) ]) # KPSE_MFWIN_DEFINE xdvik-ja-22.84.16-j1.40/m4/kpse-fontconfig-flags.m40000664000175000017500000000477011730167472021053 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_FONTCONFIG_FLAGS # --------------------- # Provide the configure option '--with-fontconfig' and check for # installed fontconfig headers and library. # Check or set the cache variables kpse_cv_have_fontconfig, # kpse_cv_fontconfig_includes, and kpse_cv_fontconfig_libs. # If found set the Make variables FONTCONFIG_INCLUDES and FONTCONFIG_LIBS # to the CPPFLAGS and LIBS required for the installed '-lfontconfig' # library and define HAVE_LIBFONTCONFIG. AC_DEFUN([KPSE_FONTCONFIG_FLAGS], [AC_REQUIRE([_KPSE_CHECK_PKG_CONFIG])[]dnl AC_ARG_WITH([fontconfig-includes], AS_HELP_STRING([--with-fontconfig-includes=DIR], [fontconfig headers installed in DIR]))[]dnl AC_ARG_WITH([fontconfig-libdir], AS_HELP_STRING([--with-fontconfig-libdir=DIR], [fontconfig library installed in DIR]))[]dnl AC_CACHE_CHECK([for installed fontconfig headers and library], [kpse_cv_have_fontconfig], [kpse_save_CPPFLAGS=$CPPFLAGS kpse_save_LIBS=$LIBS kpse_cv_fontconfig_includes= kpse_cv_fontconfig_libs='-lfontconfig' if test "x$with_fontconfig_includes:$with_fontconfig_libdir" != x:; then if test "x$with_fontconfig_includes" != x; then kpse_cv_fontconfig_includes="-I$with_fontconfig_includes" fi if test "x$with_fontconfig_libdir" != x; then kpse_cv_fontconfig_libs="-L$with_fontconfig_libdir $kpse_cv_fontconfig_libs" fi elif $PKG_CONFIG fontconfig; then kpse_cv_fontconfig_includes=`$PKG_CONFIG fontconfig --cflags` kpse_cv_fontconfig_libs=`$PKG_CONFIG fontconfig --libs` fi CPPFLAGS="$kpse_cv_fontconfig_includes $CPPFLAGS" LIBS="$kpse_cv_fontconfig_libs $LIBS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[FcObjectSet *os; FcInit();]])], [kpse_cv_have_fontconfig=yes], [kpse_cv_have_fontconfig=no]) CPPFLAGS=$kpse_save_CPPFLAGS LIBS=$kpse_save_LIBS]) if test "x$kpse_cv_have_fontconfig" = xyes; then FONTCONFIG_INCLUDES=$kpse_cv_fontconfig_includes FONTCONFIG_LIBS=$kpse_cv_fontconfig_libs AC_DEFINE([HAVE_LIBFONTCONFIG], 1, [Define if you have libfontconfig.]) fi AC_SUBST([FONTCONFIG_INCLUDES]) AC_SUBST([FONTCONFIG_LIBS]) ]) # KPSE_FONTCONFIG_FLAGS xdvik-ja-22.84.16-j1.40/m4/kpse-win32.m40000664000175000017500000000210011730167472016550 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_CHECK_WIN32 # ---------------- # Check for WIN32 and distinguish between MINGW32 and native. AC_DEFUN([KPSE_CHECK_WIN32], [AC_CACHE_CHECK([for native WIN32 or MINGW32], [kpse_cv_have_win32], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#ifndef WIN32 choke me #endif]], [[]])], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#ifndef __MINGW32__ choke me #endif]], [[]])], [kpse_cv_have_win32=mingw32], [kpse_cv_have_win32=native])], [kpse_cv_have_win32=no])]) ]) # KPSE_CHECK_WIN32 xdvik-ja-22.84.16-j1.40/m4/kpse-kpathsea-flags.m40000664000175000017500000000642011730167472020511 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009, 2010 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_KPATHSEA_FLAGS([OPTIONS]) # ------------------------------ # Provide the configure options '--with-system-kpathsea' (if in the TL tree), # '--with-kpathsea-includes', and '--with-kpathsea-libdir'. # Options: # no-debug - add '-DNO_DEBUG' to KPATHSEA_INCLUDES even if not needed # # Set the make variables KPATHSEA_INCLUDES and KPATHSEA_LIBS to the CPPFLAGS and # LIBS required for the `-lkpathsea' library in texk/kpathsea/ of the TL tree. AC_DEFUN([KPSE_KPATHSEA_FLAGS], [AC_REQUIRE([KPSE_SAVE_FLAGS])[]dnl _KPSE_TEXLIB_FLAGS([kpathsea], [kpathsea], [lt], [-IBLD/texk -ISRC/texk], [BLD/texk/kpathsea/libkpathsea.la], [], [${top_srcdir}/../kpathsea/*.[ch]], [${top_builddir}/../kpathsea/paths.h]) m4_if(m4_index([ $1 ], [ no-debug ]), [-1], [_KPSE_CHECK_KPSE_DEBUG], [KPATHSEA_INCLUDES="$KPATHSEA_INCLUDES -DNO_DEBUG"]) ]) # KPSE_KPATHSEA_FLAGS # KPSE_KPATHSEA_OPTIONS([WITH-SYSTEM]) # ------------------------------------ AC_DEFUN([KPSE_KPATHSEA_OPTIONS], [_KPSE_LIB_OPTIONS([kpathsea], [$1])]) # _KPSE_CHECK_KPSE_DEBUG # ---------------------- # Internal subroutine to check if libkpathsea supports debugging. m4_define([_KPSE_CHECK_KPSE_DEBUG], [AC_CACHE_CHECK([if libkpathsea supports debugging], [kpse_cv_kpse_debug], [KPSE_ADD_FLAGS([kpathsea]) AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[FILE *f = fopen("f", "r")]])], [kpse_cv_kpse_debug=yes], [kpse_cv_kpse_debug=no]) KPSE_RESTORE_FLAGS]) AS_IF([test "x$kpse_cv_kpse_debug" != xyes], [KPATHSEA_INCLUDES="$KPATHSEA_INCLUDES -DNO_DEBUG"])[]dnl ]) # _KPSE_CHECK_KPSE_DEBUG # KPSE_KPATHSEA_SYSTEM_FLAGS # -------------------------- AC_DEFUN([KPSE_KPATHSEA_SYSTEM_FLAGS], [_KPSE_LIB_FLAGS_SYSTEM([kpathsea], [kpathsea])]) # KPSE_CHECK_KPSE_FORMAT(FORMAT, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # ---------------------------------------------------------------- # Check whether kpathsea declares the kpse_FORMAT_format. AC_DEFUN([KPSE_CHECK_KPSE_FORMAT], [AC_CACHE_CHECK([whether kpathsea declares the kpse_$1_format], [kpse_cv_have_$1_format], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[kpse_$1_format]])], [kpse_cv_have_$1_format=yes], [kpse_cv_have_$1_format=no])]) AS_IF([test "x$kpse_cv_have_$1_format" = xyes], [$2], [$3]) ]) # KPSE_CHECK_KPSE_FORMAT # KPSE_CHECK_XBASENAME([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # -------------------------------------------------------------- # Check whether kpathsea declares xbasename(). AC_DEFUN([KPSE_CHECK_XBASENAME], [AC_CHECK_DECL([xbasename], [$1], [$2], [[#include ]]) ]) # KPSE_CHECK_XBASENAME xdvik-ja-22.84.16-j1.40/m4/ltsugar.m40000644000175000017500000001042411742727321016333 0ustar uwabamiuwabami# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # 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 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) xdvik-ja-22.84.16-j1.40/m4/kpse-obsdcompat-flags.m40000664000175000017500000000150311730167472021041 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_OBSDCOMPAT_FLAGS # --------------------- # Set the make variables OBSDCOMPAT_INCLUDES and OBSDCOMPAT_LIBS to # the CPPFLAGS and LIBS required for the `-lobsdcompat' library in # libs/obsdcompat/ of the TL tree. AC_DEFUN([KPSE_OBSDCOMPAT_FLAGS], [_KPSE_LIB_FLAGS([obsdcompat], [openbsd-compat], [tree], [-IBLD/libs/obsdcompat -ISRC/libs/obsdcompat], [BLD/libs/obsdcompat/libopenbsd-compat.a], [], [], [${top_srcdir}/../../libs/obsdcompat/*.[ch]])[]dnl ]) # KPSE_OBSDCOMPAT_FLAGS xdvik-ja-22.84.16-j1.40/m4/kpse-progs.m40000664000175000017500000000140611730167472016750 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2011 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # KPSE_CHECK_LATEX # ---------------- AC_DEFUN([KPSE_CHECK_LATEX], [AC_ARG_VAR([LATEX], [LaTeX command]) AC_CHECK_PROGS([LATEX], [latex elatex lambda], [no])]) # KPSE_CHECK_PDFLATEX # ------------------- AC_DEFUN([KPSE_CHECK_PDFLATEX], [AC_ARG_VAR([PDFLATEX], [pdfLaTeX command]) AC_CHECK_PROGS([PDFLATEX], [pdflatex], [no])]) # KPSE_CHECK_PERL # --------------- AC_DEFUN([KPSE_CHECK_PERL], [AC_ARG_VAR([PERL], [Perl interpreter command]) AC_CHECK_PROGS([PERL], [perl perl5], [no])]) xdvik-ja-22.84.16-j1.40/m4/kpse-t1lib-flags.m40000664000175000017500000000212311730167472017720 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_T1LIB_FLAGS # ---------------- # Provide the configure options '--with-system-t1lib' (if in the TL tree), # '--with-t1lib-includes', and '--with-t1lib-libdir'. # # Set the make variables T1LIB_INCLUDES and T1LIB_LIBS to the CPPFLAGS and # LIBS required for the `-lt1' library in libs/t1lib/ of the TL tree. AC_DEFUN([KPSE_T1LIB_FLAGS], [_KPSE_LIB_FLAGS([t1lib], [t1], [], [-IBLD/libs/t1lib], [BLD/libs/t1lib/libt1.a], [], [], [${top_builddir}/../../libs/t1lib/t1lib.h])[]dnl ]) # KPSE_T1LIB_FLAGS # KPSE_T1LIB_OPTIONS([WITH-SYSTEM]) # --------------------------------- AC_DEFUN([KPSE_T1LIB_OPTIONS], [_KPSE_LIB_OPTIONS([t1lib], [$1])]) # KPSE_T1LIB_SYSTEM_FLAGS # ----------------------- AC_DEFUN([KPSE_T1LIB_SYSTEM_FLAGS], [_KPSE_LIB_FLAGS_SYSTEM([t1lib], [t1])]) xdvik-ja-22.84.16-j1.40/m4/kpse-asm.m40000664000175000017500000000240611730167472016377 0ustar uwabamiuwabami# Private macro for the TeX Live (TL) tree. # Copyright (C) 1996 - 2009 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # KPSE_ASM_UNDERSCORE # ------------------- # Check if gcc asm for i386 needs external symbols with an underscore. AC_DEFUN([KPSE_ASM_UNDERSCORE], [AC_CACHE_CHECK([whether gcc asm needs underscore], [pb_cv_asm_underscore], [ # Some versions of GCC asm for i386 need an underscore prepended to # external symbols. Figure out if this is so. AC_LINK_IFELSE([AC_LANG_PROGRAM([[ extern char val ; extern void sub () ; #if defined (__i386__) && defined (__GNUC__) asm(" .align 4\n" ".globl sub\n" "sub:\n" " movb \$][1,val\n" " ret\n"); #else void sub () { val = 1; } #endif /* assembler */ char val ;]], [[sub (); return 0;]])], [pb_cv_asm_underscore=no], [pb_cv_asm_underscore=yes])]) if test "x$pb_cv_asm_underscore" = xyes; then AC_DEFINE([ASM_NEEDS_UNDERSCORE], 1, [web2c: Define if gcc asm needs _ on external symbols.]) fi ]) # KPSE_ASM_UNDERSCORE xdvik-ja-22.84.16-j1.40/m4/kpse-setup.m40000664000175000017500000002336311730167472016764 0ustar uwabamiuwabami# Private macros for the TeX Live (TL) tree. # Copyright (C) 2009-2012 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # KPSE_SETUP(TOP-LEVEL) # --------------------- # Initialize path prefix kpse_TL to top-level TeX Live (TL) directory. # Sinclude all withenable.ac files providing: # configure options --with-system-LIB, --with-LIB-includes, and --with-LIB-libdir # for libraries # configure option --disable-PKG or --enable-PKG for programs # additional program specific configure options (if any) # library dependencies for programs and libraries AC_DEFUN([KPSE_SETUP], [AC_REQUIRE([_KPSE_MSG_WARN_PREPARE])[]dnl m4_define([kpse_TL], [$1])[]dnl m4_define([kpse_indent_26], [28])[]dnl AC_ARG_ENABLE([all-pkgs], AS_HELP_STRING([--disable-all-pkgs], [do not build packages unless explicitly enabled]))[]dnl test "x$enable_all_pkgs" = xno || enable_all_pkgs=yes AC_ARG_ENABLE([native-texlive-build], AS_HELP_STRING([--disable-native-texlive-build], [do not build for the TeX Live binary distribution]))[]dnl AS_CASE([$enable_native_texlive_build], [yes | no], [:], [enable_native_texlive_build=yes ac_configure_args="$ac_configure_args '--enable-native-texlive-build'"]) AS_CASE([$enable_largefile], [yes | no], [:], [enable_largefile=yes ac_configure_args="$ac_configure_args '--enable-largefile'"]) AS_CASE([$enable_multiplatform], [yes | no], [:], [enable_multiplatform=$enable_native_texlive_build ac_configure_args="$ac_configure_args '--enable-multiplatform=$enable_native_texlive_build'"]) AS_CASE([$enable_cxx_runtime_hack], [yes | no], [:], [enable_cxx_runtime_hack=$enable_native_texlive_build ac_configure_args="$ac_configure_args '--enable-cxx-runtime-hack=$enable_native_texlive_build'"]) AS_CASE([$enable_libtool_hack], [yes | no], [:], [AS_CASE([$host_os], [do-not-match], [enable_libtool_hack=no], [enable_libtool_hack=yes]) ac_configure_args="$ac_configure_args '--enable-libtool-hack=$enable_libtool_hack'"]) AS_CASE([$enable_shared], [no], [:], [yes ], [AS_IF([test "x$enable_native_texlive_build" = xyes], [AC_MSG_ERROR([you can not use a shared Kpathsea library for a native TeX Live build])])], [enable_shared=no ac_configure_args="$ac_configure_args '--disable-shared'"]) dnl Automatically pass this option to all subdirectories. AS_CASE([$enable_texlive_build], [yes], [:], [no], [AC_MSG_ERROR([you can not configure the TeX Live tree with `--disable-texlive-build'])], [enable_texlive_build=yes ac_configure_args="$ac_configure_args '--enable-texlive-build'"]) KPSE_OPTIONS KPSE_ENABLE_CXX_HACK KPSE_ENABLE_LT_HACK KPSE_LIBS_PREPARE KPSE_MKTEX_PREPARE KPSE_WEB2C_PREPARE KPSE_CHECK_WIN32 AS_CASE([$with_x:$kpse_cv_have_win32], [yes:no | no:*], [:], [yes:*], [AC_MSG_ERROR([you can not use `--with-x' for WIN32])], [*:no], [with_x=yes AC_MSG_NOTICE([Assuming `--with-x']) ac_configure_args="$ac_configure_args '--with-x'"], [with_x=no AC_MSG_NOTICE([WIN32 -> `--without-x']) ac_configure_args="$ac_configure_args '--without-x'"]) KPSE_FOR_PKGS([utils], [m4_sinclude(kpse_TL[utils/]Kpse_Pkg[/ac/withenable.ac])]) KPSE_FOR_PKGS([texk], [m4_sinclude(kpse_TL[texk/]Kpse_Pkg[/ac/withenable.ac])]) KPSE_FOR_PKGS([libs], [m4_sinclude(kpse_TL[libs/]Kpse_Pkg[/ac/withenable.ac])]) KPSE_FOR_PKGS([texlibs], [m4_sinclude(kpse_TL[texk/]Kpse_Pkg[/ac/withenable.ac])]) ]) # KPSE_SETUP # KPSE_ENABLE_PROG(PROG, REQUIRED-LIBS, OPTIONS, [COMMENT]) # --------------------------------------------------------- # Provide the configure option --enable-PROG if the option `disable' is # specified, or -disable-PROG otherwise. # Define the list of libraries required from the TL tree (if any). # Options: # disable - do not build by default # native - impossible to cross compile # x - requires X11 AC_DEFUN([KPSE_ENABLE_PROG], [m4_pushdef([Kpse_enable], m4_if(m4_index([ $3 ], [ disable ]), [-1], [yes], [no]))[]dnl AC_ARG_ENABLE([$1], AS_HELP_STRING([[--]m4_if(Kpse_enable, [yes], [dis], [en])[able-$1]], m4_if(Kpse_enable, [yes], [do not ])[build the $1 ]m4_ifval([$4], [($4) ])[package]))[]dnl m4_if(m4_index([ $3 ], [ x ]), [-1], , [AS_IF([test "x$with_x" = xno], [AS_CASE([$enable_[]AS_TR_SH($1)], [""], [AC_MSG_NOTICE([`--without-x' -> `--disable-$1']) enable_[]AS_TR_SH($1)=no ac_configure_args="$ac_configure_args '--disable-$1'"], [yes], [AC_MSG_ERROR([Sorry, incompatible options `--without-x' and `--enable-$1'])])]) ])[]dnl m4_if AS_CASE([$enable_[]AS_TR_SH($1)], m4_if(m4_index([ $3 ], [ native ]), [-1], [[yes|no], []], [[yes], [AS_IF([test "x$cross_compiling" = xyes], [AC_MSG_ERROR([Unable to cross compile $1])])], [no], []]), [m4_if(m4_index([ $3 ], [ native ]), [-1], , [if test "x$cross_compiling" = xyes; then AC_MSG_NOTICE([Cross compiling -> `--disable-$1']) enable_[]AS_TR_SH($1)=no ac_configure_args="$ac_configure_args '--disable-$1'" else]) enable_[]AS_TR_SH($1)=m4_if(Kpse_enable, [yes], [$enable_all_pkgs], [no]) AC_MSG_NOTICE([Assuming `--enable-$1=$enable_]AS_TR_SH($1)[']) ac_configure_args="$ac_configure_args '--enable-$1=$enable_[]AS_TR_SH($1)'" m4_if(m4_index([ $3 ], [ native ]), [-1], , [fi])]) m4_popdef([Kpse_enable])[]dnl m4_ifval([$2], [ test "x$enable_[]AS_TR_SH($1)" = xno || { AC_FOREACH([Kpse_Lib], [$2], [ need_[]AS_TR_SH(Kpse_Lib)=yes ])} ])[]dnl m4_ifval ]) # KPSE_ENABLE_PROG # KPSE_WITH_LIB(LIB, REQUIRED-LIBS, OPTIONS) # ------------------------------------------ # For generic libraries in libs/LIB. # Unless the option `tree' is specified, provide the configure options # --with-system-LIB, --with-LIB-includes, and --with-LIB-libdir. # Define the list of libraries required from the TL tree (if any). # Options: # tree - only use library from the TL tree # # At the top-level we build a (reversed) list of potential system libraries. AC_DEFUN([KPSE_WITH_LIB], [_KPSE_WITH_LIB([libs], $@)]) m4_define([kpse_sys_libs_pkgs], [])[]dnl initialize the list. # KPSE_WITH_TEXLIB(LIB, REQUIRED-LIBS, OPTIONS) # --------------------------------------------- # As above, but for TeX specific libraries in texk/LIB. AC_DEFUN([KPSE_WITH_TEXLIB], [_KPSE_WITH_LIB([texk], $@)]) m4_define([kpse_sys_texk_pkgs], [])[]dnl initialize the list. # _KPSE_WITH_LIB(DIR, LIB, REQUIRED-LIBS, OPTIONS) # ------------------------------------------------ # Internal subroutine for KPSE_WITH_LIB and KPSE_WITH_TEXLIB. m4_define([_KPSE_WITH_LIB], [m4_if(m4_index([ $4 ], [ tree ]), [-1], [KPSE_]AS_TR_CPP([$2])[_OPTIONS([with-system])[]dnl if test "x$with_system_[]AS_TR_SH($2)" = x; then if test -f $srcdir/kpse_TL[]$1/$2/configure; then AC_MSG_NOTICE([Assuming `$2' headers and library from TL tree]) with_system_[]AS_TR_SH($2)=no else AC_MSG_NOTICE([Assuming installed `$2' headers and library]) with_system_[]AS_TR_SH($2)=yes fi ac_configure_args="$ac_configure_args '--with-system-$2=$with_system_[]AS_TR_SH($2)'" m4_ifset([kpse_TL], [], dnl top level only [elif test "x$with_system_[]AS_TR_SH($2)" = xyes; then AC_MSG_NOTICE([Using installed `$2' headers and library]) else AC_MSG_NOTICE([Using `$2' headers and library from TL tree]) if test "x$with_system_[]AS_TR_SH($2)" != xno; then with_system_[]AS_TR_SH($2)=no ac_configure_args="$ac_configure_args '--without-system-$2'" fi m4_define([kpse_sys_$1_pkgs], [$2]m4_ifval([kpse_sys_$1_pkgs], [ _m4_defn([kpse_sys_$1_pkgs])]))[]dnl ])[]dnl m4_ifset fi m4_ifval([$3], [if test "x$with_system_[]AS_TR_SH($2)" = xyes; then AC_FOREACH([Kpse_Lib], [$3], [ if test "x$with_system_[]AS_TR_SH(Kpse_Lib)" = x; then AC_MSG_NOTICE([ -> installed `AS_TR_SH(Kpse_Lib)' headers and library]) with_system_[]AS_TR_SH(Kpse_Lib)=yes ac_configure_args="$ac_configure_args '--with-system-Kpse_Lib'" elif test "x$with_system_[]AS_TR_SH(Kpse_Lib)" != xyes; then AC_MSG_ERROR([Sorry, `--with-system-$2' requires `--with-system-Kpse_Lib']) fi ])fi ])[]dnl m4_ifval ])[]dnl m4_if m4_ifval([$3], [ test "x$need_[]AS_TR_SH($2)" = xyes && { AC_FOREACH([Kpse_Lib], [$3], [ need_[]AS_TR_SH(Kpse_Lib)=yes ])} ])[]dnl m4_ifval ]) # _KPSE_WITH_LIB # KPSE_TRY_LIB(LIB, PROLOGUE, BODY) # --------------------------------- # When the user requests to use an installed version of a required library, # check that the flags derived from --with-LIB-includes and --with-LIB-libdir # or determined otherwise provide the required functionality. AC_DEFUN([KPSE_TRY_LIB], [if test "x$need_[]AS_TR_SH($1):$with_system_[]AS_TR_SH($1)" = xyes:yes; then AC_MSG_CHECKING([requested system `$1' library]) CPPFLAGS="$AS_TR_CPP($1)_INCLUDES $CPPFLAGS" LIBS="$AS_TR_CPP($1)_LIBS $LIBS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[$2]], [[$3]])], [syslib_used=yes kpse_res=ok], [syslib_status=no kpse_res=failed]) AC_MSG_RESULT([$kpse_res]) fi ]) # KPSE_TRY_LIB # KPSE_TRY_LIBXX(LIB, PROLOGUE, BODY) # ----------------------------------- # As above, but for C++. AC_DEFUN([KPSE_TRY_LIBXX], [AC_REQUIRE([AC_PROG_CXX])[]dnl AC_LANG_PUSH([C++])[]dnl KPSE_TRY_LIB($@)[]dnl AC_LANG_POP([C++])[]dnl ]) # KPSE_TRY_LIBXX xdvik-ja-22.84.16-j1.40/m4/ChangeLog0000664000175000017500000000533411730167472016172 0ustar uwabamiuwabami2012-02-23 Peter Breitenlohner * kpse-warnings.m4: Drop `-Wimplicit' for g++ >= 4.6. 2012-01-16 Peter Breitenlohner * kpse-setup.m4 (KPSE_SETUP): Normalize `enable_largefile'. 2012-01-13 Peter Breitenlohner * kpse-poppler-flags.m4: Drop `-DPDF_PARSER_ONLY'. 2011-12-06 Peter Breitenlohner * kpse-web2c.m4: Modify msgs when setting enable_*TeX_synctex. 2011-08-26 Karl Berry * kpse-pkgs.m4 (KPSE_UTILS_PKGS): rm dialog. See comments in texk/tetex/ChangeLog. 2011-07-15 Peter Breitenlohner * kpse-lib-version.m4 (new): Split FOO_version into FOO_major, FOO_minor, and FOO_micro; build FOO_LT_VERSINFO. 2011-07-12 Peter Breitenlohner * kpse-xpdf-flags.m4: Require system (poppler) version >= 0.12. * kpse-poppler-flags.m4: Fixed a typo. * README: Updated. * kpse-warnings.m4 [WARNING_CXXFLAGS, WARNING_OBJCXXFLAGS]: For g++ always use either -Wno-write-strings or -Wwrite-strings because the default for C++ has changed with gcc-4.4. * kpse-web2c.m4: Added configure options `--enable-*-synctex', moved handling of `--enable-mktex*-default' from here ... * kpse-mktex.m4: ... to this new file. * kpse-setup.m4: Added KPSE_MKTEX_PREPARE. 2011-03-07 Peter Breitenlohner * kpse-common.m4 (KPSE_COMMON): Remove check for program_invocation_name. 2010-04-11 Karl Berry * kpse-pkgs.m4 (KPSE_TEXK_PKGS): add ptexenc, makejvf, mendexk. From Akira and Norbert. * kpse-ptexenc-flags.m4: new file. 2010-03-29 Peter Breitenlohner * kpse-icu-flags.m4 (KPSE_ICU_SYSTEM_FLAGS): Work around bug in icu-config version 4.4. * kpse-common.m4 (KPSE_COMMON): Added AC_TYPE_SIZE_T. 2010-02-20 Peter Breitenlohner * kpse-common.m4 (KPSE_COMMON): Use LT_INIT([win32-dll]). * kpse-gd-flags.m4 (KPSE_GD_FLAGS): Add -DNONDLL. 2010-02-12 Peter Breitenlohner * kpse-kpathsea-flags.m4: Detect if libkpathsea was compiled without debugging support and add '-DNODEBUG' if necessary. 2010-02-02 Peter Breitenlohner * kpse-warnings.m4: Redefine compiler warning levels to reduce the number of 'min' warnings. 2009-11-12 Peter Breitenlohner * kpse-setup.m4: Disable cross compilation of xindy. * configure.ac: Report absolute build and source dir; reject paths with embedded spaces. 2009-09-01 Peter Breitenlohner * kpse-warnings.m4: Additional level 'all' of compiler warnings, 'max' now without the extremely noisy -Wshadow. 2009-08-17 Peter Breitenlohner * kpse-warnings.m4: Implement Objective C compiler warnings. xdvik-ja-22.84.16-j1.40/m4/kpse-mktex.m40000664000175000017500000000272211730167472016750 0ustar uwabamiuwabami# Private macros for the TeX Live (TL) tree. # Copyright (C) 2011 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # KPSE_MKTEX_PREPARE # ------------------ # AC_DEFUN'ed so it can enforce inclusion of this file. AC_DEFUN([KPSE_MKTEX_PREPARE], []) # KPSE_WITH_MKTEX(PROG, YES-OR-NO, TEXT, STEM) # -------------------------------------------- # Provide configure options --enable-mktex*-default and normalize result. m4_define([KPSE_WITH_MKTEX], [AC_ARG_ENABLE([$1-default], AS_HELP_STRING([--]m4_if([$2], [yes], [dis], [en])[able-$1-default], m4_if([$2], [yes], [do not ])[run $1 if $3 missing], m4_eval(kpse_indent_26+2)))[]dnl ]) # KPSE_WITH_MKTEX # KPSE_MKTEX_DEFINE(PROG, YES-OR-NO, TEXT, STEM) # ---------------------------------------------- # Normalize --enable-mktex*-default configure option and build defines. m4_define([KPSE_MKTEX_DEFINE], [AS_CASE([$enable_$1_default], [yes | no], , [enable_$1_default=$2]) AS_IF([test "x$enable_$1_default" = xyes], [AC_DEFINE([MAKE_$4_BY_DEFAULT], 1, [Define to 1 if you want to run $1 if $3 is missing, and to 0 if you don't])], [AC_DEFINE([MAKE_$4_BY_DEFAULT], 0)]) ]) # KPSE_MKTEX_DEFINE xdvik-ja-22.84.16-j1.40/m4/kpse-lib-version.m40000664000175000017500000000170511730167472020051 0ustar uwabamiuwabami# Private macros for the TeX Live (TL) tree. # Copyright (C) 2011 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # KPSE_LIB_VERSION(NAME) # ---------------------- # Split NAME_version into NAME_major, NAME_minor, and NAME_micro # (ignoring lowercase letters forming an optional suffix). AC_DEFUN([KPSE_LIB_VERSION], [m4_bpatsubst($1_version, [^\([0-9]+\).\([0-9]+\).\([0-9]+\)[a-z]*$], [m4_define([$1_major], [\1])m4_define([$1_minor], [\2])m4_define([$1_micro], [\3])])[]dnl ]) # KPSE_LIB_VERSION # KPSE_LT_VERSION(NAME) # --------------------- # Split NAME_version as above and define _LT_VERSINFO. AC_DEFUN([KPSE_LT_VERSION], [KPSE_LIB_VERSION([$1]) AC_SUBST(AS_TR_CPP($1)[_LT_VERSINFO], [m4_eval($1_major+$1_minor):$1_micro:$1_minor])[]dnl ]) # KPSE_LT_VERSION xdvik-ja-22.84.16-j1.40/m4/kpse-cxx-hack.m40000664000175000017500000000610311730167472017323 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2002 Olaf Weber # Copyright (C) 2009, 2010 Peter Breitenlohner # # This file is free software; the copyright holders # give unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_ENABLE_CXX_HACK # -------------------- # Provide the configure option '--enable-cxx-runtime-hack'. AC_DEFUN([KPSE_ENABLE_CXX_HACK], [AC_ARG_ENABLE([cxx-runtime-hack], AS_HELP_STRING([--enable-cxx-runtime-hack], [link C++ runtime statically], [29]))[]dnl ]) # KPSE_ENABLE_CXX_HACK # KPSE_CXX_HACK() # --------------- # Try statically linking C++ runtime library (g++ only). # Since Libtool reshuffles the argument list, we define CXXLD # as wrapper script appending these flags to g++ as invoked # by Libtool when linking progams (but not shared libraries). # AC_DEFUN([KPSE_CXX_HACK], [AC_REQUIRE([AC_CANONICAL_HOST])[]dnl AC_REQUIRE([AC_PROG_CXX])[]dnl AC_REQUIRE([KPSE_ENABLE_CXX_HACK])[]dnl if test "x$GXX:$enable_cxx_runtime_hack" = xyes:yes; then _KPSE_CXX_HACK fi if test "x$kpse_cv_cxx_hack" = xok; then CXXLD='$(top_builddir)/CXXLD.sh' cxxld_sh="#! ${CONFIG_SHELL-/bin/sh} # CXXLD.sh. Generated by configure. set -- $CXX \"\$[]@\" $kpse_cv_cxx_flags echo \"\$[]0:\" \"\$[]@\" exec \"\$[]@\"" AC_CONFIG_COMMANDS([CXXLD.sh], [echo "$cxxld_sh" >CXXLD.sh; chmod +x CXXLD.sh], [cxxld_sh='$cxxld_sh']) else CXXLD='$(CXX)' fi AC_SUBST([CXXLD]) ]) # KPSE_CXX_HACK # _KPSE_CXX_HACK() # ---------------- # Internal subroutine. m4_define([_KPSE_CXX_HACK], [ AC_LANG_PUSH([C++]) AC_CHECK_HEADERS([iostream]) AC_CACHE_CHECK([for statically linking C++ runtime library], [kpse_cv_cxx_hack], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([[#ifdef HAVE_IOSTREAM #include using namespace std; #else #include #endif]], [[cout <<"worksok\n";]])]) case $host in *cygwin*) flags_try0='-static -static-libgcc'; flags_try1='-lstdc++'; flags_try2=$flags_try1;; *) flags_try0='-nodefaultlibs -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic -lm' flags_try1='-lgcc_eh -lgcc -lc -lgcc_eh -lgcc' flags_try2='-lgcc -lc -lgcc';; esac kpse_save_LIBS=$LIBS cpp_link_hack=false for flags in "$flags_try1" "$flags_try2"; do LIBS="$kpse_save_LIBS $flags_try0 $flags" AC_LINK_IFELSE([], [AS_IF([test "x$cross_compiling" = xyes], [cpp_link_hack=true; break], [AS_CASE([`(./conftest$ac_exeext; exit) 2>/dev/null`], [worksok], [cpp_link_hack=true; break])])]) done LIBS=$kpse_save_LIBS if $cpp_link_hack; then kpse_cv_cxx_hack=ok kpse_cv_cxx_flags="$flags_try0 $flags" else kpse_cv_cxx_hack="not supported" fi]) if test "x$kpse_cv_cxx_hack" = xok; then AC_MSG_NOTICE([using $kpse_cv_cxx_flags]) fi AC_LANG_POP([C++]) ]) # _KPSE_CXX_HACK xdvik-ja-22.84.16-j1.40/m4/kpse-options.m40000664000175000017500000000204211730167472017306 0ustar uwabamiuwabami# Public macros for the TeX Live (TL) tree. # Copyright (C) 2009 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 0 # KPSE_OPTIONS # ------------ # Provide configure options used by the higher level TL directories # as well as by packages maintained independently. AC_DEFUN([KPSE_OPTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])[]dnl AC_ARG_ENABLE([multiplatform], AS_HELP_STRING([--enable-multiplatform], [put executables into bin/PLATFORM and libraries into lib/PLATFORM]))[]dnl if test "x$enable_multiplatform" = xyes; then if test "x$bindir" = 'x${exec_prefix}/bin'; then bindir="$bindir/$host" ac_configure_args="$ac_configure_args '--bindir=$bindir'" fi if test "x$libdir" = 'x${exec_prefix}/lib'; then libdir="$libdir/$host" ac_configure_args="$ac_configure_args '--libdir=$libdir'" fi fi ]) # KPSE_OPTIONS xdvik-ja-22.84.16-j1.40/build-aux/0000775000175000017500000000000011742727717015774 5ustar uwabamiuwabamixdvik-ja-22.84.16-j1.40/build-aux/README.TL0000664000175000017500000000107311730167503017157 0ustar uwabamiuwabamiCopyright (C) 2009 Peter Breitenlohner You may freely use, modify and/or distribute this file. This directory is the central repository for auxiliary files, mostly shell scripts, needed to build the TeX Live (TL) tree. They are used by all packages `owned' by the TL tree, i.e., maintained as part of TL. All these files are maintained elsewhere and are available from the GNU gnulib project (http://savannah.gnu.org/projects/gnulib). The script Master/tlpkg/bin/tl-update-auto attempts to keep them up to date, except when the sources are frozen. xdvik-ja-22.84.16-j1.40/build-aux/texinfo.tex0000664000175000017500000116103211730167503020162 0ustar uwabamiuwabami% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2012-02-28.16} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. % % This texinfo.tex file is free software: you can redistribute it and/or % modify it under the terms of the GNU General Public License as % published by the Free Software Foundation, either version 3 of the % License, or (at your option) any later version. % % This texinfo.tex file is distributed in the hope that it will be % useful, but WITHOUT ANY WARRANTY; without even the implied warranty % of MERCHANTABILITY or FITNESS FOR A PARTICULAR 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, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. (This has been our intent since Texinfo was invented.) % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://www.gnu.org/software/texinfo/ (the Texinfo home page), or % ftp://tug.org/tex/texinfo.tex % (and all CTAN mirrors, see http://www.ctan.org). % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\ampChar = `\& \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\hashChar = `\# \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). This command % is not documented, not supported, and doesn't work. % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} % \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \line{\kern\leftskip #1\kern\rightskip}% } % @sp n outputs n lines of vertical space % \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment % \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} % \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as being undefined. \ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and % related messages. The final outcome is that it is up to the TeX user % to double the backslashes and otherwise make the string valid, so % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\relax % No primitive available; should we give a warning or log? % Many times it won't matter. \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros based on pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \makevalueexpandable \def\pdfdestname{#1}% \txiescapepdf\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\rgbDarkRed} \def\linkcolor{\rgbDarkRed} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \edef\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else \txiescapepdf\pdfoutlinedest \fi % % Also escape PDF chars in the display string. \edef\pdfoutlinetext{#1}% \txiescapepdf\pdfoutlinetext % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \ifx\p\space\else\addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \fi \nextsp} \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Default leading. \newdimen\textleading \textleading = 13.2pt % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (currently only OT1, OT1IT and OT1TT are allowed, pass % empty to omit). \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % emacs-page end of cmaps % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} %where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. This is the default in % Texinfo. % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{27pt}} \def\titlefont#1{{\titlefonts\rmisbold #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} \gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright % \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright % \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright \let\markupsetuplqkbd \markupsetnoligaturesquoteleft % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it % works for pasting with more pdf viewers (at least evince), the % lilypond developers report. xpdf does work with the regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } % \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless \next (presumed to be the following % character) is such as not to need one. \def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ptexslash \fi\fi\fi \aftersmartic } % like \smartslanted except unconditionally uses \ttsl, and no ic. % @var is set to this for defun arguments. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% \smartslanted{#1}% } \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % ctrl is no longer a Texinfo command. \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @file, @option are the same as @samp. \let\file=\samp \let\option=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\realdash \let_\realunder \fi \codex } } \def\codex #1{\tclose{#1}\endgroup} \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is undesirable in % some manuals, especially if they don't have long identifiers in % general. @allowcodebreaks provides a way to control this. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. % (This \urefnobreak definition isn't used now, leaving it for a while % for comparison.) \def\urefnobreak#1{\dourefnobreak #1,,,\finish} \def\dourefnobreak#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % This \urefbreak definition is the active one. \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode\ampChar=\active \catcode\dotChar=\active \catcode\hashChar=\active \catcode\questChar=\active \catcode\slashChar=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setupmarkupstyle{code}% \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } % we put a little stretch before and after the breakable chars, to help % line breaking of long url's. The unequal skips make look better in % cmtt at least, especially for dots. \def\urefprestretch{\urefprebreak \hskip0pt plus.13em } \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } % \def\urefcodeamp{\urefprestretch \&\urefpoststretch} \def\urefcodedot{\urefprestretch .\urefpoststretch} \def\urefcodehash{\urefprestretch \#\urefpoststretch} \def\urefcodequest{\urefprestretch ?\urefpoststretch} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprestretch \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpoststretch \fi } } % One more complication: by default we'll break after the special % characters, but some people like to break before the special chars, so % allow that. Also allow no breaking at all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} \urefbreakstyle after % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} % For @indicateurl, @env, @command quotes seem unnecessary, so use \code. \let\indicateurl=\code \let\env=\code \let\command=\code % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. % Unless we're in typewriter, use \ecfont because the CM text fonts do % not have braces, and we don't want to switch into math. \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} \let\{=\mylbrace \let\lbracechar=\{ \let\}=\myrbrace \let\rbracechar=\} \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{% \ifx\textnominalsize\xwordpt % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \selectfonts\lllsize A% \fi }% \vss }}% \kern-.15em \TeX } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{% \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } % Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \leftline{\titlefonts\rmisbold #1} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rmisbold \leftline{#1}}% \fi } % Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. \everycr resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we again encounter the problem the 1sp was intended to solve. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi % Test to see if parskip is larger than space between lines of % table. If not, do nothing. % If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\realdash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \relax % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these unexpandable (because we define \tt as a dummy) % definitions when @{ or @} appear in index entry text. Also, more % complicated, when \tex is in effect and \{ is a \delimiter again. % We can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. Perhaps we % should define @lbrace and @rbrace commands a la @comma. \def\{{{\tt\char123}}% \def\}{{\tt\char125}}% % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\arrow \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\leq \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sansserif \definedummyword\sc \definedummyword\slanted \definedummyword\t % % Commands that take arguments. \definedummyword\acronym \definedummyword\anchor \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\dmn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\indicateurl \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % % Unfortunately, texindex is not prepared to handle braces in the % content at all. So for index sorting, we map @{ and @} to strings % starting with |, since that ASCII character is between ASCII { and }. \def\{{|a}% \def\}{|b}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\arrow{->}% \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\geq{>=}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\leq{<=}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax \else \indexlquoteignore \fi % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us % ignore left quotes in the sort term. {\catcode`\`=\active \gdef\indexlquoteignore{\let`=\empty}} \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rmisbold #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page \chapoddpage \endgroup } % \unnumberedno is an oxymoron. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unnlevel \chardef\unnlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. % \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}% \bigskip \par\penalty 200\relax \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. % Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold % % Have to define \lastsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}\bigskip \par\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \checkenv{}% should not be in an environment. % % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\partentry = \shortpartentry \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain @ character. \envdef\tex{% \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode`\`=\other \catcode`\'=\other \escapechar=`\\ % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#1#2{% \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. The \global is in case the verbatim line starts with an accent, % or some other command that starts with a begin-group. Otherwise, the % entire \verbbox would disappear at the corresponding end-group, before % it is typeset. Meanwhile, we can't have nested verbatim commands % (can we?), so the \global won't be overwriting itself. \newbox\verbbox \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim % The \leavevmode here is for blank lines. Otherwise, we would % never \starttabox and the \egroup would end verbatim mode. \def\par{\leavevmode\egroup\box\verbbox\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \doingtypefntrue \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else \rettypeownlinetrue \fi \fi % % How we'll format the category name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. We'll always have at % least two. \tempnum = 2 % % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. Let's try @var for that. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{\begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % % ... and for \example: \spaceisspace % % The \empty here causes a following catcode 5 newline to be eaten as % part of reading whitespace after a control sequence. It does not % eat a catcode 13 newline. There's no good way to handle the two % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX % would then have different behavior). See the Macro Details node in % the manual for the workaround we recommend for macros and % line-oriented commands. % \scantokens{#1\empty}% \endgroup} \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. % \def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% used when scanning invocations \scanctxt \catcode`\\=0 } % why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" % for the single characters \ { }. Thus, we end up with the "commands" % that would be written @\ @{ @} in a Texinfo document. % % We already have @{ and @}. For @\, we define it here, and only for % this purpose, to produce a typewriter backslash (so, the @\ that we % define for @math can't be used with @macro calls): % \def\\{\normalbackslash}% % % We would like to do this for \, too, since that is what makeinfo does. % But it is not possible, because Texinfo already has a command @, for a % cedilla accent. Documents must use @comma{} instead. % % \anythingelse will almost certainly be an error of some kind. % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. % {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\margbackslash#1{\char`\#1 } \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % For macro processing make @ a letter so that we can make Texinfo private macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.BLAH for each BLAH % in the params list to some hook where the argument si to be expanded. If % there are less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. % % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime underwhich the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, you need that no macro has more than 256 arguments, otherwise an % error is produced. \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax \let\xeatspaces\relax \parsemargdefxxx#1,;,% % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) % \catcode `\@\texiatcatcode \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \catcode `\@=11\relax \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } % \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } \def\macargexpandinbody@{% %% Define the named-macro outside of this group and then close this group. \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Save the token stack pointer into macro #1 \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} % Restore the token stack pointer from number in macro #1 \def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} % newtoks that can be used non \outer . \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} % Tailing missing arguments are set to empty \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } % This defines a Texinfo @macro. There are eight cases: recursive and % nonrecursive macros of zero, one, up to nine, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. % \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else \ifnum\paramno<10\relax % at most 9 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \else % 10 or more \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % at most 9 \ifnum\paramno<10\relax \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse \fi \fi \fi} \catcode `\@\texiatcatcode\relax \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg). % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. % \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{% \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \lastsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\fi } % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} % \newbox\topbox \newbox\printedrefnamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. \getfilename{#4}% % \edef\pdfxrefdest{#1}% \txiescapepdf\pdfxrefdest % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % if the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox to print the node names, TeX does not insert % empty discretionaries after hyphens, which means that it will not % find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, % this is a loss. Therefore, we give the text of the node name % again, so it is as if TeX is seeing it for the first time. % % Cross-manual reference. Only include the "Section ``foo'' in" if % the foo is neither missing or Top. Thus, @xref{,,,foo,The Foo Manual} % outputs simply "see The Foo Manual". \ifdim \wd\printedmanualbox > 0pt % What is the 7sp about? The idea is that we also want to omit % the Section part if we would be printing "Top", since they are % clearly trying to refer to the whole manual. But, this being % TeX, we can't easily compare strings while ignoring the possible % spaces before and after in the input. By adding the arbitrary % 7sp, we make it much less likely that a real node name would % happen to have the same width as "Top" (e.g., in a monospaced font). % I hope it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \setbox\topbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp \ifdim \wd2 = \wd\topbox \else \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi \cite{\printedmanual}% \else % Reference in this manual. % % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi \fi \endlink \endgroup} % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut % % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \else \ifx\centersub\centerV % for @center @image, we need a vbox so we can have our vertical space \imagevmodetrue \vbox\bgroup % vbox has better behavior than vtop herev \fi\fi % \ifimagevmode \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. \ifx\centersub\centerV\else \noindent \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \medskip % space after a standalone image \fi \ifx\centersub\centerV \egroup \fi \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \lastsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\lastsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \lastsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX \endgroup} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{\tie} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\guillemetright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{\tie} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'{\dotless{i}}} \gdef^^ee{\^{\dotless{i}}} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0104}{\ogonek{A}} \DeclareUnicodeCharacter{0105}{\ogonek{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{02DB}{\ogonek{ }} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} \def^^L{\par} % remove \outer, so ^L can appear in an @comment % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. % The story here is that in math mode, the \char of \backslashcurfont % ends up printing the roman \ from the math symbol font (because \char % in math mode uses the \mathcode, and plain.tex sets % \mathcode`\\="026E). It seems better for @backslashchar{} to always % print a typewriter backslash, hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. @def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} @let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. We switch back and forth between these. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % @def@normalturnoffactive{% @let"=@normaldoublequote @let$=@normaldollar %$ font-lock fix @let+=@normalplus @let<=@normalless @let>=@normalgreater @let\=@normalbackslash @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let~=@normaltilde @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These (along with & and #) are made active for url-breaking, so need % active definitions as the normal characters. @def@normaldot{.} @def@normalquest{?} @def@normalslash{/} % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore xdvik-ja-22.84.16-j1.40/build-aux/ylwrap0000775000175000017500000001404311730167503017226 0ustar uwabamiuwabami#! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, # 2007, 2009 Free Software Foundation, Inc. # # Written by Tom Tromey . # # 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. # This file is maintained in Automake, please report # bugs to or send patches to # . case "$1" in '') echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input="$1" shift case "$input" in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input="`pwd`/$input" ;; esac pairlist= while test "$#" -ne 0; do if test "$1" = "--"; then shift break fi pairlist="$pairlist $1" shift done # The program to run. prog="$1" shift # Make any relative path in $prog absolute. case "$prog" in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog="`pwd`/$prog" ;; esac # FIXME: add hostname here for parallel makes that run commands on # other machines. But that might take us over the 14-char limit. dirname=ylwrap$$ trap "cd '`pwd`'; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then set X $pairlist shift first=yes # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot="no" if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot="yes" fi # The directory holding the input. input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` # Quote $INPUT_DIR so we can use it in a regexp. # FIXME: really we should care about more than `.' and `\'. input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'` while test "$#" -ne 0; do from="$1" # Handle y_tab.c and y_tab.h output by DOS if test $y_tab_nodot = "yes"; then if test $from = "y.tab.c"; then from="y_tab.c" else if test $from = "y.tab.h"; then from="y_tab.h" fi fi fi if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend `../'. case "$2" in [\\/]* | ?:[\\/]*) target="$2";; *) target="../$2";; esac # We do not want to overwrite a header file if it hasn't # changed. This avoid useless recompilations. However the # parser itself (the first file) should always be updated, # because it is the destination of the .y.c rule in the # Makefile. Divert the output of all other files to a temporary # file so we can compare them to existing versions. if test $first = no; then realtarget="$target" target="tmp-`echo $target | sed s/.*[\\/]//g`" fi # Edit out `#line' or `#' directives. # # We don't want the resulting debug information to point at # an absolute srcdir; it is better for it to just mention the # .y file with no path. # # We want to use the real output file name, not yy.lex.c for # instance. # # We want the include guards to be adjusted too. FROM=`echo "$from" | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` TARGET=`echo "$2" | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \ -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$? # Check whether header files must be updated. if test $first = no; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$2" is unchanged rm -f "$target" else echo updating "$2" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the first file. This # is a blatant hack to let us support using "yacc -d". If -d # is not specified, we don't want an error when the header # file is "missing". if test $first = yes; then ret=1 fi fi shift shift first=no done else ret=$? fi # Remove the directory. cd .. rm -rf $dirname exit $ret # 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: xdvik-ja-22.84.16-j1.40/build-aux/config.sub0000755000175000017500000010517611742727337017765 0ustar uwabamiuwabami#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, 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. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: xdvik-ja-22.84.16-j1.40/build-aux/config.guess0000755000175000017500000012743211742727337020321 0ustar uwabamiuwabami#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, 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 Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: xdvik-ja-22.84.16-j1.40/build-aux/relpath0000775000175000017500000000272611730167503017354 0ustar uwabamiuwabami#! /bin/sh # relpath - compute the relative path FROM -> TO # Copyright (C) 2011 Peter Breitenlohner # # This file is free software; the copyright holder # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # First handle the simple case that FROM is a subdirectory of TO case $2 in "$3"/*) echo "X$2" | sed 's,^X'$3'/,,; s,[^/][^/]*,..,g' exit 0;; esac # Now the more general case, mainly for distro builds err () { echo "$*" >&2 exit 1 } test $# = 3 || err 'relpath PREF FROM TO compute the relative path FROM -> TO where FROM and TO are absolute paths, and prefixed with PREF are existing directories' chk () { case $2 in *' '* | *'/./'* | *'/../'*) err "'$2' contains ' ', '/./', or '/../'";; /*) ;; *) err "'$2' must be an absolute path";; esac test -d "$1$2" || err "'$1$2' not a directory" # Normalize, remove leading and trailing / res=`echo $2 | sed 's,^//*,,; s,//*$,,; s,///*,/,g'` } chk "$1" "$2"; from=$res chk "$1" "$3"; to=$res test "/$from" = "/$to" && { echo "."; exit 0; } # Remove common prefix while test "/$to" != "/"; do test "/$from" = "/" && { echo "$to"; exit 0; } test `echo $from | sed 's,/.*,,'` = `echo $to | sed 's,/.*,,'` || break from=`echo $from | sed 's,[^/]*/*,,'` to=`echo $to | sed 's,[^/]*/*,,'` done from=`echo $from | sed 's,[^/][^/]*,..,g'` test "/$to" = "/" || from="$from/$to" echo "$from" exit 0